diff options
| author | Jas <singhj@us.ibm.com> | 2016-02-22 14:05:17 -0600 |
|---|---|---|
| committer | Jas <singhj@us.ibm.com> | 2016-03-08 09:48:50 -0600 |
| commit | e0d58641bba8cacab855ed5aa3b7506737470441 (patch) | |
| tree | 6e797118d50c94aea33af3cfe21a21ac877fc163 /openstackclient | |
| parent | 9ab7740dfd09a727975fa708ab96be591d8a4c39 (diff) | |
| download | python-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.py | 52 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_port.py | 79 |
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. |
