Network: Add interfaces info in router show
Add a list of interfaces info in the output of 'openstack router show'. The information of router interface are: IP address, subnet ID and port ID. Co-Authored-By: Dongcan Ye <hellochosen@gmail.com> Change-Id: I1252986122122defffe795292b83dc4e84481c7e Closes-Bug: #1675489
This commit is contained in:
parent
b230ba73cd
commit
e7ef9e8556
@ -36,7 +36,7 @@ def _format_admin_state(state):
|
|||||||
return 'UP' if state else 'DOWN'
|
return 'UP' if state else 'DOWN'
|
||||||
|
|
||||||
|
|
||||||
def _format_external_gateway_info(info):
|
def _format_router_info(info):
|
||||||
try:
|
try:
|
||||||
return json.dumps(info)
|
return json.dumps(info)
|
||||||
except (TypeError, KeyError):
|
except (TypeError, KeyError):
|
||||||
@ -54,7 +54,7 @@ def _format_routes(routes):
|
|||||||
_formatters = {
|
_formatters = {
|
||||||
'admin_state_up': _format_admin_state,
|
'admin_state_up': _format_admin_state,
|
||||||
'is_admin_state_up': _format_admin_state,
|
'is_admin_state_up': _format_admin_state,
|
||||||
'external_gateway_info': _format_external_gateway_info,
|
'external_gateway_info': _format_router_info,
|
||||||
'availability_zones': utils.format_list,
|
'availability_zones': utils.format_list,
|
||||||
'availability_zone_hints': utils.format_list,
|
'availability_zone_hints': utils.format_list,
|
||||||
'routes': _format_routes,
|
'routes': _format_routes,
|
||||||
@ -69,6 +69,8 @@ def _get_columns(item):
|
|||||||
'is_distributed': 'distributed',
|
'is_distributed': 'distributed',
|
||||||
'is_admin_state_up': 'admin_state_up',
|
'is_admin_state_up': 'admin_state_up',
|
||||||
}
|
}
|
||||||
|
if hasattr(item, 'interfaces_info'):
|
||||||
|
column_map['interfaces_info'] = 'interfaces_info'
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
||||||
|
|
||||||
|
|
||||||
@ -657,7 +659,22 @@ class ShowRouter(command.ShowOne):
|
|||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
client = self.app.client_manager.network
|
client = self.app.client_manager.network
|
||||||
obj = client.find_router(parsed_args.router, ignore_missing=False)
|
obj = client.find_router(parsed_args.router, ignore_missing=False)
|
||||||
|
interfaces_info = []
|
||||||
|
filters = {}
|
||||||
|
filters['device_id'] = obj.id
|
||||||
|
for port in client.ports(**filters):
|
||||||
|
if port.device_owner != "network:router_gateway":
|
||||||
|
for ip_spec in port.fixed_ips:
|
||||||
|
int_info = {
|
||||||
|
'port_id': port.id,
|
||||||
|
'ip_address': ip_spec.get('ip_address'),
|
||||||
|
'subnet_id': ip_spec.get('subnet_id')
|
||||||
|
}
|
||||||
|
interfaces_info.append(int_info)
|
||||||
|
|
||||||
|
setattr(obj, 'interfaces_info', interfaces_info)
|
||||||
display_columns, columns = _get_columns(obj)
|
display_columns, columns = _get_columns(obj)
|
||||||
|
_formatters['interfaces_info'] = _format_router_info
|
||||||
data = utils.get_item_properties(obj, columns, formatters=_formatters)
|
data = utils.get_item_properties(obj, columns, formatters=_formatters)
|
||||||
|
|
||||||
return (display_columns, data)
|
return (display_columns, data)
|
||||||
|
@ -137,7 +137,7 @@ class TestCreateRouter(TestRouter):
|
|||||||
osc_utils.format_list(new_router.availability_zones),
|
osc_utils.format_list(new_router.availability_zones),
|
||||||
new_router.description,
|
new_router.description,
|
||||||
new_router.distributed,
|
new_router.distributed,
|
||||||
router._format_external_gateway_info(new_router.external_gateway_info),
|
router._format_router_info(new_router.external_gateway_info),
|
||||||
new_router.ha,
|
new_router.ha,
|
||||||
new_router.id,
|
new_router.id,
|
||||||
new_router.name,
|
new_router.name,
|
||||||
@ -448,7 +448,7 @@ class TestListRouter(TestRouter):
|
|||||||
data_long.append(
|
data_long.append(
|
||||||
data[i] + (
|
data[i] + (
|
||||||
router._format_routes(r.routes),
|
router._format_routes(r.routes),
|
||||||
router._format_external_gateway_info(r.external_gateway_info),
|
router._format_router_info(r.external_gateway_info),
|
||||||
osc_utils.format_list(r.availability_zones),
|
osc_utils.format_list(r.availability_zones),
|
||||||
osc_utils.format_list(r.tags),
|
osc_utils.format_list(r.tags),
|
||||||
)
|
)
|
||||||
@ -459,7 +459,7 @@ class TestListRouter(TestRouter):
|
|||||||
data_long_no_az.append(
|
data_long_no_az.append(
|
||||||
data[i] + (
|
data[i] + (
|
||||||
router._format_routes(r.routes),
|
router._format_routes(r.routes),
|
||||||
router._format_external_gateway_info(r.external_gateway_info),
|
router._format_router_info(r.external_gateway_info),
|
||||||
osc_utils.format_list(r.tags),
|
osc_utils.format_list(r.tags),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -1118,6 +1118,15 @@ class TestShowRouter(TestRouter):
|
|||||||
|
|
||||||
# The router to set.
|
# The router to set.
|
||||||
_router = network_fakes.FakeRouter.create_one_router()
|
_router = network_fakes.FakeRouter.create_one_router()
|
||||||
|
_port = network_fakes.FakePort.create_one_port({
|
||||||
|
'device_owner': 'network:router_interface',
|
||||||
|
'device_id': _router.id
|
||||||
|
})
|
||||||
|
setattr(_router,
|
||||||
|
'interfaces_info',
|
||||||
|
[{'port_id': _port.id,
|
||||||
|
'ip_address': _port.fixed_ips[0]['ip_address'],
|
||||||
|
'subnet_id': _port.fixed_ips[0]['subnet_id']}])
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'admin_state_up',
|
'admin_state_up',
|
||||||
@ -1128,6 +1137,7 @@ class TestShowRouter(TestRouter):
|
|||||||
'external_gateway_info',
|
'external_gateway_info',
|
||||||
'ha',
|
'ha',
|
||||||
'id',
|
'id',
|
||||||
|
'interfaces_info',
|
||||||
'name',
|
'name',
|
||||||
'project_id',
|
'project_id',
|
||||||
'routes',
|
'routes',
|
||||||
@ -1140,9 +1150,10 @@ class TestShowRouter(TestRouter):
|
|||||||
osc_utils.format_list(_router.availability_zones),
|
osc_utils.format_list(_router.availability_zones),
|
||||||
_router.description,
|
_router.description,
|
||||||
_router.distributed,
|
_router.distributed,
|
||||||
router._format_external_gateway_info(_router.external_gateway_info),
|
router._format_router_info(_router.external_gateway_info),
|
||||||
_router.ha,
|
_router.ha,
|
||||||
_router.id,
|
_router.id,
|
||||||
|
router._format_router_info(_router.interfaces_info),
|
||||||
_router.name,
|
_router.name,
|
||||||
_router.tenant_id,
|
_router.tenant_id,
|
||||||
router._format_routes(_router.routes),
|
router._format_routes(_router.routes),
|
||||||
@ -1154,6 +1165,7 @@ class TestShowRouter(TestRouter):
|
|||||||
super(TestShowRouter, self).setUp()
|
super(TestShowRouter, self).setUp()
|
||||||
|
|
||||||
self.network.find_router = mock.Mock(return_value=self._router)
|
self.network.find_router = mock.Mock(return_value=self._router)
|
||||||
|
self.network.ports = mock.Mock(return_value=[self._port])
|
||||||
|
|
||||||
# Get the command object to test
|
# Get the command object to test
|
||||||
self.cmd = router.ShowRouter(self.app, self.namespace)
|
self.cmd = router.ShowRouter(self.app, self.namespace)
|
||||||
@ -1178,6 +1190,9 @@ class TestShowRouter(TestRouter):
|
|||||||
|
|
||||||
self.network.find_router.assert_called_once_with(
|
self.network.find_router.assert_called_once_with(
|
||||||
self._router.name, ignore_missing=False)
|
self._router.name, ignore_missing=False)
|
||||||
|
self.network.ports.assert_called_with(**{
|
||||||
|
'device_id': self._router.id
|
||||||
|
})
|
||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
self.assertEqual(self.data, data)
|
self.assertEqual(self.data, data)
|
||||||
|
|
||||||
|
6
releasenotes/notes/bug-1675489-a1d226f2ee911420.yaml
Normal file
6
releasenotes/notes/bug-1675489-a1d226f2ee911420.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Add router interfaces info (as field ``interfaces_info``) to ``router show`` command.
|
||||||
|
The information of router interface include port's ID, IP address,
|
||||||
|
the subnet ID it belongs.
|
||||||
|
[Bug `1675489 <https://bugs.launchpad.net/python-openstackclient/+bug/1675489>`_]
|
Loading…
Reference in New Issue
Block a user