Stephen Finucane 209f8e9e17 network: Replace use of in-tree API client
None of these are actually supported by openstacksdk (intentionally so)
so we add our own manual implementations.

Change-Id: Ifd24f04ae4d1e56e0ce5ba0afe63828403bb7a6f
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
2024-07-09 18:19:36 +01:00

368 lines
11 KiB
Python

# 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.
"""Compute v2 API Library
A collection of wrappers for deprecated Compute v2 APIs that are not
intentionally supported by SDK. Most of these are proxy APIs.
"""
import http
from openstack import exceptions as sdk_exceptions
from osc_lib import exceptions
# security groups
def create_security_group(compute_client, name=None, description=None):
"""Create a new security group
https://docs.openstack.org/api-ref/compute/#create-security-group
:param compute_client: A compute client
:param str name: Security group name
:param str description: Security group description
:returns: A security group object
"""
data = {
'name': name,
'description': description,
}
response = compute_client.post(
'/os-security-groups', data=data, microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
return response.json()['security_group']
def list_security_groups(compute_client, all_projects=None):
"""Get all security groups
https://docs.openstack.org/api-ref/compute/#list-security-groups
:param compute_client: A compute client
:param bool all_projects: If true, list from all projects
:returns: A list of security group objects
"""
url = '/os-security-groups'
if all_projects is not None:
url += f'?all_tenants={all_projects}'
response = compute_client.get(url, microversion='2.1')
sdk_exceptions.raise_from_response(response)
return response.json()['security_groups']
def find_security_group(compute_client, name_or_id):
"""Find the name for a given security group name or ID
https://docs.openstack.org/api-ref/compute/#show-security-group-details
:param compute_client: A compute client
:param name_or_id: The name or ID of the security group to look up
:returns: A security group object
:raises exception.NotFound: If a matching security group could not be
found or more than one match was found
"""
response = compute_client.get(
f'/os-security-groups/{name_or_id}', microversion='2.1'
)
if response.status_code != http.HTTPStatus.NOT_FOUND:
# there might be other, non-404 errors
sdk_exceptions.raise_from_response(response)
return response.json()['security_group']
response = compute_client.get('/os-security-groups', microversion='2.1')
sdk_exceptions.raise_from_response(response)
found = None
security_groups = response.json()['security_groups']
for security_group in security_groups:
if security_group['name'] == name_or_id:
if found:
raise exceptions.NotFound(
f'multiple matches found for {name_or_id}'
)
found = security_group
if not found:
raise exceptions.NotFound(f'{name_or_id} not found')
return found
def update_security_group(
compute_client, security_group_id, name=None, description=None
):
"""Update an existing security group
https://docs.openstack.org/api-ref/compute/#update-security-group
:param compute_client: A compute client
:param str security_group_id: The ID of the security group to update
:param str name: Security group name
:param str description: Security group description
:returns: A security group object
"""
data = {}
if name:
data['name'] = name
if description:
data['description'] = description
response = compute_client.put(
f'/os-security-groups/{security_group_id}',
data=data,
microversion='2.1',
)
sdk_exceptions.raise_from_response(response)
return response.json()['security_group']
def delete_security_group(compute_client, security_group_id=None):
"""Delete a security group
https://docs.openstack.org/api-ref/compute/#delete-security-group
:param compute_client: A compute client
:param str security_group_id: Security group ID
:returns: None
"""
response = compute_client.delete(
f'/os-security-groups/{security_group_id}', microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
# security group rules
def create_security_group_rule(
compute_client,
security_group_id=None,
ip_protocol=None,
from_port=None,
to_port=None,
remote_ip=None,
remote_group=None,
):
"""Create a new security group rule
https://docs.openstack.org/api-ref/compute/#create-security-group-rule
:param compute_client: A compute client
:param str security_group_id: Security group ID
:param str ip_protocol: IP protocol, 'tcp', 'udp' or 'icmp'
:param int from_port: Source port
:param int to_port: Destination port
:param str remote_ip: Source IP address in CIDR notation
:param str remote_group: Remote security group
:returns: A security group object
"""
data = {
'parent_group_id': security_group_id,
'ip_protocol': ip_protocol,
'from_port': from_port,
'to_port': to_port,
'cidr': remote_ip,
'group_id': remote_group,
}
response = compute_client.post(
'/os-security-group-rules', data=data, microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
return response.json()['security_group_rule']
def delete_security_group_rule(compute_client, security_group_rule_id=None):
"""Delete a security group rule
https://docs.openstack.org/api-ref/compute/#delete-security-group-rule
:param compute_client: A compute client
:param str security_group_rule_id: Security group rule ID
:returns: None
"""
response = compute_client.delete(
f'/os-security-group-rules/{security_group_rule_id}',
microversion='2.1',
)
sdk_exceptions.raise_from_response(response)
# networks
def create_network(compute_client, name, subnet, share_subnet=None):
"""Create a new network
https://docs.openstack.org/api-ref/compute/#create-network
:param compute_client: A compute client
:param str name: Network label
:param int subnet: Subnet for IPv4 fixed addresses in CIDR notation
:param bool share_subnet: Shared subnet between projects
:returns: A network object
"""
data = {
'label': name,
'cidr': subnet,
}
if share_subnet is not None:
data['share_address'] = share_subnet
response = compute_client.post(
'/os-networks', data=data, microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
return response.json()['network']
def list_networks(compute_client):
"""Get all networks
https://docs.openstack.org/api-ref/compute/#list-networks
:param compute_client: A compute client
:returns: A list of network objects
"""
response = compute_client.get('/os-networks', microversion='2.1')
sdk_exceptions.raise_from_response(response)
return response.json()['networks']
def find_network(compute_client, name_or_id):
"""Find the ID for a given network name or ID
https://docs.openstack.org/api-ref/compute/#show-network-details
:param compute_client: A compute client
:param name_or_id: The name or ID of the network to look up
:returns: A network object
:raises exception.NotFound: If a matching network could not be found or
more than one match was found
"""
response = compute_client.get(
f'/os-networks/{name_or_id}', microversion='2.1'
)
if response.status_code != http.HTTPStatus.NOT_FOUND:
# there might be other, non-404 errors
sdk_exceptions.raise_from_response(response)
return response.json()['network']
response = compute_client.get('/os-networks', microversion='2.1')
sdk_exceptions.raise_from_response(response)
found = None
networks = response.json()['networks']
for network in networks:
if network['label'] == name_or_id:
if found:
raise exceptions.NotFound(
f'multiple matches found for {name_or_id}'
)
found = network
if not found:
raise exceptions.NotFound(f'{name_or_id} not found')
return found
def delete_network(compute_client, network_id):
"""Delete a network
https://docs.openstack.org/api-ref/compute/#delete-network
:param compute_client: A compute client
:param string network_id: The network ID
:returns: None
"""
response = compute_client.delete(
f'/os-networks/{network_id}', microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
# floating ips
def create_floating_ip(compute_client, network):
"""Create a new floating ip
https://docs.openstack.org/api-ref/compute/#create-allocate-floating-ip-address
:param network: Name of floating IP pool
:returns: A floating IP object
"""
response = compute_client.post(
'/os-floating-ips', data={'pool': network}, microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
return response.json()['floating_ip']
def list_floating_ips(compute_client):
"""Get all floating IPs
https://docs.openstack.org/api-ref/compute/#list-floating-ip-addresses
:returns: A list of floating IP objects
"""
response = compute_client.get('/os-floating-ips', microversion='2.1')
sdk_exceptions.raise_from_response(response)
return response.json()['floating_ips']
def get_floating_ip(compute_client, floating_ip_id):
"""Get a floating IP
https://docs.openstack.org/api-ref/compute/#show-floating-ip-address-details
:param string floating_ip_id: The floating IP address
:returns: A floating IP object
"""
response = compute_client.get(
f'/os-floating-ips/{floating_ip_id}', microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
return response.json()['floating_ip']
def delete_floating_ip(compute_client, floating_ip_id):
"""Delete a floating IP
https://docs.openstack.org/api-ref/compute/#delete-deallocate-floating-ip-address
:param string floating_ip_id: The floating IP address
:returns: None
"""
response = compute_client.delete(
f'/os-floating-ips/{floating_ip_id}', microversion='2.1'
)
sdk_exceptions.raise_from_response(response)
# floating ip pools
def list_floating_ip_pools(compute_client):
"""Get all floating IP pools
https://docs.openstack.org/api-ref/compute/#list-floating-ip-pools
:param compute_client: A compute client
:returns: A list of floating IP pool objects
"""
response = compute_client.get('/os-floating-ip-pools', microversion='2.1')
sdk_exceptions.raise_from_response(response)
return response.json()['floating_ip_pools']