diff options
author | Dan Smith <dansmith@redhat.com> | 2015-04-07 09:13:32 -0700 |
---|---|---|
committer | Dan Smith <dansmith@redhat.com> | 2015-04-07 10:29:05 -0700 |
commit | c741f98e048dc45f7f70232790b951b2b9ddf713 (patch) | |
tree | c4558c6ee071b8f3551920ba68c865233e68350a | |
parent | bf70df295b0529da9f4381f52fc94d328fa2fdb3 (diff) | |
download | nova-c741f98e048dc45f7f70232790b951b2b9ddf713.tar.gz |
Fix Enum field, which allows unrestricted values
For some reason, the Enum field allows valid_values to be None, which disables
all the is-this-a-valid-value checking, thus defeating the entire purpose of
the type. This patch removes that possibility so that we don't let anything
creep into the RPC-affecting API that would be unrestricted.
The change that introduced this was I7848f8b934c169a76b1cfd875f7905273f9f914b
Closes-Bug: #1441243
Change-Id: Ia33994402cca5b4569d72860ab5da675134f5a95
-rw-r--r-- | nova/objects/fields.py | 17 | ||||
-rw-r--r-- | nova/tests/unit/objects/test_fields.py | 6 |
2 files changed, 18 insertions, 5 deletions
diff --git a/nova/objects/fields.py b/nova/objects/fields.py index 5c3664ef4f..f2d348c68a 100644 --- a/nova/objects/fields.py +++ b/nova/objects/fields.py @@ -254,18 +254,25 @@ class String(FieldType): class Enum(String): - def __init__(self, valid_values=None, **kwargs): + def __init__(self, valid_values, **kwargs): + try: + length = len(valid_values) + except TypeError: + raise ValueError('valid_values is not a sequence' + ' of permitted values') + if length == 0: + raise ValueError('valid_values may not be empty') self._valid_values = valid_values super(Enum, self).__init__(**kwargs) def coerce(self, obj, attr, value): - if self._valid_values and value not in self._valid_values: + if value not in self._valid_values: msg = _("Field value %s is invalid") % value raise ValueError(msg) return super(Enum, self).coerce(obj, attr, value) def stringify(self, value): - if self._valid_values and value not in self._valid_values: + if value not in self._valid_values: msg = _("Field value %s is invalid") % value raise ValueError(msg) return super(Enum, self).stringify(value) @@ -592,7 +599,7 @@ class StringField(AutoTypedField): class EnumField(AutoTypedField): - def __init__(self, valid_values=None, **kwargs): + def __init__(self, valid_values, **kwargs): self.AUTO_TYPE = Enum(valid_values=valid_values) super(EnumField, self).__init__(**kwargs) @@ -674,7 +681,7 @@ class ListOfStringsField(AutoTypedField): class ListOfEnumField(AutoTypedField): - def __init__(self, valid_values=None, **kwargs): + def __init__(self, valid_values, **kwargs): self.AUTO_TYPE = List(Enum(valid_values=valid_values)) super(ListOfEnumField, self).__init__(**kwargs) diff --git a/nova/tests/unit/objects/test_fields.py b/nova/tests/unit/objects/test_fields.py index 0c093748e8..efa68beaa5 100644 --- a/nova/tests/unit/objects/test_fields.py +++ b/nova/tests/unit/objects/test_fields.py @@ -108,6 +108,12 @@ class TestEnum(TestField): field2 = fields.EnumField(valid_values=['foo', 'bar1']) self.assertNotEqual(str(field1), str(field2)) + def test_without_valid_values(self): + self.assertRaises(ValueError, fields.EnumField, 1) + + def test_with_empty_values(self): + self.assertRaises(ValueError, fields.EnumField, []) + class TestInteger(TestField): def setUp(self): |