From 10889e0cba15a63ad508c3f79c41a5fd6bc1f417 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Nussbaumer?= <rn@google.com>
Date: Wed, 14 Dec 2011 14:39:49 +0100
Subject: [PATCH] gnt-instance: Adding instance policy to add
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: RenΓ© Nussbaumer <rn@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 lib/cli.py                 |  3 ++-
 lib/client/gnt_instance.py |  1 +
 lib/cmdlib.py              | 19 ++++++++++++++++++-
 lib/opcodes.py             |  1 +
 man/gnt-instance.rst       |  4 ++++
 5 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/lib/cli.py b/lib/cli.py
index 00cb0da68..ebf91c819 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -2309,7 +2309,8 @@ def GenericInstanceCreate(mode, opts, args):
                                 src_path=src_path,
                                 tags=tags,
                                 no_install=no_install,
-                                identify_defaults=identify_defaults)
+                                identify_defaults=identify_defaults,
+                                ignore_ipolicy=opts.ignore_ipolicy)
 
   SubmitOrSend(op, opts)
   return 0
diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py
index f6fb783fa..6fc1a0280 100644
--- a/lib/client/gnt_instance.py
+++ b/lib/client/gnt_instance.py
@@ -1422,6 +1422,7 @@ add_opts = [
   OS_OPT,
   FORCE_VARIANT_OPT,
   NO_INSTALL_OPT,
+  IGNORE_IPOLICY_OPT,
   ]
 
 commands = {
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 64c3a4f93..38fb083c5 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -9394,7 +9394,7 @@ class LUInstanceCreate(LogicalUnit):
       # pylint: disable=W0142
       self.instance_file_storage_dir = utils.PathJoin(*joinargs)
 
-  def CheckPrereq(self):
+  def CheckPrereq(self): # pylint: disable=R0914
     """Check prerequisites.
 
     """
@@ -9631,6 +9631,23 @@ class LUInstanceCreate(LogicalUnit):
 
     nodenames = [pnode.name] + self.secondaries
 
+    # Verify instance specs
+    ispec = {
+      constants.ISPEC_MEM_SIZE: self.be_full.get(constants.BE_MAXMEM, None),
+      constants.ISPEC_CPU_COUNT: self.be_full.get(constants.BE_VCPUS, None),
+      constants.ISPEC_DISK_COUNT: len(self.disks),
+      constants.ISPEC_DISK_SIZE: [disk.size for disk in self.disks],
+      constants.ISPEC_NIC_COUNT: len(self.nics),
+      }
+
+    ipolicy = _CalculateGroupIPolicy(cluster, pnode.group)
+    res = _ComputeIPolicyInstanceSpecViolation(ipolicy, ispec)
+    if not self.op.ignore_ipolicy and res:
+      raise errors.OpPrereqError(("Instance allocation to group %s violates"
+                                  " policy: %s") % (pnode.group,
+                                                    utils.CommaJoin(res)),
+                                  errors.ECODE_INVAL)
+
     # disk parameters (not customizable at instance or node level)
     # just use the primary node parameters, ignoring the secondary.
     self.diskparams = self.cfg.GetNodeGroup(pnode.group).diskparams
diff --git a/lib/opcodes.py b/lib/opcodes.py
index 5c6b01564..3f6a845cc 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -1086,6 +1086,7 @@ class OpInstanceCreate(OpCode):
     _PForceVariant,
     _PWaitForSync,
     _PNameCheck,
+    _PIgnoreIpolicy,
     ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
     ("disks", ht.NoDefault,
      # TODO: Generate check from constants.IDISK_PARAMS_TYPES
diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst
index 61ddd99d0..238cbd7ee 100644
--- a/man/gnt-instance.rst
+++ b/man/gnt-instance.rst
@@ -39,6 +39,7 @@ ADD
 | {{-n|--node} *node[:secondary-node]* \| {-I|--iallocator} *name*}
 | {{-o|--os-type} *os-type*}
 | [--submit]
+| [--ignore-ipolicy]
 | {*instance*}
 
 Creates a new instance on the specified host. The *instance* argument
@@ -629,6 +630,9 @@ The ``--submit`` option is used to send the job to the master daemon
 but not wait for its completion. The job ID will be shown so that it
 can be examined via **gnt-job info**.
 
+If ``--ignore-ipolicy`` is given any instance policy violations occuring
+during this operation are ignored.
+
 Example::
 
     # gnt-instance add -t file --disk 0:size=30g -B maxmem=512 -o debian-etch \
-- 
GitLab