From 06efb9670c48e7d72104fc61edfd674501d05860 Mon Sep 17 00:00:00 2001
From: Luis Carlos Lopes Silva <lclopes@optaresolutions.com>
Date: Mon, 10 Feb 2025 18:13:21 +0000
Subject: [PATCH] Added the .gitlab-ci.yml to qkd_end2end

---
 src/tests/qkd_end2end/.gitlab-ci.yml | 119 +++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)
 create mode 100644 src/tests/qkd_end2end/.gitlab-ci.yml

diff --git a/src/tests/qkd_end2end/.gitlab-ci.yml b/src/tests/qkd_end2end/.gitlab-ci.yml
new file mode 100644
index 000000000..fd1c65b84
--- /dev/null
+++ b/src/tests/qkd_end2end/.gitlab-ci.yml
@@ -0,0 +1,119 @@
+# Build, tag, and push the Docker image to the GitLab Docker registry
+build qkd_end2end:
+  variables:
+    TEST_NAME: 'qkd_end2end'
+  stage: build
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - docker buildx build -t "${TEST_NAME}:latest" -f ./src/tests/${TEST_NAME}/Dockerfile .
+    - docker tag "${TEST_NAME}:latest" "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest"
+    - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest"
+  after_script:
+    - docker images --filter="dangling=true" --quiet | xargs -r docker rmi
+  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"'
+    - changes:
+      - src/common/**/*.py
+      - proto/*.proto
+      - src/tests/${TEST_NAME}/**/*.{py,in,sh,yml}
+      - src/tests/${TEST_NAME}/Dockerfile
+      - .gitlab-ci.yml
+
+# Deploy TeraFlowSDN and Execute end-2-end test
+end2end_test qkd_end2end:
+  variables:
+    TEST_NAME: 'qkd_end2end'
+  stage: end2end_test
+  # Needs to run after build stage
+  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
+
+  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
+
+    # Wait for CockroachDB and NATS to initialize
+    - echo "Waiting for CockroachDB to be ready..."
+    - while ! docker logs crdb 2>&1 | grep -q 'CockroachDB node starting'; do sleep 1; done
+    - docker logs crdb
+    - echo "Waiting for NATS to be ready..."
+    - while ! docker logs nats 2>&1 | grep -q 'Server is ready'; do sleep 1; done
+    - docker logs nats
+
+    # Start mock QKD nodes
+    - docker run --name mock_qkd -d --network=teraflowbridge -v "$PWD/src/tests/tools/mock_qkd_nodes:/app" python:3.9-slim bash -c "cd /app && ./start.sh"
+
+    # Wait for mock QKD nodes to initialize
+    - echo "Waiting for mock QKD nodes to be ready..."
+    - sleep 10
+
+    # Deploy TeraFlowSDN services
+    - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+    - NATS_ADDRESS=$(docker inspect nats --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+
+    # Deploy Context Service
+    - docker run --name context -d -p 1010:1010 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" --env "MB_BACKEND=nats" --env "NATS_URI=nats://tfs:tfs123@${NATS_ADDRESS}:4222" --network=teraflowbridge $CI_REGISTRY_IMAGE/context:latest
+    - CONTEXTSERVICE_SERVICE_HOST=$(docker inspect context --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+
+    # Deploy Device Service
+    - docker run --name device -d -p 2020:2020 --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXTSERVICE_SERVICE_HOST}" --network=teraflowbridge $CI_REGISTRY_IMAGE/device:latest
+    - DEVICESERVICE_SERVICE_HOST=$(docker inspect device --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+
+    # Deploy PathComp Services (frontend and backend)
+    - docker run --name pathcomp-backend -d -p 8081:8081 --network=teraflowbridge $CI_REGISTRY_IMAGE/pathcomp-backend:latest
+    - PATHCOMP_BACKEND_HOST=$(docker inspect pathcomp-backend --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+    - docker run --name pathcomp-frontend -d -p 10020:10020 --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXTSERVICE_SERVICE_HOST}" --env "PATHCOMP_BACKEND_HOST=${PATHCOMP_BACKEND_HOST}" --env "PATHCOMP_BACKEND_PORT=8081" --network=teraflowbridge $CI_REGISTRY_IMAGE/pathcomp-frontend:latest
+    - PATHCOMPSERVICE_SERVICE_HOST=$(docker inspect pathcomp-frontend --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+
+    # Deploy Service Component
+    - docker run --name service -d -p 3030:3030 --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXTSERVICE_SERVICE_HOST}" --env "DEVICESERVICE_SERVICE_HOST=${DEVICESERVICE_SERVICE_HOST}" --env "PATHCOMPSERVICE_SERVICE_HOST=${PATHCOMPSERVICE_SERVICE_HOST}" --volume "$PWD/src/service/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/service:latest
+
+    # Wait for services to initialize
+    - 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
+
+  after_script:
+    # Dump logs for TeraFlowSDN components
+    - docker logs context
+    - docker logs device
+    - docker logs pathcomp-frontend
+    - docker logs pathcomp-backend
+    - docker logs service
+
+    # Dump logs for QKD mock nodes
+    - docker logs mock_qkd
+
+    # 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
+
+  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"'
+  artifacts:
+      when: always
+      reports:
+        junit: ./src/tests/${TEST_NAME}/report_*.xml
-- 
GitLab