[openstack-dev] [Ceilometer] Way to get wrapped method's name/class using Pecan secure decorators?

Pendergrass, Eric eric.pendergrass at hp.com
Tue Aug 12 18:38:45 UTC 2014


Sure, here's the decorated method from v2.py:

    class MetersController(rest.RestController):
        """Works on meters."""

        @pecan.expose()
        def _lookup(self, meter_name, *remainder):
            return MeterController(meter_name), remainder

        @wsme_pecan.wsexpose([Meter], [Query])
        @secure(RBACController.check_permissions)
        def get_all(self, q=None):

and here's the decorator called by the secure tag:

    class RBACController(object):
        global _ENFORCER
        if not _ENFORCER:
            _ENFORCER = policy.Enforcer()


        @classmethod
        def check_permissions(cls):
            # do some stuff

In check_permissions I'd like to know the class and method with the @secure tag that caused check_permissions to be invoked.  In this case, that would be MetersController.get_all.

Thanks


> Can you share some code?  What do you mean by, "is there a way for the decorator code to know it was called by MetersController.get_all"
>
> On 08/12/14 04:46 PM, Pendergrass, Eric wrote:
> > Thanks Ryan, but for some reason the controller attribute is None:
> >
> > (Pdb) from pecan.core import state
> > (Pdb) state.__dict__
> > {'hooks': [<ceilometer.api.hooks.ConfigHook object at 0x31894d0>,
> > <ceilometer.api.hooks.DBHook object at 0x3189650>,
> > <ceilometer.api.hooks.PipelineHook object at 0x39871d0>,
> > <ceilometer.api.hooks.TranslationHook object at 0x3aa5510>], 'app':
> > <pecan.core.Pecan object at 0x2e76390>, 'request': <Request at
> > 0x3ed7390 GET http://localhost:8777/v2/meters>, 'controller': None,
> > 'response': <Response at 0x3ed74d0 200 OK>}
> >
> > > -----Original Message-----
> > > From: Ryan Petrello [mailto:ryan.petrello at dreamhost.com]
> > > Sent: Tuesday, August 12, 2014 10:34 AM
> > > To: OpenStack Development Mailing List (not for usage questions)
> > > Subject: Re: [openstack-dev] [Ceilometer] Way to get wrapped method's name/class using Pecan secure decorators?
> > >
> > > This should give you what you need:
> > >
> > > from pecan.core import state
> > > state.controller
> > >
> > > On 08/12/14 04:08 PM, Pendergrass, Eric wrote:
> > > > Hi, I'm trying to use the built in secure decorator in Pecan for access control, and I'ld like to get the name of the method that is wrapped from within the decorator.
> > > >
> > > > For instance, if I'm wrapping MetersController.get_all with an @secure decorator, is there a way for the decorator code to know it was called by MetersController.get_all?
> > > >
> > > > I don't see any global objects that provide this information.  I can get the endpoint, v2/meters, with pecan.request.path, but that's not as elegant.
> > > >
> > > > Is there a way to derive the caller or otherwise pass this information to the decorator?
> > > >
> > > > Thanks
> > > > Eric Pendergrass
> > >
> > > > _______________________________________________
> > > > OpenStack-dev mailing list
> > > > OpenStack-dev at lists.openstack.org
> > > > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
> > >
> > >
> > > --
> > > Ryan Petrello
> > > Senior Developer, DreamHost
> > > ryan.petrello at dreamhost.com



More information about the OpenStack-dev mailing list