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
This commit is contained in:
Hongbin Lu 2018-03-31 03:13:52 +00:00
parent e3bd9f9537
commit 188ecf5fec
7 changed files with 35 additions and 31 deletions

View File

@ -1029,9 +1029,8 @@ class ContainersController(base.Controller):
"container:network_attach") "container:network_attach")
context = pecan.request.context context = pecan.request.context
compute_api = pecan.request.compute_api compute_api = pecan.request.compute_api
neutron_api = neutron.NeutronAPI(context) requested_networks = utils.build_requested_networks(context, [kwargs])
neutron_net = neutron_api.get_neutron_network(kwargs.get('network')) compute_api.network_attach(context, container, requested_networks[0])
compute_api.network_attach(context, container, neutron_net['id'])
@base.Controller.api_version("1.13") @base.Controller.api_version("1.13")
@pecan.expose('json') @pecan.expose('json')

View File

@ -1188,12 +1188,12 @@ class Manager(periodic_task.PeriodicTasks):
@wrap_exception() @wrap_exception()
@wrap_container_event(prefix='compute') @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.', 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, self._update_task_state(context, container,
consts.NETWORK_ATTACHING) 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) self._update_task_state(context, container, None)
def network_create(self, context, network): def network_create(self, context, network):

View File

@ -199,9 +199,10 @@ class API(rpc_service.API):
return self._call(container.host, 'network_detach', return self._call(container.host, 'network_detach',
container=container, network=network) 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', return self._call(container.host, 'network_attach',
container=container, network=network) container=container,
requested_network=requested_network)
def network_create(self, context, new_network): def network_create(self, context, new_network):
host = None host = None

View File

@ -1097,7 +1097,7 @@ class DockerDriver(driver.ContainerDriver):
container.addresses = update container.addresses = update
container.save(context) 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: with docker_utils.docker_client() as docker:
security_group_ids = None security_group_ids = None
if container.security_groups: if container.security_groups:
@ -1105,6 +1105,7 @@ class DockerDriver(driver.ContainerDriver):
context, container.security_groups) context, container.security_groups)
network_api = zun_network.api(context, network_api = zun_network.api(context,
docker_api=docker) docker_api=docker)
network = requested_network['network']
if network in container.addresses: if network in container.addresses:
raise exception.ZunException('Container %(container)s has' raise exception.ZunException('Container %(container)s has'
' alreay connected to the network' ' alreay connected to the network'
@ -1112,11 +1113,6 @@ class DockerDriver(driver.ContainerDriver):
% {'container': container.uuid, % {'container': container.uuid,
'network': network}) 'network': network})
self._get_or_create_docker_network(context, network_api, 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) docker_net_name = self._get_docker_network_name(context, network)
addrs = network_api.connect_container_to_network( addrs = network_api.connect_container_to_network(
container, docker_net_name, requested_network, container, docker_net_name, requested_network,

View File

@ -258,7 +258,7 @@ class ContainerDriver(object):
def network_detach(self, context, container, network): def network_detach(self, context, container, network):
raise NotImplementedError() raise NotImplementedError()
def network_attach(self, context, container, network): def network_attach(self, context, container, requested_network):
raise NotImplementedError() raise NotImplementedError()
def create_network(self, context, network): def create_network(self, context, network):

View File

@ -450,7 +450,8 @@ class TestAPI(base.TestCase):
self.context, container.uuid, self.context, container.uuid,
container_actions.NETWORK_ATTACH, want_result=False) container_actions.NETWORK_ATTACH, want_result=False)
mock_call.assert_called_once_with( 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('zun.compute.rpcapi.API._call')
@mock.patch.object(objects.ContainerAction, 'action_start') @mock.patch.object(objects.ContainerAction, 'action_start')

View File

@ -796,24 +796,30 @@ class TestDockerDriver(base.DriverTestCase):
mock_container.security_groups = None mock_container.security_groups = None
mock_container.addresses = {} mock_container.addresses = {}
mock_list.return_value = {'network': 'network'} mock_list.return_value = {'network': 'network'}
requested_network = [{'network': 'network', requested_network = {'network': 'network',
'port': '', 'port': '',
'v4-fixed-ip': '', 'v4-fixed-ip': '',
'v6-fixed-ip': '', 'v6-fixed-ip': '',
'preserve_on_delete': False}] 'preserve_on_delete': False}
self.driver.network_attach(self.context, mock_container, 'network') self.driver.network_attach(self.context, mock_container,
requested_network)
mock_connect.assert_called_once_with(mock_container, mock_connect.assert_called_once_with(mock_container,
'network', 'network',
requested_network[0], requested_network,
security_groups=None) security_groups=None)
def test_network_attach_error(self): def test_network_attach_error(self):
mock_container = mock.Mock() mock_container = mock.Mock()
mock_container.security_groups = None mock_container.security_groups = None
mock_container.addresses = {'already-attached-net': []} 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.assertRaises(exception.ZunException,
self.driver.network_attach, 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.common.utils.get_security_group_ids')
@mock.patch('zun.network.kuryr_network.KuryrNetwork' @mock.patch('zun.network.kuryr_network.KuryrNetwork'
@ -829,15 +835,16 @@ class TestDockerDriver(base.DriverTestCase):
mock_container.addresses = {} mock_container.addresses = {}
mock_list.return_value = {'network': 'network'} mock_list.return_value = {'network': 'network'}
mock_get_sec_group_id.return_value = test_sec_group_id mock_get_sec_group_id.return_value = test_sec_group_id
requested_network = [{'network': 'network', requested_network = {'network': 'network',
'port': '', 'port': '',
'v4-fixed-ip': '', 'v4-fixed-ip': '',
'v6-fixed-ip': '', 'v6-fixed-ip': '',
'preserve_on_delete': False}] 'preserve_on_delete': False}
self.driver.network_attach(self.context, mock_container, 'network') self.driver.network_attach(self.context, mock_container,
requested_network)
mock_connect.assert_called_once_with(mock_container, mock_connect.assert_called_once_with(mock_container,
'network', 'network',
requested_network[0], requested_network,
security_groups=test_sec_group_id) security_groups=test_sec_group_id)
@mock.patch('zun.common.utils.execute') @mock.patch('zun.common.utils.execute')