Merge "Router: Add "router set" command using SDK"
This commit is contained in:
commit
5a387695cc
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user