From 3dc8e1780b9594ed8b70fafa4a9ef64b6cda530e Mon Sep 17 00:00:00 2001 From: liangxin1300 Date: Thu, 14 Jul 2022 09:28:28 +0800 Subject: [PATCH] Fix: sbd: Ask if overwrite when given sbd device on interactive mode(bsc#1201428) ** Problem When sbd device already created, running `crm cluster init -s `, that's on the interactive mode, but the existing sbd device will be overwritten ** Solution Check if the given sbd device already initialized, if on the interactive mode, ask user if overwrite, input 'n', no overwrite for sbd device --- crmsh/bootstrap.py | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/crmsh/bootstrap.py b/crmsh/bootstrap.py index ee28b88111..854fb36575 100644 --- a/crmsh/bootstrap.py +++ b/crmsh/bootstrap.py @@ -357,7 +357,8 @@ def __init__(self, sbd_devices=None, diskless_sbd=False): self.diskless_sbd = diskless_sbd self._sbd_devices = None self._watchdog_inst = None - self.no_overwrite = False + self.no_overwrite_map = {} + self.no_update_config = False def _parse_sbd_device(self): """ @@ -411,6 +412,12 @@ def _verify_sbd_device(self, dev_list, compare_node_list=[]): 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 confirm("SBD is already configured to use {} - overwrite?".format(dev)) + def _get_sbd_device_interactive(self): """ Get sbd device on interactive mode @@ -426,8 +433,10 @@ def _get_sbd_device_interactive(self): return configured_dev_list = self._get_sbd_device_from_config() - if configured_dev_list and not 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 = [] @@ -439,14 +448,22 @@ def _get_sbd_device_interactive(self): 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: print_error_msg(str(err_msg)) continue - for dev_item in dev_list: - warn("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 + warn("All data on {} will be destroyed!".format(dev)) if confirm('Are you sure you wish to use this device?'): dev_looks_sane = True else: @@ -463,6 +480,10 @@ def _get_sbd_device(self): if self.sbd_devices_input: dev_list = self._parse_sbd_device() 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 @@ -474,7 +495,7 @@ def _initialize_sbd(self): if self.diskless_sbd: return 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 = invoke("sbd -d {} create".format(dev)) if not rc: @@ -484,7 +505,7 @@ def _update_configuration(self): """ Update /etc/sysconfig/sbd """ - if self.no_overwrite: + if self.no_update_config: csync2_update(SYSCONFIG_SBD) return @@ -509,7 +530,7 @@ def _get_sbd_device_from_config(self): if res: return utils.re_split_string(self.PARSE_RE, res) else: - return None + return [] def sbd_init(self): """ @@ -530,7 +551,7 @@ def sbd_init(self): if self.diskless_sbd: warn(self.DISKLESS_SBD_WARNING) msg = "Configuring diskless SBD" - elif not self.no_overwrite: + elif not all(self.no_overwrite_map.values()): msg = "Initializing SBD" with status_long(msg): self._initialize_sbd()