diff --git a/gso/migrations/versions/2023-11-09_e4c89c23e358_split_off_ias_gateway_product_from_.py b/gso/migrations/versions/2023-11-09_e4c89c23e358_split_off_ias_gateway_product_from_.py new file mode 100644 index 0000000000000000000000000000000000000000..c4d5cbe8862d5350224a7975f54b3dc3f77a075b --- /dev/null +++ b/gso/migrations/versions/2023-11-09_e4c89c23e358_split_off_ias_gateway_product_from_.py @@ -0,0 +1,116 @@ +"""Split off IAS gateway product from router. + +Revision ID: e4c89c23e358 +Revises: 7f46df0f4f95 +Create Date: 2023-11-09 16:36:54.922231 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'e4c89c23e358' +down_revision = '7f46df0f4f95' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + 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 ('RouterBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_si_ipv4_network')) + """)) + 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 ('RouterBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_si_ipv4_network')) + """)) + 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 ('RouterBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_is_ias_connected')) + """)) + 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 ('RouterBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_is_ias_connected')) + """)) + 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 ('RouterBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_ias_lt_ipv6_network')) + """)) + 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 ('RouterBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_ias_lt_ipv6_network')) + """)) + 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 ('RouterBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_ias_lt_ipv4_network')) + """)) + 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 ('RouterBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_ias_lt_ipv4_network')) + """)) + 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 ('router_si_ipv4_network', 'router_ias_lt_ipv4_network', 'router_ias_lt_ipv6_network', 'router_is_ias_connected')) + """)) + conn.execute(sa.text(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('router_si_ipv4_network', 'router_ias_lt_ipv4_network', 'router_ias_lt_ipv6_network', 'router_is_ias_connected') + """)) + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('IAS gateway', 'IAS gateway', 'IASGateway', 'IAS_GW', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('IASGatewayBlock', 'IAS gateway product block', 'IAS_GW_PB', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('lt_ipv4_network', 'LT IPv4 network') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('lt_ipv6_network', 'LT IPv6 network') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_product_blocks (product_id, product_block_id) VALUES ((SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IASGatewayBlock'))) + """)) + 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 ('IASGatewayBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv4_network'))) + """)) + 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 ('IASGatewayBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv6_network'))) + """)) + + +def downgrade() -> None: + conn = op.get_bind() + 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 ('IASGatewayBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv4_network')) + """)) + 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 ('IASGatewayBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv4_network')) + """)) + 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 ('IASGatewayBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv6_network')) + """)) + 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 ('IASGatewayBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv6_network')) + """)) + 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 ('lt_ipv4_network', 'lt_ipv6_network')) + """)) + conn.execute(sa.text(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('lt_ipv4_network', 'lt_ipv6_network') + """)) + conn.execute(sa.text(""" +DELETE FROM product_product_blocks WHERE product_product_blocks.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IASGatewayBlock')) + """)) + 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 ('IASGatewayBlock')) + """)) + conn.execute(sa.text(""" +DELETE FROM product_blocks WHERE product_blocks.name IN ('IASGatewayBlock') + """)) + conn.execute(sa.text(""" +DELETE FROM processes WHERE processes.pid IN (SELECT processes_subscriptions.pid FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway')))) + """)) + conn.execute(sa.text(""" +DELETE FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway'))) + """)) + conn.execute(sa.text(""" +DELETE FROM subscription_instances WHERE subscription_instances.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway'))) + """)) + conn.execute(sa.text(""" +DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('IAS gateway')) + """)) + conn.execute(sa.text(""" +DELETE FROM products WHERE products.name IN ('IAS gateway') + """)) diff --git a/gso/products/__init__.py b/gso/products/__init__.py index 37cf18d27ab60a433c391b02d47145e026f334d8..916bc92d4dac0063b91ed5b8f81f920a79b3f73e 100644 --- a/gso/products/__init__.py +++ b/gso/products/__init__.py @@ -8,6 +8,7 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY from pydantic_forms.types import strEnum +from gso.products.product_types.ias_gateway import IASGateway from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.router import Router from gso.products.product_types.site import Site @@ -20,13 +21,15 @@ class ProductType(strEnum): NOKIA_ROUTER = "Nokia router" JUNIPER_ROUTER = "Juniper router" IP_TRUNK = "IP trunk" + IAS_GATEWAY = "IAS gateway" SUBSCRIPTION_MODEL_REGISTRY.update( { - "Site": Site, - "Nokia router": Router, - "Juniper router": Router, + "IAS gateway": IASGateway, "IP trunk": Iptrunk, + "Juniper router": Router, + "Nokia router": Router, + "Site": Site, }, ) diff --git a/gso/products/product_blocks/ias_gateway.py b/gso/products/product_blocks/ias_gateway.py new file mode 100644 index 0000000000000000000000000000000000000000..2a38f6b3686c0322df09de044901b5ee69b0d20c --- /dev/null +++ b/gso/products/product_blocks/ias_gateway.py @@ -0,0 +1,21 @@ +from ipaddress import IPv4Network, IPv6Network + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.types import SubscriptionLifecycle + + +class IASGatewayBlockInactive( + ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="IASGatewayBlock" +): + lt_ipv4_network: IPv4Network | None = None + lt_ipv6_network: IPv6Network | None = None + + +class IASGatewayBlockProvisioning(IASGatewayBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + lt_ipv4_network: IPv4Network | None = None + lt_ipv6_network: IPv6Network | None = None + + +class IASGatewayBlock(IASGatewayBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + lt_ipv4_network: IPv4Network + lt_ipv6_network: IPv6Network diff --git a/gso/products/product_blocks/router.py b/gso/products/product_blocks/router.py index fb82480f43cd49de17959c646cfbe46dc0520e23..fa52b3a02ef61b0d076c7543572cb5533a0740fc 100644 --- a/gso/products/product_blocks/router.py +++ b/gso/products/product_blocks/router.py @@ -44,12 +44,8 @@ class RouterBlockInactive( router_lo_ipv4_address: ipaddress.IPv4Address | None = None router_lo_ipv6_address: ipaddress.IPv6Address | None = None router_lo_iso_address: str | None = None - router_si_ipv4_network: ipaddress.IPv4Network | None = None - router_ias_lt_ipv4_network: ipaddress.IPv4Network | None = None - router_ias_lt_ipv6_network: ipaddress.IPv6Network | None = None router_role: RouterRole | None = None router_site: SiteBlockInactive | None - router_is_ias_connected: bool | None = None def generate_fqdn(hostname: str, site_name: str, country_code: str) -> str: @@ -66,12 +62,8 @@ class RouterBlockProvisioning(RouterBlockInactive, lifecycle=[SubscriptionLifecy router_lo_ipv4_address: ipaddress.IPv4Address | None = None router_lo_ipv6_address: ipaddress.IPv6Address | None = None router_lo_iso_address: str | None = None - router_si_ipv4_network: ipaddress.IPv4Network | None = None - router_ias_lt_ipv4_network: ipaddress.IPv4Network | None = None - router_ias_lt_ipv6_network: ipaddress.IPv6Network | None = None router_role: RouterRole | None = None router_site: SiteBlockProvisioning | None - router_is_ias_connected: bool | None = None class RouterBlock(RouterBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -89,15 +81,7 @@ class RouterBlock(RouterBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI router_lo_ipv6_address: ipaddress.IPv6Address #: The :term:`ISO` :term:`NET` of the router, used for :term:`ISIS` support. router_lo_iso_address: str - #: The SI IPv4 network of the router. - router_si_ipv4_network: ipaddress.IPv4Network | None - #: The :term:`IAS` LT IPv4 network of the router. - router_ias_lt_ipv4_network: ipaddress.IPv4Network | None - #: The :term:`IAS` LT IPv6 network of the router. - router_ias_lt_ipv6_network: ipaddress.IPv6Network | None #: The role of the router, which can be any of the values defined in :class:`RouterRole`. router_role: RouterRole #: The :class:`Site` that this router resides in. Both physically and computationally. router_site: SiteBlock - #: The router is going to have an LT interface between inet0 and :term:`IAS`. - router_is_ias_connected: bool diff --git a/gso/products/product_types/ias_gateway.py b/gso/products/product_types/ias_gateway.py new file mode 100644 index 0000000000000000000000000000000000000000..ba59c472da6ea3e1916319dfcd3ea74fe644b39e --- /dev/null +++ b/gso/products/product_types/ias_gateway.py @@ -0,0 +1,20 @@ +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.ias_gateway import ( + IASGatewayBlock, + IASGatewayBlockInactive, + IASGatewayBlockProvisioning, +) + + +class IASGatewayInactive(SubscriptionModel, is_base=True): + ias_gateway: IASGatewayBlockInactive + + +class IASGatewayProvisioning(IASGatewayInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + ias_gateway: IASGatewayBlockProvisioning + + +class IASGateway(IASGatewayProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + ias_gateway: IASGatewayBlock diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index d568ba12f12a5e5e0906c84df03699f6f30cd4cf..d5ab094aa2042a6edfcec6b1d42991e076dada12 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -27,7 +27,8 @@ from gso.utils.helpers import ( LAGMember, available_interfaces_choices, available_interfaces_choices_including_current_members, - validate_iptrunk_unique_interface, get_router_vendor, + get_router_vendor, + validate_iptrunk_unique_interface, ) diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py index b86d17cd5ef4978c17cfa2b34cac905f907df308..a380897dbc714bc8da4428212e7b8063a6f676f4 100644 --- a/gso/workflows/iptrunk/terminate_iptrunk.py +++ b/gso/workflows/iptrunk/terminate_iptrunk.py @@ -16,11 +16,11 @@ from orchestrator.workflows.steps import ( from orchestrator.workflows.utils import wrap_modify_initial_input_form from gso.products.product_types.iptrunk import Iptrunk -from gso.products.product_types.router import Router, RouterVendor +from gso.products.product_types.router import RouterVendor from gso.services import infoblox, provisioning_proxy from gso.services.netbox_client import NetboxClient from gso.services.provisioning_proxy import pp_interaction -from gso.utils.helpers import set_isis_to_90000, get_router_vendor +from gso.utils.helpers import get_router_vendor, set_isis_to_90000 def initial_input_form_generator() -> FormGenerator: