diff --git a/lib/cli.py b/lib/cli.py index 00cb0da68d74084d55442b7b5d0f8ff4d4cb5080..ebf91c81979fccb100e96409e7062e1081832009 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 f6fb783fa9df8ec07847a561a7df7c1efc2c39f6..6fc1a0280d29a110806e9833d0d62fab9d34b8fe 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 64c3a4f9365eec402aca633b55d8a5c33501f0d1..38fb083c53dc9e7744db527ab0f6b0e5244e9462 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 5c6b01564ffac8c7104c1d93f49c0eac36436363..3f6a845cc73d42c664732c690105f2325ba663d0 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 61ddd99d050a3911300fba6c3e57d46497f7c308..238cbd7ee06dd940cea958cc872a6e0fadb6584b 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 \