diff --git a/doc/source/command-objects/router.rst b/doc/source/command-objects/router.rst index 29131861d5..50e791ea7d 100644 --- a/doc/source/command-objects/router.rst +++ b/doc/source/command-objects/router.rst @@ -63,7 +63,7 @@ Create new router openstack router create [--project [--project-domain ]] [--enable | --disable] - [--distributed] + [--distributed | --centralized] [--ha | --no-ha] [--description ] [--availability-zone-hint ] @@ -90,6 +90,19 @@ Create new router Create a distributed router + The default router type (distributed vs centralized) is determined by a + configuration setting in the OpenStack deployment. Since we are unable + to know that default wihtout attempting to actually create a router it + is suggested to use either :option:`--distributed` or :option:`--centralized` + in situations where multiple cloud deployments may be used. + +.. option:: --centralized + + Create a centralized router + + See the note in :option:`--distributed` regarding the default used when + creating a new router. + .. option:: --ha Create a highly available router diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index f322d5d1f2..0da91baa44 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -78,8 +78,7 @@ def _get_attrs(client_manager, parsed_args): attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False - # centralized is available only for SetRouter and not for CreateRouter - if 'centralized' in parsed_args and parsed_args.centralized: + if parsed_args.centralized: attrs['distributed'] = False if parsed_args.distributed: attrs['distributed'] = True @@ -176,13 +175,17 @@ class CreateRouter(command.ShowOne): action='store_true', help=_("Disable router") ) - parser.add_argument( + distribute_group = parser.add_mutually_exclusive_group() + distribute_group.add_argument( '--distributed', - dest='distributed', action='store_true', - default=False, help=_("Create a distributed router") ) + distribute_group.add_argument( + '--centralized', + action='store_true', + help=_("Create a centralized router") + ) ha_group = parser.add_mutually_exclusive_group() ha_group.add_argument( '--ha', diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py index a4f91997c4..02e0be9459 100644 --- a/openstackclient/tests/unit/network/v2/test_router.py +++ b/openstackclient/tests/unit/network/v2/test_router.py @@ -211,6 +211,35 @@ class TestCreateRouter(TestRouter): def test_create_with_no_ha_option(self): self._test_create_with_ha_options('--no-ha', False) + def _test_create_with_distributed_options(self, option, distributed): + arglist = [ + option, + self.new_router.name, + ] + verifylist = [ + ('name', self.new_router.name), + ('enable', True), + ('distributed', distributed), + ('centralized', not distributed), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = (self.cmd.take_action(parsed_args)) + + self.network.create_router.assert_called_once_with(**{ + 'admin_state_up': True, + 'name': self.new_router.name, + 'distributed': distributed, + }) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_create_with_distributed_option(self): + self._test_create_with_distributed_options('--distributed', True) + + def test_create_with_centralized_option(self): + self._test_create_with_distributed_options('--centralized', False) + def test_create_with_AZ_hints(self): arglist = [ self.new_router.name, diff --git a/releasenotes/notes/bug-1664255-f82c5c13d92fed2a.yaml b/releasenotes/notes/bug-1664255-f82c5c13d92fed2a.yaml new file mode 100644 index 0000000000..ec162306b4 --- /dev/null +++ b/releasenotes/notes/bug-1664255-f82c5c13d92fed2a.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Allow users to create centralized (distributed=False) + routers using the ``--centralized`` option in ``router create``. + Without this, routers are created based on the default + neutron configuration of the deployment, which, for example, + could be 'distributed'. + [Bug `1664255 `_]