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 - xli...@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 - xli...@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 - xli...@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 - xli...@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)

Reply via email to