From 35f5472a8934461bd18f116ba50a4f2a23ca4d7a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 31 Mar 2026 18:12:23 +0000 Subject: [PATCH 01/19] OFC22/ECOC22 end-to-end integration test: - Added checks to validate services are active --- src/tests/ecoc22/tests/test_functional_create_service.py | 7 ++++++- src/tests/ecoc22/tests/test_functional_delete_service.py | 6 +++++- src/tests/ofc22/tests/test_functional_create_service.py | 6 +++++- src/tests/ofc22/tests/test_functional_delete_service.py | 6 +++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/tests/ecoc22/tests/test_functional_create_service.py b/src/tests/ecoc22/tests/test_functional_create_service.py index e04d573cd..d892f5d4a 100644 --- a/src/tests/ecoc22/tests/test_functional_create_service.py +++ b/src/tests/ecoc22/tests/test_functional_create_service.py @@ -15,7 +15,7 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id @@ -67,3 +67,8 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # else: str_service = grpc_message_to_json_string(service) raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + + if service.service_status.service_status != ServiceStatusEnum.SERVICESTATUS_ACTIVE: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceStatusEnum: {:s}'.format(str_service)) + diff --git a/src/tests/ecoc22/tests/test_functional_delete_service.py b/src/tests/ecoc22/tests/test_functional_delete_service.py index 550a42656..76ce66ce8 100644 --- a/src/tests/ecoc22/tests/test_functional_delete_service.py +++ b/src/tests/ecoc22/tests/test_functional_delete_service.py @@ -15,7 +15,7 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id @@ -58,6 +58,10 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p str_service = grpc_message_to_json_string(service) raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + if service.service_status.service_status != ServiceStatusEnum.SERVICESTATUS_ACTIVE: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceStatusEnum: {:s}'.format(str_service)) + # Identify service to delete assert len(service_uuids) == 1 # assume a single L2NM service has been created service_uuid = set(service_uuids).pop() diff --git a/src/tests/ofc22/tests/test_functional_create_service.py b/src/tests/ofc22/tests/test_functional_create_service.py index eb8e07f70..fbd345156 100644 --- a/src/tests/ofc22/tests/test_functional_create_service.py +++ b/src/tests/ofc22/tests/test_functional_create_service.py @@ -15,7 +15,7 @@ import logging, os, random from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, Empty, ServiceStatusEnum, ServiceTypeEnum from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string @@ -72,6 +72,10 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # str_service = grpc_message_to_json_string(service) raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + if service.service_status.service_status != ServiceStatusEnum.SERVICESTATUS_ACTIVE: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceStatusEnum: {:s}'.format(str_service)) + def test_scenario_kpi_values_created( monitoring_client: MonitoringClient, # pylint: disable=redefined-outer-name diff --git a/src/tests/ofc22/tests/test_functional_delete_service.py b/src/tests/ofc22/tests/test_functional_delete_service.py index ef491b8f5..b12b662cf 100644 --- a/src/tests/ofc22/tests/test_functional_delete_service.py +++ b/src/tests/ofc22/tests/test_functional_delete_service.py @@ -15,7 +15,7 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id @@ -58,6 +58,10 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p str_service = grpc_message_to_json_string(service) raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + if service.service_status.service_status != ServiceStatusEnum.SERVICESTATUS_ACTIVE: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceStatusEnum: {:s}'.format(str_service)) + # Identify service to delete assert len(service_uuids) == 1 # assume a single L3NM service has been created service_uuid = set(service_uuids).pop() -- GitLab From 337f358475c06afc470f861b4265843268689040 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 09:02:04 +0000 Subject: [PATCH 02/19] OFC22/ECOC22/OFC24/OFC25 end-to-end integration test: - Fixed tests to crash with first error --- src/tests/ecoc22/Dockerfile | 1 + src/tests/ofc22/Dockerfile | 1 + src/tests/ofc24/Dockerfile | 1 + src/tests/ofc25/Dockerfile | 1 + 4 files changed, 4 insertions(+) diff --git a/src/tests/ecoc22/Dockerfile b/src/tests/ecoc22/Dockerfile index 57a39950c..a3f8af0cc 100644 --- a/src/tests/ecoc22/Dockerfile +++ b/src/tests/ecoc22/Dockerfile @@ -88,6 +88,7 @@ COPY src/tests/tools/. ./tests/tools/ RUN tee ./run_tests.sh < Date: Thu, 2 Apr 2026 09:02:49 +0000 Subject: [PATCH 03/19] Disabled unitary CI integration tests temporarily --- .gitlab-ci.yml | 76 +++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53763f5e1..6627e11cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,44 +28,44 @@ workflow: # include the individual .gitlab-ci.yml of each micro-service and tests include: - #- local: '/manifests/.gitlab-ci.yml' - - local: '/src/monitoring/.gitlab-ci.yml' - - local: '/src/nbi/.gitlab-ci.yml' - - local: '/src/context/.gitlab-ci.yml' - - local: '/src/device/.gitlab-ci.yml' - - local: '/src/service/.gitlab-ci.yml' - - local: '/src/qkd_app/.gitlab-ci.yml' - - local: '/src/dbscanserving/.gitlab-ci.yml' - - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - - local: '/src/opticalattackdetector/.gitlab-ci.yml' - - local: '/src/opticalattackmanager/.gitlab-ci.yml' - - local: '/src/opticalcontroller/.gitlab-ci.yml' - - local: '/src/ztp/.gitlab-ci.yml' - - local: '/src/policy/.gitlab-ci.yml' - - local: '/src/automation/.gitlab-ci.yml' - - local: '/src/forecaster/.gitlab-ci.yml' - #- local: '/src/webui/.gitlab-ci.yml' - #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - - local: '/src/slice/.gitlab-ci.yml' - #- local: '/src/interdomain/.gitlab-ci.yml' - - local: '/src/pathcomp/.gitlab-ci.yml' - #- local: '/src/dlt/.gitlab-ci.yml' - - local: '/src/load_generator/.gitlab-ci.yml' - - local: '/src/bgpls_speaker/.gitlab-ci.yml' - - local: '/src/kpi_manager/.gitlab-ci.yml' - - local: '/src/kpi_value_api/.gitlab-ci.yml' - #- local: '/src/kpi_value_writer/.gitlab-ci.yml' - #- local: '/src/telemetry/.gitlab-ci.yml' - - local: '/src/analytics/.gitlab-ci.yml' - - local: '/src/qos_profile/.gitlab-ci.yml' - - local: '/src/vnt_manager/.gitlab-ci.yml' - - local: '/src/e2e_orchestrator/.gitlab-ci.yml' - - local: '/src/ztp_server/.gitlab-ci.yml' - - local: '/src/osm_client/.gitlab-ci.yml' - - local: '/src/simap_connector/.gitlab-ci.yml' - - local: '/src/pluggables/.gitlab-ci.yml' +# #- local: '/manifests/.gitlab-ci.yml' +# - local: '/src/monitoring/.gitlab-ci.yml' +# - local: '/src/nbi/.gitlab-ci.yml' +# - local: '/src/context/.gitlab-ci.yml' +# - local: '/src/device/.gitlab-ci.yml' +# - local: '/src/service/.gitlab-ci.yml' +# - local: '/src/qkd_app/.gitlab-ci.yml' +# - local: '/src/dbscanserving/.gitlab-ci.yml' +# - local: '/src/opticalattackmitigator/.gitlab-ci.yml' +# - local: '/src/opticalattackdetector/.gitlab-ci.yml' +# - local: '/src/opticalattackmanager/.gitlab-ci.yml' +# - local: '/src/opticalcontroller/.gitlab-ci.yml' +# - local: '/src/ztp/.gitlab-ci.yml' +# - local: '/src/policy/.gitlab-ci.yml' +# - local: '/src/automation/.gitlab-ci.yml' +# - local: '/src/forecaster/.gitlab-ci.yml' +# #- local: '/src/webui/.gitlab-ci.yml' +# #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' +# - local: '/src/slice/.gitlab-ci.yml' +# #- local: '/src/interdomain/.gitlab-ci.yml' +# - local: '/src/pathcomp/.gitlab-ci.yml' +# #- local: '/src/dlt/.gitlab-ci.yml' +# - local: '/src/load_generator/.gitlab-ci.yml' +# - local: '/src/bgpls_speaker/.gitlab-ci.yml' +# - local: '/src/kpi_manager/.gitlab-ci.yml' +# - local: '/src/kpi_value_api/.gitlab-ci.yml' +# #- local: '/src/kpi_value_writer/.gitlab-ci.yml' +# #- local: '/src/telemetry/.gitlab-ci.yml' +# - local: '/src/analytics/.gitlab-ci.yml' +# - local: '/src/qos_profile/.gitlab-ci.yml' +# - local: '/src/vnt_manager/.gitlab-ci.yml' +# - local: '/src/e2e_orchestrator/.gitlab-ci.yml' +# - local: '/src/ztp_server/.gitlab-ci.yml' +# - local: '/src/osm_client/.gitlab-ci.yml' +# - local: '/src/simap_connector/.gitlab-ci.yml' +# - local: '/src/pluggables/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' -- GitLab From d904ac2ae00101bd92597afae8ed1cd2ec661bd1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 13:26:42 +0000 Subject: [PATCH 04/19] Service component: - Fix exception raise in task scheduler/executor --- src/service/service/task_scheduler/TaskExecutor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/service/service/task_scheduler/TaskExecutor.py b/src/service/service/task_scheduler/TaskExecutor.py index a46be6414..ed9586629 100644 --- a/src/service/service/task_scheduler/TaskExecutor.py +++ b/src/service/service/task_scheduler/TaskExecutor.py @@ -468,7 +468,7 @@ class TaskExecutor: except ( UnsatisfiedFilterException, UnsupportedFilterFieldException, UnsupportedFilterFieldValueException - ): + ) as e: dict_connection_devices = { cd_data.name : ( cd_uuid, @@ -488,6 +488,7 @@ class TaskExecutor: grpc_message_to_json_string(service), grpc_message_to_json_string(connection), str(dict_connection_devices) )) + raise e return service_handlers -- GitLab From 9cc7d4a8a330457bf3ae67cdf84466702f0a6afb Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 13:46:50 +0000 Subject: [PATCH 05/19] Mock OSM tool: - Fixed ELAN type to bgp-vpls as vpls does not exist. --- hackfest/mock_osm/WimconnectorIETFL2VPN.py | 2 +- src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hackfest/mock_osm/WimconnectorIETFL2VPN.py b/hackfest/mock_osm/WimconnectorIETFL2VPN.py index aa4ca045f..72906d77c 100644 --- a/hackfest/mock_osm/WimconnectorIETFL2VPN.py +++ b/hackfest/mock_osm/WimconnectorIETFL2VPN.py @@ -167,7 +167,7 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): """ SETTINGS = { # min_endpoints, max_endpoints, vpn_service_type 'ELINE': (2, 2, 'vpws'), # Virtual Private Wire Service - 'ELAN' : (2, None, 'vpls'), # Virtual Private LAN Service + 'ELAN' : (2, None, 'bgp-vpls'), # Virtual Private LAN Service } settings = SETTINGS.get(service_type) if settings is None: raise NotImplementedError('Unsupported service_type({:s})'.format(str(service_type))) diff --git a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py index de940a7d2..4c2407cf5 100644 --- a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py +++ b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py @@ -167,7 +167,7 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): """ SETTINGS = { # min_endpoints, max_endpoints, vpn_service_type 'ELINE': (2, 2, 'vpws'), # Virtual Private Wire Service - 'ELAN' : (2, None, 'vpls'), # Virtual Private LAN Service + 'ELAN' : (2, None, 'bgp-vpls'), # Virtual Private LAN Service } settings = SETTINGS.get(service_type) if settings is None: raise NotImplementedError('Unsupported service_type({:s})'.format(str(service_type))) -- GitLab From 573b4f2222628787cea6f9de1a27df1e1ba9df6d Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 13:47:14 +0000 Subject: [PATCH 06/19] Device component - IETF L2VPN Driver: - Fixed ELAN type to bgp-vpls as vpls does not exist. --- src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py b/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py index 34ff184c0..b8b502035 100644 --- a/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py +++ b/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py @@ -165,7 +165,7 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): """ SETTINGS = { # min_endpoints, max_endpoints, vpn_service_type 'ELINE': (2, 2, 'vpws'), # Virtual Private Wire Service - 'ELAN' : (2, None, 'vpls'), # Virtual Private LAN Service + 'ELAN' : (2, None, 'bgp-vpls'), # Virtual Private LAN Service } settings = SETTINGS.get(service_type) if settings is None: raise NotImplementedError('Unsupported service_type({:s})'.format(str(service_type))) -- GitLab From 8908162199ed97547cf4cd32ca4e6076c1697ef2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 14:10:33 +0000 Subject: [PATCH 07/19] Service component: - Mapped optical-connection + emulated device to TAPI --- src/service/service/service_handlers/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index 7a607acdd..9535e6ba5 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -106,7 +106,10 @@ SERVICE_HANDLERS = [ (TapiServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE, - FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API], + FilterFieldEnum.DEVICE_DRIVER : [ + DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API, + DeviceDriverEnum.DEVICEDRIVER_UNDEFINED, + ], } ]), (TapiXrServiceHandler, [ -- GitLab From 48c7182340b215aa2f94de04e9891a2473c81f66 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 14:58:04 +0000 Subject: [PATCH 08/19] NBI component - IETF L2VPN connector: - Added custom end-to-end-diverse identity --- .../service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang b/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang index f2f5ddfb2..f5c750733 100644 --- a/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang +++ b/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang @@ -971,6 +971,12 @@ module ietf-l2vpn-svc { "Identity for having sites connected using the same bearer."; } + identity end-to-end-diverse { + base placement-diversity; + description + "CUSTOM TERAFLOWSDN - Identity for having full end-to-end diverse connections."; + } + identity tagged-inf-type { description "Identity for the tagged interface type."; -- GitLab From 457653c5eea3cbd772b6fc0cdffb274567368ef8 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 16:24:38 +0000 Subject: [PATCH 09/19] Device component - IETF L2VPN Driver: - Fixed type empty value according to libyang --- .../service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py b/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py index b8b502035..ff2cf6db5 100644 --- a/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py +++ b/src/device/service/drivers/ietf_l2vpn/WimconnectorIETFL2VPN.py @@ -288,12 +288,12 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): if access_priority is not None: availability = {} availability["access-priority"] = access_priority - availability["single-active"] = [None] + availability["single-active"] = None site_network_access["availability"] = availability constraint = {} constraint['constraint-type'] = 'end-to-end-diverse' - constraint['target'] = {'all-other-accesses': [None]} + constraint['target'] = {'all-other-accesses': None} access_diversity = {} access_diversity['constraints'] = {'constraint': []} -- GitLab From 70be0c31e876cb2dbe5bf4eb935eb9a464cbbc26 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 16:24:59 +0000 Subject: [PATCH 10/19] Mock OSM tool: - Fixed type empty value according to libyang --- hackfest/mock_osm/WimconnectorIETFL2VPN.py | 4 ++-- src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hackfest/mock_osm/WimconnectorIETFL2VPN.py b/hackfest/mock_osm/WimconnectorIETFL2VPN.py index 72906d77c..c3f35a2a5 100644 --- a/hackfest/mock_osm/WimconnectorIETFL2VPN.py +++ b/hackfest/mock_osm/WimconnectorIETFL2VPN.py @@ -291,12 +291,12 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): if access_priority is not None: availability = {} availability["access-priority"] = access_priority - availability["single-active"] = [None] + availability["single-active"] = None site_network_access["availability"] = availability constraint = {} constraint['constraint-type'] = 'end-to-end-diverse' - constraint['target'] = {'all-other-accesses': [None]} + constraint['target'] = {'all-other-accesses': None} access_diversity = {} access_diversity['constraints'] = {'constraint': []} diff --git a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py index 4c2407cf5..aaaac0014 100644 --- a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py +++ b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py @@ -291,12 +291,12 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): if access_priority is not None: availability = {} availability["access-priority"] = access_priority - availability["single-active"] = [None] + availability["single-active"] = None site_network_access["availability"] = availability constraint = {} constraint['constraint-type'] = 'end-to-end-diverse' - constraint['target'] = {'all-other-accesses': [None]} + constraint['target'] = {'all-other-accesses': None} access_diversity = {} access_diversity['constraints'] = {'constraint': []} -- GitLab From b34b1d8ad0047454f147acdab8245f9ee18e0588 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 16:55:03 +0000 Subject: [PATCH 11/19] NBI component - IETF L2VPN connector: - Fixed parsing of access-diversity --- src/nbi/service/ietf_l2vpn/Handlers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/nbi/service/ietf_l2vpn/Handlers.py b/src/nbi/service/ietf_l2vpn/Handlers.py index 1b8fc2b93..620e5b7f7 100644 --- a/src/nbi/service/ietf_l2vpn/Handlers.py +++ b/src/nbi/service/ietf_l2vpn/Handlers.py @@ -183,7 +183,8 @@ def process_site_network_access( constraint['constraint-type']:([ target[0] for target in constraint['target'].items() - if len(target[1]) == 1 + #if len(target[1]) == 1 + if target[1] is None ][0], raise_if_differs) for constraint in diversity_constraints } -- GitLab From c24b43803f471531656047a8ff75d5b7d853f3e9 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 16:55:40 +0000 Subject: [PATCH 12/19] QKD End-to-End test: - Added log messages to test why QKD Node Agent initialization gets stuck --- src/tests/qkd_end2end/.gitlab-ci.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/tests/qkd_end2end/.gitlab-ci.yml b/src/tests/qkd_end2end/.gitlab-ci.yml index 7fff37aaa..faabf3d33 100644 --- a/src/tests/qkd_end2end/.gitlab-ci.yml +++ b/src/tests/qkd_end2end/.gitlab-ci.yml @@ -123,16 +123,34 @@ end2end_test qkd_end2end: - docker ps -a - echo "Waiting for QKD Nodes to initialize..." + - sleep 10 + - docker logs qkd-node-01 + - sleep 10 + - docker logs qkd-node-01 + - sleep 10 + - docker logs qkd-node-01 - > while ! docker logs qkd-node-01 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do printf "%c" "." sleep 1 done - > + - sleep 10 + - docker logs qkd-node-02 + - sleep 10 + - docker logs qkd-node-02 + - sleep 10 + - docker logs qkd-node-02 while ! docker logs qkd-node-02 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do printf "%c" "." sleep 1 done + - sleep 10 + - docker logs qkd-node-03 + - sleep 10 + - docker logs qkd-node-03 + - sleep 10 + - docker logs qkd-node-03 - > while ! docker logs qkd-node-03 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do printf "%c" "." -- GitLab From 233af38506b21b05b0d6dab2a16c8278dd3aa93b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 16:55:53 +0000 Subject: [PATCH 13/19] Deactivated unneeded end-to-end integration tests --- src/tests/.gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 267d7ac23..a964e40e8 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -14,20 +14,20 @@ # include the individual .gitlab-ci.yml of each end-to-end integration test include: - - local: '/src/tests/ofc22/.gitlab-ci.yml' +# - local: '/src/tests/ofc22/.gitlab-ci.yml' #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' - local: '/src/tests/ecoc22/.gitlab-ci.yml' #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' #- local: '/src/tests/ofc23/.gitlab-ci.yml' - - local: '/src/tests/ofc24/.gitlab-ci.yml' - - local: '/src/tests/eucnc24/.gitlab-ci.yml' +# - local: '/src/tests/ofc24/.gitlab-ci.yml' +# - local: '/src/tests/eucnc24/.gitlab-ci.yml' #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' #- local: '/src/tests/ofc25/.gitlab-ci.yml' - - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' +# - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' - - local: '/src/tests/acl_end2end/.gitlab-ci.yml' - - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' +# - local: '/src/tests/acl_end2end/.gitlab-ci.yml' +# - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml' -- GitLab From 64d3b7fc99d1389343ea0e4643f8e08bb341a908 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 17:07:11 +0000 Subject: [PATCH 14/19] NBI component - IETF L2VPN connector: - Fixed parsing of empty field types --- src/nbi/service/ietf_l2vpn/Handlers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/nbi/service/ietf_l2vpn/Handlers.py b/src/nbi/service/ietf_l2vpn/Handlers.py index 620e5b7f7..48b2eff14 100644 --- a/src/nbi/service/ietf_l2vpn/Handlers.py +++ b/src/nbi/service/ietf_l2vpn/Handlers.py @@ -183,16 +183,14 @@ def process_site_network_access( constraint['constraint-type']:([ target[0] for target in constraint['target'].items() - #if len(target[1]) == 1 - if target[1] is None ][0], raise_if_differs) for constraint in diversity_constraints } network_access_availability = network_access.get('availability', {}) access_priority : Optional[int] = network_access_availability.get('access-priority') - single_active : bool = len(network_access_availability.get('single-active', [])) > 0 - all_active : bool = len(network_access_availability.get('all-active', [])) > 0 + single_active : bool = 'single-active' in network_access_availability + all_active : bool = 'all-active' in network_access_availability context_client = ContextClient() service = get_service_by_uuid( -- GitLab From 8ece46bcdac303b8414ec8ba35e745c90af2b422 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 17:15:36 +0000 Subject: [PATCH 15/19] QKD End-to-End test: - Fixed check of qkd node agent initialization --- src/tests/qkd_end2end/.gitlab-ci.yml | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/tests/qkd_end2end/.gitlab-ci.yml b/src/tests/qkd_end2end/.gitlab-ci.yml index faabf3d33..413d91759 100644 --- a/src/tests/qkd_end2end/.gitlab-ci.yml +++ b/src/tests/qkd_end2end/.gitlab-ci.yml @@ -121,38 +121,24 @@ end2end_test qkd_end2end: ${CI_REGISTRY_IMAGE}/mock-qkd-node:test - docker ps -a + - docker logs qkd-node-01 + - docker logs qkd-node-02 + - docker logs qkd-node-03 - echo "Waiting for QKD Nodes to initialize..." - sleep 10 - - docker logs qkd-node-01 - - sleep 10 - - docker logs qkd-node-01 - - sleep 10 - - docker logs qkd-node-01 - > - while ! docker logs qkd-node-01 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do + while ! docker logs qkd-node-01 2>&1 | grep -q "Other threads are currently calling into gRPC, skipping fork() handlers"; do printf "%c" "." sleep 1 done - > - - sleep 10 - - docker logs qkd-node-02 - - sleep 10 - - docker logs qkd-node-02 - - sleep 10 - - docker logs qkd-node-02 - while ! docker logs qkd-node-02 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do + while ! docker logs qkd-node-02 2>&1 | grep -q "Other threads are currently calling into gRPC, skipping fork() handlers"; do printf "%c" "." sleep 1 done - - sleep 10 - - docker logs qkd-node-03 - - sleep 10 - - docker logs qkd-node-03 - - sleep 10 - - docker logs qkd-node-03 - > - while ! docker logs qkd-node-03 2>&1 | grep -q "All log messages before absl::InitializeLog() is called are written to STDERR"; do + while ! docker logs qkd-node-03 2>&1 | grep -q "Other threads are currently calling into gRPC, skipping fork() handlers"; do printf "%c" "." sleep 1 done -- GitLab From c495ecb285fcd7c1274ff712c41847c39acd2b6a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 17:37:31 +0000 Subject: [PATCH 16/19] Deactivated unneeded end-to-end integration tests --- src/tests/.gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index a964e40e8..3c1775e43 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -15,17 +15,17 @@ # include the individual .gitlab-ci.yml of each end-to-end integration test include: # - local: '/src/tests/ofc22/.gitlab-ci.yml' - #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' +# #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' - local: '/src/tests/ecoc22/.gitlab-ci.yml' - #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' - #- local: '/src/tests/ofc23/.gitlab-ci.yml' +# #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' +# #- local: '/src/tests/ofc23/.gitlab-ci.yml' # - local: '/src/tests/ofc24/.gitlab-ci.yml' # - local: '/src/tests/eucnc24/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25/.gitlab-ci.yml' # - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' - - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' +# - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' # - local: '/src/tests/acl_end2end/.gitlab-ci.yml' # - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' -- GitLab From 14ed219f38cadc6d3ff109877f36d6e22066b671 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 17:37:57 +0000 Subject: [PATCH 17/19] ECOC22 End-to-End test: - Fixed check of slices/services created/removed --- src/tests/ecoc22/tests/test_functional_create_service.py | 2 +- src/tests/ecoc22/tests/test_functional_delete_service.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ecoc22/tests/test_functional_create_service.py b/src/tests/ecoc22/tests/test_functional_create_service.py index d892f5d4a..826826fd1 100644 --- a/src/tests/ecoc22/tests/test_functional_create_service.py +++ b/src/tests/ecoc22/tests/test_functional_create_service.py @@ -48,7 +48,7 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + assert len(response.slices) == 0 response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) diff --git a/src/tests/ecoc22/tests/test_functional_delete_service.py b/src/tests/ecoc22/tests/test_functional_delete_service.py index 76ce66ce8..49340277f 100644 --- a/src/tests/ecoc22/tests/test_functional_delete_service.py +++ b/src/tests/ecoc22/tests/test_functional_delete_service.py @@ -34,7 +34,7 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + assert len(response.slices) == 0 response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) -- GitLab From 4fa0abb8223ef68a918ccf4acde5e319589d90a9 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 18:02:14 +0000 Subject: [PATCH 18/19] ECOC22 End-to-End test: - Fixed check of service types and number of connections --- src/tests/ecoc22/tests/test_functional_create_service.py | 4 ++-- src/tests/ecoc22/tests/test_functional_delete_service.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/ecoc22/tests/test_functional_create_service.py b/src/tests/ecoc22/tests/test_functional_create_service.py index 826826fd1..5f703f10e 100644 --- a/src/tests/ecoc22/tests/test_functional_create_service.py +++ b/src/tests/ecoc22/tests/test_functional_create_service.py @@ -52,7 +52,7 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) - assert len(response.services) == 3 # 1xL2NM + 2xTAPI + assert len(response.services) == 3 # 1xLxNM + 2xTAPI for service in response.services: service_id = service.service_id @@ -60,7 +60,7 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM: + if service.service_type in {ServiceTypeEnum.SERVICETYPE_L2NM, ServiceTypeEnum.SERVICETYPE_L3NM}: assert len(response.connections) == 2 # 2 connections per service (primary + backup) elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: assert len(response.connections) == 1 # 1 connection per service diff --git a/src/tests/ecoc22/tests/test_functional_delete_service.py b/src/tests/ecoc22/tests/test_functional_delete_service.py index 49340277f..2b50d6e0f 100644 --- a/src/tests/ecoc22/tests/test_functional_delete_service.py +++ b/src/tests/ecoc22/tests/test_functional_delete_service.py @@ -38,7 +38,7 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) - assert len(response.services) == 3 # 1xL2NM + 2xTAPI + assert len(response.services) == 3 # 1xLxNM + 2xTAPI service_uuids = set() for service in response.services: @@ -47,7 +47,7 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM: + if service.service_type in {ServiceTypeEnum.SERVICETYPE_L2NM, ServiceTypeEnum.SERVICETYPE_L3NM}: assert len(response.connections) == 2 # 2 connections per service (primary + backup) service_uuid = service_id.service_uuid.uuid service_uuids.add(service_uuid) -- GitLab From 3ca32cde3857a9817567e96fdeff3a9498565747 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 2 Apr 2026 18:35:26 +0000 Subject: [PATCH 19/19] Reactivated all unitary and integration tests --- .gitlab-ci.yml | 76 ++++++++++++++++++++-------------------- src/tests/.gitlab-ci.yml | 26 +++++++------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6627e11cb..53763f5e1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,44 +28,44 @@ workflow: # include the individual .gitlab-ci.yml of each micro-service and tests include: -# #- local: '/manifests/.gitlab-ci.yml' -# - local: '/src/monitoring/.gitlab-ci.yml' -# - local: '/src/nbi/.gitlab-ci.yml' -# - local: '/src/context/.gitlab-ci.yml' -# - local: '/src/device/.gitlab-ci.yml' -# - local: '/src/service/.gitlab-ci.yml' -# - local: '/src/qkd_app/.gitlab-ci.yml' -# - local: '/src/dbscanserving/.gitlab-ci.yml' -# - local: '/src/opticalattackmitigator/.gitlab-ci.yml' -# - local: '/src/opticalattackdetector/.gitlab-ci.yml' -# - local: '/src/opticalattackmanager/.gitlab-ci.yml' -# - local: '/src/opticalcontroller/.gitlab-ci.yml' -# - local: '/src/ztp/.gitlab-ci.yml' -# - local: '/src/policy/.gitlab-ci.yml' -# - local: '/src/automation/.gitlab-ci.yml' -# - local: '/src/forecaster/.gitlab-ci.yml' -# #- local: '/src/webui/.gitlab-ci.yml' -# #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' -# #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' -# #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' -# - local: '/src/slice/.gitlab-ci.yml' -# #- local: '/src/interdomain/.gitlab-ci.yml' -# - local: '/src/pathcomp/.gitlab-ci.yml' -# #- local: '/src/dlt/.gitlab-ci.yml' -# - local: '/src/load_generator/.gitlab-ci.yml' -# - local: '/src/bgpls_speaker/.gitlab-ci.yml' -# - local: '/src/kpi_manager/.gitlab-ci.yml' -# - local: '/src/kpi_value_api/.gitlab-ci.yml' -# #- local: '/src/kpi_value_writer/.gitlab-ci.yml' -# #- local: '/src/telemetry/.gitlab-ci.yml' -# - local: '/src/analytics/.gitlab-ci.yml' -# - local: '/src/qos_profile/.gitlab-ci.yml' -# - local: '/src/vnt_manager/.gitlab-ci.yml' -# - local: '/src/e2e_orchestrator/.gitlab-ci.yml' -# - local: '/src/ztp_server/.gitlab-ci.yml' -# - local: '/src/osm_client/.gitlab-ci.yml' -# - local: '/src/simap_connector/.gitlab-ci.yml' -# - local: '/src/pluggables/.gitlab-ci.yml' + #- local: '/manifests/.gitlab-ci.yml' + - local: '/src/monitoring/.gitlab-ci.yml' + - local: '/src/nbi/.gitlab-ci.yml' + - local: '/src/context/.gitlab-ci.yml' + - local: '/src/device/.gitlab-ci.yml' + - local: '/src/service/.gitlab-ci.yml' + - local: '/src/qkd_app/.gitlab-ci.yml' + - local: '/src/dbscanserving/.gitlab-ci.yml' + - local: '/src/opticalattackmitigator/.gitlab-ci.yml' + - local: '/src/opticalattackdetector/.gitlab-ci.yml' + - local: '/src/opticalattackmanager/.gitlab-ci.yml' + - local: '/src/opticalcontroller/.gitlab-ci.yml' + - local: '/src/ztp/.gitlab-ci.yml' + - local: '/src/policy/.gitlab-ci.yml' + - local: '/src/automation/.gitlab-ci.yml' + - local: '/src/forecaster/.gitlab-ci.yml' + #- local: '/src/webui/.gitlab-ci.yml' + #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' + #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' + #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' + - local: '/src/slice/.gitlab-ci.yml' + #- local: '/src/interdomain/.gitlab-ci.yml' + - local: '/src/pathcomp/.gitlab-ci.yml' + #- local: '/src/dlt/.gitlab-ci.yml' + - local: '/src/load_generator/.gitlab-ci.yml' + - local: '/src/bgpls_speaker/.gitlab-ci.yml' + - local: '/src/kpi_manager/.gitlab-ci.yml' + - local: '/src/kpi_value_api/.gitlab-ci.yml' + #- local: '/src/kpi_value_writer/.gitlab-ci.yml' + #- local: '/src/telemetry/.gitlab-ci.yml' + - local: '/src/analytics/.gitlab-ci.yml' + - local: '/src/qos_profile/.gitlab-ci.yml' + - local: '/src/vnt_manager/.gitlab-ci.yml' + - local: '/src/e2e_orchestrator/.gitlab-ci.yml' + - local: '/src/ztp_server/.gitlab-ci.yml' + - local: '/src/osm_client/.gitlab-ci.yml' + - local: '/src/simap_connector/.gitlab-ci.yml' + - local: '/src/pluggables/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 3c1775e43..267d7ac23 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -14,20 +14,20 @@ # include the individual .gitlab-ci.yml of each end-to-end integration test include: -# - local: '/src/tests/ofc22/.gitlab-ci.yml' -# #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' + - local: '/src/tests/ofc22/.gitlab-ci.yml' + #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' - local: '/src/tests/ecoc22/.gitlab-ci.yml' -# #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' -# #- local: '/src/tests/ofc23/.gitlab-ci.yml' -# - local: '/src/tests/ofc24/.gitlab-ci.yml' -# - local: '/src/tests/eucnc24/.gitlab-ci.yml' -# #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' -# #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' -# #- local: '/src/tests/ofc25/.gitlab-ci.yml' -# - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' -# - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' -# - local: '/src/tests/acl_end2end/.gitlab-ci.yml' -# - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' + #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' + #- local: '/src/tests/ofc23/.gitlab-ci.yml' + - local: '/src/tests/ofc24/.gitlab-ci.yml' + - local: '/src/tests/eucnc24/.gitlab-ci.yml' + #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' + #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' + #- local: '/src/tests/ofc25/.gitlab-ci.yml' + - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' + - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' + - local: '/src/tests/acl_end2end/.gitlab-ci.yml' + - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml' -- GitLab