~ubuntu-branches/ubuntu/trusty/python-keystoneclient/trusty-proposed

« back to all changes in this revision

Viewing changes to keystoneclient/base.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2014-03-27 12:08:28 UTC
  • mfrom: (1.1.26)
  • Revision ID: package-import@ubuntu.com-20140327120828-yu3vm5g1v1pkl93w
Tags: 1:0.7.1-ubuntu1
New upstream release. (LP: #1298453)

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
from six.moves import urllib
27
27
 
28
28
from keystoneclient import exceptions
29
 
from keystoneclient.openstack.common import strutils
 
29
from keystoneclient.openstack.common.apiclient import base
30
30
 
31
31
 
32
32
def getid(obj):
385
385
            return rl[0]
386
386
 
387
387
 
388
 
class Resource(object):
 
388
class Resource(base.Resource):
389
389
    """Base class for OpenStack resources (tenant, user, etc.).
390
390
 
391
391
    This is pretty much just a bag for attributes.
392
392
    """
393
393
 
394
 
    HUMAN_ID = False
395
 
    NAME_ATTR = 'name'
396
 
 
397
 
    def __init__(self, manager, info, loaded=False):
398
 
        """Populate and bind to a manager.
399
 
 
400
 
        :param manager: Manager object
401
 
        :param info: dictionary representing resource attributes
402
 
        :param loaded: prevent lazy-loading if set to True
403
 
        """
404
 
        self.manager = manager
405
 
        self._info = {}
406
 
        self._add_details(info)
407
 
        self._loaded = loaded
408
 
 
409
 
    @property
410
 
    def human_id(self):
411
 
        """Human-readable ID which can be used for bash completion.
412
 
        """
413
 
        if self.NAME_ATTR in self.__dict__ and self.HUMAN_ID:
414
 
            return strutils.to_slug(getattr(self, self.NAME_ATTR))
415
 
        return None
416
 
 
417
 
    def _add_details(self, info):
418
 
        for (k, v) in six.iteritems(info):
419
 
            setattr(self, k, v)
420
 
            self._info[k] = v
421
 
 
422
 
    def __getattr__(self, k):
423
 
        if k not in self.__dict__:
424
 
            #NOTE(bcwaldon): disallow lazy-loading if already loaded once
425
 
            if not self.is_loaded():
426
 
                self.get()
427
 
                return self.__getattr__(k)
428
 
 
429
 
            raise AttributeError(k)
430
 
        else:
431
 
            return self.__dict__[k]
432
 
 
433
 
    def __repr__(self):
434
 
        reprkeys = sorted(k for k in self.__dict__ if k[0] != '_' and
435
 
                          k != 'manager')
436
 
        info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys)
437
 
        return "<%s %s>" % (self.__class__.__name__, info)
438
 
 
439
 
    def get(self):
440
 
        # set_loaded() first ... so if we have to bail, we know we tried.
441
 
        self.set_loaded(True)
442
 
        if not hasattr(self.manager, 'get'):
443
 
            return
444
 
 
445
 
        new = self.manager.get(self.id)
446
 
        if new:
447
 
            self._add_details(new._info)
448
 
 
449
394
    def delete(self):
450
395
        return self.manager.delete(self)
451
 
 
452
 
    def __eq__(self, other):
453
 
        if not isinstance(other, Resource):
454
 
            return NotImplemented
455
 
        # two resources of different types are not equal
456
 
        if not isinstance(other, self.__class__):
457
 
            return False
458
 
        if hasattr(self, 'id') and hasattr(other, 'id'):
459
 
            return self.id == other.id
460
 
        return self._info == other._info
461
 
 
462
 
    def is_loaded(self):
463
 
        return self._loaded
464
 
 
465
 
    def set_loaded(self, val):
466
 
        self._loaded = val