Merge "Add template-version-list"
This commit is contained in:
commit
a7cd870dc0
@ -45,6 +45,7 @@
|
|||||||
"stacks:global_index": "rule:deny_everybody",
|
"stacks:global_index": "rule:deny_everybody",
|
||||||
"stacks:index": "rule:deny_stack_user",
|
"stacks:index": "rule:deny_stack_user",
|
||||||
"stacks:list_resource_types": "rule:deny_stack_user",
|
"stacks:list_resource_types": "rule:deny_stack_user",
|
||||||
|
"stacks:list_template_versions": "rule:deny_stack_user",
|
||||||
"stacks:lookup": "",
|
"stacks:lookup": "",
|
||||||
"stacks:preview": "rule:deny_stack_user",
|
"stacks:preview": "rule:deny_stack_user",
|
||||||
"stacks:resource_schema": "rule:deny_stack_user",
|
"stacks:resource_schema": "rule:deny_stack_user",
|
||||||
|
@ -112,6 +112,13 @@ class API(wsgi.Router):
|
|||||||
'method': 'GET'
|
'method': 'GET'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'template_versions',
|
||||||
|
'url': '/template_versions',
|
||||||
|
'action': 'list_template_versions',
|
||||||
|
'method': 'GET'
|
||||||
|
},
|
||||||
|
|
||||||
# Stack collection
|
# Stack collection
|
||||||
{
|
{
|
||||||
'name': 'stack_index',
|
'name': 'stack_index',
|
||||||
|
@ -517,6 +517,16 @@ class StackController(object):
|
|||||||
'resource_types':
|
'resource_types':
|
||||||
self.rpc_client.list_resource_types(req.context, support_status)}
|
self.rpc_client.list_resource_types(req.context, support_status)}
|
||||||
|
|
||||||
|
@util.policy_enforce
|
||||||
|
def list_template_versions(self, req):
|
||||||
|
"""
|
||||||
|
Returns a list of available template versions
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
'template_versions':
|
||||||
|
self.rpc_client.list_template_versions(req.context)
|
||||||
|
}
|
||||||
|
|
||||||
@util.policy_enforce
|
@util.policy_enforce
|
||||||
def resource_schema(self, req, type_name):
|
def resource_schema(self, req, type_name):
|
||||||
"""
|
"""
|
||||||
|
@ -40,6 +40,7 @@ from heat.common import messaging as rpc_messaging
|
|||||||
from heat.common import service_utils
|
from heat.common import service_utils
|
||||||
from heat.engine import api
|
from heat.engine import api
|
||||||
from heat.engine import attributes
|
from heat.engine import attributes
|
||||||
|
from heat.engine.cfn import template as cfntemplate
|
||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import event as evt
|
from heat.engine import event as evt
|
||||||
@ -266,7 +267,7 @@ class EngineService(service.Service):
|
|||||||
by the RPC caller.
|
by the RPC caller.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
RPC_API_VERSION = '1.10'
|
RPC_API_VERSION = '1.11'
|
||||||
|
|
||||||
def __init__(self, host, topic, manager=None):
|
def __init__(self, host, topic, manager=None):
|
||||||
super(EngineService, self).__init__()
|
super(EngineService, self).__init__()
|
||||||
@ -1024,6 +1025,18 @@ class EngineService(service.Service):
|
|||||||
"""
|
"""
|
||||||
return resources.global_env().get_types(support_status)
|
return resources.global_env().get_types(support_status)
|
||||||
|
|
||||||
|
def list_template_versions(self, cnxt):
|
||||||
|
mgr = templatem._get_template_extension_manager()
|
||||||
|
_template_classes = [(name, mgr[name].plugin)
|
||||||
|
for name in mgr.names()]
|
||||||
|
versions = []
|
||||||
|
for t in _template_classes:
|
||||||
|
if t[1] in [cfntemplate.CfnTemplate, cfntemplate.HeatTemplate]:
|
||||||
|
versions.append({'version': t[0], 'type': 'cfn'})
|
||||||
|
else:
|
||||||
|
versions.append({'version': t[0], 'type': 'hot'})
|
||||||
|
return versions
|
||||||
|
|
||||||
def resource_schema(self, cnxt, type_name):
|
def resource_schema(self, cnxt, type_name):
|
||||||
"""
|
"""
|
||||||
Return the schema of the specified type.
|
Return the schema of the specified type.
|
||||||
|
@ -31,6 +31,7 @@ class EngineClient(object):
|
|||||||
1.4 - Add support for service list
|
1.4 - Add support for service list
|
||||||
1.9 - Add template_type option to generate_template()
|
1.9 - Add template_type option to generate_template()
|
||||||
1.10 - Add support for software config list
|
1.10 - Add support for software config list
|
||||||
|
1.11 - Add support for template versions list
|
||||||
'''
|
'''
|
||||||
|
|
||||||
BASE_RPC_API_VERSION = '1.0'
|
BASE_RPC_API_VERSION = '1.0'
|
||||||
@ -327,6 +328,15 @@ class EngineClient(object):
|
|||||||
support_status=support_status),
|
support_status=support_status),
|
||||||
version='1.1')
|
version='1.1')
|
||||||
|
|
||||||
|
def list_template_versions(self, ctxt):
|
||||||
|
"""
|
||||||
|
Get a list of available template versions
|
||||||
|
|
||||||
|
:param ctxt: RPC context.
|
||||||
|
"""
|
||||||
|
return self.call(ctxt, self.make_msg('list_template_versions'),
|
||||||
|
version='1.11')
|
||||||
|
|
||||||
def resource_schema(self, ctxt, type_name):
|
def resource_schema(self, ctxt, type_name):
|
||||||
"""
|
"""
|
||||||
Get the schema for a resource type.
|
Get the schema for a resource type.
|
||||||
|
@ -39,7 +39,7 @@ class ServiceEngineTest(common.HeatTestCase):
|
|||||||
|
|
||||||
def test_make_sure_rpc_version(self):
|
def test_make_sure_rpc_version(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
'1.10',
|
'1.11',
|
||||||
service.EngineService.RPC_API_VERSION,
|
service.EngineService.RPC_API_VERSION,
|
||||||
('RPC version is changed, please update this test to new version '
|
('RPC version is changed, please update this test to new version '
|
||||||
'and make sure additional test cases are added for RPC APIs '
|
'and make sure additional test cases are added for RPC APIs '
|
||||||
|
@ -2022,6 +2022,25 @@ class StackControllerTest(ControllerTest, common.HeatTestCase):
|
|||||||
self.assertEqual(403, resp.status_int)
|
self.assertEqual(403, resp.status_int)
|
||||||
self.assertIn('403 Forbidden', six.text_type(resp))
|
self.assertIn('403 Forbidden', six.text_type(resp))
|
||||||
|
|
||||||
|
def test_list_template_versions(self, mock_enforce):
|
||||||
|
self._mock_enforce_setup(mock_enforce, 'list_template_versions', True)
|
||||||
|
req = self._get('/template_versions')
|
||||||
|
|
||||||
|
engine_response = [
|
||||||
|
{'version': 'heat_template_version.2013-05-23', 'type': 'hot'},
|
||||||
|
{'version': 'AWSTemplateFormatVersion.2010-09-09', 'type': 'cfn'}]
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(rpc_client.EngineClient, 'call')
|
||||||
|
rpc_client.EngineClient.call(
|
||||||
|
req.context, ('list_template_versions', {}),
|
||||||
|
version="1.11"
|
||||||
|
).AndReturn(engine_response)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
response = self.controller.list_template_versions(
|
||||||
|
req, tenant_id=self.tenant)
|
||||||
|
self.assertEqual({'template_versions': engine_response}, response)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
def test_resource_schema(self, mock_enforce):
|
def test_resource_schema(self, mock_enforce):
|
||||||
self._mock_enforce_setup(mock_enforce, 'resource_schema', True)
|
self._mock_enforce_setup(mock_enforce, 'resource_schema', True)
|
||||||
req = self._get('/resource_types/ResourceWithProps')
|
req = self._get('/resource_types/ResourceWithProps')
|
||||||
|
@ -27,8 +27,10 @@ from heat.common import exception
|
|||||||
from heat.common import identifier
|
from heat.common import identifier
|
||||||
from heat.common import messaging
|
from heat.common import messaging
|
||||||
from heat.common import template_format
|
from heat.common import template_format
|
||||||
|
from heat.engine.cfn import template as cfntemplate
|
||||||
from heat.engine import dependencies
|
from heat.engine import dependencies
|
||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
|
from heat.engine.hot import template as hottemplate
|
||||||
from heat.engine import resource as res
|
from heat.engine import resource as res
|
||||||
from heat.engine.resources.aws.ec2 import instance as instances
|
from heat.engine.resources.aws.ec2 import instance as instances
|
||||||
from heat.engine import service
|
from heat.engine import service
|
||||||
@ -2188,6 +2190,28 @@ class StackServiceTest(common.HeatTestCase):
|
|||||||
self.assertNotIn(['OS::Neutron::RouterGateway'], resources)
|
self.assertNotIn(['OS::Neutron::RouterGateway'], resources)
|
||||||
self.assertIn('AWS::EC2::Instance', resources)
|
self.assertIn('AWS::EC2::Instance', resources)
|
||||||
|
|
||||||
|
@mock.patch('heat.engine.template._get_template_extension_manager')
|
||||||
|
def test_list_template_versions(self, templ_mock):
|
||||||
|
|
||||||
|
class DummyMgr(object):
|
||||||
|
def names(self):
|
||||||
|
return ['a.b', 'c.d']
|
||||||
|
|
||||||
|
def __getitem__(self, item):
|
||||||
|
m = mock.MagicMock()
|
||||||
|
if item == 'a.b':
|
||||||
|
m.plugin = cfntemplate.CfnTemplate
|
||||||
|
return m
|
||||||
|
else:
|
||||||
|
m.plugin = hottemplate.HOTemplate20130523
|
||||||
|
return m
|
||||||
|
|
||||||
|
templ_mock.return_value = DummyMgr()
|
||||||
|
templates = self.eng.list_template_versions(self.ctx)
|
||||||
|
expected = [{'version': 'a.b', 'type': 'cfn'},
|
||||||
|
{'version': 'c.d', 'type': 'hot'}]
|
||||||
|
self.assertEqual(expected, templates)
|
||||||
|
|
||||||
def test_resource_schema(self):
|
def test_resource_schema(self):
|
||||||
type_name = 'ResourceWithPropsType'
|
type_name = 'ResourceWithPropsType'
|
||||||
expected = {
|
expected = {
|
||||||
|
Loading…
Reference in New Issue
Block a user