Revision 2cc673a3 lib/cmdlib.py

b/lib/cmdlib.py
721 721
  return params_copy
722 722

  
723 723

  
724
def _GetUpdatedIPolicy(old_ipolicy, new_ipolicy, group_policy=False):
725
  """Return the new version of a instance policy.
726

  
727
  @param group_policy: whether this policy applies to a group and thus
728
    we should support removal of policy entries
729

  
730
  """
731
  use_none = use_default = group_policy
732
  ipolicy = copy.deepcopy(old_ipolicy)
733
  for key, value in new_ipolicy.items():
734
    if key in constants.IPOLICY_PARAMETERS:
735
      utils.ForceDictType(value, constants.ISPECS_PARAMETER_TYPES)
736
      ipolicy[key] = _GetUpdatedParams(old_ipolicy.get(key, {}), value,
737
                                       use_none=use_none,
738
                                       use_default=use_default)
739
    else:
740
      # FIXME: we assume all others are lists; this should be redone
741
      # in a nicer way
742
      if not value or value == [constants.VALUE_DEFAULT]:
743
        if group_policy:
744
          del ipolicy[key]
745
        else:
746
          raise errors.OpPrereqError("Can't unset ipolicy attribute '%s'"
747
                                     " on the cluster'" % key,
748
                                     errors.ECODE_INVAL)
749
      else:
750
        logging.info("Setting %s to %s", key, value)
751
        ipolicy[key] = list(value)
752
  try:
753
    objects.InstancePolicy.CheckParameterSyntax(ipolicy)
754
  except errors.ConfigurationError, err:
755
    raise errors.OpPrereqError("Invalid instance policy: %s" % err,
756
                               errors.ECODE_INVAL)
757
  return ipolicy
758

  
759

  
724 760
def _UpdateAndVerifySubDict(base, updates, type_check):
725 761
  """Updates and verifies a dict with sub dicts of the same type.
726 762

  
......
3830 3866
             for storage, svalues in new_disk_state.items())
3831 3867

  
3832 3868
    if self.op.ipolicy:
3833
      ipolicy = {}
3834
      for key, value in self.op.ipolicy.items():
3835
        utils.ForceDictType(value, constants.ISPECS_PARAMETER_TYPES)
3836
        ipolicy[key] = _GetUpdatedParams(cluster.ipolicy.get(key, {}),
3837
                                          value)
3838
      try:
3839
        objects.InstancePolicy.CheckParameterSyntax(ipolicy)
3840
      except errors.ConfigurationError, err:
3841
        raise errors.OpPrereqError("Invalid instance policy: %s" % err,
3842
                                   errors.ECODE_INVAL)
3843
      self.new_ipolicy = ipolicy
3869
      self.new_ipolicy = _GetUpdatedIPolicy(cluster.ipolicy, self.op.ipolicy,
3870
                                            group_policy=False)
3844 3871

  
3845 3872
    if self.op.nicparams:
3846 3873
      utils.ForceDictType(self.op.nicparams, constants.NICS_PARAMETER_TYPES)
......
13306 13333
                                 self.group.disk_state_static)
13307 13334

  
13308 13335
    if self.op.ipolicy:
13309
      g_ipolicy = {}
13310
      for key, value in self.op.ipolicy.iteritems():
13311
        g_ipolicy[key] = _GetUpdatedParams(self.group.ipolicy.get(key, {}),
13312
                                           value,
13313
                                           use_none=True)
13314
        utils.ForceDictType(g_ipolicy[key], constants.ISPECS_PARAMETER_TYPES)
13315
      self.new_ipolicy = g_ipolicy
13316
      try:
13317
        objects.InstancePolicy.CheckParameterSyntax(self.new_ipolicy)
13318
      except errors.ConfigurationError, err:
13319
        raise errors.OpPrereqError("Invalid instance policy: %s" % err,
13320
                                   errors.ECODE_INVAL)
13336
      self.new_ipolicy = _GetUpdatedIPolicy(self.group.ipolicy,
13337
                                            self.op.ipolicy,
13338
                                            group_policy=True)
13321 13339

  
13322 13340
  def BuildHooksEnv(self):
13323 13341
    """Build hooks env.

Also available in: Unified diff