]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
ReST API: Add an API for retrieving resource schemata
authorZane Bitter <zbitter@redhat.com>
Mon, 12 Aug 2013 07:51:39 +0000 (09:51 +0200)
committerZane Bitter <zbitter@redhat.com>
Mon, 12 Aug 2013 07:51:45 +0000 (09:51 +0200)
blueprint resource-properties-schema

Change-Id: I07523a5996eea37a414310c21414be6454d08bfe

heat/api/openstack/v1/__init__.py
heat/api/openstack/v1/stacks.py
heat/tests/test_api_openstack_v1.py

index f21f89b83fc256c725cf76d5ba156af51285b93d..caf36274f01ea3bf2e6c400f59dfd10a1c6dac17 100644 (file)
@@ -49,6 +49,10 @@ class API(wsgi.Router):
                                  "/resource_types",
                                  action="list_resource_types",
                                  conditions={'method': 'GET'})
+            stack_mapper.connect("resource_schema",
+                                 "/resource_types/{type_name}",
+                                 action="resource_schema",
+                                 conditions={'method': 'GET'})
             stack_mapper.connect("generate_template",
                                  "/resource_types/{type_name}/template",
                                  action="generate_template",
index a79db25a9f4e05b39d805086d5cc53c1fd61a46b..22d97166f278cd0981be2ead21b5b778f84a4d96 100644 (file)
@@ -330,6 +330,13 @@ class StackController(object):
         """
         return {'resource_types': self.engine.list_resource_types(req.context)}
 
+    @util.tenant_local
+    def resource_schema(self, req, type_name):
+        """
+        Returns the schema of the given resource type.
+        """
+        return self.engine.resource_schema(req.context, type_name)
+
     @util.tenant_local
     def generate_template(self, req, type_name):
         """
index 24be6294207443dae546bb3b2612ec1acae9b0e0..4b36e0c0b7954e432676080ee7c854aad3c64473 100644 (file)
@@ -1167,10 +1167,6 @@ class StackControllerTest(ControllerTest, HeatTestCase):
     def test_list_resource_types_error(self):
         req = self._get('/resource_types')
 
-        engine_response = ['AWS::EC2::Instance',
-                           'AWS::EC2::EIP',
-                           'AWS::EC2::EIPAssociation']
-
         error = heat_exc.ServerError(body='')
         self.m.StubOutWithMock(rpc, 'call')
         rpc.call(req.context, self.topic,
@@ -1188,6 +1184,56 @@ class StackControllerTest(ControllerTest, HeatTestCase):
         self.assertEqual(resp.json['error']['type'], 'ServerError')
         self.m.VerifyAll()
 
+    def test_resource_schema(self):
+        req = self._get('/resource_types/ResourceWithProps')
+        type_name = 'ResourceWithProps'
+
+        engine_response = {
+            'resource_type': type_name,
+            'properties': {
+                'Foo': {'type': 'string', 'required': False},
+            },
+            'attributes': {
+                'foo': {'description': 'A generic attribute'},
+                'Foo': {'description': 'Another generic attribute'},
+            },
+        }
+        self.m.StubOutWithMock(rpc, 'call')
+        rpc.call(req.context, self.topic,
+                 {'namespace': None,
+                  'method': 'resource_schema',
+                  'args': {'type_name': type_name},
+                  'version': self.api_version},
+                 None).AndReturn(engine_response)
+        self.m.ReplayAll()
+        response = self.controller.resource_schema(req,
+                                                   tenant_id=self.tenant,
+                                                   type_name=type_name)
+        self.assertEqual(response, engine_response)
+        self.m.VerifyAll()
+
+    def test_resource_schema_nonexist(self):
+        req = self._get('/resource_types/BogusResourceType')
+        type_name = 'BogusResourceType'
+
+        error = heat_exc.ResourceTypeNotFound(type_name='BogusResourceType')
+        self.m.StubOutWithMock(rpc, 'call')
+        rpc.call(req.context, self.topic,
+                 {'namespace': None,
+                  'method': 'resource_schema',
+                  'args': {'type_name': type_name},
+                  'version': self.api_version},
+                 None).AndRaise(to_remote_error(error))
+        self.m.ReplayAll()
+
+        resp = request_with_middleware(fault.FaultWrapper,
+                                       self.controller.resource_schema,
+                                       req, tenant_id=self.tenant,
+                                       type_name=type_name)
+        self.assertEqual(resp.json['code'], 404)
+        self.assertEqual(resp.json['error']['type'], 'ResourceTypeNotFound')
+        self.m.VerifyAll()
+
     def test_generate_template(self):
 
         req = self._get('/resource_types/TEST_TYPE/template')
@@ -2052,6 +2098,17 @@ class RoutesTest(HeatTestCase):
                 'tenant_id': 'aaaa',
             })
 
+        self.assertRoute(
+            self.m,
+            '/aaaa/resource_types/test_type',
+            'GET',
+            'resource_schema',
+            'StackController',
+            {
+                'tenant_id': 'aaaa',
+                'type_name': 'test_type'
+            })
+
         self.assertRoute(
             self.m,
             '/aaaa/resource_types/test_type/template',