Implement delete network
Needed-By: https://review.openstack.org/#/c/615399/ Change-Id: I4c92c87219b03a891a57d51bcb60bee3b2d1503c
This commit is contained in:
parent
e1253d638f
commit
10c567f5bb
@ -25,7 +25,7 @@
|
||||
test-config:
|
||||
$TEMPEST_CONFIG:
|
||||
container_service:
|
||||
min_microversion: 1.26
|
||||
min_microversion: 1.27
|
||||
devstack_services:
|
||||
tempest: true
|
||||
devstack_plugins:
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -214,3 +214,8 @@ user documentation.
|
||||
----
|
||||
|
||||
Introduce Quota support API
|
||||
|
||||
1.27
|
||||
----
|
||||
|
||||
Introduce API for deleting network. By default, this is an admin API.
|
||||
|
@ -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'
|
||||
}
|
||||
]
|
||||
)
|
||||
]
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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():
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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'}]}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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'
|
||||
|
Loading…
x
Reference in New Issue
Block a user