summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Smith <dansmith@redhat.com>2015-04-07 09:13:32 -0700
committerDan Smith <dansmith@redhat.com>2015-04-07 10:29:05 -0700
commitc741f98e048dc45f7f70232790b951b2b9ddf713 (patch)
treec4558c6ee071b8f3551920ba68c865233e68350a
parentbf70df295b0529da9f4381f52fc94d328fa2fdb3 (diff)
downloadnova-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.py17
-rw-r--r--nova/tests/unit/objects/test_fields.py6
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):