diff options
| author | Jenkins <jenkins@review.openstack.org> | 2017-07-20 16:35:14 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2017-07-20 16:35:14 +0000 |
| commit | ac8cac4b63590e3b583faee88b6c481f2f3e9d9a (patch) | |
| tree | b7c95f99040adc657ba672a1ff6e56bed9c0a767 /openstackclient/network/v2 | |
| parent | 39673217dc88d8e7200ac090ad3d60e5b6703fdd (diff) | |
| parent | 18c532377a2f6d87adef80465fea7ed50d5a17d1 (diff) | |
| download | python-openstackclient-ac8cac4b63590e3b583faee88b6c481f2f3e9d9a.tar.gz | |
Merge "Network L3 Router Commands for OSC"
Diffstat (limited to 'openstackclient/network/v2')
| -rw-r--r-- | openstackclient/network/v2/network_agent.py | 121 | ||||
| -rw-r--r-- | openstackclient/network/v2/router.py | 32 |
2 files changed, 127 insertions, 26 deletions
diff --git a/openstackclient/network/v2/network_agent.py b/openstackclient/network/v2/network_agent.py index 1334f77e..ed4970a4 100644 --- a/openstackclient/network/v2/network_agent.py +++ b/openstackclient/network/v2/network_agent.py @@ -26,10 +26,16 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +def _format_alive(alive): + return ":-)" if alive else "XXX" + + def _format_admin_state(state): return 'UP' if state else 'DOWN' _formatters = { + 'is_alive': _format_alive, + 'alive': _format_alive, 'admin_state_up': _format_admin_state, 'is_admin_state_up': _format_admin_state, 'configurations': utils.format_dict, @@ -60,7 +66,7 @@ class AddNetworkToAgent(command.Command): parser.add_argument( 'network', metavar='<network>', - help=_('Network to be added to an agent (ID or name)')) + help=_('Network to be added to an agent (name or ID)')) return parser @@ -78,6 +84,37 @@ class AddNetworkToAgent(command.Command): exceptions.CommandError(msg) +class AddRouterToAgent(command.Command): + _description = _("Add router to an agent") + + def get_parser(self, prog_name): + parser = super(AddRouterToAgent, self).get_parser(prog_name) + parser.add_argument( + '--l3', + action='store_true', + help=_('Add router to an L3 agent') + ) + parser.add_argument( + 'agent_id', + metavar='<agent-id>', + help=_("Agent to which a router is added (ID only)") + ) + parser.add_argument( + 'router', + metavar='<router>', + help=_("Router to be added to an agent (name or ID)") + ) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + agent = client.get_agent(parsed_args.agent_id) + router = client.find_router(parsed_args.router, ignore_missing=False) + if parsed_args.l3: + client.add_router_to_agent(agent, router) + + class DeleteNetworkAgent(command.Command): _description = _("Delete network agent(s)") @@ -135,11 +172,24 @@ class ListNetworkAgent(command.Lister): metavar='<host>', help=_("List only agents running on the specified host") ) - parser.add_argument( + agent_type_group = parser.add_mutually_exclusive_group() + agent_type_group.add_argument( '--network', metavar='<network>', help=_('List agents hosting a network (name or ID)') ) + agent_type_group.add_argument( + '--router', + metavar='<router>', + help=_('List agents hosting this router (name or ID)') + ) + parser.add_argument( + '--long', + action='store_true', + default=False, + help=_("List additional fields in output") + ) + return parser def take_action(self, parsed_args): @@ -178,28 +228,18 @@ class ListNetworkAgent(command.Lister): } filters = {} + if parsed_args.network is not None: - columns = ( - 'id', - 'host', - 'is_admin_state_up', - 'is_alive', - ) - column_headers = ( - 'ID', - 'Host', - 'Admin State Up', - 'Alive', - ) network = client.find_network( parsed_args.network, ignore_missing=False) data = client.network_hosting_dhcp_agents(network) - - return (column_headers, - (utils.get_item_properties( - s, columns, - formatters=_formatters, - ) for s in data)) + elif parsed_args.router is not None: + if parsed_args.long: + columns += ('ha_state',) + column_headers += ('HA State',) + router = client.find_router(parsed_args.router, + ignore_missing=False) + data = client.routers_hosting_l3_agents(router) else: if parsed_args.agent_type is not None: filters['agent_type'] = key_value[parsed_args.agent_type] @@ -207,10 +247,10 @@ class ListNetworkAgent(command.Lister): filters['host'] = parsed_args.host data = client.agents(**filters) - return (column_headers, - (utils.get_item_properties( - s, columns, formatters=_formatters, - ) for s in data)) + return (column_headers, + (utils.get_item_properties( + s, columns, formatters=_formatters, + ) for s in data)) class RemoveNetworkFromAgent(command.Command): @@ -229,7 +269,7 @@ class RemoveNetworkFromAgent(command.Command): parser.add_argument( 'network', metavar='<network>', - help=_('Network to be removed from an agent (ID or name)')) + help=_('Network to be removed from an agent (name or ID)')) return parser def take_action(self, parsed_args): @@ -246,6 +286,37 @@ class RemoveNetworkFromAgent(command.Command): exceptions.CommandError(msg) +class RemoveRouterFromAgent(command.Command): + _description = _("Remove router from an agent") + + def get_parser(self, prog_name): + parser = super(RemoveRouterFromAgent, self).get_parser(prog_name) + parser.add_argument( + '--l3', + action='store_true', + help=_('Remove router from an L3 agent') + ) + parser.add_argument( + 'agent_id', + metavar='<agent-id>', + help=_("Agent from which router will be removed (ID only)") + ) + parser.add_argument( + 'router', + metavar='<router>', + help=_("Router to be removed from an agent (name or ID)") + ) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + agent = client.get_agent(parsed_args.agent_id) + router = client.find_router(parsed_args.router, ignore_missing=False) + if parsed_args.l3: + client.remove_router_from_agent(agent, router) + + # TODO(huanxuan): Use the SDK resource mapped attribute names once the # OSC minimum requirements include SDK 1.0. class SetNetworkAgent(command.Command): diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index 0da91baa..8db0c439 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -305,11 +305,18 @@ class ListRouter(command.Lister): help=_("List routers according to their project (name or ID)") ) identity_common.add_project_domain_option_to_parser(parser) + parser.add_argument( + '--agent', + metavar='<agent-id>', + help=_("List routers hosted by an agent (ID only)") + ) + return parser def take_action(self, parsed_args): identity_client = self.app.client_manager.identity client = self.app.client_manager.network + columns = ( 'id', 'name', @@ -349,6 +356,16 @@ class ListRouter(command.Lister): ).id args['tenant_id'] = project_id args['project_id'] = project_id + + if parsed_args.agent is not None: + agent = client.get_agent(parsed_args.agent) + data = client.agent_hosted_routers(agent) + # NOTE: Networking API does not support filtering by parameters, + # so we need filtering in the client side. + data = [d for d in data if self._filter_match(d, args)] + else: + data = client.routers(**args) + if parsed_args.long: columns = columns + ( 'routes', @@ -368,13 +385,26 @@ class ListRouter(command.Lister): 'Availability zones', ) - data = client.routers(**args) return (column_headers, (utils.get_item_properties( s, columns, formatters=_formatters, ) for s in data)) + @staticmethod + def _filter_match(data, conditions): + for key, value in conditions.items(): + try: + if getattr(data, key) != value: + return False + except AttributeError: + # Some filter attributes like tenant_id or admin_state_up + # are backward compatibility in older OpenStack SDK support. + # They does not exist in the latest release. + # In this case we just skip checking such filter condition. + continue + return True + class RemovePortFromRouter(command.Command): _description = _("Remove a port from a router") |
