From 1ae904a4912494b3d0ac87f22aaf958129744548 Mon Sep 17 00:00:00 2001 From: Carlos Goncalves Date: Wed, 18 Jan 2017 11:16:39 +0000 Subject: [PATCH] Add 'data_plane_status' option to Port classes Adds 'data_plane_status' option to SetPort and UnsetPort classes. Closes-Bug: #1684989 Change-Id: I26e23b551afb8c37e6babdea1655efb7c5c6873b --- doc/source/cli/command-objects/port.rst | 12 ++++ openstackclient/network/v2/port.py | 18 ++++++ .../tests/unit/network/v2/fakes.py | 1 + .../tests/unit/network/v2/test_port.py | 59 +++++++++++++++++++ .../notes/bug-1684989-3bda158a822d2f73.yaml | 5 ++ 5 files changed, 95 insertions(+) create mode 100644 releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml diff --git a/doc/source/cli/command-objects/port.rst b/doc/source/cli/command-objects/port.rst index b3f4c7f9f..2102288bd 100644 --- a/doc/source/cli/command-objects/port.rst +++ b/doc/source/cli/command-objects/port.rst @@ -232,6 +232,7 @@ Set port properties [--dns-name ] [--allowed-address ip-address=[,mac-address=]] [--no-allowed-address] + [--data-plane-status ] .. option:: --description @@ -335,6 +336,12 @@ Set port properties (Specify both --allowed-address and --no-allowed-address to overwrite the current allowed-address pairs) +.. option:: --data-plane-status + + Set data plane status of this port (ACTIVE | DOWN). + Unset it to None with the 'port unset' command + (requires data plane status extension) + .. _port_set-port: .. describe:: @@ -370,6 +377,7 @@ Unset port properties [--security-group [...]] [--allowed-address ip-address=[,mac-address=] [...]] [--qos-policy] + [--data-plane-status] .. option:: --fixed-ip subnet=,ip-address= @@ -398,6 +406,10 @@ Unset port properties Remove the QoS policy attached to the port +.. option:: --data-plane-status + + Clear existing information of data plane status + .. _port_unset-port: .. describe:: diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index 42291bf21..1409a194b 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -685,6 +685,15 @@ class SetPort(command.Command): "(Specify both --allowed-address and --no-allowed-address" "to overwrite the current allowed-address pairs)") ) + parser.add_argument( + '--data-plane-status', + metavar='', + choices=['ACTIVE', 'DOWN'], + help=_("Set data plane status of this port (ACTIVE | DOWN). " + "Unset it to None with the 'port unset' command " + "(requires data plane status extension)") + ) + return parser def take_action(self, parsed_args): @@ -737,6 +746,8 @@ class SetPort(command.Command): attrs['allowed_address_pairs'].extend( _convert_address_pairs(parsed_args) ) + if parsed_args.data_plane_status: + attrs['data_plane_status'] = parsed_args.data_plane_status client.update_port(obj, **attrs) @@ -816,6 +827,11 @@ class UnsetPort(command.Command): default=False, help=_("Remove the QoS policy attached to the port") ) + parser.add_argument( + '--data-plane-status', + action='store_true', + help=_("Clear existing information of data plane status") + ) return parser @@ -867,6 +883,8 @@ class UnsetPort(command.Command): attrs['allowed_address_pairs'] = tmp_addr_pairs if parsed_args.qos_policy: attrs['qos_policy_id'] = None + if parsed_args.data_plane_status: + attrs['data_plane_status'] = None if attrs: client.update_port(obj, **attrs) diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index 0b8eee90b..98bda1649 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -558,6 +558,7 @@ class FakePort(object): 'binding:vif_details': {}, 'binding:vif_type': 'ovs', 'binding:vnic_type': 'normal', + 'data_plane_status': None, 'description': 'description-' + uuid.uuid4().hex, 'device_id': 'device-id-' + uuid.uuid4().hex, 'device_owner': 'compute:nova', diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py index 851bf25ad..a8a6dba9b 100644 --- a/openstackclient/tests/unit/network/v2/test_port.py +++ b/openstackclient/tests/unit/network/v2/test_port.py @@ -44,6 +44,7 @@ class TestPort(network_fakes.TestNetworkV2): 'binding_vif_details', 'binding_vif_type', 'binding_vnic_type', + 'data_plane_status', 'description', 'device_id', 'device_owner', @@ -70,6 +71,7 @@ class TestPort(network_fakes.TestNetworkV2): utils.format_dict(fake_port.binding_vif_details), fake_port.binding_vif_type, fake_port.binding_vnic_type, + fake_port.data_plane_status, fake_port.description, fake_port.device_id, fake_port.device_owner, @@ -1371,6 +1373,40 @@ class TestSetPort(TestPort): self.network.update_port.assert_called_once_with(_testport, **attrs) self.assertIsNone(result) + def test_set_port_data_plane_status(self): + _testport = network_fakes.FakePort.create_one_port( + {'data_plane_status': None}) + self.network.find_port = mock.Mock(return_value=_testport) + arglist = [ + '--data-plane-status', 'ACTIVE', + _testport.name, + ] + verifylist = [ + ('data_plane_status', 'ACTIVE'), + ('port', _testport.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + attrs = { + 'data_plane_status': 'ACTIVE', + } + + self.network.update_port.assert_called_once_with(_testport, **attrs) + self.assertIsNone(result) + + def test_set_port_invalid_data_plane_status_value(self): + arglist = [ + '--data-plane-status', 'Spider-Man', + 'test-port', + ] + self.assertRaises(tests_utils.ParserException, + self.check_parser, + self.cmd, + arglist, + None) + class TestShowPort(TestPort): @@ -1573,3 +1609,26 @@ class TestUnsetPort(TestPort): self.assertRaises(exceptions.CommandError, self.cmd.take_action, parsed_args) + + def test_unset_port_data_plane_status(self): + _fake_port = network_fakes.FakePort.create_one_port( + {'data_plane_status': 'ACTIVE'}) + self.network.find_port = mock.Mock(return_value=_fake_port) + arglist = [ + '--data-plane-status', + _fake_port.name, + ] + verifylist = [ + ('data_plane_status', True), + ('port', _fake_port.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + attrs = { + 'data_plane_status': None, + } + + self.network.update_port.assert_called_once_with(_fake_port, **attrs) + self.assertIsNone(result) diff --git a/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml b/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml new file mode 100644 index 000000000..3c63061f4 --- /dev/null +++ b/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml @@ -0,0 +1,5 @@ +--- +features: + - Add ``--data-plane-status`` option to ``port set`` and ``port unset`` + commands. + [Bug `1684989 `_]