Loading src/tests/qkd_end2end/.gitlab-ci.yml +77 −23 Original line number Diff line number Diff line # Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry build qkd_end2end: variables: Loading Loading @@ -26,30 +40,41 @@ end2end_test qkd_end2end: variables: TEST_NAME: 'qkd_end2end' stage: end2end_test # Needs to run after build stage needs: - build qkd_end2end # Disable to force running it after all other tasks #needs: # - build qkd_end2end before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker rm -f crdb nats mock_qkd context device pathcomp-frontend pathcomp-backend service qkd_end2end - docker network rm teraflowbridge - docker rm -f ${TEST_NAME} || true - docker rm --force qkd-node-01 qkd-node-02 qkd-node-03 - docker network rm --force qkd-node-br script: # Create Docker network for inter-container communication - docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 teraflowbridge # Pull necessary images - docker pull "$CI_REGISTRY_IMAGE/context:latest" - docker pull "$CI_REGISTRY_IMAGE/device:latest" - docker pull "$CI_REGISTRY_IMAGE/service:latest" - docker pull "$CI_REGISTRY_IMAGE/pathcomp-frontend:latest" - docker pull "$CI_REGISTRY_IMAGE/pathcomp-backend:latest" - docker pull "$CI_REGISTRY_IMAGE/qkd_app:latest" - docker pull "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" # Deploy CockroachDB (crdb) and NATS - docker run --name crdb -d --network=teraflowbridge -p 26257:26257 -p 8080:8080 cockroachdb/cockroach:latest-v22.2 start-single-node --insecure - docker run --name nats -d --network=teraflowbridge -p 4222:4222 -p 8222:8222 nats:2.9 --http_port 8222 --user tfs --pass tfs123 # Download Docker image to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" # Deploy scenario with mock QKD Nodes - docker network create --driver bridge --subnet=172.254.250.0/24 --gateway=172.254.250.254 qkd-node-br - > docker run --detach --name qkd-node-01 --network qkd-node-br --ip 172.254.250.101 --volume "$PWD/data/qkd-node-01.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test - > docker run --detach --name qkd-node-02 --network qkd-node-br --ip 172.254.250.102 --volume "$PWD/data/qkd-node-02.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test - > docker run --detach --name qkd-node-03 --network qkd-node-br --ip 172.254.250.103 --volume "$PWD/data/qkd-node-03.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test # Check MicroK8s is ready - microk8s status --wait-ready - kubectl get pods --all-namespaces # Wait for CockroachDB and NATS to initialize - echo "Waiting for CockroachDB to be ready..." Loading Loading @@ -91,9 +116,29 @@ end2end_test qkd_end2end: - sleep 10 # Run end-to-end tests for QKD application - docker run --name ${TEST_NAME} -t --network=teraflowbridge --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest - > docker run -t --rm --name ${TEST_NAME} --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest after_script: # Dump configuration of the QKD Nodes (after_script) - echo "[QKD-NODE-01] Config after_script:" - curl "http://172.254.250.101:8080/restconf/data/etsi-qkd-sdn-node:" - echo - echo "[QKD-NODE-02] Config after_script:" - curl "http://172.254.250.102:8080/restconf/data/etsi-qkd-sdn-node:" - echo - echo "[QKD-NODE-03] Config after_script:" - curl "http://172.254.250.103:8080/restconf/data/etsi-qkd-sdn-node:" - echo # Dump logs of the QKD Nodes (after_script) - docker logs qkd-node-01 - docker logs qkd-node-02 - docker logs qkd-node-03 # Dump logs for TeraFlowSDN components - docker logs context - docker logs device Loading @@ -101,15 +146,24 @@ end2end_test qkd_end2end: - docker logs pathcomp-backend - docker logs service # Dump logs for QKD mock nodes - docker logs mock_qkd # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/qkd-appservice -c server # Clean up - docker rm -f context device pathcomp-frontend pathcomp-backend service mock_qkd crdb nats - docker network rm teraflowbridge - docker volume prune --force - docker image prune --force # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' Loading src/tests/qkd_end2end/data/qkd-node-01.json 0 → 100644 +36 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000001-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "100", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "102", "qkdi_att_point": { "device": "QKD2", "port": "201" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } } src/tests/qkd_end2end/data/qkd-node-02.json 0 → 100644 +44 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000002-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "200", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "201", "qkdi_att_point": { "device": "QKD1", "port": "102" }, "qkdi_capabilities": {} }, { "qkdi_id": "203", "qkdi_att_point": { "device": "QKD3", "port": "302" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } } src/tests/qkd_end2end/data/qkd-node-03.json 0 → 100644 +36 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000003-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "300", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "302", "qkdi_att_point": { "device": "QKD2", "port": "203" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } } src/tests/qkd_end2end/topology_qkd.json→src/tests/qkd_end2end/data/topology_qkd.json +6 −6 Original line number Diff line number Diff line Loading @@ -9,24 +9,24 @@ { "device_id": {"device_uuid": {"uuid": "QKD1"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "11111"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.101"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} }, { "device_id": {"device_uuid": {"uuid": "QKD2"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "22222"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.102"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} }, { "device_id": {"device_uuid": {"uuid": "QKD3"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "33333"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.103"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} } Loading Loading
src/tests/qkd_end2end/.gitlab-ci.yml +77 −23 Original line number Diff line number Diff line # Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry build qkd_end2end: variables: Loading Loading @@ -26,30 +40,41 @@ end2end_test qkd_end2end: variables: TEST_NAME: 'qkd_end2end' stage: end2end_test # Needs to run after build stage needs: - build qkd_end2end # Disable to force running it after all other tasks #needs: # - build qkd_end2end before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker rm -f crdb nats mock_qkd context device pathcomp-frontend pathcomp-backend service qkd_end2end - docker network rm teraflowbridge - docker rm -f ${TEST_NAME} || true - docker rm --force qkd-node-01 qkd-node-02 qkd-node-03 - docker network rm --force qkd-node-br script: # Create Docker network for inter-container communication - docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 teraflowbridge # Pull necessary images - docker pull "$CI_REGISTRY_IMAGE/context:latest" - docker pull "$CI_REGISTRY_IMAGE/device:latest" - docker pull "$CI_REGISTRY_IMAGE/service:latest" - docker pull "$CI_REGISTRY_IMAGE/pathcomp-frontend:latest" - docker pull "$CI_REGISTRY_IMAGE/pathcomp-backend:latest" - docker pull "$CI_REGISTRY_IMAGE/qkd_app:latest" - docker pull "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" # Deploy CockroachDB (crdb) and NATS - docker run --name crdb -d --network=teraflowbridge -p 26257:26257 -p 8080:8080 cockroachdb/cockroach:latest-v22.2 start-single-node --insecure - docker run --name nats -d --network=teraflowbridge -p 4222:4222 -p 8222:8222 nats:2.9 --http_port 8222 --user tfs --pass tfs123 # Download Docker image to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" # Deploy scenario with mock QKD Nodes - docker network create --driver bridge --subnet=172.254.250.0/24 --gateway=172.254.250.254 qkd-node-br - > docker run --detach --name qkd-node-01 --network qkd-node-br --ip 172.254.250.101 --volume "$PWD/data/qkd-node-01.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test - > docker run --detach --name qkd-node-02 --network qkd-node-br --ip 172.254.250.102 --volume "$PWD/data/qkd-node-02.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test - > docker run --detach --name qkd-node-03 --network qkd-node-br --ip 172.254.250.103 --volume "$PWD/data/qkd-node-03.json:/var/mock_qkd_node/startup.json" mock-qkd-node:test # Check MicroK8s is ready - microk8s status --wait-ready - kubectl get pods --all-namespaces # Wait for CockroachDB and NATS to initialize - echo "Waiting for CockroachDB to be ready..." Loading Loading @@ -91,9 +116,29 @@ end2end_test qkd_end2end: - sleep 10 # Run end-to-end tests for QKD application - docker run --name ${TEST_NAME} -t --network=teraflowbridge --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest - > docker run -t --rm --name ${TEST_NAME} --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest after_script: # Dump configuration of the QKD Nodes (after_script) - echo "[QKD-NODE-01] Config after_script:" - curl "http://172.254.250.101:8080/restconf/data/etsi-qkd-sdn-node:" - echo - echo "[QKD-NODE-02] Config after_script:" - curl "http://172.254.250.102:8080/restconf/data/etsi-qkd-sdn-node:" - echo - echo "[QKD-NODE-03] Config after_script:" - curl "http://172.254.250.103:8080/restconf/data/etsi-qkd-sdn-node:" - echo # Dump logs of the QKD Nodes (after_script) - docker logs qkd-node-01 - docker logs qkd-node-02 - docker logs qkd-node-03 # Dump logs for TeraFlowSDN components - docker logs context - docker logs device Loading @@ -101,15 +146,24 @@ end2end_test qkd_end2end: - docker logs pathcomp-backend - docker logs service # Dump logs for QKD mock nodes - docker logs mock_qkd # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/qkd-appservice -c server # Clean up - docker rm -f context device pathcomp-frontend pathcomp-backend service mock_qkd crdb nats - docker network rm teraflowbridge - docker volume prune --force - docker image prune --force # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' Loading
src/tests/qkd_end2end/data/qkd-node-01.json 0 → 100644 +36 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000001-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "100", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "102", "qkdi_att_point": { "device": "QKD2", "port": "201" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } }
src/tests/qkd_end2end/data/qkd-node-02.json 0 → 100644 +44 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000002-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "200", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "201", "qkdi_att_point": { "device": "QKD1", "port": "102" }, "qkdi_capabilities": {} }, { "qkdi_id": "203", "qkdi_att_point": { "device": "QKD3", "port": "302" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } }
src/tests/qkd_end2end/data/qkd-node-03.json 0 → 100644 +36 −0 Original line number Diff line number Diff line { "fc-restconf": { "web": { "port": ":8080" } }, "etsi-qkd-sdn-node": { "qkd_node": { "qkdn_id": "00000003-0000-0000-0000-000000000000", "qkdn_capabilities": {}, "qkd_applications": { "qkd_app": [] }, "qkd_interfaces": { "qkd_interface": [ { "qkdi_id": "300", "qkdi_att_point": {}, "qkdi_capabilities": {} }, { "qkdi_id": "302", "qkdi_att_point": { "device": "QKD2", "port": "203" }, "qkdi_capabilities": {} } ] }, "qkd_links": { "qkd_link": [] } } } }
src/tests/qkd_end2end/topology_qkd.json→src/tests/qkd_end2end/data/topology_qkd.json +6 −6 Original line number Diff line number Diff line Loading @@ -9,24 +9,24 @@ { "device_id": {"device_uuid": {"uuid": "QKD1"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "11111"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.101"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} }, { "device_id": {"device_uuid": {"uuid": "QKD2"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "22222"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.102"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} }, { "device_id": {"device_uuid": {"uuid": "QKD3"}}, "device_type": "qkd-node", "device_drivers": ["DEVICEDRIVER_QKD"], "device_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "33333"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.254.250.103"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http"}}} ]} } Loading