diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 273e32197c09901604bdf71228bb18aa22f54a0f..2be790276846c11a22aa10f3e130472fa952e536 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -8639,91 +8639,6 @@ def _GenerateUniqueNames(lu, exts): return results -def _ComputeLDParams(disk_template, disk_params): - """Computes Logical Disk parameters from Disk Template parameters. - - @type disk_template: string - @param disk_template: disk template, one of L{constants.DISK_TEMPLATES} - @type disk_params: dict - @param disk_params: disk template parameters; dict(template_name -> parameters - @rtype: list(dict) - @return: a list of dicts, one for each node of the disk hierarchy. Each dict - contains the LD parameters of the node. The tree is flattened in-order. - - """ - if disk_template not in constants.DISK_TEMPLATES: - raise errors.ProgrammerError("Unknown disk template %s" % disk_template) - - result = list() - dt_params = disk_params[disk_template] - if disk_template == constants.DT_DRBD8: - drbd_params = { - constants.LDP_RESYNC_RATE: dt_params[constants.DRBD_RESYNC_RATE], - constants.LDP_BARRIERS: dt_params[constants.DRBD_DISK_BARRIERS], - constants.LDP_NO_META_FLUSH: dt_params[constants.DRBD_META_BARRIERS], - constants.LDP_DEFAULT_METAVG: dt_params[constants.DRBD_DEFAULT_METAVG], - constants.LDP_DISK_CUSTOM: dt_params[constants.DRBD_DISK_CUSTOM], - constants.LDP_NET_CUSTOM: dt_params[constants.DRBD_NET_CUSTOM], - constants.LDP_DYNAMIC_RESYNC: dt_params[constants.DRBD_DYNAMIC_RESYNC], - constants.LDP_PLAN_AHEAD: dt_params[constants.DRBD_PLAN_AHEAD], - constants.LDP_FILL_TARGET: dt_params[constants.DRBD_FILL_TARGET], - constants.LDP_DELAY_TARGET: dt_params[constants.DRBD_DELAY_TARGET], - constants.LDP_MAX_RATE: dt_params[constants.DRBD_MAX_RATE], - constants.LDP_MIN_RATE: dt_params[constants.DRBD_MIN_RATE], - } - - drbd_params = \ - objects.FillDict(constants.DISK_LD_DEFAULTS[constants.LD_DRBD8], - drbd_params) - - result.append(drbd_params) - - # data LV - data_params = { - constants.LDP_STRIPES: dt_params[constants.DRBD_DATA_STRIPES], - } - data_params = \ - objects.FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], - data_params) - result.append(data_params) - - # metadata LV - meta_params = { - constants.LDP_STRIPES: dt_params[constants.DRBD_META_STRIPES], - } - meta_params = \ - objects.FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], - meta_params) - result.append(meta_params) - - elif (disk_template == constants.DT_FILE or - disk_template == constants.DT_SHARED_FILE): - result.append(constants.DISK_LD_DEFAULTS[constants.LD_FILE]) - - elif disk_template == constants.DT_PLAIN: - params = { - constants.LDP_STRIPES: dt_params[constants.LV_STRIPES], - } - params = \ - objects.FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], - params) - result.append(params) - - elif disk_template == constants.DT_BLOCK: - result.append(constants.DISK_LD_DEFAULTS[constants.LD_BLOCKDEV]) - - elif disk_template == constants.DT_RBD: - params = { - constants.LDP_POOL: dt_params[constants.RBD_POOL] - } - params = \ - objects.FillDict(constants.DISK_LD_DEFAULTS[constants.LD_RBD], - params) - result.append(params) - - return result - - def _GenerateDRBD8Branch(lu, primary, secondary, size, vgnames, names, iv_name, p_minor, s_minor, drbd_params, data_params, meta_params): diff --git a/lib/objects.py b/lib/objects.py index b9ecc3193bf3d17ced905e58021629a05a2c2321..24b99fc4cd339067b0ee0371d212f4da910bbe79 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -922,6 +922,94 @@ class Disk(ConfigObject): self.params) # add here config upgrade for this disk + @staticmethod + def ComputeLDParams(disk_template, disk_params): + """Computes Logical Disk parameters from Disk Template parameters. + + @type disk_template: string + @param disk_template: disk template, one of L{constants.DISK_TEMPLATES} + @type disk_params: dict + @param disk_params: disk template parameters; + dict(template_name -> parameters + @rtype: list(dict) + @return: a list of dicts, one for each node of the disk hierarchy. Each dict + contains the LD parameters of the node. The tree is flattened in-order. + + """ + if disk_template not in constants.DISK_TEMPLATES: + raise errors.ProgrammerError("Unknown disk template %s" % disk_template) + + assert disk_template in disk_params + + result = list() + dt_params = disk_params[disk_template] + if disk_template == constants.DT_DRBD8: + drbd_params = { + constants.LDP_RESYNC_RATE: dt_params[constants.DRBD_RESYNC_RATE], + constants.LDP_BARRIERS: dt_params[constants.DRBD_DISK_BARRIERS], + constants.LDP_NO_META_FLUSH: dt_params[constants.DRBD_META_BARRIERS], + constants.LDP_DEFAULT_METAVG: dt_params[constants.DRBD_DEFAULT_METAVG], + constants.LDP_DISK_CUSTOM: dt_params[constants.DRBD_DISK_CUSTOM], + constants.LDP_NET_CUSTOM: dt_params[constants.DRBD_NET_CUSTOM], + constants.LDP_DYNAMIC_RESYNC: dt_params[constants.DRBD_DYNAMIC_RESYNC], + constants.LDP_PLAN_AHEAD: dt_params[constants.DRBD_PLAN_AHEAD], + constants.LDP_FILL_TARGET: dt_params[constants.DRBD_FILL_TARGET], + constants.LDP_DELAY_TARGET: dt_params[constants.DRBD_DELAY_TARGET], + constants.LDP_MAX_RATE: dt_params[constants.DRBD_MAX_RATE], + constants.LDP_MIN_RATE: dt_params[constants.DRBD_MIN_RATE], + } + + drbd_params = \ + FillDict(constants.DISK_LD_DEFAULTS[constants.LD_DRBD8], + drbd_params) + + result.append(drbd_params) + + # data LV + data_params = { + constants.LDP_STRIPES: dt_params[constants.DRBD_DATA_STRIPES], + } + data_params = \ + FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], + data_params) + result.append(data_params) + + # metadata LV + meta_params = { + constants.LDP_STRIPES: dt_params[constants.DRBD_META_STRIPES], + } + meta_params = \ + FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], + meta_params) + result.append(meta_params) + + elif (disk_template == constants.DT_FILE or + disk_template == constants.DT_SHARED_FILE): + result.append(constants.DISK_LD_DEFAULTS[constants.LD_FILE]) + + elif disk_template == constants.DT_PLAIN: + params = { + constants.LDP_STRIPES: dt_params[constants.LV_STRIPES], + } + params = \ + FillDict(constants.DISK_LD_DEFAULTS[constants.LD_LV], + params) + result.append(params) + + elif disk_template == constants.DT_BLOCK: + result.append(constants.DISK_LD_DEFAULTS[constants.LD_BLOCKDEV]) + + elif disk_template == constants.DT_RBD: + params = { + constants.LDP_POOL: dt_params[constants.RBD_POOL] + } + params = \ + FillDict(constants.DISK_LD_DEFAULTS[constants.LD_RBD], + params) + result.append(params) + + return result + class InstancePolicy(ConfigObject): """Config object representing instance policy limits dictionary. diff --git a/lib/rpc.py b/lib/rpc.py index 3584ffc49eb89774e0296b901427a34dd2d3f4d0..82405103559ae165a7652d042a1da3b3d7229dc7 100644 --- a/lib/rpc.py +++ b/lib/rpc.py @@ -575,6 +575,56 @@ def _EncodeBlockdevRename(value): return [(d.ToDict(), uid) for d, uid in value] +def _AnnotateDParamsDRBD(disk, (drbd_params, data_params, meta_params)): + """Annotates just DRBD disks layouts. + + """ + assert disk.dev_type == constants.LD_DRBD8 + + disk.params = objects.FillDict(drbd_params, disk.params) + (dev_data, dev_meta) = disk.children + dev_data.params = objects.FillDict(data_params, dev_data.params) + dev_meta.params = objects.FillDict(meta_params, dev_meta.params) + + return disk + + +def _AnnotateDParamsGeneric(disk, (params, )): + """Generic disk parameter annotation routine. + + """ + assert disk.dev_type != constants.LD_DRBD8 + + disk.params = objects.FillDict(params, disk.params) + + return disk + + +def AnnotateDiskParams(template, disks, disk_params): + """Annotates the disk objects with the disk parameters. + + @param template: The disk template used + @param disks: The list of disks objects to annotate + @param disk_params: The disk paramaters for annotation + @returns: A list of disk objects annotated + + """ + ld_params = objects.Disk.ComputeLDParams(template, disk_params) + + if template == constants.DT_DRBD8: + annotation_fn = _AnnotateDParamsDRBD + elif template == constants.DT_DISKLESS: + annotation_fn = lambda disk, _: disk + else: + annotation_fn = _AnnotateDParamsGeneric + + new_disks = [] + for disk in disks: + new_disks.append(annotation_fn(disk.Copy(), ld_params)) + + return new_disks + + #: Generic encoders _ENCODERS = { rpc_defs.ED_OBJECT_DICT: _ObjectToDict,