From c50633647bd8277ae8f99d7ab0e302b1980551d2 Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Mon, 13 Nov 2023 15:17:08 +0000
Subject: [PATCH] resolve linting errors in product types and blocks, and
 schedules

---
 gso/api/v1/imports.py                   | 6 +++---
 gso/products/product_blocks/site.py     | 2 ++
 gso/products/product_types/iptrunk.py   | 8 ++++++++
 gso/products/product_types/router.py    | 8 ++++++++
 gso/products/product_types/site.py      | 8 ++++++++
 gso/schedules/__init__.py               | 1 +
 gso/schedules/scheduling.py             | 2 ++
 gso/schedules/task_vacuum.py            | 3 +++
 gso/schedules/validate_products.py      | 3 +++
 gso/schedules/validate_subscriptions.py | 3 +++
 pyproject.toml                          | 1 +
 11 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py
index 65002389..fcc4a89a 100644
--- a/gso/api/v1/imports.py
+++ b/gso/api/v1/imports.py
@@ -50,14 +50,14 @@ class SiteImportModel(BaseModel):
 
     @validator("site_ts_address", allow_reuse=True)
     def validate_ts_address(cls, site_ts_address: str) -> str:
-        """A terminal server address must be valid."""
+        """Validate the terminal server address."""
         validate_site_fields_is_unique("site_ts_address", site_ts_address)
         validate_ipv4_or_ipv6(site_ts_address)
         return site_ts_address
 
     @validator("site_country_code", allow_reuse=True)
     def country_code_must_exist(cls, country_code: str) -> str:
-        """A country code must exist."""
+        """Validate the country code such that it exists."""
         validate_country_code(country_code)
         return country_code
 
@@ -126,7 +126,7 @@ class IptrunkImportModel(BaseModel):
 
     @validator("customer")
     def check_if_customer_exists(cls, value: str) -> str:
-        """The customer must exist."""
+        """Validate that the customer exists."""
         try:
             get_customer_by_name(value)
         except CustomerNotFoundError as e:
diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py
index ce5ec5f1..89c63768 100644
--- a/gso/products/product_blocks/site.py
+++ b/gso/products/product_blocks/site.py
@@ -31,6 +31,7 @@ class LatitudeCoordinate(ConstrainedStr):
 
     @classmethod
     def validate(cls, value: str) -> str:
+        """Validate that a latitude coordinate is valid."""
         if not cls.regex.match(value):
             msg = "Invalid latitude coordinate. Valid examples: '40.7128', '-74.0060', '90', '-90', '0'."
             raise ValueError(msg)
@@ -50,6 +51,7 @@ class LongitudeCoordinate(ConstrainedStr):
 
     @classmethod
     def validate(cls, value: str) -> str:
+        """Validate that a longitude coordinate is valid."""
         if not cls.regex.match(value):
             msg = "Invalid longitude coordinate. Valid examples: '40.7128', '-74.0060', '180', '-180'"
             raise ValueError(msg)
diff --git a/gso/products/product_types/iptrunk.py b/gso/products/product_types/iptrunk.py
index 82b283b6..70612d49 100644
--- a/gso/products/product_types/iptrunk.py
+++ b/gso/products/product_types/iptrunk.py
@@ -1,3 +1,5 @@
+"""The product type for IP trunks, does not contain any special variables apart from the corresponding product block."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.iptrunk import (
 
 
 class IptrunkInactive(SubscriptionModel, is_base=True):
+    """An IP trunk that is inactive."""
+
     iptrunk: IptrunkBlockInactive
 
 
 class IptrunkProvisioning(IptrunkInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An IP trunk that is being provisioned."""
