summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2019-04-15 16:11:32 +0000
committerGerrit Code Review <review@openstack.org>2019-04-15 16:11:32 +0000
commit5a18cb3c3d8e4405ba884565f71918615155717d (patch)
tree36cabc72d5df95102db879a22721a7e3d1d173dd
parentc50d50e9410ed32692bbcf6911c40dd67deabc80 (diff)
parent0b3e45387ce1979b394b38d6e124e001e2898c1a (diff)
downloadnova-5a18cb3c3d8e4405ba884565f71918615155717d.tar.gz
Merge "Update port device_owner when unshelving" into stable/ocata
-rw-r--r--nova/network/neutronv2/api.py11
-rw-r--r--nova/tests/unit/network/test_neutronv2.py17
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()