diff --git a/cts/cts-schemas.in b/cts/cts-schemas.in index 108c1a4b0c..026ce17557 100755 --- a/cts/cts-schemas.in +++ b/cts/cts-schemas.in @@ -1,618 +1,570 @@ #!@BASH_PATH@ # # Copyright 2018-2024 the Pacemaker project contributors # # The version control history for this file may have further details. # # This source code is licensed under the GNU General Public License version 2 # or later (GPLv2+) WITHOUT ANY WARRANTY. # Note on portable usage of sed: GNU/POSIX/*BSD sed have a limited subset of # compatible functionality. Do not use the -i option, alternation (\|), # \0, or character sequences such as \n or \s. # Exit immediately if a command fails, with some exceptions (for example, when # part of an if or while condition). Treat unset variables as errors during # expansion. See bash(1) man page for details. set -eu # If readlink supports -e, use it readlink -e / >/dev/null 2>/dev/null if [ $? -eq 0 ]; then test_home=$(dirname "$(readlink -e "$0")") else test_home=$(dirname "$0") fi suites_dir="$test_home/schemas" src_dir=$(dirname "$test_home") if [ -d "$src_dir/xml" ]; then export PCMK_schema_directory="$src_dir/xml" echo "Using local schemas from: $PCMK_schema_directory" else export PCMK_schema_directory=@CRM_SCHEMA_DIRECTORY@ fi DIFF="diff -u" DIFF_PAGER="less -LRX" RNG_VALIDATOR="xmllint --noout --relaxng" XSLT_PROCESSOR="xsltproc --nonet" # Available test suites -tests="test2to3 test2to3enter test2to3leave test2to3roundtrip" +tests="test2to3" # # commons # emit_result() { _er_howmany=${1:?} # how many errors (0/anything else incl. strings) _er_subject=${2:?} _er_prefix=${3-} if [ -n "$_er_prefix" ]; then _er_prefix="${_er_prefix}: " fi if [ "$_er_howmany" = "0" ]; then printf "%s%s finished OK\n" "${_er_prefix}" "${_er_subject}" else printf "%s%s encountered ${_er_howmany} errors\n" \ "${_er_prefix}" "${_er_subject}" fi } emit_error() { _ee_msg=${1:?} printf "%s\n" "${_ee_msg}" >&2 } # returns 1 + floor of base 2 logaritm for _lo0r_i in 1...255, # or 0 for _lo0r_i = 0 log2_or_0_return() { _lo0r_i=${1:?} return $(((!(_lo0r_i >> 1) && _lo0r_i) * 1 \ + (!(_lo0r_i >> 2) && _lo0r_i & (1 << 1)) * 2 \ + (!(_lo0r_i >> 3) && _lo0r_i & (1 << 2)) * 3 \ + (!(_lo0r_i >> 4) && _lo0r_i & (1 << 3)) * 4 \ + (!(_lo0r_i >> 5) && _lo0r_i & (1 << 4)) * 5 \ + (!(_lo0r_i >> 6) && _lo0r_i & (1 << 5)) * 6 \ + (!(_lo0r_i >> 7) && _lo0r_i & (1 << 6)) * 7 \ + !!(_lo0r_i >> 7) * 7 )) } # rough addition of two base 2 logarithms log2_or_0_add() { _lo0a_op1=${1:?} _lo0a_op2=${2:?} if [ "$_lo0a_op1" -gt "$_lo0a_op2" ]; then return ${_lo0a_op1} elif [ "$_lo0a_op2" -gt "$_lo0a_op1" ]; then return ${_lo0a_op2} elif [ "$_lo0a_op1" -gt 0 ]; then return $((_lo0a_op1 + 1)) else return ${_lo0a_op1} fi } # # test phases # # stdin: input file per line test_cleaner() { while read _tc_origin; do _tc_origin=${_tc_origin%.*} rm -f "${_tc_origin}.up" "${_tc_origin}.up.err" rm -f "$(dirname "${_tc_origin}")/.$(basename "${_tc_origin}").up" done } test_explanation() { _tsc_template= while [ $# -gt 0 ]; do case "$1" in -o=*) _tsc_template="$PCMK_schema_directory/upgrade-${1#-o=}.xsl";; esac shift done $XSLT_PROCESSOR "$PCMK_schema_directory/upgrade-detail.xsl" "$_tsc_template" } cleanup_module_error() { # Work around a libxml2 bug. At least as of libxslt-1.1.41 and # libxml2-2.10.4, if the stylesheet contains a user-defined top-level # element (that is, one with a namespace other than the XSL namespace), # libxslt tries to load the namespace URI as an XML module. If this fails, # libxml2 logs a "module error: failed to open ..." message. # # This appears to be fixed in libxml2 v2.13 with commit ecb4c9fb. sed "/module error/d" "$1" > "$1.new" mv -- "$1.new" "$1" } # stdout: filename of the transformed file test_runner_upgrade() { _tru_template=${1:?} _tru_source=${2:?} # filename _tru_mode=${3:?} # extra modes wrt. "referential" outcome, see below _tru_ref="${_tru_source%.*}.ref" if [ "$((_tru_mode & (1 << 0)))" -ne 0 ] || [ -f "${_tru_ref}.err" ]; then _tru_ref_err="${_tru_ref}.err" else _tru_ref_err=/dev/null fi _tru_proc_rc=0 _tru_diff_rc=0 _tru_target="${_tru_source%.*}.up" _tru_target_err="${_tru_target}.err" + _tru_transforms=$(ls "$PCMK_schema_directory"/upgrade-$_tru_template-*.xsl \ + | sort -n) + _tru_input=$(mktemp) + + cp "$_tru_source" "$_tru_input" + + # Zero the error file before we append to it + > "$_tru_target_err" + if [ "$((_tru_mode & (1 << 2)))" -eq 0 ]; then - ${XSLT_PROCESSOR} "${_tru_template}" "${_tru_source}" \ - > "${_tru_target}" 2> "${_tru_target_err}" \ - || _tru_proc_rc=$? + for transform in $_tru_transforms; do + $XSLT_PROCESSOR "$transform" "$_tru_input" \ + > "$_tru_target" 2>> "$_tru_target_err" \ + || _tru_proc_rc=$? + cp "$_tru_target" "$_tru_input" + + if [ "$_tru_proc_rc" -ne 0 ]; then + break; + fi + done + + rm -f "$_tru_input" cleanup_module_error "$_tru_target_err" if [ "$_tru_proc_rc" -ne 0 ]; then echo "$_tru_target_err" return "$_tru_proc_rc" fi else # when -B (deblanked outcomes handling) requested, we: # - drop blanks from the source XML # (effectively emulating pacemaker handling) # - re-drop blanks from the XSLT outcome, # which is compared with referential outcome # processed with even greedier custom deblanking # (extraneous inter-element whitespace like blank # lines will not get removed otherwise, see lower) - xmllint --noblanks "${_tru_source}" \ - | ${XSLT_PROCESSOR} "${_tru_template}" - \ - > "${_tru_target}" 2> "${_tru_target_err}" \ - || _tru_proc_rc=$? + for transform in $_tru_transforms; do + xmllint --noblanks "$_tru_input" \ + | $XSLT_PROCESSOR "$transform" - \ + > "$_tru_target" 2>> "$_tru_target_err" \ + || _tru_proc_rc=$? + + cp "$_tru_target" "$_tru_input" + + if [ "$_tru_proc_rc" -ne 0 ]; then + break; + fi + done + rm -f "$_tru_input" cleanup_module_error "$_tru_target_err" if [ "$_tru_proc_rc" -ne 0 ]; then echo "$_tru_target_err" return "$_tru_proc_rc" fi # reusing variable no longer needed _tru_template="$(dirname "${_tru_target}")" _tru_template="${_tru_template}/.$(basename "${_tru_target}")" mv "${_tru_target}" "${_tru_template}" ${XSLT_PROCESSOR} - "${_tru_template}" > "${_tru_target}" < EOF fi # only respond with the flags except for "-B", i.e., when both: # - _tru_mode non-zero # - "-B" in _tru_mode is zero (hence non-zero when flipped with XOR) if [ "$((_tru_mode * ((_tru_mode ^ (1 << 2)) & (1 << 2))))" -ne 0 ]; then if [ "$((_tru_mode & (1 << 0)))" -ne 0 ]; then cp -a "${_tru_target}" "${_tru_ref}" cp -a "${_tru_target_err}" "${_tru_ref_err}" fi if [ "$((_tru_mode & (1 << 1)))" -ne 0 ]; then { ${DIFF} "${_tru_source}" "${_tru_ref}" \ && printf '\n(files match)\n'; } | ${DIFF_PAGER} >&2 if [ $? -ne 0 ]; then printf "\npager failure\n" >&2 return 1 fi printf '\nIs comparison OK? ' >&2 if read _tru_answer &2; return 1;; esac else return 1 fi fi elif [ -f "$_tru_ref" ] && [ -e "$_tru_ref_err" ]; then if [ "$((_tru_mode & (1 << 2)))" -eq 0 ]; then _output=$(cat "$_tru_ref") else _output=$($XSLT_PROCESSOR - "$_tru_ref" < EOF ) fi echo "$_output" | $DIFF - "$_tru_target" >&2 || _tru_diff_rc=$? if [ "$_tru_diff_rc" -eq 0 ]; then $DIFF "$_tru_ref_err" "$_tru_target_err" >&2 || _tru_diff_rc=$? fi if [ "$_tru_diff_rc" -ne 0 ]; then emit_error "Outputs differ from referential ones" echo "/dev/null" return 1 fi else emit_error "Referential file(s) missing: ${_tru_ref}" echo "/dev/null" return 1 fi echo "${_tru_target}" } test_runner_validate() { _trv_schema=${1:?} _trv_target=${2:?} # filename if ! ${RNG_VALIDATOR} "${_trv_schema}" "${_trv_target}" \ 2>/dev/null; then ${RNG_VALIDATOR} "${_trv_schema}" "${_trv_target}" fi } -# -a= ... action modifier completing template name (e.g. 2.10-(enter|leave)) # -o= ... which conventional version to deem as the transform origin # -t= ... which conventional version to deem as the transform target # -B # -D # -G ... see usage # stdin: input file per line test_runner() { _tr_mode=0 _tr_ret=0 - _tr_action= _tr_schema_o= _tr_schema_t= _tr_target= _tr_template= while [ $# -gt 0 ]; do case "$1" in - -a=*) _tr_action="${1#-a=}";; -o=*) _tr_template="${1#-o=}" _tr_schema_o="$PCMK_schema_directory/pacemaker-${1#-o=}.rng";; -t=*) _tr_schema_t="$PCMK_schema_directory/pacemaker-${1#-t=}.rng";; -G) _tr_mode=$((_tr_mode | (1 << 0)));; -D) _tr_mode=$((_tr_mode | (1 << 1)));; -B) _tr_mode=$((_tr_mode | (1 << 2)));; esac shift done - _tr_template="$PCMK_schema_directory/upgrade-${_tr_action:-${_tr_template:?}}.xsl" if [ ! -f "${_tr_schema_o:?}" ] || [ ! -f "${_tr_schema_t:?}" ]; then emit_error "Origin and/or target schema missing, rerun make" return 1 fi while read _tr_origin; do printf '%-60s' "${_tr_origin}... " # pre-validate if ! test_runner_validate "${_tr_schema_o}" "${_tr_origin}"; then _tr_ret=$((_tr_ret + 1)); echo "E:pre-validate"; continue fi # upgrade if ! _tr_target=$(test_runner_upgrade "${_tr_template}" \ "${_tr_origin}" "${_tr_mode}"); then _tr_ret=$((_tr_ret + 1)); if [ -z "$_tr_target" ]; then break fi echo "E:upgrade" if [ -s "$_tr_target" ]; then echo --- cat "$_tr_target" || : echo --- fi continue fi # post-validate if ! test_runner_validate "${_tr_schema_t}" "${_tr_target}"; then _tr_ret=$((_tr_ret + 1)); echo "E:post-validate"; continue fi echo "OK" done log2_or_0_return ${_tr_ret} } # # particular test variations # -C # -X # stdin: granular test specification(s) if any # test2to3() { _t23_pattern= while read _t23_spec; do _t23_spec=${_t23_spec%.xml} _t23_spec=${_t23_spec%\*} _t23_pattern="${_t23_pattern} -name ${_t23_spec}*.xml -o" done if [ -n "$_t23_pattern" ]; then _t23_pattern="( ${_t23_pattern%-o} )" fi find "$suites_dir/test-2" -name test-2 -o -type d -prune \ -o -name '*.xml' ${_t23_pattern} -print \ | env LC_ALL=C sort \ | { case " $* " in *\ -C\ *) test_cleaner;; *\ -X\ *) test_explanation -o=2.10;; *) test_runner -o=2.10 -t=3.0 "$@" || return $?;; esac; } } -test2to3enter() { - _t23e_pattern= - - while read _t23e_spec; do - _t23e_spec=${_t23e_spec%.xml} - _t23e_spec=${_t23e_spec%\*} - _t23e_pattern="${_t23e_pattern} -name ${_t23e_spec}*.xml -o" - done - - if [ -n "$_t23e_pattern" ]; then - _t23e_pattern="( ${_t23e_pattern%-o} )" - fi - - find "$suites_dir/test-2-enter" -name test-2-enter -o -type d -prune \ - -o -name '*.xml' ${_t23e_pattern} -print \ - | env LC_ALL=C sort \ - | { case " $* " in - *\ -C\ *) test_cleaner;; - *\ -X\ *) emit_result "not implemented" "option -X";; - *) test_runner -a=2.10-enter -o=2.10 -t=2.10 "$@" || return $?;; - esac; } -} - -test2to3leave() { - _t23l_pattern= - - while read _t23l_spec; do - _t23l_spec=${_t23l_spec%.xml} - _t23l_spec=${_t23l_spec%\*} - _t23l_pattern="${_t23l_pattern} -name ${_t23l_spec}*.xml -o" - done - - if [ -n "$_t23l_pattern" ]; then - _t23l_pattern="( ${_t23l_pattern%-o} )" - fi - - find "$suites_dir/test-2-leave" -name test-2-leave -o -type d -prune \ - -o -name '*.xml' ${_t23l_pattern} -print \ - | env LC_ALL=C sort \ - | { case " $* " in - *\ -C\ *) test_cleaner;; - *\ -X\ *) emit_result "not implemented" "option -X";; - *) test_runner -a=2.10-leave -o=3.0 -t=3.0 "$@" || return $?;; - esac; } -} - -test2to3roundtrip() { - _t23rt_pattern= - - while read _t23tr_spec; do - _t23rt_spec=${_t23rt_spec%.xml} - _t23rt_spec=${_t23rt_spec%\*} - _t23rt_pattern="${_t23rt_pattern} -name ${_t23rt_spec}*.xml -o" - done - - if [ -n "$_t23rt_pattern" ]; then - _t23rt_pattern="( ${_t23rt_pattern%-o} )" - fi - - find "$suites_dir/test-2-roundtrip" \ - -name test-2-roundtrip -o -type d -prune \ - -o -name '*.xml' ${_t23rt_pattern} -print \ - | env LC_ALL=C sort \ - | { case " $* " in - *\ -C\ *) test_cleaner;; - *\ -X\ *) emit_result "not implemented" "option -X";; - *) test_runner -a=2.10-roundtrip -o=2.10 -t=3.0 "$@" \ - || return $?;; - esac; } -} - # # "framework" # # option-likes ... options to be passed down # argument-likes ... drives a test selection test_suite() { _ts_pass= _ts_select= _ts_select_full= _ts_test_specs= _ts_global_ret=0 _ts_ret=0 while [ $# -gt 0 ]; do case "$1" in -) printf '%s\n' 'waiting for tests specified at stdin...'; while read _ts_spec; do _ts_select="${_ts_spec}@$1" done;; -*) _ts_pass="${_ts_pass} $1";; *) _ts_select_full="${_ts_select_full}@$1" _ts_select="${_ts_select}@${1%%/*}";; esac shift done # _ts_select contains a '@'-delimited list of test suite names from CLI _ts_select="${_ts_select}@" # _ts_select_full contains a '@'-delimited list of test names _ts_select_full="${_ts_select_full}@" for _ts_test in ${tests}; do _ts_test_specs= while true; do case "${_ts_select}" in *@${_ts_test}@*) # A known test suite _ts_test was found in the list of # requested test suites _ts_select. Strip it out of # _ts_select. # # The purpose of this seems to be to prevent the later # _ts_select_full loop from selecting specific tests from # this suite, if the user also requested the entire suite. _ts_test_specs="${_ts_select%%@${_ts_test}@*}"\ "@${_ts_select#*@${_ts_test}@}" if [ "$_ts_test_specs" = "@" ]; then _ts_select= # nothing left else _ts_select="$_ts_test_specs" fi continue ;; @) case "${_ts_test}" in test*) break;; esac # filter ;; esac if [ -n "$_ts_test_specs" ]; then break fi continue 2 # move on to matching with next local test done _ts_test_specs= while true; do case "${_ts_select_full}" in *@${_ts_test}/*) # A test was requested from a known test suite. This does # not mean the requested test actually exists, but rather # that it was requested as the form "/...". # Strip extraneous data from test path _ts_test_full="${_ts_test}/${_ts_select_full#*@${_ts_test}/}" _ts_test_full="${_ts_test_full%%@*}" # Strip the requested test out of _ts_select_full _ts_select_full="${_ts_select_full%%@${_ts_test_full}@*}"\ "@${_ts_select_full#*@${_ts_test_full}@}" # Strip the test suite name and slash from the test spec _ts_test_specs="${_ts_test_specs} ${_ts_test_full#*/}" ;; *) break ;; esac done # Feed the test specs (if any) as stdin to the respective test suite # function _ts_test() for _ts_test_spec in ${_ts_test_specs}; do printf '%s\n' "${_ts_test_spec}" done | "${_ts_test}" ${_ts_pass} || _ts_ret=$? if [ "$_ts_ret" = 0 ]; then emit_result "$_ts_ret" "$_ts_test" else emit_result "at least 2^$((_ts_ret - 1))" "$_ts_test" fi log2_or_0_add ${_ts_global_ret} ${_ts_ret} _ts_global_ret=$? done if [ -n "${_ts_select#@}" ]; then emit_error "Non-existing test(s):$(echo "${_ts_select}" \ | tr '@' ' ')" log2_or_0_add ${_ts_global_ret} 1 || _ts_global_ret=$? fi return ${_ts_global_ret} } # NOTE: big letters are dedicated for per-test-set behaviour, # small ones for generic/global behaviour usage() { printf \ '%s\n%s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n' \ "usage: $0 [-{B,C,D,G,X}]* \\" \ " [-|{${tests## }}*]" \ "- when no suites (arguments) provided, \"test*\" ones get used" \ "- with '-' suite specification the actual ones grabbed on stdin" \ "- use '-B' to run validate-only check suppressing blanks first" \ "- use '-C' to only cleanup ephemeral byproducts" \ "- use '-D' to review originals vs. \"referential\" outcomes" \ "- use '-G' to generate \"referential\" outcomes" \ "- use '-X' to show explanatory details about the upgrade" \ "- test specification can be granular, e.g. 'test2to3/022'" } main() { _main_pass= _main_bailout=0 _main_ret=0 while [ $# -gt 0 ]; do case "$1" in -h) usage; exit;; -C|-G|-X) _main_bailout=1;; esac _main_pass="${_main_pass} $1" shift done test_suite ${_main_pass} || _main_ret=$? if [ "$_main_bailout" -eq 0 ]; then test_suite -C $_main_pass >/dev/null || true fi if [ "$_main_ret" = 0 ]; then emit_result "$_main_ret" "Overall suite" else emit_result "at least 2^$((_main_ret - 1))" "Overall suite" fi return ${_main_ret} } main "$@" diff --git a/cts/schemas/test-2-enter/010-clu-props.ref b/cts/schemas/test-2-enter/010-clu-props.ref deleted file mode 100644 index 86369fb3ab..0000000000 --- a/cts/schemas/test-2-enter/010-clu-props.ref +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/cts/schemas/test-2-leave/010-clu-props-can.ref.err b/cts/schemas/test-2-leave/010-clu-props-can.ref.err deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cts/schemas/test-2-leave/011-clu-props-cannot.ref.err b/cts/schemas/test-2-leave/011-clu-props-cannot.ref.err deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cts/schemas/test-2-leave/010-clu-props-can.ref b/cts/schemas/test-2/001-clu-props.ref similarity index 87% copy from cts/schemas/test-2-leave/010-clu-props-can.ref copy to cts/schemas/test-2/001-clu-props.ref index afa924d4db..132da337f9 100644 --- a/cts/schemas/test-2-leave/010-clu-props-can.ref +++ b/cts/schemas/test-2/001-clu-props.ref @@ -1,14 +1,15 @@ + diff --git a/cts/schemas/test-2/001-clu-props.ref.err b/cts/schemas/test-2/001-clu-props.ref.err new file mode 100644 index 0000000000..469222a1a7 --- /dev/null +++ b/cts/schemas/test-2/001-clu-props.ref.err @@ -0,0 +1,2 @@ +DEBUG: Cluster properties: cluster-opts-stonith_enabled: renaming stonith_enabled as stonith-enabled +DEBUG: Cluster properties: __cibtr-2_cluster-opts__cluster-opts-stonith_enabled: renaming stonith_enabled as stonith-enabled diff --git a/cts/schemas/test-2-enter/010-clu-props.xml b/cts/schemas/test-2/001-clu-props.xml similarity index 100% rename from cts/schemas/test-2-enter/010-clu-props.xml rename to cts/schemas/test-2/001-clu-props.xml diff --git a/cts/schemas/test-2-enter/020-instance_atributes-rsc.ref b/cts/schemas/test-2/002-instance_atributes-rsc.ref similarity index 81% rename from cts/schemas/test-2-enter/020-instance_atributes-rsc.ref rename to cts/schemas/test-2/002-instance_atributes-rsc.ref index e746319593..5e476cfd50 100644 --- a/cts/schemas/test-2-enter/020-instance_atributes-rsc.ref +++ b/cts/schemas/test-2/002-instance_atributes-rsc.ref @@ -1,41 +1,39 @@ - + - - - + diff --git a/cts/schemas/test-2-enter/010-clu-props.ref.err b/cts/schemas/test-2/002-instance_atributes-rsc.ref.err similarity index 100% rename from cts/schemas/test-2-enter/010-clu-props.ref.err rename to cts/schemas/test-2/002-instance_atributes-rsc.ref.err diff --git a/cts/schemas/test-2-enter/020-instance_atributes-rsc.xml b/cts/schemas/test-2/002-instance_atributes-rsc.xml similarity index 100% rename from cts/schemas/test-2-enter/020-instance_atributes-rsc.xml rename to cts/schemas/test-2/002-instance_atributes-rsc.xml diff --git a/cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.ref b/cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.ref similarity index 67% rename from cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.ref rename to cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.ref index 3a94fb075d..defb156046 100644 --- a/cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.ref +++ b/cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.ref @@ -1,40 +1,32 @@ - + - - - - - - - - - - + + diff --git a/cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref.err b/cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.ref.err similarity index 100% copy from cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref.err copy to cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.ref.err diff --git a/cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.xml b/cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.xml similarity index 100% rename from cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.xml rename to cts/schemas/test-2/003-instance_atributes-rsc-nonbijective.xml diff --git a/cts/schemas/test-2-leave/010-clu-props-can.ref b/cts/schemas/test-2/004-clu-props-can.ref similarity index 100% rename from cts/schemas/test-2-leave/010-clu-props-can.ref rename to cts/schemas/test-2/004-clu-props-can.ref diff --git a/cts/schemas/test-2-enter/020-instance_atributes-rsc.ref.err b/cts/schemas/test-2/004-clu-props-can.ref.err similarity index 100% rename from cts/schemas/test-2-enter/020-instance_atributes-rsc.ref.err rename to cts/schemas/test-2/004-clu-props-can.ref.err diff --git a/cts/schemas/test-2-leave/010-clu-props-can.xml b/cts/schemas/test-2/004-clu-props-can.xml similarity index 100% rename from cts/schemas/test-2-leave/010-clu-props-can.xml rename to cts/schemas/test-2/004-clu-props-can.xml diff --git a/cts/schemas/test-2-leave/011-clu-props-cannot.ref b/cts/schemas/test-2/005-clu-props-cannot.ref similarity index 100% rename from cts/schemas/test-2-leave/011-clu-props-cannot.ref rename to cts/schemas/test-2/005-clu-props-cannot.ref diff --git a/cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.ref.err b/cts/schemas/test-2/005-clu-props-cannot.ref.err similarity index 100% rename from cts/schemas/test-2-enter/021-instance_atributes-rsc-nonbijective.ref.err rename to cts/schemas/test-2/005-clu-props-cannot.ref.err diff --git a/cts/schemas/test-2-leave/011-clu-props-cannot.xml b/cts/schemas/test-2/005-clu-props-cannot.xml similarity index 100% rename from cts/schemas/test-2-leave/011-clu-props-cannot.xml rename to cts/schemas/test-2/005-clu-props-cannot.xml diff --git a/cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.ref b/cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.ref similarity index 100% rename from cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.ref rename to cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.ref diff --git a/cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.ref.err b/cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.ref.err similarity index 100% rename from cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.ref.err rename to cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.ref.err diff --git a/cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.xml b/cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.xml similarity index 100% rename from cts/schemas/test-2-leave/021-instance_atributes-rsc-nonbijective.xml rename to cts/schemas/test-2/006-instance_atributes-rsc-nonbijective.xml diff --git a/cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref b/cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.ref similarity index 100% rename from cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref rename to cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.ref diff --git a/cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref.err b/cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.ref.err similarity index 100% rename from cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.ref.err rename to cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.ref.err diff --git a/cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.xml b/cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.xml similarity index 100% rename from cts/schemas/test-2-roundtrip/021-instance_atributes-rsc-nonbijective.xml rename to cts/schemas/test-2/007-instance_atributes-rsc-nonbijective.xml diff --git a/xml/Makefile.am b/xml/Makefile.am index 1a14df5c13..4fb09ac924 100644 --- a/xml/Makefile.am +++ b/xml/Makefile.am @@ -1,281 +1,276 @@ # # Copyright 2004-2024 the Pacemaker project contributors # # The version control history for this file may have further details. # # This source code is licensed under the GNU General Public License version 2 # or later (GPLv2+) WITHOUT ANY WARRANTY. # include $(top_srcdir)/mk/common.mk noarch_pkgconfig_DATA = $(builddir)/pacemaker-schemas.pc # Pacemaker has 3 schemas: the CIB schema, the API schema (for command-line # tool XML output), and a legacy schema for crm_mon --as-xml. # # See README.md for details on updating CIB schema files (API is similar) # The CIB and crm_mon schemas are installed directly in CRM_SCHEMA_DIRECTORY # for historical reasons, while the API schema is installed in a subdirectory. APIdir = $(CRM_SCHEMA_DIRECTORY)/api CIBdir = $(CRM_SCHEMA_DIRECTORY) MONdir = $(CRM_SCHEMA_DIRECTORY) basexsltdir = $(CRM_SCHEMA_DIRECTORY)/base dist_basexslt_DATA = $(srcdir)/base/access-render-2.xsl # Extract a sorted list of available numeric schema versions # from filenames like NAME-MAJOR[.MINOR][.MINOR-MINOR].rng numeric_versions = $(shell ls -1 $(1) \ | sed -n -e 's/^.*-\([0-9][0-9.]*\).rng$$/\1/p' \ | sort -u -t. -k 1,1n -k 2,2n -k 3,3n) # @COMPAT: pacemaker-next is deprecated since 2.1.5 version_pairs = $(join \ $(1),$(addprefix \ -,$(wordlist \ 2,$(words $(1)),$(1) \ ) next \ ) \ ) version_pairs_last = $(wordlist \ $(words \ $(wordlist \ 2,$(1),$(2) \ ) \ ),$(1),$(2) \ ) # NOTE: All files in API_request_base, CIB_cfg_base, API_base, and CIB_base # need to start with a unique prefix. These variables all get iterated over # and globbed, and two files starting with the same prefix will cause # problems. # Names of API schemas that form the choices for pacemaker-result content API_request_base = command-output \ crm_attribute \ crm_error \ crm_mon \ crm_node \ crm_resource \ crm_rule \ crm_shadow \ crm_simulate \ crm_ticket \ crmadmin \ digests \ iso8601 \ pacemakerd \ stonith_admin \ version # Names of CIB schemas that form the choices for cib/configuration content CIB_cfg_base = options \ nodes \ resources \ constraints \ fencing \ acls \ tags \ alerts # Names of all schemas (including top level and those included by others) API_base = $(API_request_base) \ any-element \ failure \ fence-event \ generic-list \ instruction \ item \ node-attrs \ node-history \ nodes \ ocf-ra \ options \ patchset \ resources \ status \ subprocess-output \ ticket CIB_base = cib \ $(CIB_cfg_base) \ status \ score \ rule \ nvset # Static schema files and transforms (only CIB has transforms) # # This is more complicated than it should be due to the need to support # VPATH builds and "make distcheck". We need the absolute paths for reliable # substitution back and forth, and relative paths for distributed files. API_abs_files = $(foreach base,$(API_base),$(wildcard $(abs_srcdir)/api/$(base)-*.rng)) CIB_abs_files = $(foreach base,$(CIB_base),$(wildcard $(abs_srcdir)/$(base).rng $(abs_srcdir)/$(base)-*.rng)) CIB_abs_xsl = $(abs_srcdir)/upgrade-1.3-0.xsl \ $(wildcard $(abs_srcdir)/upgrade-2.10-[0-2].xsl) MON_abs_files = $(abs_srcdir)/crm_mon.rng API_files = $(foreach base,$(API_base),$(wildcard $(srcdir)/api/$(base)-*.rng)) CIB_files = $(foreach base,$(CIB_base),$(wildcard $(srcdir)/$(base).rng $(srcdir)/$(base)-*.rng)) CIB_xsl = $(srcdir)/upgrade-1.3-0.xsl \ $(wildcard $(srcdir)/upgrade-2.10-[0-2].xsl) MON_files = $(srcdir)/crm_mon.rng # Sorted lists of all numeric schema versions API_numeric_versions = $(call numeric_versions,${API_files}) CIB_numeric_versions = $(call numeric_versions,${CIB_files}) MON_numeric_versions = $(call numeric_versions,$(wildcard $(srcdir)/api/crm_mon*.rng)) # The highest numeric schema version API_max ?= $(lastword $(API_numeric_versions)) CIB_max ?= $(lastword $(CIB_numeric_versions)) MON_max ?= $(lastword $(MON_numeric_versions)) # Sorted lists of all schema versions (including "next") # @COMPAT: pacemaker-next is deprecated since 2.1.5 API_versions = next $(API_numeric_versions) CIB_versions = next $(CIB_numeric_versions) # Build tree locations of static schema files and transforms (for VPATH builds) API_build_copies = $(foreach f,$(API_abs_files),$(subst $(abs_srcdir),$(abs_builddir),$(f))) CIB_build_copies = $(foreach f,$(CIB_abs_files) $(CIB_abs_xsl),$(subst $(abs_srcdir),$(abs_builddir),$(f))) MON_build_copies = $(foreach f,$(MON_abs_files),$(subst $(abs_srcdir),$(abs_builddir),$(f))) # Dynamically generated schema files API_generated = api/api-result.rng $(foreach base,$(API_versions),api/api-result-$(base).rng) CIB_generated = pacemaker.rng \ $(foreach base,$(CIB_versions),pacemaker-$(base).rng) \ versions.rng MON_generated = crm_mon.rng CIB_version_pairs = $(call version_pairs,${CIB_numeric_versions}) CIB_version_pairs_cnt = $(words ${CIB_version_pairs}) CIB_version_pairs_last = $(call version_pairs_last,${CIB_version_pairs_cnt},${CIB_version_pairs}) dist_API_DATA = $(API_files) dist_CIB_DATA = $(CIB_files) \ $(CIB_xsl) nodist_API_DATA = $(API_generated) nodist_CIB_DATA = $(CIB_generated) nodist_MON_DATA = $(MON_generated) EXTRA_DIST = README.md \ cibtr-2.rng \ context-of.xsl \ rng-helper \ ocf-meta2man.xsl \ - upgrade-1.3.xsl \ - upgrade-2.10.xsl \ - upgrade-2.10-enter.xsl \ - upgrade-2.10-leave.xsl \ - upgrade-2.10-roundtrip.xsl \ upgrade-detail.xsl \ xslt_cibtr-2.rng .PHONY: cib-versions cib-versions: @echo "Max: $(CIB_max)" @echo "Available: $(CIB_versions)" .PHONY: api-versions api-versions: @echo "Max: $(API_max)" @echo "Available: $(API_versions)" # Dynamically generated top-level API schema api/api-result.rng: api/api-result-$(API_max).rng $(AM_V_at)$(MKDIR_P) api # might not exist in VPATH build $(AM_V_SCHEMA)cp $(top_builddir)/xml/$< $@ api/api-result-%.rng: $(API_build_copies) rng-helper Makefile.am $(AM_V_SCHEMA)$(builddir)/rng-helper build_api_rng "$@" "$*" \ $(API_request_base) crm_mon.rng: api/crm_mon-$(MON_max).rng $(AM_V_at)echo '' > $@ $(AM_V_at)echo '> $@ $(AM_V_at)echo ' datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_SCHEMA)echo '' >> $@ # Dynamically generated top-level CIB schema pacemaker.rng: pacemaker-$(CIB_max).rng $(AM_V_SCHEMA)cp $(top_builddir)/xml/$< $@ pacemaker-%.rng: $(CIB_build_copies) rng-helper Makefile.am $(AM_V_SCHEMA)$(builddir)/rng-helper build_cib_rng "$@" "$*" \ $(CIB_cfg_base) # Dynamically generated CIB schema listing all pacemaker versions # # @COMPAT none, pacemaker-0.6, pacemaker-0.7, pacemaker-1.1, and # transitional-0.6 are deprecated since 2.1.8, as is validate-with being # optional versions.rng: pacemaker-$(CIB_max).rng Makefile.am $(AM_V_at)echo '' > $@ $(AM_V_at)echo '' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' none' >> $@ $(AM_V_at)echo ' pacemaker-0.6' >> $@ $(AM_V_at)echo ' transitional-0.6' >> $@ $(AM_V_at)echo ' pacemaker-0.7' >> $@ $(AM_V_at)echo ' pacemaker-1.1' >> $@ $(AM_V_at)for rng in $(CIB_versions); do echo " pacemaker-$$rng" >> $@; done $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_at)echo ' ' >> $@ $(AM_V_SCHEMA)echo '' >> $@ .PHONY: diff diff: rng-helper @echo "# Comparing changes in + since $(CIB_max)" @$(builddir)/rng-helper diff ${CIB_version_pairs_last} .PHONY: fulldiff fulldiff: rng-helper @echo "# Comparing all changes across all the subsequent increments" @$(builddir)/rng-helper diff ${CIB_version_pairs} CLEANFILES = $(API_generated) \ $(CIB_generated) \ $(MON_generated) # Remove pacemaker schema files generated by *any* source version. This allows # "make -C xml clean" to have the desired effect when checking out an earlier # revision in a source tree. .PHONY: clean-local clean-local: if [ "x$(srcdir)" != "x$(builddir)" ]; then \ rm -f $(API_build_copies) $(CIB_build_copies) $(MON_build_copies); \ fi rm -f $(builddir)/pacemaker-[0-9]*.[0-9]*.rng # Enable ability to use $@ in prerequisite .SECONDEXPANSION: # For VPATH builds, copy the static schema files into the build tree $(API_build_copies) $(CIB_build_copies) $(MON_build_copies): $$(subst $(abs_builddir),$(srcdir),$$(@)) $(AM_V_GEN)if [ "x$(srcdir)" != "x$(builddir)" ]; then \ $(MKDIR_P) "$(dir $(@))"; \ cp "$(<)" "$(@)"; \ fi diff --git a/xml/upgrade-1.3.xsl b/xml/upgrade-1.3.xsl deleted file mode 120000 index 66f86276e1..0000000000 --- a/xml/upgrade-1.3.xsl +++ /dev/null @@ -1 +0,0 @@ -upgrade-1.3-0.xsl \ No newline at end of file diff --git a/xml/upgrade-2.10-enter.xsl b/xml/upgrade-2.10-enter.xsl deleted file mode 120000 index 04f880567b..0000000000 --- a/xml/upgrade-2.10-enter.xsl +++ /dev/null @@ -1 +0,0 @@ -upgrade-2.10-0.xsl \ No newline at end of file diff --git a/xml/upgrade-2.10-leave.xsl b/xml/upgrade-2.10-leave.xsl deleted file mode 120000 index 8e3ec4cc88..0000000000 --- a/xml/upgrade-2.10-leave.xsl +++ /dev/null @@ -1 +0,0 @@ -upgrade-2.10-2.xsl \ No newline at end of file diff --git a/xml/upgrade-2.10-roundtrip.xsl b/xml/upgrade-2.10-roundtrip.xsl deleted file mode 100644 index 18d73c8558..0000000000 --- a/xml/upgrade-2.10-roundtrip.xsl +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/xml/upgrade-2.10.xsl b/xml/upgrade-2.10.xsl deleted file mode 120000 index 62ed2430ad..0000000000 --- a/xml/upgrade-2.10.xsl +++ /dev/null @@ -1 +0,0 @@ -upgrade-2.10-1.xsl \ No newline at end of file