Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package crmsh for openSUSE:Factory checked in at 2026-08-14 22:09:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Fri Aug 14 22:09:15 2026 rev:418 rq:1371163 version:5.1.0+20260814.d9688661 Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2026-07-31 16:06:34.702906968 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.1258/crmsh.changes 2026-08-14 22:09:19.241055265 +0200 @@ -1,0 +2,29 @@ +Fri Aug 14 07:15:51 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260814.d9688661: + * Dev: migration: Add check and online auto-fix for deprecated cluster properties (bsc#1271223) + * Fix: migration: typo in the signature of method `handle_problem` + +------------------------------------------------------------------- +Mon Aug 10 09:11:20 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260810.421dd6c0: + * Dev: unittests: Remove noisy unit test output + * Dev: doc: Fix typos in crm.8.adoc + * Dev: doc: Remove parallax-related expressions from crm.8.adoc + * Dev: Remove unused functions + * Dev: doc: Remove csync2 from crm.8.adoc + +------------------------------------------------------------------- +Thu Aug 06 07:32:15 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260806.25794c81: + * Dev: Avoid hash for content checks + +------------------------------------------------------------------- +Fri Jul 31 09:46:30 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260731.8b5d2b6d: + * Dev: qdevice: Move utils.get_qdevice_sync_timeout into QDevice class + +------------------------------------------------------------------- Old: ---- crmsh-5.1.0+20260730.157564b0.tar.bz2 New: ---- crmsh-5.1.0+20260814.d9688661.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.Oovka8/_old 2026-08-14 22:09:20.420098507 +0200 +++ /var/tmp/diff_new_pack.Oovka8/_new 2026-08-14 22:09:20.422098581 +0200 @@ -41,7 +41,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 5.1.0+20260730.157564b0 +Version: 5.1.0+20260814.d9688661 Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Oovka8/_old 2026-08-14 22:09:20.487100964 +0200 +++ /var/tmp/diff_new_pack.Oovka8/_new 2026-08-14 22:09:20.490101074 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">157564b06aa670969dba174cdccc37023be1b010</param> + <param name="changesrevision">436d1a557e54a00fee045ad677e9aa0b8d601b5d</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-5.1.0+20260730.157564b0.tar.bz2 -> crmsh-5.1.0+20260814.d9688661.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/cibconfig.py new/crmsh-5.1.0+20260814.d9688661/crmsh/cibconfig.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/cibconfig.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/cibconfig.py 2026-08-14 08:44:20.000000000 +0200 @@ -271,17 +271,18 @@ ''' rc = False try: - s = self._pre_edit(s) - filehash = hash(s) - tmp = utils.str2tmp(s) + config_text = self._pre_edit(s) + original_config_text = config_text + tmp = utils.str2tmp(config_text) if not tmp: return False while not rc: if utils.edit_file(tmp) != 0: break - s = open(tmp).read() - if hash(s) != filehash: - ok = self.save(self._post_edit(s)) + with open(tmp) as tmp_file: + edited_config_text = tmp_file.read() + if edited_config_text != original_config_text: + ok = self.save(self._post_edit(edited_config_text)) if not ok and options.force: logger.error("Save failed and --force is set, aborting edit to avoid infinite loop") elif not ok and utils.ask("Edit or discard changes (yes to edit, no to discard)?"): @@ -311,12 +312,12 @@ Pipe string s through a filter. Parse/save the output. If no changes are done, return silently. ''' - rc, outp = utils.filter_string(fltr, s) + rc, filtered_config_text = utils.filter_string(fltr, s) if rc != 0: return False - if hash(outp) == hash(s): + if filtered_config_text == s: return True - return self.save(outp) + return self.save(filtered_config_text) def filter(self, fltr): with clidisplay.nopretty(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/cibquery.py new/crmsh-5.1.0+20260814.d9688661/crmsh/cibquery.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/cibquery.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/cibquery.py 2026-08-14 08:44:20.000000000 +0200 @@ -72,3 +72,12 @@ xpath = f"/cib/configuration/nodes/node[@id='{node_id}']/@uname" result = cib.xpath(xpath) return result[0] if result else None + + +def get_crm_config_properties(cib: lxml.etree.Element) -> dict[str, str]: + """Return a dict of configured properties (name -> value) under crm_config""" + return { + e.get('name'): e.get('value', '') + for e in cib.xpath('.//crm_config//cluster_property_set/nvpair') + if e.get('name') is not None + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/corosync.py new/crmsh-5.1.0+20260814.d9688661/crmsh/corosync.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/corosync.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/corosync.py 2026-08-14 08:44:20.000000000 +0200 @@ -46,11 +46,6 @@ KNET_LINK_NUM_LIMIT = 8 -def is_knet() -> bool: - res = get_value("totem.transport") - return res and res == "knet" - - def is_using_ipv6() -> bool: res = get_value("totem.ip_version") return res and res == "ipv6" @@ -68,10 +63,6 @@ return get_value("quorum.device.model") == "net" -def is_qdevice_tls_on() -> bool: - return get_value("quorum.device.net.tls") == "on" - - def configure_two_node(removing: bool = False, qdevice_adding: bool = False) -> None: """ Enable or disable two_node in corosync.conf @@ -205,18 +196,17 @@ fname] rc = utils.ext_cmd_nosudo(cmd, shell=False) if rc == 0: - data = open(fname).read() - newhash = hash(data) + with open(fname) as remote_config_file: + remote_config_data = remote_config_file.read() if os.path.isfile(local_path): - oldata = open(local_path).read() - oldhash = hash(oldata) - if newhash == oldhash: + with open(local_path) as local_config_file: + local_config_data = local_config_file.read() + if remote_config_data == local_config_data: print("No change.") return print("Writing %s:%s..." % (utils.this_node(), local_path)) - local_file = open(local_path, 'w') - local_file.write(data) - local_file.close() + with open(local_path, 'w') as local_config_file: + local_config_file.write(remote_config_data) else: raise ValueError("Failed to retrieve %s from %s" % (local_path, from_node)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/migration.py new/crmsh-5.1.0+20260814.d9688661/crmsh/migration.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/migration.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/migration.py 2026-08-14 08:44:20.000000000 +0200 @@ -24,6 +24,7 @@ from crmsh import corosync_config_format from crmsh import iproute2 from crmsh import parallax +from crmsh import service_manager from crmsh import sh from crmsh import utils from crmsh import xmlutil @@ -118,7 +119,7 @@ self.write_in_color(sys.stdout, constants.GREEN, '[INFO] ') print(fmt % args) - def handle_problem(self, need_auto_fix: bool, is_blocker: bool, level:int, title: str, details: typing.Iterable[str]): + def handle_problem(self, need_auto_fix: bool, is_blocker: bool, level:int, title: str, detail: typing.Iterable[str]): self.has_problems = True self.block_migration = self.block_migration or is_blocker self.need_auto_fix = self.need_auto_fix or need_auto_fix @@ -128,7 +129,7 @@ case self.LEVEL_WARN: self.write_in_color(sys.stdout, constants.YELLOW, '[WARN] ') print(title) - for line in details: + for line in detail: sys.stdout.write(' ') print(line) @@ -171,6 +172,8 @@ case CheckReturnCode.PASS_NEED_AUTO_FIX: logger.info('Starting migration...') migrate_corosync_conf(local=parsed_args.local) + if not parsed_args.local: + migrate_deprecated_cib_properties() logger.info('Finished migration.') return 0 case _: @@ -299,6 +302,7 @@ cib = xmlutil.text2elem(sh.LocalShell().get_stdout_or_raise_error(None, 'crm configure show xml')) check_cib_schema_version(handler, cib) check_unsupported_resource_agents(handler, cib) + check_deprecated_cib_properties(handler, cib) def check_dependency_version(handler: CheckResultHandler): @@ -726,3 +730,38 @@ re.match(r'^pacemaker-(\d+)\.(\d+)\.rng$', filename) for filename in glob.iglob('pacemaker-*.rng', root_dir='/usr/share/pacemaker') ) if x is not None) + + +def check_deprecated_cib_properties(handler: CheckResultHandler, cib: lxml.etree.Element): + deprecated_found = [ + p for p in utils.get_all_configured_deprecated_properties(existing_xml_node=cib) + if not utils.DeprecatedTermTranslator(p, existing_xml_node=cib, quiet=True).check() + ] + + if deprecated_found: + handler.handle_problem( + True, False, handler.LEVEL_WARN, + 'Deprecated CIB properties found', + [f'The following properties are deprecated: {", ".join(deprecated_found)}. Please run "crm cluster health sles16 --fix" when cluster is running to migrate them.'] + ) + + +def migrate_deprecated_cib_properties(): + if service_manager.ServiceManager().service_is_active('pacemaker'): + logger.info("Pacemaker is running, starting online migration for CIB properties.") + try: + cib = xmlutil.text2elem(sh.LocalShell().get_stdout_or_raise_error(None, 'crm configure show xml')) + migrated = False + for prop in utils.get_all_configured_deprecated_properties(existing_xml_node=cib): + if not utils.DeprecatedTermTranslator(prop, existing_xml_node=cib, quiet=True).check(): + logger.info("Migrating deprecated CIB property: %s", prop) + utils.DeprecatedTermTranslator(prop, existing_xml_node=cib, quiet=True).fix() + migrated = True + if migrated: + logger.info("Finished online migration for CIB properties.") + else: + logger.info("No deprecated CIB properties found.") + except Exception as e: + logger.error("Failed to migrate CIB properties: %s", e) + else: + logger.info("Pacemaker is not running. Online migration for CIB properties is skipped.") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/pacemaker.py new/crmsh-5.1.0+20260814.d9688661/crmsh/pacemaker.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/pacemaker.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/pacemaker.py 2026-08-14 08:44:20.000000000 +0200 @@ -18,10 +18,6 @@ return None -def get_validate_type(cib_elem): - return "rng" - - def get_schema_filename(validate_name): if not validate_name.endswith('.rng'): return "%s.rng" % (validate_name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/qdevice.py new/crmsh-5.1.0+20260814.d9688661/crmsh/qdevice.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/qdevice.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/qdevice.py 2026-08-14 08:44:20.000000000 +0200 @@ -663,3 +663,14 @@ logger_utils.log_only_to_file(desc) if cmd: logger_utils.log_only_to_file(f"Run: {cmd}") + + @staticmethod + def get_qdevice_sync_timeout() -> int: + """ + Get qdevice sync_timeout + """ + out = corosync.query_qdevice_status() + res = re.search(r"Sync HB interval:\s+(\d+)ms", out) + if not res: + raise ValueError("Cannot find qdevice sync timeout") + return int(int(res.group(1))/1000) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/sbd.py new/crmsh-5.1.0+20260814.d9688661/crmsh/sbd.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/sbd.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/sbd.py 2026-08-14 08:44:20.000000000 +0200 @@ -14,6 +14,7 @@ from . import xmlutil from . import watchdog from . import cibquery +from . import qdevice from .service_manager import ServiceManager from .sh import ShellUtils @@ -303,7 +304,7 @@ ''' # add sbd after qdevice started if corosync.is_qdevice_configured() and ServiceManager().service_is_active("corosync-qdevice.service"): - qdevice_sync_timeout = utils.get_qdevice_sync_timeout() + qdevice_sync_timeout = qdevice.QDevice.get_qdevice_sync_timeout() if self.sbd_watchdog_timeout <= qdevice_sync_timeout: watchdog_timeout_with_qdevice = qdevice_sync_timeout + self.QDEVICE_SYNC_TIMEOUT_MARGIN self.logger.warning( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/ui_node.py new/crmsh-5.1.0+20260814.d9688661/crmsh/ui_node.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/ui_node.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/ui_node.py 2026-08-14 08:44:20.000000000 +0200 @@ -146,10 +146,6 @@ return False return True -def _oneline(s): - 'join s into a single line of space-separated tokens' - return ' '.join(l.strip() for l in s.splitlines()) - def unpack_node_xmldata(node, is_offline): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/utils.py new/crmsh-5.1.0+20260814.d9688661/crmsh/utils.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/utils.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/utils.py 2026-08-14 08:44:20.000000000 +0200 @@ -2253,17 +2253,6 @@ sh.cluster_shell().get_stdout_or_raise_error(cmd) -def get_qdevice_sync_timeout(): - """ - Get qdevice sync_timeout - """ - out = sh.cluster_shell().get_stdout_or_raise_error("crm corosync status qdevice") - res = re.search(r"Sync HB interval:\s+(\d+)ms", out) - if not res: - raise ValueError("Cannot find qdevice sync timeout") - return int(int(res.group(1))/1000) - - def detect_virt(): """ Detect if running in virt environment @@ -3070,7 +3059,13 @@ return not self._resolve_res.using_deprecated -def get_all_configured_deprecated_properties() -> list[str]: +def get_all_configured_deprecated_properties(existing_xml_node: typing.Optional[etree.Element] = None) -> list[str]: + if existing_xml_node is not None: + return [ + p + for p in ra.get_properties_meta().get_deprecated_params() + if existing_xml_node.find(f".//*[@name='{p}']") is not None + ] return [ p for p in ra.get_properties_meta().get_deprecated_params() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/crmsh/xmlutil.py new/crmsh-5.1.0+20260814.d9688661/crmsh/xmlutil.py --- old/crmsh-5.1.0+20260730.157564b0/crmsh/xmlutil.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/crmsh/xmlutil.py 2026-08-14 08:44:20.000000000 +0200 @@ -941,14 +941,6 @@ return sorted(nl, key=sort_elements if config.core.sort_elements else sort_type) -def is_resource_cli(s): - return s in utils.olist(constants.resource_cli_names) - - -def is_constraint_cli(s): - return s in utils.olist(constants.constraint_cli_names) - - def referenced_resources(node): if not is_constraint(node): return [] @@ -1128,16 +1120,6 @@ return rsc_cnt == 2 or cnt < 2 -def is_climove_location(node): - 'Figure out if the location was created by crm resource move.' - rule_l = node.findall("rule") - expr_l = node.xpath(".//expression") - return len(rule_l) == 1 and len(expr_l) == 1 and \ - node.get("id").startswith("cli-") and \ - expr_l[0].get("attribute") == "#uname" and \ - expr_l[0].get("operation") == "eq" - - def is_pref_location(node): 'Figure out if the location is a node preference.' rule_l = node.findall("rule") @@ -1182,10 +1164,6 @@ return get_child_nvset_node(node) -def get_properties_node(node): - return get_child_nvset_node(node, attr_set="cluster_property_set") - - def new_cib(): cib_elem = etree.Element("cib") conf_elem = etree.SubElement(cib_elem, "configuration") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/doc/crm.8.adoc new/crmsh-5.1.0+20260814.d9688661/doc/crm.8.adoc --- old/crmsh-5.1.0+20260730.157564b0/doc/crm.8.adoc 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/doc/crm.8.adoc 2026-08-14 08:44:20.000000000 +0200 @@ -1203,10 +1203,6 @@ process is cumbersome and error-prone, and the goal is for scripts to make this process easier. -Scripts are implemented using the python `parallax` package which -provides a thin wrapper on top of SSH. This allows the scripts to -function through the usual SSH channels used for system maintenance, -requiring no additional software to be installed or maintained. [[cmdhelp.script.json,JSON API for cluster scripts]] ==== `json` @@ -1413,9 +1409,6 @@ the list of nodes provided. If no target nodes are given, the configuration is pushed to all other nodes in the cluster. -It is recommended to use `csync2` to distribute the cluster -configuration files rather than relying on this command. - Usage: ......... push [node] ... @@ -1530,7 +1523,7 @@ [[cmdhelp.corosync.link.update,Update a knet link]] ===== `update` -Modify an existing knet link in the configuration file, changing node adresses +Modify an existing knet link in the configuration file, changing node addresses and/or link options. Usage: @@ -2801,7 +2794,7 @@ The configuration may be logically divided into four parts: nodes, resources, constraints, and (cluster) properties and -attributes. Each of these commands support one or more basic CIB +attributes. Each of these commands supports one or more basic CIB objects. Nodes and attributes describing nodes are managed using the @@ -2834,7 +2827,7 @@ - `fencing_topology` Finally, there are the cluster properties, resource meta-attributes -defaults, and operations defaults. All are just a set of attributes. +defaults, and operations defaults. All are just a set of attributes. These attributes are managed by the following commands: - `property` @@ -3725,7 +3718,7 @@ If no property name is passed to the command, the list of known cluster properties is printed. -To print one property's help, use the +--help+ option; Or use <Tab> +To print one property's help, use the +--help+ option; or use <Tab> to complete the help text for the property on interactive mode. For more information on rule expressions, see @@ -4031,7 +4024,7 @@ [[cmdhelp.configure.set,set an attribute value]] ==== `set` -Set the value of a configured attribute. The attribute must +Set the value of a configured attribute. The attribute must be configured previously, and can be an agent parameter, meta attribute, utilization value or operation value. @@ -4073,7 +4066,7 @@ To show all objects in a tag, use the +tag:+ prefix. -To show all constraints related to a primitive, or +To show all constraints related to a primitive, or to show all objects of a certain RA type, use the +related:+ prefix. To show all modified objects, pass the argument +changed+. @@ -4260,7 +4253,7 @@ [[cmdhelp.configure.xml,raw xml]] ==== `xml` -Even though we promissed no xml, it may happen, but hopefully +Even though we promised no xml, it may happen, but hopefully very very seldom, that an element from the CIB cannot be rendered in the configuration language. In that case, the element will be shown as raw xml, prefixed by this command. That element can then @@ -4401,7 +4394,7 @@ It may sometimes be of interest to see how status changes would affect the Policy Engine. The set of `cibstatus` level commands -allow the user to load status sections from various sources and +allows the user to load status sections from various sources and then insert or modify resource operations or change nodes' state. The effect of those changes may then be observed by running the @@ -4678,7 +4671,7 @@ Invokes the given action for the resource. This is done directly via the resource agent, so the command must -be issued while the cluster or the resource is in +be issued while the cluster or the resource is in maintenance mode. Unless the action is `start` or `monitor`, the action must be invoked @@ -4687,7 +4680,7 @@ To use SSH for executing resource actions on multiple nodes, append `ssh` after the action name. This requires SSH access to be configured -between the nodes and the parallax python package to be installed. +between the nodes. Usage: ............... @@ -4703,7 +4696,7 @@ [[cmdhelp.maintenance.off,Disable maintenance mode]] ==== `off` -Disables maintenances mode, either for the whole cluster +Disables maintenance mode, either for the whole cluster or for the given resource. Usage: @@ -4719,7 +4712,7 @@ [[cmdhelp.maintenance.on,Enable maintenance mode]] ==== `on` -Enables maintenances mode, either for the whole cluster +Enables maintenance mode, either for the whole cluster or for the given resource. Usage: @@ -4748,11 +4741,7 @@ of how good the tools at hand are. Therefore, one should first say which period he or she wants to analyze. If not otherwise specified, the last hour is considered. Logs and other relevant information is -collected using `crm report`. Since this process takes some time and -we always need fresh logs, information is refreshed in a much faster -way using the python parallax module. If +python-parallax+ is not -found on the system, examining a live cluster is still possible -- -though not as comfortable. +collected using `crm report`. Apart from examining a live cluster, events may be retrieved from a report generated by `crm report` (see also the +-H+ option). In that @@ -4965,7 +4954,7 @@ Show messages logged on one or more nodes. Leaving out a node name produces combined logs of all nodes. Messages are sorted by -time and, if the terminal emulations supports it, displayed in +time and, if the terminal emulator supports it, displayed in different colours depending on the node to allow for easier reading. @@ -5179,7 +5168,7 @@ After the `ptest` output, logs about events that happened during the transition are printed. -The `tags` subcommand scans the logs for the transition and return a +The `tags` subcommand scans the logs for the transition and returns a list of key events during that transition. For example, the tag +error+ will be returned if there are any errors logged during the transition. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/features/migration.feature new/crmsh-5.1.0+20260814.d9688661/test/features/migration.feature --- old/crmsh-5.1.0+20260730.157564b0/test/features/migration.feature 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/features/migration.feature 2026-08-14 08:44:20.000000000 +0200 @@ -159,6 +159,29 @@ Then Expected return code is "0" And Run "grep -F 'ring0_addr: @hanode2.ip.0' /etc/corosync/corosync.conf" OK + Scenario: Run pre-migration checks and fixes against deprecated CIB properties + When Run "crm cluster start" on "hanode1" + And Run "crm cluster start" on "hanode2" + Then Cluster service is "started" on "hanode1" + And Cluster service is "started" on "hanode2" + When Run "crm_attribute -t crm_config -n stonith-timeout -v 120s" on "hanode1" + And Try "crm cluster health sles16" on "hanode1" + Then Expected return code is "1" + And Expect stdout contains snippets ["[PASS] This cluster is good to migrate to SLES 16.", "[WARN] Deprecated CIB properties found", "stonith-timeout"]. + When Try "crm cluster health sles16 --fix" on "hanode1" + Then Expected return code is "0" + And Cluster property "fencing-timeout" is "120" + And Cluster property "stonith-timeout" is not configured + When Run "crm_attribute -t crm_config -n cluster-ipc-limit -v 800" on "hanode1" + And Try "crm cluster health sles16" on "hanode1" + Then Expected return code is "0" + When Try "crm cluster health sles16 --fix" on "hanode1" + Then Expected return code is "0" + And Expected "Migrating deprecated CIB property: cluster-ipc-limit" not in stdout + And Cluster property "cluster-ipc-limit" is "800" + When Run "crm cluster stop" on "hanode1" + And Run "crm cluster stop" on "hanode2" + Scenario: Run pre-migration checks when some of the nodes are offline. When Run "systemctl stop sshd" on "hanode2" And Try "crm cluster health sles16" on "hanode1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_bugs.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_bugs.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_bugs.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_bugs.py 2026-08-14 08:44:20.000000000 +0200 @@ -34,9 +34,7 @@ """ data = etree.fromstring(xml) obj = factory.create_from_node(data) - print(etree.tostring(obj.node)) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'primitive bug41660 ocf:pacemaker:Dummy meta target-role=Stopped' assert data == exp assert obj.cli_use_validate() @@ -78,15 +76,12 @@ #assert data == exp #assert obj.cli_use_validate() - print(etree.tostring(obj.node)) commit_holder = factory.commit try: factory.commit = lambda *args: True from crmsh.ui_resource import set_deep_meta_attr - print("PRE", etree.tostring(obj.node)) set_deep_meta_attr("libvirtd-clone", "target-role", "Started") - print("POST", etree.tostring(obj.node)) assert ['Started'] == obj.node.xpath('.//nvpair[@name="target-role"]/@value') finally: factory.commit = commit_holder @@ -112,7 +107,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print(data) exp = 'clone libvirtd-clone libvirtd meta target-role=Stopped' assert data == exp assert obj.cli_use_validate() @@ -219,11 +213,9 @@ assert len(elem.xpath(".//meta_attributes/nvpair[@name='target-role']")) == 1 - print("BEFORE:", etree.tostring(elem)) set_deep_meta_attr_node(elem, 'target-role', 'Stopped') - print("AFTER:", etree.tostring(elem)) assert len(elem.xpath(".//meta_attributes/nvpair[@name='target-role']")) == 1 @@ -245,7 +237,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'location cli-prefer-dummy-resource dummy-resource role=Started rule #uname eq x64-4 and date lt "2014-05-17 17:56:11Z"' assert data == exp assert obj.cli_use_validate() @@ -260,7 +251,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'order order-a-b a:promote b:start' assert data == exp assert obj.cli_use_validate() @@ -276,7 +266,6 @@ obj2 = factory.create_object('group', 'g1', 'p1') assert obj2 is True obj3 = factory.create_object('group', 'g2', 'p1') - print(obj3) assert obj3 is False @@ -329,7 +318,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'primitive rsc1 ocf:pacemaker:Dummy params rule 0: #cluster-name eq clusterA state="/var/run/Dummy-rsc1-clusterA" params rule 0: #cluster-name eq clusterB state="/var/run/Dummy-rsc1-clusterB" op monitor interval=10s' assert data == exp assert obj.cli_use_validate() @@ -356,7 +344,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'primitive rsc2 ocf:pacemaker:Dummy op monitor interval=10s role=Stopped' assert data == exp assert obj.cli_use_validate() @@ -374,7 +361,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'primitive rsc3 Dummy params verbose verbase="" verbese=" "' assert data == exp assert obj.cli_use_validate() @@ -414,7 +400,6 @@ obj = factory.create_from_node(data) assert obj is not None data = obj.repr_cli(format_mode=-1) - print("OUTPUT:", data) exp = 'primitive q1 ocf:pacemaker:Dummy params state="foo\\"foo\\""' assert data == exp assert obj.cli_use_validate() @@ -564,7 +549,6 @@ assert obj is not None with clidisplay.nopretty(): original_cib = obj.repr() - print(original_cib) obj = cibconfig.mkset_obj() assert obj is not None @@ -615,7 +599,6 @@ obj = cibconfig.mkset_obj("g1") with clidisplay.nopretty(): - print(obj.repr().strip()) assert obj.repr().strip() == "group g1 p1 p3" obj = cibconfig.mkset_obj() @@ -624,10 +607,6 @@ assert ok obj = cibconfig.mkset_obj() with clidisplay.nopretty(): - print("*** ORIGINAL") - print(original_cib) - print("*** NOW") - print(obj.repr()) assert original_cib == obj.repr() @@ -640,7 +619,6 @@ assert obj is not None with clidisplay.nopretty(): original_cib = obj.repr() - print(original_cib) obj = cibconfig.mkset_obj() assert obj is not None @@ -649,11 +627,8 @@ """) assert ok - print("** baseline") obj = cibconfig.mkset_obj() assert obj is not None - with clidisplay.nopretty(): - print(obj.repr()) obj = cibconfig.mkset_obj() assert obj is not None @@ -661,7 +636,6 @@ """, remove=False, method='update') assert ok - print("** end") obj = cibconfig.mkset_obj() assert obj is not None @@ -669,10 +643,6 @@ assert ok obj = cibconfig.mkset_obj() with clidisplay.nopretty(): - print("*** ORIGINAL") - print(original_cib) - print("*** NOW") - print(obj.repr()) assert original_cib == obj.repr() @@ -685,7 +655,6 @@ assert obj is not None with clidisplay.nopretty(): original_cib = obj.repr() - print(original_cib) obj = cibconfig.mkset_obj() assert obj is not None @@ -762,10 +731,6 @@ assert ok obj = cibconfig.mkset_obj() with clidisplay.nopretty(): - print("*** ORIGINAL") - print(original_cib) - print("*** NOW") - print(obj.repr()) assert original_cib == obj.repr() @@ -827,9 +792,7 @@ """ data = etree.fromstring(xml) obj = factory.create_from_node(data) - print(etree.tostring(obj.node)) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'clone c-bug959895 g-bug959895' assert data == exp assert obj.cli_use_validate() @@ -860,9 +823,7 @@ data = etree.fromstring(xml) obj = factory.create_from_node(data) - print(etree.tostring(obj.node)) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'node aberfeldy utilization cpu=2 memory=500 attributes standby=on' assert data == exp assert obj.cli_use_validate() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cib.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cib.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cib.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cib.py 2026-08-14 08:44:20.000000000 +0200 @@ -22,7 +22,6 @@ def test_cib_schema_change(): "Changing the validate-with CIB attribute" copy_of_cib = copy.copy(factory.cib_orig) - print(etree.tostring(copy_of_cib, pretty_print=True)) tmp_cib_objects = factory.cib_objects factory.cib_objects = [] factory.change_schema("pacemaker-1.1") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cibquery.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cibquery.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cibquery.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cibquery.py 2026-08-14 08:44:20.000000000 +0200 @@ -112,3 +112,16 @@ def test_get_node_name_by_id(self): self.assertEqual(cibquery.get_node_name_by_id(self.cib, 1), "ha-1-1") self.assertIsNone(cibquery.get_node_name_by_id(self.cib, 2)) + + def test_get_crm_config_properties(self): + self.assertDictEqual( + { + 'have-watchdog': 'false', + 'dc-version': '2.1.5+20221208.a3f44794f-150500.4.9-2.1.5+20221208.a3f44794f', + 'cluster-infrastructure': 'corosync', + 'cluster-name': 'hacluster', + 'fencing-enabled': 'true', + 'fencing-timeout': '71', + }, + cibquery.get_crm_config_properties(self.cib), + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cliformat.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cliformat.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_cliformat.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_cliformat.py 2026-08-14 08:44:20.000000000 +0200 @@ -28,20 +28,16 @@ assert_is_not_none(obj) obj.nocli = True xml = obj.repr_cli(format_mode=format_mode) - print(xml) obj.nocli = False s = obj.repr_cli(format_mode=format_mode) if strip_color: import re s = re.sub(r"\$\{[^}]+\}", "", s) - if (s != cli) or debug: - print("GOT:", s) - print("EXP:", cli) assert obj.cli_use_validate() if expected is not None: - assert expected == s + assert expected == s, "GOT: {}\nEXP: {}".format(s, expected) else: - assert cli == s + assert cli == s, "GOT: {}\nEXP: {}".format(s, cli) assert not debug @@ -138,7 +134,6 @@ obj = factory.create_from_node(data) assert_is_not_none(obj) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'primitive dummy ocf:pacemaker:Dummy op start timeout=60s interval=0s op stop timeout=60s interval=0s op monitor interval=60s timeout=30s meta target-role=Stopped' assert exp == data assert obj.cli_use_validate() @@ -160,7 +155,6 @@ obj = factory.create_from_node(data) assert_is_not_none(obj) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'primitive dummy2 ocf:pacemaker:Dummy meta target-role=Stopped ' \ 'op start timeout=60s interval=0s op stop timeout=60s interval=0s ' \ 'op monitor interval=60s timeout=30s' @@ -181,7 +175,6 @@ obj = factory.create_from_node(data) assert_is_not_none(obj) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'fencing_topology st1' assert exp == data assert obj.cli_use_validate() @@ -202,7 +195,6 @@ obj = factory.create_from_node(data) assert_is_not_none(obj) data = obj.repr_cli(format_mode=-1) - print(data) exp = 'fencing_topology pattern:green.* apple pear pattern:red.* pear apple' assert exp == data assert obj.cli_use_validate() @@ -216,7 +208,6 @@ data = etree.fromstring(xml) factory.create_from_cli("primitive dummy3 ocf:pacemaker:Dummy") data, _, _ = cibconfig.postprocess_cli(data) - print("after postprocess:", etree.tostring(data)) obj = factory.create_from_node(data) assert_is_not_none(obj) assert obj.cli_use_validate() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_migration.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_migration.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_migration.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_migration.py 2026-08-14 08:44:20.000000000 +0200 @@ -114,3 +114,105 @@ 'Please run "crm configure upgrade force" to upgrade to the latest version.', ] ) + + +class TestDeprecatedCibProperties(unittest.TestCase): + @mock.patch('crmsh.utils.get_all_configured_deprecated_properties') + @mock.patch('crmsh.utils.DeprecatedTermTranslator._get_maps') + def test_check_deprecated_cib_properties_found(self, mock_get_maps, mock_get_dep_properties): + mock_get_dep_properties.return_value = ['stonith-timeout'] + mock_get_maps.return_value = ({'stonith-timeout': 'fencing-timeout'}, {}) + cib = lxml.etree.fromstring(''' + <cib> + <configuration> + <crm_config> + <cluster_property_set id="cib-bootstrap-options"> + <nvpair name="stonith-timeout" value="120s"/> + </cluster_property_set> + </crm_config> + </configuration> + </cib> + ''') + handler = mock.Mock(migration.CheckResultHandler) + migration.check_deprecated_cib_properties(handler, cib) + handler.handle_problem.assert_called_with( + True, False, handler.LEVEL_WARN, + 'Deprecated CIB properties found', + ['The following properties are deprecated: stonith-timeout. Please run "crm cluster health sles16 --fix" when cluster is running to migrate them.'] + ) + + @mock.patch('crmsh.utils.get_all_configured_deprecated_properties') + @mock.patch('crmsh.utils.DeprecatedTermTranslator._get_maps') + def test_check_deprecated_cib_properties_not_found(self, mock_get_maps, mock_get_dep_properties): + mock_get_dep_properties.return_value = [] + mock_get_maps.return_value = ({'stonith-timeout': 'fencing-timeout'}, {}) + cib = lxml.etree.fromstring(''' + <cib> + <configuration> + <crm_config> + <cluster_property_set id="cib-bootstrap-options"> + <nvpair name="fencing-timeout" value="120s"/> + </cluster_property_set> + </crm_config> + </configuration> + </cib> + ''') + handler = mock.Mock(migration.CheckResultHandler) + migration.check_deprecated_cib_properties(handler, cib) + handler.handle_problem.assert_not_called() + + @mock.patch('crmsh.utils.get_all_configured_deprecated_properties') + @mock.patch('crmsh.utils.DeprecatedTermTranslator._get_maps') + @mock.patch('crmsh.utils.ra.get_properties_meta') + def test_check_deprecated_cib_properties_without_replacement_not_found(self, mock_get_properties_meta, mock_get_maps, mock_get_dep_properties): + mock_get_dep_properties.return_value = ['stonith-timeout'] + mock_get_maps.return_value = ({'stonith-timeout': None}, {}) + mock_get_properties_meta.return_value.param_default.return_value = 'true' + cib = lxml.etree.fromstring(''' + <cib> + <configuration> + <crm_config> + <cluster_property_set id="cib-bootstrap-options"> + <nvpair name="stonith-timeout" value="false"/> + </cluster_property_set> + </crm_config> + </configuration> + </cib> + ''') + handler = mock.Mock(migration.CheckResultHandler) + migration.check_deprecated_cib_properties(handler, cib) + handler.handle_problem.assert_not_called() + + @mock.patch('crmsh.utils.get_all_configured_deprecated_properties') + @mock.patch('crmsh.utils.DeprecatedTermTranslator') + @mock.patch('crmsh.sh.LocalShell.get_stdout_or_raise_error') + @mock.patch('crmsh.service_manager.ServiceManager.service_is_active') + def test_migrate_deprecated_cib_properties_active(self, mock_service_is_active, mock_get_stdout, mock_translator, mock_get_dep_properties): + mock_service_is_active.return_value = True + mock_get_dep_properties.return_value = ['stonith-timeout'] + mock_get_stdout.return_value = ''' + <cib> + <configuration> + <crm_config> + <cluster_property_set id="cib-bootstrap-options"> + <nvpair name="stonith-timeout" value="120s"/> + </cluster_property_set> + </crm_config> + </configuration> + </cib> + ''' + mock_trans_inst = mock.Mock() + mock_trans_inst.check.return_value = False + mock_translator.return_value = mock_trans_inst + + migration.migrate_deprecated_cib_properties() + + mock_translator.assert_called_with('stonith-timeout', existing_xml_node=mock.ANY, quiet=True) + mock_trans_inst.fix.assert_called_once() + + @mock.patch('crmsh.service_manager.ServiceManager.service_is_active') + @mock.patch('crmsh.utils.DeprecatedTermTranslator') + def test_migrate_deprecated_cib_properties_inactive(self, mock_translator, mock_service_is_active): + mock_service_is_active.return_value = False + migration.migrate_deprecated_cib_properties() + mock_translator.assert_not_called() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_parse.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_parse.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_parse.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_parse.py 2026-08-14 08:44:20.000000000 +0200 @@ -173,7 +173,6 @@ out = self._parse('ms m0 resource params a=b') self.assertEqual(out.get('id'), 'm0') - print(xml_tostring(out)) self.assertEqual(['resource'], out.xpath('./crmsh-ref/@id')) self.assertEqual(['b'], out.xpath('instance_attributes/nvpair[@name="a"]/@value')) @@ -285,7 +284,6 @@ def test_order(self): out = self._parse('order o1 Mandatory: [ A B sequential=true ] C') - print(xml_tostring(out)) self.assertEqual(['Mandatory'], out.xpath('/rsc_order/@kind')) self.assertEqual(2, len(out.xpath('/rsc_order/resource_set'))) self.assertEqual(['false'], out.xpath('/rsc_order/resource_set/@require-all')) @@ -480,7 +478,6 @@ devs = ['fencing-vbox3-1-off', 'fencing-vbox3-2-off', 'fencing-vbox3-1-on', 'fencing-vbox3-2-on'] out = self._parse('fencing_topology vbox4: %s' % ','.join(devs)) - print(xml_tostring(out)) self.assertEqual(1, len(out)) def test_fencing_1114(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_scripts.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_scripts.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_scripts.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_scripts.py 2026-08-14 08:44:20.000000000 +0200 @@ -5,7 +5,6 @@ from builtins import str from builtins import object from os import path -from pprint import pprint import pytest from lxml import etree from crmsh import scripts @@ -463,9 +462,7 @@ assert script is not None assert 'legacy' == script['name'] assert len(script['shortdesc']) > 0 - pprint(script) actions = scripts.verify(script, {}, external_check=False) - pprint(actions) assert [{'longdesc': '', 'name': 'apply_local', 'shortdesc': 'Configure SSH', @@ -522,7 +519,6 @@ 'apache': {'id': 'apache'}, 'virtual-ip': {'id': 'www-vip', 'ip': '192.168.1.100'}, 'install': False}, external_check=False) - pprint(actions) assert len(actions) == 1 assert str(actions[0]['text']).find('group www') >= 0 @@ -532,7 +528,6 @@ 'apache': {'id': 'apache'}, 'virtual-ip': {'id': 'www-vip', 'ip': '192.168.1.100'}, 'install': True}, external_check=False) - pprint(actions) assert len(actions) == 3 @@ -543,7 +538,6 @@ {'wiz': 'abc', 'foo': 'cde', 'included-script': {'foo': True, 'bar': 'bah bah'}}, external_check=False) - pprint(actions) assert len(actions) == 6 assert '33\n\nabc' == actions[-1]['text'].strip() @@ -555,7 +549,6 @@ script, {'vip': {'id': 'vop', 'ip': '10.0.0.4'}}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'].find('primitive vop test:virtual-ip\n\tip="10.0.0.4"') >= 0 assert actions[0]['text'].find("clone c-vop vop") >= 0 @@ -590,7 +583,6 @@ actions = scripts.verify(script_b, {'wiz': "SARUMAN"}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "SARUMAN+SARUMAN" @@ -629,7 +621,6 @@ actions = scripts.verify(script_a, {"id": "apacho"}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "primitive apacho test:apache" #import ipdb @@ -637,7 +628,6 @@ actions = scripts.verify(script_b, {'wiz': "SARUMAN", "apache": {"id": "apacho"}}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "primitive SARUMAN apacho" @@ -663,13 +653,11 @@ actions = scripts.verify(script_a, {"foo": "one"}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "one" actions = scripts.verify(script_a, {"foo": "three"}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "three" @@ -758,7 +746,6 @@ actions = scripts.verify(script_b, {'wiz': "head", "apache-a": {"id": "one"}, "apache-b": {"id": "two"}}, external_check=False) assert len(actions) == 1 - pprint(actions) assert actions[0]['text'] == "primitive one test:apache\n\nprimitive two test:apache\n\nprimitive head one two" @@ -802,7 +789,6 @@ def ver(): actions = scripts.verify(script_b, {"foofoo": {"foo": "one"}}, external_check=False) - pprint(actions) with pytest.raises(ValueError): ver() @@ -813,7 +799,6 @@ unified, {'id': 'foo', 'vip': {'id': 'bar', 'ip': '192.168.0.15'}}, external_check=False) - pprint(actions) assert len(actions) == 1 assert 'primitive bar IPaddr2 ip=192.168.0.15\ngroup g-foo foo bar' == actions[-1]['text'].strip() @@ -854,7 +839,6 @@ actions = scripts.verify(script_a, {"foo": "hello world"}, external_check=False) - pprint(actions) assert len(actions) == 1 assert actions[0]['name'] == 'call' assert actions[0]['value'] == '#!/bin/sh\necho "hello world"' @@ -863,7 +847,6 @@ {"foo": "hello world"}, tp) for action, args in tp.actions: - print(action, args) if action == 'finish': assert args[0]['value'] == '#!/bin/sh\necho "hello world"' @@ -890,7 +873,6 @@ a1 = scripts.verify(scrpt, {"stringtest": val}, external_check=False) - pprint(a1) return a1 a1 = runtest('stringtest == "balloon"', "balloon") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_ui_cluster.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_ui_cluster.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_ui_cluster.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_ui_cluster.py 2026-08-14 08:44:20.000000000 +0200 @@ -7,7 +7,6 @@ from crmsh import ui_cluster -logging.basicConfig(level=logging.INFO) class TestCluster(unittest.TestCase): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_utils.py new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_utils.py --- old/crmsh-5.1.0+20260730.157564b0/test/unittests/test_utils.py 2026-07-30 08:49:30.000000000 +0200 +++ new/crmsh-5.1.0+20260814.d9688661/test/unittests/test_utils.py 2026-08-14 08:44:20.000000000 +0200 @@ -14,7 +14,6 @@ import crmsh.utils from crmsh import utils, config, tmpfiles, constants, options -logging.basicConfig(level=logging.DEBUG) @mock.patch("crmsh.sh.ShellUtils.get_stdout")
