** Description changed: - Seems to only trigger when running on Ubuntu 12.04 with distro packaged - dependencies (that is, not installed from via pip). Exception when - attempting to drop the aggregate_hosts.host column during migration of - sqlite databases. First hit this running the test suite during - automated package builds, but it is reproducable via 'nova-mange db - sync', too ( though less verbose) + [IMPACT] + + Sqlalchemy allows models to be generated from existing tables + automatically using reflection. The fact that sqlite does not support + FK constraints is not properly accounted for in this process and certain + schema modifications result in the exception logged in this bug. The + most likely way of triggering this fault is through the use of python- + migrate and running database migrations against the sqlite dialect. + + [TESTCASE] + + As of 07/23/2012 (git hash 601882a23dd8a6573f0e59bb26e13233e2dce736), + migration '111_general_aggregates.py' attempts to drop a table /w a FK + constraint and triggers this bug when run against sqlite. It can be + reproduced easily by: + + ubuntu@server-468:~$ sudo apt-get -y install git && sudo apt-get -y build-dep nova-common + ubuntu@server-468:~$ git clone https://github.com/openstack/nova.git + ubuntu@server-468:~$ (cd nova/ && ./run_tests.sh -N -P) + + This will run through the migrations as part of the test suite, and + result in the traceback that ending in: AttributeError: 'int' object has + no attribute 'lower' + + [Development Fix] + + This has been resolved upstream in version 0.7.5 and fixed in Ubuntu + 12.10 as of the 0.7.8 Debian sync. + http://hg.sqlalchemy.org/sqlalchemy/rev/2aed4e56676a + + [Regression Potential] + + Minimal. The minimal fix is a 2 line change that properly sets + constraint_name to a None value. The bulk of the patch included in my + branch is updates to the sqlalchemy test suite, which is run during our + package build. + + + >> Original bug report << + + + Seems to only trigger when running on Ubuntu 12.04 with distro packaged dependencies (that is, not installed from via pip). Exception when attempting to drop the aggregate_hosts.host column during migration of sqlite databases. First hit this running the test suite during automated package builds, but it is reproducable via 'nova-mange db sync', too ( though less verbose) ubuntu@server-459:~/nova$ pkgs="openssh-client openssl python-setuptools python-setuptools-git python-sphinx python-distutils-extra python-gflags python-mox python-carrot python-boto python-amqplib openssh-client python-sqlalchemy python-eventlet python-routes python-webob python-cheetah python-nose python-paste python-pastedeploy python-tempita python-migrate python-netaddr python-glance python-paramiko python-novaclient python-lockfile python-simplejson python-lxml python-unittest2 python-daemon python-suds python-xattr python-feedparser python-crypto python-iso8601 python-kombu python-quantumclient pep8" ubuntu@server-459:~/nova$ sudo apt-get -y install $pkgs ubuntu@server-459:~/nova$ ./run_tests.sh -N -P ERROR ====================================================================== ERROR: test suite for <module 'nova.tests' from '/home/ubuntu/nova/nova/tests/__init__.py'> ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 208, in run self.setUp() File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 291, in setUp self.setupContext(ancestor) File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 314, in setupContext try_run(context, names) File "/usr/lib/python2.7/dist-packages/nose/util.py", line 478, in try_run return func() File "/home/ubuntu/nova/nova/tests/__init__.py", line 86, in setup migration.db_sync() File "/home/ubuntu/nova/nova/db/migration.py", line 32, in db_sync return IMPL.db_sync(version=version) File "/home/ubuntu/nova/nova/db/sqlalchemy/migration.py", line 79, in db_sync return versioning_api.upgrade(get_engine(), repository, version) File "/usr/lib/python2.7/dist-packages/migrate/versioning/api.py", line 186, in upgrade return _migrate(url, repository, version, upgrade=True, err=err, **opts) File "<string>", line 2, in _migrate File "/home/ubuntu/nova/nova/db/sqlalchemy/migration.py", line 44, in patched_with_engine return f(*a, **kw) File "/usr/lib/python2.7/dist-packages/migrate/versioning/api.py", line 366, in _migrate schema.runchange(ver, change, changeset.step) File "/usr/lib/python2.7/dist-packages/migrate/versioning/schema.py", line 91, in runchange change.run(self.engine, step) File "/usr/lib/python2.7/dist-packages/migrate/versioning/script/py.py", line 145, in run script_func(engine) File "/home/ubuntu/nova/nova/db/sqlalchemy/migrate_repo/versions/111_general_aggregates.py", line 46, in upgrade aggregate_hosts.drop_column('host') File "/usr/lib/python2.7/dist-packages/migrate/changeset/schema.py", line 445, in drop_column column.drop(table=self, *p, **kw) File "/usr/lib/python2.7/dist-packages/migrate/changeset/schema.py", line 549, in drop engine._run_visitor(visitorcallable, self, connection, **kwargs) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2234, in _run_visitor conn._run_visitor(visitorcallable, element, **kwargs) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1904, in _run_visitor **kwargs).traverse_single(element) File "/usr/lib/python2.7/dist-packages/migrate/changeset/ansisql.py", line 53, in traverse_single ret = super(AlterTableVisitor, self).traverse_single(elem) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 86, in traverse_single return meth(obj, **kw) File "/usr/lib/python2.7/dist-packages/migrate/changeset/databases/sqlite.py", line 90, in visit_column super(SQLiteColumnDropper,self).visit_column(column) File "/usr/lib/python2.7/dist-packages/migrate/changeset/databases/sqlite.py", line 53, in visit_column self.recreate_table(table,column,delta) File "/usr/lib/python2.7/dist-packages/migrate/changeset/databases/sqlite.py", line 40, in recreate_table table.create(bind=self.connection) File "/usr/lib/python2.7/dist-packages/sqlalchemy/schema.py", line 564, in create checkfirst=checkfirst) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1904, in _run_visitor **kwargs).traverse_single(element) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 86, in traverse_single return meth(obj, **kw) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/ddl.py", line 86, in visit_table self.connection.execute(schema.CreateTable(table)) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1405, in execute params) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1490, in _execute_ddl compiled = ddl.compile(dialect=dialect) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/expression.py", line 1722, in compile return self._compiler(dialect, bind=bind, **kw) File "/usr/lib/python2.7/dist-packages/sqlalchemy/schema.py", line 2852, in _compiler return dialect.ddl_compiler(dialect, self, **kw) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 699, in __init__ self.string = self.process(self.statement) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 718, in process return obj._compiler_dispatch(self, **kwargs) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 59, in _compiler_dispatch return getter(visitor)(self, **kw) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1386, in visit_create_table const = self.create_table_constraints(table) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1406, in create_table_constraints for constraint in constraints File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1404, in <genexpr> return ", \n\t".join(p for p in File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1412, in <genexpr> not getattr(constraint, 'use_alter', False) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 718, in process return obj._compiler_dispatch(self, **kwargs) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 59, in _compiler_dispatch return getter(visitor)(self, **kw) File "/usr/lib/python2.7/dist-packages/sqlalchemy/dialects/sqlite/base.py", line 382, in visit_foreign_key_constraint return super(SQLiteDDLCompiler, self).visit_foreign_key_constraint(constraint) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1540, in visit_foreign_key_constraint preparer.format_constraint(constraint) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1833, in format_constraint return self.quote(constraint.name, constraint.quote) File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1805, in quote if self._requires_quotes(ident): File "/usr/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 1786, in _requires_quotes lc_value = value.lower() AttributeError: 'int' object has no attribute 'lower' Might be of interest, since some are older than what devstack installs: - python-sqlalchemy 0.7.4-1 - python-migrate 0.7.2-1ubuntu1 - libsqlite3-0 3.7.9-2ubuntu1 + python-sqlalchemy 0.7.4-1 + python-migrate 0.7.2-1ubuntu1 + libsqlite3-0 3.7.9-2ubuntu1
** Summary changed: - AttributeError in migration 111_general_aggregates.py + [SRU] schema changes using sqlalchemy's sqlite dialect can fail when using reflection -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1025544 Title: [SRU] schema changes using sqlalchemy's sqlite dialect can fail when using reflection To manage notifications about this bug go to: https://bugs.launchpad.net/nova/+bug/1025544/+subscriptions -- ubuntu-bugs mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs
