Commit 06efb967 authored by Luis Carlos Lopes Silva's avatar Luis Carlos Lopes Silva
Browse files

Added the .gitlab-ci.yml to qkd_end2end

parent 431825f0
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
# 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