Add availability zone support for router commands
This patch allows the adding of availability_zone_hints during router create. Also allows for the display of availability_zones during list and and show commands. Change-Id: Ifbc5c218bc7103d28076d726212ce25321bcf7f1 Partial-bug: #1519503 Partially-implements: blueprint neutron-client
This commit is contained in:
parent
bd1adaf003
commit
c0d2120883
@ -16,6 +16,7 @@ Create new router
|
|||||||
[--project <project> [--project-domain <project-domain>]]
|
[--project <project> [--project-domain <project-domain>]]
|
||||||
[--enable | --disable]
|
[--enable | --disable]
|
||||||
[--distributed]
|
[--distributed]
|
||||||
|
[--availability-zone-hint <availability-zone>]
|
||||||
<name>
|
<name>
|
||||||
|
|
||||||
.. option:: --project <project>
|
.. option:: --project <project>
|
||||||
@ -39,6 +40,11 @@ Create new router
|
|||||||
|
|
||||||
Create a distributed router
|
Create a distributed router
|
||||||
|
|
||||||
|
.. option:: --availability-zone-hint <availability-zone>
|
||||||
|
|
||||||
|
Availability Zone in which to create this router (requires the Router
|
||||||
|
Availability Zone extension, this option can be repeated).
|
||||||
|
|
||||||
.. _router_create-name:
|
.. _router_create-name:
|
||||||
.. describe:: <name>
|
.. describe:: <name>
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@ def _format_external_gateway_info(info):
|
|||||||
_formatters = {
|
_formatters = {
|
||||||
'admin_state_up': _format_admin_state,
|
'admin_state_up': _format_admin_state,
|
||||||
'external_gateway_info': _format_external_gateway_info,
|
'external_gateway_info': _format_external_gateway_info,
|
||||||
|
'availability_zones': utils.format_list,
|
||||||
|
'availability_zone_hints': utils.format_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -50,6 +52,9 @@ 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
|
||||||
|
if ('availability_zone_hints' in parsed_args
|
||||||
|
and parsed_args.availability_zone_hints is not None):
|
||||||
|
attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
|
||||||
# "router set" command doesn't support setting project.
|
# "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
|
||||||
@ -105,6 +110,16 @@ class CreateRouter(show.ShowOne):
|
|||||||
metavar='<poroject>',
|
metavar='<poroject>',
|
||||||
help="Owner's project (name or ID)",
|
help="Owner's project (name or ID)",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--availability-zone-hint',
|
||||||
|
metavar='<availability-zone>',
|
||||||
|
action='append',
|
||||||
|
dest='availability_zone_hints',
|
||||||
|
help='Availability Zone in which to create this router '
|
||||||
|
'(requires the Router Availability Zone extension, '
|
||||||
|
'this option can be repeated).',
|
||||||
|
)
|
||||||
|
|
||||||
identity_common.add_project_domain_option_to_parser(parser)
|
identity_common.add_project_domain_option_to_parser(parser)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
@ -189,10 +204,12 @@ class ListRouter(lister.Lister):
|
|||||||
columns = columns + (
|
columns = columns + (
|
||||||
'routes',
|
'routes',
|
||||||
'external_gateway_info',
|
'external_gateway_info',
|
||||||
|
'availability_zones'
|
||||||
)
|
)
|
||||||
column_headers = column_headers + (
|
column_headers = column_headers + (
|
||||||
'Routes',
|
'Routes',
|
||||||
'External gateway info',
|
'External gateway info',
|
||||||
|
'Availability zones'
|
||||||
)
|
)
|
||||||
|
|
||||||
data = client.routers()
|
data = client.routers()
|
||||||
|
@ -171,6 +171,8 @@ class FakeRouter(object):
|
|||||||
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
'tenant_id': 'project-id-' + uuid.uuid4().hex,
|
||||||
'routes': [],
|
'routes': [],
|
||||||
'external_gateway_info': {},
|
'external_gateway_info': {},
|
||||||
|
'availability_zone_hints': [],
|
||||||
|
'availability_zones': [],
|
||||||
}
|
}
|
||||||
|
|
||||||
# Overwrite default attributes.
|
# Overwrite default attributes.
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
import mock
|
import mock
|
||||||
|
|
||||||
from openstackclient.common import exceptions
|
from openstackclient.common import exceptions
|
||||||
|
from openstackclient.common import utils as osc_utils
|
||||||
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
|
||||||
@ -88,6 +89,31 @@ class TestCreateRouter(TestRouter):
|
|||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
self.assertEqual(self.data, data)
|
self.assertEqual(self.data, data)
|
||||||
|
|
||||||
|
def test_create_with_AZ_hints(self):
|
||||||
|
arglist = [
|
||||||
|
self.new_router.name,
|
||||||
|
'--availability-zone-hint', 'fake-az',
|
||||||
|
'--availability-zone-hint', 'fake-az2',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('name', self.new_router.name),
|
||||||
|
('availability_zone_hints', ['fake-az', 'fake-az2']),
|
||||||
|
('admin_state_up', True),
|
||||||
|
('distributed', False),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = (self.cmd.take_action(parsed_args))
|
||||||
|
self.network.create_router.assert_called_with(**{
|
||||||
|
'admin_state_up': True,
|
||||||
|
'name': self.new_router.name,
|
||||||
|
'distributed': False,
|
||||||
|
'availability_zone_hints': ['fake-az', 'fake-az2'],
|
||||||
|
})
|
||||||
|
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.data, data)
|
||||||
|
|
||||||
|
|
||||||
class TestDeleteRouter(TestRouter):
|
class TestDeleteRouter(TestRouter):
|
||||||
|
|
||||||
@ -135,6 +161,7 @@ class TestListRouter(TestRouter):
|
|||||||
columns_long = columns + (
|
columns_long = columns + (
|
||||||
'Routes',
|
'Routes',
|
||||||
'External gateway info',
|
'External gateway info',
|
||||||
|
'Availability zones'
|
||||||
)
|
)
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
@ -155,6 +182,7 @@ class TestListRouter(TestRouter):
|
|||||||
data[i] + (
|
data[i] + (
|
||||||
r.routes,
|
r.routes,
|
||||||
router._format_external_gateway_info(r.external_gateway_info),
|
router._format_external_gateway_info(r.external_gateway_info),
|
||||||
|
osc_utils.format_list(r.availability_zones),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user