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__'
I reproduced this by downgrading the pecan version in the tox venv and then re-running unit tests.