diff --git a/zun/api/controllers/v1/containers.py b/zun/api/controllers/v1/containers.py index 5da9b27f6..b9ccf1eeb 100644 --- a/zun/api/controllers/v1/containers.py +++ b/zun/api/controllers/v1/containers.py @@ -400,7 +400,8 @@ class ContainersController(base.Controller): network.get('router:external'), 'shared': network.get('shared'), 'v4-fixed-ip': '', - 'v6-fixed-ip': ''}) + 'v6-fixed-ip': '', + 'preserve_on_delete': True}) elif net.get('network'): network = neutron_api.get_neutron_network(net['network']) requested_networks.append({'network': network['id'], @@ -411,7 +412,8 @@ class ContainersController(base.Controller): 'v4-fixed-ip': net.get('v4-fixed-ip', ''), 'v6-fixed-ip': - net.get('v6-fixed-ip', '')}) + net.get('v6-fixed-ip', ''), + 'preserve_on_delete': False}) if not requested_networks: # Find an available neutron net and create docker network by @@ -420,7 +422,8 @@ class ContainersController(base.Controller): requested_networks.append({'network': neutron_net['id'], 'port': '', 'v4-fixed-ip': '', - 'v6-fixed-ip': ''}) + 'v6-fixed-ip': '', + 'preserve_on_delete': False}) self._check_external_network_attach(context, requested_networks) return requested_networks diff --git a/zun/network/kuryr_network.py b/zun/network/kuryr_network.py index 15e3e37d3..251f6fcbe 100644 --- a/zun/network/kuryr_network.py +++ b/zun/network/kuryr_network.py @@ -192,6 +192,7 @@ class KuryrNetwork(network.Network): ipv4_address = None ipv6_address = None + preserve_on_delete = requested_network['preserve_on_delete'] addresses = [] for fixed_ip in neutron_port['fixed_ips']: ip_address = fixed_ip['ip_address'] @@ -201,14 +202,16 @@ class KuryrNetwork(network.Network): addresses.append({ 'addr': ip_address, 'version': 4, - 'port': neutron_port['id'] + 'port': neutron_port['id'], + 'preserve_on_delete': preserve_on_delete }) else: ipv6_address = ip_address addresses.append({ 'addr': ip_address, 'version': 6, - 'port': neutron_port['id'] + 'port': neutron_port['id'], + 'preserve_on_delete': preserve_on_delete }) kwargs = {} @@ -230,8 +233,9 @@ class KuryrNetwork(network.Network): if container.addresses and neutron_network_id: addrs_list = container.addresses.get(neutron_network_id, []) for addr in addrs_list: - port_id = addr['port'] - neutron_ports.add(port_id) + if not addr['preserve_on_delete']: + port_id = addr['port'] + neutron_ports.add(port_id) try: self.docker.disconnect_container_from_network(container_id, diff --git a/zun/tests/unit/api/controllers/v1/test_containers.py b/zun/tests/unit/api/controllers/v1/test_containers.py index a7f9646a8..a4f44115d 100644 --- a/zun/tests/unit/api/controllers/v1/test_containers.py +++ b/zun/tests/unit/api/controllers/v1/test_containers.py @@ -646,6 +646,7 @@ class TestContainerController(api_base.FunctionalTest): self.assertEqual(fake_port['network_id'], requested_networks[0]['network']) self.assertEqual(fake_port['id'], requested_networks[0]['port']) + self.assertTrue(requested_networks[0]['preserve_on_delete']) def side_effect(*args, **kwargs): (ctx, cnt, force) = args diff --git a/zun/tests/unit/network/test_kuryr_network.py b/zun/tests/unit/network/test_kuryr_network.py index a09ea69ea..642e09f10 100644 --- a/zun/tests/unit/network/test_kuryr_network.py +++ b/zun/tests/unit/network/test_kuryr_network.py @@ -110,9 +110,9 @@ class KuryrNetowrkTestCase(base.TestCase): container = Container(self.context, **utils.get_test_container()) network_name = 'c02afe4e-8350-4263-8078' kwargs = {'ip_version': 4, 'ipv4_address': '192.168.2.22', - 'port': '1234567'} + 'port': '1234567', 'preserve_on_delete': True} expected = [{'version': 4, 'addr': '192.168.2.22', - 'port': '1234567'}] + 'port': '1234567', 'preserve_on_delete': True}] address = self.network_api.connect_container_to_network(container, network_name, kwargs)