diff options
author | Yang JianFeng <yjf1970231893@gmail.com> | 2020-08-31 11:39:48 +0000 |
---|---|---|
committer | yangjianfeng <yjf1970231893@gmail.com> | 2022-08-26 08:15:43 +0800 |
commit | b36cd0f4c0416182ce69d71a4e99d89507d53e7f (patch) | |
tree | 52faf7f0694c9896e35b170e9383148bc986a11f /openstackclient/network | |
parent | 27b2496e03ceb95b56b3b1b68a57058fe90251b5 (diff) | |
download | python-openstackclient-b36cd0f4c0416182ce69d71a4e99d89507d53e7f.tar.gz |
Add router ndp proxy commands
Depends-on: https://review.opendev.org/749036
Change-Id: I77e12cc2dfe4000bd5ae6511878c6591f52d9791
Related-Bug: #1877301
Diffstat (limited to 'openstackclient/network')
-rw-r--r-- | openstackclient/network/v2/ndp_proxy.py | 269 | ||||
-rw-r--r-- | openstackclient/network/v2/router.py | 41 |
2 files changed, 310 insertions, 0 deletions
diff --git a/openstackclient/network/v2/ndp_proxy.py b/openstackclient/network/v2/ndp_proxy.py new file mode 100644 index 00000000..25b287f3 --- /dev/null +++ b/openstackclient/network/v2/ndp_proxy.py @@ -0,0 +1,269 @@ +# Copyright (c) 2020 Troila. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Router NDP proxy action implementations""" +import logging + +from osc_lib.command import command +from osc_lib import exceptions +from osc_lib import utils + +from openstackclient.i18n import _ +from openstackclient.identity import common as identity_common + + +LOG = logging.getLogger(__name__) + + +def _get_columns(item): + column_map = {} + hidden_columns = ['location'] + return utils.get_osc_show_columns_for_sdk_resource( + item, column_map, hidden_columns) + + +class CreateNDPProxy(command.ShowOne): + _description = _("Create NDP proxy") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'router', + metavar='<router>', + help=_("The name or ID of a router")) + parser.add_argument( + '--name', + metavar='<name>', + help=_("New NDP proxy name") + ) + parser.add_argument( + '--port', + metavar='<port>', + required=True, + help=_("The name or ID of the network port associated " + "to the NDP proxy")) + parser.add_argument( + '--ip-address', + metavar='<ip-address>', + help=_("The IPv6 address that is to be proxied. In case the port " + "has multiple addresses assigned, use this option to " + "select which address is to be used.")) + parser.add_argument( + '--description', + metavar='<description>', + help=_("A text to describe/contextualize the use of the " + "NDP proxy configuration") + ) + + return parser + + def take_action(self, parsed_args): + attrs = {'name': parsed_args.name} + client = self.app.client_manager.network + router = client.find_router( + parsed_args.router, + ignore_missing=False, + ) + attrs['router_id'] = router.id + + if parsed_args.ip_address: + attrs['ip_address'] = parsed_args.ip_address + + port = client.find_port(parsed_args.port, + ignore_missing=False) + attrs['port_id'] = port.id + + if parsed_args.description is not None: + attrs['description'] = parsed_args.description + + obj = client.create_ndp_proxy(**attrs) + display_columns, columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns) + return (display_columns, data) + + +class DeleteNDPProxy(command.Command): + _description = _("Delete NDP proxy") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'ndp_proxy', + nargs="+", + metavar="<ndp-proxy>", + help=_("NDP proxy(s) to delete (name or ID)") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + result = 0 + + for ndp_proxy in parsed_args.ndp_proxy: + try: + obj = client.find_ndp_proxy(ndp_proxy, ignore_missing=False) + client.delete_ndp_proxy(obj) + except Exception as e: + result += 1 + LOG.error(_("Failed to delete NDP proxy " + "'%(ndp_proxy)s': %(e)s"), + {'ndp_proxy': ndp_proxy, 'e': e}) + if result > 0: + total = len(parsed_args.ndp_proxy) + msg = (_("%(result)s of %(total)s NDP Proxy failed " + "to delete.") % {'result': result, 'total': total}) + raise exceptions.CommandError(msg) + + +class ListNDPProxy(command.Lister): + _description = _("List NDP proxies") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + '--router', + metavar='<router>', + help=_("List only NDP proxies belong to this router (name or ID)") + ) + parser.add_argument( + '--port', + metavar='<port>', + help=_("List only NDP proxies assocate to this port (name or ID)") + ) + parser.add_argument( + '--ip-address', + metavar='ip-address', + help=_("List only NDP proxies according to their IPv6 address") + ) + parser.add_argument( + '--project', + metavar='<project>', + help=_("List NDP proxies according to their project (name or ID)") + ) + parser.add_argument( + '--name', + metavar='<name>', + help=_("List NDP proxies according to their name") + ) + + identity_common.add_project_domain_option_to_parser(parser) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + identity_client = self.app.client_manager.identity + + columns = ( + 'id', + 'name', + 'router_id', + 'ip_address', + 'project_id', + ) + headers = ( + 'ID', + 'Name', + 'Router ID', + 'IP Address', + 'Project', + ) + + query = {} + + if parsed_args.router: + router = client.find_router(parsed_args.router, + ignore_missing=False) + query['router_id'] = router.id + if parsed_args.port: + port = client.find_port(parsed_args.port, + ignore_missing=False) + query['port_id'] = port.id + if parsed_args.ip_address is not None: + query['ip_address'] = parsed_args.ip_address + if parsed_args.project: + project_id = identity_common.find_project( + identity_client, + parsed_args.project, + parsed_args.project_domain, + ).id + query['project_id'] = project_id + if parsed_args.name: + query['name'] = parsed_args.name + + data = client.ndp_proxies(**query) + + return (headers, + (utils.get_item_properties( + s, columns, + formatters={}, + ) for s in data)) + + +class SetNDPProxy(command.Command): + _description = _("Set NDP proxy properties") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'ndp_proxy', + metavar='<ndp-proxy>', + help=_("The ID or name of the NDP proxy to update") + ) + parser.add_argument( + '--name', + metavar='<name>', + help=_("Set NDP proxy name") + ) + parser.add_argument( + '--description', + metavar='<description>', + help=_("A text to describe/contextualize the use of " + "the NDP proxy configuration") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + attrs = {} + if parsed_args.description is not None: + attrs['description'] = parsed_args.description + if parsed_args.name is not None: + attrs['name'] = parsed_args.name + + obj = client.find_ndp_proxy( + parsed_args.ndp_proxy, ignore_missing=False) + client.update_ndp_proxy(obj, **attrs) + + +class ShowNDPProxy(command.ShowOne): + _description = _("Display NDP proxy details") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'ndp_proxy', + metavar="<ndp-proxy>", + help=_("The ID or name of the NDP proxy") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + obj = client.find_ndp_proxy(parsed_args.ndp_proxy, + ignore_missing=False) + display_columns, columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns) + return (display_columns, data) diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index f1fce298..8302ee01 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -369,6 +369,21 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs): action='store_true', help=_("Disable Source NAT on external gateway") ) + ndp_proxy_group = parser.add_mutually_exclusive_group() + ndp_proxy_group.add_argument( + '--enable-ndp-proxy', + dest='enable_ndp_proxy', + default=None, + action='store_true', + help=_("Enable IPv6 NDP proxy on external gateway") + ) + ndp_proxy_group.add_argument( + '--disable-ndp-proxy', + dest='enable_ndp_proxy', + default=None, + action='store_false', + help=_("Disable IPv6 NDP proxy on external gateway") + ) return parser @@ -383,6 +398,14 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs): attrs.update( self._parse_extra_properties(parsed_args.extra_properties)) + if parsed_args.enable_ndp_proxy and not parsed_args.external_gateway: + msg = (_("You must specify '--external-gateway' in order " + "to enable router's NDP proxy")) + raise exceptions.CommandError(msg) + + if parsed_args.enable_ndp_proxy is not None: + attrs['enable_ndp_proxy'] = parsed_args.enable_ndp_proxy + obj = client.create_router(**attrs) # tags cannot be set when created, so tags need to be set later. _tag.update_tags_for_set(client, obj, parsed_args) @@ -737,6 +760,21 @@ class SetRouter(common.NeutronCommandWithExtraArgs): action='store_true', help=_("Disable Source NAT on external gateway") ) + ndp_proxy_group = parser.add_mutually_exclusive_group() + ndp_proxy_group.add_argument( + '--enable-ndp-proxy', + dest='enable_ndp_proxy', + default=None, + action='store_true', + help=_("Enable IPv6 NDP proxy on external gateway") + ) + ndp_proxy_group.add_argument( + '--disable-ndp-proxy', + dest='enable_ndp_proxy', + default=None, + action='store_false', + help=_("Disable IPv6 NDP proxy on external gateway") + ) qos_policy_group = parser.add_mutually_exclusive_group() qos_policy_group.add_argument( '--qos-policy', @@ -804,6 +842,9 @@ class SetRouter(common.NeutronCommandWithExtraArgs): attrs.update( self._parse_extra_properties(parsed_args.extra_properties)) + if parsed_args.enable_ndp_proxy is not None: + attrs['enable_ndp_proxy'] = parsed_args.enable_ndp_proxy + if attrs: client.update_router(obj, **attrs) # tags is a subresource and it needs to be updated separately. |