Define a ResourceClassField in object

This field defines a list of valid values for resource name.

Change-Id: I9cb9ad539c69a1547a20acc78d453027943a5a4d
This commit is contained in:
Hongbin Lu
2017-02-14 14:31:25 -06:00
parent c0cebba170
commit 51409e39f7
5 changed files with 54 additions and 5 deletions

View File

@@ -68,3 +68,23 @@ class Json(fields.FieldType):
class JsonField(fields.AutoTypedField):
AUTO_TYPE = Json()
class ResourceClass(fields.Enum):
ALL = (
VCPU, MEMORY_MB, DISK_GB, PCI_DEVICE, SRIOV_NET_VF,
NUMA_SOCKET, NUMA_CORE, NUMA_THREAD, NUMA_MEMORY_MB,
IPV4_ADDRESS
) = (
'VCPU', 'MEMORY_MB', 'DISK_GB', 'PCI_DEVICE', 'SRIOV_NET_VF',
'NUMA_SOCKET', 'NUMA_CORE', 'NUMA_THREAD', 'NUMA_MEMORY_MB',
'IPV4_ADDRESS'
)
def __init__(self):
super(ResourceClass, self).__init__(
valid_values=ResourceClass.ALL)
class ResourceClassField(fields.AutoTypedField):
AUTO_TYPE = ResourceClass()

View File

@@ -14,6 +14,7 @@ from oslo_versionedobjects import fields
from zun.db import api as dbapi
from zun.objects import base
from zun.objects import fields as z_fields
@base.ZunObjectRegistry.register
@@ -23,7 +24,7 @@ class ResourceClass(base.ZunPersistentObject, base.ZunObject):
fields = {
'id': fields.IntegerField(read_only=True),
'name': fields.StringField(nullable=False),
'name': z_fields.ResourceClassField(nullable=False),
}
@staticmethod

View File

@@ -172,7 +172,7 @@ def create_test_resource_provider(**kw):
def get_test_resource_class(**kw):
return {
'id': kw.get('id', 42),
'name': kw.get('name', 'resource1'),
'name': kw.get('name', 'VCPU'),
'created_at': kw.get('created_at'),
'updated_at': kw.get('updated_at'),
}

View File

@@ -58,3 +58,31 @@ class TestTaskState(test_fields.TestField):
def test_stringify_invalid(self):
self.assertRaises(ValueError, self.field.stringify, 'bad_value')
class TestResourceClass(test_fields.TestField):
def setUp(self):
super(TestResourceClass, self).setUp()
self.field = fields.ResourceClass()
self.coerce_good_values = [
('VCPU', 'VCPU'),
('MEMORY_MB', 'MEMORY_MB'),
('DISK_GB', 'DISK_GB'),
('PCI_DEVICE', 'PCI_DEVICE'),
('SRIOV_NET_VF', 'SRIOV_NET_VF'),
('NUMA_SOCKET', 'NUMA_SOCKET'),
('NUMA_CORE', 'NUMA_CORE'),
('NUMA_THREAD', 'NUMA_THREAD'),
('NUMA_MEMORY_MB', 'NUMA_MEMORY_MB'),
('IPV4_ADDRESS', 'IPV4_ADDRESS'),
]
self.coerce_bad_values = ['bad_value']
self.to_primitive_values = self.coerce_good_values[0:1]
self.from_primitive_values = self.coerce_good_values[0:1]
def test_stringify(self):
self.assertEqual("'VCPU'",
self.field.stringify('VCPU'))
def test_stringify_invalid(self):
self.assertRaises(ValueError, self.field.stringify, 'bad_value')

View File

@@ -90,20 +90,20 @@ class TestResourceClassObject(base.DbTestCase):
autospec=True) as mock_update:
resource = objects.ResourceClass.get_by_id(
self.context, rc_id)
resource.name = 'resourc_class2'
resource.name = 'MEMORY_MB'
resource.save()
mock_get_resource_class.assert_called_once_with(
self.context, rc_id)
mock_update.assert_called_once_with(
None, rc_id,
{'name': 'resourc_class2'})
{'name': 'MEMORY_MB'})
self.assertEqual(self.context, resource._context)
def test_refresh(self):
rc_id = self.fake_resource['id']
name = self.fake_resource['name']
new_name = 'new_name'
new_name = 'MEMORY_MB'
returns = [dict(self.fake_resource, name=name),
dict(self.fake_resource, name=new_name)]
expected = [mock.call(self.context, rc_id),