Implement delete network

Needed-By: https://review.openstack.org/#/c/615399/
Change-Id: I4c92c87219b03a891a57d51bcb60bee3b2d1503c
This commit is contained in:
Hongbin Lu 2018-11-04 03:04:04 +00:00
parent e1253d638f
commit 10c567f5bb
16 changed files with 95 additions and 9 deletions

View File

@ -25,7 +25,7 @@
test-config:
$TEMPEST_CONFIG:
container_service:
min_microversion: 1.26
min_microversion: 1.27
devstack_services:
tempest: true
devstack_plugins:

View File

@ -21,10 +21,22 @@ from zun.api import utils as api_utils
from zun.api import validation
from zun.common import exception
from zun.common import policy
from zun import objects
LOG = logging.getLogger(__name__)
def _get_network(context, network_ident):
networks = objects.Network.list(
context,
filters={'neutron_net_id': network_ident})
if not networks:
raise exception.NetworkNotFound(network=network_ident)
return networks[0]
class NetworkCollection(collection.Collection):
"""API representation of a collection of network."""
@ -64,3 +76,19 @@ class NetworkController(base.Controller):
new_network = pecan.request.compute_api.network_create(
context, network_dict['neutron_net_id'])
return view.format_network(pecan.request.host_url, new_network)
@base.Controller.api_version("1.27") # noqa
@pecan.expose('json')
@exception.wrap_pecan_controller_exception
def delete(self, network_ident, **kwargs):
"""Delete a network.
:param network_ident: UUID of the network.
"""
context = pecan.request.context
policy.enforce(context, "network:delete", action="network:delete")
context.all_projects = True
network = _get_network(context, network_ident)
compute_api = pecan.request.compute_api
compute_api.network_delete(context, network)
pecan.response.status = 204

View File

@ -59,10 +59,11 @@ REST_API_VERSION_HISTORY = """REST API Version History:
* 1.24 - Add exposed_ports to container
* 1.25 - Encode/Decode archive file
* 1.26 - Introduce Quota support
* 1.27 - Add support for deleting networks
"""
BASE_VER = '1.1'
CURRENT_MAX_VER = '1.26'
CURRENT_MAX_VER = '1.27'
class Version(object):

View File

@ -214,3 +214,8 @@ user documentation.
----
Introduce Quota support API
1.27
----
Introduce API for deleting network. By default, this is an admin API.

View File

@ -38,6 +38,17 @@ rules = [
'method': 'POST'
}
]
),
policy.DocumentedRuleDefault(
name=NETWORK % 'delete',
check_str=base.ROLE_ADMIN,
description='Delete a network',
operations=[
{
'path': '/v1/networks',
'method': 'DELETE'
}
]
)
]

View File

@ -237,5 +237,8 @@ class API(object):
def network_create(self, context, *args):
return self.rpcapi.network_create(context, *args)
def network_delete(self, context, *args):
return self.rpcapi.network_delete(context, *args)
def resize_container(self, context, container, *args):
return self.rpcapi.resize_container(context, container, *args)

View File

@ -1291,6 +1291,10 @@ class Manager(periodic_task.PeriodicTasks):
LOG.debug('Create network')
return self.driver.create_network(context, neutron_net_id)
def network_delete(self, context, network):
LOG.debug('Delete network')
self.driver.delete_network(context, network)
def resize_container(self, context, container, patch):
@utils.synchronized(container.uuid)
def do_container_resize():

View File

@ -210,3 +210,8 @@ class API(rpc_service.API):
host = None
return self._call(host, 'network_create',
neutron_net_id=neutron_net_id)
def network_delete(self, context, network):
host = None
return self._call(host, 'network_delete',
network=network)

View File

@ -1239,3 +1239,9 @@ class DockerDriver(driver.ContainerDriver):
return network_api.create_network(
neutron_net_id=neutron_net_id,
name=docker_net_name)
def delete_network(self, context, network):
with docker_utils.docker_client() as docker:
network_api = zun_network.api(context,
docker_api=docker)
network_api.remove_network(network)

View File

@ -266,6 +266,9 @@ class ContainerDriver(object):
def create_network(self, context, network):
raise NotImplementedError()
def delete_network(self, context, network):
raise NotImplementedError()
def inspect_network(self, network):
raise NotImplementedError()

View File

@ -183,8 +183,9 @@ class KuryrNetwork(network.Network):
"Multiple Neutron subnets exist with ip version %s") %
ip_version)
def remove_network(self, network_name):
self.docker.remove_network(network_name)
def remove_network(self, network):
self.docker.remove_network(network.name)
network.destroy()
def inspect_network(self, network_name):
return self.docker.inspect_network(network_name)

View File

@ -26,7 +26,7 @@ from zun.tests.unit.db import base
PATH_PREFIX = '/v1'
CURRENT_VERSION = "container 1.26"
CURRENT_VERSION = "container 1.27"
class FunctionalTest(base.DbTestCase):

View File

@ -28,7 +28,7 @@ class TestRootController(api_base.FunctionalTest):
'default_version':
{'id': 'v1',
'links': [{'href': 'http://localhost/v1/', 'rel': 'self'}],
'max_version': '1.26',
'max_version': '1.27',
'min_version': '1.1',
'status': 'CURRENT'},
'description': 'Zun is an OpenStack project which '
@ -37,7 +37,7 @@ class TestRootController(api_base.FunctionalTest):
'versions': [{'id': 'v1',
'links': [{'href': 'http://localhost/v1/',
'rel': 'self'}],
'max_version': '1.26',
'max_version': '1.27',
'min_version': '1.1',
'status': 'CURRENT'}]}

View File

@ -29,3 +29,15 @@ class TestNetworkController(api_base.FunctionalTest):
self.assertEqual(200, response.status_int)
self.assertTrue(mock_network_create.called)
@patch('zun.objects.Network.list')
@patch('zun.common.policy.enforce')
@patch('zun.compute.api.API.network_delete')
def test_network_delete(self, mock_network_delete, mock_policy,
mock_network_list):
mock_policy.return_value = True
test_object = utils.create_test_network(context=self.context)
mock_network_list.return_value = [test_object]
response = self.delete('/v1/networks/%s' % test_object.get('uuid'))
self.assertEqual(204, response.status_int)
self.assertTrue(mock_network_delete.called)

View File

@ -1388,3 +1388,9 @@ class TestManager(base.TestCase):
mock_create.return_value = ret
self.compute_manager.network_create(self.context, network)
mock_create.assert_any_call(self.context, network)
@mock.patch.object(fake_driver, 'delete_network')
def test_network_delete(self, mock_delete):
network = Network(self.context, **utils.get_test_network())
self.compute_manager.network_delete(self.context, network)
mock_delete.assert_any_call(self.context, network)

View File

@ -219,8 +219,9 @@ class KuryrNetworkTestCase(base.TestCase):
mock_list_network.assert_called_once_with(names=[name])
def test_remove_network(self):
network_name = 'c02afe4e-8350-4263-8078'
self.network_api.remove_network(network_name)
network = mock.Mock(name='c02afe4e-8350-4263-8078')
self.network_api.remove_network(network)
network.destroy.assert_called_once_with()
def test_inspect_network(self):
network_name = 'c02afe4e-8350-4263-8078'