diff --git a/lib/client/gnt_cluster.py b/lib/client/gnt_cluster.py index 06fa258c0997007eac9af86dfcd22843f7b35e4f..2cdb6fb8af7dd020aac369809fd95223ae656750 100644 --- a/lib/client/gnt_cluster.py +++ b/lib/client/gnt_cluster.py @@ -921,7 +921,12 @@ def SetClusterParams(opts, args): opts.use_external_mip_script is not None or opts.prealloc_wipe_disks is not None or opts.hv_state or - opts.disk_state): + opts.disk_state or + opts.ispecs_mem_size is not None or + opts.ispecs_cpu_count is not None or + opts.ispecs_disk_count is not None or + opts.ispecs_disk_size is not None or + opts.ispecs_nic_count is not None): ToStderr("Please give at least one of the parameters.") return 1 @@ -965,6 +970,15 @@ def SetClusterParams(opts, args): if ndparams is not None: utils.ForceDictType(ndparams, constants.NDS_PARAMETER_TYPES) + ipolicy = \ + objects.CreateIPolicyFromOpts(ispecs_mem_size=opts.ispecs_mem_size, + ispecs_cpu_count=opts.ispecs_cpu_count, + ispecs_disk_count=opts.ispecs_disk_count, + ispecs_disk_size=opts.ispecs_disk_size, + ispecs_nic_count=opts.ispecs_nic_count) + for value in ipolicy.values(): + utils.ForceDictType(value, constants.ISPECS_PARAMETER_TYPES) + mnh = opts.maintain_node_health uid_pool = opts.uid_pool @@ -1010,6 +1024,7 @@ def SetClusterParams(opts, args): nicparams=nicparams, ndparams=ndparams, diskparams=diskparams, + ipolicy=ipolicy, candidate_pool_size=opts.candidate_pool_size, maintain_node_health=mnh, uid_pool=uid_pool, diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 646f0752cb955ed9f6e35ae0e48fd2ef63885323..b745ae4eccdca0340b9a8bc2c969373b5a05bce9 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3674,6 +3674,15 @@ class LUClusterSetParams(LogicalUnit): for name, values in svalues.items())) for storage, svalues in new_disk_state.items()) + if self.op.ipolicy: + ipolicy = {} + for key, value in self.op.ipolicy.items(): + utils.ForceDictType(value, constants.ISPECS_PARAMETER_TYPES) + ipolicy[key] = _GetUpdatedParams(cluster.ipolicy.get(key, {}), + value) + objects.InstancePolicy.CheckParameterSyntax(ipolicy) + self.new_ipolicy = ipolicy + if self.op.nicparams: utils.ForceDictType(self.op.nicparams, constants.NICS_PARAMETER_TYPES) self.new_nicparams = cluster.SimpleFillNIC(self.op.nicparams) @@ -3834,6 +3843,8 @@ class LUClusterSetParams(LogicalUnit): self.cluster.beparams[constants.PP_DEFAULT] = self.new_beparams if self.op.nicparams: self.cluster.nicparams[constants.PP_DEFAULT] = self.new_nicparams + if self.op.ipolicy: + self.cluster.ipolicy = self.new_ipolicy if self.op.osparams: self.cluster.osparams = self.new_osp if self.op.ndparams: diff --git a/lib/opcodes.py b/lib/opcodes.py index 8a7526c2655e50f5a937941715c08c2178656798..dddad97a4667810c6e5f90897d335a6763d2369a 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -793,6 +793,7 @@ class OpClusterSetParams(OpCode): "Whether to wipe disks before allocating them to instances"), ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"), ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"), + ("ipolicy", None, ht.TMaybeDict, "Cluster-wide instance policy specs"), ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"), ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone), "Default iallocator for cluster"),