[openstack-dev] [cinder] running afoul of Service.__repr__() during client.serivces.list()
Konstanski, Carlos P
Carlos.Konstanski at charter.com
Wed Sep 21 00:32:46 UTC 2016
Am Dienstag, den 20.09.2016, 15:31 -0600 schrieb Konstanski, Carlos P:
> I am currently using python-cinderclient version 1.5.0, though the code in
> question is still in master.
>
> When calling client.services.list() I get this result: "AttributeError:
> service"
>
> The execution path of client.services.list() eventually leads to this method
> in
> cinderclient/v2/services.py:24:
>
> def __repr__(self):
>
> return "<Service: %s>" % self.service
>
>
> which in turn triggers a call to Resouce.__getattr__() in
> cinderclient/openstack/common/apiclient/base.py:456.
>
> This custom getter will never find an attribute called service because a
> Service
> instance looks something like the following:
>
> {u'status': u'enabled', u'binary': u'cinder-scheduler', u'zone': u'nova',
> u'host': u'dev01', u'updated_at': u'2016-09-20T21:16:00.000000', u'state':
> u'up', u'disabled_reason': None}
>
> So it returns the string "AttributeError: service".
>
> One way or another a fix is warranted, and I am ready, willing and able to
> provide the fix. But first I want to find out more about the bigger picture.
> could it be that this __repr__() method actually correct, but the code that
> populates my service instance is faulty? This could easily be the case if the
> dict that feeds the Service class were to look like the following (for
> example):
>
> {u'service': {u'status': u'enabled', u'binary': u'cinder-scheduler', u'zone':
> u'nova', u'host': u'dev01', u'updated_at': u'2016-09-20T21:16:00.000000',
> u'state': u'up', u'disabled_reason': None}}
>
> Somehow I doubt it; why hide all the useful attributes in a dict under a
> single
> parent attribute? But I'm new to cinder and I don't know the rules. I'm not
> here
> to question your methods.
>
> Or am I just using it wrong? This code has survived for a long time, and
> certainly someone would have noticed a problem by now. But it seems pretty
> straightforward. How many ways are there to prepare a call to
> client.services.list()? I get a Client instance, call authenticate() for fun,
> and then call client.services.list(). Not a lot going on here.
>
> I'll get to work on a patch when I figure out what it is supposed to do, if it
> is not already doing it.
>
> Sincerely,
> Carlos Konstanski
I guess the question I should be asking is this: Manager._list() (in
cinderclient/base.py) returns a list of printable representations of objects,
not a list of the objects themselves. Hopefully there's a more useful method
that returns a list of actual objects, or at least a JSON representation. If I
can't find such a method then I'll be back, or I'll put up a review to add one.
Carlos
More information about the OpenStack-dev
mailing list