diff options
-rw-r--r-- | nova/compute/api.py | 10 | ||||
-rw-r--r-- | nova/compute/manager.py | 11 | ||||
-rw-r--r-- | nova/compute/rpcapi.py | 28 | ||||
-rw-r--r-- | nova/db/sqlalchemy/api.py | 7 | ||||
-rw-r--r-- | nova/tests/unit/compute/test_compute.py | 12 | ||||
-rw-r--r-- | nova/tests/unit/compute/test_rpcapi.py | 22 | ||||
-rw-r--r-- | nova/tests/unit/db/test_db_api.py | 25 |
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): |