from heat.common import config
from heat.common import context
from heat import utils
+from heat.engine import rpcapi as engine_rpcapi
import heat.engine.api as engine_api
from heat.openstack.common import rpc
def __init__(self, options):
self.options = options
+ self.engine_rpcapi = engine_rpcapi.EngineAPI()
def _stackid_addprefix(self, resp):
"""
try:
# Note show_stack returns details for all stacks when called with
# no stack_name, we only use a subset of the result here though
- stack_list = rpc.call(con, 'engine',
- {'method': 'show_stack',
- 'args': {'stack_name': None,
- 'params': parms}})
+ stack_list = self.engine_rpcapi.show_stack(con,
+ stack_name=None,
+ params=parms)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
stack_name = req.params['StackName']
try:
- stack_list = rpc.call(con, 'engine',
- {'method': 'show_stack',
- 'args': {'stack_name': stack_name,
- 'params': parms}})
+ stack_list = self.engine_rpcapi.show_stack(con,
+ stack_name=stack_name,
+ params=parms)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
# This should not happen, so return HeatInternalFailureError
return exception.HeatInternalFailureError(detail=msg)
- engine_action = {self.CREATE_STACK: "create_stack",
- self.UPDATE_STACK: "update_stack"}
+ engine_action = {self.CREATE_STACK: self.engine_rpcapi.create_stack,
+ self.UPDATE_STACK: self.engine_rpcapi.update_stack}
con = req.context
return exception.HeatInvalidParameterValueError(detail=msg)
try:
- res = rpc.call(con, 'engine',
- {'method': engine_action[action],
- 'args': {'stack_name': req.params['StackName'],
- 'template': stack,
- 'params': stack_parms,
- 'args': create_args}})
+ res = engine_action[action](con,
+ stack_name=req.params['StackName'],
+ template=stack,
+ params=stack_parms,
+ args=create_args)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
logger.info('get_template')
try:
- templ = rpc.call(con, 'engine',
- {'method': 'get_template',
- 'args': {'stack_name': req.params['StackName'],
- 'params': parms}})
+ templ = self.engine_rpcapi.get_template(con,
+ stack_name=req.params['StackName'],
+ params=parms)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
logger.info('validate_template')
try:
- return rpc.call(con, 'engine',
- {'method': 'validate_template',
- 'args': {'template': stack,
- 'params': parms}})
+ return self.engine_rpcapi.validate_template(con,
+ template=stack,
+ params=parms)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
parms = dict(req.params)
try:
- res = rpc.call(con, 'engine',
- {'method': 'delete_stack',
- 'args': {'stack_name': req.params['StackName'],
- 'params': parms}})
+ res = self.engine_rpcapi.delete_stack(con,
+ stack_name=req.params['StackName'],
+ params=parms,
+ cast=False)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
stack_name = req.params.get('StackName', None)
try:
- event_res = rpc.call(con, 'engine',
- {'method': 'list_events',
- 'args': {'stack_name': stack_name,
- 'params': parms}})
+ event_res = self.engine_rpcapi.list_events(con,
+ stack_name=stack_name,
+ params=parms)
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
return self._stackid_addprefix(result)
con = req.context
- args = {
- 'stack_name': req.params.get('StackName'),
- 'resource_name': req.params.get('LogicalResourceId'),
- }
try:
- resource_details = rpc.call(con, 'engine',
- {'method': 'describe_stack_resource',
- 'args': args})
+ resource_details = self.engine_rpcapi.describe_stack_resource(con,
+ stack_name=req.params.get('StackName'),
+ resource_name=req.params.get('LogicalResourceId'))
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
msg = 'Use `StackName` or `PhysicalResourceId` but not both'
return exception.HeatInvalidParameterCombinationError(detail=msg)
- args = {
- 'stack_name': stack_name,
- 'physical_resource_id': physical_resource_id,
- 'logical_resource_id': req.params.get('LogicalResourceId'),
- }
-
try:
- resources = rpc.call(con, 'engine',
- {'method': 'describe_stack_resources',
- 'args': args})
+ resources = self.engine_rpcapi.describe_stack_resources(con,
+ stack_name=stack_name,
+ physical_resource_id=physical_resource_id,
+ logical_resource_id=req.params.get('LogicalResourceId'))
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
con = req.context
try:
- resources = rpc.call(con, 'engine', {
- 'method': 'list_stack_resources',
- 'args': {'stack_name': req.params.get('StackName')}
- })
+ resources = self.engine_rpcapi.list_stack_resources(con,
+ stack_name=req.params.get('StackName'))
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
from heat.common import wsgi
from heat.common import context
+from heat.engine import rpcapi as engine_rpcapi
from heat.openstack.common import rpc
class MetadataController:
def __init__(self, options):
self.options = options
+ self.engine_rpcapi = engine_rpcapi.EngineAPI()
def entry_point(self, req):
return {
def list_stacks(self, req):
con = context.get_admin_context()
- resp = rpc.call(con, 'engine',
- {'method': 'metadata_list_stacks'})
+ resp = self.engine_rpcapi.metadata_list_stacks(con)
return resp
def list_resources(self, req, stack_name):
con = context.get_admin_context()
- resources = rpc.call(con, 'engine',
- {'method': 'metadata_list_resources',
- 'args': {'stack_name': stack_name}})
+ resources = self.engine_rpcapi.metadata_list_resources(con,
+ stack_name=stack_name)
if resources:
return resources
else:
def get_resource(self, req, stack_name, resource_name):
con = context.get_admin_context()
- [error, metadata] = rpc.call(con, 'engine',
- {'method': 'metadata_get_resource',
- 'args': {'stack_name': stack_name,
- 'resource_name': resource_name}
- })
+ [error, metadata] = self.engine_rpcapi.metadata_get_resource(con,
+ stack_name=stack_name,
+ resource_name=resource_name)
if error:
if error == 'stack':
return json_error(404,
def update_metadata(self, req, body, stack_id, resource_name):
con = context.get_admin_context()
- [error, metadata] = rpc.call(con, 'engine',
- {'method': 'metadata_update',
- 'args': {'stack_id': stack_id,
- 'resource_name': resource_name,
- 'metadata': body}})
+ [error, metadata] = self.engine_rpcapi.metadata_update(con,
+ stack_id=stack_id,
+ resource_name=resource_name,
+ metadata=body)
if error:
if error == 'stack':
return json_error(404,
def create_event(self, req, body=None):
con = context.get_admin_context()
- [error, event] = rpc.call(con, 'engine',
- {'method': 'event_create',
- 'args': {'event': body}})
+ [error, event] = self.engine_rpcapi.event_create(con, event=body)
if error:
return json_error(400, error)
return json_response(201, event)
def create_watch_data(self, req, body, watch_name):
con = context.get_admin_context()
- [error, watch_data] = rpc.call(con, 'engine',
- {'method': 'create_watch_data',
- 'args': {'watch_name': watch_name,
- 'stats_data': body}})
+ [error, watch_data] = self.engine_rpcapi.create_watch_data(con,
+ watch_name=watch_name,
+ stats_data=body)
if error:
return json_error(400, error)
return json_response(201, watch_data)
def list_watch_data(self, req, watch_name):
con = context.get_admin_context()
- data = rpc.call(con, 'engine',
- {'method': 'list_watch_data',
- 'args': {'watch_name': watch_name}})
+ data = self.engine_rpcapi.list_watch_data(con,
+ watch_name=watch_name)
if data:
return data
else:
import json
import urlparse
+from heat.common import config
from heat.common import context
from heat.engine import auth
+from heat.openstack.common import cfg
from heat.openstack.common import rpc
import heat.openstack.common.rpc.common as rpc_common
from heat.common.wsgi import Request
u'stack_name': u'wordpress',
u'stack_status': u'CREATE_COMPLETE'}]}
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'show_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
'args': {'stack_name': None,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
# 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, 'engine', {'method': 'show_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
'args': {'stack_name': None,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.m.ReplayAll()
# 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, 'engine', {'method': 'show_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
'args': {'stack_name': None,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("Exception"))
self.m.ReplayAll()
def test_describe(self):
# Format a dummy GET request to pass into the WSGI handler
- stack_name = "wordpress"
+ stack_name = u"wordpress"
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, 'engine', {'method': 'show_stack', 'args':
- {'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}).AndReturn(engine_resp)
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
+ 'args': {'stack_name': stack_name,
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
# 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, 'engine', {'method': 'show_stack', 'args':
- {'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}
+ rpc.call(dummy_req.context, self.topic, {'method': 'show_stack',
+ 'args': {'stack_name': stack_name,
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.m.ReplayAll()
engine_resp = {u'StackName': u'wordpress', u'StackId': 1}
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'create_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'create_stack',
'args':
{'stack_name': stack_name,
'template': template,
'params': engine_parms,
- 'args': engine_args}}).AndReturn(engine_resp)
+ 'args': engine_args},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
# heat exception type
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'create_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'create_stack',
'args':
{'stack_name': stack_name,
'template': template,
'params': engine_parms,
- 'args': engine_args}}
+ 'args': engine_args},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.m.ReplayAll()
engine_resp = {u'StackName': u'wordpress', u'StackId': 1}
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'update_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'update_stack',
'args':
{'stack_name': stack_name,
'template': template,
'params': engine_parms,
- 'args': engine_args}}).AndReturn(engine_resp)
+ 'args': engine_args},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
engine_resp = template
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'get_template',
+ rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}).AndReturn(engine_resp)
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
self.m.ReplayAll()
# 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, 'engine', {'method': 'get_template',
+ rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.m.ReplayAll()
engine_resp = None
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'get_template',
+ rpc.call(dummy_req.context, self.topic, {'method': 'get_template',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}).AndReturn(engine_resp)
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
self.m.ReplayAll()
engine_resp = None
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'delete_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'delete_stack',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}).AndReturn(engine_resp)
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
self.m.ReplayAll()
# 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, 'engine', {'method': 'delete_stack',
+ rpc.call(dummy_req.context, self.topic, {'method': 'delete_stack',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("AttributeError"))
self.m.ReplayAll()
u'resource_type': u'AWS::EC2::Instance'}]}
self.m.StubOutWithMock(rpc, 'call')
- rpc.call(dummy_req.context, 'engine', {'method': 'list_events',
+ rpc.call(dummy_req.context, self.topic, {'method': 'list_events',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}).AndReturn(engine_resp)
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
# 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, 'engine', {'method': 'list_events',
+ rpc.call(dummy_req.context, self.topic, {'method': 'list_events',
'args':
{'stack_name': stack_name,
- 'params': dict(dummy_req.params)}}
+ 'params': dict(dummy_req.params)},
+ 'version': self.api_version}, None
).AndRaise(rpc_common.RemoteError("Exception"))
self.m.ReplayAll()
'stack_name': dummy_req.params.get('StackName'),
'resource_name': dummy_req.params.get('LogicalResourceId'),
}
- rpc.call(dummy_req.context, 'engine',
+ rpc.call(dummy_req.context, self.topic,
{'method': 'describe_stack_resource',
- 'args': args}).AndReturn(engine_resp)
+ 'args': args,
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
'physical_resource_id': None,
'logical_resource_id': dummy_req.params.get('LogicalResourceId'),
}
- rpc.call(dummy_req.context, 'engine',
+ rpc.call(dummy_req.context, self.topic,
{'method': 'describe_stack_resources',
- 'args': args}).AndReturn(engine_resp)
+ 'args': args,
+ 'version': self.api_version}, None).AndReturn(engine_resp)
# Stub socket.gethostname so it returns "ahostname"
self.m.StubOutWithMock(socket, 'gethostname')
args = {
'stack_name': dummy_req.params.get('StackName'),
}
- rpc.call(dummy_req.context, 'engine',
+ rpc.call(dummy_req.context, self.topic,
{'method': 'list_stack_resources',
- 'args': args}).AndReturn(engine_resp)
+ 'args': args,
+ 'version': self.api_version}, None).AndReturn(engine_resp)
self.m.ReplayAll()
self.maxDiff = None
self.m = mox.Mox()
+ config.register_engine_opts()
+ cfg.CONF.set_default('engine_topic', 'engine')
+ cfg.CONF.set_default('host', 'host')
+ self.topic = '%s.%s' % (cfg.CONF.engine_topic, cfg.CONF.host)
+ self.api_version = '1.0'
+
# Create WSGI controller instance
class DummyConfig():
bind_port = 8000