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
This commit is contained in:
Kien Nguyen 2017-11-07 14:50:52 +07:00
parent deaa99a797
commit 223c8d9976
4 changed files with 17 additions and 9 deletions

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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)