from heat.common import utils as heat_utils
from heat.common import context as ctxtlib
from heat.engine import api
+from heat.engine import identifier
from heat.engine import parser
from heat.engine import resources
from heat.engine import watchrule
else:
raise AttributeError('Unknown stack name')
- def show_stack(self, context, stack_name, params):
+ def _get_stack(self, context, stack_identity):
+ identity = identifier.HeatIdentifier(**stack_identity)
+
+ if identity.tenant != context.tenant:
+ raise AttributeError('Invalid tenant')
+
+ s = db_api.stack_get(context, identity.stack_id)
+
+ if s is None:
+ raise AttributeError('Stack not found')
+
+ if identity.path or s.name != identity.stack_name:
+ raise AttributeError('Invalid stack ID')
+
+ return s
+
+ def show_stack(self, context, stack_identity, params):
"""
The show_stack method returns the attributes of one stack.
arg1 -> RPC context.
"""
auth.authenticate(context)
- if stack_name is not None:
- s = db_api.stack_get_by_name(context, stack_name)
- if s:
- stacks = [s]
- else:
- raise AttributeError('Unknown stack name')
+ if stack_identity is not None:
+ stacks = [self._get_stack(context, stack_identity)]
else:
stacks = db_api.stack_get_by_tenant(context) or []
return dict(stack.identifier())
- def update_stack(self, context, stack_name, template, params, args):
+ def update_stack(self, context, stack_identity, template, params, args):
"""
The update_stack method updates an existing stack based on the
provided template and parameters.
auth.authenticate(context)
# Get the database representation of the existing stack
- db_stack = db_api.stack_get_by_name(None, stack_name)
- if not db_stack:
- raise AttributeError('No stack exists with that name')
+ db_stack = self._get_stack(context, stack_identity)
current_stack = parser.Stack.load(context, db_stack.id)
}
return {'ValidateTemplateResult': result}
- def get_template(self, context, stack_name, params):
+ def get_template(self, context, stack_identity, params):
"""
Get the template.
arg1 -> RPC context.
arg3 -> Dict of http request parameters passed in from API side.
"""
auth.authenticate(context)
- s = db_api.stack_get_by_name(context, stack_name)
+ s = self._get_stack(context, stack_identity)
if s:
return s.raw_template.template
return None
- def delete_stack(self, context, stack_name, params):
+ def delete_stack(self, context, stack_identity, params):
"""
The delete_stack method deletes a given stack.
arg1 -> RPC context.
auth.authenticate(context)
- st = db_api.stack_get_by_name(context, stack_name)
- if not st:
- raise AttributeError('Unknown stack name')
+ st = self._get_stack(context, stack_identity)
- logger.info('deleting stack %s' % stack_name)
+ logger.info('deleting stack %s' % st.name)
stack = parser.Stack.load(context, st.id)
greenpool.spawn_n(stack.delete)
return None
- def list_events(self, context, stack_name, params):
+ def list_events(self, context, stack_identity, params):
"""
The list_events method lists all events associated with a given stack.
arg1 -> RPC context.
auth.authenticate(context)
- if stack_name is not None:
- st = db_api.stack_get_by_name(context, stack_name)
- if not st:
- raise AttributeError('Unknown stack name')
+ if stack_identity is not None:
+ st = self._get_stack(context, stack_identity)
events = db_api.event_get_all_by_stack(context, st.id)
else:
msg = 'Error creating event'
return [msg, None]
- def describe_stack_resource(self, context, stack_name, resource_name):
+ def describe_stack_resource(self, context, stack_identity, resource_name):
auth.authenticate(context)
- s = db_api.stack_get_by_name(context, stack_name)
- if not s:
- raise AttributeError('Unknown stack name')
+ s = self._get_stack(context, stack_identity)
stack = parser.Stack.load(context, s.id)
if resource_name not in stack:
return api.format_stack_resource(stack[resource_name])
- def describe_stack_resources(self, context, stack_name,
+ def describe_stack_resources(self, context, stack_identity,
physical_resource_id, logical_resource_id):
auth.authenticate(context)
- if stack_name is not None:
- s = db_api.stack_get_by_name(context, stack_name)
+ if stack_identity is not None:
+ s = self._get_stack(context, stack_identity)
else:
rs = db_api.resource_get_by_physical_resource_id(context,
physical_resource_id)
for resource in stack if resource.id is not None and
name_match(resource)]
- def list_stack_resources(self, context, stack_name):
+ def list_stack_resources(self, context, stack_identity):
auth.authenticate(context)
- s = db_api.stack_get_by_name(context, stack_name)
- if not s:
- raise AttributeError('Unknown stack name')
+ s = self._get_stack(context, stack_identity)
stack = parser.Stack.load(context, s.id)
or None to see all
"""
return self.call(ctxt, self.make_msg('identify_stack',
- stack_name=stack_name,
- topic=_engine_topic(self.topic,
- ctxt,
- None)))
+ stack_name=stack_name),
+ topic=_engine_topic(self.topic, ctxt, None))
- def show_stack(self, ctxt, stack_name, params):
+ def show_stack(self, ctxt, stack_identity, params):
"""
The show_stack method returns the attributes of one stack.
:param params: Dict of http request parameters passed in from API side.
"""
return self.call(ctxt, self.make_msg('show_stack',
- stack_name=stack_name, params=params),
+ stack_identity=stack_identity, params=params),
topic=_engine_topic(self.topic, ctxt, None))
def create_stack(self, ctxt, stack_name, template, params, args):
template=template, params=params, args=args),
topic=_engine_topic(self.topic, ctxt, None))
- def update_stack(self, ctxt, stack_name, template, params, args):
+ def update_stack(self, ctxt, stack_identity, template, params, args):
"""
The update_stack method updates an existing stack based on the
provided template and parameters.
:param args: Request parameters/args passed from API
"""
return self.call(ctxt, self.make_msg('update_stack',
- stack_name=stack_name,
+ stack_identity=stack_identity,
template=template, params=params, args=args),
topic=_engine_topic(self.topic, ctxt, None))
template=template, params=params),
topic=_engine_topic(self.topic, ctxt, None))
- def get_template(self, ctxt, stack_name, params):
+ def get_template(self, ctxt, stack_identity, params):
"""
Get the template.
:param params: Dict of http request parameters passed in from API side.
"""
return self.call(ctxt, self.make_msg('get_template',
- stack_name=stack_name, params=params),
+ stack_identity=stack_identity, params=params),
topic=_engine_topic(self.topic, ctxt, None))
- def delete_stack(self, ctxt, stack_name, params, cast=True):
+ def delete_stack(self, ctxt, stack_identity, params, cast=True):
"""
The delete_stack method deletes a given stack.
"""
rpc_method = self.cast if cast else self.call
return rpc_method(ctxt, self.make_msg('delete_stack',
- stack_name=stack_name, params=params),
+ stack_identity=stack_identity, params=params),
topic=_engine_topic(self.topic, ctxt, None))
- def list_events(self, ctxt, stack_name, params):
+ def list_events(self, ctxt, stack_identity, params):
"""
The list_events method lists all events associated with a given stack.
:param params: Params passed from API.
"""
return self.call(ctxt, self.make_msg('list_events',
- stack_name=stack_name, params=params),
+ stack_identity=stack_identity, params=params),
topic=_engine_topic(self.topic, ctxt, None))
- def describe_stack_resource(self, ctxt, stack_name, resource_name):
+ def describe_stack_resource(self, ctxt, stack_identity, resource_name):
return self.call(ctxt, self.make_msg('describe_stack_resource',
- stack_name=stack_name, resource_name=resource_name),
+ stack_identity=stack_identity,
+ resource_name=resource_name),
topic=_engine_topic(self.topic, ctxt, None))
- def describe_stack_resources(self, ctxt, stack_name,
+ def describe_stack_resources(self, ctxt, stack_identity,
physical_resource_id, logical_resource_id):
return self.call(ctxt, self.make_msg('describe_stack_resources',
- stack_name=stack_name,
+ stack_identity=stack_identity,
physical_resource_id=physical_resource_id,
logical_resource_id=logical_resource_id),
topic=_engine_topic(self.topic, ctxt, None))
- def list_stack_resources(self, ctxt, stack_name):
+ def list_stack_resources(self, ctxt, stack_identity):
return self.call(ctxt, self.make_msg('list_stack_resources',
- stack_name=stack_name),
+ stack_identity=stack_identity),
topic=_engine_topic(self.topic, ctxt, None))
def metadata_list_stacks(self, ctxt):
from heat.common import config
from heat.common import context
from heat.engine import auth
+from heat.engine import identifier
from heat.openstack.common import cfg
from heat.openstack.common import rpc
import heat.openstack.common.rpc.common as rpc_common
u'stack_status': u'CREATE_COMPLETE'}]}
self.m.StubOutWithMock(rpc, 'call')
rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
- 'args': {'stack_name': None,
+ 'args': {'stack_identity': None,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndReturn(engine_resp)
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
- 'args': {'stack_name': None,
+ 'args': {'stack_identity': None,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
- 'args': {'stack_name': None,
+ 'args': {'stack_identity': None,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("Exception"))
def test_describe(self):
# Format a dummy GET request to pass into the WSGI handler
stack_name = u"wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStacks', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
u'capabilities':[]}]}
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
- 'args': {'stack_name': stack_name,
+ 'args': {'stack_identity': identity,
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
+
+ self.m.ReplayAll()
+
+ # Call the list controller function and compare the response
+ response = self.controller.describe(dummy_req)
+
+ expected = {'DescribeStacksResponse': {'DescribeStacksResult':
+ {'Stacks':
+ [{'StackId': u'arn:openstack:heat::t:stacks/wordpress/6',
+ 'StackStatusReason': u'Stack successfully created',
+ 'Description': u'blah',
+ 'Parameters':
+ [{'ParameterValue': u'admin',
+ 'ParameterKey': u'DBUsername'},
+ {'ParameterValue': u'F16',
+ 'ParameterKey': u'LinuxDistribution'},
+ {'ParameterValue': u'm1.large',
+ 'ParameterKey': u'InstanceType'},
+ {'ParameterValue': u'admin',
+ 'ParameterKey': u'DBRootPassword'},
+ {'ParameterValue': u'admin',
+ 'ParameterKey': u'DBPassword'},
+ {'ParameterValue': u'wordpress',
+ 'ParameterKey': u'DBName'}],
+ 'Outputs':
+ [{'OutputKey': u'WebsiteURL',
+ 'OutputValue': u'http://10.0.0.8/wordpress',
+ 'Description': u'URL for Wordpress wiki'}],
+ 'TimeoutInMinutes': 60,
+ 'CreationTime': u'2012-07-09T09:12:45Z',
+ 'Capabilities': [],
+ 'StackName': u'wordpress',
+ 'NotificationARNs': [],
+ 'StackStatus': u'CREATE_COMPLETE',
+ 'DisableRollback': True,
+ 'LastUpdatedTime': u'2012-07-09T09:13:11Z'}]}}}
+
+ self.assertEqual(response, expected)
+
+ def test_describe_arn(self):
+ # Format a dummy GET request to pass into the WSGI handler
+ stack_name = u"wordpress"
+ stack_identifier = identifier.HeatIdentifier('t', stack_name, '6')
+ identity = dict(stack_identifier)
+ params = {'Action': 'DescribeStacks',
+ 'StackName': stack_identifier.arn()}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Stub out the RPC call to the engine with a pre-canned response
+ # Note the engine returns a load of keys we don't actually use
+ # so this is a subset of the real response format
+ engine_resp = {u'stacks': [
+ {u'stack_identity': {u'tenant': u't',
+ u'stack_name': u'wordpress',
+ u'stack_id': u'6',
+ u'path': u''},
+ u'updated_time': u'2012-07-09T09:13:11Z',
+ u'parameters':{
+ u'DBUsername': {u'Default': u'admin'},
+ u'LinuxDistribution': {u'Default': u'F16'},
+ u'InstanceType': {u'Default': u'm1.large'},
+ u'DBRootPassword': {u'Default': u'admin'},
+ u'DBPassword': {u'Default': u'admin'},
+ u'DBName': {u'Default': u'wordpress'}},
+ u'outputs':
+ [{u'output_key': u'WebsiteURL',
+ u'description': u'URL for Wordpress wiki',
+ u'output_value': u'http://10.0.0.8/wordpress'}],
+ u'stack_status_reason': u'Stack successfully created',
+ u'creation_time': u'2012-07-09T09:12:45Z',
+ u'stack_name': u'wordpress',
+ u'notification_topics': [],
+ u'stack_status': u'CREATE_COMPLETE',
+ u'description': u'blah',
+ u'disable_rollback': True,
+ u'timeout_mins':60,
+ u'capabilities':[]}]}
+
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
+ 'args': {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None).AndReturn(engine_resp)
def test_describe_aterr(self):
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStacks', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
# Insert an engine RPC error and ensure we map correctly to the
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
- 'args': {'stack_name': stack_name,
+ 'args': {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.assertEqual(type(result),
exception.HeatInvalidParameterValueError)
+ def test_describe_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'DescribeStacks', 'StackName': stack_name}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.describe(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_get_template_int_body(self):
''' Test the internal _get_template function '''
params = {'TemplateBody': "abcdef"}
dummy_req = self._dummy_GET_request(params)
# Stub out the RPC call to the engine with a pre-canned response
- engine_resp = {u'tenant': u't',
- u'stack_name': u'wordpress',
- u'stack_id': u'1',
- u'path': u''}
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '1'))
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
+
rpc.call(dummy_req.context, self.topic, {'method': 'update_stack',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'template': template,
'params': engine_parms,
'args': engine_args},
- 'version': self.api_version}, None).AndReturn(engine_resp)
+ 'version': self.api_version}, None).AndReturn(identity)
self.m.ReplayAll()
self.assertEqual(response, expected)
+ def test_update_bad_name(self):
+ stack_name = "wibble"
+ template = {u'Foo': u'bar'}
+ json_template = json.dumps(template)
+ params = {'Action': 'UpdateStack', 'StackName': stack_name,
+ 'TemplateBody': '%s' % json_template,
+ 'Parameters.member.1.ParameterKey': 'InstanceType',
+ 'Parameters.member.1.ParameterValue': 'm1.xlarge'}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.update(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_create_or_update_err(self):
result = self.controller.create_or_update(req={}, action="dsdgfdf")
self.assertEqual(type(result), exception.HeatInternalFailureError)
def test_get_template(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
template = {u'Foo': u'bar'}
params = {'Action': 'GetTemplate', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
engine_resp = template
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None).AndReturn(engine_resp)
def test_get_template_err_rpcerr(self):
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
template = {u'Foo': u'bar'}
params = {'Action': 'GetTemplate', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
# Insert an engine RPC error and ensure we map correctly to the
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.assertEqual(type(result),
exception.HeatInvalidParameterValueError)
+ def test_get_template_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'GetTemplate', 'StackName': stack_name}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.get_template(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_get_template_err_none(self):
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
template = {u'Foo': u'bar'}
params = {'Action': 'GetTemplate', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
engine_resp = None
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None).AndReturn(engine_resp)
def test_delete(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '1'))
params = {'Action': 'DeleteStack', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
# Stub out the RPC call to the engine with a pre-canned response
- # Engine returns None when delete successful
- engine_resp = None
-
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
+ # Engine returns None when delete successful
rpc.call(dummy_req.context, self.topic, {'method': 'delete_stack',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
- 'version': self.api_version}, None).AndReturn(engine_resp)
+ 'version': self.api_version}, None).AndReturn(None)
self.m.ReplayAll()
def test_delete_err_rpcerr(self):
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '1'))
params = {'Action': 'DeleteStack', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
+ # Stub out the RPC call to the engine with a pre-canned response
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
+
# Insert an engine RPC error and ensure we map correctly to the
# heat exception type
- self.m.StubOutWithMock(rpc, 'call')
rpc.call(dummy_req.context, self.topic, {'method': 'delete_stack',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.assertEqual(type(result),
exception.HeatInvalidParameterValueError)
+ def test_delete_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'DeleteStack', 'StackName': stack_name}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.delete(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_events_list(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStackEvents', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
u'resource_type': u'AWS::EC2::Instance'}]}
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'list_events',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None).AndReturn(engine_resp)
def test_events_list_err_rpcerr(self):
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStackEvents', 'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
# Insert an engine RPC error and ensure we map correctly to the
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic, {'method': 'list_events',
'args':
- {'stack_name': stack_name,
+ {'stack_identity': identity,
'params': dict(dummy_req.params)},
'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("Exception"))
self.assertEqual(type(result), exception.HeatInternalFailureError)
+ def test_events_list_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'DescribeStackEvents', 'StackName': stack_name}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.events_list(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_describe_stack_resource(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStackResource',
'StackName': stack_name,
'LogicalResourceId': "WikiDatabase"}
u'metadata': {u'wordpress': []}}
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
args = {
- 'stack_name': dummy_req.params.get('StackName'),
+ 'stack_identity': identity,
'resource_name': dummy_req.params.get('LogicalResourceId'),
}
rpc.call(dummy_req.context, self.topic,
def test_describe_stack_resources(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'DescribeStackResources',
'StackName': stack_name,
'LogicalResourceId': "WikiDatabase"}
u'metadata': {u'ensureRunning': u'true''true'}}]
self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
args = {
- 'stack_name': dummy_req.params.get('StackName'),
+ 'stack_identity': identity,
'physical_resource_id': None,
'logical_resource_id': dummy_req.params.get('LogicalResourceId'),
}
self.assertEqual(response, expected)
+ def test_describe_stack_resources_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'DescribeStackResources',
+ 'StackName': stack_name,
+ 'LogicalResourceId': "WikiDatabase"}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.describe_stack_resources(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def test_describe_stack_resources_err_inval(self):
# Format a dummy request containing both StackName and
# PhysicalResourceId, which is invalid and should throw a
def test_list_stack_resources(self):
# Format a dummy request
stack_name = "wordpress"
+ identity = dict(identifier.HeatIdentifier('t', stack_name, '6'))
params = {'Action': 'ListStackResources',
'StackName': stack_name}
dummy_req = self._dummy_GET_request(params)
u'metadata': {}}]
self.m.StubOutWithMock(rpc, 'call')
- args = {
- 'stack_name': dummy_req.params.get('StackName'),
- }
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None).AndReturn(identity)
rpc.call(dummy_req.context, self.topic,
{'method': 'list_stack_resources',
- 'args': args,
+ 'args': {'stack_identity': identity},
'version': self.api_version}, None).AndReturn(engine_resp)
self.m.ReplayAll()
self.assertEqual(response, expected)
+ def test_list_stack_resources_bad_name(self):
+ stack_name = "wibble"
+ params = {'Action': 'ListStackResources',
+ 'StackName': stack_name}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Insert an engine RPC error and ensure we map correctly to the
+ # heat exception type
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic, {'method': 'identify_stack',
+ 'args': {'stack_name': stack_name},
+ 'version': self.api_version}, None
+ ).AndRaise(rpc_common.RemoteError("AttributeError"))
+
+ self.m.ReplayAll()
+
+ result = self.controller.list_stack_resources(dummy_req)
+ self.assertEqual(type(result),
+ exception.HeatInvalidParameterValueError)
+
def setUp(self):
self.maxDiff = None
self.m = mox.Mox()