Skip to content

Commit

Permalink
Fix: sbd: Ask if overwrite when given sbd device on interactive mode(…
Browse files Browse the repository at this point in the history
…bsc#1201428)

** Problem
When sbd device already created, running `crm cluster init -s
<sbd_device>`, 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
  • Loading branch information
liangxin1300 committed Jul 20, 2022
1 parent b1ff6a6 commit 3dc8e17
Showing 1 changed file with 30 additions and 9 deletions.
39 changes: 30 additions & 9 deletions crmsh/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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
Expand All @@ -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 = []
Expand All @@ -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:
Expand All @@ -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
Expand All @@ -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:
Expand All @@ -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

Expand All @@ -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):
"""
Expand All @@ -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()
Expand Down

0 comments on commit 3dc8e17

Please sign in to comment.