Merge "Router: Add "router set" command using SDK"
This commit is contained in:
		| @@ -74,3 +74,42 @@ List routers | ||||
| .. option:: --long | ||||
|  | ||||
|     List additional fields in output | ||||
|  | ||||
| router set | ||||
| ---------- | ||||
|  | ||||
| Set router properties | ||||
|  | ||||
| .. program:: router set | ||||
| .. code:: bash | ||||
|  | ||||
|     os router set | ||||
|         [--name <name>] | ||||
|         [--enable | --disable] | ||||
|         [--distributed | --centralized] | ||||
|         <router> | ||||
|  | ||||
| .. option:: --name <name> | ||||
|  | ||||
|     Set router name | ||||
|  | ||||
| .. option:: --enable | ||||
|  | ||||
|     Enable router | ||||
|  | ||||
| .. option:: --disable | ||||
|  | ||||
|     Disable router | ||||
|  | ||||
| .. option:: --distributed | ||||
|  | ||||
|     Set router to distributed mode (disabled router only) | ||||
|  | ||||
| .. option:: --centralized | ||||
|  | ||||
|     Set router to centralized mode (disabled router only) | ||||
|  | ||||
| .. _router_set-router: | ||||
| .. describe:: <router> | ||||
|  | ||||
|     Router to modify (name or ID) | ||||
|   | ||||
| @@ -20,6 +20,7 @@ from cliff import command | ||||
| from cliff import lister | ||||
| from cliff import show | ||||
|  | ||||
| from openstackclient.common import exceptions | ||||
| from openstackclient.common import utils | ||||
| from openstackclient.identity import common as identity_common | ||||
|  | ||||
| @@ -49,6 +50,7 @@ def _get_attrs(client_manager, parsed_args): | ||||
|         attrs['admin_state_up'] = parsed_args.admin_state_up | ||||
|     if parsed_args.distributed is not None: | ||||
|         attrs['distributed'] = parsed_args.distributed | ||||
|     # "router set" command doesn't support setting project. | ||||
|     if 'project' in parsed_args and parsed_args.project is not None: | ||||
|         identity_client = client_manager.identity | ||||
|         project_id = identity_common.find_project( | ||||
| @@ -57,6 +59,11 @@ def _get_attrs(client_manager, parsed_args): | ||||
|             parsed_args.project_domain, | ||||
|         ).id | ||||
|         attrs['tenant_id'] = project_id | ||||
|  | ||||
|     # TODO(tangchen): Support getting 'ha' property. | ||||
|     # TODO(tangchen): Support getting 'external_gateway_info' property. | ||||
|     # TODO(tangchen): Support getting 'routes' property. | ||||
|  | ||||
|     return attrs | ||||
|  | ||||
|  | ||||
| @@ -195,3 +202,74 @@ class ListRouter(lister.Lister): | ||||
|                     s, columns, | ||||
|                     formatters=_formatters, | ||||
|                 ) for s in data)) | ||||
|  | ||||
|  | ||||
| class SetRouter(command.Command): | ||||
|     """Set router properties""" | ||||
|  | ||||
|     log = logging.getLogger(__name__ + '.SetRouter') | ||||
|  | ||||
|     def get_parser(self, prog_name): | ||||
|         parser = super(SetRouter, self).get_parser(prog_name) | ||||
|         parser.add_argument( | ||||
|             'router', | ||||
|             metavar="<router>", | ||||
|             help=("Router to modify (name or ID)") | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--name', | ||||
|             metavar='<name>', | ||||
|             help='Set router name', | ||||
|         ) | ||||
|         admin_group = parser.add_mutually_exclusive_group() | ||||
|         admin_group.add_argument( | ||||
|             '--enable', | ||||
|             dest='admin_state_up', | ||||
|             action='store_true', | ||||
|             default=None, | ||||
|             help='Enable router', | ||||
|         ) | ||||
|         admin_group.add_argument( | ||||
|             '--disable', | ||||
|             dest='admin_state_up', | ||||
|             action='store_false', | ||||
|             help='Disable router', | ||||
|         ) | ||||
|         distribute_group = parser.add_mutually_exclusive_group() | ||||
|         distribute_group.add_argument( | ||||
|             '--distributed', | ||||
|             dest='distributed', | ||||
|             action='store_true', | ||||
|             default=None, | ||||
|             help="Set router to distributed mode (disabled router only)", | ||||
|         ) | ||||
|         distribute_group.add_argument( | ||||
|             '--centralized', | ||||
|             dest='distributed', | ||||
|             action='store_false', | ||||
|             help="Set router to centralized mode (disabled router only)", | ||||
|         ) | ||||
|  | ||||
|         # TODO(tangchen): Support setting 'ha' property in 'router set' | ||||
|         # command. It appears that changing the ha state is supported by | ||||
|         # neutron under certain conditions. | ||||
|  | ||||
|         # TODO(tangchen): Support setting 'external_gateway_info' property in | ||||
|         # 'router set' command. | ||||
|  | ||||
|         # TODO(tangchen): Support setting 'routes' property in 'router set' | ||||
|         # command. | ||||
|  | ||||
|         return parser | ||||
|  | ||||
|     def take_action(self, parsed_args): | ||||
|         self.log.debug('take_action(%s)' % parsed_args) | ||||
|         client = self.app.client_manager.network | ||||
|         obj = client.find_router(parsed_args.router, ignore_missing=False) | ||||
|  | ||||
|         attrs = _get_attrs(self.app.client_manager, parsed_args) | ||||
|         if attrs == {}: | ||||
|             msg = "Nothing specified to be set" | ||||
|             raise exceptions.CommandError(msg) | ||||
|  | ||||
|         client.update_router(obj, **attrs) | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
|  | ||||
| import mock | ||||
|  | ||||
| from openstackclient.common import exceptions | ||||
| from openstackclient.network.v2 import router | ||||
| from openstackclient.tests.network.v2 import fakes as network_fakes | ||||
| from openstackclient.tests import utils as tests_utils | ||||
| @@ -194,3 +195,92 @@ class TestListRouter(TestRouter): | ||||
|         self.network.routers.assert_called_with() | ||||
|         self.assertEqual(self.columns_long, columns) | ||||
|         self.assertEqual(self.data_long, list(data)) | ||||
|  | ||||
|  | ||||
| class TestSetRouter(TestRouter): | ||||
|  | ||||
|     # The router to set. | ||||
|     _router = network_fakes.FakeRouter.create_one_router() | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(TestSetRouter, self).setUp() | ||||
|  | ||||
|         self.network.update_router = mock.Mock(return_value=None) | ||||
|  | ||||
|         self.network.find_router = mock.Mock(return_value=self._router) | ||||
|  | ||||
|         # Get the command object to test | ||||
|         self.cmd = router.SetRouter(self.app, self.namespace) | ||||
|  | ||||
|     def test_set_this(self): | ||||
|         arglist = [ | ||||
|             self._router.name, | ||||
|             '--enable', | ||||
|             '--distributed', | ||||
|             '--name', 'noob', | ||||
|         ] | ||||
|         verifylist = [ | ||||
|             ('router', self._router.name), | ||||
|             ('admin_state_up', True), | ||||
|             ('distributed', True), | ||||
|             ('name', 'noob'), | ||||
|         ] | ||||
|  | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|         result = self.cmd.take_action(parsed_args) | ||||
|  | ||||
|         attrs = { | ||||
|             'admin_state_up': True, | ||||
|             'distributed': True, | ||||
|             'name': 'noob', | ||||
|         } | ||||
|         self.network.update_router.assert_called_with(self._router, **attrs) | ||||
|         self.assertEqual(None, result) | ||||
|  | ||||
|     def test_set_that(self): | ||||
|         arglist = [ | ||||
|             self._router.name, | ||||
|             '--disable', | ||||
|             '--centralized', | ||||
|         ] | ||||
|         verifylist = [ | ||||
|             ('router', self._router.name), | ||||
|             ('admin_state_up', False), | ||||
|             ('distributed', False), | ||||
|         ] | ||||
|  | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|         result = self.cmd.take_action(parsed_args) | ||||
|  | ||||
|         attrs = { | ||||
|             'admin_state_up': False, | ||||
|             'distributed': False, | ||||
|         } | ||||
|         self.network.update_router.assert_called_with(self._router, **attrs) | ||||
|         self.assertEqual(None, result) | ||||
|  | ||||
|     def test_set_distributed_centralized(self): | ||||
|         arglist = [ | ||||
|             self._router.name, | ||||
|             '--distributed', | ||||
|             '--centralized', | ||||
|         ] | ||||
|         verifylist = [ | ||||
|             ('router', self._router.name), | ||||
|             ('distributed', True), | ||||
|             ('distributed', False), | ||||
|         ] | ||||
|  | ||||
|         try: | ||||
|             # Argument parse failing should bail here | ||||
|             self.check_parser(self.cmd, arglist, verifylist) | ||||
|         except tests_utils.ParserException: | ||||
|             pass | ||||
|  | ||||
|     def test_set_nothing(self): | ||||
|         arglist = [self._router.name, ] | ||||
|         verifylist = [('router', self._router.name), ] | ||||
|  | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|         self.assertRaises(exceptions.CommandError, self.cmd.take_action, | ||||
|                           parsed_args) | ||||
|   | ||||
| @@ -335,6 +335,7 @@ openstack.network.v2 = | ||||
|     router_create = openstackclient.network.v2.router:CreateRouter | ||||
|     router_delete = openstackclient.network.v2.router:DeleteRouter | ||||
|     router_list = openstackclient.network.v2.router:ListRouter | ||||
|     router_set = openstackclient.network.v2.router:SetRouter | ||||
|  | ||||
| openstack.object_store.v1 = | ||||
|     object_store_account_set = openstackclient.object.v1.account:SetAccount | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jenkins
					Jenkins