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-09-27 20:14:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Tue Sep 27 20:14:08 2022 rev:260 rq:1006343 version:4.4.1+20220923.9651e0fa Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2022-09-21 14:44:26.898077367 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.2275/crmsh.changes 2022-09-27 20:14:10.997860443 +0200 @@ -1,0 +2,8 @@ +Fri Sep 23 09:05:44 UTC 2022 - xli...@suse.com + +- Update to version 4.4.1+20220923.9651e0fa: + * Dev: unittest: Adjust unit test based on prevous changes + * Dev: behave: Add functional test based on previous commit + * Fix: ui_cluster: 'crm cluster stop' failed to stop services (bsc#1203601) + +------------------------------------------------------------------- Old: ---- crmsh-4.4.1+20220921.dbe833c5.tar.bz2 New: ---- crmsh-4.4.1+20220923.9651e0fa.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.uYSmPi/_old 2022-09-27 20:14:11.585861740 +0200 +++ /var/tmp/diff_new_pack.uYSmPi/_new 2022-09-27 20:14:11.593861757 +0200 @@ -36,7 +36,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 4.4.1+20220921.dbe833c5 +Version: 4.4.1+20220923.9651e0fa Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.uYSmPi/_old 2022-09-27 20:14:11.633861846 +0200 +++ /var/tmp/diff_new_pack.uYSmPi/_new 2022-09-27 20:14:11.637861855 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">dbe833c5f8703d6a9990ef199ca0b7aae7255b72</param> + <param name="changesrevision">6236df2587ced94135a27867f11e442090b8d742</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-4.4.1+20220921.dbe833c5.tar.bz2 -> crmsh-4.4.1+20220923.9651e0fa.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/crmsh/constants.py new/crmsh-4.4.1+20220923.9651e0fa/crmsh/constants.py --- old/crmsh-4.4.1+20220921.dbe833c5/crmsh/constants.py 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/crmsh/constants.py 2022-09-23 10:48:20.000000000 +0200 @@ -522,4 +522,5 @@ SCHEMA_MIN_VER_SUPPORT_OCF_1_1 = "pacemaker-3.7" REJOIN_COUNT = 60 REJOIN_INTERVAL = 10 +DC_DEADTIME_DEFAULT = 20 # vim:ts=4:sw=4:et: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/crmsh/ui_cluster.py new/crmsh-4.4.1+20220923.9651e0fa/crmsh/ui_cluster.py --- old/crmsh-4.4.1+20220921.dbe833c5/crmsh/ui_cluster.py 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/crmsh/ui_cluster.py 2022-09-23 10:48:20.000000000 +0200 @@ -186,10 +186,18 @@ else: logger.info("Cluster services already stopped on {}".format(node)) node_list.remove(node) + elif not utils.service_is_active("pacemaker.service", remote_addr=node): + utils.stop_service("corosync", remote_addr=node) + logger.info("Cluster services stopped on {}".format(node)) + node_list.remove(node) if not node_list: return - if not utils.get_dc(timeout=5): + dc_deadtime = utils.get_property("dc-deadtime") or constants.DC_DEADTIME_DEFAULT + dc_timeout = int(dc_deadtime.strip('s')) + 5 + try: + utils.check_function_with_timeout(utils.get_dc, wait_timeout=dc_timeout) + except TimeoutError: logger.error("No DC found currently, please wait if the cluster is still starting") return False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/crmsh/utils.py new/crmsh-4.4.1+20220923.9651e0fa/crmsh/utils.py --- old/crmsh-4.4.1+20220921.dbe833c5/crmsh/utils.py 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/crmsh/utils.py 2022-09-23 10:48:20.000000000 +0200 @@ -837,10 +837,8 @@ return False -def get_dc(timeout=None): - cmd = "crmadmin -D" - if timeout: - cmd += " -t {}".format(timeout) +def get_dc(): + cmd = "crmadmin -D -t 1" rc, s, _ = get_stdout_stderr(add_sudo(cmd)) if rc != 0: return None @@ -3002,7 +3000,8 @@ """ Get cluster properties """ - cmd = "crm configure get_property " + name + cib_path = os.getenv('CIB_file', constants.CIB_RAW_FILE) + cmd = "CIB_file={} crm configure get_property {}".format(cib_path, name) rc, stdout, _ = get_stdout_stderr(cmd) return stdout if rc == 0 else None @@ -3134,4 +3133,20 @@ code, _, _ = get_stdout_stderr(cmd) rc = code == 0 return rc + + +def check_function_with_timeout(check_function, wait_timeout=30, interval=1): + """ + Run check_function in a loop + Return when check_function is true + Raise TimeoutError when timeout + """ + current_time = int(time.time()) + timeout = current_time + wait_timeout + while current_time <= timeout: + if check_function(): + return + time.sleep(interval) + current_time = int(time.time()) + raise TimeoutError # vim:ts=4:sw=4:et: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/test/features/bootstrap_bugs.feature new/crmsh-4.4.1+20220923.9651e0fa/test/features/bootstrap_bugs.feature --- old/crmsh-4.4.1+20220921.dbe833c5/test/features/bootstrap_bugs.feature 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/test/features/bootstrap_bugs.feature 2022-09-23 10:48:20.000000000 +0200 @@ -112,3 +112,22 @@ When Run "crm cluster remove HANODE2 -y" on "hanode1" Then Cluster service is "stopped" on "hanode2" And Online nodes are "hanode1" + + @clean + Scenario: Stop service quickly(bsc#1203601) + Given Cluster service is "stopped" on "hanode1" + And Cluster service is "stopped" on "hanode2" + When Run "crm cluster init -y" on "hanode1" + Then Cluster service is "started" on "hanode1" + When Run "crm cluster join -c hanode1 -y" on "hanode2" + Then Cluster service is "started" on "hanode2" + When Run "crm cluster stop --all" on "hanode1" + Then Cluster service is "stopped" on "hanode1" + And Cluster service is "stopped" on "hanode2" + When Run "crm cluster start --all;crm cluster stop --all" on "hanode1" + Then Cluster service is "stopped" on "hanode1" + And Cluster service is "stopped" on "hanode2" + When Run "systemctl start corosync" on "hanode1" + Then Service "corosync" is "started" on "hanode1" + When Run "crm cluster stop" on "hanode1" + Then Service "corosync" is "stopped" on "hanode1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/test/unittests/test_ui_cluster.py new/crmsh-4.4.1+20220923.9651e0fa/test/unittests/test_ui_cluster.py --- old/crmsh-4.4.1+20220921.dbe833c5/test/unittests/test_ui_cluster.py 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/test/unittests/test_ui_cluster.py 2022-09-23 10:48:20.000000000 +0200 @@ -101,21 +101,24 @@ @mock.patch('crmsh.utils.is_quorate') @mock.patch('crmsh.utils.is_dlm_running') @mock.patch('crmsh.utils.get_dc') + @mock.patch('crmsh.utils.check_function_with_timeout') + @mock.patch('crmsh.utils.get_property') @mock.patch('crmsh.utils.service_is_active') @mock.patch('crmsh.ui_cluster.parse_option_for_nodes') - def test_do_stop(self, mock_parse_nodes, mock_active, mock_get_dc, mock_dlm_running, mock_is_quorate, mock_set_dlm, mock_stop, mock_info, mock_debug): + def test_do_stop(self, mock_parse_nodes, mock_active, mock_get_property, mock_check, mock_get_dc, mock_dlm_running, mock_is_quorate, mock_set_dlm, mock_stop, mock_info, mock_debug): context_inst = mock.Mock() mock_stop.side_effect = [["node1"], ["ndoe1"], ["node1"]] mock_parse_nodes.return_value = ["node1"] - mock_active.side_effect = [True, True] + mock_active.side_effect = [True, True, True] mock_dlm_running.return_value = True mock_is_quorate.return_value = False - mock_get_dc.return_value = "node1" + mock_get_property.return_value = "20s" self.ui_cluster_inst.do_stop(context_inst, "node1") mock_active.assert_has_calls([ mock.call("corosync.service", remote_addr="node1"), + mock.call("pacemaker.service", remote_addr="node1"), mock.call("corosync-qdevice.service") ]) mock_stop.assert_has_calls([ @@ -125,3 +128,4 @@ ]) mock_info.assert_called_once_with("Cluster services stopped on node1") mock_debug.assert_called_once_with("Quorum is lost; Set enable_quorum_fencing=0 and enable_quorum_lockspace=0 for dlm") + mock_check.assert_called_once_with(mock_get_dc, wait_timeout=25) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220921.dbe833c5/test/unittests/test_utils.py new/crmsh-4.4.1+20220923.9651e0fa/test/unittests/test_utils.py --- old/crmsh-4.4.1+20220921.dbe833c5/test/unittests/test_utils.py 2022-09-21 09:33:20.000000000 +0200 +++ new/crmsh-4.4.1+20220923.9651e0fa/test/unittests/test_utils.py 2022-09-23 10:48:20.000000000 +0200 @@ -1607,11 +1607,13 @@ ]) +@mock.patch('os.getenv') @mock.patch('crmsh.utils.get_stdout_stderr') -def test_get_property(mock_run): +def test_get_property(mock_run, mock_env): mock_run.return_value = (0, "data", None) + mock_env.return_value = "cib.xml" assert utils.get_property("no-quorum-policy") == "data" - mock_run.assert_called_once_with("crm configure get_property no-quorum-policy") + mock_run.assert_called_once_with("CIB_file=cib.xml crm configure get_property no-quorum-policy") @mock.patch('crmsh.utils.get_stdout_or_raise_error')