summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-04-28 21:31:00 +0000
committerGerrit Code Review <review@openstack.org>2015-04-28 21:31:00 +0000
commit1db6f80167aef5019336b2f5bc3d30d07ce4595e (patch)
tree0d7c419aef9e7e826a84a0564a2e039057f314db
parentf191a2147a21c7e50926b288768a96900cf4c629 (diff)
parenta2872a9262985bd0ee2c6df4f7593947e0516406 (diff)
downloadnova-1db6f80167aef5019336b2f5bc3d30d07ce4595e.tar.gz
Merge "Fix migrate_flavor_data() to catch instances with no instance_extra rows" into stable/kilo
-rw-r--r--nova/db/sqlalchemy/api.py7
-rw-r--r--nova/tests/unit/db/test_db_api.py25
2 files changed, 31 insertions, 1 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index fc35a5faee..64c6724e64 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -6041,7 +6041,7 @@ def migrate_flavor_data(context, max_count, flavor_cache):
from nova import objects
query = _instance_get_all_query(context, joins=['extra', 'extra.flavor']).\
- join(models.Instance.extra).\
+ outerjoin(models.Instance.extra).\
filter(models.InstanceExtra.flavor.is_(None))
if max_count is not None:
instances = query.limit(max_count)
@@ -6069,6 +6069,11 @@ def migrate_flavor_data(context, max_count, flavor_cache):
_augment_flavors_to_migrate(instance, flavor_cache)
if instance.obj_what_changed():
+ if db_instance.get('extra') is None:
+ _instance_extra_create(context,
+ {'instance_uuid': db_instance['uuid']})
+ LOG.debug(
+ 'Created instance_extra for %s' % db_instance['uuid'])
instance.save(expected_task_state=[None])
count_hit += 1
diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py
index 8fc8d540fe..7cc9c94a52 100644
--- a/nova/tests/unit/db/test_db_api.py
+++ b/nova/tests/unit/db/test_db_api.py
@@ -7629,6 +7629,31 @@ class FlavorMigrationTestCase(test.TestCase):
self.assertEqual(3, match)
self.assertEqual(0, done)
+ def test_migrate_flavor_gets_missing_extra_rows(self):
+ ctxt = context.get_admin_context()
+ flavor = flavors.get_default_flavor()
+ sysmeta = flavors.save_flavor_info({}, flavor)
+ values1 = {'uuid': str(stdlib_uuid.uuid4()),
+ 'system_metadata': sysmeta,
+ 'extra': {'flavor': None},
+ }
+ db.instance_create(ctxt, values1)
+ values2 = {'uuid': str(stdlib_uuid.uuid4()),
+ 'system_metadata': sysmeta,
+ }
+ inst2 = db.instance_create(ctxt, values2)
+ sqlalchemy_api.model_query(ctxt, models.InstanceExtra).\
+ filter_by(instance_uuid=inst2.uuid).delete()
+
+ self.assertIsNone(db.instance_extra_get_by_instance_uuid(
+ ctxt, inst2.uuid))
+ match, done = db.migrate_flavor_data(ctxt, None, {})
+ self.assertEqual(2, match)
+ self.assertEqual(2, done)
+ extra = db.instance_extra_get_by_instance_uuid(ctxt, inst2.uuid)
+ self.assertIsNotNone(extra)
+ self.assertIsNotNone(extra.flavor)
+
class ArchiveTestCase(test.TestCase):