Skip to content
Snippets Groups Projects
Verified Commit 4bdcafb2 authored by Karel van Klink's avatar Karel van Klink :smiley_cat:
Browse files

auto-fix a lot of styling errors, and ignore documentation warnings in test files

parent 2767d54e
No related branches found
No related tags found
1 merge request!111Feature/ruff everything party hat emoji
Showing
with 1606 additions and 564 deletions
# -- Project information -----------------------------------------------------
project = 'GÉANT Service Orchestrator'
copyright = '2023, GÉANT Vereniging'
author = 'GÉANT Orchestration and Automation Team'
project = "GÉANT Service Orchestrator"
copyright = "2023, GÉANT Vereniging"
author = "GÉANT Orchestration and Automation Team"
# -- General configuration ---------------------------------------------------
extensions = ['sphinx_rtd_theme', 'sphinx.ext.autodoc', 'sphinxcontrib.jquery']
extensions = ["sphinx_rtd_theme", "sphinx.ext.autodoc", "sphinxcontrib.jquery"]
templates_path = ['templates']
exclude_patterns = ['build', 'Thumbs.db', '.DS_Store', 'venv', 'vale', '__init__.py']
templates_path = ["templates"]
exclude_patterns = ["build", "Thumbs.db", ".DS_Store", "venv", "vale", "__init__.py"]
# -- Options for HTML output -------------------------------------------------
html_theme = 'sphinx_rtd_theme'
html_static_path = ['static']
html_theme = "sphinx_rtd_theme"
html_static_path = ["static"]
html_theme_options = {
'style_nav_header_background': 'rgb(0 63 95)',
"style_nav_header_background": "rgb(0 63 95)",
}
html_css_files = ['custom.css']
html_js_files = ['custom.js']
html_logo = 'static/geant_logo_white.svg'
html_css_files = ["custom.css"]
html_js_files = ["custom.js"]
html_logo = "static/geant_logo_white.svg"
# Both the class' and the ``__init__`` method's docstring are concatenated and inserted.
autoclass_content = 'both'
autodoc_typehints = 'none'
autoclass_content = "both"
autodoc_typehints = "none"
# Display todos by setting to True
todo_include_todos = True
......@@ -2,7 +2,7 @@ import typer
from orchestrator import OrchestratorCore, app_settings
from orchestrator.cli.main import app as cli_app
import gso.products # noqa: F401
import gso.products
import gso.workflows # noqa: F401
from gso.api import router as api_router
from gso.cli import netbox
......
......@@ -116,22 +116,25 @@ class IptrunkImportModel(BaseModel):
def check_if_customer_exists(cls, value: str) -> str:
try:
get_customer_by_name(value)
except CustomerNotFoundError:
raise ValueError(f"Customer {value} not found")
except CustomerNotFoundError as e:
msg = f"Customer {value} not found"
raise ValueError(msg) from e
return value
@validator("side_a_node_id", "side_b_node_id")
def check_if_router_side_is_available(cls, value: str) -> str:
if value not in cls._get_active_routers():
raise ValueError(f"Router {value} not found")
msg = f"Router {value} not found"
raise ValueError(msg)
return value
@validator("side_a_ae_members", "side_b_ae_members")
def check_side_uniqueness(cls, value: list[str]) -> list[str]:
if len(value) != len(set(value)):
raise ValueError("Items must be unique")
msg = "Items must be unique"
raise ValueError(msg)
return value
......@@ -145,20 +148,24 @@ class IptrunkImportModel(BaseModel):
len_b = len(side_b_members)
if len_a < min_links:
raise ValueError(f"Side A members should be at least {min_links} (iptrunk_minimum_links)")
msg = f"Side A members should be at least {min_links} (iptrunk_minimum_links)"
raise ValueError(msg)
if len_a != len_b:
raise ValueError("Mismatch between Side A and B members")
msg = "Mismatch between Side A and B members"
raise ValueError(msg)
return values
def _start_process(process_name: str, data: dict) -> UUID:
"""Start a process and handle common exceptions."""
pid: UUID = processes.start_process(process_name, [data])
if pid is None:
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to start the process.")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to start the process.",
)
process = processes._get_process(pid)
if process.last_status == "failed":
......@@ -198,7 +205,6 @@ def import_router(router_data: RouterImportModel) -> dict[str, Any]:
:raises HTTPException: If there's an error in the process.
"""
pid = _start_process("import_router", router_data.dict())
return {"detail": "Router added successfully", "pid": pid}
......@@ -215,6 +221,5 @@ def import_iptrunk(iptrunk_data: IptrunkImportModel) -> dict[str, Any]:
:raises HTTPException: If there's an error in the process.
"""
pid = _start_process("import_iptrunk", iptrunk_data.dict())
return {"detail": "Iptrunk added successfully", "pid": pid}
......@@ -9,10 +9,18 @@ from orchestrator.services.subscriptions import build_extended_domain_model
from gso.services.subscriptions import get_active_router_subscriptions
router = APIRouter(prefix="/subscriptions", tags=["Subscriptions"], dependencies=[Depends(opa_security_default)])
router = APIRouter(
prefix="/subscriptions",
tags=["Subscriptions"],
dependencies=[Depends(opa_security_default)],
)
@router.get("/routers", status_code=status.HTTP_200_OK, response_model=list[SubscriptionDomainModelSchema])
@router.get(
"/routers",
status_code=status.HTTP_200_OK,
response_model=list[SubscriptionDomainModelSchema],
)
def subscription_routers() -> list[dict[str, Any]]:
"""Retrieve all active routers subscriptions."""
subscriptions = []
......
......@@ -32,7 +32,10 @@ def run_migrations_offline() -> None:
"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
......
......@@ -9,8 +9,8 @@ import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '3657611f0dfc'
down_revision = '91047dd30b40'
revision = "3657611f0dfc"
down_revision = "91047dd30b40"
branch_labels = None
depends_on = None
......@@ -22,14 +22,14 @@ new_workflows = [
"name": "create_router",
"target": "CREATE",
"description": "Create router",
"product_type": "Router"
"product_type": "Router",
},
{
"name": "terminate_router",
"target": "TERMINATE",
"description": "Terminate router",
"product_type": "Router"
}
"product_type": "Router",
},
]
......
......@@ -9,8 +9,8 @@ import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '91047dd30b40'
down_revision = '97436160a422'
revision = "91047dd30b40"
down_revision = "97436160a422"
branch_labels = None
depends_on = None
......@@ -22,7 +22,7 @@ new_workflows = [
"name": "create_site",
"target": "CREATE",
"description": "Create Site",
"product_type": "Site"
"product_type": "Site",
}
]
......
......@@ -9,8 +9,8 @@ import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = 'a6eefd32c4f7'
down_revision = '3657611f0dfc'
revision = "a6eefd32c4f7"
down_revision = "3657611f0dfc"
branch_labels = None
depends_on = None
......@@ -22,26 +22,26 @@ new_workflows = [
"name": "create_iptrunk",
"target": "CREATE",
"description": "Create IP trunk",
"product_type": "Iptrunk"
"product_type": "Iptrunk",
},
{
"name": "terminate_iptrunk",
"target": "TERMINATE",
"description": "Terminate IPtrunk",
"product_type": "Iptrunk"
"product_type": "Iptrunk",
},
{
"name": "modify_trunk_interface",
"target": "MODIFY",
"description": "Modify IP Trunk interface",
"product_type": "Iptrunk"
"product_type": "Iptrunk",
},
{
"name": "modify_isis_metric",
"target": "MODIFY",
"description": "Modify IP trunk",
"product_type": "Iptrunk"
}
"product_type": "Iptrunk",
},
]
......
......@@ -9,8 +9,8 @@ import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = 'e68720f2ec32'
down_revision = 'a6eefd32c4f7'
revision = "e68720f2ec32"
down_revision = "a6eefd32c4f7"
branch_labels = None
depends_on = None
......@@ -22,7 +22,7 @@ new_workflows = [
"name": "migrate_iptrunk",
"target": "MODIFY",
"description": "Migrate an IP Trunk",
"product_type": "Iptrunk"
"product_type": "Iptrunk",
}
]
......
......@@ -9,78 +9,162 @@ import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '394dc60d5c02'
down_revision = '01e42c100448'
revision = "394dc60d5c02"
down_revision = "01e42c100448"
branch_labels = None
depends_on = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(sa.text("""
conn.execute(
sa.text(
"""
DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members_description'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members_description'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values WHERE subscription_instance_values.resource_type_id IN (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members_description', 'iptrunk_side_ae_members'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_side_ae_members_description', 'iptrunk_side_ae_members')
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO product_blocks (name, description, tag, status) VALUES ('IptrunkInterfaceBlock', 'Interface in a LAG as part of an IP trunk', 'IPTINT', 'active') RETURNING product_blocks.product_block_id
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO resource_types (resource_type, description) VALUES ('interface_description', 'Description of a LAG interface') RETURNING resource_types.resource_type_id
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO resource_types (resource_type, description) VALUES ('interface_name', 'Interface name of a LAG member') RETURNING resource_types.resource_type_id
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO product_block_relations (in_use_by_id, depends_on_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description')))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_name')))
"""))
"""
)
)
def downgrade() -> None:
conn = op.get_bind()
conn.execute(sa.text("""
conn.execute(
sa.text(
"""
DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_name'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_name'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instance_values WHERE subscription_instance_values.resource_type_id IN (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description', 'interface_name'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM resource_types WHERE resource_types.resource_type IN ('interface_description', 'interface_name')
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM subscription_instances WHERE subscription_instances.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock'))
"""))
conn.execute(sa.text("""
"""
)
)
conn.execute(
sa.text(
"""
DELETE FROM product_blocks WHERE product_blocks.name IN ('IptrunkInterfaceBlock')
"""))
"""
)
)
......@@ -16,8 +16,18 @@ branch_labels = None
depends_on = None
new_workflows = [
{"name": "modify_site", "target": "MODIFY", "description": "Modify site", "product_type": "Site"},
{"name": "terminate_site", "target": "TERMINATE", "description": "Terminate site", "product_type": "Site"},
{
"name": "modify_site",
"target": "MODIFY",
"description": "Modify site",
"product_type": "Site",
},
{
"name": "terminate_site",
"target": "TERMINATE",
"description": "Terminate site",
"product_type": "Site",
},
]
......
......@@ -23,5 +23,5 @@ SUBSCRIPTION_MODEL_REGISTRY.update(
"Site": Site,
"Router": Router,
"IP trunk": Iptrunk,
}
},
)
......@@ -7,7 +7,11 @@ from orchestrator.domain.base import ProductBlockModel
from orchestrator.forms.validators import UniqueConstrainedList
from orchestrator.types import SubscriptionLifecycle, strEnum
from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning
from gso.products.product_blocks.router import (
RouterBlock,
RouterBlockInactive,
RouterBlockProvisioning,
)
class PhyPortCapacity(strEnum):
......@@ -35,7 +39,9 @@ class LAGMemberList(UniqueConstrainedList[T]): # type: ignore[type-var]
class IptrunkInterfaceBlockInactive(
ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="IptrunkInterfaceBlock"
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="IptrunkInterfaceBlock",
):
# TODO: add validation for interface names, making the type a constrained string
interface_name: str | None = None
......@@ -58,7 +64,9 @@ class IptrunkSides(UniqueConstrainedList[T]): # type: ignore[type-var]
class IptrunkSideBlockInactive(
ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="IptrunkSideBlock"
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="IptrunkSideBlock",
):
iptrunk_side_node: RouterBlockInactive
iptrunk_side_ae_iface: str | None = None
......@@ -81,7 +89,9 @@ class IptrunkSideBlock(IptrunkSideBlockProvisioning, lifecycle=[SubscriptionLife
class IptrunkBlockInactive(
ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="IptrunkBlock"
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="IptrunkBlock",
):
"""A trunk that's currently inactive, see :class:`IptrunkBlock`."""
......
......@@ -5,7 +5,11 @@ from orchestrator.domain.base import ProductBlockModel
from orchestrator.types import SubscriptionLifecycle, strEnum
from pydantic import ConstrainedInt
from gso.products.product_blocks.site import SiteBlock, SiteBlockInactive, SiteBlockProvisioning
from gso.products.product_blocks.site import (
SiteBlock,
SiteBlockInactive,
SiteBlockProvisioning,
)
class RouterVendor(strEnum):
......@@ -34,7 +38,9 @@ class PortNumber(ConstrainedInt):
class RouterBlockInactive(
ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="RouterBlock"
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="RouterBlock",
):
"""A router that's being currently inactive. See :class:`RouterBlock`."""
......
"""The product block that describes a site subscription."""
import re
from typing import Union
from orchestrator.domain.base import ProductBlockModel
from orchestrator.types import SubscriptionLifecycle, strEnum
......@@ -31,9 +30,10 @@ class LatitudeCoordinate(ConstrainedStr):
regex = re.compile(r"^-?([1-8]?\d(\.\d+)?|90(\.0+)?)$")
@classmethod
def validate(cls, value: Union[str]) -> Union[str]:
def validate(cls, value: str) -> str:
if not cls.regex.match(value):
raise ValueError("Invalid latitude coordinate. Valid examples: '40.7128', '-74.0060', '90', '-90', '0'.")
msg = "Invalid latitude coordinate. Valid examples: '40.7128', '-74.0060', '90', '-90', '0'."
raise ValueError(msg)
return value
......@@ -49,14 +49,19 @@ class LongitudeCoordinate(ConstrainedStr):
regex = re.compile(r"^-?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$")
@classmethod
def validate(cls, value: Union[str]) -> Union[str]:
def validate(cls, value: str) -> str:
if not cls.regex.match(value):
raise ValueError("Invalid longitude coordinate. Valid examples: '40.7128', '-74.0060', '180', '-180'")
msg = "Invalid longitude coordinate. Valid examples: '40.7128', '-74.0060', '180', '-180'"
raise ValueError(msg)
return value
class SiteBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="SiteBlock"):
class SiteBlockInactive(
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="SiteBlock",
):
"""A site that's currently inactive, see :class:`SiteBlock`."""
site_name: str | None = None
......
from orchestrator.domain.base import SubscriptionModel
from orchestrator.types import SubscriptionLifecycle
from gso.products.product_blocks.iptrunk import IptrunkBlock, IptrunkBlockInactive, IptrunkBlockProvisioning
from gso.products.product_blocks.iptrunk import (
IptrunkBlock,
IptrunkBlockInactive,
IptrunkBlockProvisioning,
)
class IptrunkInactive(SubscriptionModel, is_base=True):
......
from orchestrator.domain.base import SubscriptionModel
from orchestrator.types import SubscriptionLifecycle
from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning
from gso.products.product_blocks.router import (
RouterBlock,
RouterBlockInactive,
RouterBlockProvisioning,
)
class RouterInactive(SubscriptionModel, is_base=True):
......
from orchestrator.domain.base import SubscriptionModel
from orchestrator.types import SubscriptionLifecycle
from gso.products.product_blocks.site import SiteBlock, SiteBlockInactive, SiteBlockProvisioning
from gso.products.product_blocks.site import (
SiteBlock,
SiteBlockInactive,
SiteBlockProvisioning,
)
class SiteInactive(SubscriptionModel, is_base=True):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment