Skip to content

Commit 954cdf3

Browse files
authored
[crmsh-5.0] Dev: sbd: Remove sbd configuration directories while removing cluster node (#1976)
Backport from #1962
2 parents f6e3881 + 705ee73 commit 954cdf3

File tree

4 files changed

+38
-22
lines changed

4 files changed

+38
-22
lines changed

crmsh/bootstrap.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def __init__(self):
138138
self.default_nic = None
139139
self.default_ip_list = []
140140
self.corosync_conf_orig = None
141-
self.rm_list = [sbd.SBDManager.SYSCONFIG_SBD, CSYNC2_CFG, corosync.conf(), CSYNC2_KEY,
141+
self.rm_list = [CSYNC2_CFG, corosync.conf(), CSYNC2_KEY,
142142
COROSYNC_AUTH, "/var/lib/pacemaker/cib/*",
143143
"/var/lib/corosync/*", "/var/lib/pacemaker/pengine/*", PCMK_REMOTE_AUTH,
144144
"/var/lib/csync2/*", "~/.config/crm/*"]
@@ -2220,10 +2220,8 @@ def rm_configuration_files(remote=None):
22202220
"""
22212221
shell = sh.cluster_shell()
22222222
shell.get_stdout_or_raise_error("rm -f {}".format(' '.join(_context.rm_list)), remote)
2223-
# restore original sbd configuration file from /usr/share/fillup-templates/sysconfig.sbd
2224-
if utils.package_is_installed("sbd", remote_addr=remote):
2225-
cmd = "cp {} {}".format(sbd.SBDManager.SYSCONFIG_SBD_TEMPLATE, sbd.SBDManager.SYSCONFIG_SBD)
2226-
shell.get_stdout_or_raise_error(cmd, remote)
2223+
if os.path.exists(sbd.SBDManager.SYSCONFIG_SBD):
2224+
sbd.cleanup_sbd_configurations(remote)
22272225

22282226

22292227
def remove_node_from_cluster(node, dead_node=False):

crmsh/sbd.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from . import corosync
1010
from . import xmlutil
1111
from . import watchdog
12-
from . import parallax
1312
from .service_manager import ServiceManager
1413
from .sh import ShellUtils
1514

@@ -787,6 +786,19 @@ def cleanup_existing_sbd_resource():
787786
utils.ext_cmd("crm configure delete {}".format(' '.join(sbd_id_list)))
788787

789788

789+
def cleanup_sbd_configurations(remote=None):
790+
shell = sh.cluster_shell()
791+
sysconfig_sbd_bak = f"{SBDManager.SYSCONFIG_SBD}.bak"
792+
logger.info("Rename %s to %s on node %s",
793+
SBDManager.SYSCONFIG_SBD, sysconfig_sbd_bak, remote or utils.this_node())
794+
cmd = f"test -f {SBDManager.SYSCONFIG_SBD} && mv {SBDManager.SYSCONFIG_SBD} {sysconfig_sbd_bak} || exit 0"
795+
shell.get_stdout_or_raise_error(cmd, host=remote)
796+
797+
for _dir in [SBDManager.SBD_SYSTEMD_DELAY_START_DIR, SBDManager.SBD_SYSTEMD_DELAY_START_DISABLE_DIR]:
798+
cmd = f"test -d {_dir} && rm -rf {_dir} && systemctl daemon-reload || exit 0"
799+
shell.get_stdout_or_raise_error(cmd, host=remote)
800+
801+
790802
def purge_sbd_from_cluster():
791803
'''
792804
Purge SBD from cluster, the process includes:
@@ -804,17 +816,10 @@ def purge_sbd_from_cluster():
804816
if service_manager.service_is_enabled(constants.SBD_SERVICE, node):
805817
logger.info("Disable %s on node %s", constants.SBD_SERVICE, node)
806818
service_manager.disable_service(constants.SBD_SERVICE, node)
807-
808-
config_bak = f"{SBDManager.SYSCONFIG_SBD}.bak"
809-
logger.info("Move %s to %s on all nodes", SBDManager.SYSCONFIG_SBD, config_bak)
810-
utils.cluster_run_cmd(f"mv {SBDManager.SYSCONFIG_SBD} {config_bak}")
819+
cleanup_sbd_configurations(node)
811820

812821
out = sh.cluster_shell().get_stdout_or_raise_error("stonith_admin -L")
813822
res = re.search("([0-9]+) fence device[s]* found", out)
814823
# after disable sbd.service, check if sbd is the last stonith device
815824
if res and int(res.group(1)) <= 1:
816825
utils.cleanup_stonith_related_properties()
817-
818-
for _dir in [SBDManager.SBD_SYSTEMD_DELAY_START_DIR, SBDManager.SBD_SYSTEMD_DELAY_START_DISABLE_DIR]:
819-
cmd = f"test -d {_dir} && rm -rf {_dir} || exit 0"
820-
parallax.parallax_call(cluster_nodes, cmd)

test/unittests/test_bootstrap.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,16 +1977,17 @@ def test_remove_self_other_nodes(self, mock_this_node, mock_list, mock_run, mock
19771977
mock_run.assert_called_once_with("node2", "crm cluster remove -y -c node1")
19781978
mock_error.assert_called_once_with("Failed to remove this node from node2: err")
19791979

1980-
@mock.patch('crmsh.utils.package_is_installed')
1980+
@mock.patch('crmsh.sbd.cleanup_sbd_configurations')
1981+
@mock.patch('os.path.exists')
19811982
@mock.patch('crmsh.sh.ClusterShell.get_stdout_or_raise_error')
1982-
def test_rm_configuration_files(self, mock_run, mock_installed):
1983+
def test_rm_configuration_files(self, mock_run, mock_exists, mock_rm_sbd):
19831984
bootstrap._context = mock.Mock(rm_list=["file1", "file2"])
1984-
mock_installed.return_value = True
1985+
mock_exists.return_value = True
19851986
bootstrap.rm_configuration_files()
19861987
mock_run.assert_has_calls([
19871988
mock.call('rm -f file1 file2', None),
1988-
mock.call('cp /usr/share/fillup-templates/sysconfig.sbd /etc/sysconfig/sbd', None)
19891989
])
1990+
mock_rm_sbd.assert_called_once_with(None)
19901991

19911992
@mock.patch('crmsh.utils.get_iplist_from_name')
19921993
@mock.patch('crmsh.corosync.get_values')

test/unittests/test_sbd.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -804,15 +804,27 @@ def test_cleanup_existing_sbd_resource(self, mock_CrmMonXmlParser, mock_logger_i
804804
call("Remove sbd resource '%s'", 'sbd_resource')
805805
])
806806

807-
@patch('crmsh.parallax.parallax_call')
807+
@patch('logging.Logger.info')
808+
@patch('crmsh.sh.cluster_shell')
809+
def test_cleanup_sbd_configurations(self, mock_cluster_shell, mock_logger_info):
810+
mock_cluster_shell_inst = Mock()
811+
mock_cluster_shell.return_value = mock_cluster_shell_inst
812+
mock_cluster_shell_inst.get_stdout_or_raise_error = Mock()
813+
sbd.cleanup_sbd_configurations()
814+
mock_cluster_shell_inst.get_stdout_or_raise_error.assert_has_calls([
815+
call(f"test -f {sbd.SBDManager.SYSCONFIG_SBD} && mv {sbd.SBDManager.SYSCONFIG_SBD} {sbd.SBDManager.SYSCONFIG_SBD}.bak || exit 0", host=None),
816+
call(f"test -d {sbd.SBDManager.SBD_SYSTEMD_DELAY_START_DIR} && rm -rf {sbd.SBDManager.SBD_SYSTEMD_DELAY_START_DIR} && systemctl daemon-reload || exit 0", host=None),
817+
call(f"test -d {sbd.SBDManager.SBD_SYSTEMD_DELAY_START_DISABLE_DIR} && rm -rf {sbd.SBDManager.SBD_SYSTEMD_DELAY_START_DISABLE_DIR} && systemctl daemon-reload || exit 0", host=None),
818+
])
819+
820+
@patch('crmsh.sbd.cleanup_sbd_configurations')
808821
@patch('crmsh.utils.cleanup_stonith_related_properties')
809822
@patch('crmsh.sbd.sh.cluster_shell')
810-
@patch('crmsh.utils.cluster_run_cmd')
811823
@patch('logging.Logger.info')
812824
@patch('crmsh.sbd.ServiceManager')
813825
@patch('crmsh.utils.list_cluster_nodes')
814826
@patch('crmsh.sbd.cleanup_existing_sbd_resource')
815-
def test_purge_sbd_from_cluster(self, mock_cleanup_existing_sbd_resource, mock_list_cluster_nodes, mock_ServiceManager, mock_logger_info, mock_cluster_run_cmd, mock_cluster_shell, mock_cleanup_stonith_related_properties, mock_parallax_call):
827+
def test_purge_sbd_from_cluster(self, mock_cleanup_existing_sbd_resource, mock_list_cluster_nodes, mock_ServiceManager, mock_logger_info, mock_cluster_shell, mock_cleanup_stonith_related_properties, mock_rm_sbd_configuration_files):
816828
mock_list_cluster_nodes.return_value = ['node1', 'node2']
817829
mock_ServiceManager.return_value.service_is_enabled.side_effect = [True, True]
818830
stonith_data = """stonith-sbd
@@ -823,6 +835,6 @@ def test_purge_sbd_from_cluster(self, mock_cleanup_existing_sbd_resource, mock_l
823835
mock_logger_info.assert_has_calls([
824836
call("Disable %s on node %s", constants.SBD_SERVICE, 'node1'),
825837
call("Disable %s on node %s", constants.SBD_SERVICE, 'node2'),
826-
call("Move %s to %s on all nodes", sbd.SBDManager.SYSCONFIG_SBD, sbd.SBDManager.SYSCONFIG_SBD+'.bak')
827838
])
828839
mock_cleanup_stonith_related_properties.assert_called_once()
840+
mock_rm_sbd_configuration_files.assert_has_calls([call("node1"), call("node2")])

0 commit comments

Comments
 (0)