From 188ecf5fec78752c0834975e785158863635d54b Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sat, 31 Mar 2018 03:13:52 +0000 Subject: [PATCH] Pass requested_network on network_attach In RPC API, compute manager, and docker driver, change the 'network_attach' method to take a 'requested_network' dict instead of a network id. This set the stage for future patch that will extend the network_attach API to take more parameters than just the network id. Change-Id: Ic17be1aa3c58717324e52daffbe11580b6e9afd4 Partial-Bug: #1746654 --- zun/api/controllers/v1/containers.py | 5 +-- zun/compute/manager.py | 6 +-- zun/compute/rpcapi.py | 5 ++- zun/container/docker/driver.py | 8 +--- zun/container/driver.py | 2 +- zun/tests/unit/compute/test_compute_api.py | 3 +- .../container/docker/test_docker_driver.py | 37 +++++++++++-------- 7 files changed, 35 insertions(+), 31 deletions(-) diff --git a/zun/api/controllers/v1/containers.py b/zun/api/controllers/v1/containers.py index 60d913c78..976ceed4c 100644 --- a/zun/api/controllers/v1/containers.py +++ b/zun/api/controllers/v1/containers.py @@ -1029,9 +1029,8 @@ class ContainersController(base.Controller): "container:network_attach") context = pecan.request.context compute_api = pecan.request.compute_api - neutron_api = neutron.NeutronAPI(context) - neutron_net = neutron_api.get_neutron_network(kwargs.get('network')) - compute_api.network_attach(context, container, neutron_net['id']) + requested_networks = utils.build_requested_networks(context, [kwargs]) + compute_api.network_attach(context, container, requested_networks[0]) @base.Controller.api_version("1.13") @pecan.expose('json') diff --git a/zun/compute/manager.py b/zun/compute/manager.py index 77f6b37b3..7e4dc439b 100644 --- a/zun/compute/manager.py +++ b/zun/compute/manager.py @@ -1188,12 +1188,12 @@ class Manager(periodic_task.PeriodicTasks): @wrap_exception() @wrap_container_event(prefix='compute') - def network_attach(self, context, container, network): + def network_attach(self, context, container, requested_network): LOG.debug('Attach network: %(network)s to container: %(container)s.', - {'container': container, 'network': network}) + {'container': container, 'network': requested_network}) self._update_task_state(context, container, consts.NETWORK_ATTACHING) - self.driver.network_attach(context, container, network) + self.driver.network_attach(context, container, requested_network) self._update_task_state(context, container, None) def network_create(self, context, network): diff --git a/zun/compute/rpcapi.py b/zun/compute/rpcapi.py index 720394235..da09cb93d 100644 --- a/zun/compute/rpcapi.py +++ b/zun/compute/rpcapi.py @@ -199,9 +199,10 @@ class API(rpc_service.API): return self._call(container.host, 'network_detach', container=container, network=network) - def network_attach(self, context, container, network): + def network_attach(self, context, container, requested_network): return self._call(container.host, 'network_attach', - container=container, network=network) + container=container, + requested_network=requested_network) def network_create(self, context, new_network): host = None diff --git a/zun/container/docker/driver.py b/zun/container/docker/driver.py index 5b61daff3..657ddf582 100644 --- a/zun/container/docker/driver.py +++ b/zun/container/docker/driver.py @@ -1097,7 +1097,7 @@ class DockerDriver(driver.ContainerDriver): container.addresses = update container.save(context) - def network_attach(self, context, container, network): + def network_attach(self, context, container, requested_network): with docker_utils.docker_client() as docker: security_group_ids = None if container.security_groups: @@ -1105,6 +1105,7 @@ class DockerDriver(driver.ContainerDriver): context, container.security_groups) network_api = zun_network.api(context, docker_api=docker) + network = requested_network['network'] if network in container.addresses: raise exception.ZunException('Container %(container)s has' ' alreay connected to the network' @@ -1112,11 +1113,6 @@ class DockerDriver(driver.ContainerDriver): % {'container': container.uuid, 'network': network}) self._get_or_create_docker_network(context, network_api, network) - requested_network = {'network': network, - 'port': '', - 'v4-fixed-ip': '', - 'v6-fixed-ip': '', - 'preserve_on_delete': False} docker_net_name = self._get_docker_network_name(context, network) addrs = network_api.connect_container_to_network( container, docker_net_name, requested_network, diff --git a/zun/container/driver.py b/zun/container/driver.py index d42868f4f..ea19ce0dc 100644 --- a/zun/container/driver.py +++ b/zun/container/driver.py @@ -258,7 +258,7 @@ class ContainerDriver(object): def network_detach(self, context, container, network): raise NotImplementedError() - def network_attach(self, context, container, network): + def network_attach(self, context, container, requested_network): raise NotImplementedError() def create_network(self, context, network): diff --git a/zun/tests/unit/compute/test_compute_api.py b/zun/tests/unit/compute/test_compute_api.py index 9cf4ce68b..79828954f 100644 --- a/zun/tests/unit/compute/test_compute_api.py +++ b/zun/tests/unit/compute/test_compute_api.py @@ -450,7 +450,8 @@ class TestAPI(base.TestCase): self.context, container.uuid, container_actions.NETWORK_ATTACH, want_result=False) mock_call.assert_called_once_with( - container.host, "network_attach", container=container, network={}) + container.host, "network_attach", container=container, + requested_network={}) @mock.patch('zun.compute.rpcapi.API._call') @mock.patch.object(objects.ContainerAction, 'action_start') diff --git a/zun/tests/unit/container/docker/test_docker_driver.py b/zun/tests/unit/container/docker/test_docker_driver.py index 9a5254e93..4f17a93ad 100644 --- a/zun/tests/unit/container/docker/test_docker_driver.py +++ b/zun/tests/unit/container/docker/test_docker_driver.py @@ -796,24 +796,30 @@ class TestDockerDriver(base.DriverTestCase): mock_container.security_groups = None mock_container.addresses = {} mock_list.return_value = {'network': 'network'} - requested_network = [{'network': 'network', - 'port': '', - 'v4-fixed-ip': '', - 'v6-fixed-ip': '', - 'preserve_on_delete': False}] - self.driver.network_attach(self.context, mock_container, 'network') + requested_network = {'network': 'network', + 'port': '', + 'v4-fixed-ip': '', + 'v6-fixed-ip': '', + 'preserve_on_delete': False} + self.driver.network_attach(self.context, mock_container, + requested_network) mock_connect.assert_called_once_with(mock_container, 'network', - requested_network[0], + requested_network, security_groups=None) def test_network_attach_error(self): mock_container = mock.Mock() mock_container.security_groups = None mock_container.addresses = {'already-attached-net': []} + requested_network = {'network': 'already-attached-net', + 'port': '', + 'v4-fixed-ip': '', + 'v6-fixed-ip': '', + 'preserve_on_delete': False} self.assertRaises(exception.ZunException, self.driver.network_attach, - self.context, mock_container, 'already-attached-net') + self.context, mock_container, requested_network) @mock.patch('zun.common.utils.get_security_group_ids') @mock.patch('zun.network.kuryr_network.KuryrNetwork' @@ -829,15 +835,16 @@ class TestDockerDriver(base.DriverTestCase): mock_container.addresses = {} mock_list.return_value = {'network': 'network'} mock_get_sec_group_id.return_value = test_sec_group_id - requested_network = [{'network': 'network', - 'port': '', - 'v4-fixed-ip': '', - 'v6-fixed-ip': '', - 'preserve_on_delete': False}] - self.driver.network_attach(self.context, mock_container, 'network') + requested_network = {'network': 'network', + 'port': '', + 'v4-fixed-ip': '', + 'v6-fixed-ip': '', + 'preserve_on_delete': False} + self.driver.network_attach(self.context, mock_container, + requested_network) mock_connect.assert_called_once_with(mock_container, 'network', - requested_network[0], + requested_network, security_groups=test_sec_group_id) @mock.patch('zun.common.utils.execute')