import httplib
import itertools
import json
-import os
import socket
-import sys
-import re
import urlparse
-import webob
from webob import exc
-from functools import wraps
+from heat.api.openstack.v1 import util
from heat.common import wsgi
-from heat.common import config
-from heat.common import context
-from heat.common import exception
-from heat import utils
from heat.engine import api as engine_api
-from heat.engine import identifier
from heat.engine import rpcapi as engine_rpcapi
-from heat.openstack.common import rpc
import heat.openstack.common.rpc.common as rpc_common
from heat.openstack.common import log as logging
return dict((k, v) for k, v in params if k not in self.PARAMS)
-def tenant_local(handler):
- @wraps(handler)
- def handle_stack_method(controller, req, tenant_id, **kwargs):
- req.context.tenant_id = tenant_id
- return handler(controller, req, **kwargs)
-
- return handle_stack_method
-
-
-def identified_stack(handler):
- @tenant_local
- @wraps(handler)
- def handle_stack_method(controller, req, stack_name, stack_id, **kwargs):
- stack_identity = identifier.HeatIdentifier(req.context.tenant_id,
- stack_name,
- stack_id)
- return handler(controller, req, dict(stack_identity), **kwargs)
-
- return handle_stack_method
-
-
-def stack_url(req, identity):
- try:
- stack_identity = identifier.HeatIdentifier(**identity)
- except ValueError:
- err_reason = _("Invalid Stack address")
- raise exc.HTTPInternalServerError(explanation=err_reason)
-
- return req.relative_url(stack_identity.url_path(), True)
-
-
-def make_link(req, identity):
- return {"href": stack_url(req, identity), "rel": "self"}
-
-
def format_stack(req, stack, keys=[]):
include_key = lambda k: k in keys if keys else True
if key == engine_api.STACK_ID:
yield ('id', value['stack_id'])
- yield ('links', [make_link(req, value)])
+ yield ('links', [util.make_link(req, value)])
else:
# TODO(zaneb): ensure parameters can be formatted for XML
#elif key == engine_api.STACK_PARAMETERS:
def default(self, req, **args):
raise exc.HTTPNotFound()
- @tenant_local
+ @util.tenant_local
def index(self, req):
"""
Lists summary information for all stacks
return {'stacks': [format_stack(req, s, summary_keys) for s in stacks]}
- @tenant_local
+ @util.tenant_local
def create(self, req, body):
"""
Create a new stack
if 'Description' in result:
raise exc.HTTPBadRequest(explanation=result['Description'])
- raise exc.HTTPCreated(location=stack_url(req, result))
+ raise exc.HTTPCreated(location=util.make_url(req, result))
- @tenant_local
+ @util.tenant_local
def lookup(self, req, stack_name, body=None):
"""
Redirect to the canonical URL for a stack
except rpc_common.RemoteError as ex:
return self._remote_error(ex)
- raise exc.HTTPFound(location=stack_url(req, identity))
+ raise exc.HTTPFound(location=util.make_url(req, identity))
- @identified_stack
+ @util.identified_stack
def show(self, req, identity):
"""
Gets detailed information for a stack
return {'stack': format_stack(req, stack)}
- @identified_stack
+ @util.identified_stack
def template(self, req, identity):
"""
Get the template body for an existing stack
# TODO(zaneb): always set Content-type to application/json
return templ
- @identified_stack
+ @util.identified_stack
def update(self, req, identity, body):
"""
Update an existing stack with a new template and/or parameters
raise exc.HTTPAccepted()
- @identified_stack
+ @util.identified_stack
def delete(self, req, identity):
"""
Delete the specified stack
raise exc.HTTPNoContent()
- @tenant_local
+ @util.tenant_local
def validate_template(self, req, body):
"""
Implements the ValidateTemplate API action
--- /dev/null
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from functools import wraps
+
+from heat.engine import identifier
+
+
+def tenant_local(handler):
+ '''
+ Decorator for a handler method that sets the correct tenant_id in the
+ request context.
+ '''
+ @wraps(handler)
+ def handle_stack_method(controller, req, tenant_id, **kwargs):
+ req.context.tenant_id = tenant_id
+ return handler(controller, req, **kwargs)
+
+ return handle_stack_method
+
+
+def identified_stack(handler):
+ '''
+ Decorator for a handler method that passes a stack identifier in place of
+ the various path components.
+ '''
+ @tenant_local
+ @wraps(handler)
+ def handle_stack_method(controller, req, stack_name, stack_id, **kwargs):
+ stack_identity = identifier.HeatIdentifier(req.context.tenant_id,
+ stack_name,
+ stack_id)
+ return handler(controller, req, dict(stack_identity), **kwargs)
+
+ return handle_stack_method
+
+
+def make_url(req, identity):
+ '''Return the URL for the supplied identity dictionary.'''
+ try:
+ stack_identity = identifier.HeatIdentifier(**identity)
+ except ValueError:
+ err_reason = _('Invalid Stack address')
+ raise exc.HTTPInternalServerError(explanation=err_reason)
+
+ return req.relative_url(stack_identity.url_path(), True)
+
+
+def make_link(req, identity, relationship='self'):
+ '''Return a link structure for the supplied identity dictionary.'''
+ return {'href': make_url(req, identity), 'rel': relationship}