summaryrefslogtreecommitdiff
path: root/openstack_dashboard/api/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstack_dashboard/api/base.py')
-rw-r--r--openstack_dashboard/api/base.py263
1 files changed, 0 insertions, 263 deletions
diff --git a/openstack_dashboard/api/base.py b/openstack_dashboard/api/base.py
deleted file mode 100644
index 3edb5226..00000000
--- a/openstack_dashboard/api/base.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 United States Government as represented by the
-# Administrator of the National Aeronautics and Space Administration.
-# All Rights Reserved.
-#
-# Copyright 2012 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.
-
-from collections import Sequence
-import logging
-
-from django.conf import settings
-
-from horizon import exceptions
-
-
-__all__ = ('APIResourceWrapper', 'APIDictWrapper',
- 'get_service_from_catalog', 'url_for',)
-
-
-LOG = logging.getLogger(__name__)
-
-
-class APIVersionManager(object):
- """ Object to store and manage API versioning data and utility methods. """
-
- SETTINGS_KEY = "OPENSTACK_API_VERSIONS"
-
- def __init__(self, service_type, preferred_version=None):
- self.service_type = service_type
- self.preferred = preferred_version
- self._active = None
- self.supported = {}
-
- @property
- def active(self):
- if self._active is None:
- self.get_active_version()
- return self._active
-
- def load_supported_version(self, version, data):
- self.supported[version] = data
-
- def get_active_version(self):
- if self._active is not None:
- return self.supported[self._active]
- key = getattr(settings, self.SETTINGS_KEY, {}).get(self.service_type)
- if key is None:
- # TODO(gabriel): support API version discovery here; we'll leave
- # the setting in as a way of overriding the latest available
- # version.
- key = self.preferred
- self._active = key
- return self.supported[self._active]
-
-
-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:
- msg = ('Attempted to access unknown attribute "%s" on '
- 'APIResource object of type "%s" wrapping resource of '
- 'type "%s".') % (attr, self.__class__,
- self._apiresource.__class__)
- LOG.debug(exceptions.error_color(msg))
- raise AttributeError(attr)
-
- def __repr__(self):
- return "<%s: %s>" % (self.__class__.__name__,
- dict((attr, getattr(self, attr))
- for attr in self._attrs
- if hasattr(self, 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 novaclient.
- """
- def __init__(self, apidict):
- self._apidict = apidict
-
- def __getattr__(self, attr):
- try:
- return self._apidict[attr]
- except KeyError:
- msg = 'Unknown attribute "%(attr)s" on APIResource object ' \
- 'of type "%(cls)s"' % {'attr': attr, 'cls': self.__class__}
- LOG.debug(exceptions.error_color(msg))
- raise AttributeError(msg)
-
- def __getitem__(self, item):
- try:
- return self.__getattr__(item)
- except AttributeError as 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 __repr__(self):
- return "<%s: %s>" % (self.__class__.__name__, self._apidict)
-
-
-class Quota(object):
- """Wrapper for individual limits in a quota."""
- def __init__(self, name, limit):
- self.name = name
- self.limit = limit
-
- def __repr__(self):
- return "<Quota: (%s, %s)>" % (self.name, self.limit)
-
-
-class QuotaSet(Sequence):
- """
- Wrapper for client QuotaSet objects which turns the individual quotas
- into Quota objects for easier handling/iteration.
-
- `QuotaSet` objects support a mix of `list` and `dict` methods; you can use
- the bracket notiation (`qs["my_quota"] = 0`) to add new quota values, and
- use the `get` method to retrieve a specific quota, but otherwise it
- behaves much like a list or tuple, particularly in supporting iteration.
- """
- def __init__(self, apiresource=None):
- self.items = []
- if apiresource:
- for k, v in apiresource._info.items():
- if k == 'id':
- continue
- self[k] = v
-
- def __setitem__(self, k, v):
- v = int(v) if v is not None else v
- q = Quota(k, v)
- self.items.append(q)
-
- def __getitem__(self, index):
- return self.items[index]
-
- def __len__(self):
- return len(self.items)
-
- def __repr__(self):
- return repr(self.items)
-
- def get(self, key, default=None):
- match = [quota for quota in self.items if quota.name == key]
- return match.pop() if len(match) else Quota(key, default)
-
-
-def get_service_from_catalog(catalog, service_type):
- if catalog:
- for service in catalog:
- if service['type'] == service_type:
- return service
- return None
-
-
-def get_version_from_service(service):
- if service:
- endpoint = service['endpoints'][0]
- if 'interface' in endpoint:
- return 3
- else:
- return 2.0
- return 2.0
-
-
-# Mapping of V2 Catalog Endpoint_type to V3 Catalog Interfaces
-ENDPOINT_TYPE_TO_INTERFACE = {
- 'publicURL': 'public',
- 'internalURL': 'internal',
- 'adminURL': 'admin',
-}
-
-
-def get_url_for_service(service, region, endpoint_type):
- identity_version = get_version_from_service(service)
- for endpoint in service['endpoints']:
- # ignore region for identity
- if service['type'] == 'identity' or region == endpoint['region']:
- try:
- if identity_version < 3:
- return endpoint[endpoint_type]
- else:
- interface = \
- ENDPOINT_TYPE_TO_INTERFACE.get(endpoint_type, '')
- if endpoint['interface'] == interface:
- return endpoint['url']
- except (IndexError, KeyError):
- return None
- return None
-
-
-def url_for(request, service_type, endpoint_type=None):
- endpoint_type = endpoint_type or getattr(settings,
- 'OPENSTACK_ENDPOINT_TYPE',
- 'publicURL')
- fallback_endpoint_type = getattr(settings, 'SECONDARY_ENDPOINT_TYPE', None)
-
- catalog = request.user.service_catalog
- service = get_service_from_catalog(catalog, service_type)
- if service:
- url = get_url_for_service(service,
- request.user.services_region,
- endpoint_type)
- if not url and fallback_endpoint_type:
- url = get_url_for_service(service,
- request.user.services_region,
- fallback_endpoint_type)
- if url:
- return url
- raise exceptions.ServiceCatalogException(service_type)
-
-
-def is_service_enabled(request, service_type, service_name=None):
- service = get_service_from_catalog(request.user.service_catalog,
- service_type)
- if service:
- region = request.user.services_region
- for endpoint in service['endpoints']:
- # ignore region for identity
- if service['type'] == 'identity' or \
- endpoint['region'] == region:
- if service_name:
- return service['name'] == service_name
- else:
- return True
- return False