diff --git a/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py b/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py new file mode 100644 index 0000000000000000000000000000000000000000..07d66822a16d5ae7e1651308db946b95fdffbd5b --- /dev/null +++ b/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py @@ -0,0 +1,305 @@ +"""Add Switch, LAN Switch Interconnect and Pop VLAN products.. + +Revision ID: 2adf833f02a7 +Revises: +Create Date: 2024-03-28 09:29:47.139793 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '2adf833f02a7' +down_revision = None +branch_labels = None +depends_on = '4ec89ab289c0' + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('Switch', 'Switch', 'Switch', 'SWITCH', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('LAN Switch Interconnect', 'LAN Switch Interconnect', 'LanSwitchInterconnect', 'LSI', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('Pop VLAN', 'Pop VLAN', 'PopVlan', 'POP_VLAN', 'active') RETURNING products.product_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('SwitchBlock', 'Switch product block', 'SWITCH_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectBlock', 'LAN Switch Interconnect product block', 'LSI_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectRouterSideBlock', 'LAN Switch Interconnect router side block', 'LSI_RTR_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectSwitchSideBlock', 'LAN Switch Interconnect switch side block', 'LSI_SWC_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectInterfaceBlock', 'LAN Switch Interconnect interface block', 'LSI_IF_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanBlock', 'Pop VLAN Product block', 'POP_VLAN_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanRouterSideBlock', 'Pop VLAN router side block', 'POP_VLAN_RTR_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanSwitchSideBlock', 'Pop VLAN switch side block', 'POP_VLAN_SWC_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanPortBlock', 'Pop VLAN port block', 'POP_VLAN_PORT_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanInterfaceBlock', 'Pop VLAN interface block', 'POP_VLAN_IF_BLOCK', 'active') RETURNING product_blocks.product_block_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('lan_switch_interconnect_description', 'description') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('address_space', 'The address space of the VLAN Switch Interconnect.') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('port_description', 'Description of port') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('number_of_ports', 'Number of ports') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('port', 'A port consist of name, description and a bool field named tagged') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('switch_hostname', 'The hostname of a switch') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('ae_iface', 'AE interface name') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('switch_ts_port', 'TThe port of the terminal server') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('number_of_members', 'The number of members in the Pop VLAN.') RETURNING resource_types.resource_type_id + """)) + conn.execute(sa.text(""" +INSERT INTO resource_types (resource_type, description) VALUES ('tagged', 'If the port is tagged or not') 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 ('Switch')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))) + """)) + 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 ('LAN Switch Interconnect')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectBlock'))) + """)) + 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 ('Pop VLAN')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock'))) + """)) + 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 ('SwitchBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock'))) + """)) + 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 ('LanSwitchInterconnectBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock'))) + """)) + 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 ('LanSwitchInterconnectBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock'))) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock'))) + """)) + 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 ('LanSwitchInterconnectSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))) + """)) + 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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock'))) + """)) + 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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock'))) + """)) + 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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanPortBlock'))) + """)) + 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 ('PopVlanSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock'))) + """)) + 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 ('SwitchBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname'))) + """)) + 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 ('SwitchBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port'))) + """)) + 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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description'))) + """)) + 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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space'))) + """)) + 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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members'))) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))) + """)) + 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 ('PopVlanInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_name'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_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 ('PopVlanInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))) + """)) + 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 ('PopVlanBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports'))) + """)) + 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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port'))) + """)) + 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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description'))) + """)) + 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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged'))) + """)) + + +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 ('SwitchBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname')) + """)) + 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 ('SwitchBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname')) + """)) + 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 ('SwitchBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port')) + """)) + 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 ('SwitchBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port')) + """)) + 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 ('LanSwitchInterconnectBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description')) + """)) + 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 ('LanSwitchInterconnectBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description')) + """)) + 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 ('LanSwitchInterconnectBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space')) + """)) + 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 ('LanSwitchInterconnectBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space')) + """)) + 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 ('LanSwitchInterconnectBlock', 'PopVlanBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members')) + """)) + 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 ('LanSwitchInterconnectBlock', 'PopVlanBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members')) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface')) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface')) + """)) + 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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock')) 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(""" +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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock'))) 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(""" +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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock')) 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(""" +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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock'))) 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(""" +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 ('PopVlanBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports')) + """)) + 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 ('PopVlanBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports')) + """)) + 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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port')) + """)) + 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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port')) + """)) + 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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description')) + """)) + 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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description')) + """)) + 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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged')) + """)) + 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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged')) + """)) + 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 ('lan_switch_interconnect_description', 'address_space', 'port_description', 'number_of_ports', 'port', 'switch_hostname', 'ae_iface', 'switch_ts_port', 'number_of_members', 'tagged')) + """)) + conn.execute(sa.text(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description', 'address_space', 'port_description', 'number_of_ports', 'port', 'switch_hostname', 'ae_iface', 'switch_ts_port', 'number_of_members', 'tagged') + """)) + 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 ('Switch')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock')) + """)) + 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 ('LAN Switch Interconnect')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectBlock')) + """)) + 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 ('Pop VLAN')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock')) + """)) + 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 ('SwitchBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock')) + """)) + 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 ('LanSwitchInterconnectBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock')) + """)) + 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 ('LanSwitchInterconnectBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanRouterSideBlock')) 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 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 ('LanSwitchInterconnectRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')) + """)) + 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 ('LanSwitchInterconnectSwitchSideBlock', 'PopVlanSwitchSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock')) + """)) + 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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')) + """)) + 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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')) + """)) + 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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanPortBlock')) + """)) + 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 ('PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock')) + """)) + 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 ('LanSwitchInterconnectRouterSideBlock', 'SwitchBlock', 'LanSwitchInterconnectSwitchSideBlock', 'PopVlanInterfaceBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'PopVlanPortBlock', 'LanSwitchInterconnectBlock', 'LanSwitchInterconnectInterfaceBlock', 'PopVlanBlock')) + """)) + conn.execute(sa.text(""" +DELETE FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock', 'SwitchBlock', 'LanSwitchInterconnectSwitchSideBlock', 'PopVlanInterfaceBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'PopVlanPortBlock', 'LanSwitchInterconnectBlock', 'LanSwitchInterconnectInterfaceBlock', 'PopVlanBlock') + """)) + 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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch')))) + """)) + 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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch'))) + """)) + 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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch'))) + """)) + conn.execute(sa.text(""" +DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Pop VLAN', 'LAN Switch Interconnect', 'Switch')) + """)) + conn.execute(sa.text(""" +DELETE FROM products WHERE products.name IN ('Pop VLAN', 'LAN Switch Interconnect', 'Switch') + """)) diff --git a/gso/products/__init__.py b/gso/products/__init__.py index 32350d65cc3a9b0e92e4757ffc8a7faf632f7379..cab8e801f207c7617c2e204cb9fdde0aa0d5a366 100644 --- a/gso/products/__init__.py +++ b/gso/products/__init__.py @@ -9,10 +9,13 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY from pydantic_forms.types import strEnum from gso.products.product_types.iptrunk import Iptrunk +from gso.products.product_types.lan_switch_interconnect import LanSwitchInterconnect from gso.products.product_types.office_router import OfficeRouter +from gso.products.product_types.pop_vlan import PopVlan from gso.products.product_types.router import Router from gso.products.product_types.site import Site from gso.products.product_types.super_pop_switch import SuperPopSwitch +from gso.products.product_types.switch import Switch class ProductName(strEnum): @@ -23,6 +26,9 @@ class ProductName(strEnum): SITE = "Site" SUPER_POP_SWITCH = "Super PoP switch" OFFICE_ROUTER = "Office router" + SWITCH = "Switch" + LAN_SWITCH_INTERCONNECT = "LAN Switch Interconnect" + POP_VLAN = "Pop VLAN" class ProductType(strEnum): @@ -33,6 +39,9 @@ class ProductType(strEnum): SITE = Site.__name__ SUPER_POP_SWITCH = SuperPopSwitch.__name__ OFFICE_ROUTER = OfficeRouter.__name__ + SWITCH = Switch.__name__ + LAN_SWITCH_INTERCONNECT = LanSwitchInterconnect.__name__ + POP_VLAN = PopVlan.__name__ SUBSCRIPTION_MODEL_REGISTRY.update( @@ -42,5 +51,8 @@ SUBSCRIPTION_MODEL_REGISTRY.update( ProductName.SITE.value: Site, ProductName.SUPER_POP_SWITCH.value: SuperPopSwitch, ProductName.OFFICE_ROUTER.value: OfficeRouter, + ProductName.SWITCH.value: Switch, + ProductName.LAN_SWITCH_INTERCONNECT.value: LanSwitchInterconnect, + ProductName.POP_VLAN.value: PopVlan, }, ) diff --git a/gso/products/product_blocks/lan_switch_interconnect.py b/gso/products/product_blocks/lan_switch_interconnect.py new file mode 100644 index 0000000000000000000000000000000000000000..08693fef09ff372623ddcdb36cd5759c4e1e088e --- /dev/null +++ b/gso/products/product_blocks/lan_switch_interconnect.py @@ -0,0 +1,149 @@ +"""LAN Switch Interconnect product block that has all parameters of a subscription throughout its lifecycle.""" + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.types import SubscriptionLifecycle, strEnum + +from gso.products.product_blocks.iptrunk import LAGMemberList +from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning +from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning + + +class LanSwitchInterconnectAddressSpace(strEnum): + """Types of LAN Switch Interconnect. Can be private or public.""" + + PRIVATE = "Private" + PUBLIC = "Public" + + +class LanSwitchInterconnectInterfaceBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="LanSwitchInterconnectInterfaceBlock", +): + """An inactive LAN Switch Interconnect interface.""" + + interface_name: str | None = None + interface_description: str | None = None + + +class LanSwitchInterconnectInterfaceBlockProvisioning( + LanSwitchInterconnectInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """A LAN Switch Interconnect interface that is being provisioned.""" + + interface_name: str + interface_description: str + + +class LanSwitchInterconnectInterfaceBlock( + LanSwitchInterconnectInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE] +): + """An active Switch Interconnect interface.""" + + interface_name: str + interface_description: str + + +class LanSwitchInterconnectRouterSideBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="LanSwitchInterconnectRouterSideBlock", +): + """An inactive LAN Switch Interconnect router side.""" + + node: RouterBlockInactive + ae_iface: str | None = None + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockInactive] + + +class LanSwitchInterconnectRouterSideBlockProvisioning( + LanSwitchInterconnectRouterSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """An LAN Switch Interconnect router side that is being provisioned.""" + + node: RouterBlockProvisioning + ae_iface: str | None = None + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] + + +class LanSwitchInterconnectRouterSideBlock( + LanSwitchInterconnectRouterSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE] +): + """An active LAN Switch Interconnect router side.""" + + node: RouterBlock + ae_iface: str + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] + + +class LanSwitchInterconnectSwitchSideBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="LanSwitchInterconnectSwitchSideBlock", +): + """An inactive LAN Switch Interconnect switch side.""" + + node: SwitchBlockInactive + ae_iface: str | None = None + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockInactive] + + +class LanSwitchInterconnectSwitchSideBlockProvisioning( + LanSwitchInterconnectSwitchSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """An LAN Switch Interconnect switch side that is being provisioned.""" + + node: SwitchBlockProvisioning + ae_iface: str | None = None + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] + + +class LanSwitchInterconnectSwitchSideBlock( + LanSwitchInterconnectSwitchSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE] +): + """An active LAN Switch Interconnect switch side.""" + + node: SwitchBlock + ae_iface: str + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] + + +class LanSwitchInterconnectBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="LanSwitchInterconnectBlock", +): + """A LAN Switch Interconnect that's currently inactive, see :class:`LanSwitchInterconnectBlock`.""" + + lan_switch_interconnect_description: str | None = None + address_space: LanSwitchInterconnectAddressSpace | None = None + number_of_members: int | None = None + router_side: LanSwitchInterconnectRouterSideBlockInactive + switch_side: LanSwitchInterconnectSwitchSideBlockInactive + + +class LanSwitchInterconnectBlockProvisioning( + LanSwitchInterconnectBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """A LAN Switch Interconnect that's currently being provisioned, see :class:`LanSwitchInterconnectBlock`.""" + + lan_switch_interconnect_description: str | None = None + address_space: LanSwitchInterconnectAddressSpace | None = None + number_of_members: int | None = None + router_side: LanSwitchInterconnectRouterSideBlockProvisioning + switch_side: LanSwitchInterconnectSwitchSideBlockProvisioning + + +class LanSwitchInterconnectBlock(LanSwitchInterconnectBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A LAN Switch Interconnect that's currently deployed in the network.""" + + #: A human-readable description of this LAN Switch Interconnect. + lan_switch_interconnect_description: str + #: The address space of the VLAN Switch Interconnect. It can be private or public. + address_space: LanSwitchInterconnectAddressSpace + #: The minimum amount of links the LAN Switch Interconnect should consist of. + number_of_members: int + #: The router side of the LAN Switch Interconnect. + router_side: LanSwitchInterconnectRouterSideBlock + #: The switch side of the LAN Switch Interconnect. + switch_side: LanSwitchInterconnectSwitchSideBlock diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py new file mode 100644 index 0000000000000000000000000000000000000000..9840299c80c8dffa9cb270d0f381f7ed47e42ea8 --- /dev/null +++ b/gso/products/product_blocks/pop_vlan.py @@ -0,0 +1,167 @@ +"""Pop VLAN product block that has all parameters of a subscription throughout its lifecycle.""" + +from typing import TypeVar + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.forms.validators import UniqueConstrainedList +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.iptrunk import LAGMemberList +from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning +from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning + +T_co = TypeVar("T_co", covariant=True) + + +class PortList(UniqueConstrainedList[T_co]): # type: ignore[type-var] + """A list of ports.""" + + +class PopVlanPortBlockInactive( + ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="PopVlanPortBlock" +): + """An inactive Pop VLAN port.""" + + port: str | None = None + port_description: str | None = None + tagged: bool | None = None + + +class PopVlanPortBlockProvisioning(PopVlanPortBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A Pop VLAN port that is being provisioned.""" + + port: str | None = None + port_description: str | None = None + tagged: bool | None = None + + +class PopVlanPortBlock(PopVlanPortBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """An active Pop VLAN port.""" + + port: str + port_description: str + tagged: bool + + +class PopVlanInterfaceBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="PopVlanInterfaceBlock", +): + """An inactive Pop VLAN interface.""" + + interface_name: str | None = None + interface_description: str | None = None + + +class PopVlanInterfaceBlockProvisioning(PopVlanInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A Pop VLAN interface that is being provisioned.""" + + interface_name: str + interface_description: str + + +class PopVlanInterfaceBlock(PopVlanInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """An active Pop VLAN interface.""" + + interface_name: str + interface_description: str + + +class PopVlanRouterSideBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="PopVlanRouterSideBlock", +): + """An inactive Pop VLAN router side.""" + + node: RouterBlockInactive + ae_iface: str | None = None + ae_members: LAGMemberList[PopVlanInterfaceBlockInactive] + + +class PopVlanRouterSideBlockProvisioning( + PopVlanRouterSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """An Pop VLAN router side that is being provisioned.""" + + node: RouterBlockProvisioning + ae_iface: str | None = None + ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning] + + +class PopVlanRouterSideBlock(PopVlanRouterSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """An active Pop VLAN router side.""" + + node: RouterBlock + ae_iface: str + ae_members: LAGMemberList[PopVlanInterfaceBlock] + + +class PopVlanSwitchSideBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="PopVlanSwitchSideBlock", +): + """An inactive Pop VLAN switch side.""" + + node: SwitchBlockInactive + ae_iface: str | None = None + ae_members: LAGMemberList[PopVlanInterfaceBlockInactive] + + +class PopVlanSwitchSideBlockProvisioning( + PopVlanSwitchSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] +): + """An Pop VLAN switch side that is being provisioned.""" + + node: SwitchBlockProvisioning + ae_iface: str | None = None + ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning] + + +class PopVlanSwitchSideBlock(PopVlanSwitchSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """An active Pop VLAN switch side.""" + + node: SwitchBlock + ae_iface: str + ae_members: LAGMemberList[PopVlanInterfaceBlock] + + +class PopVlanBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="PopVlanBlock", +): + """A Pop VLAN that's currently inactive, see :class:`PopVlanBlock`.""" + + number_of_ports: int | None = None + number_of_members: int | None = None + router_side: PopVlanRouterSideBlockInactive + switch_side: PopVlanSwitchSideBlockInactive + ports: PortList[PopVlanPortBlockInactive] + + +class PopVlanBlockProvisioning(PopVlanBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A Pop VLAN that's currently being provisioned, see :class:`PopVlanBlock`.""" + + number_of_ports: int | None = None + number_of_members: int | None = None + router_side: PopVlanRouterSideBlockProvisioning + switch_side: PopVlanSwitchSideBlockProvisioning + ports: PortList[PopVlanPortBlockProvisioning] + + +class PopVlanBlock(PopVlanBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A Pop VLAN that's currently deployed in the network.""" + + #: The number of ports in the Pop VLAN. + number_of_ports: int + #: The number of members in the Pop VLAN. + number_of_members: int + #: The router side of the Pop VLAN. + router_side: PopVlanRouterSideBlock + #: The switch side of the Pop VLAN. + switch_side: PopVlanSwitchSideBlock + #: The ports of the Pop VLAN. + ports: PortList[PopVlanPortBlock] diff --git a/gso/products/product_blocks/switch.py b/gso/products/product_blocks/switch.py new file mode 100644 index 0000000000000000000000000000000000000000..42f920a86689ce5cf132aa243b2c86c43e94a5b8 --- /dev/null +++ b/gso/products/product_blocks/switch.py @@ -0,0 +1,42 @@ +"""Product block for :class:`Switch` products.""" + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.site import ( + SiteBlock, + SiteBlockInactive, + SiteBlockProvisioning, +) +from gso.utils.shared_enums import PortNumber + + +class SwitchBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="SwitchBlock", +): + """A switch that's being currently inactive. See :class:`SwitchBlock`.""" + + switch_hostname: str | None = None + switch_ts_port: PortNumber | None = None + switch_site: SiteBlockInactive | None + + +class SwitchBlockProvisioning(SwitchBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A switch that's being provisioned. See :class:`SwitchBlock`.""" + + switch_hostname: str + switch_ts_port: PortNumber + switch_site: SiteBlockProvisioning + + +class SwitchBlock(SwitchBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A switch that's currently deployed in the network.""" + + #: The hostname of the switch. + switch_hostname: str + #: The port of the terminal server that this switch is connected to. Used to offer out of band access. + switch_ts_port: PortNumber + #: The :class:`Site` that this switch resides in. Both physically and computationally. + switch_site: SiteBlock diff --git a/gso/products/product_types/lan_switch_interconnect.py b/gso/products/product_types/lan_switch_interconnect.py new file mode 100644 index 0000000000000000000000000000000000000000..32433c4694b0f097bcdc80df742ca9695a9dee53 --- /dev/null +++ b/gso/products/product_types/lan_switch_interconnect.py @@ -0,0 +1,28 @@ +"""The product type for LAN Switch Interconnect.""" + +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.lan_switch_interconnect import ( + LanSwitchInterconnectBlock, + LanSwitchInterconnectBlockInactive, + LanSwitchInterconnectBlockProvisioning, +) + + +class LanSwitchInterconnectInactive(SubscriptionModel, is_base=True): + """An LAN Switch Interconnect that is inactive.""" + + lan_switch_interconnect: LanSwitchInterconnectBlockInactive + + +class LanSwitchInterconnectProvisioning(LanSwitchInterconnectInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """An LAN Switch Interconnect that is being provisioned.""" + + lan_switch_interconnect: LanSwitchInterconnectBlockProvisioning + + +class LanSwitchInterconnect(LanSwitchInterconnectProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """An LAN Switch Interconnect that is active.""" + + lan_switch_interconnect: LanSwitchInterconnectBlock diff --git a/gso/products/product_types/pop_vlan.py b/gso/products/product_types/pop_vlan.py new file mode 100644 index 0000000000000000000000000000000000000000..7567f4ea8014bbd49fa66b6204839d2596cccb30 --- /dev/null +++ b/gso/products/product_types/pop_vlan.py @@ -0,0 +1,24 @@ +"""The product type for Pop VLAN.""" + +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.pop_vlan import PopVlanBlock, PopVlanBlockInactive, PopVlanBlockProvisioning + + +class PopVlanInactive(SubscriptionModel, is_base=True): + """A Pop VLAN that is inactive.""" + + pop_vlan: PopVlanBlockInactive + + +class PopVlanProvisioning(PopVlanInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A Pop VLAN that is being provisioned.""" + + pop_vlan: PopVlanBlockProvisioning + + +class PopVlan(PopVlanProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A Pop VLAN that is active.""" + + pop_vlan: PopVlanBlock diff --git a/gso/products/product_types/switch.py b/gso/products/product_types/switch.py new file mode 100644 index 0000000000000000000000000000000000000000..ef2eb05eac333628ba4ae5bef2424283adec3758 --- /dev/null +++ b/gso/products/product_types/switch.py @@ -0,0 +1,24 @@ +"""A switch product type.""" + +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning + + +class SwitchInactive(SubscriptionModel, is_base=True): + """An inactive switch.""" + + switch: SwitchBlockInactive + + +class SwitchProvisioning(SwitchInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): + """A switch that is being provisioned.""" + + switch: SwitchBlockProvisioning + + +class Switch(SwitchProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + """A switch that is currently active.""" + + switch: SwitchBlock