Revision d2d3935a lib/cli.py

b/lib/cli.py
188 188
  "SPECS_DISK_SIZE_OPT",
189 189
  "SPECS_MEM_SIZE_OPT",
190 190
  "SPECS_NIC_COUNT_OPT",
191
  "IPOLICY_STD_SPECS_OPT",
191 192
  "IPOLICY_DISK_TEMPLATES",
192 193
  "IPOLICY_VCPU_RATIO",
193 194
  "SPICE_CACERT_OPT",
......
957 958
                                 help="NIC count specs: list of key=value,"
958 959
                                 " where key is one of min, max, std")
959 960

  
961
IPOLICY_BOUNDS_SPECS_STR = "--ipolicy-bounds-specs"
962
IPOLICY_BOUNDS_SPECS_OPT = cli_option(IPOLICY_BOUNDS_SPECS_STR,
963
                                      dest="ipolicy_bounds_specs",
964
                                      type="listidentkeyval", default=None,
965
                                      help="Complete instance specs limits")
966

  
967
IPOLICY_STD_SPECS_STR = "--ipolicy-std-specs"
968
IPOLICY_STD_SPECS_OPT = cli_option(IPOLICY_STD_SPECS_STR,
969
                                   dest="ipolicy_std_specs",
970
                                   type="keyval", default=None,
971
                                   help="Complte standard instance specs")
972

  
960 973
IPOLICY_DISK_TEMPLATES = cli_option("--ipolicy-disk-templates",
961 974
                                    dest="ipolicy_disk_templates",
962 975
                                    type="list", default=None,
......
1643 1656
  SPECS_DISK_SIZE_OPT,
1644 1657
  SPECS_MEM_SIZE_OPT,
1645 1658
  SPECS_NIC_COUNT_OPT,
1659
  IPOLICY_BOUNDS_SPECS_OPT,
1646 1660
  IPOLICY_DISK_TEMPLATES,
1647 1661
  IPOLICY_VCPU_RATIO,
1648 1662
  IPOLICY_SPINDLE_RATIO,
......
3789 3803
  return parsed
3790 3804

  
3791 3805

  
3792
def _InitIspecsFromOpts(ipolicy, ispecs_mem_size, ispecs_cpu_count,
3793
                        ispecs_disk_count, ispecs_disk_size, ispecs_nic_count,
3794
                        group_ipolicy, allowed_values):
3806
def _InitISpecsFromSplitOpts(ipolicy, ispecs_mem_size, ispecs_cpu_count,
3807
                             ispecs_disk_count, ispecs_disk_size,
3808
                             ispecs_nic_count, group_ipolicy, allowed_values):
3795 3809
  try:
3796 3810
    if ispecs_mem_size:
3797 3811
      ispecs_mem_size = _MaybeParseUnit(ispecs_mem_size)
......
3818 3832
  else:
3819 3833
    forced_type = TISPECS_CLUSTER_TYPES
3820 3834
  for specs in ispecs_transposed.values():
3835
    assert type(specs) is dict
3821 3836
    utils.ForceDictType(specs, forced_type, allowed_values=allowed_values)
3822 3837

  
3823 3838
  # then transpose
......
3836 3851
  ipolicy[constants.ISPECS_STD] = ispecs[constants.ISPECS_STD]
3837 3852

  
3838 3853

  
3854
def _ParseSpecUnit(spec, keyname):
3855
  ret = spec.copy()
3856
  for k in [constants.ISPEC_DISK_SIZE, constants.ISPEC_MEM_SIZE]:
3857
    if k in ret and ret[k] != constants.VALUE_DEFAULT:
3858
      try:
3859
        ret[k] = utils.ParseUnit(ret[k])
3860
      except (TypeError, ValueError, errors.UnitParseError), err:
3861
        raise errors.OpPrereqError(("Invalid parameter %s (%s) in %s instance"
3862
                                    " specs: %s" % (k, ret[k], keyname, err)),
3863
                                   errors.ECODE_INVAL)
3864
  return ret
3865

  
3866

  
3867
def _ParseISpec(spec, keyname, allowed_values):
3868
  ret = _ParseSpecUnit(spec, keyname)
3869
  utils.ForceDictType(ret, constants.ISPECS_PARAMETER_TYPES,
3870
                      allowed_values=allowed_values)
3871
  return ret
3872

  
3873

  
3874
def _InitISpecsFromFullOpts(ipolicy_out, minmax_ispecs, std_ispecs,
3875
                            group_ipolicy, allowed_values):
3876
  if minmax_ispecs is not None:
3877
    minmax_out = {}
3878
    for (key, spec) in minmax_ispecs.items():
3879
      if key not in constants.ISPECS_MINMAX_KEYS:
3880
        msg = "Invalid key in bounds instance specifications: %s" % key
3881
        raise errors.OpPrereqError(msg, errors.ECODE_INVAL)
3882
      minmax_out[key] = _ParseISpec(spec, key, allowed_values)
3883
    ipolicy_out[constants.ISPECS_MINMAX] = minmax_out
3884
  if std_ispecs is not None:
3885
    assert not group_ipolicy # This is not an option for gnt-group
3886
    ipolicy_out[constants.ISPECS_STD] = _ParseISpec(std_ispecs, "std",
3887
                                                    allowed_values)
3888

  
3889

  
3839 3890
def CreateIPolicyFromOpts(ispecs_mem_size=None,
3840 3891
                          ispecs_cpu_count=None,
3841 3892
                          ispecs_disk_count=None,
3842 3893
                          ispecs_disk_size=None,
3843 3894
                          ispecs_nic_count=None,
3895
                          minmax_ispecs=None,
3896
                          std_ispecs=None,
3844 3897
                          ipolicy_disk_templates=None,
3845 3898
                          ipolicy_vcpu_ratio=None,
3846 3899
                          ipolicy_spindle_ratio=None,
......
3854 3907

  
3855 3908

  
3856 3909
  """
3910
  if ((ispecs_mem_size or ispecs_cpu_count or ispecs_disk_count or
3911
       ispecs_disk_size or ispecs_nic_count) and
3912
      (minmax_ispecs is not None or std_ispecs is not None)):
3913
    raise errors.OpPrereqError("A --specs-xxx option cannot be specified"
3914
                               " together with any --ipolicy-xxx-specs option",
3915
                               errors.ECODE_INVAL)
3857 3916

  
3858 3917
  ipolicy_out = objects.MakeEmptyIPolicy()
3859
  _InitIspecsFromOpts(ipolicy_out, ispecs_mem_size, ispecs_cpu_count,
3860
                      ispecs_disk_count, ispecs_disk_size, ispecs_nic_count,
3861
                      group_ipolicy, allowed_values)
3918
  if minmax_ispecs is None and std_ispecs is None:
3919
    _InitISpecsFromSplitOpts(ipolicy_out, ispecs_mem_size, ispecs_cpu_count,
3920
                             ispecs_disk_count, ispecs_disk_size,
3921
                             ispecs_nic_count, group_ipolicy, allowed_values)
3922
  else:
3923
    _InitISpecsFromFullOpts(ipolicy_out, minmax_ispecs, std_ispecs,
3924
                            group_ipolicy, allowed_values)
3862 3925

  
3863 3926
  if ipolicy_disk_templates is not None:
3864 3927
    if allowed_values and ipolicy_disk_templates in allowed_values:

Also available in: Unified diff