summaryrefslogtreecommitdiff
path: root/keystoneclient/base.py
diff options
context:
space:
mode:
authorAndrey Kurilin <akurilin@mirantis.com>2014-02-17 12:36:38 +0200
committerAndrey Kurilin <akurilin@mirantis.com>2014-02-17 12:36:38 +0200
commit608668aa4b5494f1d3ca771861db51dfb83dd6a8 (patch)
tree5b543a1a88323a184da1bd952c6b4e94718e6c54 /keystoneclient/base.py
parent43f8870f66f8d43b0a0635b170a47a73d7be0ac2 (diff)
downloadpython-keystoneclient-608668aa4b5494f1d3ca771861db51dfb83dd6a8.tar.gz
Use Resource class from Oslo
Most methods of Resource class from keystoneclient are similar to methods from common code. In the process of unification of the clients code we should reuse common functionality from Oslo. Related to blueprint common-client-library-2 Change-Id: I5858eec1596a6921dcf49dfcefb7abd4387de73b
Diffstat (limited to 'keystoneclient/base.py')
-rw-r--r--keystoneclient/base.py75
1 files changed, 2 insertions, 73 deletions
diff --git a/keystoneclient/base.py b/keystoneclient/base.py
index 6efbcc4..eb55e13 100644
--- a/keystoneclient/base.py
+++ b/keystoneclient/base.py
@@ -26,7 +26,7 @@ import six
from six.moves import urllib
from keystoneclient import exceptions
-from keystoneclient.openstack.common import strutils
+from keystoneclient.openstack.common.apiclient import base
def getid(obj):
@@ -385,82 +385,11 @@ class CrudManager(Manager):
return rl[0]
-class Resource(object):
+class Resource(base.Resource):
"""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: Manager object
- :param info: dictionary representing resource attributes
- :param loaded: prevent lazy-loading if set to True
- """
- self.manager = manager
- self._info = {}
- self._add_details(info)
- self._loaded = loaded
-
- @property
- def human_id(self):
- """Human-readable ID which can be used for bash completion.
- """
- if self.NAME_ATTR in self.__dict__ and self.HUMAN_ID:
- return strutils.to_slug(getattr(self, self.NAME_ATTR))
- return None
-
- def _add_details(self, info):
- for (k, v) in six.iteritems(info):
- setattr(self, k, v)
- self._info[k] = v
-
- 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 __repr__(self):
- reprkeys = sorted(k for k in self.__dict__ 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)
-
- def get(self):
- # 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)
-
def delete(self):
return self.manager.delete(self)
-
- 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