diff options
Diffstat (limited to 'horizon/horizon/api/base.py')
-rw-r--r-- | horizon/horizon/api/base.py | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/horizon/horizon/api/base.py b/horizon/horizon/api/base.py new file mode 100644 index 00000000..093a214a --- /dev/null +++ b/horizon/horizon/api/base.py @@ -0,0 +1,118 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Copyright 2011 Nebula, Inc. +# +# 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. + +import functools +import logging + +from django.utils.decorators import available_attrs + +from horizon import exceptions + + +__all__ = ('APIResourceWrapper', 'APIDictWrapper', + 'get_service_from_catalog', 'url_for',) + + +LOG = logging.getLogger(__name__) + + +class APIResourceWrapper(object): + """ Simple wrapper for api objects + + Define _attrs on the child class and pass in the + api object as the only argument to the constructor + """ + _attrs = [] + + def __init__(self, apiresource): + self._apiresource = apiresource + + def __getattr__(self, attr): + if attr in self._attrs: + # __getattr__ won't find properties + return self._apiresource.__getattribute__(attr) + else: + LOG.debug('Attempted to access unknown attribute "%s" on' + ' APIResource object of type "%s" wrapping resource of' + ' type "%s"' % (attr, self.__class__, + self._apiresource.__class__)) + raise AttributeError(attr) + + +class APIDictWrapper(object): + """ Simple wrapper for api dictionaries + + Some api calls return dictionaries. This class provides identical + behavior as APIResourceWrapper, except that it will also behave as a + dictionary, in addition to attribute accesses. + + Attribute access is the preferred method of access, to be + consistent with api resource objects from openstackx + """ + def __init__(self, apidict): + self._apidict = apidict + + def __getattr__(self, attr): + if attr in self._attrs: + try: + return self._apidict[attr] + except KeyError, e: + raise AttributeError(e) + + else: + LOG.debug('Attempted to access unknown item "%s" on' + 'APIResource object of type "%s"' + % (attr, self.__class__)) + raise AttributeError(attr) + + def __getitem__(self, item): + try: + return self.__getattr__(item) + except AttributeError, e: + # caller is expecting a KeyError + raise KeyError(e) + + def get(self, item, default=None): + try: + return self.__getattr__(item) + except AttributeError: + return default + + +def get_service_from_catalog(catalog, service_type): + for service in catalog: + if service['type'] == service_type: + return service + return None + + +def url_for(request, service_type, admin=False): + catalog = request.user.service_catalog + service = get_service_from_catalog(catalog, service_type) + if service: + try: + if admin: + return service['endpoints'][0]['adminURL'] + else: + return service['endpoints'][0]['internalURL'] + except (IndexError, KeyError): + raise exceptions.ServiceCatalogException(service_type) + else: + raise exceptions.ServiceCatalogException(service_type) |