Skip to content

Commit d6d8099

Browse files
authored
Dev: sbd: Use SBDUtils.get_sbd_device_from_config for reliable diskless SBD detection (#1887)
The configure_sbd function may be invoked during the bootstrap `cluster` stage without the -S option. Switching to SBDUtils.get_sbd_device_from_config provides a more reliable way to determine if SBD is diskless.
2 parents ae1e11b + 6b50086 commit d6d8099

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

crmsh/sbd.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -577,15 +577,15 @@ def configure_sbd(self):
577577
'''
578578
Configure fence_sbd resource and related properties
579579
'''
580-
if self.diskless_sbd:
581-
swt_value = self.timeout_dict.get("stonith-watchdog", SBDTimeout.get_stonith_watchdog_timeout_expected())
582-
utils.set_property("stonith-watchdog-timeout", swt_value)
583-
else:
580+
if SBDUtils.get_sbd_device_from_config():
584581
if utils.get_property("stonith-watchdog-timeout", get_default=False):
585582
utils.delete_property("stonith-watchdog-timeout")
586583
if not xmlutil.CrmMonXmlParser().is_resource_configured(self.SBD_RA):
587584
cmd = f"crm configure primitive {self.SBD_RA_ID} {self.SBD_RA}"
588585
sh.cluster_shell().get_stdout_or_raise_error(cmd)
586+
else:
587+
swt_value = self.timeout_dict.get("stonith-watchdog", SBDTimeout.get_stonith_watchdog_timeout_expected())
588+
utils.set_property("stonith-watchdog-timeout", swt_value)
589589
utils.set_property("stonith-enabled", "true")
590590

591591
def _warn_diskless_sbd(self, peer=None):

test/features/bootstrap_sbd_normal.feature

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,21 @@ Feature: crmsh bootstrap sbd management
128128
And Service "sbd" is "started" on "hanode2"
129129
And Resource "stonith-sbd" type "fence_sbd" is "Started"
130130

131+
@clean
132+
Scenario: Configure diskless sbd on running cluster via stage
133+
Given Cluster service is "stopped" on "hanode1"
134+
Given Cluster service is "stopped" on "hanode2"
135+
When Run "crm cluster init -y" on "hanode1"
136+
Then Cluster service is "started" on "hanode1"
137+
When Run "crm cluster join -c hanode1 -y" on "hanode2"
138+
Then Cluster service is "started" on "hanode2"
139+
And Online nodes are "hanode1 hanode2"
140+
When Run "crm cluster init sbd -S -y" on "hanode1"
141+
Then Expected "Diskless SBD requires cluster with three or more nodes." in stderr
142+
Then Service "sbd" is "started" on "hanode1"
143+
And Service "sbd" is "started" on "hanode2"
144+
And Resource "stonith:fence_sbd" not configured
145+
131146
@clean
132147
Scenario: Configure sbd on running cluster via stage with ra running(bsc#1181906)
133148
Given Cluster service is "stopped" on "hanode1"

test/unittests/test_sbd.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -755,9 +755,11 @@ def test_initialize_sbd_return(self, mock_convert_timeout_dict_to_opt_str):
755755
@patch('crmsh.utils.set_property')
756756
@patch('crmsh.sbd.ServiceManager')
757757
@patch('crmsh.sbd.SBDTimeout.get_stonith_watchdog_timeout_expected')
758-
def test_configure_sbd_diskless(self, mock_get_stonith_watchdog_timeout, mock_ServiceManager, mock_set_property):
758+
@patch('crmsh.sbd.SBDUtils.get_sbd_device_from_config')
759+
def test_configure_sbd_diskless(self, mock_get_sbd_device, mock_get_stonith_watchdog_timeout, mock_ServiceManager, mock_set_property):
759760
mock_get_stonith_watchdog_timeout.return_value = 2
760-
sbdmanager_instance = SBDManager(diskless_sbd=True)
761+
mock_get_sbd_device.return_value = False
762+
sbdmanager_instance = SBDManager()
761763
sbdmanager_instance.configure_sbd()
762764
mock_set_property.assert_has_calls([
763765
call("stonith-watchdog-timeout", 2),
@@ -770,7 +772,9 @@ def test_configure_sbd_diskless(self, mock_get_stonith_watchdog_timeout, mock_Se
770772
@patch('crmsh.sbd.xmlutil.CrmMonXmlParser')
771773
@patch('crmsh.utils.set_property')
772774
@patch('crmsh.sbd.ServiceManager')
773-
def test_configure_sbd(self, mock_ServiceManager, mock_set_property, mock_CrmMonXmlParser, mock_cluster_shell, mock_get_property, mock_delete_property):
775+
@patch('crmsh.sbd.SBDUtils.get_sbd_device_from_config')
776+
def test_configure_sbd(self, mock_get_sbd_device, mock_ServiceManager, mock_set_property, mock_CrmMonXmlParser, mock_cluster_shell, mock_get_property, mock_delete_property):
777+
mock_get_sbd_device.return_value = True
774778
mock_get_property.return_value = -1
775779
mock_CrmMonXmlParser.return_value.is_resource_configured.return_value = False
776780
mock_cluster_shell.return_value.get_stdout_or_raise_error.return_value = "data"

0 commit comments

Comments
 (0)