diff options
author | Zuul <zuul@review.openstack.org> | 2019-04-15 16:11:32 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2019-04-15 16:11:32 +0000 |
commit | 5a18cb3c3d8e4405ba884565f71918615155717d (patch) | |
tree | 36cabc72d5df95102db879a22721a7e3d1d173dd | |
parent | c50d50e9410ed32692bbcf6911c40dd67deabc80 (diff) | |
parent | 0b3e45387ce1979b394b38d6e124e001e2898c1a (diff) | |
download | nova-5a18cb3c3d8e4405ba884565f71918615155717d.tar.gz |
Merge "Update port device_owner when unshelving" into stable/ocata
-rw-r--r-- | nova/network/neutronv2/api.py | 11 | ||||
-rw-r--r-- | nova/tests/unit/network/test_neutronv2.py | 17 |
2 files changed, 25 insertions, 3 deletions
diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 3250c93d70..122d328860 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -2385,6 +2385,13 @@ class API(base_api.NetworkAPI): def cleanup_instance_network_on_host(self, context, instance, host): """Cleanup network for specified instance on host.""" + # TODO(mriedem): This should likely be implemented at least for the + # shelve offload operation because the instance is being removed from + # a compute host, VIFs are unplugged, etc, so the ports should also + # be unbound, albeit still logically attached to the instance (for the + # shelve scenario). If _unbind_ports was going to be leveraged here, it + # would have to be adjusted a bit since it currently clears the + # device_id field on the port which is not what we'd want for shelve. pass def _get_pci_devices_from_migration_context(self, migration_context, @@ -2446,6 +2453,10 @@ class API(base_api.NetworkAPI): # same host, there is nothing to do. if p.get(BINDING_HOST_ID) != host: updates[BINDING_HOST_ID] = host + # If the host changed, the AZ could have also changed so we + # need to update the device_owner. + updates['device_owner'] = ( + 'compute:%s' % instance.availability_zone) # NOTE: Before updating the port binding make sure we # remove the pre-migration status from the binding profile if binding_profile.get(MIGRATING_ATTR): diff --git a/nova/tests/unit/network/test_neutronv2.py b/nova/tests/unit/network/test_neutronv2.py index a8427de481..a4526762c6 100644 --- a/nova/tests/unit/network/test_neutronv2.py +++ b/nova/tests/unit/network/test_neutronv2.py @@ -3911,6 +3911,9 @@ class TestNeutronv2WithMock(test.TestCase): # removed since it does not match with the current host. update_port_mock.assert_called_once_with( 'fake-port-1', {'port': {neutronapi.BINDING_HOST_ID: 'my-host', + 'device_owner': + 'compute:%s' % + instance.availability_zone, neutronapi.BINDING_PROFILE: { 'fake_profile': 'fake_data'}}}) @@ -3937,7 +3940,10 @@ class TestNeutronv2WithMock(test.TestCase): # Assert that update_port was called on the port with a # different host but with no binding profile. update_port_mock.assert_called_once_with( - uuids.portid, {'port': {neutronapi.BINDING_HOST_ID: 'my-host'}}) + uuids.portid, {'port': {neutronapi.BINDING_HOST_ID: 'my-host', + 'device_owner': + 'compute:%s' % + instance.availability_zone}}) @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock()) def test_update_port_bindings_for_instance_same_host(self, @@ -3961,7 +3967,9 @@ class TestNeutronv2WithMock(test.TestCase): # Assert that update_port was only called on the port without a host. update_port_mock.assert_called_once_with( 'fake-port-2', - {'port': {neutronapi.BINDING_HOST_ID: instance.host}}) + {'port': {neutronapi.BINDING_HOST_ID: instance.host, + 'device_owner': 'compute:%s' % + instance.availability_zone}}) @mock.patch.object(pci_whitelist.Whitelist, 'get_devspec') @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock()) @@ -4016,6 +4024,7 @@ class TestNeutronv2WithMock(test.TestCase): 'fake-port-1', {'port': {neutronapi.BINDING_HOST_ID: 'fake-host', + 'device_owner': 'compute:%s' % instance.availability_zone, neutronapi.BINDING_PROFILE: {'pci_slot': '0000:0b:00.1', 'physical_network': 'physnet1', @@ -5139,7 +5148,9 @@ class TestNeutronv2Portbinding(TestNeutronv2Base): ports = {'ports': [{'id': 'test1'}]} self.moxed_client.list_ports(**search_opts).AndReturn(ports) port_req_body = {'port': - {neutronapi.BINDING_HOST_ID: expected_bind_host}} + {neutronapi.BINDING_HOST_ID: expected_bind_host, + 'device_owner': 'compute:%s' % + self.instance['availability_zone']}} self.moxed_client.update_port('test1', port_req_body).AndReturn(None) self.mox.ReplayAll() |