From e6504717134d1bb94effc49f3c376e7c4e48ce0c Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Fri, 30 Jun 2023 11:09:14 +0200
Subject: [PATCH] fix some linting errors from ruff

---
 gso/main.py                             |  4 +--
 gso/products/__init__.py                |  5 +---
 gso/services/_ipam.py                   | 29 ++++++-------------
 gso/services/provisioning_proxy.py      | 18 ++++--------
 gso/services/resource_manager.py        | 11 +++++--
 gso/settings.py                         | 38 +++++++------------------
 gso/workflows/__init__.py               |  4 +--
 gso/workflows/device/create_device.py   |  3 +-
 gso/workflows/iptrunk/modify_generic.py | 10 +++----
 pyproject.toml                          |  1 +
 10 files changed, 43 insertions(+), 80 deletions(-)

diff --git a/gso/main.py b/gso/main.py
index ca9268a0..fae6a4f7 100644
--- a/gso/main.py
+++ b/gso/main.py
@@ -1,6 +1,4 @@
-"""
-The main module, from where GSO is run.
-"""
+"""The main module, from where GSO is run."""
 from orchestrator import OrchestratorCore
 from orchestrator.cli.main import app as core_cli
 from orchestrator.settings import AppSettings
diff --git a/gso/products/__init__.py b/gso/products/__init__.py
index b2b3e829..4bf68053 100644
--- a/gso/products/__init__.py
+++ b/gso/products/__init__.py
@@ -1,7 +1,4 @@
-"""
-Module that updates the domain model of GSO. Should contain all types of
-subscriptions.
-"""
+"""Module that updates the domain model of GSO. Should contain all types of subscriptions."""
 from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY
 
 from gso.products.product_types.device import Device
diff --git a/gso/services/_ipam.py b/gso/services/_ipam.py
index 8ef424ef..db04353f 100644
--- a/gso/services/_ipam.py
+++ b/gso/services/_ipam.py
@@ -109,13 +109,12 @@ def _assert_host_in_service(
 
 
 def _find_networks(network_container=None, network=None, ip_version=4):
-    """
-    If network_container is not None, find all networks within the specified
+    """If network_container is not None, find all networks within the specified
     container.
     Otherwise, if network is not None, find the specified network.
     Otherwise find all networks.
     A list of all found networks is returned (an HTTP 200 code
-    may be returned with an empty list.)
+    may be returned with an empty list.).
     """
     assert ip_version in [4, 6]
     oss = settings.load_oss_params()
@@ -196,9 +195,7 @@ def _allocate_network(
 
 
 def allocate_service_ipv4_network(service_type="", comment="", extattrs={}) -> V4ServiceNetwork:
-    """
-    Allocate IPv4 network within the container of the specified service type.
-    """
+    """Allocate IPv4 network within the container of the specified service type."""
     oss = settings.load_oss_params()
     assert oss.IPAM
     ipam_params = oss.IPAM
@@ -207,9 +204,7 @@ def allocate_service_ipv4_network(service_type="", comment="", extattrs={}) -> V
 
 
 def allocate_service_ipv6_network(service_type="", comment="", extattrs={}) -> V6ServiceNetwork:
-    """
-    Allocate IPv6 network within the container of the specified service type.
-    """
+    """Allocate IPv6 network within the container of the specified service type."""
     oss = settings.load_oss_params()
     assert oss.IPAM
     ipam_params = oss.IPAM
@@ -218,8 +213,7 @@ def allocate_service_ipv6_network(service_type="", comment="", extattrs={}) -> V
 
 
 def _find_next_available_ip(infoblox_params, network_ref=""):
-    """
-    Find the next available IP address from a network given its ref.
+    """Find the next available IP address from a network given its ref.
     Returns "NETWORK_FULL" if there's no space in the network.
     Otherwise returns the next available IP address in the network.
     """
@@ -242,8 +236,7 @@ def _find_next_available_ip(infoblox_params, network_ref=""):
 def _allocate_host(
     hostname="", addrs=None, networks=None, cname_aliases=[], dns_view="default", extattrs={}
 ) -> Union[HostAddresses, str]:
