diff options
| author | Nurmatov Mamatisa <nurmatov.mamatisa@huawei.com> | 2021-08-23 14:41:47 +0300 |
|---|---|---|
| committer | Nurmatov Mamatisa <nurmatov.mamatisa@huawei.com> | 2022-01-28 17:24:04 +0300 |
| commit | 26144743d9207d876df40e030a2a4132e18a79a7 (patch) | |
| tree | 0bfd4f4e855c5635d3d95976de64512de8269c33 /openstackclient/network/v2/local_ip_association.py | |
| parent | f00dce9e2f078cd7d77d8aee52fd63e891bdacd2 (diff) | |
| download | python-openstackclient-26144743d9207d876df40e030a2a4132e18a79a7.tar.gz | |
Support Neutron Local IP CRUD
Add support for Neutron Local IP CRUD operations.
Partial-Bug: #1930200
Depends-On: https://review.opendev.org/c/openstack/neutron/+/804523
Depends-On: https://review.opendev.org/c/openstack/openstacksdk/+/804988
Change-Id: I1095100efb27b8559412469f0a9d07fc0a3db9d5
Diffstat (limited to 'openstackclient/network/v2/local_ip_association.py')
| -rw-r--r-- | openstackclient/network/v2/local_ip_association.py | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/openstackclient/network/v2/local_ip_association.py b/openstackclient/network/v2/local_ip_association.py new file mode 100644 index 00000000..aa0747c5 --- /dev/null +++ b/openstackclient/network/v2/local_ip_association.py @@ -0,0 +1,197 @@ +# Copyright 2021 Huawei, Inc. 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. +# + +"""Node Local IP 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', 'name', 'id'] + return utils.get_osc_show_columns_for_sdk_resource( + item, column_map, hidden_columns) + + +class CreateLocalIPAssociation(command.ShowOne): + _description = _("Create Local IP Association") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'local_ip', + metavar='<local-ip>', + help=_("Local IP that the port association belongs to " + "(IP address or ID)") + ) + parser.add_argument( + 'fixed_port', + metavar='<fixed_port>', + help=_("The ID or Name of Port to allocate Local IP Association") + ) + parser.add_argument( + '--fixed-ip', + metavar='<fixed_ip>', + help=_("Fixed IP for Local IP Association") + ) + + identity_common.add_project_domain_option_to_parser(parser) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + + attrs = {} + port = client.find_port(parsed_args.fixed_port, + ignore_missing=False) + attrs['fixed_port_id'] = port.id + if parsed_args.fixed_ip: + attrs['fixed_ip'] = parsed_args.fixed_ip + local_ip = client.find_local_ip( + parsed_args.local_ip, + ignore_missing=False, + ) + obj = client.create_local_ip_association(local_ip.id, **attrs) + display_columns, columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns, formatters={}) + + return (display_columns, data) + + +class DeleteLocalIPAssociation(command.Command): + _description = _("Delete Local IP association(s)") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'local_ip', + metavar="<local_ip>", + help=_("Local IP that the port association belongs to " + "(IP address or ID)") + ) + parser.add_argument( + 'fixed_port_id', + nargs="+", + metavar="<fixed_port_id>", + help=_("The fixed port ID of Local IP Association") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + local_ip = client.find_local_ip( + parsed_args.local_ip, + ignore_missing=False, + ) + result = 0 + + for fixed_port_id in parsed_args.fixed_port_id: + try: + client.delete_local_ip_association( + local_ip.id, + fixed_port_id, + ignore_missing=False, + ) + except Exception as e: + result += 1 + LOG.error(_("Failed to delete Local IP Association with " + "fixed port " + "name or ID '%(fixed_port_id)s': %(e)s"), + {'fixed port ID': fixed_port_id, 'e': e}) + + if result > 0: + total = len(parsed_args.fixed_port_id) + msg = (_("%(result)s of %(total)s Local IP Associations failed " + "to delete.") % {'result': result, 'total': total}) + raise exceptions.CommandError(msg) + + +class ListLocalIPAssociation(command.Lister): + _description = _("List Local IP Associations") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + + parser.add_argument( + 'local_ip', + metavar='<local_ip>', + help=_("Local IP that port associations belongs to") + ) + parser.add_argument( + '--fixed-port', + metavar='<fixed_port>', + help=_("Filter the list result by the ID or name of " + "the fixed port") + ) + parser.add_argument( + '--fixed-ip', + metavar='<fixed_ip>', + help=_("Filter the list result by fixed ip") + ) + parser.add_argument( + '--host', + metavar='<host>', + help=_("Filter the list result by given host") + ) + identity_common.add_project_domain_option_to_parser(parser) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + columns = ( + 'local_ip_id', + 'local_ip_address', + 'fixed_port_id', + 'fixed_ip', + 'host', + ) + column_headers = ( + 'Local IP ID', + 'Local IP Address', + 'Fixed port ID', + 'Fixed IP', + 'Host' + ) + attrs = {} + obj = client.find_local_ip( + parsed_args.local_ip, + ignore_missing=False, + ) + if parsed_args.fixed_port: + port = client.find_port(parsed_args.fixed_port, + ignore_missing=False) + attrs['fixed_port_id'] = port.id + if parsed_args.fixed_ip: + attrs['fixed_ip'] = parsed_args.fixed_ip + if parsed_args.host: + attrs['host'] = parsed_args.host + + data = client.local_ip_associations(obj, **attrs) + + return (column_headers, + (utils.get_item_properties(s, + columns, + formatters={}) for s in data)) |
