Today I went to run automated tests in my Ironic development setup, and tests failed with a slew of errors like this:
CommandError: Only a single head is supported. The script directory has multiple heads (due to branching), which must be resolved by manually editing the revision files to form a linear sequence. Run `alembic branches` to see the divergence(s).
This was quite baffling to me, and I at first assumed it was a
git thing, given the references to branches and head.
I am still moderately confused. But here is how I fixed it.
Please note that: * I have little idea what I’m doing. This is what worked for me, not necessarily what someone clueful would do. * My fix involves trashing your database and recreating it. That’s perfectly acceptable for my test database, but proceed with caution.
Run alembic branches
The error told me to run
alembic branches, but that failed:
$ alembic branches No config file 'alembic.ini' found, or file has no '[alembic]' section
The solution is to find your
alembic.ini file. In Ironic, that’s
ironic/db/sqlalchemy. cd into there, and now it will work:
$ alembic branches None -> 2581ebaf0cb2 (branchpoint), initial migration -> 2581ebaf0cb2 -> 21b7629c61e7 (head), -> 2581ebaf0cb2 -> 21b331f883ef (head), Add provision_updated_at
The alembic documentation talks a little bit about this, for further reading.
Look for .pyc files
Each of those hashes should point to a Python file in
I think where I went wrong is that I had switched branches and ended up with a
.pyc file, but not matching
.py. The name should match one of the hashes above. (I suppose you could safely just delete all the
.pyc files, actually.)
Downgrade to alembic base
I’m actually not sure if this was necessary, but I did this:
alembic downgrade base. If it bombs out with errors, I think we’ll fix them momentarily.
Delete the tables from your database
Now we’re basically going to start a new database.
I fired up mysql, ran
USE ironic, and then deleted all the tables. You might have to play with ordering to get it right, due ot foreign key constraints.
In Ironic, we have
ironic-dbsync to do this for us. If not using Ironic, I think
alembic upgrade head is analogous.
And then you should be good. Hopefully.