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

Reply via email to