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

Reply via email to