diff --git a/manila/share/drivers/service_instance.py b/manila/share/drivers/service_instance.py index 30e11635e1..c670eca7e5 100644 --- a/manila/share/drivers/service_instance.py +++ b/manila/share/drivers/service_instance.py @@ -833,7 +833,8 @@ class NeutronNetworkHelper(BaseNetworkhelper): if router_id and subnet_id: ports = self.neutron_api.list_ports( - fields=['fixed_ips', 'device_id', 'device_owner']) + fields=['device_id', 'device_owner'], + fixed_ips=['subnet_id=%s' % subnet_id]) # NOTE(vponomaryov): iterate ports to get to know whether current # subnet is used or not. We will not remove it from router if it # is used. @@ -843,12 +844,10 @@ class NeutronNetworkHelper(BaseNetworkhelper): # we know that it is VM. We continue only if both are 'True'. if (port['device_id'] and port['device_owner'].startswith('compute:')): - for fixed_ip in port['fixed_ips']: - if fixed_ip['subnet_id'] == subnet_id: - # NOTE(vponomaryov): There are other share servers - # exist that use this subnet. So, do not remove it - # from router. - return + # NOTE(vponomaryov): There are other share servers + # exist that use this subnet. So, do not remove it + # from router. + return try: # NOTE(vponomaryov): there is no other share servers or # some VMs that use this subnet. So, remove it from router. diff --git a/manila/tests/share/drivers/test_service_instance.py b/manila/tests/share/drivers/test_service_instance.py index 358f6847df..2ea1a4352c 100644 --- a/manila/tests/share/drivers/test_service_instance.py +++ b/manila/tests/share/drivers/test_service_instance.py @@ -1687,8 +1687,7 @@ class NeutronNetworkHelperTestCase(test.TestCase): def test_teardown_network_subnet_is_used(self): server_details = dict(subnet_id='foo', router_id='bar') fake_ports = [ - {'fixed_ips': [{'subnet_id': server_details['subnet_id']}], - 'device_id': 'fake_device_id', + {'device_id': 'fake_device_id', 'device_owner': 'compute:foo'}, ] instance = self._init_neutron_network_plugin() @@ -1706,19 +1705,16 @@ class NeutronNetworkHelperTestCase(test.TestCase): service_instance.neutron.API.router_remove_interface.called) self.assertFalse(service_instance.neutron.API.update_subnet.called) service_instance.neutron.API.list_ports.assert_called_once_with( - fields=['fixed_ips', 'device_id', 'device_owner']) + fields=['device_id', 'device_owner'], fixed_ips=['subnet_id=foo']) def test_teardown_network_subnet_not_used(self): server_details = dict(subnet_id='foo', router_id='bar') fake_ports = [ - {'fixed_ips': [{'subnet_id': server_details['subnet_id']}], - 'device_id': 'fake_device_id', + {'device_id': 'fake_device_id', 'device_owner': 'network:router_interface'}, - {'fixed_ips': [{'subnet_id': 'bar' + server_details['subnet_id']}], - 'device_id': 'fake_device_id', + {'device_id': 'fake_device_id', 'device_owner': 'compute'}, - {'fixed_ips': [{'subnet_id': server_details['subnet_id']}], - 'device_id': '', + {'device_id': '', 'device_owner': 'compute'}, ] instance = self._init_neutron_network_plugin() @@ -1737,13 +1733,12 @@ class NeutronNetworkHelperTestCase(test.TestCase): (service_instance.neutron.API.update_subnet. assert_called_once_with('foo', '')) service_instance.neutron.API.list_ports.assert_called_once_with( - fields=['fixed_ips', 'device_id', 'device_owner']) + fields=['device_id', 'device_owner'], fixed_ips=['subnet_id=foo']) def test_teardown_network_subnet_not_used_and_get_error_404(self): server_details = dict(subnet_id='foo', router_id='bar') fake_ports = [ - {'fixed_ips': [{'subnet_id': server_details['subnet_id']}], - 'device_id': 'fake_device_id', + {'device_id': 'fake_device_id', 'device_owner': 'fake'}, ] instance = self._init_neutron_network_plugin() @@ -1763,13 +1758,12 @@ class NeutronNetworkHelperTestCase(test.TestCase): (service_instance.neutron.API.update_subnet. assert_called_once_with('foo', '')) service_instance.neutron.API.list_ports.assert_called_once_with( - fields=['fixed_ips', 'device_id', 'device_owner']) + fields=['device_id', 'device_owner'], fixed_ips=['subnet_id=foo']) def test_teardown_network_subnet_not_used_get_unhandled_error(self): server_details = dict(subnet_id='foo', router_id='bar') fake_ports = [ - {'fixed_ips': [{'subnet_id': server_details['subnet_id']}], - 'device_id': 'fake_device_id', + {'device_id': 'fake_device_id', 'device_owner': 'fake'}, ] instance = self._init_neutron_network_plugin() @@ -1790,7 +1784,7 @@ class NeutronNetworkHelperTestCase(test.TestCase): assert_called_once_with('bar', 'foo')) self.assertFalse(service_instance.neutron.API.update_subnet.called) service_instance.neutron.API.list_ports.assert_called_once_with( - fields=['fixed_ips', 'device_id', 'device_owner']) + fields=['device_id', 'device_owner'], fixed_ips=['subnet_id=foo']) def test_setup_network_and_connect_share_server_to_tenant_net(self): def fake_create_port(*aargs, **kwargs): diff --git a/releasenotes/notes/bug-1879754-teardown-network-d1887cdf6eb83388.yaml b/releasenotes/notes/bug-1879754-teardown-network-d1887cdf6eb83388.yaml new file mode 100644 index 0000000000..e71beb11a2 --- /dev/null +++ b/releasenotes/notes/bug-1879754-teardown-network-d1887cdf6eb83388.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - Fixed unneeded all ports list request to Neutron + in service instance helper module on tearing down + service subnet, Neutron can filter them by subnet_id itself.