summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrant Knudson <bknudson@us.ibm.com>2015-08-05 11:17:34 -0500
committerBrant Knudson <bknudson@us.ibm.com>2015-08-05 11:24:08 -0500
commit16e834dd4597314d79cf4fb0bb98449e6552f804 (patch)
treea776950a4e307e34bf6e7643f8e9af49f520b2b7
parent26534dadb1d0be00b87b632a038839ab1c18cfe4 (diff)
downloadpython-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.py93
-rw-r--r--keystoneclient/openstack/common/apiclient/base.py102
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