diff options
author | Brant Knudson <bknudson@us.ibm.com> | 2015-08-05 11:17:34 -0500 |
---|---|---|
committer | Brant Knudson <bknudson@us.ibm.com> | 2015-08-05 11:24:08 -0500 |
commit | 16e834dd4597314d79cf4fb0bb98449e6552f804 (patch) | |
tree | a776950a4e307e34bf6e7643f8e9af49f520b2b7 | |
parent | 26534dadb1d0be00b87b632a038839ab1c18cfe4 (diff) | |
download | python-keystoneclient-16e834dd4597314d79cf4fb0bb98449e6552f804.tar.gz |
Move apiclient.base.Resource into keystoneclient
keystoneclient is using apiclient.base and in order to properly
deprecate and eventually get rid of apiclient we need to move the
symbols that keystoneclient uses out of apiclient.
This change moves apiclient.base.Resource into keystoneclient.base
by merging apiclient.base.Resource into the existing
keystoneclient.base.Resource. apiclient.base.Resource is now
renaming keystoneclient.base.Resource for backwards-compatibility.
Change-Id: Id479711b7c9437aaf171def6976aab8b303ec56d
-rw-r--r-- | keystoneclient/base.py | 93 | ||||
-rw-r--r-- | keystoneclient/openstack/common/apiclient/base.py | 102 |
2 files changed, 98 insertions, 97 deletions
diff --git a/keystoneclient/base.py b/keystoneclient/base.py index d2c3ea0..f19ed84 100644 --- a/keystoneclient/base.py +++ b/keystoneclient/base.py @@ -20,16 +20,17 @@ Base utilities to build API operation managers and objects on top of. """ import abc +import copy import functools import warnings +from oslo_utils import strutils import six from six.moves import urllib from keystoneclient import auth from keystoneclient import exceptions from keystoneclient.i18n import _ -from keystoneclient.openstack.common.apiclient import base def getid(obj): @@ -439,11 +440,99 @@ class CrudManager(Manager): return rl[0] -class Resource(base.Resource): +class Resource(object): """Base class for OpenStack resources (tenant, user, etc.). This is pretty much just a bag for attributes. """ + HUMAN_ID = False + NAME_ATTR = 'name' + + def __init__(self, manager, info, loaded=False): + """Populate and bind to a manager. + + :param manager: BaseManager object + :param info: dictionary representing resource attributes + :param loaded: prevent lazy-loading if set to True + """ + self.manager = manager + self._info = info + self._add_details(info) + self._loaded = loaded + + def __repr__(self): + reprkeys = sorted(k + for k in self.__dict__.keys() + if k[0] != '_' and k != 'manager') + info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys) + return "<%s %s>" % (self.__class__.__name__, info) + + @property + def human_id(self): + """Human-readable ID which can be used for bash completion. + """ + if self.HUMAN_ID: + name = getattr(self, self.NAME_ATTR, None) + if name is not None: + return strutils.to_slug(name) + return None + + def _add_details(self, info): + for (k, v) in six.iteritems(info): + try: + setattr(self, k, v) + self._info[k] = v + except AttributeError: + # In this case we already defined the attribute on the class + pass + + def __getattr__(self, k): + if k not in self.__dict__: + # NOTE(bcwaldon): disallow lazy-loading if already loaded once + if not self.is_loaded(): + self.get() + return self.__getattr__(k) + + raise AttributeError(k) + else: + return self.__dict__[k] + + def get(self): + """Support for lazy loading details. + + Some clients, such as novaclient have the option to lazy load the + details, details which can be loaded with this function. + """ + # set_loaded() first ... so if we have to bail, we know we tried. + self.set_loaded(True) + if not hasattr(self.manager, 'get'): + return + + new = self.manager.get(self.id) + if new: + self._add_details(new._info) + self._add_details( + {'x_request_id': self.manager.client.last_request_id}) + + def __eq__(self, other): + if not isinstance(other, Resource): + return NotImplemented + # two resources of different types are not equal + if not isinstance(other, self.__class__): + return False + if hasattr(self, 'id') and hasattr(other, 'id'): + return self.id == other.id + return self._info == other._info + + def is_loaded(self): + return self._loaded + + def set_loaded(self, val): + self._loaded = val + + def to_dict(self): + return copy.deepcopy(self._info) + def delete(self): return self.manager.delete(self) diff --git a/keystoneclient/openstack/common/apiclient/base.py b/keystoneclient/openstack/common/apiclient/base.py index 9300c2e..5612c22 100644 --- a/keystoneclient/openstack/common/apiclient/base.py +++ b/keystoneclient/openstack/common/apiclient/base.py @@ -33,18 +33,22 @@ Base utilities to build API operation managers and objects on top of. # ######################################################################## +######################################################################## +# NOTE(blk-u): This module is not being synced with oslo-incubator +# anymore. We need to deprecate property and get rid of it. +######################################################################## + # E1102: %s is not callable # pylint: disable=E1102 import abc -import copy -from oslo_utils import strutils import six from six.moves.urllib import parse from keystoneclient.openstack.common._i18n import _ +from keystoneclient import base as _base from keystoneclient.openstack.common.apiclient import exceptions @@ -437,96 +441,4 @@ class Extension(HookableMixin): return "<Extension '%s'>" % self.name -class Resource(object): - """Base class for OpenStack resources (tenant, user, etc.). - - This is pretty much just a bag for attributes. - """ - - HUMAN_ID = False - NAME_ATTR = 'name' - - def __init__(self, manager, info, loaded=False): - """Populate and bind to a manager. - - :param manager: BaseManager object - :param info: dictionary representing resource attributes - :param loaded: prevent lazy-loading if set to True - """ - self.manager = manager - self._info = info - self._add_details(info) - self._loaded = loaded - - def __repr__(self): - reprkeys = sorted(k - for k in self.__dict__.keys() - if k[0] != '_' and k != 'manager') - info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys) - return "<%s %s>" % (self.__class__.__name__, info) - - @property - def human_id(self): - """Human-readable ID which can be used for bash completion. - """ - if self.HUMAN_ID: - name = getattr(self, self.NAME_ATTR, None) - if name is not None: - return strutils.to_slug(name) - return None - - def _add_details(self, info): - for (k, v) in six.iteritems(info): - try: - setattr(self, k, v) - self._info[k] = v - except AttributeError: - # In this case we already defined the attribute on the class - pass - - def __getattr__(self, k): - if k not in self.__dict__: - # NOTE(bcwaldon): disallow lazy-loading if already loaded once - if not self.is_loaded(): - self.get() - return self.__getattr__(k) - - raise AttributeError(k) - else: - return self.__dict__[k] - - def get(self): - """Support for lazy loading details. - - Some clients, such as novaclient have the option to lazy load the - details, details which can be loaded with this function. - """ - # set_loaded() first ... so if we have to bail, we know we tried. - self.set_loaded(True) - if not hasattr(self.manager, 'get'): - return - - new = self.manager.get(self.id) - if new: - self._add_details(new._info) - self._add_details( - {'x_request_id': self.manager.client.last_request_id}) - - def __eq__(self, other): - if not isinstance(other, Resource): - return NotImplemented - # two resources of different types are not equal - if not isinstance(other, self.__class__): - return False - if hasattr(self, 'id') and hasattr(other, 'id'): - return self.id == other.id - return self._info == other._info - - def is_loaded(self): - return self._loaded - - def set_loaded(self, val): - self._loaded = val - - def to_dict(self): - return copy.deepcopy(self._info) +Resource = _base.Resource |