Commit b342c9dd authored by Bernardo Dal Seno's avatar Bernardo Dal Seno

Separate checks for std spec compliance

This is needed to be able to validate the std spec against multiple min/max
spec pairs (appearing in next patches).
Signed-off-by: default avatarBernardo Dal Seno <bdalseno@google.com>
Reviewed-by: default avatarHelga Velroyen <helgav@google.com>
parent ec996117
......@@ -955,19 +955,25 @@ class InstancePolicy(ConfigObject):
if check_std and constants.ISPECS_STD not in ipolicy:
msg = "Missing key in ipolicy: %s" % constants.ISPECS_STD
raise errors.ConfigurationError(msg)
minmaxspecs = ipolicy[constants.ISPECS_MINMAX]
stdspec = ipolicy.get(constants.ISPECS_STD)
if check_std:
InstancePolicy._CheckIncompleteSpec(stdspec, constants.ISPECS_STD)
minmaxspecs = ipolicy[constants.ISPECS_MINMAX]
missing = constants.ISPECS_MINMAX_KEYS - frozenset(minmaxspecs.keys())
if missing:
msg = "Missing instance specification: %s" % utils.CommaJoin(missing)
raise errors.ConfigurationError(msg)
for (key, spec) in minmaxspecs.items():
InstancePolicy._CheckIncompleteSpec(spec, key)
if check_std:
InstancePolicy._CheckIncompleteSpec(stdspec, constants.ISPECS_STD)
spec_std_ok = True
for param in constants.ISPECS_PARAMETERS:
InstancePolicy._CheckISpecParamSyntax(minmaxspecs, stdspec, param,
check_std)
par_std_ok = InstancePolicy._CheckISpecParamSyntax(minmaxspecs, stdspec,
param, check_std)
spec_std_ok = spec_std_ok and par_std_ok
if not spec_std_ok:
raise errors.ConfigurationError("Invalid std specifications")
@classmethod
def _CheckISpecParamSyntax(cls, minmaxspecs, stdspec, name, check_std):
......@@ -984,26 +990,27 @@ class InstancePolicy(ConfigObject):
@param name: what are the limits for
@type check_std: bool
@param check_std: Whether to check std value or just assume compliance
@raise errors.ConfigurationError: when specs for the given name are not
valid
@rtype: bool
@return: C{True} when specs are valid, C{False} when standard spec for the
given name is not valid
@raise errors.ConfigurationError: when min/max specs for the given name
are not valid
"""
minspec = minmaxspecs[constants.ISPECS_MIN]
maxspec = minmaxspecs[constants.ISPECS_MAX]
min_v = minspec[name]
max_v = maxspec[name]
if check_std:
if min_v > max_v:
err = ("Invalid specification of min/max values for %s: %s/%s" %
(name, min_v, max_v))
raise errors.ConfigurationError(err)
elif check_std:
std_v = stdspec.get(name, min_v)
std_msg = std_v
return std_v >= min_v and std_v <= max_v
else:
std_v = min_v
std_msg = "-"
max_v = maxspec[name]
if min_v > std_v or std_v > max_v:
err = ("Invalid specification of min/max/std values for %s: %s/%s/%s" %
(name, min_v, max_v, std_msg))
raise errors.ConfigurationError(err)
return True
@classmethod
def CheckDiskTemplates(cls, disk_templates):
......
......@@ -428,22 +428,23 @@ class TestInstancePolicy(unittest.TestCase):
self._AssertIPolicyIsFull(constants.IPOLICY_DEFAULTS)
def testCheckISpecSyntax(self):
default_stdspec = constants.IPOLICY_DEFAULTS[constants.ISPECS_STD]
incomplete_ipolicies = [
{
constants.ISPECS_MINMAX: {},
constants.ISPECS_STD: NotImplemented,
constants.ISPECS_STD: default_stdspec,
},
{
constants.ISPECS_MINMAX: {
constants.ISPECS_MIN: NotImplemented,
},
constants.ISPECS_STD: NotImplemented,
constants.ISPECS_STD: default_stdspec,
},
{
constants.ISPECS_MINMAX: {
constants.ISPECS_MAX: NotImplemented,
},
constants.ISPECS_STD: NotImplemented,
constants.ISPECS_STD: default_stdspec,
},
{
constants.ISPECS_MINMAX: {
......@@ -488,22 +489,27 @@ class TestInstancePolicy(unittest.TestCase):
stdspec = {par: st}
objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec, par, True)
bad_values = [
(11, 11, 5),
(40, 11, 11),
(11, 80, 40),
(11, 5, 40),
(11, 5, 5),
(40, 40, 11),
(11, 11, 5, True),
(40, 11, 11, True),
(11, 80, 40, False),
(11, 5, 40, False,),
(11, 5, 5, True),
(40, 40, 11, True),
]
for (mn, st, mx) in bad_values:
for (mn, st, mx, excp) in bad_values:
minmax = {
constants.ISPECS_MIN: {par: mn},
constants.ISPECS_MAX: {par: mx},
}
stdspec = {par: st}
self.assertRaises(errors.ConfigurationError,
objects.InstancePolicy._CheckISpecParamSyntax,
minmax, stdspec, par, True)
if excp:
self.assertRaises(errors.ConfigurationError,
objects.InstancePolicy._CheckISpecParamSyntax,
minmax, stdspec, par, True)
else:
ret = objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec,
par, True)
self.assertFalse(ret)
def testCheckDiskTemplates(self):
invalid = "this_is_not_a_good_template"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment