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-30 17:58:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Fri Sep 30 17:58:15 2022 rev:262 rq:1007132 version:4.4.1+20220928.3480aa0d Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2022-09-28 17:51:56.243254489 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.2275/crmsh.changes 2022-09-30 17:58:32.589344640 +0200 @@ -1,0 +2,20 @@ +Wed Sep 28 08:53:06 UTC 2022 - xli...@suse.com + +- Update to version 4.4.1+20220928.3480aa0d: + * Dev: behave: append more functional test for sbd and watchdog + +------------------------------------------------------------------- +Wed Sep 28 08:19:45 UTC 2022 - xli...@suse.com + +- Update to version 4.4.1+20220928.ef80f673: + * Dev: unittest: Adjust unit test based on previous changes + * Fix: sbd: Ask if overwrite when given sbd device on interactive mode(bsc#1201428) + +------------------------------------------------------------------- +Wed Sep 28 06:26:30 UTC 2022 - xli...@suse.com + +- Update to version 4.4.1+20220928.ea5c5190: + * Dev: history: print necessary log messages when collecting report + * Dev: report: make sure 'crm -d report' could increase the verbosity + +------------------------------------------------------------------- Old: ---- crmsh-4.4.1+20220928.ded85d0a.tar.bz2 New: ---- crmsh-4.4.1+20220928.3480aa0d.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.0005tr/_old 2022-09-30 17:58:33.109345752 +0200 +++ /var/tmp/diff_new_pack.0005tr/_new 2022-09-30 17:58:33.117345769 +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+20220928.ded85d0a +Version: 4.4.1+20220928.3480aa0d Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.0005tr/_old 2022-09-30 17:58:33.165345872 +0200 +++ /var/tmp/diff_new_pack.0005tr/_new 2022-09-30 17:58:33.169345880 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">37d4b63487534aa9de6fbfefb8e87812bfad14be</param> + <param name="changesrevision">3081582137d44f867222d7161eebca796d2c3293</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-4.4.1+20220928.ded85d0a.tar.bz2 -> crmsh-4.4.1+20220928.3480aa0d.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/crmsh/history.py new/crmsh-4.4.1+20220928.3480aa0d/crmsh/history.py --- old/crmsh-4.4.1+20220928.ded85d0a/crmsh/history.py 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/crmsh/history.py 2022-09-28 10:37:09.000000000 +0200 @@ -473,19 +473,21 @@ nodes_option = "'-n %s'" % ' '.join(self.setnodes) utils.mkdirp(os.path.dirname(d)) logger.info("Retrieving information from cluster nodes, please wait...") - rc = utils.pipe_cmd_nosudo("%s -Z -Q -f '%s' %s %s %s %s" % - (extcmd, - self.from_dt.ctime(), - to_option, - nodes_option, - str(config.core.report_tool_options), - d)) + cmd = "{} {} -Z -Q -f '{}' {} {} {} {}".format(extcmd, + "-v" if config.core.debug else "", self.from_dt.ctime(), + to_option, nodes_option, str(config.core.report_tool_options), d) + logger.debug("Running command: {}".format(cmd)) + rc, out, err = utils.get_stdout_stderr(cmd) if rc != 0: + if err: + print(err) if os.path.isfile(tarball): self.warn("report thinks it failed, proceeding anyway") else: self.error("report failed") return None + if out: + print(out) self.last_live_update = time.time() return self.unpack_report(tarball) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/crmsh/report/constants.py new/crmsh-4.4.1+20220928.3480aa0d/crmsh/report/constants.py --- old/crmsh-4.4.1+20220928.ded85d0a/crmsh/report/constants.py 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/crmsh/report/constants.py 2022-09-28 10:37:09.000000000 +0200 @@ -60,7 +60,6 @@ # UNIQUE_MSG = "Mark:HB_REPORT:%d" % now_second USER_CLUSTER_TYPE = "Corosync/Pacemaker" USER_NODES = "" -VERBOSITY = 0 WE = socket.gethostname() WORKDIR = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/crmsh/report/core.py new/crmsh-4.4.1+20220928.3480aa0d/crmsh/report/core.py --- old/crmsh-4.4.1+20220928.ded85d0a/crmsh/report/core.py 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/crmsh/report/core.py 2022-09-28 10:37:09.000000000 +0200 @@ -52,7 +52,7 @@ env_dict["SKIP_LVL"] = constants.SKIP_LVL env_dict["EXTRA_LOGS"] = constants.EXTRA_LOGS env_dict["PCMK_LOG"] = constants.PCMK_LOG - env_dict["VERBOSITY"] = int(constants.VERBOSITY) + env_dict["VERBOSITY"] = int(config.report.verbosity) or (1 if config.core.debug else 0) res_str = "" for k, v in env_dict.items(): @@ -133,8 +133,7 @@ constants.SKIP_LVL = utillib.str_to_bool(env_dict["SKIP_LVL"]) constants.EXTRA_LOGS = env_dict["EXTRA_LOGS"] constants.PCMK_LOG = env_dict["PCMK_LOG"] - constants.VERBOSITY = int(env_dict["VERBOSITY"]) - config.report.verbosity = constants.VERBOSITY + config.report.verbosity = env_dict["VERBOSITY"] def parse_argument(argv): @@ -151,6 +150,7 @@ else: usage("short") + verbosity = 0 for args, option in opt: if args == '-h': usage() @@ -191,11 +191,12 @@ if args == "-E": constants.EXTRA_LOGS += " %s" % option if args == "-v": - constants.VERBOSITY += 1 - config.report.verbosity = constants.VERBOSITY + verbosity += 1 if args == '-d': constants.COMPRESS = False + config.report.verbosity = verbosity + if config.report.sanitize_rule: constants.DO_SANITIZE = True temp_pattern_set = set() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/crmsh/sbd.py new/crmsh-4.4.1+20220928.3480aa0d/crmsh/sbd.py --- old/crmsh-4.4.1+20220928.ded85d0a/crmsh/sbd.py 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/crmsh/sbd.py 2022-09-28 10:37:09.000000000 +0200 @@ -284,7 +284,8 @@ self._context = context self._delay_start = False self.timeout_inst = None - self.no_overwrite = False + self.no_overwrite_map = {} + self.no_update_config = False @staticmethod def _get_device_uuid(dev, node=None): @@ -320,6 +321,12 @@ raise ValueError("{} doesn't look like a block device".format(dev)) self._compare_device_uuid(dev, compare_node_list) + def _no_overwrite_check(self, dev): + """ + Check if device already initialized and if need to overwrite + """ + return SBDManager.has_sbd_device_already_initialized(dev) and not bootstrap.confirm("SBD is already configured to use {} - overwrite?".format(dev)) + def _get_sbd_device_interactive(self): """ Get sbd device on interactive mode @@ -335,8 +342,10 @@ return configured_dev_list = self._get_sbd_device_from_config() - if configured_dev_list and not bootstrap.confirm("SBD is already configured to use {} - overwrite?".format(';'.join(configured_dev_list))): - self.no_overwrite = True + for dev in configured_dev_list: + self.no_overwrite_map[dev] = self._no_overwrite_check(dev) + if self.no_overwrite_map and all(self.no_overwrite_map.values()): + self.no_update_config = True return configured_dev_list dev_list = [] @@ -348,14 +357,22 @@ if dev == "none": self.diskless_sbd = True return + dev_list = utils.re_split_string(self.PARSE_RE, dev) try: self._verify_sbd_device(dev_list) except ValueError as err_msg: logger.error(str(err_msg)) continue - for dev_item in dev_list: - logger.warning("All data on {} will be destroyed!".format(dev_item)) + + for dev in dev_list: + if dev not in self.no_overwrite_map: + self.no_overwrite_map[dev] = self._no_overwrite_check(dev) + if self.no_overwrite_map[dev]: + if dev == dev_list[-1]: + return dev_list + continue + logger.warning("All data on {} will be destroyed!".format(dev)) if bootstrap.confirm('Are you sure you wish to use this device?'): dev_looks_sane = True else: @@ -372,6 +389,10 @@ if self.sbd_devices_input: dev_list = utils.parse_append_action_argument(self.sbd_devices_input) self._verify_sbd_device(dev_list) + for dev in dev_list: + self.no_overwrite_map[dev] = self._no_overwrite_check(dev) + if all(self.no_overwrite_map.values()) and dev_list == self._get_sbd_device_from_config(): + self.no_update_config = True elif not self.diskless_sbd: dev_list = self._get_sbd_device_interactive() self._sbd_devices = dev_list @@ -386,7 +407,7 @@ msg = "" if self.diskless_sbd: msg = "Configuring diskless SBD" - elif not self.no_overwrite: + elif not all(self.no_overwrite_map.values()): msg = "Initializing SBD" if msg: logger.info(msg) @@ -398,7 +419,7 @@ opt = "-4 {} -1 {}".format(self.timeout_inst.sbd_msgwait, self.timeout_inst.sbd_watchdog_timeout) for dev in self._sbd_devices: - if self.no_overwrite and SBDManager.has_sbd_device_already_initialized(dev): + if dev in self.no_overwrite_map and self.no_overwrite_map[dev]: continue rc, _, err = bootstrap.invoke("sbd {} -d {} create".format(opt, dev)) if not rc: @@ -408,7 +429,7 @@ """ Update /etc/sysconfig/sbd """ - if self.no_overwrite: + if self.no_update_config: bootstrap.csync2_update(SYSCONFIG_SBD) return diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/test/features/bootstrap_sbd_normal.feature new/crmsh-4.4.1+20220928.3480aa0d/test/features/bootstrap_sbd_normal.feature --- old/crmsh-4.4.1+20220928.ded85d0a/test/features/bootstrap_sbd_normal.feature 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/test/features/bootstrap_sbd_normal.feature 2022-09-28 10:37:09.000000000 +0200 @@ -37,15 +37,21 @@ And Resource "stonith:external/sbd" not configured @clean - Scenario: Configure diskless sbd + Scenario: Configure diskless sbd(bsc#1181907) Given Cluster service is "stopped" on "hanode1" Given Cluster service is "stopped" on "hanode2" When Run "crm cluster init -S -y" on "hanode1" + Then Expected "Diskless SBD requires cluster with three or more nodes." in stdout Then Cluster service is "started" on "hanode1" And Service "sbd" is "started" on "hanode1" When Run "crm cluster join -c hanode1 -y" on "hanode2" + Then Expected "Diskless SBD requires cluster with three or more nodes." in stdout Then Cluster service is "started" on "hanode2" And Service "sbd" is "started" on "hanode2" + When Run "crm cluster join -c hanode1 -y" on "hanode3" + Then Expected "Diskless SBD requires cluster with three or more nodes." not in stdout + Then Cluster service is "started" on "hanode3" + And Service "sbd" is "started" on "hanode3" And Resource "stonith:external/sbd" not configured @clean @@ -136,3 +142,19 @@ Then Service "sbd" is "started" on "hanode2" When Run "sleep 20" on "hanode1" Then Resource "stonith-sbd" type "external/sbd" is "Started" + + @clean + Scenario: Configure sbd when no watchdog device(bsc#1154927, bsc#1178869) + Given Cluster service is "stopped" on "hanode1" + Given Cluster service is "stopped" on "hanode2" + When Try "lsmod |grep softdog && rmmod softdog" on "hanode1" + And Try "lsmod |grep softdog && rmmod softdog" on "hanode2" + When Run "crm cluster init -s /dev/sda1 -w softdog -y" on "hanode1" + Then Cluster service is "started" on "hanode1" + And Service "sbd" is "started" on "hanode1" + When Try "lsmod |grep softdog" + Then Expected return code is "0" + When Run "crm cluster join -c hanode1 -y" on "hanode2" + Then Cluster service is "started" on "hanode2" + And Service "sbd" is "started" on "hanode2" + And Resource "stonith-sbd" type "external/sbd" is "Started" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-4.4.1+20220928.ded85d0a/test/unittests/test_sbd.py new/crmsh-4.4.1+20220928.3480aa0d/test/unittests/test_sbd.py --- old/crmsh-4.4.1+20220928.ded85d0a/test/unittests/test_sbd.py 2022-09-28 02:31:20.000000000 +0200 +++ new/crmsh-4.4.1+20220928.3480aa0d/test/unittests/test_sbd.py 2022-09-28 10:37:09.000000000 +0200 @@ -335,13 +335,15 @@ mock_status.assert_called_once_with(sbd.SBDManager.SBD_STATUS_DESCRIPTION) mock_warn.assert_called_once_with("Not configuring SBD - STONITH will be disabled.") + @mock.patch('crmsh.sbd.SBDManager._no_overwrite_check') @mock.patch('crmsh.sbd.SBDManager._get_sbd_device_from_config') @mock.patch('crmsh.bootstrap.confirm') @mock.patch('logging.Logger.info') - def test_get_sbd_device_interactive_already_configured(self, mock_status, mock_confirm, mock_from_config): + def test_get_sbd_device_interactive_already_configured(self, mock_status, mock_confirm, mock_from_config, mock_no_overwrite): self.sbd_inst._context = mock.Mock(yes_to_all=False) - mock_confirm.side_effect = [True, False] + mock_confirm.return_value = True mock_from_config.return_value = ["/dev/sda1"] + mock_no_overwrite.return_value = True res = self.sbd_inst._get_sbd_device_interactive() self.assertEqual(res, ["/dev/sda1"]) @@ -349,19 +351,20 @@ mock_status.assert_called_once_with(sbd.SBDManager.SBD_STATUS_DESCRIPTION) mock_confirm.assert_has_calls([ mock.call("Do you wish to use SBD?"), - mock.call("SBD is already configured to use /dev/sda1 - overwrite?") ]) mock_status.assert_called_once_with(sbd.SBDManager.SBD_STATUS_DESCRIPTION) mock_from_config.assert_called_once_with() @mock.patch('crmsh.bootstrap.prompt_for_string') + @mock.patch('crmsh.sbd.SBDManager._no_overwrite_check') @mock.patch('crmsh.sbd.SBDManager._get_sbd_device_from_config') @mock.patch('crmsh.bootstrap.confirm') @mock.patch('logging.Logger.info') - def test_get_sbd_device_interactive_diskless(self, mock_status, mock_confirm, mock_from_config, mock_prompt): + def test_get_sbd_device_interactive_diskless(self, mock_status, mock_confirm, mock_from_config, mock_no_overwrite, mock_prompt): self.sbd_inst._context = mock.Mock(yes_to_all=False) mock_confirm.return_value = True - mock_from_config.return_value = None + mock_no_overwrite.return_value = False + mock_from_config.return_value = [] mock_prompt.return_value = "none" self.sbd_inst._get_sbd_device_interactive() @@ -371,13 +374,15 @@ mock_prompt.assert_called_once_with('Path to storage device (e.g. /dev/disk/by-id/...), or "none" for diskless sbd, use ";" as separator for multi path', 'none|\\/.*') @mock.patch('crmsh.bootstrap.prompt_for_string') + @mock.patch('crmsh.sbd.SBDManager._no_overwrite_check') @mock.patch('crmsh.sbd.SBDManager._get_sbd_device_from_config') @mock.patch('crmsh.bootstrap.confirm') @mock.patch('logging.Logger.info') - def test_get_sbd_device_interactive_null_and_diskless(self, mock_status, mock_confirm, mock_from_config, mock_prompt): + def test_get_sbd_device_interactive_null_and_diskless(self, mock_status, mock_confirm, mock_from_config, mock_no_overwrite, mock_prompt): self.sbd_inst._context = mock.Mock(yes_to_all=False) mock_confirm.return_value = True - mock_from_config.return_value = None + mock_no_overwrite.return_value = False + mock_from_config.return_value = [] mock_prompt.side_effect = [None, "none"] self.sbd_inst._get_sbd_device_interactive() @@ -394,13 +399,15 @@ @mock.patch('logging.Logger.error') @mock.patch('crmsh.sbd.SBDManager._verify_sbd_device') @mock.patch('crmsh.bootstrap.prompt_for_string') + @mock.patch('crmsh.sbd.SBDManager._no_overwrite_check') @mock.patch('crmsh.sbd.SBDManager._get_sbd_device_from_config') @mock.patch('crmsh.bootstrap.confirm') @mock.patch('logging.Logger.info') - def test_get_sbd_device_interactive(self, mock_status, mock_confirm, mock_from_config, mock_prompt, mock_verify, mock_error_msg, mock_warn, mock_split): + def test_get_sbd_device_interactive(self, mock_status, mock_confirm, mock_from_config, mock_no_overwrite, mock_prompt, mock_verify, mock_error_msg, mock_warn, mock_split): self.sbd_inst._context = mock.Mock(yes_to_all=False) mock_confirm.side_effect = [True, False, True] - mock_from_config.return_value = None + mock_from_config.return_value = [] + mock_no_overwrite.return_value = False mock_prompt.side_effect = ["/dev/test1", "/dev/sda1", "/dev/sdb1"] mock_split.side_effect = [["/dev/test1"], ["/dev/sda1"], ["/dev/sdb1"]] mock_verify.side_effect = [ValueError("/dev/test1 error"), None, None]