summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevananda van der Veen <devananda.vdv@gmail.com>2012-11-14 11:25:14 -0800
committerDevananda van der Veen <devananda.vdv@gmail.com>2012-11-16 11:26:17 -0800
commite32f01ac93c96395aec14b520ac6792d811f1c03 (patch)
treed713bcb356ff00a35428cd9442cdea0986a683c1
parent40d7bcb8a3b797cfa691d83d8694a3c9c81ad8dc (diff)
downloadnova-e32f01ac93c96395aec14b520ac6792d811f1c03.tar.gz
nova-e32f01ac93c96395aec14b520ac6792d811f1c03.tar.xz
nova-e32f01ac93c96395aec14b520ac6792d811f1c03.zip
add instance_type_extra_specs to instances
Adding instance_type_extra_specs as instance['extra_specs'] so that this info is passed to driver.spawn() later on. This is needed by the baremetal driver. Change-Id: Icbfba835c9a060193597cc00a7c0e404b7ccfdd4
-rw-r--r--nova/db/sqlalchemy/api.py12
-rw-r--r--nova/tests/compute/test_compute.py1
-rw-r--r--nova/tests/test_db_api.py35
3 files changed, 48 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index eb1247e7d..40e0445bd 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1807,6 +1807,18 @@ def _instance_update(context, instance_uuid, values, copy_old_instance=False):
with session.begin():
instance_ref = instance_get_by_uuid(context, instance_uuid,
session=session)
+ # TODO(deva): remove extra_specs from here after it is included
+ # in system_metadata. Until then, the baremetal driver
+ # needs extra_specs added to instance[]
+ inst_type_ref = _instance_type_get_query(context, session=session).\
+ filter_by(id=instance_ref['instance_type_id']).\
+ first()
+ if inst_type_ref:
+ instance_ref['extra_specs'] = \
+ _dict_with_extra_specs(inst_type_ref).get('extra_specs', {})
+ else:
+ instance_ref['extra_specs'] = {}
+
if "expected_task_state" in values:
# it is not a db column so always pop out
expected = values.pop("expected_task_state")
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 451fc3d87..9465816ed 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -3980,6 +3980,7 @@ class ComputeAPITestCase(BaseTestCase):
instance = self._create_fake_instance(dict(host='host2'))
instance = db.instance_get_by_uuid(self.context, instance['uuid'])
instance = jsonutils.to_primitive(instance)
+ instance['instance_type']['extra_specs'] = []
orig_instance_type = instance['instance_type']
self.compute.run_instance(self.context, instance=instance)
# We need to set the host to something 'known'. Unfortunately,
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 92eae023a..0b0fed805 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -304,6 +304,41 @@ class DbApiTestCase(test.TestCase):
self.assertEquals("building", old_ref["vm_state"])
self.assertEquals("needscoffee", new_ref["vm_state"])
+ def test_instance_update_with_extra_specs(self):
+ """Ensure _extra_specs are returned from _instance_update"""
+ ctxt = context.get_admin_context()
+
+ # create a flavor
+ inst_type_dict = dict(
+ name="test_flavor",
+ memory_mb=1,
+ vcpus=1,
+ root_gb=1,
+ ephemeral_gb=1,
+ flavorid=105)
+ inst_type_ref = db.instance_type_create(ctxt, inst_type_dict)
+
+ # add some extra spec to our flavor
+ spec = {'test_spec': 'foo'}
+ db.instance_type_extra_specs_update_or_create(
+ ctxt,
+ inst_type_ref['flavorid'],
+ spec)
+
+ # create instance, just populates db, doesn't pull extra_spec
+ instance = db.instance_create(
+ ctxt,
+ {'instance_type_id': inst_type_ref['id']})
+ self.assertNotIn('extra_specs', instance)
+
+ # update instance, used when starting instance to set state, etc
+ (old_ref, new_ref) = db.instance_update_and_get_original(
+ ctxt,
+ instance['uuid'],
+ {})
+ self.assertEquals(spec, old_ref['extra_specs'])
+ self.assertEquals(spec, new_ref['extra_specs'])
+
def test_instance_fault_create(self):
"""Ensure we can create an instance fault"""
ctxt = context.get_admin_context()