Add 'port set' command

Add CLI support for the 'port set' command

Change-Id: I2bea508e11290284aa64b1ab548a0bb61e7290d3
Partial-bug: #1519909
Partially-implements: blueprint neutron-client
This commit is contained in:
Jas 2016-02-22 14:05:17 -06:00
parent 9ab7740dfd
commit e0d58641bb
5 changed files with 194 additions and 5 deletions

View File

@ -45,7 +45,8 @@ Create new port
.. option:: --vnic-type <vnic-type> .. option:: --vnic-type <vnic-type>
VNIC type for this port (direct | direct-physical | macvtap | normal(default) | baremetal) VNIC type for this port (direct | direct-physical | macvtap | normal | baremetal).
If unspecified during port creation, default value will be 'normal'.
.. option:: --binding-profile <binding-profile> .. option:: --binding-profile <binding-profile>
@ -108,6 +109,65 @@ List ports
os port list os port list
port set
--------
Set port properties
.. program:: port set
.. code:: bash
os port set
[--fixed-ip subnet=<subnet>,ip-address=<ip-address>]
[--device-id <device-id>]
[--device-owner <device-owner>]
[--vnic-type <vnic-type>]
[--binding-profile <binding-profile>]
[--host-id <host-id>]
[--enable | --disable]
<port>
.. option:: --fixed-ip subnet=<subnet>,ip-address=<ip-address>
Desired IP and/or subnet for this port:
subnet=<subnet>,ip-address=<ip-address>
(you can repeat this option)
.. option:: --device-id <device-id>
Device ID of this port
.. option:: --device-owner <device-owner>
Device owner of this port
.. option:: --vnic-type <vnic-type>
VNIC type for this port (direct | direct-physical | macvtap | normal | baremetal).
If unspecified during port creation, default value will be 'normal'.
.. option:: --binding-profile <binding-profile>
Custom data to be passed as binding:profile: <key>=<value>
(this option can be repeated)
.. option:: --host-id <host-id>
The ID of the host where the port is allocated
.. option:: --enable
Enable port
.. option:: --disable
Disable port
.. _port_set-port:
.. describe:: <port>
Port to modify (name or ID)
port show port show
--------- ---------

View File

