Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package crmsh for openSUSE:Factory checked 
in at 2021-05-20 19:25:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/crmsh (Old)
 and      /work/SRC/openSUSE:Factory/.crmsh.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "crmsh"

Thu May 20 19:25:38 2021 rev:209 rq:894610 version:4.3.0+20210518.46a0704a

Changes:
--------
--- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes      2021-05-07 
16:46:04.604225743 +0200
+++ /work/SRC/openSUSE:Factory/.crmsh.new.2988/crmsh.changes    2021-05-20 
19:26:10.361668764 +0200
@@ -1,0 +2,13 @@
+Tue May 18 05:40:50 UTC 2021 - [email protected]
+
+- Update to version 4.3.0+20210518.46a0704a:
+  * Dev: cibconfig: resolve TypeError for fencing-topology tag
+
+-------------------------------------------------------------------
+Mon May 10 06:38:01 UTC 2021 - [email protected]
+
+- Update to version 4.3.0+20210510.2775a5e2:
+  * Dev: unittest: move watchdog unit test code into test_watchdog.py
+  * Dev: watchdog: split class Watchdog into watchdog.py from bootstrap.py
+
+-------------------------------------------------------------------

Old:
----
  crmsh-4.3.0+20210507.bf02d791.tar.bz2

New:
----
  crmsh-4.3.0+20210518.46a0704a.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ crmsh.spec ++++++
--- /var/tmp/diff_new_pack.Z6AXOW/_old  2021-05-20 19:26:10.889666598 +0200
+++ /var/tmp/diff_new_pack.Z6AXOW/_new  2021-05-20 19:26:10.893666582 +0200
@@ -36,7 +36,7 @@
 Summary:        High Availability cluster command-line interface
 License:        GPL-2.0-or-later
 Group:          %{pkg_group}
-Version:        4.3.0+20210507.bf02d791
+Version:        4.3.0+20210518.46a0704a
 Release:        0
 URL:            http://crmsh.github.io
 Source0:        %{name}-%{version}.tar.bz2

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Z6AXOW/_old  2021-05-20 19:26:10.933666418 +0200
+++ /var/tmp/diff_new_pack.Z6AXOW/_new  2021-05-20 19:26:10.933666418 +0200
@@ -9,6 +9,6 @@
 </service>
 <service name="tar_scm">
   <param name="url">https://github.com/ClusterLabs/crmsh.git</param>
-  <param 
name="changesrevision">bf02d7910c0978febb1b82a18be03f8134770dd1</param>
+  <param 
name="changesrevision">46a0704a4c5c1e6833c93a7699bdf992b110065d</param>
 </service>
 </servicedata>
\ No newline at end of file

++++++ crmsh-4.3.0+20210507.bf02d791.tar.bz2 -> 
crmsh-4.3.0+20210518.46a0704a.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.3.0+20210507.bf02d791/crmsh/bootstrap.py 
new/crmsh-4.3.0+20210518.46a0704a/crmsh/bootstrap.py
--- old/crmsh-4.3.0+20210507.bf02d791/crmsh/bootstrap.py        2021-05-07 
04:34:39.000000000 +0200
+++ new/crmsh-4.3.0+20210518.46a0704a/crmsh/bootstrap.py        2021-05-18 
07:28:04.000000000 +0200
@@ -36,6 +36,7 @@
 from . import userdir
 from .constants import SSH_OPTION, QDEVICE_HELP_INFO
 
+
 LOG_FILE = "/var/log/crmsh/ha-cluster-bootstrap.log"
 CSYNC2_KEY = "/etc/csync2/key_hagroup"
 CSYNC2_CFG = "/etc/csync2/csync2.cfg"
@@ -181,178 +182,6 @@
         self.sbd_manager = SBDManager(self.sbd_devices, self.diskless_sbd)
 
 
