diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py index 6500238983ddf0b5fb27d6461e36afcc70df64b3..fcc4a89a309a2795db4d5132035489758fe3e6fe 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 ce5ec5f18cd071cc750d059d1bab608ff4ff4f01..89c63768b240ff1a4c389714a5c4e7ee32ce927a 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 82b283b678371a7a9af4e5e3ca547b4536cfc690..70612d49216fa6f00fb47835bbbc1b772b818dc1 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 e0cfa3b092a6491c5d337f907da4c85afb42d92a..d6a59c12ccd14dea0dac8852a7748810359718b7 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 5a78adffa596c376414d464502fe45c1ff09aa1e..ec09962e33521d82bd5c05b6fa3bccd6dbb6e8bf 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8257a874c6c090c1d284966d2ff4f9064d04e831 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 8202bd3b1be54cede66c820020c54a20fb00636b..d7044351b1493b154961eaa67c421a98290cff10 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 ef90479e33d6ffe5d20f8b246aa4597cd57e8b48..98e05343dff0c701dd6e48f229d1e553e4149358 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 4140df8efaf6738fbf8e4375bef8b12befb1398a..cb9ecc675264835dd4f13dc0069be61f3472f742 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 78525caf38eb8569232d07631a10c3b524529fa0..7c4404356a656291c169cb665ac1a12e56ce0e38 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 943f74b37a8547d7026f5e3f157766b73aad73ea..bcc10d8c8d8905c55dbe6012385e9693ebfdc58e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ ignore = [ "D213", "N805", "PLR0913", + "PLR0904" ] line-length = 120 select = [