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