-class Watchdog(object):
-    """
-    Class to find valid watchdog device name
-    """
-    QUERY_CMD = "sbd query-watchdog"
-    DEVICE_FIND_REGREX = "\[[0-9]+\] (/dev/.*)\n.*\nDriver: (.*)"
-
-    def __init__(self, _input=None, peer_host=None):
-        """
-        Init function
-        """
-        self._input = _input
-        self._peer_host = peer_host
-        self._watchdog_info_dict = {}
-        self._watchdog_device_name = None
-    
-    @property
-    def watchdog_device_name(self):
-        return self._watchdog_device_name
-
-    @staticmethod
-    def _verify_watchdog_device(dev, ignore_error=False):
-        """
-        Use wdctl to verify watchdog device
-        """
-        rc, _, err = utils.get_stdout_stderr("wdctl {}".format(dev))
-        if rc != 0:
-            if ignore_error:
-                return False
-            else:
-                error("Invalid watchdog device {}: {}".format(dev, err))
-        return True
-
-    @staticmethod
-    def _load_watchdog_driver(driver):
-        """
-        Load specific watchdog driver
-        """
-        invoke("echo {} > {}".format(driver, WATCHDOG_CFG))
-        invoke("systemctl restart systemd-modules-load")
-
-    @staticmethod
-    def _get_watchdog_device_from_sbd_config():
-        """
-        Try to get watchdog device name from sbd config file
-        """
-        conf = utils.parse_sysconfig(SYSCONFIG_SBD)
-        return conf.get("SBD_WATCHDOG_DEV")
-
-    @staticmethod
-    def _driver_is_loaded(driver):
-        """
-        Check if driver was already loaded
-        """
-        _, out, _ = utils.get_stdout_stderr("lsmod")
-        return re.search("\n{}\s+".format(driver), out)
-
-    def _set_watchdog_info(self):
-        """
-        Set watchdog info through sbd query-watchdog command
-        Content in self._watchdog_info_dict: {device_name: driver_name}
-        """
-        rc, out, err = utils.get_stdout_stderr(self.QUERY_CMD)
-        if rc == 0 and out:
-            # output format might like:
-            #   [1] /dev/watchdog\nIdentity: Software Watchdog\nDriver: 
softdog\n
-            self._watchdog_info_dict = 
dict(re.findall(self.DEVICE_FIND_REGREX, out))
-        else:
-            error("Failed to run {}: {}".format(self.QUERY_CMD, err))
-
-    def _get_device_through_driver(self, driver_name):
-        """
-        Get watchdog device name which has driver_name
-        """
-        for device, driver in self._watchdog_info_dict.items():
-            if driver == driver_name and self._verify_watchdog_device(device):
-                return device
-        return None
-
-    def _get_driver_through_device_remotely(self, dev_name):
-        """
-        Given watchdog device name, get driver name on remote node
-        """
-        cmd = "ssh {} root@{} {}".format(SSH_OPTION, self._peer_host, 
self.QUERY_CMD)
-        rc, out, err = utils.get_stdout_stderr(cmd)
-        if rc == 0 and out:
-            # output format might like:
-            #   [1] /dev/watchdog\nIdentity: Software Watchdog\nDriver: 
softdog\n
-            device_driver_dict = dict(re.findall(self.DEVICE_FIND_REGREX, out))
-            if device_driver_dict and dev_name in device_driver_dict:
-                return device_driver_dict[dev_name]
-            else:
-                return None
-        else:
-            error("Failed to run {} remotely: {}".format(self.QUERY_CMD, err))
-
-    def _get_first_unused_device(self):
-        """
-        Get first unused watchdog device name
-        """
-        for dev in self._watchdog_info_dict:
-            if self._verify_watchdog_device(dev, ignore_error=True):
-                return dev
-        return None
-
-    def _set_input(self):
-        """
-        If self._input was not provided by option:
-          1. Try to get it from sbd config file
-          2. Try to get the first valid device from result of sbd 
query-watchdog
-          3. Set the self._input as softdog
-        """
-        if not self._input:
-            dev = self._get_watchdog_device_from_sbd_config()
-            if dev and self._verify_watchdog_device(dev, ignore_error=True):
-                self._input = dev
-                return
-            first_unused = self._get_first_unused_device()
-            self._input = first_unused if first_unused else "softdog"
-
-    def _valid_device(self, dev):
-        """
-        Is an unused watchdog device
-        """
-        if dev in self._watchdog_info_dict and 
self._verify_watchdog_device(dev):
-            return True
-        return False
-
-    def join_watchdog(self):
-        """
-        In join proces, get watchdog device from config
-        If that device not exist, get driver name from init node, and load 
that driver
-        """
-        self._set_watchdog_info()
-
-        res = self._get_watchdog_device_from_sbd_config()
-        if not res:
-            error("Failed to get watchdog device from 
{}".format(SYSCONFIG_SBD))
-        self._input = res
-
-        if not self._valid_device(self._input):
-            driver = self._get_driver_through_device_remotely(self._input)
-            self._load_watchdog_driver(driver)
-
-    def init_watchdog(self):
-        """
-        In init process, find valid watchdog device
-        """
-        self._set_watchdog_info()
-        self._set_input()
-
-        # self._input is a device name
-        if self._valid_device(self._input):
-            self._watchdog_device_name = self._input
-            return
-
-        # self._input is invalid, exit
-        if not invokerc("modinfo {}".format(self._input)):
-            error("Should provide valid watchdog device or driver name by -w 
option")
-
-        # self._input is a driver name, load it if it was unloaded
-        if not self._driver_is_loaded(self._input):
-            self._load_watchdog_driver(self._input)
-            self._set_watchdog_info()
-
-        # self._input is a loaded driver name, find corresponding device name
-        res = self._get_device_through_driver(self._input)
-        if res:
-            self._watchdog_device_name = res
-            return
-
-
 class SBDManager(object):
     """
     Class to manage sbd configuration and services
@@ -591,6 +420,8 @@
         2. Initialize sbd device
         3. Write config file /etc/sysconfig/sbd
         """
+        from .watchdog import Watchdog
+
         if not utils.package_is_installed("sbd"):
             return
         self._watchdog_inst = Watchdog(_input=_context.watchdog)
@@ -630,6 +461,8 @@
         On joining process, check whether peer node has enabled sbd.service
         If so, check prerequisites of SBD and verify sbd device on join node
         """
+        from .watchdog import Watchdog
+
         if not utils.package_is_installed("sbd"):
             return
         if not os.path.exists(SYSCONFIG_SBD) or not 
utils.service_is_enabled("sbd.service", peer_host):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.3.0+20210507.bf02d791/crmsh/cibconfig.py 
new/crmsh-4.3.0+20210518.46a0704a/crmsh/cibconfig.py
--- old/crmsh-4.3.0+20210507.bf02d791/crmsh/cibconfig.py        2021-05-07 
04:34:39.000000000 +0200
+++ new/crmsh-4.3.0+20210518.46a0704a/crmsh/cibconfig.py        2021-05-18 
07:28:04.000000000 +0200
@@ -2973,7 +2973,7 @@
             if tag in constants.defaults_tags:
                 expr = '//%s/meta_attributes[@id="%s"]' % (tag, ident)
             elif tag == 'fencing-topology':
-                expr = '//fencing-topology' % tag
+                expr = '//fencing-topology'
             else:
                 expr = '//%s[@id="%s"]' % (tag, ident)
             return self.cib_elem.xpath(expr)[0]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.3.0+20210507.bf02d791/crmsh/watchdog.py 
new/crmsh-4.3.0+20210518.46a0704a/crmsh/watchdog.py
--- old/crmsh-4.3.0+20210507.bf02d791/crmsh/watchdog.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/crmsh-4.3.0+20210518.46a0704a/crmsh/watchdog.py 2021-05-18 
07:28:04.000000000 +0200
@@ -0,0 +1,176 @@
+import re
+from . import utils
+from .constants import SSH_OPTION
+from .bootstrap import error, invoke, invokerc, WATCHDOG_CFG, SYSCONFIG_SBD
+
+
+class Watchdog(object):
+    """
+    Class to find valid watchdog device name
+    """
+    QUERY_CMD = "sbd query-watchdog"
+    DEVICE_FIND_REGREX = "\[[0-9]+\] (/dev/.*)\n.*\nDriver: (.*)"
+
+    def __init__(self, _input=None, peer_host=None):
+        """
+        Init function
+        """
+        self._input = _input
+        self._peer_host = peer_host
+        self._watchdog_info_dict = {}
+        self._watchdog_device_name = None
+
+    @property
+    def watchdog_device_name(self):
+        return self._watchdog_device_name
+
+    @staticmethod
+    def _verify_watchdog_device(dev, ignore_error=False):
+        """
+        Use wdctl to verify watchdog device
+        """
+        rc, _, err = utils.get_stdout_stderr("wdctl {}".format(dev))
+        if rc != 0:
+            if ignore_error:
+                return False
+            else:
+                error("Invalid watchdog device {}: {}".format(dev, err))
+        return True
+
+    @staticmethod
+    def _load_watchdog_driver(driver):
+        """
+        Load specific watchdog driver
+        """
+        invoke("echo {} > {}".format(driver, WATCHDOG_CFG))
+        invoke("systemctl restart systemd-modules-load")
+
+    @staticmethod
+    def _get_watchdog_device_from_sbd_config():
+        """
+        Try to get watchdog device name from sbd config file
+        """
+        conf = utils.parse_sysconfig(SYSCONFIG_SBD)
+        return conf.get("SBD_WATCHDOG_DEV")
+
+    @staticmethod
+    def _driver_is_loaded(driver):
+        """
+        Check if driver was already loaded
+        """
+        _, out, _ = utils.get_stdout_stderr("lsmod")
+        return re.search("\n{}\s+".format(driver), out)
+
+    def _set_watchdog_info(self):
+        """
+        Set watchdog info through sbd query-watchdog command
+        Content in self._watchdog_info_dict: {device_name: driver_name}
+        """
+        rc, out, err = utils.get_stdout_stderr(self.QUERY_CMD)
+        if rc == 0 and out:
+            # output format might like:
+            #   [1] /dev/watchdog\nIdentity: Software Watchdog\nDriver: 
softdog\n
+            self._watchdog_info_dict = 
dict(re.findall(self.DEVICE_FIND_REGREX, out))
+        else:
+            error("Failed to run {}: {}".format(self.QUERY_CMD, err))
+
+    def _get_device_through_driver(self, driver_name):
+        """
+        Get watchdog device name which has driver_name
+        """
+        for device, driver in self._watchdog_info_dict.items():
+            if driver == driver_name and self._verify_watchdog_device(device):
+                return device
+        return None
+
+    def _get_driver_through_device_remotely(self, dev_name):
+        """
+        Given watchdog device name, get driver name on remote node
+        """
+        cmd = "ssh {} root@{} {}".format(SSH_OPTION, self._peer_host, 
self.QUERY_CMD)
+        rc, out, err = utils.get_stdout_stderr(cmd)
+        if rc == 0 and out:
+            # output format might like:
+            #   [1] /dev/watchdog\nIdentity: Software Watchdog\nDriver: 
softdog\n
+            device_driver_dict = dict(re.findall(self.DEVICE_FIND_REGREX, out))
+            if device_driver_dict and dev_name in device_driver_dict:
+                return device_driver_dict[dev_name]
+            else:
+                return None
+        else:
+            error("Failed to run {} remotely: {}".format(self.QUERY_CMD, err))
+
+    def _get_first_unused_device(self):
+        """
+        Get first unused watchdog device name
+        """
+        for dev in self._watchdog_info_dict:
+            if self._verify_watchdog_device(dev, ignore_error=True):
+                return dev
+        return None
+
+    def _set_input(self):
+        """
+        If self._input was not provided by option:
+          1. Try to get it from sbd config file
+          2. Try to get the first valid device from result of sbd 
query-watchdog
+          3. Set the self._input as softdog
+        """
+        if not self._input:
+            dev = self._get_watchdog_device_from_sbd_config()
+            if dev and self._verify_watchdog_device(dev, ignore_error=True):
+                self._input = dev
+                return
+            first_unused = self._get_first_unused_device()
+            self._input = first_unused if first_unused else "softdog"
+
+    def _valid_device(self, dev):
+        """
+        Is an unused watchdog device
+        """
+        if dev in self._watchdog_info_dict and 
self._verify_watchdog_device(dev):
+            return True
+        return False
+
+    def join_watchdog(self):
+        """
+        In join proces, get watchdog device from config
+        If that device not exist, get driver name from init node, and load 
that driver
+        """
+        self._set_watchdog_info()
+
+        res = self._get_watchdog_device_from_sbd_config()
+        if not res:
+            error("Failed to get watchdog device from 
{}".format(SYSCONFIG_SBD))
+        self._input = res
+
+        if not self._valid_device(self._input):
+            driver = self._get_driver_through_device_remotely(self._input)
+            self._load_watchdog_driver(driver)
+
+    def init_watchdog(self):
+        """
+        In init process, find valid watchdog device
+        """
+        self._set_watchdog_info()
+        self._set_input()
+
+        # self._input is a device name
+        if self._valid_device(self._input):
+            self._watchdog_device_name = self._input
+            return
+
+        # self._input is invalid, exit
+        if not invokerc("modinfo {}".format(self._input)):
+            error("Should provide valid watchdog device or driver name by -w 
option")
+
+        # self._input is a driver name, load it if it was unloaded
+        if not self._driver_is_loaded(self._input):
+            self._load_watchdog_driver(self._input)
+            self._set_watchdog_info()
+
+        # self._input is a loaded driver name, find corresponding device name
+        res = self._get_device_through_driver(self._input)
+        if res:
+            self._watchdog_device_name = res
+            return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crmsh-4.3.0+20210507.bf02d791/data-manifest 
new/crmsh-4.3.0+20210518.46a0704a/data-manifest
--- old/crmsh-4.3.0+20210507.bf02d791/data-manifest     2021-05-07 
04:34:39.000000000 +0200
+++ new/crmsh-4.3.0+20210518.46a0704a/data-manifest     2021-05-18 
07:28:04.000000000 +0200
@@ -197,6 +197,7 @@
 test/unittests/test_time.py
 test/unittests/test_ui_cluster.py
 test/unittests/test_utils.py
+test/unittests/test_watchdog.py
 test/update-expected-output.sh
 utils/crm_clean.py
 utils/crm_init.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.3.0+20210507.bf02d791/test/unittests/test_bootstrap.py 
new/crmsh-4.3.0+20210518.46a0704a/test/unittests/test_bootstrap.py
--- old/crmsh-4.3.0+20210507.bf02d791/test/unittests/test_bootstrap.py  
2021-05-07 04:34:39.000000000 +0200
+++ new/crmsh-4.3.0+20210518.46a0704a/test/unittests/test_bootstrap.py  
2021-05-18 07:28:04.000000000 +0200
@@ -146,303 +146,6 @@
         mock_sbd.assert_called_once_with(["/dev/sda1"], False)
 
 
-class TestWatchdog(unittest.TestCase):
-    """
-    Unitary tests for crmsh.bootstrap.Watchdog
-    """
-
-    @classmethod
-    def setUpClass(cls):
-        """
-        Global setUp.
-        """
-
-    def setUp(self):
-        """
-        Test setUp.
-        """
-        self.watchdog_inst = bootstrap.Watchdog()
-        self.watchdog_join_inst = bootstrap.Watchdog(peer_host="node1")
-
-    def tearDown(self):
-        """
-        Test tearDown.
-        """
-
-    @classmethod
-    def tearDownClass(cls):
-        """
-        Global tearDown.
-        """
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_verify_watchdog_device_ignore_error(self, mock_run):
-        mock_run.return_value = (1, None, "error")
-        res = self.watchdog_inst._verify_watchdog_device("/dev/watchdog", True)
-        self.assertEqual(res, False)
-        mock_run.assert_called_once_with("wdctl /dev/watchdog")
-
-    @mock.patch('crmsh.bootstrap.error')
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_verify_watchdog_device_error(self, mock_run, mock_error):
-        mock_run.return_value = (1, None, "error")
-        mock_error.side_effect = ValueError
-        with self.assertRaises(ValueError) as err:
-            self.watchdog_inst._verify_watchdog_device("/dev/watchdog")
-        mock_error.assert_called_once_with("Invalid watchdog device 
/dev/watchdog: error")
-        mock_run.assert_called_once_with("wdctl /dev/watchdog")
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_verify_watchdog_device(self, mock_run):
-        mock_run.return_value = (0, None, None)
-        res = self.watchdog_inst._verify_watchdog_device("/dev/watchdog")
-        self.assertEqual(res, True)
-
-    @mock.patch('crmsh.bootstrap.invoke')
-    def test_load_watchdog_driver(self, mock_invoke):
-        self.watchdog_inst._load_watchdog_driver("softdog")
-        mock_invoke.assert_has_calls([
-            mock.call("echo softdog > /etc/modules-load.d/watchdog.conf"),
-            mock.call("systemctl restart systemd-modules-load")
-            ])
-
-    @mock.patch('crmsh.utils.parse_sysconfig')
-    def test_get_watchdog_device_from_sbd_config(self, mock_parse):
-        mock_parse_inst = mock.Mock()
-        mock_parse.return_value = mock_parse_inst
-        mock_parse_inst.get.return_value = "/dev/watchdog"
-        res = self.watchdog_inst._get_watchdog_device_from_sbd_config()
-        self.assertEqual(res, "/dev/watchdog")
-        mock_parse.assert_called_once_with(bootstrap.SYSCONFIG_SBD)
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_driver_is_loaded(self, mock_run):
-        output = """
-button                 24576  0
-softdog                16384  2
-btrfs                1474560  1
-        """
-        mock_run.return_value = (0, output, None)
-        res = self.watchdog_inst._driver_is_loaded("softdog")
-        assert res is not None
-        mock_run.assert_called_once_with("lsmod")
-
-    @mock.patch('crmsh.bootstrap.error')
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_set_watchdog_info_error(self, mock_run, mock_error):
-        mock_run.return_value = (1, None, "error")
-        mock_error.side_effect = ValueError
-        with self.assertRaises(ValueError):
-            self.watchdog_inst._set_watchdog_info()
-        mock_run.assert_called_once_with(bootstrap.Watchdog.QUERY_CMD)
-        mock_error.assert_called_once_with("Failed to run {}: 
error".format(bootstrap.Watchdog.QUERY_CMD))
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_set_watchdog_info(self, mock_run):
-        output = """
-Discovered 3 watchdog devices:
-
-[1] /dev/watchdog
-Identity: Software Watchdog
-Driver: softdog
-CAUTION: Not recommended for use with sbd.
-
-[2] /dev/watchdog0
-Identity: Software Watchdog
-Driver: softdog
-CAUTION: Not recommended for use with sbd.
-
-[3] /dev/watchdog1
-Identity: iTCO_wdt
-Driver: iTCO_wdt
-        """
-        mock_run.return_value = (0, output, None)
-        self.watchdog_inst._set_watchdog_info()
-        self.assertEqual(self.watchdog_inst._watchdog_info_dict, 
{'/dev/watchdog': 'softdog', '/dev/watchdog0': 'softdog', '/dev/watchdog1': 
'iTCO_wdt'})
-
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    def test_get_device_through_driver_none(self, mock_verify):
-        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
-        mock_verify.return_value = False
-        res = self.watchdog_inst._get_device_through_driver("iTCO_wdt")
-        self.assertEqual(res, None)
-        mock_verify.assert_called_once_with("/dev/watchdog1")
-
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    def test_get_device_through_driver(self, mock_verify):
-        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
-        mock_verify.return_value = True
-        res = self.watchdog_inst._get_device_through_driver("iTCO_wdt")
-        self.assertEqual(res, "/dev/watchdog1")
-        mock_verify.assert_called_once_with("/dev/watchdog1")
-
-    @mock.patch('crmsh.bootstrap.error')
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_get_driver_through_device_remotely_error(self, mock_run, 
mock_error):
-        mock_run.return_value = (1, None, "error")
-        self.watchdog_join_inst._get_driver_through_device_remotely("test")
-        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
-        mock_error.assert_called_once_with("Failed to run sbd query-watchdog 
remotely: error")
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_get_driver_through_device_remotely_none(self, mock_run):
-        mock_run.return_value = (0, "data", None)
-        res = 
self.watchdog_join_inst._get_driver_through_device_remotely("/dev/watchdog")
-        self.assertEqual(res, None)
-        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
-
-    @mock.patch('crmsh.utils.get_stdout_stderr')
-    def test_get_driver_through_device_remotely(self, mock_run):
-        output = """
-Discovered 3 watchdog devices:
-
-[1] /dev/watchdog
-Identity: Software Watchdog
-Driver: softdog
-CAUTION: Not recommended for use with sbd.
-
-[2] /dev/watchdog0
-Identity: Software Watchdog
-Driver: softdog
-CAUTION: Not recommended for use with sbd.
-
-[3] /dev/watchdog1
-Identity: iTCO_wdt
-Driver: iTCO_wdt
-        """
-        mock_run.return_value = (0, output, None)
-        res = 
self.watchdog_join_inst._get_driver_through_device_remotely("/dev/watchdog")
-        self.assertEqual(res, "softdog")
-        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
-
-    def test_get_first_unused_device_none(self):
-        res = self.watchdog_inst._get_first_unused_device()
-        self.assertEqual(res, None)
-
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    def test_get_first_unused_device(self, mock_verify):
-        mock_verify.return_value = True
-        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
-        res = self.watchdog_inst._get_first_unused_device()
-        self.assertEqual(res, "/dev/watchdog")
-        mock_verify.assert_called_once_with("/dev/watchdog", ignore_error=True)
-
-    @mock.patch('crmsh.bootstrap.Watchdog._get_first_unused_device')
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    
@mock.patch('crmsh.bootstrap.Watchdog._get_watchdog_device_from_sbd_config')
-    def test_set_input_from_config(self, mock_from_config, mock_verify, 
mock_first):
-        mock_from_config.return_value = "/dev/watchdog"
-        mock_verify.return_value = True
-        self.watchdog_inst._set_input()
-        mock_first.assert_not_called()
-        mock_from_config.assert_called_once_with()
-
-    @mock.patch('crmsh.bootstrap.Watchdog._get_first_unused_device')
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    
@mock.patch('crmsh.bootstrap.Watchdog._get_watchdog_device_from_sbd_config')
-    def test_set_input(self, mock_from_config, mock_verify, mock_first):
-        mock_from_config.return_value = None
-        mock_first.return_value = None
-        self.watchdog_inst._set_input()
-        self.assertEqual(self.watchdog_inst._input, "softdog")
-        mock_from_config.assert_called_once_with()
-        mock_verify.assert_not_called()
-        mock_first.assert_called_once_with()
-
-    def test_valid_device_false(self):
-        res = self.watchdog_inst._valid_device("test")
-        self.assertEqual(res, False)
-
-    @mock.patch('crmsh.bootstrap.Watchdog._verify_watchdog_device')
-    def test_valid_device(self, mock_verify):
-        mock_verify.return_value = True
-        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
-        res = self.watchdog_inst._valid_device("/dev/watchdog")
-        self.assertEqual(res, True)
-
-    @mock.patch('crmsh.bootstrap.error')
-    
@mock.patch('crmsh.bootstrap.Watchdog._get_watchdog_device_from_sbd_config')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_watchdog_info')
-    def test_join_watchdog_error(self, mock_set_info, mock_from_config, 
mock_error):
-        mock_from_config.return_value = None
-        mock_error.side_effect = SystemExit
-        with self.assertRaises(SystemExit):
-            self.watchdog_join_inst.join_watchdog()
-        mock_set_info.assert_called_once_with()
-        mock_from_config.assert_called_once_with()
-        mock_error.assert_called_once_with("Failed to get watchdog device from 
{}".format(bootstrap.SYSCONFIG_SBD))
-
-    @mock.patch('crmsh.bootstrap.Watchdog._load_watchdog_driver')
-    @mock.patch('crmsh.bootstrap.Watchdog._get_driver_through_device_remotely')
-    @mock.patch('crmsh.bootstrap.Watchdog._valid_device')
-    
@mock.patch('crmsh.bootstrap.Watchdog._get_watchdog_device_from_sbd_config')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_watchdog_info')
-    def test_join_watchdog(self, mock_set_info, mock_from_config, mock_valid, 
mock_get_driver_remotely, mock_load):
-        mock_from_config.return_value = "/dev/watchdog"
-        mock_valid.return_value = False
-        mock_get_driver_remotely.return_value = "softdog"
-
-        self.watchdog_join_inst.join_watchdog()
-
-        mock_set_info.assert_called_once_with()
-        mock_from_config.assert_called_once_with()
-        mock_valid.assert_called_once_with("/dev/watchdog")
-        mock_get_driver_remotely.assert_called_once_with("/dev/watchdog")
-        mock_load.assert_called_once_with("softdog")
-
-    @mock.patch('crmsh.bootstrap.invokerc')
-    @mock.patch('crmsh.bootstrap.Watchdog._valid_device')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_input')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_watchdog_info')
-    def test_init_watchdog_valid(self, mock_set_info, mock_set_input, 
mock_valid, mock_invokerc):
-        mock_valid.return_value = True
-        self.watchdog_inst._input = "/dev/watchdog"
-        self.watchdog_inst.init_watchdog()
-        mock_invokerc.assert_not_called()
-        mock_valid.assert_called_once_with("/dev/watchdog")
-
-    @mock.patch('crmsh.bootstrap.error')
-    @mock.patch('crmsh.bootstrap.invokerc')
-    @mock.patch('crmsh.bootstrap.Watchdog._valid_device')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_input')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_watchdog_info')
-    def test_init_watchdog_error(self, mock_set_info, mock_set_input, 
mock_valid, mock_invokerc, mock_error):
-        mock_valid.return_value = False
-        mock_invokerc.return_value = False
-        self.watchdog_inst._input = "test"
-        mock_error.side_effect = SystemExit
-
-        with self.assertRaises(SystemExit):
-            self.watchdog_inst.init_watchdog()
-
-        mock_valid.assert_called_once_with("test")
-        mock_invokerc.assert_called_once_with("modinfo test")
-        mock_error.assert_called_once_with("Should provide valid watchdog 
device or driver name by -w option")
-
-    @mock.patch('crmsh.bootstrap.Watchdog._get_device_through_driver')
-    @mock.patch('crmsh.bootstrap.Watchdog._load_watchdog_driver')
-    @mock.patch('crmsh.bootstrap.Watchdog._driver_is_loaded')
-    @mock.patch('crmsh.bootstrap.invokerc')
-    @mock.patch('crmsh.bootstrap.Watchdog._valid_device')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_input')
-    @mock.patch('crmsh.bootstrap.Watchdog._set_watchdog_info')
-    def test_init_watchdog(self, mock_set_info, mock_set_input, mock_valid, 
mock_invokerc, mock_is_loaded, mock_load, mock_get_device):
-        mock_valid.return_value = False
-        self.watchdog_inst._input = "softdog"
-        mock_invokerc.return_value = True
-        mock_is_loaded.return_value = False
-        mock_get_device.return_value = "/dev/watchdog"
-
-        self.watchdog_inst.init_watchdog()
-
-        mock_valid.assert_called_once_with("softdog")
-        mock_invokerc.assert_called_once_with("modinfo softdog")
-        mock_is_loaded.assert_called_once_with("softdog")
-        mock_load.assert_called_once_with("softdog")
-        mock_set_info.assert_has_calls([mock.call(), mock.call()])
-        mock_get_device.assert_called_once_with("softdog")
-
-
 class TestSBDManager(unittest.TestCase):
     """
     Unitary tests for crmsh.bootstrap.SBDManager
@@ -714,7 +417,7 @@
     @mock.patch('crmsh.bootstrap.SBDManager._initialize_sbd')
     @mock.patch('crmsh.bootstrap.status_long')
     @mock.patch('crmsh.bootstrap.SBDManager._get_sbd_device')
-    @mock.patch('crmsh.bootstrap.Watchdog')
+    @mock.patch('crmsh.watchdog.Watchdog')
     @mock.patch('crmsh.utils.package_is_installed')
     def test_sbd_init_return(self, mock_package, mock_watchdog, 
mock_get_device, mock_status, mock_initialize, mock_update, mock_invoke):
         mock_package.return_value = True
@@ -742,7 +445,7 @@
     @mock.patch('crmsh.bootstrap.SBDManager._initialize_sbd')
     @mock.patch('crmsh.bootstrap.status_long')
     @mock.patch('crmsh.bootstrap.SBDManager._get_sbd_device')
-    @mock.patch('crmsh.bootstrap.Watchdog')
+    @mock.patch('crmsh.watchdog.Watchdog')
     @mock.patch('crmsh.utils.package_is_installed')
     def test_sbd_init(self, mock_package, mock_watchdog, mock_get_device, 
mock_status, mock_initialize, mock_update, mock_warn, mock_enable_sbd, 
mock_determine):
         bootstrap._context = mock.Mock(watchdog=None)
@@ -947,7 +650,7 @@
     @mock.patch('crmsh.bootstrap.status')
     @mock.patch('crmsh.bootstrap.SBDManager._verify_sbd_device')
     @mock.patch('crmsh.bootstrap.SBDManager._get_sbd_device_from_config')
-    @mock.patch('crmsh.bootstrap.Watchdog')
+    @mock.patch('crmsh.watchdog.Watchdog')
     @mock.patch('crmsh.bootstrap.invoke')
     @mock.patch('crmsh.utils.service_is_enabled')
     @mock.patch('os.path.exists')
@@ -976,7 +679,7 @@
     @mock.patch('crmsh.bootstrap.status')
     @mock.patch('crmsh.bootstrap.SBDManager._warn_diskless_sbd')
     @mock.patch('crmsh.bootstrap.SBDManager._get_sbd_device_from_config')
-    @mock.patch('crmsh.bootstrap.Watchdog')
+    @mock.patch('crmsh.watchdog.Watchdog')
     @mock.patch('crmsh.bootstrap.invoke')
     @mock.patch('crmsh.utils.service_is_enabled')
     @mock.patch('os.path.exists')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crmsh-4.3.0+20210507.bf02d791/test/unittests/test_watchdog.py 
new/crmsh-4.3.0+20210518.46a0704a/test/unittests/test_watchdog.py
--- old/crmsh-4.3.0+20210507.bf02d791/test/unittests/test_watchdog.py   
1970-01-01 01:00:00.000000000 +0100
+++ new/crmsh-4.3.0+20210518.46a0704a/test/unittests/test_watchdog.py   
2021-05-18 07:28:04.000000000 +0200
@@ -0,0 +1,311 @@
+import unittest
+
+try:
+    from unittest import mock
+except ImportError:
+    import mock
+
+from crmsh import watchdog
+from crmsh import bootstrap
+from crmsh import constants
+
+
+class TestWatchdog(unittest.TestCase):
+    """
+    Unitary tests for crmsh.watchdog.Watchdog
+    """
+
+    @classmethod
+    def setUpClass(cls):
+        """
+        Global setUp.
+        """
+
+    def setUp(self):
+        """
+        Test setUp.
+        """
+        self.watchdog_inst = watchdog.Watchdog()
+        self.watchdog_join_inst = watchdog.Watchdog(peer_host="node1")
+
+    def tearDown(self):
+        """
+        Test tearDown.
+        """
+
+    @classmethod
+    def tearDownClass(cls):
+        """
+        Global tearDown.
+        """
+
+    def test_watchdog_device_name(self):
+        res = self.watchdog_inst.watchdog_device_name
+        assert res is None
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_verify_watchdog_device_ignore_error(self, mock_run):
+        mock_run.return_value = (1, None, "error")
+        res = self.watchdog_inst._verify_watchdog_device("/dev/watchdog", True)
+        self.assertEqual(res, False)
+        mock_run.assert_called_once_with("wdctl /dev/watchdog")
+
+    @mock.patch('crmsh.watchdog.error')
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_verify_watchdog_device_error(self, mock_run, mock_error):
+        mock_run.return_value = (1, None, "error")
+        mock_error.side_effect = ValueError
+        with self.assertRaises(ValueError) as err:
+            self.watchdog_inst._verify_watchdog_device("/dev/watchdog")
+        mock_error.assert_called_once_with("Invalid watchdog device 
/dev/watchdog: error")
+        mock_run.assert_called_once_with("wdctl /dev/watchdog")
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_verify_watchdog_device(self, mock_run):
+        mock_run.return_value = (0, None, None)
+        res = self.watchdog_inst._verify_watchdog_device("/dev/watchdog")
+        self.assertEqual(res, True)
+
+    @mock.patch('crmsh.watchdog.invoke')
+    def test_load_watchdog_driver(self, mock_invoke):
+        self.watchdog_inst._load_watchdog_driver("softdog")
+        mock_invoke.assert_has_calls([
+            mock.call("echo softdog > /etc/modules-load.d/watchdog.conf"),
+            mock.call("systemctl restart systemd-modules-load")
+            ])
+
+    @mock.patch('crmsh.utils.parse_sysconfig')
+    def test_get_watchdog_device_from_sbd_config(self, mock_parse):
+        mock_parse_inst = mock.Mock()
+        mock_parse.return_value = mock_parse_inst
+        mock_parse_inst.get.return_value = "/dev/watchdog"
+        res = self.watchdog_inst._get_watchdog_device_from_sbd_config()
+        self.assertEqual(res, "/dev/watchdog")
+        mock_parse.assert_called_once_with(bootstrap.SYSCONFIG_SBD)
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_driver_is_loaded(self, mock_run):
+        output = """
+button                 24576  0
+softdog                16384  2
+btrfs                1474560  1
+        """
+        mock_run.return_value = (0, output, None)
+        res = self.watchdog_inst._driver_is_loaded("softdog")
+        assert res is not None
+        mock_run.assert_called_once_with("lsmod")
+
+    @mock.patch('crmsh.watchdog.error')
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_set_watchdog_info_error(self, mock_run, mock_error):
+        mock_run.return_value = (1, None, "error")
+        mock_error.side_effect = ValueError
+        with self.assertRaises(ValueError):
+            self.watchdog_inst._set_watchdog_info()
+        mock_run.assert_called_once_with(watchdog.Watchdog.QUERY_CMD)
+        mock_error.assert_called_once_with("Failed to run {}: 
error".format(watchdog.Watchdog.QUERY_CMD))
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_set_watchdog_info(self, mock_run):
+        output = """
+Discovered 3 watchdog devices:
+
+[1] /dev/watchdog
+Identity: Software Watchdog
+Driver: softdog
+CAUTION: Not recommended for use with sbd.
+
+[2] /dev/watchdog0
+Identity: Software Watchdog
+Driver: softdog
+CAUTION: Not recommended for use with sbd.
+
+[3] /dev/watchdog1
+Identity: iTCO_wdt
+Driver: iTCO_wdt
+        """
+        mock_run.return_value = (0, output, None)
+        self.watchdog_inst._set_watchdog_info()
+        self.assertEqual(self.watchdog_inst._watchdog_info_dict, 
{'/dev/watchdog': 'softdog', '/dev/watchdog0': 'softdog', '/dev/watchdog1': 
'iTCO_wdt'})
+
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    def test_get_device_through_driver_none(self, mock_verify):
+        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
+        mock_verify.return_value = False
+        res = self.watchdog_inst._get_device_through_driver("iTCO_wdt")
+        self.assertEqual(res, None)
+        mock_verify.assert_called_once_with("/dev/watchdog1")
+
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    def test_get_device_through_driver(self, mock_verify):
+        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
+        mock_verify.return_value = True
+        res = self.watchdog_inst._get_device_through_driver("iTCO_wdt")
+        self.assertEqual(res, "/dev/watchdog1")
+        mock_verify.assert_called_once_with("/dev/watchdog1")
+
+    @mock.patch('crmsh.watchdog.error')
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_get_driver_through_device_remotely_error(self, mock_run, 
mock_error):
+        mock_run.return_value = (1, None, "error")
+        self.watchdog_join_inst._get_driver_through_device_remotely("test")
+        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
+        mock_error.assert_called_once_with("Failed to run sbd query-watchdog 
remotely: error")
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_get_driver_through_device_remotely_none(self, mock_run):
+        mock_run.return_value = (0, "data", None)
+        res = 
self.watchdog_join_inst._get_driver_through_device_remotely("/dev/watchdog")
+        self.assertEqual(res, None)
+        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
+
+    @mock.patch('crmsh.utils.get_stdout_stderr')
+    def test_get_driver_through_device_remotely(self, mock_run):
+        output = """
+Discovered 3 watchdog devices:
+
+[1] /dev/watchdog
+Identity: Software Watchdog
+Driver: softdog
+CAUTION: Not recommended for use with sbd.
+
+[2] /dev/watchdog0
+Identity: Software Watchdog
+Driver: softdog
+CAUTION: Not recommended for use with sbd.
+
+[3] /dev/watchdog1
+Identity: iTCO_wdt
+Driver: iTCO_wdt
+        """
+        mock_run.return_value = (0, output, None)
+        res = 
self.watchdog_join_inst._get_driver_through_device_remotely("/dev/watchdog")
+        self.assertEqual(res, "softdog")
+        mock_run.assert_called_once_with("ssh {} root@node1 sbd 
query-watchdog".format(constants.SSH_OPTION))
+
+    def test_get_first_unused_device_none(self):
+        res = self.watchdog_inst._get_first_unused_device()
+        self.assertEqual(res, None)
+
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    def test_get_first_unused_device(self, mock_verify):
+        mock_verify.return_value = True
+        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
+        res = self.watchdog_inst._get_first_unused_device()
+        self.assertEqual(res, "/dev/watchdog")
+        mock_verify.assert_called_once_with("/dev/watchdog", ignore_error=True)
+
+    @mock.patch('crmsh.watchdog.Watchdog._get_first_unused_device')
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    @mock.patch('crmsh.watchdog.Watchdog._get_watchdog_device_from_sbd_config')
+    def test_set_input_from_config(self, mock_from_config, mock_verify, 
mock_first):
+        mock_from_config.return_value = "/dev/watchdog"
+        mock_verify.return_value = True
+        self.watchdog_inst._set_input()
+        mock_first.assert_not_called()
+        mock_from_config.assert_called_once_with()
+
+    @mock.patch('crmsh.watchdog.Watchdog._get_first_unused_device')
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    @mock.patch('crmsh.watchdog.Watchdog._get_watchdog_device_from_sbd_config')
+    def test_set_input(self, mock_from_config, mock_verify, mock_first):
+        mock_from_config.return_value = None
+        mock_first.return_value = None
+        self.watchdog_inst._set_input()
+        self.assertEqual(self.watchdog_inst._input, "softdog")
+        mock_from_config.assert_called_once_with()
+        mock_verify.assert_not_called()
+        mock_first.assert_called_once_with()
+
+    def test_valid_device_false(self):
+        res = self.watchdog_inst._valid_device("test")
+        self.assertEqual(res, False)
+
+    @mock.patch('crmsh.watchdog.Watchdog._verify_watchdog_device')
+    def test_valid_device(self, mock_verify):
+        mock_verify.return_value = True
+        self.watchdog_inst._watchdog_info_dict = {'/dev/watchdog': 'softdog', 
'/dev/watchdog0': 'softdog', '/dev/watchdog1': 'iTCO_wdt'}
+        res = self.watchdog_inst._valid_device("/dev/watchdog")
+        self.assertEqual(res, True)
+
+    @mock.patch('crmsh.watchdog.error')
+    @mock.patch('crmsh.watchdog.Watchdog._get_watchdog_device_from_sbd_config')
+    @mock.patch('crmsh.watchdog.Watchdog._set_watchdog_info')
+    def test_join_watchdog_error(self, mock_set_info, mock_from_config, 
mock_error):
+        mock_from_config.return_value = None
+        mock_error.side_effect = SystemExit
+        with self.assertRaises(SystemExit):
+            self.watchdog_join_inst.join_watchdog()
+        mock_set_info.assert_called_once_with()
+        mock_from_config.assert_called_once_with()
+        mock_error.assert_called_once_with("Failed to get watchdog device from 
{}".format(bootstrap.SYSCONFIG_SBD))
+
+    @mock.patch('crmsh.watchdog.Watchdog._load_watchdog_driver')
+    @mock.patch('crmsh.watchdog.Watchdog._get_driver_through_device_remotely')
+    @mock.patch('crmsh.watchdog.Watchdog._valid_device')
+    @mock.patch('crmsh.watchdog.Watchdog._get_watchdog_device_from_sbd_config')
+    @mock.patch('crmsh.watchdog.Watchdog._set_watchdog_info')
+    def test_join_watchdog(self, mock_set_info, mock_from_config, mock_valid, 
mock_get_driver_remotely, mock_load):
+        mock_from_config.return_value = "/dev/watchdog"
+        mock_valid.return_value = False
+        mock_get_driver_remotely.return_value = "softdog"
+
+        self.watchdog_join_inst.join_watchdog()
+
+        mock_set_info.assert_called_once_with()
+        mock_from_config.assert_called_once_with()
+        mock_valid.assert_called_once_with("/dev/watchdog")
+        mock_get_driver_remotely.assert_called_once_with("/dev/watchdog")
+        mock_load.assert_called_once_with("softdog")
+
+    @mock.patch('crmsh.watchdog.invokerc')
+    @mock.patch('crmsh.watchdog.Watchdog._valid_device')
+    @mock.patch('crmsh.watchdog.Watchdog._set_input')
+    @mock.patch('crmsh.watchdog.Watchdog._set_watchdog_info')
+    def test_init_watchdog_valid(self, mock_set_info, mock_set_input, 
mock_valid, mock_invokerc):
+        mock_valid.return_value = True
+        self.watchdog_inst._input = "/dev/watchdog"
+        self.watchdog_inst.init_watchdog()
+        mock_invokerc.assert_not_called()
+        mock_valid.assert_called_once_with("/dev/watchdog")
+
+    @mock.patch('crmsh.watchdog.error')
+    @mock.patch('crmsh.watchdog.invokerc')
+    @mock.patch('crmsh.watchdog.Watchdog._valid_device')
+    @mock.patch('crmsh.watchdog.Watchdog._set_input')
+    @mock.patch('crmsh.watchdog.Watchdog._set_watchdog_info')
+    def test_init_watchdog_error(self, mock_set_info, mock_set_input, 
mock_valid, mock_invokerc, mock_error):
+        mock_valid.return_value = False
+        mock_invokerc.return_value = False
+        self.watchdog_inst._input = "test"
+        mock_error.side_effect = SystemExit
+
+        with self.assertRaises(SystemExit):
+            self.watchdog_inst.init_watchdog()
+
+        mock_valid.assert_called_once_with("test")
+        mock_invokerc.assert_called_once_with("modinfo test")
+        mock_error.assert_called_once_with("Should provide valid watchdog 
device or driver name by -w option")
+
+    @mock.patch('crmsh.watchdog.Watchdog._get_device_through_driver')
+    @mock.patch('crmsh.watchdog.Watchdog._load_watchdog_driver')
+    @mock.patch('crmsh.watchdog.Watchdog._driver_is_loaded')
+    @mock.patch('crmsh.watchdog.invokerc')
+    @mock.patch('crmsh.watchdog.Watchdog._valid_device')
+    @mock.patch('crmsh.watchdog.Watchdog._set_input')
+    @mock.patch('crmsh.watchdog.Watchdog._set_watchdog_info')
+    def test_init_watchdog(self, mock_set_info, mock_set_input, mock_valid, 
mock_invokerc, mock_is_loaded, mock_load, mock_get_device):
+        mock_valid.return_value = False
+        self.watchdog_inst._input = "softdog"
+        mock_invokerc.return_value = True
+        mock_is_loaded.return_value = False
+        mock_get_device.return_value = "/dev/watchdog"
+
+        self.watchdog_inst.init_watchdog()
+
+        mock_valid.assert_called_once_with("softdog")
+        mock_invokerc.assert_called_once_with("modinfo softdog")
+        mock_is_loaded.assert_called_once_with("softdog")
+        mock_load.assert_called_once_with("softdog")
+        mock_set_info.assert_has_calls([mock.call(), mock.call()])
+        mock_get_device.assert_called_once_with("softdog")

Reply via email to