API and heat-cli rework to align with AWS CloudFormation API

Ref #115, rework API mapper to route by Action= query parameter,
not by path, and align heat CLI tool with revised API.

Signed-off-by: Steven Hardy <shardy@redhat.com>
This commit is contained in:
Steven Hardy 2012-05-14 23:27:02 +01:00
parent 0f1bd5d291
commit 26cc7efb4d
2 changed files with 74 additions and 24 deletions

View File

@ -19,8 +19,9 @@ import routes
from heat.api.v1 import stacks
from heat.common import wsgi
logger = logging.getLogger(__name__)
from webob import Request
logger = logging.getLogger(__name__)
class API(wsgi.Router):
@ -28,6 +29,38 @@ class API(wsgi.Router):
WSGI router for Heat v1 API requests.
"""
def action_match(self, action, environ):
req = Request(environ)
env_action = req.GET.get("Action")
if action == env_action:
return True
else:
return False
def action_ListStacks(self, environ, result):
return self.action_match('ListStacks', environ)
def action_CreateStack(self, environ, result):
return self.action_match('CreateStack', environ)
def action_DescribeStacks(self, environ, result):
return self.action_match('DescribeStacks', environ)
def action_DeleteStack(self, environ, result):
return self.action_match('DeleteStack', environ)
def action_UpdateStack(self, environ, result):
return self.action_match('UpdateStack', environ)
def action_DescribeStackEvents(self, environ, result):
return self.action_match('DescribeStackEvents', environ)
def action_ValidateTemplate(self, environ, result):
return self.action_match('ValidateTemplate', environ)
def __init__(self, conf, **local_conf):
self.conf = conf
mapper = routes.Mapper()
@ -35,24 +68,32 @@ class API(wsgi.Router):
stacks_resource = stacks.create_resource(conf)
mapper.resource("stack", "stacks", controller=stacks_resource,
collection={'detail': 'GET'})
collection={'detail': 'GET'})
mapper.connect("/", controller=stacks_resource,
action="list", conditions=dict(function=self.action_ListStacks))
mapper.connect("/", controller=stacks_resource,
action="create", conditions=dict(function=self.action_CreateStack))
mapper.connect("/", controller=stacks_resource,
action="describe",
conditions=dict(function=self.action_DescribeStacks))
mapper.connect("/", controller=stacks_resource,
action="delete", conditions=dict(function=self.action_DeleteStack))
mapper.connect("/", controller=stacks_resource,
action="update", conditions=dict(function=self.action_UpdateStack))
mapper.connect("/", controller=stacks_resource,
action="events_list",
conditions=dict(function=self.action_DescribeStackEvents))
mapper.connect("/CreateStack", controller=stacks_resource,
action="create", conditions=dict(method=["POST"]))
mapper.connect("/", controller=stacks_resource,
action="list", conditions=dict(method=["GET"]))
mapper.connect("/ListStacks", controller=stacks_resource,
action="list", conditions=dict(method=["GET"]))
mapper.connect("/DescribeStacks", controller=stacks_resource,
action="describe", conditions=dict(method=["GET"]))
mapper.connect("/DeleteStack", controller=stacks_resource,
action="delete", conditions=dict(method=["DELETE"]))
mapper.connect("/UpdateStack", controller=stacks_resource,
action="update", conditions=dict(method=["PUT"]))
mapper.connect("/DescribeStackEvents", controller=stacks_resource,
action="events_list", conditions=dict(method=["GET"]))
mapper.connect("/ValidateTemplate", controller=stacks_resource,
action="validate_template",
conditions=dict(method=["GET"]))
conditions=dict(function=self.action_ValidateTemplate))
mapper.connect("/", controller=stacks_resource, action="index")
super(API, self).__init__(mapper)

View File

@ -41,16 +41,18 @@ class V1Client(base_client.BaseClient):
def list_stacks(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
params['Action'] = "ListStacks"
res = self.do_request("GET", "/ListStacks", params=params)
res = self.do_request("GET", "/", params=params)
data = json.loads(res.read())
return data
def describe_stacks(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
params['Action'] = "DescribeStacks"
res = self.do_request("GET", "/DescribeStacks", params=params)
res = self.do_request("GET", "/", params=params)
data = json.loads(res.read())
return data
@ -58,38 +60,45 @@ class V1Client(base_client.BaseClient):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
res = self.do_request("POST", "/CreateStack", params=params)
params['Action'] = "CreateStack"
res = self.do_request("POST", "/", params=params)
data = json.loads(res.read())
return data
def update_stack(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
res = self.do_request("PUT", "/UpdateStack", params=params)
params['Action'] = "UpdateStack"
res = self.do_request("POST", "/", params=params)
data = json.loads(res.read())
return data
def delete_stack(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
res = self.do_request("DELETE", "/DeleteStack", params=params)
params['Action'] = "DeleteStack"
res = self.do_request("GET", "/", params=params)
data = json.loads(res.read())
return data
def list_stack_events(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
params['Action'] = "DescribeStackEvents"
res = self.do_request("GET", "/DescribeStackEvents", params=params)
res = self.do_request("GET", "/", params=params)
data = json.loads(res.read())
return data
def validate_template(self, **kwargs):
params = self._extract_params(kwargs, SUPPORTED_PARAMS)
self._insert_common_parameters(params)
params['Action'] = "ValidateTemplate"
res = self.do_request("GET", "/ValidateTemplate", params=params)
res = self.do_request("GET", "/", params=params)
data = json.loads(res.read())
return data