Commit 9623cb62 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

CI/CD pipeline - QKD E2E test:

- Added QKD node startup data
- Updated TFS topology descriptor
- Corrected TFS deploy specs
- Progressed with CI/CD descriptor
parent 621dc995
Loading
Loading
Loading
Loading
+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:
@@ -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..."
@@ -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
@@ -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"'
+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": []
            }
        }
    }
}
+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": []
            }
        }
    }
}
+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": []
            }
        }
    }
}
+6 −6
Original line number Diff line number Diff line
@@ -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