@ -14,6 +14,7 @@
"""Port action implementations""" """Port action implementations"""
from openstackclient.common import command from openstackclient.common import command
from openstackclient.common import exceptions
from openstackclient.common import parseractions from openstackclient.common import parseractions
from openstackclient.common import utils from openstackclient.common import utils
from openstackclient.identity import common as identity_common from openstackclient.identity import common as identity_common
@ -56,8 +57,6 @@ def _get_columns(item):
def _get_attrs(client_manager, parsed_args): def _get_attrs(client_manager, parsed_args):
attrs = {} attrs = {}
if parsed_args.name is not None:
attrs['name'] = str(parsed_args.name)
if parsed_args.fixed_ip is not None: if parsed_args.fixed_ip is not None:
attrs['fixed_ips'] = parsed_args.fixed_ip attrs['fixed_ips'] = parsed_args.fixed_ip
if parsed_args.device_id is not None: if parsed_args.device_id is not None:
@ -75,6 +74,8 @@ def _get_attrs(client_manager, parsed_args):
# The remaining options do not support 'port set' command, so they require # The remaining options do not support 'port set' command, so they require
# additional check # additional check
if 'name' in parsed_args and parsed_args.name is not None:
attrs['name'] = str(parsed_args.name)
if 'mac_address' in parsed_args and parsed_args.mac_address is not None: if 'mac_address' in parsed_args and parsed_args.mac_address is not None:
attrs['mac_address'] = parsed_args.mac_address attrs['mac_address'] = parsed_args.mac_address
if 'network' in parsed_args and parsed_args.network is not None: if 'network' in parsed_args and parsed_args.network is not None:
@ -145,8 +146,9 @@ def _add_updatable_args(parser):
metavar='<vnic-type>', metavar='<vnic-type>',
choices=['direct', 'direct-physical', 'macvtap', choices=['direct', 'direct-physical', 'macvtap',
'normal', 'baremetal'], 'normal', 'baremetal'],
help='VNIC type for this port (direct | direct-physical |' help="VNIC type for this port (direct | direct-physical |"
' macvtap | normal(default) | baremetal)') " macvtap | normal | baremetal). If unspecified during"
" port creation, default value will be 'normal'.")
parser.add_argument( parser.add_argument(
'--binding-profile', '--binding-profile',
metavar='<binding-profile>', metavar='<binding-profile>',
@ -265,6 +267,48 @@ class ListPort(command.Lister):
) for s in data)) ) for s in data))
class SetPort(command.Command):
"""Set port properties"""
def get_parser(self, prog_name):
parser = super(SetPort, self).get_parser(prog_name)
_add_updatable_args(parser)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
dest='admin_state',
action='store_true',
default=None,
help='Enable port',
)
admin_group.add_argument(
'--disable',
dest='admin_state',
action='store_false',
help='Disable port',
)
parser.add_argument(
'port',
metavar="<port>",
help=("Port to modify (name or ID)")
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
_prepare_fixed_ips(self.app.client_manager, parsed_args)
attrs = _get_attrs(self.app.client_manager, parsed_args)
if attrs == {}:
msg = "Nothing specified to be set"
raise exceptions.CommandError(msg)
obj = client.find_port(parsed_args.port, ignore_missing=False)
client.update_port(obj, **attrs)
class ShowPort(command.ShowOne): class ShowPort(command.ShowOne):
"""Display port details""" """Display port details"""

View File

@ -240,6 +240,85 @@ class TestListPort(TestPort):
self.assertEqual(self.data, list(data)) self.assertEqual(self.data, list(data))
class TestSetPort(TestPort):
_port = network_fakes.FakePort.create_one_port()
def setUp(self):
super(TestSetPort, self).setUp()
self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet()
self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
self.network.find_port = mock.Mock(return_value=self._port)
self.network.update_port = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = port.SetPort(self.app, self.namespace)
def test_set_fixed_ip(self):
arglist = [
'--fixed-ip', 'ip-address=10.0.0.11',
self._port.name,
]
verifylist = [
('fixed_ip', [{'ip-address': '10.0.0.11'}]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
'fixed_ips': [{'ip_address': '10.0.0.11'}],
}
self.network.update_port.assert_called_with(self._port, **attrs)
self.assertIsNone(result)
def test_set_this(self):
arglist = [
'--disable',
self._port.name,
]
verifylist = [
('admin_state', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
'admin_state_up': False,
}
self.network.update_port.assert_called_with(self._port, **attrs)
self.assertIsNone(result)
def test_set_that(self):
arglist = [
'--enable',
'--vnic-type', 'macvtap',
'--binding-profile', 'foo=bar',
'--host-id', 'binding-host-id-xxxx',
self._port.name,
]
verifylist = [
('admin_state', True),
('vnic_type', 'macvtap'),
('binding_profile', {'foo': 'bar'}),
('host_id', 'binding-host-id-xxxx'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
'admin_state_up': True,
'binding:vnic_type': 'macvtap',
'binding:profile': {'foo': 'bar'},
'binding:host_id': 'binding-host-id-xxxx',
}
self.network.update_port.assert_called_with(self._port, **attrs)
self.assertIsNone(result)
class TestShowPort(TestPort): class TestShowPort(TestPort):
# The port to show. # The port to show.

View File

@ -0,0 +1,5 @@
---
features:
- |
Add support for the ``port set`` command.
[Bug `1519909 <https://bugs.launchpad.net/python-openstackclient/+bug/1519909>`_]

View File

@ -336,6 +336,7 @@ openstack.network.v2 =
port_create = openstackclient.network.v2.port:CreatePort port_create = openstackclient.network.v2.port:CreatePort
port_delete = openstackclient.network.v2.port:DeletePort port_delete = openstackclient.network.v2.port:DeletePort
port_list = openstackclient.network.v2.port:ListPort port_list = openstackclient.network.v2.port:ListPort
port_set = openstackclient.network.v2.port:SetPort
port_show = openstackclient.network.v2.port:ShowPort port_show = openstackclient.network.v2.port:ShowPort
router_create = openstackclient.network.v2.router:CreateRouter router_create = openstackclient.network.v2.router:CreateRouter