diff --git a/.gitignore b/.gitignore index af56c6d634b0fe79fee18e851f5f3163bceced53..a366de4013bea7eb56bb1b33d5ffded2205db64c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ coverage.xml .tox/device_vendor .vscode oss-params.json +venv diff --git a/README.md b/README.md index 909a22cd7b977e3c8527efcd640a4faa6141957e..af580f008c8ed7fbdb0c1dd4cf7d304c1be37838 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,36 @@ -# Modeling of Trunk service in WFO +## Environment and dependencies -This is a dummy implementation of a trunk service in workflow orchestrator. The "pieces" of the trunk service are mapped to Products. The parameters of the trunk service are modelled as Resource Types. - -## Quickstart - -- Follow Steps 1 and 2 from here: https://workfloworchestrator.org/orchestrator-core/workshops/beginner/debian/ +- Install python 3.10 if you don't have it already: + - ``add-apt-repository ppa:deadsnakes/ppa`` + - ``apt install python3.10 python3.10-distutils`` +- Follow Steps 1 and 2 from here to install dependencies and setup DB: https://workfloworchestrator.org/orchestrator-core/workshops/beginner/debian/ - To install the orchestrator GUI, you can follow the steps 5 and 6 from the above link. -- Clone this repo: -- ``pip install -r requirements.txt`` -- from the top-level directory: +- Create a virtualenv: + - ``source /usr/share/virtualenvwrapper/virtualenvwrapper.sh`` + - ``mkvirtualenv --python python3.10 gso`` +- To use the virtualenv: + - `source /usr/share/virtualenvwrapper/virtualenvwrapper.sh` + - `workon gso` + +## Install + +Do all of this inside the virtualenv. +- Clone this repo and ``cd`` into it +- ``pip install -r requirements.txt`` + - If you get an error because you pip version is too old, run this: `curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10` - ``pip install -e .`` -- Create ``oss-params.json`` -- Export the oss-params file: ``export OSS_PARAMS_FILENAME="/path/to/file.json"`` +- `cd` into `gso` directory and create ``oss-params.json`` based on the ``oss-params-example.json`` file. +- Export the oss-params file: ``export OSS_PARAMS_FILENAME="/path/to/oss-params.json"`` +- Upgrade DB to latest revision: `PYTHONPATH=. python main.py db upgrade heads` + +## Run + - The core of workflow orchestrator can be started with ``uvicorn --host 0.0.0.0 --port 8080 main:app`` from inside the ``gso`` directory of this repo. - The GUI can be started with ``yarn start``. -## Structure description - -### Products & fixed inputs -- Trunk - - Reference to PB Trunk -- TrunkConfig - - Reference to PB TrunkConfig -- TrunkConfigCommon - - Reference to PB TrunkConfigCommon -- TrunkConfigSide - - Reference to PB TrunkConfigSide -### Product blocks & resource types -- Trunk - - Id - - GeantSSid - - Name -- TrunkConfig - - Id - - Reference to PB Trunk -- TrunkConfigCommon - - Id - - Speed - - IsLeasedLine - - IsIsMetric - - MinimumLinks - - Reference to PB TrunkConfig -- TrunkConfigSide - - Id - - Name - - AEName - - GeantASid - - IPv4Address - - IPv6Address - - Members - - Reference to PB TrunkConfig - -### Workflows -- Workflows included are CREATE and TERMINATE for: - - Trunk - - TrunkConfig - - TrunkConfigCommon - - TrunkConfigSide - ## Useful WFO Resources + - WFO API (Swagger): https://workfloworchestrator.org/orchestrator-core/architecture/application/api/ - WFO API (repo): https://github.com/workfloworchestrator/orchestrator-core/tree/main/orchestrator/api/api_v1/endpoints - Carolina notes: diff --git a/gso/migrations/versions/2023-04-28_6b8483b46d06_add_iptrunk_product.py.no b/gso/migrations/versions/2023-04-28_6b8483b46d06_add_iptrunk_product.py.no new file mode 100644 index 0000000000000000000000000000000000000000..6770a04af10af7daeac0268a9a79d4103ad0550a --- /dev/null +++ b/gso/migrations/versions/2023-04-28_6b8483b46d06_add_iptrunk_product.py.no @@ -0,0 +1,266 @@ +"""Add Iptrunk product. + +Revision ID: 6b8483b46d06 +Revises: 857225661207 +Create Date: 2023-04-28 12:35:22.996576 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '6b8483b46d06' +down_revision = '857225661207' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('Iptrunk', 'An IPtrunk (product)', 'Iptrunk', 'IPTRUNK', 'active') RETURNING products.product_id + """) + conn.execute(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('IptrunkBlock', 'An IPtrunk (productBlock)', 'IPTRUNK', 'active') RETURNING product_blocks.product_block_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_iface', 'B-side: LAG interface name') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_ipv4_network', 'Global: IPv4 network') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_members', 'A-side: LAG members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_iface', 'A-side: LAG interface name') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_members', 'B-side: LAG members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_geant_a_sid', 'A-side: GA identifier for the LAG') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('geant_s_sid', 'Global: Service ID for the trunk') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_description', 'Global: LAG human interface description') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_fqdn', 'A-side: router FQDN') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_geant_a_sid', 'B-side: GA identifier for the LAG') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_speed', 'Global: LAG''s members speed') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_ipv6_network', 'Global: IPv6 network') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_minimum_links', 'Global: minimum links for the LAG') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_fqdn', 'B-side: router FQDN') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_members_description', 'B-side: human interface description for LAG''s members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_members_description', 'A-side: human interface description for LAG''s members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_type', 'Global: dark fiber vs leased lines') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO product_product_blocks (product_id, product_block_id) VALUES ((SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_fqdn'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_fqdn'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description'))) + """) + + +def downgrade() -> None: + conn = op.get_bind() + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_fqdn')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_fqdn')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_fqdn')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_fqdn')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description')) + """) + conn.execute(""" +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_sideB_ae_iface', 'iptrunk_ipv4_network', 'iptrunk_sideA_ae_members', 'iptrunk_sideA_ae_iface', 'iptrunk_sideB_ae_members', 'iptrunk_sideA_ae_geant_a_sid', 'geant_s_sid', 'iptrunk_description', 'iptrunk_sideA_fqdn', 'iptrunk_sideB_ae_geant_a_sid', 'iptrunk_speed', 'iptrunk_ipv6_network', 'iptrunk_minimum_links', 'iptrunk_sideB_fqdn', 'iptrunk_sideB_ae_members_description', 'iptrunk_sideA_ae_members_description', 'iptrunk_type')) + """) + conn.execute(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface', 'iptrunk_ipv4_network', 'iptrunk_sideA_ae_members', 'iptrunk_sideA_ae_iface', 'iptrunk_sideB_ae_members', 'iptrunk_sideA_ae_geant_a_sid', 'geant_s_sid', 'iptrunk_description', 'iptrunk_sideA_fqdn', 'iptrunk_sideB_ae_geant_a_sid', 'iptrunk_speed', 'iptrunk_ipv6_network', 'iptrunk_minimum_links', 'iptrunk_sideB_fqdn', 'iptrunk_sideB_ae_members_description', 'iptrunk_sideA_ae_members_description', 'iptrunk_type') + """) + conn.execute(""" +DELETE FROM product_product_blocks WHERE product_product_blocks.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock')) + """) + conn.execute(""" +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 ('IptrunkBlock')) + """) + conn.execute(""" +DELETE FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock') + """) + conn.execute(""" +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 ('Iptrunk')))) + """) + conn.execute(""" +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 ('Iptrunk'))) + """) + conn.execute(""" +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 ('Iptrunk'))) + """) + conn.execute(""" +DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')) + """) + conn.execute(""" +DELETE FROM products WHERE products.name IN ('Iptrunk') + """) diff --git a/gso/migrations/versions/2023-04-28_95cd21cb2b05_add_iptrunk_create_workflows.py.no b/gso/migrations/versions/2023-04-28_95cd21cb2b05_add_iptrunk_create_workflows.py.no new file mode 100644 index 0000000000000000000000000000000000000000..8b007e17edb7f0846d183d7caff964a84e233baf --- /dev/null +++ b/gso/migrations/versions/2023-04-28_95cd21cb2b05_add_iptrunk_create_workflows.py.no @@ -0,0 +1,39 @@ +"""add IPtrunk create workflows. + +Revision ID: 95cd21cb2b05 +Revises: 6b8483b46d06 +Create Date: 2023-04-28 12:37:36.801782 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '95cd21cb2b05' +down_revision = '6b8483b46d06' +branch_labels = None +depends_on = None + + +from orchestrator.migrations.helpers import create_workflow, delete_workflow + +new_workflows = [ + { + "name": "create_iptrunk", + "target": "CREATE", + "description": "Create Iptrunk", + "product_type": "Iptrunk" + } +] + + +def upgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + create_workflow(conn, workflow) + + +def downgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + delete_workflow(conn, workflow["name"]) diff --git a/gso/migrations/versions/2023-04-29_60d340427471_add_iptrunk_create_workflow.py b/gso/migrations/versions/2023-04-29_60d340427471_add_iptrunk_create_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..72b4886c489233c2563c1a3ae2be4d73ee376f8a --- /dev/null +++ b/gso/migrations/versions/2023-04-29_60d340427471_add_iptrunk_create_workflow.py @@ -0,0 +1,39 @@ +"""add Iptrunk create workflow. + +Revision ID: 60d340427471 +Revises: 80b0a70d4faf +Create Date: 2023-04-29 06:25:49.525661 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '60d340427471' +down_revision = '80b0a70d4faf' +branch_labels = None +depends_on = None + + +from orchestrator.migrations.helpers import create_workflow, delete_workflow + +new_workflows = [ + { + "name": "create_iptrunk", + "target": "CREATE", + "description": "Create Iptrunk", + "product_type": "Iptrunk" + } +] + + +def upgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + create_workflow(conn, workflow) + + +def downgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + delete_workflow(conn, workflow["name"]) diff --git a/gso/migrations/versions/2023-04-29_80b0a70d4faf_add_iptrunk_product.py b/gso/migrations/versions/2023-04-29_80b0a70d4faf_add_iptrunk_product.py new file mode 100644 index 0000000000000000000000000000000000000000..c191b3248bf4599ea67d602549a39c80d190d84d --- /dev/null +++ b/gso/migrations/versions/2023-04-29_80b0a70d4faf_add_iptrunk_product.py @@ -0,0 +1,248 @@ +"""Add Iptrunk product. + +Revision ID: 80b0a70d4faf +Revises: 95cd21cb2b05 +Create Date: 2023-04-29 06:16:26.665297 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '80b0a70d4faf' +down_revision = '857225661207' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(""" +INSERT INTO products (name, description, product_type, tag, status) VALUES ('Iptrunk', 'IPtrunk', 'Iptrunk', 'IPTRUNK', 'active') RETURNING products.product_id + """) + conn.execute(""" +INSERT INTO product_blocks (name, description, tag, status) VALUES ('IptrunkBlock', 'Iptrunk', 'IPTRUNK', 'active') RETURNING product_blocks.product_block_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_ipv4_network', 'Global - IPv4 Network') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_iface', 'SideB - LAG interface') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_minimum_links', 'Global - Minimum links') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_iface', 'SideA - LAG interface') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_type', 'Global - dark fiber vs leased capacity') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_members', 'Side A - LAG members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_members_description', 'Side B - LAG members description') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_speed', 'Global - Members speed') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('geant_s_sid', 'Global - SID of the service') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_description', 'Global - Interface description') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_ipv6_network', 'Global - IPv6 Network') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_geant_a_sid', 'Side A - GA SID') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_members', 'Side B - LAG members') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideA_ae_members_description', 'Side B - LAG members description') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('iptrunk_sideB_ae_geant_a_sid', 'Side B - GA SID') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO product_product_blocks (product_id, product_block_id) VALUES ((SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('DeviceBlock'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members'))) + """) + conn.execute(""" +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 ('IptrunkBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description'))) + """) + + +def downgrade() -> None: + conn = op.get_bind() + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('geant_s_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_description')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_type')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_speed')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_minimum_links')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv6_network')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideA_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_iface')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_geant_a_sid')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description')) + """) + conn.execute(""" +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 ('IptrunkBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_sideB_ae_members_description')) + """) + conn.execute(""" +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_ipv4_network', 'iptrunk_sideB_ae_iface', 'iptrunk_minimum_links', 'iptrunk_sideA_ae_iface', 'iptrunk_type', 'iptrunk_sideA_ae_members', 'iptrunk_sideB_ae_members_description', 'iptrunk_speed', 'geant_s_sid', 'iptrunk_description', 'iptrunk_ipv6_network', 'iptrunk_sideA_ae_geant_a_sid', 'iptrunk_sideB_ae_members', 'iptrunk_sideA_ae_members_description', 'iptrunk_sideB_ae_geant_a_sid')) + """) + conn.execute(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('iptrunk_ipv4_network', 'iptrunk_sideB_ae_iface', 'iptrunk_minimum_links', 'iptrunk_sideA_ae_iface', 'iptrunk_type', 'iptrunk_sideA_ae_members', 'iptrunk_sideB_ae_members_description', 'iptrunk_speed', 'geant_s_sid', 'iptrunk_description', 'iptrunk_ipv6_network', 'iptrunk_sideA_ae_geant_a_sid', 'iptrunk_sideB_ae_members', 'iptrunk_sideA_ae_members_description', 'iptrunk_sideB_ae_geant_a_sid') + """) + conn.execute(""" +DELETE FROM product_product_blocks WHERE product_product_blocks.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock')) + """) + conn.execute(""" +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 ('IptrunkBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('DeviceBlock')) + """) + conn.execute(""" +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 ('IptrunkBlock')) + """) + conn.execute(""" +DELETE FROM product_blocks WHERE product_blocks.name IN ('IptrunkBlock') + """) + conn.execute(""" +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 ('Iptrunk')))) + """) + conn.execute(""" +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 ('Iptrunk'))) + """) + conn.execute(""" +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 ('Iptrunk'))) + """) + conn.execute(""" +DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Iptrunk')) + """) + conn.execute(""" +DELETE FROM products WHERE products.name IN ('Iptrunk') + """) diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index faea14f28c21e6203994aa624d0fa6ed293d8046..689013e2bde1278b97268353b13df69577380439 100644 --- a/gso/oss-params-example.json +++ b/gso/oss-params-example.json @@ -23,5 +23,10 @@ "V6": {"containers": ["dead:beef::/64"], "mask": 126}, "domain_name": ".geantip" } + }, + "PROVISIONING_PROXY": { + "api_base": "http://localhost:44444", + "auth": "Bearer <token>", + "api_version": 1123 } } \ No newline at end of file diff --git a/gso/products/__init__.py b/gso/products/__init__.py index e9a3658f1111f568b9460d58ec12aa893e255773..b8b60c156ba992f6394d41035f9b66b3b3645fbd 100644 --- a/gso/products/__init__.py +++ b/gso/products/__init__.py @@ -1,10 +1,12 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY from gso.products.product_types.device import Device +from gso.products.product_types.iptrunk import Iptrunk SUBSCRIPTION_MODEL_REGISTRY.update( { "Router": Device, "Switch": Device, + "Iptrunk": Iptrunk, } ) diff --git a/gso/products/product_blocks/iptrunk.py b/gso/products/product_blocks/iptrunk.py new file mode 100644 index 0000000000000000000000000000000000000000..f2c882bf9a68680c786f9c25ec00b2b838471d7d --- /dev/null +++ b/gso/products/product_blocks/iptrunk.py @@ -0,0 +1,87 @@ +from typing import Optional +from pydantic import Field + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.types import SubscriptionLifecycle, strEnum +from gso.products.product_blocks.device \ + import DeviceBlock, DeviceBlockInactive, DeviceBlockProvisioning +import ipaddress + + +class IptrunkType(strEnum): + Dark_fiber = "Dark_fiber" + Leased = "Leased" + + +class IptrunkBlockInactive(ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="IptrunkBlock"): + geant_s_sid: Optional[str] = None + iptrunk_description: Optional[str] = None + iptrunk_type: Optional[IptrunkType] = None + iptrunk_speed: Optional[str] = None + iptrunk_minimum_links: Optional[int] = None + iptrunk_ipv4_network: Optional[ipaddress.IPv4Network] = None + iptrunk_ipv6_network: Optional[ipaddress.IPv6Network] = None + # + iptrunk_sideA_node: DeviceBlockInactive + iptrunk_sideA_ae_iface: Optional[str] = None + iptrunk_sideA_ae_geant_a_sid: Optional[str] = None + iptrunk_sideA_ae_members: Optional[list] = None + iptrunk_sideA_ae_members_description: Optional[list] = None + # + iptrunk_sideB_node: DeviceBlockInactive + iptrunk_sideB_ae_iface: Optional[str] = None + iptrunk_sideB_ae_geant_a_sid: Optional[str] = None + iptrunk_sideB_ae_members: Optional[list] = None + iptrunk_sideB_ae_members_description: Optional[list] = None + + +class IptrunkBlockProvisioning(IptrunkBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): + geant_s_sid: Optional[str] = None + iptrunk_description: Optional[str] = None + iptrunk_type: Optional[IptrunkType] = None + iptrunk_speed: Optional[str] = None + iptrunk_minimum_links: Optional[int] = None + iptrunk_ipv4_network: Optional[ipaddress.IPv4Network] = None + iptrunk_ipv6_network: Optional[ipaddress.IPv6Network] = None + # + iptrunk_sideA_node: DeviceBlockProvisioning + iptrunk_sideA_ae_iface: Optional[str] = None + iptrunk_sideA_ae_geant_a_sid: Optional[str] = None + iptrunk_sideA_ae_members: list[str] = Field(default_factory=list) + iptrunk_sideA_ae_members_description: list[str] = Field( + default_factory=list) + # + iptrunk_sideB_node: DeviceBlockProvisioning + iptrunk_sideB_ae_iface: Optional[str] = None + iptrunk_sideB_ae_geant_a_sid: Optional[str] = None + iptrunk_sideB_ae_members: list[str] = Field(default_factory=list) + iptrunk_sideB_ae_members_description: list[str] = Field( + default_factory=list) + + +class IptrunkBlock(IptrunkBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): + geant_s_sid: str + iptrunk_description: str + iptrunk_type: IptrunkType + iptrunk_speed: str + iptrunk_minimum_links: int + iptrunk_ipv4_network: ipaddress.IPv4Network + iptrunk_ipv6_network: ipaddress.IPv6Network + # + iptrunk_sideA_node: DeviceBlock + iptrunk_sideA_ae_iface: str + iptrunk_sideA_ae_geant_a_sid: str + iptrunk_sideA_ae_members: list[str] = Field(default_factory=list) + iptrunk_sideA_ae_members_description: list[str] = Field( + default_factory=list) + # + iptrunk_sideB_node: DeviceBlock + iptrunk_sideB_ae_iface: str + iptrunk_sideB_ae_geant_a_sid: str + iptrunk_sideB_ae_members: list[str] = Field(default_factory=list) + iptrunk_sideB_ae_members_description: list[str] = Field( + default_factory=list) diff --git a/gso/products/product_types/iptrunk.py b/gso/products/product_types/iptrunk.py new file mode 100644 index 0000000000000000000000000000000000000000..d12e010850cedc8d1f98fd2d38c33d4972b8fd50 --- /dev/null +++ b/gso/products/product_types/iptrunk.py @@ -0,0 +1,18 @@ +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle + +from gso.products.product_blocks.iptrunk \ + import IptrunkBlock, IptrunkBlockInactive, IptrunkBlockProvisioning + + +class IptrunkInactive(SubscriptionModel, is_base=True): + iptrunk: IptrunkBlockInactive + + +class IptrunkProvisioning(IptrunkInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): + iptrunk: IptrunkBlockProvisioning + + +class Iptrunk(IptrunkProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + iptrunk: IptrunkBlock diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index d06bfafad2f2e0948a9f11fe05e9dbbc8beaa290..ec282b84bba0fcd3e39d0729fd3760312de9d1c7 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -1,17 +1,24 @@ +import logging + from gso.products.product_types.device \ import DeviceBlock from gso import settings -import requests +# import requests + +logger = logging.getLogger(__name__) def provision_node( node_subscription_params: DeviceBlock, - dry_run: bool = False): + dry_run: bool = True): oss = settings.load_oss_params() pp_params = oss.PROVISIONING_PROXY assert pp_params - r = requests.get( - f'https://{pp_params.api_base}' - f'/api/version', - params=node_subscription_params.dict()) - r.raise_for_status() + + logger.debug(f'[disabled] provisioning node {node_subscription_params}') + + # r = requests.get( + # f'https://{pp_params.api_base}' + # f'/api/version', + # params=node_subscription_params.dict()) + # r.raise_for_status() diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py index d93b338a9c01be9a2e5c3fee0c46f341ef5c98ae..1ba2f18de70941af6c1fe471b8fe5d932280d8df 100644 --- a/gso/workflows/__init__.py +++ b/gso/workflows/__init__.py @@ -1,5 +1,7 @@ from orchestrator.workflows import LazyWorkflowInstance -LazyWorkflowInstance("workflows.device.create_device", "create_device") -LazyWorkflowInstance("workflows.device.terminate_device", "terminate_device") -LazyWorkflowInstance("workflows.device.get_facts", "get_facts") +LazyWorkflowInstance("gso.workflows.device.create_device", "create_device") +LazyWorkflowInstance("gso.workflows.device.terminate_device", + "terminate_device") +LazyWorkflowInstance("gso.workflows.device.get_facts", "get_facts") +LazyWorkflowInstance("gso.workflows.iptrunk.create_iptrunk", "create_iptrunk") diff --git a/gso/workflows/device/__init__.py b/gso/workflows/device/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index 19d06a7d5ff160491dc24b255d317b3e123029ae..d3e0bfd0055f56688cfc01a32b0697e852dee0d8 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -12,7 +12,7 @@ from orchestrator.workflows.steps import resync, set_status from orchestrator.workflows.steps import store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form from gso.products.product_types import device -from gso.services import ipam, provisioning_proxy +# from gso.services import ipam, provisioning_proxy def initial_input_form_generator(product_name: str) -> FormGenerator: @@ -42,10 +42,12 @@ def create_subscription(product: UUIDstr) -> State: @step("Get information from IPAM ") def get_info_from_ipam(subscription: device.DeviceInactive) -> State: - lo = ipam.new_device_lo_address() - subscription.device.lo_ipv4_address = lo.v4 - subscription.device.lo_ipv6_address = lo.v6 + # lo = ipam.new_device_lo_address() + # subscription.device.lo_ipv4_address = lo.v4 + # subscription.device.lo_ipv6_address = lo.v6 # TODO: get info about how these should be generated + subscription.device.lo_ipv4_address = "10.10.10.10" + subscription.device.lo_ipv6_address = "fc00:798:10::10" subscription.device.lo_iso_address = "49.51e5.0001.0620.4009.6047.00" subscription.device.si_ipv4_network = "192.168.0.0/31" subscription.device.ias_lt_ipv4_network = "192.168.1.0/31" @@ -123,11 +125,11 @@ def provision_device_dry( # # if r.rc != 0: # # raise ValueError("Ansible has failed") # return {"dry_run_output": out_splitted, "return_code": r.rc} - provisioning_proxy.provision_node( - node_subscription_params=subscription, - dry_run=True) - # TODO: figure out what to return when we are suspending & waiting - # for the provisioning-proxy to call back + # provisioning_proxy.provision_node( + # node_subscription_params=subscription, + # dry_run=True) + # TODO: figure out what to return when we are suspending & waiting + # for the provisioning-proxy to call back return {"return_code": 0} @@ -170,8 +172,8 @@ def provision_device_real( # out_splitted = out.splitlines() # # return {"real_run_output": out_splitted, "return_code": r.rc} - provisioning_proxy.provision_node( - node_subscription_params=subscription) + # provisioning_proxy.provision_node( + # node_subscription_params=subscription) # TODO: figure out what to return when we are suspending & waiting # for the provisioning-proxy to call back return {"return_code": 0} diff --git a/gso/workflows/device/get_facts.py b/gso/workflows/device/get_facts.py index 6cc1cbe21da2acb7e90af1a306bf7855e507af30..024631740dfbfacd229a1d442d26c0d274af5e8e 100644 --- a/gso/workflows/device/get_facts.py +++ b/gso/workflows/device/get_facts.py @@ -12,7 +12,7 @@ from orchestrator.workflow import done, init, step, workflow # ) from orchestrator.workflows.utils import wrap_modify_initial_input_form -from products import Device +from gso.products.product_types.device import Device def initial_input_form_generator( diff --git a/gso/workflows/iptrunk/__init__.py b/gso/workflows/iptrunk/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py new file mode 100644 index 0000000000000000000000000000000000000000..e4205e111c699e8fbf3992a02eb4732b628e3cc8 --- /dev/null +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -0,0 +1,249 @@ +# import ipaddress +from uuid import uuid4 + +from orchestrator.forms import FormPage +from orchestrator.targets import Target +from orchestrator.workflow import inputstep +from orchestrator.forms.validators import Accept +from orchestrator.types import FormGenerator, State +from orchestrator.types import SubscriptionLifecycle, UUIDstr +from orchestrator.workflow import done, init, step, workflow +from orchestrator.workflows.steps import resync, set_status +from orchestrator.workflows.steps import store_process_subscription +from orchestrator.workflows.utils import wrap_create_initial_input_form +from gso.products.product_types import iptrunk +from gso.products.product_blocks import iptrunk as iptrunk_pb +from gso.products.product_types.device import Device +# from gso.services import ipam, provisioning_proxy + +# from gso.products.product_types import device +from orchestrator.db.models import ProductTable, SubscriptionTable +from orchestrator.forms.validators import Choice, choice_list + + +def device_selector(choice_value: str) -> list: + device_subscriptions = {} + for device_id, device_description in ( + SubscriptionTable.query.join(ProductTable) + .filter( + ProductTable.product_type == "Device", + SubscriptionTable.status == "active", + ) + .with_entities(SubscriptionTable.subscription_id, + SubscriptionTable.description) + .all() + ): + device_subscriptions[str(device_id)] = device_description + + return choice_list( + Choice(choice_value, zip(device_subscriptions.keys(), + device_subscriptions.items())), # type:ignore + min_items=1, + max_items=1, + ) + + +def initial_input_form_generator(product_name: str) -> FormGenerator: + class CreateIptrunkForm(FormPage): + class Config: + title = product_name + + geant_s_sid: str + iptrunk_description: str + iptrunk_type: iptrunk_pb.IptrunkType + iptrunk_speed: str # This should be an enum: 1/10/100/400 + iptrunk_minimum_links: int + + iptrunk_sideA_node_id: device_selector( + choice_value='DeviceEnumA') # noqa: F821 + iptrunk_sideA_ae_iface: str + iptrunk_sideA_ae_geant_a_sid: str + iptrunk_sideA_ae_members: list[str] + iptrunk_sideA_ae_members_descriptions: list[str] + + iptrunk_sideB_node_id: device_selector( + choice_value='DeviceEnumB') # noqa: F821 + iptrunk_sideB_ae_iface: str + iptrunk_sideB_ae_geant_a_sid: str + iptrunk_sideB_ae_members: list[str] + iptrunk_sideB_ae_members_descriptions: list[str] + # TODO: we need additional validation: + # sideA fqdn must be different from sideB fqdn + # the lenght of iptrunk_sideA_ae_members should + # be the same as iptrunk_sideA_ae_members + # interface names must be validated + + user_input = yield CreateIptrunkForm + + return user_input.dict() + + +@step("Create subscription") +def create_subscription(product: UUIDstr) -> State: + subscription = iptrunk.IptrunkInactive.from_product_id(product, uuid4()) + + return { + "subscription": subscription, + "subscription_id": subscription.subscription_id, + } + + +@step("Get information from IPAM ") +def get_info_from_ipam(subscription: iptrunk.IptrunkInactive) -> State: + # TODO: get info about how these should be generated + subscription.iptrunk.iptrunk_ipv4_network = "192.168.1.0/31" + subscription.iptrunk.iptrunk_ipv6_network = "fc00:798:1::150/126" + return {"subscription": subscription} + + +@step("Initialize subscription") +def initialize_subscription( + subscription: iptrunk.IptrunkInactive, + geant_s_sid: str, + iptrunk_type: iptrunk_pb.IptrunkType, + iptrunk_description: str, + iptrunk_speed: str, + iptrunk_minimum_links: int, + iptrunk_sideA_node_id: str, + iptrunk_sideA_ae_iface: str, + iptrunk_sideA_ae_geant_a_sid: str, + iptrunk_sideA_ae_members: list[str], + iptrunk_sideA_ae_members_descriptions: list[str], + iptrunk_sideB_node_id: str, + iptrunk_sideB_ae_iface: str, + iptrunk_sideB_ae_geant_a_sid: str, + iptrunk_sideB_ae_members: list[str], + iptrunk_sideB_ae_members_descriptions: list[str] +) -> State: + subscription.iptrunk.geant_s_sid = geant_s_sid + subscription.iptrunk.iptrunk_description = iptrunk_description + subscription.iptrunk.iptrunk_type = iptrunk_type + subscription.iptrunk.iptrunk_speed = iptrunk_speed + subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links + + subscription.iptrunk.iptrunk_sideA_node = Device.from_subscription( + iptrunk_sideA_node_id[0]).device + subscription.iptrunk.iptrunk_sideA_ae_iface = iptrunk_sideA_ae_iface + subscription.iptrunk.iptrunk_sideA_ae_geant_a_sid \ + = iptrunk_sideA_ae_geant_a_sid + subscription.iptrunk.iptrunk_sideA_ae_members = iptrunk_sideA_ae_members + subscription.iptrunk.iptrunk_sideA_ae_members_description \ + = iptrunk_sideA_ae_members_descriptions + + subscription.iptrunk.iptrunk_sideB_node = Device.from_subscription( + iptrunk_sideB_node_id[0]).device + subscription.iptrunk.iptrunk_sideB_ae_iface \ + = iptrunk_sideB_ae_iface + subscription.iptrunk.iptrunk_sideB_ae_geant_a_sid \ + = iptrunk_sideB_ae_geant_a_sid + subscription.iptrunk.iptrunk_sideB_ae_members = iptrunk_sideB_ae_members + subscription.iptrunk.iptrunk_sideB_ae_members_description \ + = iptrunk_sideB_ae_members_descriptions + + subscription.description = f"Iptrunk {geant_s_sid}: \ + (blablabla)" + subscription = iptrunk.IptrunkProvisioning.from_other_lifecycle( + subscription, SubscriptionLifecycle.PROVISIONING + ) + + return {"subscription": subscription} + + +@step("Provision iptrunk [DRY RUN]") +def provision_iptrunk_dry( + subscription: iptrunk.IptrunkProvisioning, +) -> State: + # import ansible_runner + # + # r = ansible_runner.run( + # private_data_dir="/opt/geant-gap-ansible", + # playbook="base_config.yaml", + # inventory=subscription.iptrunk.fqdn, + # extravars={ + # "lo_ipv4_address": str(subscription.iptrunk.lo_ipv4_address), + # "lo_ipv6_address": str(subscription.iptrunk.lo_ipv6_address), + # "lo_iso_address": subscription.iptrunk.lo_iso_address, + # "snmp_location": subscription.iptrunk.snmp_location, + # "si_ipv4_network": str(subscription.iptrunk.si_ipv4_network), + # "lt_ipv4_network": str(subscription.iptrunk.ias_lt_ipv4_network), + # "lt_ipv6_network": str(subscription.iptrunk.ias_lt_ipv6_network), + # "site_country_code": subscription.iptrunk.site_country_code, + # "verb": "deploy", + # }, + # ) + # out = r.stdout.read() + # out_splitted = out.splitlines() + # # if r.rc != 0: + # # raise ValueError("Ansible has failed") + # return {"dry_run_output": out_splitted, "return_code": r.rc} + # provisioning_proxy.provision_node( + # node_subscription_params=subscription, + # dry_run=True) + # TODO: figure out what to return when we are suspending & waiting + # for the provisioning-proxy to call back + return {"return_code": 0} + + +@inputstep("Confirm step", assignee="CHANGES") +def confirm_step() -> FormGenerator: + class ConfirmForm(FormPage): + confirm: Accept + + user_input = yield ConfirmForm + + return {"confirm": user_input.confirm} + + +@step("Provision iptrunk [FOR REAL]") +def provision_iptrunk_real( + subscription: iptrunk.IptrunkProvisioning, +) -> State: + # import ansible_runner + # + # r = ansible_runner.run( + # private_data_dir="/opt/geant-gap-ansible", + # playbook="base_config.yaml", + # inventory=subscription.iptrunk.fqdn, + # extravars={ + # "lo_ipv4_address": str(subscription.iptrunk.lo_ipv4_address), + # "lo_ipv6_address": str(subscription.iptrunk.lo_ipv6_address), + # "lo_iso_address": subscription.iptrunk.lo_iso_address, + # "snmp_location": subscription.iptrunk.snmp_location, + # "si_ipv4_network": str(subscription.iptrunk.si_ipv4_network), + # "lt_ipv4_network": str(subscription.iptrunk.ias_lt_ipv4_network), + # "lt_ipv6_network": str(subscription.iptrunk.ias_lt_ipv6_network), + # "site_country_code": subscription.iptrunk.site_country_code, + # "verb": "deploy", + # }, + # ) + # out = r.stdout.read() + # out_splitted = out.splitlines() + # + # # return {"real_run_output": out_splitted, "return_code": r.rc} + # provisioning_proxy.provision_node( + # node_subscription_params=subscription) + # TODO: figure out what to return when we are suspending & waiting + # for the provisioning-proxy to call back + return {"return_code": 0} + + +@workflow( + "Create Iptrunk", + initial_input_form=wrap_create_initial_input_form( + initial_input_form_generator), + target=Target.CREATE, +) +def create_iptrunk(): + return ( + init + >> create_subscription + >> store_process_subscription(Target.CREATE) + >> get_info_from_ipam + >> initialize_subscription + >> provision_iptrunk_dry + >> confirm_step + >> provision_iptrunk_real + >> set_status(SubscriptionLifecycle.ACTIVE) + >> resync + >> done + ) diff --git a/requirements.txt b/requirements.txt index b575b478f50d48470257314b85f5d13a3aea56c7..243292eec5c1bf77b11fc4166714d056f98fd313 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -orchestrator-core +orchestrator-core==1.0.0 requests pytest diff --git a/setup.py b/setup.py index 949282d14ef8f9aff6e2b3d6e674715a25c041f7..50d3dc63c04f6f68ec902ab6478942f252c4dc40 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ setup( url=('https://gitlab.geant.org/goat/geant-service-orchestrator'), packages=find_packages(), install_requires=[ - 'orchestrator-core', + 'requests', + 'orchestrator-core==1.0.0', ] )