+
     iptrunk: IptrunkBlockProvisioning
 
 
 class Iptrunk(IptrunkProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An IP trunk that is active."""
+
     iptrunk: IptrunkBlock
diff --git a/gso/products/product_types/router.py b/gso/products/product_types/router.py
index e0cfa3b0..d6a59c12 100644
--- a/gso/products/product_types/router.py
+++ b/gso/products/product_types/router.py
@@ -1,3 +1,5 @@
+"""A router product type."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.router import (
 
 
 class RouterInactive(SubscriptionModel, is_base=True):
+    """An inactive router."""
+
     router: RouterBlockInactive
 
 
 class RouterProvisioning(RouterInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A router that is being provisioned."""
+
     router: RouterBlockProvisioning
 
 
 class Router(RouterProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A router that is currently active."""
+
     router: RouterBlock
diff --git a/gso/products/product_types/site.py b/gso/products/product_types/site.py
index 5a78adff..ec09962e 100644
--- a/gso/products/product_types/site.py
+++ b/gso/products/product_types/site.py
@@ -1,3 +1,5 @@
+"""The product type for sites. Used for tying together shared information between the products that reside here."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.site import (
 
 
 class SiteInactive(SubscriptionModel, is_base=True):
+    """A site that is inactive."""
+
     site: SiteBlockInactive
 
 
 class SiteProvisioning(SiteInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A site that is being provisioned."""
+
     site: SiteBlockProvisioning
 
 
 class Site(SiteProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A site that is currently active."""
+
     site: SiteBlock
diff --git a/gso/schedules/__init__.py b/gso/schedules/__init__.py
index e69de29b..8257a874 100644
--- a/gso/schedules/__init__.py
+++ b/gso/schedules/__init__.py
@@ -0,0 +1 @@
+"""Tasks that are scheduled to run periodically in :term:`GSO`."""
diff --git a/gso/schedules/scheduling.py b/gso/schedules/scheduling.py
index 8202bd3b..d7044351 100644
--- a/gso/schedules/scheduling.py
+++ b/gso/schedules/scheduling.py
@@ -1,3 +1,5 @@
+"""Definition of the decorator that allows for scheduling tasks in :term:`GSO` that are to run periodically."""
+
 import inspect
 from collections.abc import Callable
 from functools import wraps
diff --git a/gso/schedules/task_vacuum.py b/gso/schedules/task_vacuum.py
index ef90479e..98e05343 100644
--- a/gso/schedules/task_vacuum.py
+++ b/gso/schedules/task_vacuum.py
@@ -1,3 +1,5 @@
+"""Metatask that runs all cleanup tasks."""
+
 from orchestrator.services.processes import start_process
 
 from gso.schedules.scheduling import scheduler
@@ -7,4 +9,5 @@ from gso.worker import celery
 @celery.task
 @scheduler(name="Clean up tasks", hour="*/6")
 def vacuum_tasks() -> None:
+    """Run all cleanup tasks every 6 hours."""
     start_process("task_clean_up_tasks")
diff --git a/gso/schedules/validate_products.py b/gso/schedules/validate_products.py
index 4140df8e..cb9ecc67 100644
--- a/gso/schedules/validate_products.py
+++ b/gso/schedules/validate_products.py
@@ -1,3 +1,5 @@
+"""Scheduled task that validates all products and inactive subscriptions in :term:`GSO`."""
+
 from orchestrator.services.processes import start_process
 
 from gso.schedules.scheduling import scheduler
@@ -8,5 +10,6 @@ from gso.worker import celery
 @celery.task
 @scheduler(name="Validate Products and inactive subscriptions", minute="30", hour="2")
 def validate_products() -> None:
+    """Validate all products."""
     if count_incomplete_validate_products() > 0:
         start_process("task_validate_products")
diff --git a/gso/schedules/validate_subscriptions.py b/gso/schedules/validate_subscriptions.py
index 78525caf..7c440435 100644
--- a/gso/schedules/validate_subscriptions.py
+++ b/gso/schedules/validate_subscriptions.py
@@ -1,3 +1,5 @@
+"""Scheduled task that runs a validation workflow for all active subscriptions."""
+
 import structlog
 from orchestrator.services.processes import get_execution_context
 from orchestrator.services.subscriptions import TARGET_DEFAULT_USABLE_MAP, WF_USABLE_MAP
@@ -13,6 +15,7 @@ logger = structlog.get_logger(__name__)
 @celery.task
 @scheduler(name="Subscriptions Validator", minute="10", hour="0")
 def validate_subscriptions() -> None:
+    """Validate all subscriptions using their corresponding validation workflow."""
     subscriptions = get_insync_subscriptions()
     if not subscriptions:
         logger.info("No subscriptions to validate")
diff --git a/pyproject.toml b/pyproject.toml
index 943f74b3..bcc10d8c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -42,6 +42,7 @@ ignore = [
     "D213",
     "N805",
     "PLR0913",
+    "PLR0904"
 ]
 line-length = 120
 select = [
-- 
GitLab