From 26cc7efb4d7623be0ef994ff00cf8c00943c44e2 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Mon, 14 May 2012 23:27:02 +0100 Subject: [PATCH] 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 --- heat/api/v1/__init__.py | 75 +++++++++++++++++++++++++++++++---------- heat/client.py | 23 +++++++++---- 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/heat/api/v1/__init__.py b/heat/api/v1/__init__.py index 60b382c2f6..8e8ebcddf3 100644 --- a/heat/api/v1/__init__.py +++ b/heat/api/v1/__init__.py @@ -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) diff --git a/heat/client.py b/heat/client.py index 83532bb9c3..45be541572 100644 --- a/heat/client.py +++ b/heat/client.py @@ -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