diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py index 013f34a41e77916d6017c29428925c67ec080ecf..9a207b64c730c31a3ca4ca9bd6664d0618ab4f5b 100644 --- a/lib/client/gnt_instance.py +++ b/lib/client/gnt_instance.py @@ -1298,10 +1298,6 @@ def _ConvertNicDiskModifications(mods): assert not (constants.DDMS_VALUES_WITH_MODIFY & set(params.keys())) - if action == constants.DDM_REMOVE and params: - raise errors.OpPrereqError("Not accepting parameters on removal", - errors.ECODE_INVAL) - result.append((action, identifier, params)) return result diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py index 609741fa341ba59eeb6079e641f2f21d24a38033..1b8f7a869dd9987b3f123777bffc18da07d88b44 100644 --- a/lib/cmdlib/instance.py +++ b/lib/cmdlib/instance.py @@ -64,7 +64,7 @@ from ganeti.cmdlib.instance_storage import CreateDisks, \ IsExclusiveStorageEnabledNodeUuid, CreateSingleBlockDev, ComputeDisks, \ CheckRADOSFreeSpace, ComputeDiskSizePerVG, GenerateDiskTemplate, \ StartInstanceDisks, ShutdownInstanceDisks, AssembleInstanceDisks, \ - CheckSpindlesExclusiveStorage + CheckSpindlesExclusiveStorage, ExtractDiskParams from ganeti.cmdlib.instance_utils import BuildInstanceHookEnvByObject, \ GetClusterDomainSecret, BuildInstanceHookEnv, NICListToTuple, \ NICToTuple, CheckNodeNotDrained, RemoveInstance, CopyLockList, \ @@ -2288,12 +2288,11 @@ def _ApplyContainerMods(kind, container, chgdesc, mods, (absidx, item) = GetItemFromContainer(identifier, kind, container) if op == constants.DDM_REMOVE: - assert not params changes = [("%s/%s" % (kind, absidx), "remove")] if remove_fn is not None: - msg = remove_fn(absidx, item, private) + msg = remove_fn(absidx, item, private, params) if msg: changes.append(("%s/%s" % (kind, absidx), msg)) @@ -2369,12 +2368,8 @@ class LUInstanceSetParams(LogicalUnit): if key_types: utils.ForceDictType(params, key_types) - if op == constants.DDM_REMOVE: - if params: - raise errors.OpPrereqError("No settings should be passed when" - " removing a %s" % kind, - errors.ECODE_INVAL) - elif op in (constants.DDM_ADD, constants.DDM_MODIFY): + + if op in (constants.DDM_ADD, constants.DDM_MODIFY, constants.DDM_REMOVE): item_fn(op, params) else: raise errors.ProgrammerError("Unhandled operation '%s'" % op) @@ -3449,10 +3444,16 @@ class LUInstanceSetParams(LogicalUnit): return changes - def _RemoveDisk(self, idx, root, _): + def _RemoveDisk(self, idx, root, _, params): """Removes a disk. """ + disk_params = ExtractDiskParams(params, self.instance.disk_template) + if root.params is None: + root.params = disk_params + else: + root.params.update(disk_params) + hotmsg = "" if self.op.hotplug: hotmsg = self._HotplugDevice(constants.HOTPLUG_ACTION_REMOVE, @@ -3539,7 +3540,7 @@ class LUInstanceSetParams(LogicalUnit): return changes - def _RemoveNic(self, idx, nic, _): + def _RemoveNic(self, idx, nic, _, __): if self.op.hotplug: return self._HotplugDevice(constants.HOTPLUG_ACTION_REMOVE, constants.HOTPLUG_TARGET_NIC, diff --git a/lib/cmdlib/instance_storage.py b/lib/cmdlib/instance_storage.py index 8075458b8ef86fe29793a960bba25b3d5d83ff47..0a19529839295dd1d3b6f900244d245d30e35733 100644 --- a/lib/cmdlib/instance_storage.py +++ b/lib/cmdlib/instance_storage.py @@ -385,6 +385,24 @@ def CheckRADOSFreeSpace(): pass +def ExtractDiskParams(disk, template_name): + """Extract disk parameters from the provided disk information.""" + params = {} + # Only for the Ext template add disk_info to params + if template_name == constants.DT_EXT: + # FIXME: Check if the disk provider exists first + params[constants.IDISK_PROVIDER] = disk[constants.IDISK_PROVIDER] + for key in disk: + if key not in constants.IDISK_PARAMS: + params[key] = disk[key] + # Add IDISK_ACCESS param to disk params + if (template_name in constants.DTS_HAVE_ACCESS and + constants.IDISK_ACCESS in disk): + params[constants.IDISK_ACCESS] = disk[constants.IDISK_ACCESS] + + return params + + def _GenerateDRBD8Branch(lu, primary_uuid, secondary_uuid, size, vgnames, names, iv_name, p_minor, s_minor): """Generate a drbd8 device complete with its children. @@ -500,17 +518,7 @@ def GenerateDiskTemplate( dev_type = template_name for idx, disk in enumerate(disk_info): - params = {} - # Only for the Ext template add disk_info to params - if template_name == constants.DT_EXT: - params[constants.IDISK_PROVIDER] = disk[constants.IDISK_PROVIDER] - for key in disk: - if key not in constants.IDISK_PARAMS: - params[key] = disk[key] - # Add IDISK_ACCESS param to disk params - if (template_name in constants.DTS_HAVE_ACCESS and - constants.IDISK_ACCESS in disk): - params[constants.IDISK_ACCESS] = disk[constants.IDISK_ACCESS] + params = ExtractDiskParams(disk, template_name) disk_index = idx + base_index size = disk[constants.IDISK_SIZE] feedback_fn("* disk %s, size %s" %