Revision 919db916 lib/cli.py

b/lib/cli.py
189 189
  "SPECS_DISK_SIZE_OPT",
190 190
  "SPECS_MEM_SIZE_OPT",
191 191
  "SPECS_NIC_COUNT_OPT",
192
  "SPLIT_ISPECS_OPTS",
192 193
  "IPOLICY_STD_SPECS_OPT",
193 194
  "IPOLICY_DISK_TEMPLATES",
194 195
  "IPOLICY_VCPU_RATIO",
......
1657 1658

  
1658 1659
# common instance policy options
1659 1660
INSTANCE_POLICY_OPTS = [
1661
  IPOLICY_BOUNDS_SPECS_OPT,
1662
  IPOLICY_DISK_TEMPLATES,
1663
  IPOLICY_VCPU_RATIO,
1664
  IPOLICY_SPINDLE_RATIO,
1665
  ]
1666

  
1667
# instance policy split specs options
1668
SPLIT_ISPECS_OPTS = [
1660 1669
  SPECS_CPU_COUNT_OPT,
1661 1670
  SPECS_DISK_COUNT_OPT,
1662 1671
  SPECS_DISK_SIZE_OPT,
1663 1672
  SPECS_MEM_SIZE_OPT,
1664 1673
  SPECS_NIC_COUNT_OPT,
1665
  IPOLICY_BOUNDS_SPECS_OPT,
1666
  IPOLICY_DISK_TEMPLATES,
1667
  IPOLICY_VCPU_RATIO,
1668
  IPOLICY_SPINDLE_RATIO,
1669 1674
  ]
1670 1675

  
1671 1676

  
......
3846 3851

  
3847 3852
def _InitISpecsFromSplitOpts(ipolicy, ispecs_mem_size, ispecs_cpu_count,
3848 3853
                             ispecs_disk_count, ispecs_disk_size,
3849
                             ispecs_nic_count, group_ipolicy, allowed_values):
3854
                             ispecs_nic_count, group_ipolicy, fill_all):
3850 3855
  try:
3851 3856
    if ispecs_mem_size:
3852 3857
      ispecs_mem_size = _MaybeParseUnit(ispecs_mem_size)
......
3874 3879
    forced_type = TISPECS_CLUSTER_TYPES
3875 3880
  for specs in ispecs_transposed.values():
3876 3881
    assert type(specs) is dict
3877
    utils.ForceDictType(specs, forced_type, allowed_values=allowed_values)
3882
    utils.ForceDictType(specs, forced_type)
3878 3883

  
3879 3884
  # then transpose
