[openstack-dev] Global Requirements enforcement in the devstack gate ... coming soon

Sean Dague sean at dague.net
Thu Aug 1 12:35:23 UTC 2013


Over the past week Monty and I have been running at how to solve the 
problem that because of the way we install devstack nodes, our loose 
coordination of projects causes some "interesting" issues.

===============
The basic problem
===============

We install projects in the gate in this order (based on linear order in 
devstack):

install_infra
install_oslo
install_keystoneclient
install_glanceclient
install_cinderclient
install_novaclient

(then conditionally if certain services are enabled)
     install_swiftclient
     install_neutronclient
     install_heatclient
     install_keystone
     install_swift
     install_glance
     install_cinder
     install_neutron
     install_neutron_third_party
     install_nova
     install_horizon
     install_ceilometerclient
     install_ceilometer
     install_heat
     install_tempest

At every point we "python setup.py develop" to pull in requirements. 
That means, that if in install_glance we require "jsonschema" we'll 
install the latest, i.e. 2.0. And if at install_tempest we require 
"jsonschema>=1.3.0,!=1.4.0,<2" (which is the global requirements line), 
we will uninstall jsonschema 2.0. And if something, like cinder, dragged 
in something that required jsonschema, and uses entry points, which 
really care about python package versions, it will be built against 2.0, 
which will have been removed, and we'll have 1.3 instead.

Note: that's not a theoretical scenario, that's why no one could merge 
code last weekend.

We had an equivalent wedge with horizon a month ago, which was the 
python-*client uncap push.

Basically.... we're spinning 20 plates all at the same time, which all 
have different review times, +2 teams, and entropy means they tend to 
drift away from each other over time. It took us a month to get 
python-*clients uncapped across all the projects because of the 
intricate ways in which our projects require our other projects in 
interesting ways.

================
Proposed Solution - part #1 - use global requirements in devstack gate
================

The basic idea is simple, in the devstack gate, we're going to forcibly 
update all the project's requirements.txt files to global requirements 
versions, before running setup.py. That means that any project which 
requires a thing will require it at exactly the same version range as 
everyone else. Which ensures that we don't have this uninstall / 
reinstall issue.

We are really close to having this working. Monty and I have been 
running at it all week, and I actually think this requirements review - 
https://review.openstack.org/#/c/39461/ might be the last bit we need 
before we can land the devstack changes for this.

Things this solves:
  * makes global requirements actually mean something, right now the 
sqlalchemy line is known wrong, which prevents nova from working. There 
are probably other issues as well.
  * ensures we really have a set of requirements that work for all projects.

Things this will allow:
  * devstack gating on proposed changes to global-requirements, so 
you'll know if all the projects can work with global-requirements before 
you land them.

Things that we had to change along the way:
  * oslo.config / oslo.messaging now in devstack - in order to let 
projects use prerelease features of those projects, in this model, we 
needed their git trees to be in our environment, like the python* clients.
  * oslo.config in the devstack-gate (landing soon) - we'll now know on 
every oslo.config proposed commit that it works with all the projects in 
the devstack gate. Once oslo.messaging is proposed for use, we'll 
devstack-gate that as well.

Assuming sqlalchemy is the only requirements issue (it's likely that is 
the case), the rest of the gating around this should land today. This 
should just slide in quietly, and not cause any problems, however, there 
is an interesting caveat....

=================
Interesting Caveat
=================

Global requirements will be used by everyone in the devstack-gate and 
the grenade-gate, *however* in unit tests, projects will still be using 
their local requirements. These might not be the same (actually, for 
almost all projects I can tell you these aren't the same today).

We need to think about the resolution here. There are a number of ones I 
can think of, but this is going to clearly require more thought to get 
right. We need to be able to support things like prerelease Oslo, for 
instance. So lets just say this is tabled until phase #1 is fixed.

	-Sean

-- 
Sean Dague
http://dague.net



More information about the OpenStack-dev mailing list