summaryrefslogtreecommitdiff
path: root/openstackclient/network
diff options
context:
space:
mode:
authorNurmatov Mamatisa <nurmatov.mamatisa@huawei.com>2021-08-23 14:41:47 +0300
committerNurmatov Mamatisa <nurmatov.mamatisa@huawei.com>2022-01-28 17:24:04 +0300
commit26144743d9207d876df40e030a2a4132e18a79a7 (patch)
tree0bfd4f4e855c5635d3d95976de64512de8269c33 /openstackclient/network
parentf00dce9e2f078cd7d77d8aee52fd63e891bdacd2 (diff)
downloadpython-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')
-rw-r--r--openstackclient/network/v2/local_ip.py310
-rw-r--r--openstackclient/network/v2/local_ip_association.py197
2 files changed, 507 insertions, 0 deletions
diff --git a/openstackclient/network/v2/local_ip.py b/openstackclient/network/v2/local_ip.py
new file mode 100644
index 00000000..109f64cf
--- /dev/null
+++ b/openstackclient/network/v2/local_ip.py
@@ -0,0 +1,310 @@
+# 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']
+ return utils.get_osc_show_columns_for_sdk_resource(
+ item, column_map, hidden_columns)
+
+
+def _get_attrs(client_manager, parsed_args):
+ attrs = {}
+ network_client = client_manager.network
+
+ if parsed_args.name:
+ attrs['name'] = parsed_args.name
+ if parsed_args.description:
+ attrs['description'] = parsed_args.description
+ if 'project' in parsed_args and parsed_args.project is not None:
+ identity_client = client_manager.identity
+ project_id = identity_common.find_project(
+ identity_client,
+ parsed_args.project,
+ parsed_args.project_domain,
+ ).id
+ attrs['project_id'] = project_id
+ if parsed_args.network:
+ network = network_client.find_network(parsed_args.network,
+ ignore_missing=False)
+ attrs['network_id'] = network.id
+ if parsed_args.local_ip_address:
+ attrs['local_ip_address'] = parsed_args.local_ip_address
+ if parsed_args.local_port:
+ port = network_client.find_port(parsed_args.local_port,
+ ignore_missing=False)
+ attrs['local_port_id'] = port.id
+ if parsed_args.ip_mode:
+ attrs['ip_mode'] = parsed_args.ip_mode
+ return attrs
+
+
+class CreateLocalIP(command.ShowOne):
+ _description = _("Create Local IP")
+
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+ parser.add_argument(
+ '--name',
+ metavar="<name>",
+ help=_("New local IP name")
+ )
+ parser.add_argument(
+ '--description',
+ metavar="<description>",
+ help=_("New local IP description")
+ )
+ parser.add_argument(
+ '--network',
+ metavar='<network>',
+ help=_("Network to allocate Local IP (name or ID)")
+ )
+ parser.add_argument(
+ '--local-port',
+ metavar='<local_port>',
+ help=_("Port to allocate Local IP (name or ID)")
+ )
+ parser.add_argument(
+ "--local-ip-address",
+ metavar="<local_ip_address>",
+ help=_("IP address or CIDR "),
+ )
+ parser.add_argument(
+ '--ip-mode',
+ metavar='<ip_mode>',
+ help=_("local IP ip mode")
+ )
+
+ identity_common.add_project_domain_option_to_parser(parser)
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ attrs = _get_attrs(self.app.client_manager, parsed_args)
+
+ obj = client.create_local_ip(**attrs)
+ display_columns, columns = _get_columns(obj)
+ data = utils.get_item_properties(obj, columns, formatters={})
+
+ return (display_columns, data)
+
+
+class DeleteLocalIP(command.Command):
+ _description = _("Delete local IP(s)")
+
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+ parser.add_argument(
+ 'local_ip',
+ metavar="<local-ip>",
+ nargs='+',
+ help=_("Local IP(s) to delete (name or ID)")
+ )
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ result = 0
+
+ for lip in parsed_args.local_ip:
+ try:
+ obj = client.find_local_ip(lip, ignore_missing=False)
+ client.delete_local_ip(obj)
+ except Exception as e:
+ result += 1
+ LOG.error(_("Failed to delete Local IP with "
+ "name or ID '%(lip)s': %(e)s"),
+ {'lip': lip, 'e': e})
+
+ if result > 0:
+ total = len(parsed_args.local_ip)
+ msg = (_("%(result)s of %(total)s local IPs failed "
+ "to delete.") % {'result': result, 'total': total})
+ raise exceptions.CommandError(msg)
+
+
+class SetLocalIP(command.Command):
+ _description = _("Set local ip properties")
+
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+ parser.add_argument(
+ 'local_ip',
+ metavar="<local-ip>",
+ help=_("Local IP to modify (name or ID)")
+ )
+ parser.add_argument(
+ '--name',
+ metavar="<name>",
+ help=_('Set local IP name')
+ )
+ parser.add_argument(
+ '--description',
+ metavar="<description>",
+ help=_('Set local IP description')
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ obj = client.find_local_ip(
+ parsed_args.local_ip,
+ ignore_missing=False)
+ attrs = {}
+ if parsed_args.name is not None:
+ attrs['name'] = parsed_args.name
+ if parsed_args.description is not None:
+ attrs['description'] = parsed_args.description
+ if attrs:
+ client.update_local_ip(obj, **attrs)
+
+
+class ListLocalIP(command.Lister):
+ _description = _("List local IPs")
+
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+
+ parser.add_argument(
+ '--name',
+ metavar='<name>',
+ help=_("List only local IPs of given name in output")
+ )
+ parser.add_argument(
+ '--project',
+ metavar="<project>",
+ help=_("List Local IPs according to their project "
+ "(name or ID)")
+ )
+ parser.add_argument(
+ '--network',
+ metavar='<network>',
+ help=_("List Local IP(s) according to "
+ "given network (name or ID)")
+ )
+ parser.add_argument(
+ '--local-port',
+ metavar='<local_port>',
+ help=_("List Local IP(s) according to "
+ "given port (name or ID)")
+ )
+ parser.add_argument(
+ '--local-ip-address',
+ metavar='<local_ip_address>',
+ help=_("List Local IP(s) according to "
+ "given Local IP Address")
+ )
+ parser.add_argument(
+ '--ip-mode',
+ metavar='<ip_mode>',
+ help=_("List Local IP(s) according to "
+ "given IP mode")
+ )
+
+ identity_common.add_project_domain_option_to_parser(parser)
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ columns = (
+ 'id',
+ 'name',
+ 'description',
+ 'project_id',
+ 'local_port_id',
+ 'network_id',
+ 'local_ip_address',
+ 'ip_mode',
+ )
+ column_headers = (
+ 'ID',
+ 'Name',
+ 'Description',
+ 'Project',
+ 'Local Port ID',
+ 'Network',
+ 'Local IP address',
+ 'IP mode',
+ )
+ attrs = {}
+ if parsed_args.name:
+ attrs['name'] = parsed_args.name
+ if 'project' in parsed_args and parsed_args.project is not None:
+ identity_client = self.app.client_manager.identity
+ project_id = identity_common.find_project(
+ identity_client,
+ parsed_args.project,
+ parsed_args.project_domain,
+ ).id
+ attrs['project_id'] = project_id
+ if parsed_args.network is not None:
+ network = client.find_network(parsed_args.network,
+ ignore_missing=False)
+ attrs['network_id'] = network.id
+ if parsed_args.local_port:
+ port = client.find_port(parsed_args.local_port,
+ ignore_missing=False)
+ attrs['local_port_id'] = port.id
+ if parsed_args.local_ip_address:
+ attrs['local_ip_address'] = parsed_args.local_ip_address
+ if parsed_args.ip_mode:
+ attrs['ip_mode'] = parsed_args.ip_mode
+ data = client.local_ips(**attrs)
+
+ return (column_headers,
+ (utils.get_item_properties(s,
+ columns,
+ formatters={},) for s in data))
+
+
+class ShowLocalIP(command.ShowOne):
+ _description = _("Display local IP details")
+
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+ parser.add_argument(
+ 'local_ip',
+ metavar="<local-ip>",
+ help=_("Local IP to display (name or ID)")
+ )
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ obj = client.find_local_ip(
+ parsed_args.local_ip,
+ ignore_missing=False)
+ display_columns, columns = _get_columns(obj)
+ data = utils.get_item_properties(obj, columns, formatters={})
+
+ return (display_columns, data)
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))