diff --git a/Changelog.md b/Changelog.md index e88b0515ae3bf8c12debdf90aa836c8e1bb8a8fc..6a9206e1dd3b14427089b11501ac23acbe81f4ff 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,38 +1,41 @@ # Changelog -# [3.10] - 2025-06-17 -- Added parallelized massive base config redeploy +## [3.11] - 2025-06-18 +- Update subscription descriptions for Layer 2 Circuit products. + +## [3.10] - 2025-06-17 +- Added parallelized massive base config redeploy. - Added and integrated R&E Peer and R&E LHCONE workflows, product types, and related migrations. -# [3.9] - 2025-06-05 +## [3.9] - 2025-06-05 - Add threshold input for BGP routes in L3 Core migration workflows and forward the value to Moodi. -# [3.8] - 2025-05-28 -- Add backfill service version for IP Trunks +## [3.8] - 2025-05-28 +- Add backfill service version for IP Trunks. -# [3.7] - 2025-05-26 -- Add service version for IP Trunks +## [3.7] - 2025-05-26 +- Add service version for IP Trunks. -# [3.6] - 2025-05-15 +## [3.6] - 2025-05-15 - Stop validating Edge Ports that are on a Juniper router. - Allow skipping Ansible steps in the Edge Port termination workflow. - Update translations. -# [3.5] - 2025-05-12 +## [3.5] - 2025-05-12 - Add a new CLI command for interacting with the task scheduler. - Fix a bug in the subscription validation task. -# [3.4] - 2025-05-08 +## [3.4] - 2025-05-08 - Fix some bugs in the nightly validation schedule. -# [3.3] - 2025-05-07 +## [3.3] - 2025-05-07 - Fix CLI bug for importing L3 core services. -# [3.2] - 2025-05-02 +## [3.2] - 2025-05-02 - Allow running the Edge Port modification workflow on Juniper routers. - Update labels of IAS flavors. -# [3.1] - 2025-04-29 +## [3.1] - 2025-04-29 - Allow running the prefix validation workflow on out-of-sync subscriptions - Only check Kentik licenses during router validation in production - Add optional TTL security field to BGP session product block diff --git a/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py b/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py new file mode 100644 index 0000000000000000000000000000000000000000..dd9826c8dcda1227396b5cc52b15d9cb47dfc9ee --- /dev/null +++ b/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py @@ -0,0 +1,54 @@ +"""Update Layer 2 Circuit subscription descriptions. + +Revision ID: 550e3aebc1c5 +Revises: d23b59abc6a5 +Create Date: 2025-06-04 16:08:56.288635 + +This database migration updates the description of all Layer2Circuit-type subscriptions by having fit the format: +``product_name - custom_service_name``. +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '550e3aebc1c5' +down_revision = 'd23b59abc6a5' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +UPDATE subscriptions s +SET description = ( + Regexp_replace(subscriptions.description, '^(.+) - .+$', '\\1 - ') || + subscription_instance_values.value + ) +FROM subscriptions + JOIN products + ON subscriptions.product_id = products.product_id + JOIN product_product_blocks + ON products.product_id = product_product_blocks.product_id + JOIN product_block_resource_types + ON product_product_blocks.product_block_id = + product_block_resource_types.product_block_id + JOIN resource_types + ON product_block_resource_types.resource_type_id = + resource_types.resource_type_id + JOIN subscription_instances + ON subscriptions.subscription_id = + subscription_instances.subscription_id + JOIN subscription_instance_values + ON ( resource_types.resource_type_id = + subscription_instance_values.resource_type_id + AND subscription_instances.subscription_instance_id = + subscription_instance_values.subscription_instance_id ) +WHERE resource_types.resource_type = 'custom_service_name' + AND products.product_type = 'Layer2Circuit' + AND s.subscription_id = subscriptions.subscription_id; + """)) + + +def downgrade() -> None: + pass diff --git a/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py b/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py index 8b835edc12ea4c87ffb22aad7308fdf625f8ba21..983657269ba7cf356441c175424be39f2d53fb42 100644 --- a/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py +++ b/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py @@ -128,7 +128,7 @@ def initialize_subscription( subscription.layer_2_circuit.bandwidth = policer_bandwidth subscription.layer_2_circuit.policer_burst_rate = policer_burst_rate subscription.layer_2_circuit.custom_service_name = custom_service_name - subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.virtual_circuit_id}" + subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}" return {"subscription": subscription} diff --git a/gso/workflows/l2_circuit/create_layer_2_circuit.py b/gso/workflows/l2_circuit/create_layer_2_circuit.py index ce70f215fa60ee80cc9a7a4f0240bec8729a370e..87265aa96f2aab9b5fc64783d912cd125de8b4ce 100644 --- a/gso/workflows/l2_circuit/create_layer_2_circuit.py +++ b/gso/workflows/l2_circuit/create_layer_2_circuit.py @@ -141,7 +141,7 @@ def initialize_subscription( subscription.layer_2_circuit.bandwidth = policer_bandwidth subscription.layer_2_circuit.policer_burst_rate = policer_burst_rate subscription.layer_2_circuit.custom_service_name = custom_service_name - subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.virtual_circuit_id}" + subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}" subscription = Layer2Circuit.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) fqdn_list = [side.sbp.edge_port.node.router_fqdn for side in subscription.layer_2_circuit.layer_2_circuit_sides] diff --git a/gso/workflows/l2_circuit/modify_layer_2_circuit.py b/gso/workflows/l2_circuit/modify_layer_2_circuit.py index ae879037c0700a515ca7d2507fbad6eba7d83715..f3ab500ea39bec1c2d8a403dc58a40ebb90deaa2 100644 --- a/gso/workflows/l2_circuit/modify_layer_2_circuit.py +++ b/gso/workflows/l2_circuit/modify_layer_2_circuit.py @@ -126,6 +126,7 @@ def modify_layer_2_circuit_subscription( subscription.layer_2_circuit.layer_2_circuit_sides[1].sbp.vlan_id = layer_2_circuit_side_b.get("vlan_id") for layer_2_circuit_side in subscription.layer_2_circuit.layer_2_circuit_sides: layer_2_circuit_side.sbp.is_tagged = layer_2_circuit_type == Layer2CircuitType.VLAN + subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}" return {"subscription": subscription} diff --git a/setup.py b/setup.py index 7074b11a0af2530071866ebc7d889539188b9c71..7a013462e2b7170b142309c2ea0c5fb685505bed 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ from setuptools import find_packages, setup setup( name="geant-service-orchestrator", - version="3.10", + version="3.11", author="GÉANT Orchestration and Automation Team", author_email="goat@geant.org", description="GÉANT Service Orchestrator",