Revision 0f511c8a lib/objects.py

b/lib/objects.py
82 82
  return ret_dict
83 83

  
84 84

  
85
def _FillMinMaxISpecs(default_specs, custom_specs):
86
  assert frozenset(default_specs.keys()) == constants.ISPECS_MINMAX_KEYS
87
  ret_specs = {}
88
  for key in constants.ISPECS_MINMAX_KEYS:
89
    ret_specs[key] = FillDict(default_specs[key],
90
                              custom_specs.get(key, {}))
91
  return ret_specs
92

  
93

  
94 85
def FillIPolicy(default_ipolicy, custom_ipolicy):
95 86
  """Fills an instance policy with defaults.
96 87

  
97 88
  """
98 89
  assert frozenset(default_ipolicy.keys()) == constants.IPOLICY_ALL_KEYS
99
  ret_dict = {}
100
  # Instance specs
101
  new_mm = _FillMinMaxISpecs(default_ipolicy[constants.ISPECS_MINMAX],
102
                             custom_ipolicy.get(constants.ISPECS_MINMAX, {}))
103
  ret_dict[constants.ISPECS_MINMAX] = new_mm
104
  new_std = FillDict(default_ipolicy[constants.ISPECS_STD],
105
                     custom_ipolicy.get(constants.ISPECS_STD, {}))
106
  ret_dict[constants.ISPECS_STD] = new_std
107
  # list items
108
  for key in [constants.IPOLICY_DTS]:
109
    ret_dict[key] = list(custom_ipolicy.get(key, default_ipolicy[key]))
110
  # other items which we know we can directly copy (immutables)
111
  for key in constants.IPOLICY_PARAMETERS:
112
    ret_dict[key] = custom_ipolicy.get(key, default_ipolicy[key])
113

  
90
  ret_dict = copy.deepcopy(custom_ipolicy)
91
  for key in default_ipolicy:
92
    if key not in ret_dict:
93
      ret_dict[key] = copy.deepcopy(default_ipolicy[key])
94
    elif key == constants.ISPECS_STD:
95
      ret_dict[key] = FillDict(default_ipolicy[key], ret_dict[key])
114 96
  return ret_dict
115 97

  
116 98

  
......
198 180
  """Create empty IPolicy dictionary.
199 181

  
200 182
  """
201
  return {
202
    constants.ISPECS_MINMAX: {
203
      constants.ISPECS_MIN: {},
204
      constants.ISPECS_MAX: {},
205
      },
206
    constants.ISPECS_STD: {},
207
    }
183
  return {}
208 184

  
209 185

  
210 186
class ConfigObject(outils.ValidatedSlots):
......
954 930
                                      utils.CommaJoin(wrong_keys))
955 931

  
956 932
  @classmethod
933
  def _CheckIncompleteSpec(cls, spec, keyname):
934
    missing_params = constants.ISPECS_PARAMETERS - frozenset(spec.keys())
935
    if missing_params:
936
      msg = ("Missing instance specs parameters for %s: %s" %
937
             (keyname, utils.CommaJoin(missing_params)))
938
      raise errors.ConfigurationError(msg)
939

  
940
  @classmethod
957 941
  def CheckISpecSyntax(cls, ipolicy, check_std):
958 942
    """Check the instance policy specs for validity.
959 943

  
......
977 961
    if missing:
978 962
      msg = "Missing instance specification: %s" % utils.CommaJoin(missing)
979 963
      raise errors.ConfigurationError(msg)
964
    for (key, spec) in minmaxspecs.items():
965
      InstancePolicy._CheckIncompleteSpec(spec, key)
966
    if check_std:
967
      InstancePolicy._CheckIncompleteSpec(stdspec, constants.ISPECS_STD)
980 968
    for param in constants.ISPECS_PARAMETERS:
981 969
      InstancePolicy._CheckISpecParamSyntax(minmaxspecs, stdspec, param,
982 970
                                            check_std)
......
1002 990
    """
1003 991
    minspec = minmaxspecs[constants.ISPECS_MIN]
1004 992
    maxspec = minmaxspecs[constants.ISPECS_MAX]
1005
    min_v = minspec.get(name, 0)
993
    min_v = minspec[name]
1006 994

  
1007 995
    if check_std:
1008 996
      std_v = stdspec.get(name, min_v)
......
1011 999
      std_v = min_v
1012 1000
      std_msg = "-"
1013 1001

  
1014
    max_v = maxspec.get(name, std_v)
1002
    max_v = maxspec[name]
1015 1003
    if min_v > std_v or std_v > max_v:
1016 1004
      err = ("Invalid specification of min/max/std values for %s: %s/%s/%s" %
1017
             (name,
1018
              minspec.get(name, "-"),
1019
              maxspec.get(name, "-"),
1020
              std_msg))
1005
             (name, min_v, max_v, std_msg))
1021 1006
      raise errors.ConfigurationError(err)
1022 1007

  
1023 1008
  @classmethod

Also available in: Unified diff