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
doc/source/command-objects
openstackclient
network/v2
tests/network/v2
setup.cfg

@ -74,3 +74,42 @@ List routers
.. option:: --long .. option:: --long
List additional fields in output 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 lister
from cliff import show from cliff import show
from openstackclient.common import exceptions
from openstackclient.common import utils from openstackclient.common import utils
from openstackclient.identity import common as identity_common 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 attrs['admin_state_up'] = parsed_args.admin_state_up
if parsed_args.distributed is not None: if parsed_args.distributed is not None:
attrs['distributed'] = parsed_args.distributed 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: if 'project' in parsed_args and parsed_args.project is not None:
identity_client = client_manager.identity identity_client = client_manager.identity
project_id = identity_common.find_project( project_id = identity_common.find_project(
@ -57,6 +59,11 @@ def _get_attrs(client_manager, parsed_args):
parsed_args.project_domain, parsed_args.project_domain,
).id ).id
attrs['tenant_id'] = project_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 return attrs
@ -195,3 +202,74 @@ class ListRouter(lister.Lister):
s, columns, s, columns,
formatters=_formatters, formatters=_formatters,
) for s in data)) ) 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 import mock
from openstackclient.common import exceptions
from openstackclient.network.v2 import router from openstackclient.network.v2 import router
from openstackclient.tests.network.v2 import fakes as network_fakes from openstackclient.tests.network.v2 import fakes as network_fakes
from openstackclient.tests import utils as tests_utils from openstackclient.tests import utils as tests_utils
@ -194,3 +195,92 @@ class TestListRouter(TestRouter):
self.network.routers.assert_called_with() self.network.routers.assert_called_with()
self.assertEqual(self.columns_long, columns) self.assertEqual(self.columns_long, columns)
self.assertEqual(self.data_long, list(data)) 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_create = openstackclient.network.v2.router:CreateRouter
router_delete = openstackclient.network.v2.router:DeleteRouter router_delete = openstackclient.network.v2.router:DeleteRouter
router_list = openstackclient.network.v2.router:ListRouter router_list = openstackclient.network.v2.router:ListRouter
router_set = openstackclient.network.v2.router:SetRouter
openstack.object_store.v1 = openstack.object_store.v1 =
object_store_account_set = openstackclient.object.v1.account:SetAccount object_store_account_set = openstackclient.object.v1.account:SetAccount