diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-03-02 04:36:24 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-03-02 04:36:24 +0000 |
| commit | f55182e21496dfcfc599d8075cedc428eecd33d1 (patch) | |
| tree | f9083bd93f86a0dce34b351549194b77dd8422c3 | |
| parent | 8296533147b3a974a94c443a4164a97d9434fd8b (diff) | |
| parent | 394c693e359ed4f19cc2f7d975b1f9ee5500b7f6 (diff) | |
| download | nova-f55182e21496dfcfc599d8075cedc428eecd33d1.tar.gz nova-f55182e21496dfcfc599d8075cedc428eecd33d1.tar.xz nova-f55182e21496dfcfc599d8075cedc428eecd33d1.zip | |
Merge "Make allocate_for_instance() return only info about ports allocated"
| -rwxr-xr-x | nova/compute/manager.py | 12 | ||||
| -rw-r--r-- | nova/network/quantumv2/api.py | 11 | ||||
| -rw-r--r-- | nova/tests/network/test_quantumv2.py | 14 |
3 files changed, 28 insertions, 9 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index ef93e9e83..02f103dbc 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -2791,13 +2791,15 @@ class ComputeManager(manager.SchedulerDependentManager): network_info = self.network_api.allocate_port_for_instance( context, instance, port_id, network_id, requested_ip, self.conductor_api) + if len(network_info) != 1: + LOG.error(_('allocate_port_for_instance returned %(port)s ports') % + dict(ports=len(network_info))) + raise exception.InterfaceAttachFailed(instance=instance) image_meta = _get_image_meta(context, instance['image_ref']) legacy_net_info = self._legacy_nw_info(network_info) - for (network, mapping) in legacy_net_info: - if mapping['vif_uuid'] == port_id: - self.driver.attach_interface(instance, image_meta, - [(network, mapping)]) - return (network, mapping) + (network, mapping) = legacy_net_info[0] + self.driver.attach_interface(instance, image_meta, legacy_net_info) + return legacy_net_info[0] def detach_interface(self, context, instance, port_id): """Detach an network adapter from an instance.""" diff --git a/nova/network/quantumv2/api.py b/nova/network/quantumv2/api.py index 735adbe15..5537048a7 100644 --- a/nova/network/quantumv2/api.py +++ b/nova/network/quantumv2/api.py @@ -279,8 +279,15 @@ class API(base.Base): self.trigger_security_group_members_refresh(context, instance) self.trigger_instance_add_security_group_refresh(context, instance) - return self.get_instance_nw_info(context, instance, networks=nets, - conductor_api=kwargs.get('conductor_api')) + nw_info = self.get_instance_nw_info(context, instance, networks=nets, + conductor_api=kwargs.get('conductor_api')) + # NOTE(danms): Only return info about ports we created in this run. + # In the initial allocation case, this will be everything we created, + # and in later runs will only be what was created that time. Thus, + # this only affects the attach case, not the original use for this + # method. + return network_model.NetworkInfo([port for port in nw_info + if port['id'] in created_port_ids]) def _refresh_quantum_extensions_cache(self): if (not self.last_quantum_extension_sync or diff --git a/nova/tests/network/test_quantumv2.py b/nova/tests/network/test_quantumv2.py index 5d81c2b2a..167b418ad 100644 --- a/nova/tests/network/test_quantumv2.py +++ b/nova/tests/network/test_quantumv2.py @@ -227,6 +227,7 @@ class TestQuantumv2(test.TestCase): 'port_id': self.port_data2[1]['id'], 'fixed_ip_address': fixed_ip_address, 'router_id': 'router_id1'} + self._returned_nw_info = [] def tearDown(self): self.addCleanup(CONF.reset) @@ -457,13 +458,14 @@ class TestQuantumv2(test.TestCase): api.get_instance_nw_info(mox.IgnoreArg(), self.instance, networks=nets, - conductor_api=mox.IgnoreArg()).AndReturn(None) + conductor_api=mox.IgnoreArg()).AndReturn( + self._returned_nw_info) self.mox.ReplayAll() return api def _allocate_for_instance(self, net_idx=1, **kwargs): api = self._stub_allocate_for_instance(net_idx, **kwargs) - api.allocate_for_instance(self.context, self.instance, **kwargs) + return api.allocate_for_instance(self.context, self.instance, **kwargs) def test_allocate_for_instance_1(self): # Allocate one port in one network env. @@ -646,6 +648,14 @@ class TestQuantumv2(test.TestCase): self.context, self.instance, requested_networks=[(None, None, None)]) + def test_allocate_for_instance_second_time(self): + # Make sure that allocate_for_instance only returns ports that it + # allocated during _that_ run. + new_port = {'id': 'fake'} + self._returned_nw_info = self.port_data1 + [new_port] + nw_info = self._allocate_for_instance() + self.assertEqual(nw_info, [new_port]) + def _deallocate_for_instance(self, number): port_data = number == 1 and self.port_data1 or self.port_data2 self.moxed_client.list_ports( |
