Skip to content

Commit

Permalink
Dev: ui_sbd: Check if the adding device is already initialized
Browse files Browse the repository at this point in the history
and make sure the metadata is consistent between devices.
  • Loading branch information
liangxin1300 committed Oct 17, 2024
1 parent af74b1b commit da2adfa
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
27 changes: 18 additions & 9 deletions crmsh/sbd.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def no_overwrite_device_check(dev) -> bool:
'''
initialized = SBDUtils.has_sbd_device_already_initialized(dev)
return initialized and \
not bootstrap.confirm(f"{dev} has already been initialized by SBD, do you want to overwrite it?")
not bootstrap.confirm(f"{dev} has already been initialized by SBD - overwrite?")

@staticmethod
def check_devices_metadata_consistent(dev_list) -> bool:
Expand All @@ -131,8 +131,15 @@ def check_devices_metadata_consistent(dev_list) -> bool:
if len(dev_list) < 2:
return consistent
first_dev_metadata = SBDUtils.get_sbd_device_metadata(dev_list[0], timeout_only=True)
if not first_dev_metadata:
logger.warning(f"Cannot get metadata for {dev_list[0]}")
return False
for dev in dev_list[1:]:
if SBDUtils.get_sbd_device_metadata(dev, timeout_only=True) != first_dev_metadata:
this_dev_metadata = SBDUtils.get_sbd_device_metadata(dev, timeout_only=True)
if not this_dev_metadata:
logger.warning(f"Cannot get metadata for {dev}")
return False
if this_dev_metadata != first_dev_metadata:
logger.warning(f"Device {dev} doesn't have the same metadata as {dev_list[0]}")
consistent = False
return consistent
Expand Down Expand Up @@ -493,8 +500,6 @@ def initialize_sbd(self):
logger.debug("Running command: %s", cmd)
shell.get_stdout_or_raise_error(cmd)

SBDUtils.check_devices_metadata_consistent(self.device_list_to_init)

@staticmethod
def enable_sbd_service():
cluster_nodes = utils.list_cluster_nodes() or [utils.this_node()]
Expand Down Expand Up @@ -557,10 +562,14 @@ def get_sbd_device_interactive(self):
utils.fatal(self.SBD_NOT_INSTALLED_MSG)

configured_devices = SBDUtils.get_sbd_device_from_config()
for dev in configured_devices:
self.no_overwrite_dev_map[dev] = SBDUtils.no_overwrite_device_check(dev)
if self.no_overwrite_dev_map and all(self.no_overwrite_dev_map.values()):
return configured_devices
if configured_devices:
wants_to_overwrite_msg = f"SBD_DEVICE in {self.SYSCONFIG_SBD} is already configured to use '{';'.join(configured_devices)}' - overwrite?"
if not bootstrap.confirm(wants_to_overwrite_msg):
if not SBDUtils.check_devices_metadata_consistent(configured_devices):
raise utils.TerminateSubCommand
self.no_overwrite_dev_map = {dev: True for dev in configured_devices}
self.update_dict = {}
return configured_devices

dev_list = []
dev_looks_sane = False
Expand Down Expand Up @@ -615,11 +624,11 @@ def init_and_deploy_sbd(self):
5. Configure stonith-sbd resource and related properties
'''
if self.bootstrap_context:
self._load_attributes_from_bootstrap()
self.get_sbd_device_from_bootstrap()
if not self.device_list_to_init and not self.diskless_sbd:
ServiceManager().disable_service(constants.SBD_SERVICE)
return
self._load_attributes_from_bootstrap()

self.initialize_sbd()
self.update_configuration()
Expand Down
17 changes: 16 additions & 1 deletion crmsh/ui_sbd.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,11 +324,26 @@ def _device_add(self, devices_to_add: typing.List[str]):
'''
all_device_list = self.device_list_from_config + devices_to_add
sbd.SBDUtils.verify_sbd_device(all_device_list)
devices_to_init = devices_to_add

# Should check if the device is already initialized and
# make sure the metadata is consistent between devices
no_overwrite_dev_list = [
dev
for dev in devices_to_add
if sbd.SBDUtils.no_overwrite_device_check(dev)
]
if no_overwrite_dev_list:
dev_check_list = self.device_list_from_config + no_overwrite_dev_list
if sbd.SBDUtils.check_devices_metadata_consistent(dev_check_list):
devices_to_init = list(set(devices_to_add) - set(no_overwrite_dev_list))
else:
raise utils.TerminateSubCommand

logger.info("Append devices: %s", ';'.join(devices_to_add))
update_dict = {"SBD_DEVICE": ";".join(all_device_list)}
sbd_manager = sbd.SBDManager(
device_list_to_init=devices_to_add,
device_list_to_init=devices_to_init,
update_dict=update_dict,
timeout_dict=self.device_meta_dict_runtime
)
Expand Down

0 comments on commit da2adfa

Please sign in to comment.