![](https://seccdn.libravatar.org/avatar/128a7b98d536a9cf9b4d4d5a90d63475.jpg?s=120&d=mm&r=g)
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package crmsh for openSUSE:Factory checked in at 2022-12-27 11:55:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.1563 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "crmsh" Tue Dec 27 11:55:02 2022 rev:273 rq:1045457 version:4.4.1+20221227.bd7d326e Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2022-12-16 17:52:05.608163550 +0100 +++ /work/SRC/openSUSE:Factory/.crmsh.new.1563/crmsh.changes 2022-12-27 11:55:12.703364570 +0100 @@ -1,0 +2,26 @@ +Tue Dec 27 08:22:09 UTC 2022 - XLiang@suse.com + +- Update to version 4.4.1+20221227.bd7d326e: + * Dev: upgradeutil: do not ask when running in a background process group + +------------------------------------------------------------------- +Tue Dec 27 06:45:10 UTC 2022 - XLiang@suse.com + +- Update to version 4.4.1+20221227.d0ae243b: + * Dev: unittest: Adjust unit test for previous changes + * Fix: bootstrap: Unset SBD_DELAY_START when running 'crm cluster start' (bsc#1202177) + +------------------------------------------------------------------- +Mon Dec 26 14:05:42 UTC 2022 - XLiang@suse.com + +- Update to version 4.4.1+20221226.d38855cb: + * Dev: unittest: Adjust unit test for previous changes + * Dev: qdevice: Adjust qdevice reload policy + +------------------------------------------------------------------- +Mon Dec 26 08:11:33 UTC 2022 - XLiang@suse.com + +- Update to version 4.4.1+20221226.371d6f7a: + * Fix: report: Catch read exception (bsc#1206606) + +------------------------------------------------------------------- Old: ---- crmsh-4.4.1+20221215.752a541a.tar.bz2 New: ---- crmsh-4.4.1+20221227.bd7d326e.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.s0R86t/_old 2022-12-27 11:55:13.231367506 +0100 +++ /var/tmp/diff_new_pack.s0R86t/_new 2022-12-27 11:55:13.235367528 +0100 @@ -36,7 +36,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 4.4.1+20221215.752a541a +Version: 4.4.1+20221227.bd7d326e Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.s0R86t/_old 2022-12-27 11:55:13.295367862 +0100 +++ /var/tmp/diff_new_pack.s0R86t/_new 2022-12-27 11:55:13.299367885 +0100 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">752a541abb58dc5163732042ac2f8120739bc93e</param> + <param name="changesrevision">bd7d326e7b0c684c3f93a95851474fcb263a5689</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-4.4.1+20221215.752a541a.tar.bz2 -> crmsh-4.4.1+20221227.bd7d326e.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/bootstrap.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/bootstrap.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/bootstrap.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/bootstrap.py 2022-12-27 09:04:26.000000000 +0100 @@ -727,25 +727,29 @@ Return success node list """ from .sbd import SBDTimeout - pacemaker_start_msg = "Starting pacemaker" # not _context means not in init or join process if not _context and \ utils.package_is_installed("sbd") and \ utils.service_is_enabled("sbd.service") and \ SBDTimeout.is_sbd_delay_start(): - pacemaker_start_msg += "(delaying start of sbd for {}s)".format(SBDTimeout.get_sbd_delay_start_sec_from_sysconfig()) + target_dir = "/run/systemd/system/sbd.service.d/" + cmd1 = "mkdir -p {}".format(target_dir) + target_file = "{}sbd_delay_start_disabled.conf".format(target_dir) + cmd2 = "echo -e '[Service]\nUnsetEnvironment=SBD_DELAY_START' > {}".format(target_file) + cmd3 = "systemctl daemon-reload" + for cmd in [cmd1, cmd2, cmd3]: + parallax.parallax_call(node_list, cmd) - with logger_utils.status_long(pacemaker_start_msg): - # To avoid possible JOIN flood in corosync - if len(node_list) > 5: - for node in node_list[:]: - time.sleep(0.25) - try: - utils.start_service("corosync.service", remote_addr=node) - except ValueError as err: - node_list.remove(node) - logger.error(err) - return utils.start_service("pacemaker.service", enable=enable_flag, node_list=node_list) + # To avoid possible JOIN flood in corosync + if len(node_list) > 5: + for node in node_list[:]: + time.sleep(0.25) + try: + utils.start_service("corosync.service", remote_addr=node) + except ValueError as err: + node_list.remove(node) + logger.error(err) + return utils.start_service("pacemaker.service", enable=enable_flag, node_list=node_list) def install_tmp(tmpfile, to): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/healthcheck.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/healthcheck.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/healthcheck.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/healthcheck.py 2022-12-27 09:04:26.000000000 +0100 @@ -216,7 +216,7 @@ if args.yes: def ask(msg): return True else: - def ask(msg): return crmsh.utils.ask('Healthcheck: fix: ' + msg) + def ask(msg): return crmsh.utils.ask('Healthcheck: fix: ' + msg, background_wait=False) if args.without_check or not feature_local_check(feature, nodes): feature.fix_local(nodes, ask) return 0 @@ -233,7 +233,7 @@ if args.yes: def ask(msg): return True else: - def ask(msg): return crmsh.utils.ask('Healthcheck: fix: ' + msg) + def ask(msg): return crmsh.utils.ask('Healthcheck: fix: ' + msg, background_wait=False) if args.without_check or not feature_full_check(feature, nodes): feature_fix(feature, nodes, ask) return 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/qdevice.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/qdevice.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/qdevice.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/qdevice.py 2022-12-27 09:04:26.000000000 +0100 @@ -27,7 +27,7 @@ QDEVICE_RESTART_LATER = 2 -def evaluate_qdevice_quorum_effect(mode, diskless_sbd=False): +def evaluate_qdevice_quorum_effect(mode, diskless_sbd=False, is_stage=False): """ While adding/removing qdevice, get current expected votes and actual total votes, to calculate after adding/removing qdevice, whether cluster has quorum @@ -44,6 +44,9 @@ if utils.calculate_quorate_status(expected_votes, actual_votes) and not diskless_sbd: # safe to use reload return QdevicePolicy.QDEVICE_RELOAD + elif mode == QDEVICE_ADD and not is_stage: + # Add qdevice from init process, safe to restart + return QdevicePolicy.QDEVICE_RESTART elif xmlutil.CrmMonXmlParser.is_any_resource_running(): # will lose quorum, and with RA running # no reload, no restart cluster service @@ -137,6 +140,7 @@ self.cluster_name = cluster_name self.qdevice_reload_policy = QdevicePolicy.QDEVICE_RESTART self.is_stage = is_stage + self.using_diskless_sbd = False @property def qnetd_cacert_on_qnetd(self): @@ -668,10 +672,9 @@ """ from .sbd import SBDManager, SBDTimeout utils.check_all_nodes_reachable() - using_diskless_sbd = SBDManager.is_using_diskless_sbd() - self.qdevice_reload_policy = evaluate_qdevice_quorum_effect(QDEVICE_ADD, using_diskless_sbd) + self.using_diskless_sbd = SBDManager.is_using_diskless_sbd() # add qdevice after diskless sbd started - if using_diskless_sbd: + if self.using_diskless_sbd: res = SBDManager.get_sbd_value_from_config("SBD_WATCHDOG_TIMEOUT") if not res or int(res) < SBDTimeout.SBD_WATCHDOG_TIMEOUT_DEFAULT_WITH_QDEVICE: sbd_watchdog_timeout_qdevice = SBDTimeout.SBD_WATCHDOG_TIMEOUT_DEFAULT_WITH_QDEVICE @@ -688,6 +691,7 @@ with logger_utils.status_long("Qdevice certification process"): self.certificate_process_on_init() self.adjust_sbd_watchdog_timeout_with_qdevice() + self.qdevice_reload_policy = evaluate_qdevice_quorum_effect(QDEVICE_ADD, self.using_diskless_sbd, self.is_stage) self.config_qdevice() self.start_qdevice_service() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/report/utillib.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/report/utillib.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/report/utillib.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/report/utillib.py 2022-12-27 09:04:26.000000000 +0100 @@ -1541,7 +1541,11 @@ data = None _open = get_open_method(infile) with _open(infile, 'rt', encoding='utf-8', errors='replace') as f: - data = f.read() + try: + data = f.read() + except Exception as err: + logger.error("When reading file \"%s\": %s", infile, str(err)) + return None return crmutils.to_ascii(data) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/upgradeutil.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/upgradeutil.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/upgradeutil.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/upgradeutil.py 2022-12-27 09:04:26.000000000 +0100 @@ -105,7 +105,7 @@ def _upgrade(nodes, seq): def ask(msg: str): - if not crmsh.utils.ask('Upgrade of crmsh configuration: ' + msg): + if not crmsh.utils.ask('Upgrade of crmsh configuration: ' + msg, background_wait=False): raise crmsh.healthcheck.AskDeniedByUser() try: for key in VERSION_FEATURES.keys(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/crmsh/utils.py new/crmsh-4.4.1+20221227.bd7d326e/crmsh/utils.py --- old/crmsh-4.4.1+20221215.752a541a/crmsh/utils.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/crmsh/utils.py 2022-12-27 09:04:26.000000000 +0100 @@ -211,17 +211,25 @@ return (not options.ask_no) and sys.stdin.isatty() -def ask(msg): - """ - Ask for user confirmation. - If core.force is true, always return true. - If not interactive and core.force is false, always return false. +def ask(msg, background_wait=True): + """Ask for user confirmation. + + Parameters: + * background_wait: When set to False, return False without asking if current process is in background. Otherwise, + block until the process is brought to foreground. + + Global Options: + * core.force: always return true without asking + * options.ask_no: do not ask and return false """ if config.core.force: logger.info("%s [YES]", msg) return True if not can_ask(): return False + if sys.stdin.isatty() and os.tcgetpgrp(sys.stdin.fileno()) != os.getpgrp() and not background_wait: + logger.info("%s [NO]", msg) + return False msg += ' ' if msg.endswith('? '): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/test/unittests/test_bootstrap.py new/crmsh-4.4.1+20221227.bd7d326e/test/unittests/test_bootstrap.py --- old/crmsh-4.4.1+20221215.752a541a/test/unittests/test_bootstrap.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/test/unittests/test_bootstrap.py 2022-12-27 09:04:26.000000000 +0100 @@ -290,21 +290,32 @@ Global tearDown. """ - @mock.patch('crmsh.log.LoggerUtils.status_long') + @mock.patch('crmsh.parallax.parallax_call') @mock.patch('crmsh.utils.start_service') - @mock.patch('crmsh.sbd.SBDTimeout.get_sbd_delay_start_sec_from_sysconfig') @mock.patch('crmsh.sbd.SBDTimeout.is_sbd_delay_start') @mock.patch('crmsh.utils.service_is_enabled') @mock.patch('crmsh.utils.package_is_installed') - def test_start_pacemaker(self, mock_installed, mock_enabled, mock_delay_start, mock_timeout, mock_start, mock_long): + def test_start_pacemaker(self, mock_installed, mock_enabled, mock_delay_start, mock_start, mock_parallax_call): bootstrap._context = None mock_installed.return_value = True mock_enabled.return_value = True mock_delay_start.return_value = True - mock_timeout.return_value = 60 - bootstrap.start_pacemaker() - mock_long.assert_called_once_with('Starting pacemaker(delaying start of sbd for 60s)') - mock_start.assert_called_once_with('pacemaker.service', enable=False, node_list=[]) + node_list = ["node1", "node2", "node3", "node4", "node5", "node6"] + bootstrap.start_pacemaker(node_list) + mock_start.assert_has_calls([ + mock.call("corosync.service", remote_addr="node1"), + mock.call("corosync.service", remote_addr="node2"), + mock.call("corosync.service", remote_addr="node3"), + mock.call("corosync.service", remote_addr="node4"), + mock.call("corosync.service", remote_addr="node5"), + mock.call("corosync.service", remote_addr="node6"), + mock.call("pacemaker.service", enable=False, node_list=node_list) + ]) + mock_parallax_call.assert_has_calls([ + mock.call(node_list, 'mkdir -p /run/systemd/system/sbd.service.d/'), + mock.call(node_list, "echo -e '[Service]\nUnsetEnvironment=SBD_DELAY_START' > /run/systemd/system/sbd.service.d/sbd_delay_start_disabled.conf"), + mock.call(node_list, "systemctl daemon-reload"), + ]) @mock.patch('crmsh.bootstrap.configure_ssh_key') @mock.patch('crmsh.utils.start_service') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20221215.752a541a/test/unittests/test_qdevice.py new/crmsh-4.4.1+20221227.bd7d326e/test/unittests/test_qdevice.py --- old/crmsh-4.4.1+20221215.752a541a/test/unittests/test_qdevice.py 2022-12-15 15:16:07.000000000 +0100 +++ new/crmsh-4.4.1+20221227.bd7d326e/test/unittests/test_qdevice.py 2022-12-27 09:04:26.000000000 +0100 @@ -18,6 +18,17 @@ @mock.patch('crmsh.utils.calculate_quorate_status') @mock.patch('crmsh.utils.get_quorum_votes_dict') +def test_evaluate_qdevice_quorum_effect_restart(mock_get_dict, mock_quorate): + mock_get_dict.return_value = {'Expected': '1', 'Total': '1'} + mock_quorate.return_value = False + res = qdevice.evaluate_qdevice_quorum_effect(qdevice.QDEVICE_ADD, False, False) + assert res == qdevice.QdevicePolicy.QDEVICE_RESTART + mock_get_dict.assert_called_once_with() + mock_quorate.assert_called_once_with(2, 1) + + +@mock.patch('crmsh.utils.calculate_quorate_status') +@mock.patch('crmsh.utils.get_quorum_votes_dict') def test_evaluate_qdevice_quorum_effect_reload(mock_get_dict, mock_quorate): mock_get_dict.return_value = {'Expected': '2', 'Total': '2'} mock_quorate.return_value = True @@ -871,9 +882,10 @@ mock_get_value.assert_called_once_with("quorum.device.net.host") mock_warning.assert_called_once_with("Qdevice's vote is 0, which simply means Qdevice can't talk to Qnetd(qnetd-node) for various reasons.") + @mock.patch('crmsh.qdevice.evaluate_qdevice_quorum_effect') @mock.patch('crmsh.log.LoggerUtils.status_long') @mock.patch('crmsh.qdevice.QDevice.remove_qdevice_db') - def test_config_and_start_qdevice(self, mock_rm_db, mock_status_long): + def test_config_and_start_qdevice(self, mock_rm_db, mock_status_long, mock_evaluate): mock_status_long.return_value.__enter__ = mock.Mock() mock_status_long.return_value.__exit__ = mock.Mock() self.qdevice_with_ip.certificate_process_on_init = mock.Mock() @@ -894,13 +906,10 @@ @mock.patch('crmsh.sbd.SBDTimeout.get_stonith_timeout') @mock.patch('crmsh.sbd.SBDManager.update_configuration') @mock.patch('crmsh.sbd.SBDManager.get_sbd_value_from_config') - @mock.patch('crmsh.qdevice.evaluate_qdevice_quorum_effect') @mock.patch('crmsh.sbd.SBDManager.is_using_diskless_sbd') @mock.patch('crmsh.utils.check_all_nodes_reachable') - def test_adjust_sbd_watchdog_timeout_with_qdevice(self, mock_check_reachable, mock_using_diskless_sbd, mock_evaluate, - mock_get_sbd_value, mock_update_config, mock_get_timeout, mock_set_property): + def test_adjust_sbd_watchdog_timeout_with_qdevice(self, mock_check_reachable, mock_using_diskless_sbd, mock_get_sbd_value, mock_update_config, mock_get_timeout, mock_set_property): mock_using_diskless_sbd.return_value = True - mock_evaluate.return_value = qdevice.QdevicePolicy.QDEVICE_RELOAD mock_get_sbd_value.return_value = "" mock_get_timeout.return_value = 100 @@ -908,7 +917,6 @@ mock_check_reachable.assert_called_once_with() mock_using_diskless_sbd.assert_called_once_with() - mock_evaluate.assert_called_once_with(qdevice.QDEVICE_ADD, True) mock_get_sbd_value.assert_called_once_with("SBD_WATCHDOG_TIMEOUT") mock_update_config.assert_called_once_with({"SBD_WATCHDOG_TIMEOUT": str(sbd.SBDTimeout.SBD_WATCHDOG_TIMEOUT_DEFAULT_WITH_QDEVICE)}) mock_set_property.assert_called_once_with("stonith-timeout", 100)