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:
|
test-config:
|
||||||
$TEMPEST_CONFIG:
|
$TEMPEST_CONFIG:
|
||||||
container_service:
|
container_service:
|
||||||
min_microversion: 1.26
|
min_microversion: 1.27
|
||||||
devstack_services:
|
devstack_services:
|
||||||
tempest: true
|
tempest: true
|
||||||
devstack_plugins:
|
devstack_plugins:
|
||||||
|
@ -21,10 +21,22 @@ from zun.api import utils as api_utils
|
|||||||
from zun.api import validation
|
from zun.api import validation
|
||||||
from zun.common import exception
|
from zun.common import exception
|
||||||
from zun.common import policy
|
from zun.common import policy
|
||||||
|
from zun import objects
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
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):
|
class NetworkCollection(collection.Collection):
|
||||||
"""API representation of a collection of network."""
|
"""API representation of a collection of network."""
|
||||||
|
|
||||||
@ -64,3 +76,19 @@ class NetworkController(base.Controller):
|
|||||||
new_network = pecan.request.compute_api.network_create(
|
new_network = pecan.request.compute_api.network_create(
|
||||||
context, network_dict['neutron_net_id'])
|
context, network_dict['neutron_net_id'])
|
||||||
return view.format_network(pecan.request.host_url, new_network)
|
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.24 - Add exposed_ports to container
|
||||||
* 1.25 - Encode/Decode archive file
|
* 1.25 - Encode/Decode archive file
|
||||||
* 1.26 - Introduce Quota support
|
* 1.26 - Introduce Quota support
|
||||||
|
* 1.27 - Add support for deleting networks
|
||||||
"""
|
"""
|
||||||
|
|
||||||
BASE_VER = '1.1'
|
BASE_VER = '1.1'
|
||||||
CURRENT_MAX_VER = '1.26'
|
CURRENT_MAX_VER = '1.27'
|
||||||
|
|
||||||
|
|
||||||
class Version(object):
|
class Version(object):
|
||||||
|
@ -214,3 +214,8 @@ user documentation.
|
|||||||
----
|
----
|
||||||
|
|
||||||
Introduce Quota support API
|
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'
|
'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):
|
def network_create(self, context, *args):
|
||||||
return self.rpcapi.network_create(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):
|
def resize_container(self, context, container, *args):
|
||||||
return self.rpcapi.resize_container(context, container, *args)
|
return self.rpcapi.resize_container(context, container, *args)
|
||||||
|
@ -1291,6 +1291,10 @@ class Manager(periodic_task.PeriodicTasks):
|
|||||||
LOG.debug('Create network')
|
LOG.debug('Create network')
|
||||||
return self.driver.create_network(context, neutron_net_id)
|
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):
|
def resize_container(self, context, container, patch):
|
||||||
@utils.synchronized(container.uuid)
|
@utils.synchronized(container.uuid)
|
||||||
def do_container_resize():
|
def do_container_resize():
|
||||||
|
@ -210,3 +210,8 @@ class API(rpc_service.API):
|
|||||||
host = None
|
host = None
|
||||||
return self._call(host, 'network_create',
|
return self._call(host, 'network_create',
|
||||||
neutron_net_id=neutron_net_id)
|
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(
|
return network_api.create_network(
|
||||||
neutron_net_id=neutron_net_id,
|
neutron_net_id=neutron_net_id,
|
||||||
name=docker_net_name)
|
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):
|
def create_network(self, context, network):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def delete_network(self, context, network):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
def inspect_network(self, network):
|
def inspect_network(self, network):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
@ -183,8 +183,9 @@ class KuryrNetwork(network.Network):
|
|||||||
"Multiple Neutron subnets exist with ip version %s") %
|
"Multiple Neutron subnets exist with ip version %s") %
|
||||||
ip_version)
|
ip_version)
|
||||||
|
|
||||||
def remove_network(self, network_name):
|
def remove_network(self, network):
|
||||||
self.docker.remove_network(network_name)
|
self.docker.remove_network(network.name)
|
||||||
|
network.destroy()
|
||||||
|
|
||||||
def inspect_network(self, network_name):
|
def inspect_network(self, network_name):
|
||||||
return self.docker.inspect_network(network_name)
|
return self.docker.inspect_network(network_name)
|
||||||
|
@ -26,7 +26,7 @@ from zun.tests.unit.db import base
|
|||||||
|
|
||||||
|
|
||||||
PATH_PREFIX = '/v1'
|
PATH_PREFIX = '/v1'
|
||||||
CURRENT_VERSION = "container 1.26"
|
CURRENT_VERSION = "container 1.27"
|
||||||
|
|
||||||
|
|
||||||
class FunctionalTest(base.DbTestCase):
|
class FunctionalTest(base.DbTestCase):
|
||||||
|
@ -28,7 +28,7 @@ class TestRootController(api_base.FunctionalTest):
|
|||||||
'default_version':
|
'default_version':
|
||||||
{'id': 'v1',
|
{'id': 'v1',
|
||||||
'links': [{'href': 'http://localhost/v1/', 'rel': 'self'}],
|
'links': [{'href': 'http://localhost/v1/', 'rel': 'self'}],
|
||||||
'max_version': '1.26',
|
'max_version': '1.27',
|
||||||
'min_version': '1.1',
|
'min_version': '1.1',
|
||||||
'status': 'CURRENT'},
|
'status': 'CURRENT'},
|
||||||
'description': 'Zun is an OpenStack project which '
|
'description': 'Zun is an OpenStack project which '
|
||||||
@ -37,7 +37,7 @@ class TestRootController(api_base.FunctionalTest):
|
|||||||
'versions': [{'id': 'v1',
|
'versions': [{'id': 'v1',
|
||||||
'links': [{'href': 'http://localhost/v1/',
|
'links': [{'href': 'http://localhost/v1/',
|
||||||
'rel': 'self'}],
|
'rel': 'self'}],
|
||||||
'max_version': '1.26',
|
'max_version': '1.27',
|
||||||
'min_version': '1.1',
|
'min_version': '1.1',
|
||||||
'status': 'CURRENT'}]}
|
'status': 'CURRENT'}]}
|
||||||
|
|
||||||
|
@ -29,3 +29,15 @@ class TestNetworkController(api_base.FunctionalTest):
|
|||||||
|
|
||||||
self.assertEqual(200, response.status_int)
|
self.assertEqual(200, response.status_int)
|
||||||
self.assertTrue(mock_network_create.called)
|
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
|
mock_create.return_value = ret
|
||||||
self.compute_manager.network_create(self.context, network)
|
self.compute_manager.network_create(self.context, network)
|
||||||
mock_create.assert_any_call(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])
|
mock_list_network.assert_called_once_with(names=[name])
|
||||||
|
|
||||||
def test_remove_network(self):
|
def test_remove_network(self):
|
||||||
network_name = 'c02afe4e-8350-4263-8078'
|
network = mock.Mock(name='c02afe4e-8350-4263-8078')
|
||||||
self.network_api.remove_network(network_name)
|
self.network_api.remove_network(network)
|
||||||
|
network.destroy.assert_called_once_with()
|
||||||
|
|
||||||
def test_inspect_network(self):
|
def test_inspect_network(self):
|
||||||
network_name = 'c02afe4e-8350-4263-8078'
|
network_name = 'c02afe4e-8350-4263-8078'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user