Add a Set and SetOfIntegers object fields

Object fields that represent sets of things. Will be useful for NUMA
topology object which will be added in subsequent patches.

Change-Id: I66d61c760a70ad661dff4c40c6933df06192ee8f
Blueprint: virt-driver-numa-placement
This commit is contained in:
Nikola Dipanov 2014-08-22 18:42:48 +02:00 committed by Dan Smith
parent 2341ccb2ff
commit e72c5f7ea2
2 changed files with 56 additions and 0 deletions

View File

@ -434,6 +434,30 @@ class Dict(CompoundFieldType):
for key, val in sorted(value.items())]))
class Set(CompoundFieldType):
def coerce(self, obj, attr, value):
if not isinstance(value, set):
raise ValueError(_('A set is required here'))
coerced = set()
for element in value:
coerced.add(self._element_type.coerce(
obj, '%s["%s"]' % (attr, element), element))
return coerced
def to_primitive(self, obj, attr, value):
return tuple(
self._element_type.to_primitive(obj, attr, x) for x in value)
def from_primitive(self, obj, attr, value):
return set([self._element_type.from_primitive(obj, attr, x)
for x in value])
def stringify(self, value):
return 'set([%s])' % (
','.join([self._element_type.stringify(x) for x in value]))
class Object(FieldType):
def __init__(self, obj_name, **kwargs):
self._obj_name = obj_name
@ -575,6 +599,10 @@ class ListOfStringsField(AutoTypedField):
AUTO_TYPE = List(String())
class SetOfIntegersField(AutoTypedField):
AUTO_TYPE = Set(Integer())
class ListOfDictOfNullableStringsField(AutoTypedField):
AUTO_TYPE = List(Dict(String(), nullable=True))

View File

@ -271,6 +271,34 @@ class TestListOfStrings(TestField):
self.assertEqual("['abc']", self.field.stringify(['abc']))
class TestSet(TestField):
def setUp(self):
super(TestSet, self).setUp()
self.field = fields.Field(fields.Set(FakeFieldType()))
self.coerce_good_values = [(set(['foo', 'bar']),
set(['*foo*', '*bar*']))]
self.coerce_bad_values = [['foo'], {'foo': 'bar'}]
self.to_primitive_values = [(set(['foo']), tuple(['!foo!']))]
self.from_primitive_values = [(tuple(['!foo!']), set(['foo']))]
def test_stringify(self):
self.assertEqual('set([123])', self.field.stringify(set([123])))
class TestSetOfIntegers(TestField):
def setUp(self):
super(TestSetOfIntegers, self).setUp()
self.field = fields.SetOfIntegersField()
self.coerce_good_values = [(set(['1', 2]),
set([1, 2]))]
self.coerce_bad_values = [set(['foo'])]
self.to_primitive_values = [(set([1]), tuple([1]))]
self.from_primitive_values = [(tuple([1]), set([1]))]
def test_stringify(self):
self.assertEqual('set([1,2])', self.field.stringify(set([1, 2])))
class TestObject(TestField):
def setUp(self):
super(TestObject, self).setUp()