Add support to delete the ports
This patch adds "port delete" command to osc. Change-Id: I5c92b2f573249df4e6551506584ccafb4ff290b2 Implements: blueprint neutron-client Partial-Bug: #1519909
This commit is contained in:
parent
86fcd67468
commit
3168e2297d
21
doc/source/command-objects/port.rst
Normal file
21
doc/source/command-objects/port.rst
Normal file
@ -0,0 +1,21 @@
|
||||
====
|
||||
port
|
||||
====
|
||||
|
||||
Network v2
|
||||
|
||||
port delete
|
||||
-----------
|
||||
|
||||
Delete port(s)
|
||||
|
||||
.. program:: port delete
|
||||
.. code:: bash
|
||||
|
||||
os port delete
|
||||
<port> [<port> ...]
|
||||
|
||||
.. _port_delete-port:
|
||||
.. describe:: <port>
|
||||
|
||||
Port(s) to delete (name or ID)
|
@ -101,6 +101,7 @@ referring to both Compute and Volume quotas.
|
||||
* ``network``: (**Network**) - a virtual network for connecting servers and other resources
|
||||
* ``object``: (**Object Storage**) a single file in the Object Storage
|
||||
* ``policy``: (**Identity**) determines authorization
|
||||
* ``port``: (**Network**) - a virtual port for connecting servers and other resources to a network
|
||||
* ``project``: (**Identity**) owns a group of resources
|
||||
* ``quota``: (**Compute**, **Volume**) resource usage restrictions
|
||||
* ``region``: (**Identity**) a subset of an OpenStack deployment
|
||||
|
42
openstackclient/network/v2/port.py
Normal file
42
openstackclient/network/v2/port.py
Normal file
@ -0,0 +1,42 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
"""Port action implementations"""
|
||||
|
||||
import logging
|
||||
|
||||
from cliff import command
|
||||
|
||||
|
||||
class DeletePort(command.Command):
|
||||
"""Delete port(s)"""
|
||||
|
||||
log = logging.getLogger(__name__ + '.DeletePort')
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeletePort, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'port',
|
||||
metavar="<port>",
|
||||
nargs="+",
|
||||
help=("Port(s) to delete (name or ID)")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
self.log.debug('take_action(%s)' % parsed_args)
|
||||
client = self.app.client_manager.network
|
||||
|
||||
for port in parsed_args.port:
|
||||
res = client.find_port(port)
|
||||
client.delete_port(res)
|
@ -145,6 +145,83 @@ class FakeNetwork(object):
|
||||
return mock.MagicMock(side_effect=networks)
|
||||
|
||||
|
||||
class FakePort(object):
|
||||
"""Fake one or more ports."""
|
||||
|
||||
@staticmethod
|
||||
def create_one_port(attrs={}, methods={}):
|
||||
"""Create a fake port.
|
||||
|
||||
:param Dictionary attrs:
|
||||
A dictionary with all attributes
|
||||
:param Dictionary methods:
|
||||
A dictionary with all methods
|
||||
:return:
|
||||
A FakeResource object, with id, name, admin_state_up,
|
||||
status, tenant_id
|
||||
"""
|
||||
# Set default attributes.
|
||||
port_attrs = {
|
||||
'id': 'port-id-' + uuid.uuid4().hex,
|
||||
'name': 'port-name-' + uuid.uuid4().hex,
|
||||
'status': 'ACTIVE',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
||||
}
|
||||
|
||||
# Overwrite default attributes.
|
||||
port_attrs.update(attrs)
|
||||
|
||||
# Set default methods.
|
||||
port_methods = {}
|
||||
|
||||
# Overwrite default methods.
|
||||
port_methods.update(methods)
|
||||
|
||||
port = fakes.FakeResource(info=copy.deepcopy(port_attrs),
|
||||
methods=copy.deepcopy(port_methods),
|
||||
loaded=True)
|
||||
return port
|
||||
|
||||
@staticmethod
|
||||
def create_ports(attrs={}, methods={}, count=2):
|
||||
"""Create multiple fake ports.
|
||||
|
||||
:param Dictionary attrs:
|
||||
A dictionary with all attributes
|
||||
:param Dictionary methods:
|
||||
A dictionary with all methods
|
||||
:param int count:
|
||||
The number of ports to fake
|
||||
:return:
|
||||
A list of FakeResource objects faking the ports
|
||||
"""
|
||||
ports = []
|
||||
for i in range(0, count):
|
||||
ports.append(FakePort.create_one_port(attrs, methods))
|
||||
|
||||
return ports
|
||||
|
||||
@staticmethod
|
||||
def get_ports(ports=None, count=2):
|
||||
"""Get an iterable MagicMock object with a list of faked ports.
|
||||
|
||||
If ports list is provided, then initialize the Mock object with the
|
||||
list. Otherwise create one.
|
||||
|
||||
:param List ports:
|
||||
A list of FakeResource objects faking ports
|
||||
:param int count:
|
||||
The number of ports to fake
|
||||
:return:
|
||||
An iterable Mock object with side_effect set to a list of faked
|
||||
ports
|
||||
"""
|
||||
if ports is None:
|
||||
ports = FakePort.create_ports(count)
|
||||
return mock.MagicMock(side_effect=ports)
|
||||
|
||||
|
||||
class FakeRouter(object):
|
||||
"""Fake one or more routers."""
|
||||
|
||||
|
53
openstackclient/tests/network/v2/test_port.py
Normal file
53
openstackclient/tests/network/v2/test_port.py
Normal file
@ -0,0 +1,53 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import mock
|
||||
|
||||
from openstackclient.network.v2 import port
|
||||
from openstackclient.tests.network.v2 import fakes as network_fakes
|
||||
|
||||
|
||||
class TestPort(network_fakes.TestNetworkV2):
|
||||
|
||||
def setUp(self):
|
||||
super(TestPort, self).setUp()
|
||||
|
||||
# Get a shortcut to the network client
|
||||
self.network = self.app.client_manager.network
|
||||
|
||||
|
||||
class TestDeletePort(TestPort):
|
||||
|
||||
# The port to delete.
|
||||
_port = network_fakes.FakePort.create_one_port()
|
||||
|
||||
def setUp(self):
|
||||
super(TestDeletePort, self).setUp()
|
||||
|
||||
self.network.delete_port = mock.Mock(return_value=None)
|
||||
self.network.find_port = mock.Mock(return_value=self._port)
|
||||
# Get the command object to test
|
||||
self.cmd = port.DeletePort(self.app, self.namespace)
|
||||
|
||||
def test_delete(self):
|
||||
arglist = [
|
||||
self._port.name,
|
||||
]
|
||||
verifylist = [
|
||||
('port', [self._port.name]),
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
self.network.delete_port.assert_called_with(self._port)
|
||||
self.assertIsNone(result)
|
@ -0,0 +1,5 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
Add support for the ``port delete`` command.
|
||||
[Bug `1519909 <https://bugs.launchpad.net/python-openstackclient/+bug/1519909>`_]
|
@ -333,6 +333,7 @@ openstack.network.v2 =
|
||||
network_list = openstackclient.network.v2.network:ListNetwork
|
||||
network_set = openstackclient.network.v2.network:SetNetwork
|
||||
network_show = openstackclient.network.v2.network:ShowNetwork
|
||||
port_delete = openstackclient.network.v2.port:DeletePort
|
||||
router_create = openstackclient.network.v2.router:CreateRouter
|
||||
router_delete = openstackclient.network.v2.router:DeleteRouter
|
||||
router_list = openstackclient.network.v2.router:ListRouter
|
||||
|
Loading…
Reference in New Issue
Block a user