From: Zane Bitter Date: Mon, 12 Aug 2013 07:51:39 +0000 (+0200) Subject: ReST API: Add an API for retrieving resource schemata X-Git-Tag: 2014.1~228^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=12bbfd775b085bc74dc9e334aafc6f67f6a5310f;p=openstack-build%2Fheat-build.git ReST API: Add an API for retrieving resource schemata blueprint resource-properties-schema Change-Id: I07523a5996eea37a414310c21414be6454d08bfe --- diff --git a/heat/api/openstack/v1/__init__.py b/heat/api/openstack/v1/__init__.py index f21f89b8..caf36274 100644 --- a/heat/api/openstack/v1/__init__.py +++ b/heat/api/openstack/v1/__init__.py @@ -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", diff --git a/heat/api/openstack/v1/stacks.py b/heat/api/openstack/v1/stacks.py index a79db25a..22d97166 100644 --- a/heat/api/openstack/v1/stacks.py +++ b/heat/api/openstack/v1/stacks.py @@ -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): """ diff --git a/heat/tests/test_api_openstack_v1.py b/heat/tests/test_api_openstack_v1.py index 24be6294..4b36e0c0 100644 --- a/heat/tests/test_api_openstack_v1.py +++ b/heat/tests/test_api_openstack_v1.py @@ -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',