AttributeError: 'Timer' object has no attribute '__code__' (requires pecan > 1.0.2)

Bug #1605629 reported by James Page
14
This bug affects 2 people
Affects Status Importance Assigned to Milestone
Ironic
Fix Released
Low
Unassigned
OpenStack Global Requirements
Fix Released
Low
Unassigned

Bug Description

With the introduction of:

  https://github.com/openstack/ironic/commit/15c366580a18c77963d75cbc37e0805c96bc2a50

ironic is no longer compatible with the minimum version of pecan in global-requirements (1.0.0).

Ubuntu 16.10 development still has 1.0.2; detected during branch package builds; will upgrade but to 1.1.x but global-requirements really needs a bump as well.

Unit tests fail with the following stacktrace:

ironic.tests.unit.api.v1.test_ports.TestPost.test_create_port_with_hyphens_delimiter
------------------------------------------------------------------------------------

Captured stdout:
~~~~~~~~~~~~~~~~
    POST: /v1/ports {'uuid': '1be26c0b-03f2-4d2e-ae87-c02d7f33c781', 'node_uuid': '1be26c0b-03f2-4d2e-ae87-c02d7f33c123', 'address': '52-54-00-cf-2d-31', 'local_link_connection': {'port_id': 'Ethernet3/1', 'switch_id': '0a:1b:2c:3d:4e:5f', 'switch_info': 'switch1'}, 'extra': {}, 'pxe_enabled': True}

Captured traceback:
~~~~~~~~~~~~~~~~~~~
    Traceback (most recent call last):
      File "ironic/tests/unit/api/v1/test_ports.py", line 829, in test_create_port_with_hyphens_delimiter
        response = self.post_json('/ports', pdict, expect_errors=True)
      File "ironic/tests/unit/api/base.py", line 144, in post_json
        status=status, method="post")
      File "ironic/tests/unit/api/base.py", line 105, in _request_json
        expect_errors=expect_errors
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webtest/utils.py", line 36, in wrapper
        return self._gen_request(method, url, **kw)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webtest/app.py", line 740, in _gen_request
        expect_errors=expect_errors)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webtest/app.py", line 610, in do_request
        res = req.get_response(app, catch_exc_info=True)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/request.py", line 1295, in send
        application, catch_exc_info=True)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/request.py", line 1263, in call_application
        app_iter = application(self.environ, start_response)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webtest/lint.py", line 198, in lint_app
        iterator = application(environ, start_response_wrapper)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/dec.py", line 130, in __call__
        resp = self.call_func(req, *args, **self.kwargs)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/dec.py", line 195, in call_func
        return self.func(req, *args, **kwargs)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/oslo_middleware/base.py", line 126, in __call__
        response = req.get_response(self.application)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/request.py", line 1299, in send
        application, catch_exc_info=False)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/webob/request.py", line 1263, in call_application
        app_iter = application(self.environ, start_response)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/middleware/recursive.py", line 56, in __call__
        return self.application(environ, start_response)
      File "ironic/api/middleware/parsable_error.py", line 68, in __call__
        app_iter = self.app(environ, replacement_start_response)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/core.py", line 829, in __call__
        return super(Pecan, self).__call__(environ, start_response)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/core.py", line 677, in __call__
        controller, args, kwargs = self.find_controller(state)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/core.py", line 847, in find_controller
        controller, args, kw = super(Pecan, self).find_controller(_state)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/core.py", line 458, in find_controller
        controller, remainder = self.route(req, self.root, path)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/core.py", line 296, in route
        node, remainder = lookup_controller(node, path, req)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 139, in lookup_controller
        request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 244, in find_object
        next_obj, next_remainder = route(remainder)
      File "ironic/api/controllers/root.py", line 121, in _route
        return super(RootController, self)._route(args)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 120, in _route
        result = self._find_sub_controllers(args, request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 233, in _find_sub_controllers
        request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 139, in lookup_controller
        request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 244, in find_object
        next_obj, next_remainder = route(remainder)
      File "ironic/api/controllers/v1/__init__.py", line 179, in _route
        return super(Controller, self)._route(args)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 120, in _route
        result = self._find_sub_controllers(args, request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 233, in _find_sub_controllers
        request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 139, in lookup_controller
        request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/routing.py", line 246, in find_object
        next_obj, next_remainder = route(remainder, request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 120, in _route
        result = self._find_sub_controllers(args, request)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 220, in _find_sub_controllers
        args = self._get_args_for_controller(getattr(self, method))
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/rest.py", line 67, in _get_args_for_controller
        argspec = getargspec(controller)
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/util.py", line 44, in getargspec
        reverse=True
      File "/home/jamespage/src/upstream/openstack/ironic/.tox/py27/local/lib/python2.7/site-packages/pecan/util.py", line 43, in <lambda>
        key=lambda c: 'self' in c.cell_contents.__code__.co_varnames,
    AttributeError: 'Timer' object has no attribute '__code__'

Revision history for this message
James Page (james-page) wrote :

I reproduced this by downgrading the pecan version in the tox venv and then re-running unit tests.

summary: - requires pecan > 1.0.2
+ AttributeError: 'Timer' object has no attribute '__code__' (requires
+ pecan > 1.0.2)
Revision history for this message
Sam Betts (sambetts) wrote :

I am unable to replicate this my steps were:

$ tox -e py27
...
  py27: commands succeeded
  congratulations :)

$ (. .tox/py27/bin/activate && pip install --upgrade pecan==1.0.0)

$ (. .tox/py27/bin/activate && pip freeze)
...
PasteDeploy==1.5.2
pbr==1.10.0
pecan==1.0.0
pep8==1.5.7
pika==0.10.0
pika-pool==0.1.3
Pillow==3.3.1
...

$ tox -e py27
...
  py27: commands succeeded
  congratulations :)

Changed in ironic:
status: New → Incomplete
importance: Undecided → Low
Revision history for this message
Tony Breeds (o-tony) wrote :

The global-requirements for pecan are:

1.0.0,!=1.0.2,!=1.0.3,!=1.0.4

http://git.openstack.org/cgit/openstack/requirements/tree/global-requirements.txt#n138

The ironic tox environment shoudl be using contraints and then it would get pecan 1.1.2

Revision history for this message
Tony Breeds (o-tony) wrote :

We can't fix this in requirements due to the late stage of the release cycle. There are several work arounds

Changed in openstack-requirements:
importance: Undecided → Low
Revision history for this message
Pavlo Shchelokovskyy (pshchelo) wrote :

As Tony's pointed, the situation is a bit more complicated

versions 1.0.0 (lowest version from global requirements) and 1.0.1 do work.
Faulty versions are 1.0.2, 1.0.3, 1.0.4.
Versions >=1.0.5 work again.

I see that this is already taken care of in master of GR, but is there any chance to sneak that into GR stable/mitaka? Or it is too late and any packagers already stumbled on this and worked around that downstream..?

Revision history for this message
Tony Breeds (o-tony) wrote :
tags: added: lower-bounds-testsing
Changed in openstack-requirements:
status: New → Confirmed
tags: added: lower-bounds-testing
removed: lower-bounds-testsing
Revision history for this message
Matthew Thode (prometheanfire) wrote :

This got fixed a while back and also targets an unmaintained release

Changed in openstack-requirements:
status: Confirmed → Fix Released
Dmitry Tantsur (divius)
Changed in ironic:
status: Incomplete → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.