]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
API and heat-cli rework to align with AWS CloudFormation API
authorSteven Hardy <shardy@redhat.com>
Mon, 14 May 2012 22:27:02 +0000 (23:27 +0100)
committerSteven Hardy <shardy@redhat.com>
Wed, 16 May 2012 08:48:37 +0000 (09:48 +0100)
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>
heat/api/v1/__init__.py
heat/client.py

index 60b382c2f64621f9a9ea074917e34492492d9a46..8e8ebcddf3a2079822f89c657d06487373cab3cc 100644 (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)
index 83532bb9c3ddd2dd96cf55ee977b27b660180548..45be5415727e5c5f2fd5a1f06e3318e47d70ed8e 100644 (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