diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7f9bc173870ede2c0fda21355d01f2f9af767c1d..fed5f03c6b2cb01eac321de8b9dd3ced6de83569 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,6 @@ stages: - build - test - analyze - - apply - integration-test - build-release - .post @@ -18,7 +17,7 @@ include: - local: "/.gitlab/ci/.code-quality-ci.yml" - local: "/.gitlab/ci/.security-and-compliance-ci.yml" - local: "/.gitlab/ci/.test.yml" - - local: "/.gitlab/ci/.containerlab-ci.yml" + - local: "/.gitlab/ci/.integration-test-containerlab.yml" - local: "/.gitlab/ci/.integration-test.yml" - local: "/.gitlab/ci/.uml-autogen-ci.yml" - local: "/.gitlab/ci/.build-release.yml" diff --git a/.gitlab/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml deleted file mode 100644 index 3b0c201e4b222782f60a3790be0f38f599544a4e..0000000000000000000000000000000000000000 --- a/.gitlab/ci/.containerlab-ci.yml +++ /dev/null @@ -1,129 +0,0 @@ -variables: - CLAB_DIR: "/mnt" - CLAB_NAME: "clab${CI_PIPELINE_IID}" - -# Templates for Job Types -.containerlab_deploy: &containerlab_deploy - stage: apply - rules: - - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - when: never - - when: on_success - tags: - - shell - before_script: - - cd ${CLAB_DIR} - - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts" - - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY - - echo ${GOSDN_IMAGE} - - docker pull ${GOSDN_IMAGE} - - docker pull ${CEOS_IMAGE} - -.containerlab_template: &containerlab_template - image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest - stage: build - rules: - - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - when: never - - when: on_success - before_script: - - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts" - - firstOctet=$(generate_octet.sh $CI_COMMIT_SHA) - - secondOctet=$(generate_octet.sh $CI_PIPELINE_ID) - - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24" - script: - - | - sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \ - -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \ - -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \ - -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \ - ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml - - cat ${CLAB_NAME}.clab.yml - artifacts: - name: ${CLAB_NAME} - paths: - - ${CLAB_NAME}.clab.yml - -# JOBS -containerlab:template:integration: - extends: .containerlab_template - variables: - CLAB_TEMPLATE: "${CI_PROJECT_DIR}/controller/test/containerlab/int01.clab.tmpl.yml" - -containerlab:deploy:integration: - extends: .containerlab_deploy - needs: ["containerlab:template:integration", "build-image"] - script: - - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure - - | - echo -e "\ - GOSDN_HTTP_PORT=$(docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\ - GOSDN_GRPC_PORT=$(docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\ - CEOS1_PORT=$(docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \ - > ${CI_PROJECT_DIR}/build.env - - cat ${CI_PROJECT_DIR}/build.env - artifacts: - reports: - dotenv: ${CI_PROJECT_DIR}/build.env - -containerlab:destroy: - rules: - - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - when: never - - when: always - stage: .post - tags: - - shell - needs: - [ - "containerlab:deploy:integration", - "integration-test:nucleus", - "integration-test:api", - "containerlab:template:integration", - ] - before_script: - - cd ${CLAB_DIR} - script: - - sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml - - docker volume rm -f ${CLAB_NAME}-volume - - docker image rm -f ${GOSDN_IMAGE} - allow_failure: true - -#containerlab:template:develop: -# extends: .containerlab_template -# variables: -# CLAB_NAME: "dev" -# CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/dev.clab.tmpl.yml" -# GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop" -# rules: -# - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null -# -# -#containerlab:deploy:develop: -# extends: -# - .containerlab_deploy -# needs: ["containerlab:template:develop", "build-image"] -# variables: -# CLAB_NAME: "dev" -# GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop" -# script: -# - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure -# rules: -# - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null - -containerlab:clean: - stage: .post - tags: - - shell - before_script: - - cd ${CLAB_DIR} - script: - - docker kill $(docker ps -q) || true - - docker rm $(docker ps -a -q) || true - - docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true - - sudo rm -rf ${CLAB_DIR}/clab-* || true - - sudo sed -i 's|.*clab.*||g' /etc/hosts - allow_failure: true - rules: - - if: $CI_SCHEDULE_CLEAN - when: always diff --git a/.gitlab/ci/.integration-test-containerlab.yml b/.gitlab/ci/.integration-test-containerlab.yml new file mode 100644 index 0000000000000000000000000000000000000000..000af8c0f052dfc3fdcf583e7f9f4c6c85f7c3f3 --- /dev/null +++ b/.gitlab/ci/.integration-test-containerlab.yml @@ -0,0 +1,84 @@ +variables: + CLAB_TEMPLATE: "${CI_PROJECT_DIR}/controller/test/containerlab/int01.clab.tmpl.yml" + CLAB_DIR: "/home/gitlab-runner/clab" + CLAB_NAME: "clab${CI_PIPELINE_IID}" + +containerlab-deploy: + stage: integration-test + rules: + - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' + when: never + - when: on_success + tags: + - shell-containerlab + needs: ["build-image", "build-testing-image"] + script: + - firstOctet=$(python3 ${CI_PROJECT_DIR}/.gitlab/ci/scripts/generate_octet.py $CI_COMMIT_SHA) + - secondOctet=$(python3 ${CI_PROJECT_DIR}/.gitlab/ci/scripts/generate_octet.py $CI_PIPELINE_ID) + - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24" + - cd ${CLAB_DIR} + - ls -la + - | + sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \ + -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \ + -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \ + -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \ + ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml + - cat ${CLAB_NAME}.clab.yml + - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY + - echo ${GOSDN_IMAGE} + - docker pull ${GOSDN_IMAGE} + - docker pull ${CEOS_IMAGE} + - sudo containerlab deploy --topo ${CLAB_DIR}/${CLAB_NAME}.clab.yml --reconfigure + - | + echo -e "\ + GOSDN_HTTP_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\ + GOSDN_GRPC_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\ + CEOS1_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \ + > ${CI_PROJECT_DIR}/build.env + - cat ${CI_PROJECT_DIR}/build.env + artifacts: + reports: + dotenv: ${CI_PROJECT_DIR}/build.env + + +containerlab-destroy: + rules: + - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' + when: never + - when: always + stage: integration-test + tags: + - shell-containerlab + needs: + [ + "containerlab-deploy", + "integration-test:nucleus", + "integration-test:api" + + ] + before_script: + - cd ${CLAB_DIR} + script: + - sudo containerlab destroy --topo ${CLAB_DIR}/${CLAB_NAME}.clab.yml + - docker volume rm -f ${CLAB_NAME}-volume + - rm ${CLAB_DIR}/${CLAB_NAME}.clab.yml + allow_failure: true + + +#containerlab:clean: +# stage: .post +# tags: +# - shell-containerlab +# before_script: +# - cd ${CLAB_DIR} +# script: +# - docker kill $(docker ps -q) || true +# - docker rm $(docker ps -a -q) || true +# - docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true +# - sudo rm -rf ${CLAB_DIR}/clab-* || true +# - sudo sed -i 's|.*clab.*||g' /etc/hosts +# allow_failure: true +# rules: +# - if: $CI_SCHEDULE_CLEAN +# when: always diff --git a/.gitlab/ci/.integration-test.yml b/.gitlab/ci/.integration-test.yml index 1069f78aa2aefbf7d99caa7bb4e1b3ea34aebb30..2f6ee1b73eb43fbfef02a8259ece988b7536f2a0 100644 --- a/.gitlab/ci/.integration-test.yml +++ b/.gitlab/ci/.integration-test.yml @@ -6,13 +6,11 @@ when: never - when: on_success needs: - - job: "containerlab:deploy:integration" - tags: - - integration-test-docker + ["containerlab-deploy"] variables: GOSDN_LOG: "nolog" - GOSDN_TEST_API_ENDPOINT: "${CI_SERVER_IP}:${GOSDN_GRPC_PORT}" - CEOS_TEST_ENDPOINT: "${CI_SERVER_IP}:${CEOS1_PORT}" + GOSDN_TEST_API_ENDPOINT: "10.254.254.105:${GOSDN_GRPC_PORT}" + CEOS_TEST_ENDPOINT: "10.254.254.105:${CEOS1_PORT}" GOSDN_TEST_USER: "admin" GOSDN_TEST_PASSWORD: "admin" @@ -30,3 +28,9 @@ integration-test:api: script: - cd controller/ - make integration-test-api + +integration-test:cli: + <<: *integration-test + script: + - cd cli/ + - echo "Your tests here" diff --git a/.gitlab/ci/scripts/docker_host_port b/.gitlab/ci/scripts/docker_host_port old mode 100644 new mode 100755 diff --git a/.gitlab/ci/scripts/generate_octet.py b/.gitlab/ci/scripts/generate_octet.py new file mode 100755 index 0000000000000000000000000000000000000000..a0005706c869f2e5b2c63e9c8ff3ed508d86e73e --- /dev/null +++ b/.gitlab/ci/scripts/generate_octet.py @@ -0,0 +1,19 @@ +import sys +from hashlib import sha256 + +input_data = sys.argv[1] + +# Hash input and store it as string +hashed_string = sha256(bytes(input_data, encoding='utf8')).hexdigest() + +final_string = "" + +# Iterate over hash and take out all chars that are a number +for character in hashed_string: + if character.isdigit(): + final_string += character + +final_int = int(final_string) + +# Print number mod 256 to get a number between 0 and 255 for ip adress +print(final_int % 256) diff --git a/.gitlab/ci/scripts/generate_octet.sh b/.gitlab/ci/scripts/generate_octet.sh deleted file mode 100755 index c45a368391175ea3bb39a1b09a2efc622ee56159..0000000000000000000000000000000000000000 --- a/.gitlab/ci/scripts/generate_octet.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -input=$1 - -hashed_value=$(echo $input | sha256sum | awk '{print $1}' ) - -decimal_value=$((16#$hashed_value)) -decimal_value=${decimal_value/-/} - -octet=$(((decimal_value % 255))) - -echo -n $octet diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go index abd0d518d4452c62c012a5e6a707289c6e690d60..499cb033e625ea7b157dd4fae9a00891a92db0e0 100644 --- a/controller/api/initialise_test.go +++ b/controller/api/initialise_test.go @@ -118,7 +118,7 @@ func bufDialer(context.Context, string) (net.Conn, error) { const testPath = "/system/config/hostname" -var testAddress = "141.100.70.170:6030" +var testAddress = "10.254.254.105:6030" var testAPIEndpoint = "gosdn-latest.apps.ocp.fbi.h-da.de" var testUsername = "admin" var testPassword = "arista" diff --git a/controller/test/integration/nucleusIntegration_test.go b/controller/test/integration/nucleusIntegration_test.go index 689c02c30c68353fe11bd6046728244e9094d364..402c2c94e7860ea485cf373f9c00f1664b29ffc3 100644 --- a/controller/test/integration/nucleusIntegration_test.go +++ b/controller/test/integration/nucleusIntegration_test.go @@ -29,7 +29,7 @@ const unreachable = "203.0.113.10:6030" const testPath = "/system/config/hostname" var modifiedHostname = "ceos3000" -var testAddress = "141.100.70.170:6030" +var testAddress = "10.254.254.105:6030" var testUsername = "admin" var testPassword = "arista" var opt *tpb.TransportOption