summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nova/compute/api.py10
-rw-r--r--nova/compute/manager.py11
-rw-r--r--nova/compute/rpcapi.py28
-rw-r--r--nova/db/sqlalchemy/api.py7
-rw-r--r--nova/tests/unit/compute/test_compute.py12
-rw-r--r--nova/tests/unit/compute/test_rpcapi.py22
-rw-r--r--nova/tests/unit/db/test_db_api.py25
7 files changed, 70 insertions, 45 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 81340906e8..3d0405220f 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -3833,7 +3833,7 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
def __init__(self, skip_policy_check=False, **kwargs):
super(SecurityGroupAPI, self).__init__(**kwargs)
self.skip_policy_check = skip_policy_check
- self.security_group_rpcapi = compute_rpcapi.SecurityGroupAPI()
+ self.compute_rpcapi = compute_rpcapi.ComputeAPI()
def validate_property(self, value, property, allowed):
"""Validate given security group property.
@@ -4030,7 +4030,7 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
security_group['id'])
# NOTE(comstud): No instance_uuid argument to this compute manager
# call
- self.security_group_rpcapi.refresh_security_group_rules(context,
+ self.compute_rpcapi.refresh_security_group_rules(context,
security_group['id'], host=instance.host)
@wrap_check_security_groups_policy
@@ -4053,7 +4053,7 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
security_group['id'])
# NOTE(comstud): No instance_uuid argument to this compute manager
# call
- self.security_group_rpcapi.refresh_security_group_rules(context,
+ self.compute_rpcapi.refresh_security_group_rules(context,
security_group['id'], host=instance.host)
def get_rule(self, context, id):
@@ -4158,7 +4158,7 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
for instance in security_group['instances']:
if instance.host is not None:
- self.security_group_rpcapi.refresh_instance_security_rules(
+ self.compute_rpcapi.refresh_instance_security_rules(
context, instance.host, instance)
def trigger_members_refresh(self, context, group_ids):
@@ -4194,7 +4194,7 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
# ..then we send a request to refresh the rules for each instance.
for instance in instances.values():
if instance.host:
- self.security_group_rpcapi.refresh_instance_security_rules(
+ self.compute_rpcapi.refresh_instance_security_rules(
context, instance.host, instance)
def get_instance_security_groups(self, context, instance_uuid,
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 0e3527d87b..5d86698a74 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -6704,6 +6704,17 @@ class _ComputeV4Proxy(object):
bdms, recreate, on_shared_storage,
preserve_ephemeral=preserve_ephemeral)
+ def refresh_security_group_rules(self, ctxt, security_group_id):
+ return self.manager.refresh_security_group_rules(ctxt,
+ security_group_id)
+
+ def refresh_security_group_members(self, ctxt, security_group_id):
+ return self.manager.refresh_security_group_members(ctxt,
+ security_group_id)
+
+ def refresh_instance_security_rules(self, ctxt, instance):
+ return self.manager.refresh_instance_security_rules(ctxt, instance)
+
def refresh_provider_fw_rules(self, ctxt):
return self.manager.refresh_provider_fw_rules(ctxt)
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index fe116f6d13..9ea77553bc 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -1052,43 +1052,21 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'unquiesce_instance', instance=instance,
mapping=mapping)
-
-class SecurityGroupAPI(object):
- '''Client side of the security group rpc API.
-
- API version history:
-
- 1.0 - Initial version.
- 1.41 - Adds refresh_instance_security_rules()
-
- 2.0 - Remove 1.x backwards compat
-
- 3.0 - Identical to 2.x, but has to be bumped at the same time as the
- compute API since it's all together on the server side.
- '''
-
- def __init__(self):
- super(SecurityGroupAPI, self).__init__()
- target = messaging.Target(topic=CONF.compute_topic, version='3.0')
- version_cap = ComputeAPI.VERSION_ALIASES.get(
- CONF.upgrade_levels.compute, CONF.upgrade_levels.compute)
- self.client = rpc.get_client(target, version_cap)
-
def refresh_security_group_rules(self, ctxt, security_group_id, host):
- version = '3.0'
+ version = self._compat_ver('4.0', '3.0')
cctxt = self.client.prepare(server=host, version=version)
cctxt.cast(ctxt, 'refresh_security_group_rules',
security_group_id=security_group_id)
def refresh_security_group_members(self, ctxt, security_group_id,
host):
- version = '3.0'
+ version = self._compat_ver('4.0', '3.0')
cctxt = self.client.prepare(server=host, version=version)
cctxt.cast(ctxt, 'refresh_security_group_members',
security_group_id=security_group_id)
def refresh_instance_security_rules(self, ctxt, host, instance):
- version = '3.0'
+ version = self._compat_ver('4.0', '3.0')
instance_p = jsonutils.to_primitive(instance)
cctxt = self.client.prepare(server=_compute_host(None, instance),
version=version)
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/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py
index 3fe262959a..2679d33f8e 100644
--- a/nova/tests/unit/compute/test_compute.py
+++ b/nova/tests/unit/compute/test_compute.py
@@ -9642,7 +9642,7 @@ class ComputeAPITestCase(BaseTestCase):
rule_get)
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
rpcapi.refresh_instance_security_rules(self.context,
instance['host'],
@@ -9668,7 +9668,7 @@ class ComputeAPITestCase(BaseTestCase):
rule_get)
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
rpcapi.refresh_instance_security_rules(self.context,
instance['host'],
@@ -9692,7 +9692,7 @@ class ComputeAPITestCase(BaseTestCase):
rule_get)
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
self.mox.ReplayAll()
@@ -9708,7 +9708,7 @@ class ComputeAPITestCase(BaseTestCase):
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
rpcapi.refresh_instance_security_rules(self.context,
instance['host'],
@@ -9726,7 +9726,7 @@ class ComputeAPITestCase(BaseTestCase):
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
rpcapi.refresh_instance_security_rules(self.context,
instance['host'],
@@ -9742,7 +9742,7 @@ class ComputeAPITestCase(BaseTestCase):
self.stubs.Set(self.compute_api.db, 'security_group_get', group_get)
- rpcapi = self.security_group_api.security_group_rpcapi
+ rpcapi = compute_rpcapi.ComputeAPI
self.mox.StubOutWithMock(rpcapi, 'refresh_instance_security_rules')
self.mox.ReplayAll()
diff --git a/nova/tests/unit/compute/test_rpcapi.py b/nova/tests/unit/compute/test_rpcapi.py
index eca124d7ad..89c5b297e7 100644
--- a/nova/tests/unit/compute/test_rpcapi.py
+++ b/nova/tests/unit/compute/test_rpcapi.py
@@ -579,23 +579,29 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_refresh_security_group_rules(self):
self._test_compute_api('refresh_security_group_rules', 'cast',
- rpcapi_class=compute_rpcapi.SecurityGroupAPI,
- security_group_id='id', host='host')
+ security_group_id='id', host='host', version='4.0')
self.flags(compute='kilo', group='upgrade_levels')
self._test_compute_api('refresh_security_group_rules', 'cast',
- rpcapi_class=compute_rpcapi.SecurityGroupAPI,
- security_group_id='id', host='host')
+ security_group_id='id', host='host', version='3.0')
def test_refresh_security_group_members(self):
self._test_compute_api('refresh_security_group_members', 'cast',
- rpcapi_class=compute_rpcapi.SecurityGroupAPI,
- security_group_id='id', host='host')
+ security_group_id='id', host='host', version='4.0')
self.flags(compute='kilo', group='upgrade_levels')
self._test_compute_api('refresh_security_group_members', 'cast',
- rpcapi_class=compute_rpcapi.SecurityGroupAPI,
- security_group_id='id', host='host')
+ security_group_id='id', host='host', version='3.0')
+
+ def test_refresh_instance_security_rules(self):
+ self._test_compute_api('refresh_instance_security_rules', 'cast',
+ host='fake_host', instance=self.fake_instance_obj,
+ version='4.0', assert_dict=True)
+
+ self.flags(compute='kilo', group='upgrade_levels')
+ self._test_compute_api('refresh_instance_security_rules', 'cast',
+ host='fake_host', instance=self.fake_instance_obj,
+ version='3.0', assert_dict=True)
def test_remove_aggregate_host(self):
self._test_compute_api('remove_aggregate_host', 'cast',
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):