gnt-group modify can now change instance policy specs. Support for 'default' value is provided and sanity checks are performed.
Signed-off-by: Agata Murawska <[email protected]> --- lib/client/gnt_group.py | 41 ++++++++++++++++++++++++++++++++++++++--- lib/cmdlib.py | 14 ++++++++++++++ lib/opcodes.py | 1 + 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/lib/client/gnt_group.py b/lib/client/gnt_group.py index 3770a00..0f80c2d 100644 --- a/lib/client/gnt_group.py +++ b/lib/client/gnt_group.py @@ -146,8 +146,10 @@ def SetGroupParams(opts, args): @return: the desired exit code """ - if (opts.ndparams is None and opts.alloc_policy is None - and not opts.diskparams): + if (opts.ndparams is None and opts.alloc_policy is None and + opts.mem_count_ispecs is None and opts.cpu_count_ispecs is None and + opts.disk_count_ispecs is None and opts.disk_size_ispecs is None and + opts.nic_count_ispecs is None and not opts.diskparams): ToStderr("Please give at least one of the parameters.") return 1 @@ -156,6 +158,38 @@ def SetGroupParams(opts, args): ndparams=opts.ndparams, alloc_policy=opts.alloc_policy, diskparams=diskparams) + + # set the default values + to_ipolicy = [ + opts.mem_count_ispecs, + opts.cpu_count_ispecs, + opts.disk_count_ispecs, + opts.disk_size_ispecs, + opts.nic_count_ispecs, + ] + for ispec in to_ipolicy: + for param in ispec: + if isinstance(ispec[param], basestring): + if ispec[param].lower() == "default": + ispec[param] = constants.VALUE_DEFAULT + # create ipolicy object + ipolicy = objects.CreateIPolicyFromOpts(\ + mem_count_ispecs=opts.mem_count_ispecs, + cpu_count_ispecs=opts.cpu_count_ispecs, + disk_count_ispecs=opts.disk_count_ispecs, + disk_size_ispecs=opts.disk_size_ispecs, + nic_count_ispecs=opts.nic_count_ispecs, + group_ipolicy=True, + allowed_values=[constants.VALUE_DEFAULT]) + for key in ipolicy.keys(): + utils.ForceDictType(ipolicy[key], constants.ISPECS_PARAMETER_TYPES, + allowed_values=[constants.VALUE_DEFAULT]) + + op = opcodes.OpGroupSetParams(group_name=args[0], + ndparams=opts.ndparams, + alloc_policy=opts.alloc_policy, + ipolicy=ipolicy) + result = SubmitOrSend(op, opts) if result: @@ -251,7 +285,8 @@ commands = { "modify": ( SetGroupParams, ARGS_ONE_GROUP, [DRY_RUN_OPT, SUBMIT_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, - DISK_PARAMS_OPT], + MEM_COUNT_SPECS_OPT, CPU_COUNT_SPECS_OPT, DISK_COUNT_SPECS_OPT, + DISK_SIZE_SPECS_OPT, NIC_COUNT_SPECS_OPT, DISK_PARAMS_OPT], "<group_name>", "Alters the parameters of a node group"), "remove": ( RemoveGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT], diff --git a/lib/cmdlib.py b/lib/cmdlib.py index eaa48c6..429c3c3 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -12947,6 +12947,7 @@ class LUGroupSetParams(LogicalUnit): self.op.ndparams, self.op.diskparams, self.op.alloc_policy, + self.op.ipolicy, ] if all_changes.count(None) == len(all_changes): @@ -12986,6 +12987,16 @@ class LUGroupSetParams(LogicalUnit): utils.ForceDictType(new_templ_params, constants.DISK_DT_TYPES) self.new_diskparams[templ] = new_templ_params + if self.op.ipolicy: + g_ipolicy = {} + for key, value in self.op.ipolicy.iteritems(): + g_ipolicy[key] = _GetUpdatedParams(self.group.ipolicy.get(key, {}), + value, + use_none=True) + utils.ForceDictType(g_ipolicy[key], constants.ISPECS_PARAMETER_TYPES) + self.new_ipolicy = g_ipolicy + objects.InstancePolicy.CheckParameterSyntax(self.new_ipolicy) + def BuildHooksEnv(self): """Build hooks env. @@ -13019,6 +13030,9 @@ class LUGroupSetParams(LogicalUnit): if self.op.alloc_policy: self.group.alloc_policy = self.op.alloc_policy + if self.op.ipolicy: + self.group.ipolicy = self.new_ipolicy + self.cfg.Update(self.group, feedback_fn) return result diff --git a/lib/opcodes.py b/lib/opcodes.py index d774eca..1a05da0 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -1436,6 +1436,7 @@ class OpGroupSetParams(OpCode): _PNodeGroupAllocPolicy, _PGroupNodeParams, _PDiskParams, + ("ipolicy", None, ht.TMaybeDict, "Group-wide instance policy specs"), ] OP_RESULT = _TSetParamsResult -- 1.7.3.1
