From 223c8d9976e8f9f2ea46947a8e5ec1baa0ccd9d4 Mon Sep 17 00:00:00 2001 From: Kien Nguyen Date: Tue, 7 Nov 2017 14:50:52 +0700 Subject: [PATCH] Preserve preexisting ports on container delete This patch allow the existing port to be unbound from the container on container delete whereupon the port will still exist but not be associated with the container. Change-Id: Id047ccf8b7189a0fd149ac88f3776f2573c319cd Closes-Bug: #1704016 --- zun/api/controllers/v1/containers.py | 9 ++++++--- zun/network/kuryr_network.py | 12 ++++++++---- zun/tests/unit/api/controllers/v1/test_containers.py | 1 + zun/tests/unit/network/test_kuryr_network.py | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) 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)