diff --git a/doc/source/command-objects/network-segment.rst b/doc/source/command-objects/network-segment.rst index 56a11e1ed4..242dcbe965 100644 --- a/doc/source/command-objects/network-segment.rst +++ b/doc/source/command-objects/network-segment.rst @@ -9,6 +9,75 @@ within a network may not be guaranteed. Network v2 +network segment create +---------------------- + +Create new network segment + +.. caution:: This is a beta command and subject to change. + Use global option ``--os-beta-command`` to + enable this command. + +.. program:: network segment create +.. code:: bash + + os network segment create + [--description <description>] + [--physical-network <physical-network>] + [--segment <segment>] + --network <network> + --network-type <network-type> + <name> + +.. option:: --description <description> + + Network segment description + +.. option:: --physical-network <physical-network> + + Physical network name of this network segment + +.. option:: --segment <segment> + + Segment identifier for this network segment which is + based on the network type, VLAN ID for vlan network + type and tunnel ID for geneve, gre and vxlan network + types + +.. option:: --network <network> + + Network this network segment belongs to (name or ID) + +.. option:: --network-type <network-type> + + Network type of this network segment + (flat, geneve, gre, local, vlan or vxlan) + +.. _network_segment_create-name: +.. describe:: <name> + + New network segment name + +network segment delete +---------------------- + +Delete network segment(s) + +.. caution:: This is a beta command and subject to change. + Use global option ``--os-beta-command`` to + enable this command. + +.. program:: network segment delete +.. code:: bash + + os network segment delete + <network-segment> [<network-segment> ...] + +.. _network_segment_delete-segment: +.. describe:: <network-segment> + + Network segment(s) to delete (name or ID) + network segment list -------------------- @@ -33,6 +102,36 @@ List network segments List network segments that belong to this network (name or ID) +network segment set +------------------- + +Set network segment properties + +.. caution:: This is a beta command and subject to change. + Use global option ``--os-beta-command`` to + enable this command. + +.. program:: network segment set +.. code:: bash + + os network segment set + [--description <description>] + [--name <name>] + <network-segment> + +.. option:: --description <description> + + Set network segment description + +.. option:: --name <name> + + Set network segment name + +.. _network_segment_set-segment: +.. describe:: <network-segment> + + Network segment to modify (name or ID) + network segment show -------------------- @@ -51,4 +150,4 @@ Display network segment details .. _network_segment_show-segment: .. describe:: <network-segment> - Network segment to display (ID only) + Network segment to display (name or ID) diff --git a/openstackclient/network/v2/network_segment.py b/openstackclient/network/v2/network_segment.py index bedf15f7d7..34cac0e02e 100644 --- a/openstackclient/network/v2/network_segment.py +++ b/openstackclient/network/v2/network_segment.py @@ -13,14 +13,129 @@ """Network segment action implementations""" -# TODO(rtheis): Add description and name properties when support is available. +import logging from osc_lib.command import command +from osc_lib import exceptions from osc_lib import utils from openstackclient.i18n import _ +LOG = logging.getLogger(__name__) + + +class CreateNetworkSegment(command.ShowOne): + """Create new network segment + + (Caution: This is a beta command and subject to change. + Use global option --os-beta-command to enable + this command) + """ + + def get_parser(self, prog_name): + parser = super(CreateNetworkSegment, self).get_parser(prog_name) + parser.add_argument( + 'name', + metavar='<name>', + help=_('New network segment name') + ) + parser.add_argument( + '--description', + metavar='<description>', + help=_('Network segment description'), + ) + parser.add_argument( + '--physical-network', + metavar='<physical-network>', + help=_('Physical network name of this network segment'), + ) + parser.add_argument( + '--segment', + metavar='<segment>', + type=int, + help=_('Segment identifier for this network segment which is ' + 'based on the network type, VLAN ID for vlan network ' + 'type and tunnel ID for geneve, gre and vxlan network ' + 'types'), + ) + parser.add_argument( + '--network', + metavar='<network>', + required=True, + help=_('Network this network segment belongs to (name or ID)'), + ) + parser.add_argument( + '--network-type', + metavar='<network-type>', + choices=['flat', 'geneve', 'gre', 'local', 'vlan', 'vxlan'], + required=True, + help=_('Network type of this network segment ' + '(flat, geneve, gre, local, vlan or vxlan)'), + ) + return parser + + def take_action(self, parsed_args): + self.validate_os_beta_command_enabled() + client = self.app.client_manager.network + attrs = {} + attrs['name'] = parsed_args.name + attrs['network_id'] = client.find_network(parsed_args.network, + ignore_missing=False).id + attrs['network_type'] = parsed_args.network_type + if parsed_args.description is not None: + attrs['description'] = parsed_args.description + if parsed_args.physical_network is not None: + attrs['physical_network'] = parsed_args.physical_network + if parsed_args.segment is not None: + attrs['segmentation_id'] = parsed_args.segment + obj = client.create_segment(**attrs) + columns = tuple(sorted(obj.keys())) + data = utils.get_item_properties(obj, columns) + return (columns, data) + + +class DeleteNetworkSegment(command.Command): + """Delete network segment(s) + + (Caution: This is a beta command and subject to change. + Use global option --os-beta-command to enable + this command) + """ + + def get_parser(self, prog_name): + parser = super(DeleteNetworkSegment, self).get_parser(prog_name) + parser.add_argument( + 'network_segment', + metavar='<network-segment>', + nargs='+', + help=_('Network segment(s) to delete (name or ID)'), + ) + return parser + + def take_action(self, parsed_args): + self.validate_os_beta_command_enabled() + client = self.app.client_manager.network + + result = 0 + for network_segment in parsed_args.network_segment: + try: + obj = client.find_segment(network_segment, + ignore_missing=False) + client.delete_segment(obj) + except Exception as e: + result += 1 + LOG.error(_("Failed to delete network segment with " + "ID '%(network_segment)s': %(e)s") + % {'network_segment': network_segment, 'e': e}) + + if result > 0: + total = len(parsed_args.network_segment) + msg = (_("%(result)s of %(total)s network segments failed " + "to delete.") % {'result': result, 'total': total}) + raise exceptions.CommandError(msg) + + class ListNetworkSegment(command.Lister): """List network segments @@ -61,12 +176,14 @@ class ListNetworkSegment(command.Lister): headers = ( 'ID', + 'Name', 'Network', 'Network Type', 'Segment', ) columns = ( 'id', + 'name', 'network_id', 'network_type', 'segmentation_id', @@ -86,6 +203,46 @@ class ListNetworkSegment(command.Lister): ) for s in data)) +class SetNetworkSegment(command.Command): + """Set network segment properties + + (Caution: This is a beta command and subject to change. + Use global option --os-beta-command to enable + this command) + """ + + def get_parser(self, prog_name): + parser = super(SetNetworkSegment, self).get_parser(prog_name) + parser.add_argument( + 'network_segment', + metavar='<network-segment>', + help=_('Network segment to modify (name or ID)'), + ) + parser.add_argument( + '--description', + metavar='<description>', + help=_('Set network segment description'), + ) + parser.add_argument( + '--name', + metavar='<name>', + help=_('Set network segment name'), + ) + return parser + + def take_action(self, parsed_args): + self.validate_os_beta_command_enabled() + client = self.app.client_manager.network + obj = client.find_segment(parsed_args.network_segment, + ignore_missing=False) + attrs = {} + if parsed_args.description is not None: + attrs['description'] = parsed_args.description + if parsed_args.name is not None: + attrs['name'] = parsed_args.name + client.update_segment(obj, **attrs) + + class ShowNetworkSegment(command.ShowOne): """Display network segment details @@ -99,7 +256,7 @@ class ShowNetworkSegment(command.ShowOne): parser.add_argument( 'network_segment', metavar='<network-segment>', - help=_('Network segment to display (ID only)'), + help=_('Network segment to display (name or ID)'), ) return parser diff --git a/openstackclient/tests/functional/base.py b/openstackclient/tests/functional/base.py index f7f0361eea..298b24548b 100644 --- a/openstackclient/tests/functional/base.py +++ b/openstackclient/tests/functional/base.py @@ -57,6 +57,11 @@ class TestCase(testtools.TestCase): opts = cls.get_opts([configuration]) return cls.openstack('configuration show ' + opts) + @classmethod + def get_openstack_extention_names(cls): + opts = cls.get_opts(['Name']) + return cls.openstack('extension list ' + opts) + @classmethod def get_opts(cls, fields, format='value'): return ' -f {0} {1}'.format(format, diff --git a/openstackclient/tests/functional/network/v2/test_network_segment.py b/openstackclient/tests/functional/network/v2/test_network_segment.py index f871e88e18..de5aef9650 100644 --- a/openstackclient/tests/functional/network/v2/test_network_segment.py +++ b/openstackclient/tests/functional/network/v2/test_network_segment.py @@ -10,20 +10,18 @@ # License for the specific language governing permissions and limitations # under the License. -import testtools import uuid from openstackclient.tests.functional import base -# NOTE(rtheis): Routed networks is still a WIP and not enabled by default. -@testtools.skip("bp/routed-networks") class NetworkSegmentTests(base.TestCase): """Functional tests for network segment. """ NETWORK_NAME = uuid.uuid4().hex PHYSICAL_NETWORK_NAME = uuid.uuid4().hex NETWORK_SEGMENT_ID = None NETWORK_ID = None + NETWORK_SEGMENT_EXTENSION = None @classmethod def setUpClass(cls): @@ -32,29 +30,75 @@ class NetworkSegmentTests(base.TestCase): raw_output = cls.openstack('network create ' + cls.NETWORK_NAME + opts) cls.NETWORK_ID = raw_output.strip('\n') - # Get the segment for the network. - opts = cls.get_opts(['ID', 'Network']) - raw_output = cls.openstack('--os-beta-command ' - 'network segment list ' - ' --network ' + cls.NETWORK_NAME + - ' ' + opts) - raw_output_row = raw_output.split('\n')[0] - cls.NETWORK_SEGMENT_ID = raw_output_row.split(' ')[0] + # NOTE(rtheis): The segment extension is not yet enabled by default. + # Skip the tests if not enabled. + extensions = cls.get_openstack_extention_names() + if 'Segment' in extensions: + cls.NETWORK_SEGMENT_EXTENSION = 'Segment' + + if cls.NETWORK_SEGMENT_EXTENSION: + # Get the segment for the network. + opts = cls.get_opts(['ID', 'Network']) + raw_output = cls.openstack('--os-beta-command ' + 'network segment list ' + ' --network ' + cls.NETWORK_NAME + + ' ' + opts) + raw_output_row = raw_output.split('\n')[0] + cls.NETWORK_SEGMENT_ID = raw_output_row.split(' ')[0] @classmethod def tearDownClass(cls): raw_output = cls.openstack('network delete ' + cls.NETWORK_NAME) cls.assertOutput('', raw_output) + def test_network_segment_create_delete(self): + if self.NETWORK_SEGMENT_EXTENSION: + opts = self.get_opts(['id']) + raw_output = self.openstack( + '--os-beta-command' + + ' network segment create --network ' + self.NETWORK_ID + + ' --network-type geneve ' + + ' --segment 2055 test_segment ' + opts + ) + network_segment_id = raw_output.strip('\n') + raw_output = self.openstack('--os-beta-command ' + + 'network segment delete ' + + network_segment_id) + self.assertOutput('', raw_output) + else: + self.skipTest('Segment extension disabled') + def test_network_segment_list(self): - opts = self.get_opts(['ID']) - raw_output = self.openstack('--os-beta-command ' - 'network segment list' + opts) - self.assertIn(self.NETWORK_SEGMENT_ID, raw_output) + if self.NETWORK_SEGMENT_EXTENSION: + opts = self.get_opts(['ID']) + raw_output = self.openstack('--os-beta-command ' + 'network segment list' + opts) + self.assertIn(self.NETWORK_SEGMENT_ID, raw_output) + else: + self.skipTest('Segment extension disabled') + + def test_network_segment_set(self): + if self.NETWORK_SEGMENT_EXTENSION: + new_description = 'new_description' + raw_output = self.openstack('--os-beta-command ' + 'network segment set ' + + '--description ' + new_description + + ' ' + self.NETWORK_SEGMENT_ID) + self.assertOutput('', raw_output) + opts = self.get_opts(['description']) + raw_output = self.openstack('--os-beta-command ' + 'network segment show ' + + self.NETWORK_SEGMENT_ID + opts) + self.assertEqual(new_description + "\n", raw_output) + else: + self.skipTest('Segment extension disabled') def test_network_segment_show(self): - opts = self.get_opts(['network_id']) - raw_output = self.openstack('--os-beta-command ' - 'network segment show ' + - self.NETWORK_SEGMENT_ID + opts) - self.assertEqual(self.NETWORK_ID + "\n", raw_output) + if self.NETWORK_SEGMENT_EXTENSION: + opts = self.get_opts(['network_id']) + raw_output = self.openstack('--os-beta-command ' + 'network segment show ' + + self.NETWORK_SEGMENT_ID + opts) + self.assertEqual(self.NETWORK_ID + "\n", raw_output) + else: + self.skipTest('Segment extension disabled') diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index 89b128ee78..91aebf9f43 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -364,11 +364,14 @@ class FakeNetworkSegment(object): attrs = attrs or {} # Set default attributes. + fake_uuid = uuid.uuid4().hex network_segment_attrs = { - 'id': 'network-segment-id-' + uuid.uuid4().hex, - 'network_id': 'network-id-' + uuid.uuid4().hex, + 'description': 'network-segment-description-' + fake_uuid, + 'id': 'network-segment-id-' + fake_uuid, + 'name': 'network-segment-name-' + fake_uuid, + 'network_id': 'network-id-' + fake_uuid, 'network_type': 'vlan', - 'physical_network': 'physical-network-name-' + uuid.uuid4().hex, + 'physical_network': 'physical-network-name-' + fake_uuid, 'segmentation_id': 1024, } diff --git a/openstackclient/tests/unit/network/v2/test_network_segment.py b/openstackclient/tests/unit/network/v2/test_network_segment.py index b9fce0784f..3e755e0730 100644 --- a/openstackclient/tests/unit/network/v2/test_network_segment.py +++ b/openstackclient/tests/unit/network/v2/test_network_segment.py @@ -12,6 +12,7 @@ # import mock +from mock import call from osc_lib import exceptions @@ -32,6 +33,243 @@ class TestNetworkSegment(network_fakes.TestNetworkV2): self.network = self.app.client_manager.network +class TestCreateNetworkSegment(TestNetworkSegment): + + # The network segment to create along with associated network. + _network_segment = \ + network_fakes.FakeNetworkSegment.create_one_network_segment() + _network = network_fakes.FakeNetwork.create_one_network({ + 'id': _network_segment.network_id, + }) + + columns = ( + 'description', + 'id', + 'name', + 'network_id', + 'network_type', + 'physical_network', + 'segmentation_id', + ) + + data = ( + _network_segment.description, + _network_segment.id, + _network_segment.name, + _network_segment.network_id, + _network_segment.network_type, + _network_segment.physical_network, + _network_segment.segmentation_id, + ) + + def setUp(self): + super(TestCreateNetworkSegment, self).setUp() + + self.network.create_segment = mock.Mock( + return_value=self._network_segment + ) + self.network.find_network = mock.Mock(return_value=self._network) + + # Get the command object to test + self.cmd = network_segment.CreateNetworkSegment( + self.app, + self.namespace + ) + + def test_create_no_options(self): + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, [], []) + + def test_create_no_beta_commands(self): + arglist = [ + '--network', self._network_segment.network_id, + '--network-type', self._network_segment.network_type, + self._network_segment.name, + ] + verifylist = [ + ('network', self._network_segment.network_id), + ('network_type', self._network_segment.network_type), + ('name', self._network_segment.name), + ] + self.app.options.os_beta_command = False + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.assertRaises(exceptions.CommandError, self.cmd.take_action, + parsed_args) + + def test_create_invalid_network_type(self): + arglist = [ + '--network', self._network_segment.network_id, + '--network-type', 'foo', + self._network_segment.name, + ] + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, []) + + def test_create_minimum_options(self): + arglist = [ + '--network', self._network_segment.network_id, + '--network-type', self._network_segment.network_type, + self._network_segment.name, + ] + verifylist = [ + ('network', self._network_segment.network_id), + ('network_type', self._network_segment.network_type), + ('name', self._network_segment.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.find_network.assert_called_once_with( + self._network_segment.network_id, + ignore_missing=False + ) + self.network.create_segment.assert_called_once_with(**{ + 'network_id': self._network_segment.network_id, + 'network_type': self._network_segment.network_type, + 'name': self._network_segment.name, + }) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_create_all_options(self): + arglist = [ + '--description', self._network_segment.description, + '--network', self._network_segment.network_id, + '--network-type', self._network_segment.network_type, + '--physical-network', self._network_segment.physical_network, + '--segment', str(self._network_segment.segmentation_id), + self._network_segment.name, + ] + verifylist = [ + ('description', self._network_segment.description), + ('network', self._network_segment.network_id), + ('network_type', self._network_segment.network_type), + ('physical_network', self._network_segment.physical_network), + ('segment', self._network_segment.segmentation_id), + ('name', self._network_segment.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.find_network.assert_called_once_with( + self._network_segment.network_id, + ignore_missing=False + ) + self.network.create_segment.assert_called_once_with(**{ + 'description': self._network_segment.description, + 'network_id': self._network_segment.network_id, + 'network_type': self._network_segment.network_type, + 'physical_network': self._network_segment.physical_network, + 'segmentation_id': self._network_segment.segmentation_id, + 'name': self._network_segment.name, + }) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + +class TestDeleteNetworkSegment(TestNetworkSegment): + + # The network segments to delete. + _network_segments = \ + network_fakes.FakeNetworkSegment.create_network_segments() + + def setUp(self): + super(TestDeleteNetworkSegment, self).setUp() + + self.network.delete_segment = mock.Mock(return_value=None) + self.network.find_segment = mock.MagicMock( + side_effect=self._network_segments + ) + + # Get the command object to test + self.cmd = network_segment.DeleteNetworkSegment( + self.app, + self.namespace + ) + + def test_delete_no_beta_commands(self): + arglist = [ + self._network_segments[0].id, + ] + verifylist = [ + ('network_segment', [self._network_segments[0].id]), + ] + self.app.options.os_beta_command = False + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.assertRaises(exceptions.CommandError, self.cmd.take_action, + parsed_args) + + def test_delete(self): + arglist = [ + self._network_segments[0].id, + ] + verifylist = [ + ('network_segment', [self._network_segments[0].id]), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.network.delete_segment.assert_called_once_with( + self._network_segments[0] + ) + self.assertIsNone(result) + + def test_delete_multiple(self): + arglist = [] + for _network_segment in self._network_segments: + arglist.append(_network_segment.id) + verifylist = [ + ('network_segment', arglist), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + calls = [] + for _network_segment in self._network_segments: + calls.append(call(_network_segment)) + self.network.delete_segment.assert_has_calls(calls) + self.assertIsNone(result) + + def test_delete_multiple_with_exception(self): + arglist = [ + self._network_segments[0].id, + 'doesnotexist' + ] + verifylist = [ + ('network_segment', [self._network_segments[0].id, + 'doesnotexist']), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + find_mock_result = [self._network_segments[0], + exceptions.CommandError] + self.network.find_segment = ( + mock.MagicMock(side_effect=find_mock_result) + ) + + try: + self.cmd.take_action(parsed_args) + self.fail('CommandError should be raised.') + except exceptions.CommandError as e: + self.assertEqual('1 of 2 network segments failed to delete.', + str(e)) + + self.network.find_segment.assert_any_call( + self._network_segments[0].id, ignore_missing=False) + self.network.find_segment.assert_any_call( + 'doesnotexist', ignore_missing=False) + self.network.delete_segment.assert_called_once_with( + self._network_segments[0] + ) + + class TestListNetworkSegment(TestNetworkSegment): _network = network_fakes.FakeNetwork.create_one_network() _network_segments = \ @@ -39,6 +277,7 @@ class TestListNetworkSegment(TestNetworkSegment): columns = ( 'ID', + 'Name', 'Network', 'Network Type', 'Segment', @@ -51,6 +290,7 @@ class TestListNetworkSegment(TestNetworkSegment): for _network_segment in _network_segments: data.append(( _network_segment.id, + _network_segment.name, _network_segment.network_id, _network_segment.network_type, _network_segment.segmentation_id, @@ -60,6 +300,7 @@ class TestListNetworkSegment(TestNetworkSegment): for _network_segment in _network_segments: data_long.append(( _network_segment.id, + _network_segment.name, _network_segment.network_id, _network_segment.network_type, _network_segment.segmentation_id, @@ -131,6 +372,78 @@ class TestListNetworkSegment(TestNetworkSegment): self.assertEqual(self.data, list(data)) +class TestSetNetworkSegment(TestNetworkSegment): + + # The network segment to show. + _network_segment = \ + network_fakes.FakeNetworkSegment.create_one_network_segment() + + def setUp(self): + super(TestSetNetworkSegment, self).setUp() + + self.network.find_segment = mock.Mock( + return_value=self._network_segment + ) + self.network.update_segment = mock.Mock( + return_value=self._network_segment + ) + + # Get the command object to test + self.cmd = network_segment.SetNetworkSegment(self.app, self.namespace) + + def test_set_no_beta_commands(self): + arglist = [ + self._network_segment.id, + ] + verifylist = [ + ('network_segment', self._network_segment.id), + ] + self.app.options.os_beta_command = False + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.assertRaises(exceptions.CommandError, self.cmd.take_action, + parsed_args) + + def test_set_no_options(self): + arglist = [ + self._network_segment.id, + ] + verifylist = [ + ('network_segment', self._network_segment.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.network.update_segment.assert_called_once_with( + self._network_segment, **{} + ) + self.assertIsNone(result) + + def test_set_all_options(self): + arglist = [ + '--description', 'new description', + '--name', 'new name', + self._network_segment.id, + ] + verifylist = [ + ('description', 'new description'), + ('name', 'new name'), + ('network_segment', self._network_segment.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + attrs = { + 'description': 'new description', + 'name': 'new name', + } + self.network.update_segment.assert_called_once_with( + self._network_segment, **attrs + ) + self.assertIsNone(result) + + class TestShowNetworkSegment(TestNetworkSegment): # The network segment to show. @@ -138,7 +451,9 @@ class TestShowNetworkSegment(TestNetworkSegment): network_fakes.FakeNetworkSegment.create_one_network_segment() columns = ( + 'description', 'id', + 'name', 'network_id', 'network_type', 'physical_network', @@ -146,7 +461,9 @@ class TestShowNetworkSegment(TestNetworkSegment): ) data = ( + _network_segment.description, _network_segment.id, + _network_segment.name, _network_segment.network_id, _network_segment.network_type, _network_segment.physical_network, diff --git a/releasenotes/notes/bp-routed-networks-3b502faa5cd96807.yaml b/releasenotes/notes/bp-routed-networks-3b502faa5cd96807.yaml new file mode 100644 index 0000000000..b055479368 --- /dev/null +++ b/releasenotes/notes/bp-routed-networks-3b502faa5cd96807.yaml @@ -0,0 +1,6 @@ +--- +features: + - Add ``network segment create``, ``network segment delete`` and + ``network segment set`` commands. These are beta commands and subject to + change. Use global option ``--os-beta-command`` to enable these commands. + [Blueprint `routed-networks <https://blueprints.launchpad.net/neutron/+spec/routed-networks>`_] diff --git a/setup.cfg b/setup.cfg index 3e6486a23d..3041dcd82c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -372,7 +372,10 @@ openstack.network.v2 = network_rbac_set = openstackclient.network.v2.network_rbac:SetNetworkRBAC network_rbac_show = openstackclient.network.v2.network_rbac:ShowNetworkRBAC + network_segment_create = openstackclient.network.v2.network_segment:CreateNetworkSegment + network_segment_delete = openstackclient.network.v2.network_segment:DeleteNetworkSegment network_segment_list = openstackclient.network.v2.network_segment:ListNetworkSegment + network_segment_set = openstackclient.network.v2.network_segment:SetNetworkSegment network_segment_show = openstackclient.network.v2.network_segment:ShowNetworkSegment port_create = openstackclient.network.v2.port:CreatePort