Router: Add "router set" command using SDK

This patch adds "router set" command to osc using sdk.

NOTE: Setting ha property of a router is not supported for now.
      Will suppport it in another patch.

Change-Id: I9c15249ae61a87291f0728ad1c8f0a98aa8119bf
Implements: blueprint neutron-client
Partial-bug: #1519503
This commit is contained in:
Tang Chen 2015-12-15 10:04:07 +08:00
parent 5736d1e00c
commit 8a805dae0c
4 changed files with 208 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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