summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorJas <singhj@us.ibm.com>2016-02-22 14:05:17 -0600
committerJas <singhj@us.ibm.com>2016-03-08 09:48:50 -0600
commite0d58641bba8cacab855ed5aa3b7506737470441 (patch)
tree6e797118d50c94aea33af3cfe21a21ac877fc163 /openstackclient
parent9ab7740dfd09a727975fa708ab96be591d8a4c39 (diff)
downloadpython-openstackclient-e0d58641bba8cacab855ed5aa3b7506737470441.tar.gz
Add 'port set' command
Add CLI support for the 'port set' command Change-Id: I2bea508e11290284aa64b1ab548a0bb61e7290d3 Partial-bug: #1519909 Partially-implements: blueprint neutron-client
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/network/v2/port.py52
-rw-r--r--openstackclient/tests/network/v2/test_port.py79
2 files changed, 127 insertions, 4 deletions
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 449dcfd4..b618a4b0 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -14,6 +14,7 @@
"""Port action implementations"""
from openstackclient.common import command
+from openstackclient.common import exceptions
from openstackclient.common import parseractions
from openstackclient.common import utils
from openstackclient.identity import common as identity_common
@@ -56,8 +57,6 @@ def _get_columns(item):
def _get_attrs(client_manager, parsed_args):
attrs = {}
- if parsed_args.name is not None:
- attrs['name'] = str(parsed_args.name)
if parsed_args.fixed_ip is not None:
attrs['fixed_ips'] = parsed_args.fixed_ip
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
# 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:
attrs['mac_address'] = parsed_args.mac_address
if 'network' in parsed_args and parsed_args.network is not None:
@@ -145,8 +146,9 @@ def _add_updatable_args(parser):
metavar='<vnic-type>',
choices=['direct', 'direct-physical', 'macvtap',
'normal', 'baremetal'],
- help='VNIC type for this port (direct | direct-physical |'
- ' macvtap | normal(default) | baremetal)')
+ help="VNIC type for this port (direct | direct-physical |"
+ " macvtap | normal | baremetal). If unspecified during"
+ " port creation, default value will be 'normal'.")
parser.add_argument(
'--binding-profile',
metavar='<binding-profile>',
@@ -265,6 +267,48 @@ class ListPort(command.Lister):
) 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):
"""Display port details"""
diff --git a/openstackclient/tests/network/v2/test_port.py b/openstackclient/tests/network/v2/test_port.py
index 30e290c6..7b1c655f 100644
--- a/openstackclient/tests/network/v2/test_port.py
+++ b/openstackclient/tests/network/v2/test_port.py
@@ -240,6 +240,85 @@ class TestListPort(TestPort):
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):
# The port to show.