From: Izhar <[email protected]> This commit adds hypervisor parameters at the node group level. The command gnt-group now accepts hypervisor parameters and the node group hypervisor parameters options override the default options set at the cluster level.
Signed-off-by: Izhar <[email protected]> --- lib/client/gnt_group.py | 18 +++++++++++++++--- lib/cmdlib/group.py | 38 +++++++++++++++++++++++++++++++++++++- lib/objects.py | 1 + lib/opcodes.py | 8 ++++++++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/lib/client/gnt_group.py b/lib/client/gnt_group.py index 6cf5b6a..7edae2c 100644 --- a/lib/client/gnt_group.py +++ b/lib/client/gnt_group.py @@ -31,7 +31,7 @@ from ganeti import constants from ganeti import opcodes from ganeti import utils from ganeti import compat - +from ganeti import objects #: default list of fields for L{ListGroups} _LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"] @@ -64,9 +64,17 @@ def AddGroup(opts, args): disk_state = {} hv_state = dict(opts.hv_state) + #get hvparams + hypervisor = None + hvparams = {} + if opts.hypervisor: + hypervisor, hvparams = opts.hypervisor + utils.ForceDictType(hvparams, constants.HVS_PARAMETER_TYPES) op = opcodes.OpGroupAdd(group_name=group_name, ndparams=opts.ndparams, alloc_policy=opts.alloc_policy, diskparams=diskparams, ipolicy=ipolicy, + hypervisor=hypervisor, + hvparams=hvparams, hv_state=hv_state, disk_state=disk_state) SubmitOrSend(op, opts) @@ -182,10 +190,14 @@ def SetGroupParams(opts, args): group_ipolicy=True, allowed_values=[constants.VALUE_DEFAULT]) + if opts.hypervisor: + hypervisor, hvparams = opts.hypervisor op = opcodes.OpGroupSetParams(group_name=args[0], ndparams=opts.ndparams, alloc_policy=opts.alloc_policy, hv_state=hv_state, + hypervisor=hypervisor, + hvparams=hvparams, disk_state=disk_state, diskparams=diskparams, ipolicy=ipolicy) @@ -323,7 +335,7 @@ commands = { "add": ( AddGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, DISK_PARAMS_OPT, - HV_STATE_OPT, DISK_STATE_OPT, PRIORITY_OPT] + HV_STATE_OPT, DISK_STATE_OPT, HYPERVISOR_OPT, PRIORITY_OPT] + SUBMIT_OPTS + INSTANCE_POLICY_OPTS, "<group_name>", "Add a new node group to the cluster"), "assign-nodes": ( @@ -343,7 +355,7 @@ commands = { "modify": ( SetGroupParams, ARGS_ONE_GROUP, [DRY_RUN_OPT] + SUBMIT_OPTS + [ALLOC_POLICY_OPT, NODE_PARAMS_OPT, - HV_STATE_OPT, DISK_STATE_OPT, DISK_PARAMS_OPT, PRIORITY_OPT] + HV_STATE_OPT, DISK_STATE_OPT, DISK_PARAMS_OPT, HYPERVISOR_OPT, PRIORITY_OPT] + INSTANCE_POLICY_OPTS, "<group_name>", "Alters the parameters of a node group"), "remove": ( diff --git a/lib/cmdlib/group.py b/lib/cmdlib/group.py index 8419925..46e8c07 100644 --- a/lib/cmdlib/group.py +++ b/lib/cmdlib/group.py @@ -38,7 +38,8 @@ from ganeti.cmdlib.common import MergeAndVerifyHvState, \ MergeAndVerifyDiskState, GetWantedNodes, GetUpdatedParams, \ CheckNodeGroupInstances, GetUpdatedIPolicy, \ ComputeNewInstanceViolations, GetDefaultIAllocator, ShareAll, \ - CheckInstancesNodeGroups, LoadNodeEvacResult, MapInstanceLvsToNodes + CheckInstancesNodeGroups, LoadNodeEvacResult, CheckParamsNotGlobal, \ + MapInstanceLvsToNodes import ganeti.masterd.instance @@ -111,6 +112,20 @@ class LUGroupAdd(LogicalUnit): except errors.ConfigurationError, err: raise errors.OpPrereqError("Invalid instance policy: %s" % err, errors.ECODE_INVAL) + cluster = self.cfg.GetClusterInfo() + enabled_hvs = cluster.enabled_hypervisors + if self.op.hypervisor not in enabled_hvs: + raise errors.OpPrereqError("Selected hypervisor (%s) not enabled in the" + " cluster (%s)" % + (self.op.hypervisor, ",".join(enabled_hvs)), + errors.ECODE_STATE) + if self.op.hvparams: + filled_hvp=cluster.SimpleFillHV(self.op.hypervisor, self.op.os_type, + self.op.hvparams) + utils.ForceDictType(self.op.hvparams, constants.HVS_PARAMETER_TYPES) + CheckParamsNotGlobal(self.op.hvparams, constants.HVC_GLOBALS, "hypervisor", + "group", "cluster") + self.hv_full = filled_hvp def BuildHooksEnv(self): """Build hooks env. @@ -136,6 +151,7 @@ class LUGroupAdd(LogicalUnit): alloc_policy=self.op.alloc_policy, ndparams=self.op.ndparams, diskparams=self.new_diskparams, + hvparams=self.op.hvparams, ipolicy=self.op.ipolicy, hv_state_static=self.new_hv_state, disk_state_static=self.new_disk_state) @@ -387,6 +403,8 @@ class LUGroupSetParams(LogicalUnit): all_changes = [ self.op.ndparams, self.op.diskparams, + self.op.hypervisor, + self.op.hvparams, self.op.alloc_policy, self.op.hv_state, self.op.disk_state, @@ -465,6 +483,21 @@ class LUGroupSetParams(LogicalUnit): except errors.OpPrereqError, err: raise errors.OpPrereqError("While verify diskparams options: %s" % err, errors.ECODE_INVAL) + cluster = self.cfg.GetClusterInfo() + enabled_hvs = cluster.enabled_hypervisors + if self.op.hypervisor not in enabled_hvs: + raise errors.OpPrereqError("Selected hypervisor (%s) not enabled in the" + " cluster (%s)" % + (self.op.hypervisor, ",".join(enabled_hvs)), + errors.ECODE_STATE) + + self.new_hvparams = new_hvp = objects.FillDict(cluster.hvparams, {}) + if self.op.hvparams: + hv_name=self.op.hypervisor + utils.ForceDictType(self.op.hvparams, constants.HVS_PARAMETER_TYPES) + CheckParamsNotGlobal(self.op.hvparams, constants.HVC_GLOBALS, "hypervisor", + "group", "cluster") + self.new_hvparams[hv_name].update(self.op.hvparams) if self.op.hv_state: self.new_hv_state = MergeAndVerifyHvState(self.op.hv_state, @@ -535,6 +568,9 @@ class LUGroupSetParams(LogicalUnit): if self.op.ipolicy: self.group.ipolicy = self.new_ipolicy + if self.op.hvparams: + self.group.hvparams = self.new_hvparams + self.cfg.Update(self.group, feedback_fn) return result diff --git a/lib/objects.py b/lib/objects.py index 6105595..0443813 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -1445,6 +1445,7 @@ class NodeGroup(TaggableObject): "members", "ndparams", "diskparams", + "hvparams", "ipolicy", "serial_no", "hv_state_static", diff --git a/lib/opcodes.py b/lib/opcodes.py index 13da679..509dc61 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -1789,6 +1789,10 @@ class OpGroupAdd(OpCode): _PDiskState, ("ipolicy", None, ht.TMaybeDict, "Group-wide :ref:`instance policy <rapi-ipolicy>` specs"), + ("os_type", None, ht.TMaybeString, "Operating system"), + ("hvparams", ht.EmptyDict, ht.TDict, + "Hypervisor parameters for group, hypervisor-dependent"), + ("hypervisor", None, ht.TMaybeString, "Hypervisor") ] OP_RESULT = ht.TNone @@ -1828,6 +1832,10 @@ class OpGroupSetParams(OpCode): _PHvState, _PDiskState, ("ipolicy", None, ht.TMaybeDict, "Group-wide instance policy specs"), + ("os_type", None, ht.TMaybeString, "Operating system"), + ("hvparams", ht.EmptyDict, ht.TDict, + "Hypervisor parameters for group, hypervisor-dependent"), + ("hypervisor", None, ht.TMaybeString, "Hypervisor") ] OP_RESULT = _TSetParamsResult -- 1.7.2.5
