diff --git a/gso/migrations/versions/2025-05-28_90547df711c3_backfill_iptrunk_config_version.py b/gso/migrations/versions/2025-05-28_90547df711c3_backfill_iptrunk_config_version.py new file mode 100644 index 0000000000000000000000000000000000000000..4915aadf90b847b0479f80afdc47a62f548fa81b --- /dev/null +++ b/gso/migrations/versions/2025-05-28_90547df711c3_backfill_iptrunk_config_version.py @@ -0,0 +1,48 @@ +"""empty message. + +Revision ID: 90547df711c3 +Revises: 54477431c9ef +Create Date: 2025-05-28 10:15:07.579188 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '90547df711c3' +down_revision = '54477431c9ef' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +WITH rt_id AS ( + SELECT resource_type_id FROM resource_types WHERE resource_type = 'iptrunk_config_version' +) +INSERT INTO subscription_instance_values (subscription_instance_id, resource_type_id, value) +SELECT si.subscription_instance_id, rt_id.resource_type_id, '1.0' +FROM rt_id, subscription_instances si +WHERE si.product_block_id = ( + SELECT product_block_id FROM product_blocks WHERE name = 'IptrunkBlock' +); + """)) + + +def downgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +WITH rt_id AS ( + SELECT resource_type_id FROM resource_types WHERE resource_type = 'iptrunk_config_version' +) +DELETE FROM subscription_instance_values +WHERE resource_type_id = (SELECT resource_type_id FROM rt_id) + AND value = '1.0' + AND subscription_instance_id IN ( + SELECT subscription_instance_id FROM subscription_instances + WHERE product_block_id = ( + SELECT product_block_id FROM product_blocks WHERE name = 'IptrunkBlock' + ) + ); + """)) diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index 2b60d84c809b1911bd081782821f83f0670d2d73..98e41280d1f1d47480b64702d2d587452d846d08 100644 --- a/gso/oss-params-example.json +++ b/gso/oss-params-example.json @@ -134,15 +134,15 @@ "SERVICE_VERSIONS": { "IP_TRUNK": { "version": { - "1.0": "Base Version", - "1.1": "Minor Upgrade" + "1.0": "1.0 - Base Version", + "2.0": "2.0 - Minor Upgrade" }, "default_version": "1.0" }, "GEANT_IP": { "version": { - "1.0": "Base Version", - "2.0": "Major Upgrade" + "1.0": "1.0 - Base Version", + "2.0": "2.0 - Minor Upgrade" }, "default_version": "1.0" } diff --git a/gso/utils/helpers.py b/gso/utils/helpers.py index 9a73d9c78581666645961ff08b70944446c6b8b7..fc4c5dee2c279d9007965a488f721ea78f32e9f7 100644 --- a/gso/utils/helpers.py +++ b/gso/utils/helpers.py @@ -283,16 +283,13 @@ def active_edge_port_selector(*, partner_id: UUIDstr | None = None) -> TypeAlias ) -def ip_trunk_service_version_selector() -> TypeAlias: +def ip_trunk_service_version_selector() -> Choice: """Generate a dropdown selector for choosing a service version.""" iptrunk_versions = load_oss_params().SERVICE_VERSIONS.IP_TRUNK.version - return cast( - type[Choice], - Choice.__call__( - "Select an IP trunk service version.", - [(k, f"Version {k} - {iptrunk_versions[k]}") for k in iptrunk_versions], - ), + return Choice( + "Select an IP trunk service version.", + zip(iptrunk_versions.keys(), iptrunk_versions.items(), strict=True), # type: ignore[arg-type] ) diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py index 851c3e3081ebc021457d052af8525c63a58cbee0..9e3b297efd94b62581859a7a767d5adaae1dee5d 100644 --- a/test/workflows/iptrunk/test_create_iptrunk.py +++ b/test/workflows/iptrunk/test_create_iptrunk.py @@ -74,7 +74,7 @@ def input_form_wizard_data(request, router_subscription_factory, faker): "iptrunk_speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND, "iptrunk_number_of_members": 2, "iptrunk_description_suffix": faker.word(), - "iptrunk_config_version": "Version 1.0 - Base Version", + "iptrunk_config_version": "1.0", } create_ip_trunk_confirm_step = {"iptrunk_minimum_links": 1} create_ip_trunk_side_a_router_name = {"side_a_node_id": router_side_a} @@ -158,6 +158,7 @@ def test_successful_iptrunk_creation_with_standard_lso_result( f"{input_form_wizard_data[0]["iptrunk_description_suffix"]}, " f"{subscription.iptrunk.gs_id}" ) + assert subscription.iptrunk.iptrunk_config_version == input_form_wizard_data[0]["iptrunk_config_version"] # We search for 6 hosts in total, 2 in a /31 and 4 in a /126 assert mock_find_host_by_ip.call_count == 6 diff --git a/test/workflows/iptrunk/test_modify_trunk_interface.py b/test/workflows/iptrunk/test_modify_trunk_interface.py index 7c11c95518cf002c25c5178966b5f1706028cdfb..b6117a8c3161a2c19d822f1b5acf026b265b36db 100644 --- a/test/workflows/iptrunk/test_modify_trunk_interface.py +++ b/test/workflows/iptrunk/test_modify_trunk_interface.py @@ -222,6 +222,7 @@ def test_iptrunk_modify_trunk_interface_success( assert subscription.iptrunk.iptrunk_minimum_links == input_form_iptrunk_data[1]["iptrunk_number_of_members"] - 1 assert subscription.iptrunk.iptrunk_sides[0].ga_id == new_side_a_gid assert subscription.iptrunk.iptrunk_description_suffix == input_form_iptrunk_data[1]["iptrunk_description_suffix"] + assert subscription.iptrunk.iptrunk_config_version == input_form_iptrunk_data[1]["iptrunk_config_version"] def _find_interface_by_name(interfaces: list[dict], name: str): for interface in interfaces: