diff --git a/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py b/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py new file mode 100644 index 0000000000000000000000000000000000000000..ec1887aea7f363ced93f1e040d803155643507d2 --- /dev/null +++ b/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py @@ -0,0 +1,107 @@ +"""Add VRF and ImportedVRF products.. + +Revision ID: 4b5bbefb296f +Revises: 0e7e7d749617 +Create Date: 2024-11-26 10:28:41.081655 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '4b5bbefb296f' +down_revision = '0e7e7d749617' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('VRF', 'Virtual Routing and Forwarding product', 'VRF', 'VRF', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('Imported VRF', 'Imported Virtual Routing and Forwarding products', 'ImportedVRF', 'IMP_VRF', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('VRFBlock', 'Virtual Routing and Forwarding product block', 'VRF_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('vrf_name', 'Unique name identifying this VRF') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('route_distinguisher', 'Route Distinguisher (RD) ensuring unique route identification within this VRF') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('route_target', 'Route Target (RT) defining routing policies for importing/exporting routes') 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 ('VRF')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))), ((SELECT products.product_id FROM products WHERE products.name IN ('Imported VRF')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))) + """)) + 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 ('VRFBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))) + """)) + 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 ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name'))) + """)) + 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 ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher'))) + """)) + 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 ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target'))) + """)) + + +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 ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name')) + """)) + 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 ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name')) + """)) + 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 ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher')) + """)) + 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 ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher')) + """)) + 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 ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target')) + """)) + 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 ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target')) + """)) + 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 ('vrf_name', 'route_distinguisher', 'route_target')) + """)) + conn.execute(sa.text(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('vrf_name', 'route_distinguisher', 'route_target') + """)) + 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 ('VRF', 'Imported VRF')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')) + """)) + 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 ('VRFBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock')) + """)) + 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 ('VRFBlock')) + """)) + conn.execute(sa.text(""" +DELETE FROM product_blocks WHERE product_blocks.name IN ('VRFBlock') + """)) + 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 ('VRF', 'Imported VRF')))) + """)) + 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 ('VRF', 'Imported VRF'))) + """)) + 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 ('VRF', 'Imported VRF'))) + """)) + conn.execute(sa.text(""" +DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF')) + """)) + conn.execute(sa.text(""" +DELETE FROM products WHERE products.name IN ('VRF', 'Imported VRF') + """)) diff --git a/gso/products/__init__.py b/gso/products/__init__.py index 4b472c9f8a4f186bca00aea8bf70507981c0b7da..ed60b97e7c297ac667844ff96e2466222adc5f66 100644 --- a/gso/products/__init__.py +++ b/gso/products/__init__.py @@ -20,6 +20,7 @@ from gso.products.product_types.router import ImportedRouter, Router from gso.products.product_types.site import ImportedSite, Site from gso.products.product_types.super_pop_switch import ImportedSuperPopSwitch, SuperPopSwitch from gso.products.product_types.switch import ImportedSwitch, Switch +from gso.products.product_types.vrf import VRF, ImportedVRF class ProductName(strEnum): @@ -58,6 +59,8 @@ class ProductName(strEnum): IMPORTED_GEANT_PLUS = Layer2CircuitServiceType.IMPORTED_GEANT_PLUS EXPRESSROUTE = Layer2CircuitServiceType.EXPRESSROUTE IMPORTED_EXPRESSROUTE = Layer2CircuitServiceType.IMPORTED_EXPRESSROUTE + VRF = "VRF" + IMPORTED_VRF = "Imported VRF" class ProductType(strEnum): @@ -96,6 +99,8 @@ class ProductType(strEnum): IMPORTED_GEANT_PLUS = ImportedLayer2Circuit.__name__ EXPRESSROUTE = Layer2Circuit.__name__ IMPORTED_EXPRESSROUTE = ImportedLayer2Circuit.__name__ + VRF = VRF.__name__ + IMPORTED_VRF = ImportedVRF.__name__ SUBSCRIPTION_MODEL_REGISTRY.update( @@ -133,6 +138,8 @@ SUBSCRIPTION_MODEL_REGISTRY.update( ProductName.IMPORTED_GEANT_PLUS.value: ImportedLayer2Circuit, ProductName.EXPRESSROUTE.value: Layer2Circuit, ProductName.IMPORTED_EXPRESSROUTE.value: ImportedLayer2Circuit, + ProductName.VRF.value: VRF, + ProductName.IMPORTED_VRF.value: ImportedVRF, }, ) diff --git a/gso/products/product_blocks/vrf.py b/gso/products/product_blocks/vrf.py index 0c4bd10be1082e890d7b418a365932cfc9c267c4..59cf3388edb38ba80ca5d93fb883707f4c933ed5 100644 --- a/gso/products/product_blocks/vrf.py +++ b/gso/products/product_blocks/vrf.py @@ -1,4 +1,4 @@ -"""Product blocks for VRF.""" +"""Product blocks for :term:`VRF` Virtual Routing and Forwarding.""" from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle diff --git a/gso/products/product_types/vrf.py b/gso/products/product_types/vrf.py new file mode 100644 index 0000000000000000000000000000000000000000..ee322cd714744f43ee9e9ba56cb263233373f72e --- /dev/null +++ b/gso/products/product_types/vrf.py @@ -0,0 +1,36 @@ +"""A :term:`VRF` product type.""" + +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.vrf import VRFBlock, VRFBlockInactive, VRFBlockProvisioning + + +class VRFInactive(SubscriptionModel, is_base=True): + """An inactive :term:`VRF`.""" + + vrf: VRFBlockInactive + + +class VRFProvisioning(VRFInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A provisioning :term:`VRF`.""" + + vrf: VRFBlockProvisioning + + +class VRF(VRFProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A :term:`VRF` that is currently active.""" + + vrf: VRFBlock + + +class ImportedVRFInactive(SubscriptionModel, is_base=True): + """An imported, inactive :term:`VRF`.""" + + vrf: VRFBlockInactive + + +class ImportedVRF(ImportedVRFInactive, llifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE]): + """An imported :term:`VRF` that is currently active.""" + + vrf: VRFBlock