3880 3885
  ispecs = {
......
3887 3892
    for key, val in specs.items(): # {min: .. ,max: .., std: ..}
3888 3893
      assert key in ispecs
3889 3894
      ispecs[key][name] = val
3895
  ipolicy[constants.ISPECS_MINMAX] = {}
3890 3896
  for key in constants.ISPECS_MINMAX_KEYS:
3891
    ipolicy[constants.ISPECS_MINMAX][key] = ispecs[key]
3892
  ipolicy[constants.ISPECS_STD] = ispecs[constants.ISPECS_STD]
3897
    if fill_all:
3898
      ipolicy[constants.ISPECS_MINMAX][key] = \
3899
        objects.FillDict(constants.ISPECS_MINMAX_DEFAULTS[key], ispecs[key])
3900
    else:
3901
      ipolicy[constants.ISPECS_MINMAX][key] = ispecs[key]
3902
  if fill_all:
3903
    ipolicy[constants.ISPECS_STD] = \
3904
        objects.FillDict(constants.IPOLICY_DEFAULTS[constants.ISPECS_STD],
3905
                         ispecs[constants.ISPECS_STD])
3906
  else:
3907
    ipolicy[constants.ISPECS_STD] = ispecs[constants.ISPECS_STD]
3893 3908

  
3894 3909

  
3895 3910
def _ParseSpecUnit(spec, keyname):
3896 3911
  ret = spec.copy()
3897 3912
  for k in [constants.ISPEC_DISK_SIZE, constants.ISPEC_MEM_SIZE]:
3898
    if k in ret and ret[k] != constants.VALUE_DEFAULT:
3913
    if k in ret:
3899 3914
      try:
3900 3915
        ret[k] = utils.ParseUnit(ret[k])
3901 3916
      except (TypeError, ValueError, errors.UnitParseError), err:
......
3905 3920
  return ret
3906 3921

  
3907 3922

  
3908
def _ParseISpec(spec, keyname, allowed_values):
3923
def _ParseISpec(spec, keyname, required):
3909 3924
  ret = _ParseSpecUnit(spec, keyname)
3910
  utils.ForceDictType(ret, constants.ISPECS_PARAMETER_TYPES,
3911
                      allowed_values=allowed_values)
3925
  utils.ForceDictType(ret, constants.ISPECS_PARAMETER_TYPES)
3926
  missing = constants.ISPECS_PARAMETERS - frozenset(ret.keys())
3927
  if required and missing:
3928
    raise errors.OpPrereqError("Missing parameters in ipolicy spec %s: %s" %
3929
                               (keyname, utils.CommaJoin(missing)),
3930
                               errors.ECODE_INVAL)
3931
  return ret
3932

  
3933

  
3934
def _GetISpecsInAllowedValues(minmax_ispecs, allowed_values):
3935
  ret = None
3936
  if minmax_ispecs and allowed_values and len(minmax_ispecs) == 1:
3937
    for (key, spec) in minmax_ispecs.items():
3938
      # This loop is executed exactly once
3939
      if key in allowed_values and not spec:
3940
        ret = key
3912 3941
  return ret
3913 3942

  
3914 3943

  
3915 3944
def _InitISpecsFromFullOpts(ipolicy_out, minmax_ispecs, std_ispecs,
3916 3945
                            group_ipolicy, allowed_values):
3917
  if minmax_ispecs is not None:
3946
  found_allowed = _GetISpecsInAllowedValues(minmax_ispecs, allowed_values)
3947
  if found_allowed is not None:
3948
    ipolicy_out[constants.ISPECS_MINMAX] = found_allowed
3949
  elif minmax_ispecs is not None:
3918 3950
    minmax_out = {}
3919 3951
    for (key, spec) in minmax_ispecs.items():
3920 3952
      if key not in constants.ISPECS_MINMAX_KEYS:
3921 3953
        msg = "Invalid key in bounds instance specifications: %s" % key
3922 3954
        raise errors.OpPrereqError(msg, errors.ECODE_INVAL)
3923
      minmax_out[key] = _ParseISpec(spec, key, allowed_values)
3955
      minmax_out[key] = _ParseISpec(spec, key, True)
3924 3956
    ipolicy_out[constants.ISPECS_MINMAX] = minmax_out
3925 3957
  if std_ispecs is not None:
3926 3958
    assert not group_ipolicy # This is not an option for gnt-group
3927
    ipolicy_out[constants.ISPECS_STD] = _ParseISpec(std_ispecs, "std",
3928
                                                    allowed_values)
3959
    ipolicy_out[constants.ISPECS_STD] = _ParseISpec(std_ispecs, "std", False)
3929 3960

  
3930 3961

  
3931 3962
def CreateIPolicyFromOpts(ispecs_mem_size=None,
......
3946 3977
  @param fill_all: whether for cluster policies we should ensure that
3947 3978
    all values are filled
3948 3979

  
3949

  
3950 3980
  """
3951
  if ((ispecs_mem_size or ispecs_cpu_count or ispecs_disk_count or
3952
       ispecs_disk_size or ispecs_nic_count) and
3953
      (minmax_ispecs is not None or std_ispecs is not None)):
3981
  assert not (fill_all and allowed_values)
3982

  
3983
  split_specs = (ispecs_mem_size or ispecs_cpu_count or ispecs_disk_count or
3984
                 ispecs_disk_size or ispecs_nic_count)
3985
  if (split_specs and (minmax_ispecs is not None or std_ispecs is not None)):
3954 3986
    raise errors.OpPrereqError("A --specs-xxx option cannot be specified"
3955 3987
                               " together with any --ipolicy-xxx-specs option",
3956 3988
                               errors.ECODE_INVAL)
3957 3989

  
3958 3990
  ipolicy_out = objects.MakeEmptyIPolicy()
3959
  if minmax_ispecs is None and std_ispecs is None:
3991
  if split_specs:
3992
    assert fill_all
3960 3993
    _InitISpecsFromSplitOpts(ipolicy_out, ispecs_mem_size, ispecs_cpu_count,
3961 3994
                             ispecs_disk_count, ispecs_disk_size,
3962
                             ispecs_nic_count, group_ipolicy, allowed_values)
3963
  else:
3995
                             ispecs_nic_count, group_ipolicy, fill_all)
3996
  elif (minmax_ispecs is not None or std_ispecs is not None):
3964 3997
    _InitISpecsFromFullOpts(ipolicy_out, minmax_ispecs, std_ispecs,
3965 3998
                            group_ipolicy, allowed_values)
3966 3999

  

Also available in: Unified diff