-    """
-    If networks is not None, allocate host in those networks.
+    """If networks is not None, allocate host in those networks.
     Otherwise if addrs is not None, allocate host with those addresses.
     hostname parameter must be full name including domain name.
     Return "IPV4_NETWORK_FULL" or "IPV6_NETWORK_FULL"
@@ -334,8 +327,7 @@ def allocate_service_host(
     cname_aliases=None,
     extattrs={},
 ) -> HostAddresses:
-    """
-    Allocate host record with both IPv4 and IPv6 address, and respective DNS
+    """Allocate host record with both IPv4 and IPv6 address, and respective DNS
     A and AAAA records.
     - If service_networks is provided, and it's in a valid container,
     that one is used.
@@ -465,9 +457,7 @@ def allocate_service_host(
 
 
 def delete_service_network(ipnetwork=None, service_type="") -> Union[V4ServiceNetwork, V6ServiceNetwork]:
-    """
-    Delete IPv4 or IPv6 network by CIDR.
-    """
+    """Delete IPv4 or IPv6 network by CIDR."""
     oss = settings.load_oss_params()
     assert oss.IPAM
     ipam_params = oss.IPAM
@@ -526,8 +516,7 @@ def delete_service_network(ipnetwork=None, service_type="") -> Union[V4ServiceNe
 def delete_service_host(
     hostname="", host_addresses: HostAddresses = None, cname_aliases=[], service_type=""
 ) -> Union[V4HostAddress, V6HostAddress]:
-    """
-    Delete host record and associated CNAME records.
+    """Delete host record and associated CNAME records.
     All arguments passed to this function must match together a host record in
     IPAM, and all CNAME records associated to it must also be passed exactly.
     """
diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py
index 0f61c54c..05de4700 100644
--- a/gso/services/provisioning_proxy.py
+++ b/gso/services/provisioning_proxy.py
@@ -1,5 +1,4 @@
-"""
-The Provisioning Proxy service, which interacts with LSO running externally.
+"""The Provisioning Proxy service, which interacts with LSO running externally.
 LSO is responsible for executing Ansible playbooks, that deploy subscriptions.
 """
 import json
@@ -25,8 +24,7 @@ logger = logging.getLogger(__name__)
 
 
 class CUDOperation(strEnum):
-    """
-    Enum for different C(R)UD operations that the provisioning proxy supports.
+    """Enum for different C(R)UD operations that the provisioning proxy supports.
     Read is not applicable, hence these become CUD and not CRUD operations.
     """
 
@@ -39,8 +37,7 @@ class CUDOperation(strEnum):
 
 
 def _send_request(endpoint: str, parameters: dict, process_id: UUIDstr, operation: CUDOperation):
-    """
-    Internal function for sending a request to LSO. The callback address is
+    """Internal function for sending a request to LSO. The callback address is
     derived using the process ID provided.
 
     :param str endpoint: The LSO-specific endpoint to call, depending on the
@@ -78,8 +75,7 @@ def _send_request(endpoint: str, parameters: dict, process_id: UUIDstr, operatio
 
 
 def provision_device(subscription: DeviceProvisioning, process_id: UUIDstr, dry_run: bool = True):
-    """
-    Function that provisions a new device using LSO.
+    """Function that provisions a new device using LSO.
 
     :param :class:`DeviceProvisioning` subscription: The subscription object
         that is to be provisioned.
@@ -95,8 +91,7 @@ def provision_device(subscription: DeviceProvisioning, process_id: UUIDstr, dry_
 def provision_ip_trunk(
     subscription: IptrunkProvisioning, process_id: UUIDstr, config_object: str, dry_run: bool = True
 ):
-    """
-    Function that provisions an IP trunk service using LSO.
+    """Function that provisions an IP trunk service using LSO.
 
     :param :class:`IptrunkProvisioning` subscription: The subscription object
         that is to be provisioned.
@@ -141,8 +136,7 @@ def provision_ip_trunk(
 
 
 def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bool = True):
-    """
-    Function that provisions an IP trunk service using LSO.
+    """Function that provisions an IP trunk service using LSO.
 
     :param :class:`IptrunkProvisioning` subscription: The subscription object
         that is to be provisioned.
diff --git a/gso/services/resource_manager.py b/gso/services/resource_manager.py
index f13d80c4..2641cfd7 100644
--- a/gso/services/resource_manager.py
+++ b/gso/services/resource_manager.py
@@ -4,12 +4,16 @@ from gso import settings
 
 
 def import_new_router(router_name, oss_params=settings.OSSParams):
-    r = requests.post(f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/initialize-router/{router_name}")
+    r = requests.post(
+        f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/initialize-router/{router_name}", timeout=10000
+    )
     r.raise_for_status()
 
 
 def next_lag(router_name, oss_params=settings.OSSParams):
-    r = requests.post(f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/next-lag/{router_name}")
+    r = requests.post(
+        f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/next-lag/{router_name}", timeout=10000
+    )
     r.raise_for_status()
     response = r.json()
     return response["name"]
@@ -18,7 +22,8 @@ def next_lag(router_name, oss_params=settings.OSSParams):
 def next_physical(router_name, lag_name, oss_params=settings.OSSParams):
     # TODO: speed needed (if first interface)
     r = requests.post(
-        f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/next-physical/{router_name}/{lag_name}"
+        f"{oss_params.RESOURCE_MANAGER_API_PREFIX}" f"/api/interfaces/next-physical/{router_name}/{lag_name}",
+        timeout=10000,
     )
     r.raise_for_status()
     response = r.json()
diff --git a/gso/settings.py b/gso/settings.py
index dc2b2e83..93c855f1 100644
--- a/gso/settings.py
+++ b/gso/settings.py
@@ -1,6 +1,4 @@
-"""
-GSO settings, ensuring that the required parameters are set correctly.
-"""
+"""GSO settings, ensuring that the required parameters are set correctly."""
 import ipaddress
 import json
 import os
@@ -10,9 +8,7 @@ from pydantic import BaseSettings
 
 
 class GeneralParams(BaseSettings):
-    """
-    General parameters for a GSO configuration file.
-    """
+    """General parameters for a GSO configuration file."""
 
     #: The hostname that GSO is publicly served at, used for building the
     #: callback URL that the provisioning proxy uses.
@@ -20,9 +16,7 @@ class GeneralParams(BaseSettings):
 
 
 class InfoBloxParams(BaseSettings):
-    """
-    Parameters related to InfoBlox.
-    """
+    """Parameters related to InfoBlox."""
 
     scheme: str
     wapi_version: str
@@ -32,9 +26,7 @@ class InfoBloxParams(BaseSettings):
 
 
 class V4NetworkParams(BaseSettings):
-    """
-    A set of parameters that describe an IPv4 network in InfoBlox.
-    """
+    """A set of parameters that describe an IPv4 network in InfoBlox."""
 
     containers: list[ipaddress.IPv4Network]
     networks: list[ipaddress.IPv4Network]
@@ -42,9 +34,7 @@ class V4NetworkParams(BaseSettings):
 
 
 class V6NetworkParams(BaseSettings):
-    """
-    A set of parameters that describe an IPv6 network in InfoBlox.
-    """
+    """A set of parameters that describe an IPv6 network in InfoBlox."""
 
     containers: list[ipaddress.IPv6Network]
     networks: list[ipaddress.IPv6Network]
@@ -52,8 +42,7 @@ class V6NetworkParams(BaseSettings):
 
 
 class ServiceNetworkParams(BaseSettings):
-    """
-    Parameters for InfoBlox that describe IPv4 and v6 networks, and the
+    """Parameters for InfoBlox that describe IPv4 and v6 networks, and the
     corresponding domain name that should be used as a suffix.
     """
 
@@ -64,9 +53,7 @@ class ServiceNetworkParams(BaseSettings):
 
 
 class IPAMParams(BaseSettings):
-    """
-    A set of parameters related to IPAM.
-    """
+    """A set of parameters related to IPAM."""
 
     INFOBLOX: InfoBloxParams
     LO: ServiceNetworkParams
@@ -77,9 +64,7 @@ class IPAMParams(BaseSettings):
 
 
 class ProvisioningProxyParams(BaseSettings):
-    """
-    Parameters for the provisioning proxy.
-    """
+    """Parameters for the provisioning proxy."""
 
     scheme: str
     api_base: str
@@ -88,9 +73,7 @@ class ProvisioningProxyParams(BaseSettings):
 
 
 class OSSParams(BaseSettings):
-    """
-    The set of parameters required for running GSO.
-    """
+    """The set of parameters required for running GSO."""
 
     GENERAL: GeneralParams
     IPAM: IPAMParams
@@ -99,8 +82,7 @@ class OSSParams(BaseSettings):
 
 
 def load_oss_params() -> OSSParams:
-    """
-    look for OSS_PARAMS_FILENAME in the environment and load the parameters
+    """Look for OSS_PARAMS_FILENAME in the environment and load the parameters
     from that file.
     """
     with open(os.environ["OSS_PARAMS_FILENAME"], encoding="utf-8") as file:
diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py
index aa7685d8..e7477bfa 100644
--- a/gso/workflows/__init__.py
+++ b/gso/workflows/__init__.py
@@ -1,6 +1,4 @@
-"""
-init class that imports all workflows into GSO.
-"""
+"""init class that imports all workflows into GSO."""
 from orchestrator.workflows import LazyWorkflowInstance
 
 LazyWorkflowInstance("gso.workflows.device.create_device", "create_device")
diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py
index 70381f6b..2b6efc40 100644
--- a/gso/workflows/device/create_device.py
+++ b/gso/workflows/device/create_device.py
@@ -72,8 +72,7 @@ def iso_from_ipv4(ipv4_address):
     padded_octets = [f"{x:>03}" for x in ipv4_address.split(".")]
     joined_octets = "".join(padded_octets)
     re_split = ".".join(re.findall("....", joined_octets))
-    result = ".".join(["49.51e5.0001", re_split, "00"])
-    return result
+    return ".".join(["49.51e5.0001", re_split, "00"])
 
 
 @step("Get information from IPAM")
diff --git a/gso/workflows/iptrunk/modify_generic.py b/gso/workflows/iptrunk/modify_generic.py
index 92b245ae..4c083463 100644
--- a/gso/workflows/iptrunk/modify_generic.py
+++ b/gso/workflows/iptrunk/modify_generic.py
@@ -1,7 +1,7 @@
 import ipaddress
 
 from orchestrator.forms import FormPage, ReadOnlyField
-from orchestrator.forms.validators import Choice, UniqueConstrainedList
+from orchestrator.forms.validators import UniqueConstrainedList
 from orchestrator.targets import Target
 from orchestrator.types import FormGenerator, State, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
@@ -108,7 +108,7 @@ def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) ->
 
     return {
         "subscription": subscription,
-        "label_text": ("Provision of the Trunk interface [DRY] " "Please refresh to get the results of the playbook"),
+        "label_text": "Provision of the Trunk interface [DRY]" "Please refresh to get the results of the playbook",
     }
 
 
@@ -118,7 +118,7 @@ def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) ->
 
     return {
         "subscription": subscription,
-        "label_text": ("Provision of the Trunk interface [REAL] " "Please refresh to get the results of the playbook"),
+        "label_text": "Provision of the Trunk interface [REAL]" "Please refresh to get the results of the playbook",
     }
 
 
@@ -128,7 +128,7 @@ def provision_ip_trunk_lldp_iface_dry(subscription: Iptrunk, process_id: UUIDstr
 
     return {
         "subscription": subscription,
-        "label_text": ("Provision of the LLDP interface [DRY]" "Please refresh to get the results of the playbook"),
+        "label_text": "Provision of the LLDP interface [DRY]" "Please refresh to get the results of the playbook",
     }
 
 
@@ -138,7 +138,7 @@ def provision_ip_trunk_lldp_iface_real(subscription: Iptrunk, process_id: UUIDst
 
     return {
         "subscription": subscription,
-        "label_text": ("Provision of the LLDP interface [REAL]" "Please refresh to get the results of the playbook"),
+        "label_text": "Provision of the LLDP interface [REAL]" "Please refresh to get the results of the playbook",
     }
 
 
diff --git a/pyproject.toml b/pyproject.toml
index bddd8287..d89d802f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -51,6 +51,7 @@ exclude = [
     "__pycache__",
     "htmlcov",
     "venv",
+    "gso/migrations"
 ]
 ignore = [
     "C417",
-- 
GitLab