]> xenbits.xensource.com Git - osstest/openstack-nova.git/commitdiff
placement: adds ResourceClass.get_by_name()
authorJay Pipes <jaypipes@gmail.com>
Mon, 31 Oct 2016 12:58:38 +0000 (08:58 -0400)
committerJay Pipes <jaypipes@gmail.com>
Mon, 21 Nov 2016 22:07:24 +0000 (17:07 -0500)
The next patch in this series adds the ability to delete a custom
resource class. In order to implement that, we need a method to return a
single objects.ResourceClass object by string name. This patch adds that
method, implemented by using the resource class cache in a transparent
manner.

Change-Id: I92f84ed24518155a77f281057808750803c84889
blueprint: custom-resource-classes

nova/objects/resource_provider.py
nova/tests/functional/db/test_resource_provider.py

index 18ffa5a2c844a98f2f1f850d727f52b2711feb1d..244ab1abc05c23750833ad795574d51d59114791 100644 (file)
@@ -1070,6 +1070,20 @@ class ResourceClass(base.NovaObject):
         target.obj_reset_changes()
         return target
 
+    @classmethod
+    def get_by_name(cls, context, name):
+        """Return a ResourceClass object with the given string name.
+
+        :param name: String name of the resource class to find
+
+        :raises: ResourceClassNotFound if no such resource class was found
+        """
+        _ensure_rc_cache(context)
+        rc_id = _RC_CACHE.id_from_string(name)
+        obj = cls(context, id=rc_id, name=name)
+        obj.obj_reset_changes()
+        return obj
+
     @staticmethod
     @db_api.api_context_manager.reader
     def _get_next_id(context):
index 01a28b434dd425e0897e2ce9a72fb386b22e595f..443029cb931e3f91175164b92d90128ac61d5812 100644 (file)
@@ -1016,6 +1016,39 @@ class ResourceClassListTestCase(ResourceProviderBaseCase):
         expected_count = len(fields.ResourceClass.STANDARD) + len(customs)
         self.assertEqual(expected_count, len(rcs))
 
+
+class ResourceClassTestCase(ResourceProviderBaseCase):
+
+    def test_get_by_name(self):
+        rc = objects.ResourceClass.get_by_name(
+            self.context,
+            fields.ResourceClass.VCPU
+        )
+        vcpu_id = fields.ResourceClass.STANDARD.index(
+            fields.ResourceClass.VCPU
+        )
+        self.assertEqual(vcpu_id, rc.id)
+        self.assertEqual(fields.ResourceClass.VCPU, rc.name)
+
+    def test_get_by_name_not_found(self):
+        self.assertRaises(exception.ResourceClassNotFound,
+                          objects.ResourceClass.get_by_name,
+                          self.context,
+                          'CUSTOM_NO_EXISTS')
+
+    def test_get_by_name_custom(self):
+        rc = objects.ResourceClass(
+            self.context,
+            name='CUSTOM_IRON_NFV',
+        )
+        rc.create()
+        get_rc = objects.ResourceClass.get_by_name(
+            self.context,
+            'CUSTOM_IRON_NFV',
+        )
+        self.assertEqual(rc.id, get_rc.id)
+        self.assertEqual(rc.name, get_rc.name)
+
     def test_create_fail_not_using_namespace(self):
         rc = objects.ResourceClass(
             context=self.context,