diff --git a/doc/source/usage/osc/v2/network-trunk.rst b/doc/source/usage/osc/v2/network-trunk.rst index 5a79310a4..a39e3bd0e 100644 --- a/doc/source/usage/osc/v2/network-trunk.rst +++ b/doc/source/usage/osc/v2/network-trunk.rst @@ -37,6 +37,7 @@ Create a network trunk for a given project [--subport <port=,segmentation-type=,segmentation-id=>] [--enable | --disable] [--project <project> [--project-domain <project-domain>]] + [--description <description>] <name> .. option:: --parent-port <parent-port> @@ -65,6 +66,10 @@ Create a network trunk for a given project Domain the project belongs to (name or ID). This can be used in case collisions between project names exist. +.. option:: --description <description> + + A description of the trunk. + network trunk delete -------------------- @@ -106,6 +111,7 @@ Set network trunk properties os network trunk set [--name <name>] + [--description <description>] [--subport <port=,segmentation-type=,segmentation-id=>] [--enable | --disable] <trunk> @@ -114,6 +120,10 @@ Set network trunk properties Set trunk name +.. option:: --description <description> + + A description of the trunk. + .. option:: --subport <port=,segmentation-type=,segmentation-id=> Subport to add. Subport is of form 'port=<name or ID>,segmentation-type=,segmentation-ID=' diff --git a/neutronclient/osc/v2/trunk/network_trunk.py b/neutronclient/osc/v2/trunk/network_trunk.py index e3eed827a..5ba9b9a03 100644 --- a/neutronclient/osc/v2/trunk/network_trunk.py +++ b/neutronclient/osc/v2/trunk/network_trunk.py @@ -44,6 +44,11 @@ class CreateNetworkTrunk(command.ShowOne): metavar='<name>', help=_("Name of the trunk to create") ) + parser.add_argument( + '--description', + metavar='<description>', + help=_("A description of the trunk") + ) parser.add_argument( '--parent-port', metavar='<parent-port>', @@ -141,12 +146,14 @@ class ListNetworkTrunk(command.Lister): headers = ( 'ID', 'Name', - 'Parent Port' + 'Parent Port', + 'Description' ) columns = ( 'id', 'name', - 'port_id' + 'port_id', + 'description' ) if parsed_args.long: headers += ( @@ -179,6 +186,11 @@ class SetNetworkTrunk(command.Command): metavar="<name>", help=_("Set trunk name") ) + parser.add_argument( + '--description', + metavar='<description>', + help=_("A description of the trunk") + ) parser.add_argument( '--subport', metavar='<port=,segmentation-type=,segmentation-id=>', @@ -313,6 +325,8 @@ def _get_attrs_for_trunk(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) + if parsed_args.description is not None: + attrs['description'] = str(parsed_args.description) if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: diff --git a/neutronclient/tests/unit/osc/v2/trunk/fakes.py b/neutronclient/tests/unit/osc/v2/trunk/fakes.py index 0eb6f9786..1acbcc3da 100644 --- a/neutronclient/tests/unit/osc/v2/trunk/fakes.py +++ b/neutronclient/tests/unit/osc/v2/trunk/fakes.py @@ -24,8 +24,8 @@ class FakeTrunk(object): :param Dictionary attrs: A dictionary with all attributes :return: - A Dictionary with id, name, admin_state_up, - port_id, sub_ports, status and project_id + A Dictionary with id, name, description, admin_state_up, port_id, + sub_ports, status and project_id """ attrs = attrs or {} @@ -33,6 +33,7 @@ class FakeTrunk(object): trunk_attrs = { 'id': 'trunk-id-' + uuid.uuid4().hex, 'name': 'trunk-name-' + uuid.uuid4().hex, + 'description': '', 'port_id': 'port-' + uuid.uuid4().hex, 'admin_state_up': True, 'project_id': 'project-id-' + uuid.uuid4().hex, diff --git a/neutronclient/tests/unit/osc/v2/trunk/test_network_trunk.py b/neutronclient/tests/unit/osc/v2/trunk/test_network_trunk.py index 5bb5ea214..ee16fd028 100644 --- a/neutronclient/tests/unit/osc/v2/trunk/test_network_trunk.py +++ b/neutronclient/tests/unit/osc/v2/trunk/test_network_trunk.py @@ -36,6 +36,7 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): columns = ( 'admin_state_up', + 'description', 'id', 'name', 'port_id', @@ -43,15 +44,18 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): 'status', 'sub_ports', ) - data = ( - trunk._format_admin_state(_trunk['admin_state_up']), - _trunk['id'], - _trunk['name'], - _trunk['port_id'], - _trunk['project_id'], - _trunk['status'], - utils.format_list_of_dicts(_trunk['sub_ports']), - ) + + def get_data(self): + return ( + trunk._format_admin_state(self._trunk['admin_state_up']), + self._trunk['description'], + self._trunk['id'], + self._trunk['name'], + self._trunk['port_id'], + self._trunk['project_id'], + self._trunk['status'], + utils.format_list_of_dicts(self._trunk['sub_ports']), + ) def setUp(self): super(TestCreateNetworkTrunk, self).setUp() @@ -59,6 +63,7 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): new=_get_id).start() self.neutronclient.create_trunk = mock.Mock( return_value={trunk.TRUNK: self._trunk}) + self.data = self.get_data() # Get the command object to test self.cmd = trunk.CreateNetworkTrunk(self.app, self.namespace) @@ -92,9 +97,12 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): self.assertEqual(self.data, data) def test_create_full_options(self): + self._trunk['description'] = 'foo description' + self.data = self.get_data() subport = self._trunk['sub_ports'][0] arglist = [ "--disable", + "--description", self._trunk['description'], "--parent-port", self._trunk['port_id'], "--subport", 'port=%(port)s,segmentation-type=%(seg_type)s,' 'segmentation-id=%(seg_id)s' % { @@ -105,6 +113,7 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): ] verifylist = [ ('name', self._trunk['name']), + ('description', self._trunk['description']), ('parent_port', self._trunk['port_id']), ('add_subports', [{ 'port': subport['port_id'], @@ -119,6 +128,7 @@ class TestCreateNetworkTrunk(test_fakes.TestNeutronClientOSCV2): self.neutronclient.create_trunk.assert_called_once_with({ trunk.TRUNK: {'name': self._trunk['name'], + 'description': self._trunk['description'], 'admin_state_up': False, 'sub_ports': [subport], 'port_id': self._trunk['port_id']} @@ -229,6 +239,7 @@ class TestShowNetworkTrunk(test_fakes.TestNeutronClientOSCV2): columns = ( 'admin_state_up', + 'description', 'id', 'name', 'port_id', @@ -238,6 +249,7 @@ class TestShowNetworkTrunk(test_fakes.TestNeutronClientOSCV2): ) data = ( trunk._format_admin_state(_trunk['admin_state_up']), + _trunk['description'], _trunk['id'], _trunk['name'], _trunk['port_id'], @@ -289,6 +301,7 @@ class TestListNetworkTrunk(test_fakes.TestNeutronClientOSCV2): 'ID', 'Name', 'Parent Port', + 'Description' ) columns_long = columns + ( 'Status', @@ -300,6 +313,7 @@ class TestListNetworkTrunk(test_fakes.TestNeutronClientOSCV2): t['id'], t['name'], t['port_id'], + t['description'] )) data_long = [] for t in _trunks: @@ -307,6 +321,7 @@ class TestListNetworkTrunk(test_fakes.TestNeutronClientOSCV2): t['id'], t['name'], t['port_id'], + t['description'], t['status'], trunk._format_admin_state(t['admin_state_up']), )) @@ -356,6 +371,7 @@ class TestSetNetworkTrunk(test_fakes.TestNeutronClientOSCV2): 'admin_state_up', 'id', 'name', + 'description', 'port_id', 'project_id', 'status', @@ -365,6 +381,7 @@ class TestSetNetworkTrunk(test_fakes.TestNeutronClientOSCV2): trunk._format_admin_state(_trunk['admin_state_up']), _trunk['id'], _trunk['name'], + _trunk['description'], _trunk['port_id'], _trunk['project_id'], _trunk['status'], @@ -383,26 +400,32 @@ class TestSetNetworkTrunk(test_fakes.TestNeutronClientOSCV2): # Get the command object to test self.cmd = trunk.SetNetworkTrunk(self.app, self.namespace) - def test_set_network_trunk_name(self): + def _test_set_network_trunk_attr(self, attr, value): arglist = [ - '--name', 'trunky', - self._trunk['name'], + '--%s' % attr, value, + self._trunk[attr], ] verifylist = [ - ('name', 'trunky'), - ('trunk', self._trunk['name']), + (attr, value), + ('trunk', self._trunk[attr]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) attrs = { - 'name': 'trunky', + attr: value, } self.neutronclient.update_trunk.assert_called_once_with( - self._trunk['name'], {trunk.TRUNK: attrs}) + self._trunk[attr], {trunk.TRUNK: attrs}) self.assertIsNone(result) + def test_set_network_trunk_name(self): + self._test_set_network_trunk_attr('name', 'trunky') + + def test_test_set_network_trunk_description(self): + self._test_set_network_trunk_attr('description', 'description') + def test_set_network_trunk_admin_state_up_disable(self): arglist = [ '--disable',