From 614a7ce533db9e616ee056c0243a394d7017ad97 Mon Sep 17 00:00:00 2001 From: Ravi Pendurty Date: Tue, 7 Oct 2025 14:56:07 +0530 Subject: [PATCH] Include testsuite deploy docker images and run tests Issue-ID: OAM-513 Change-Id: Ic36c8355ade7c6adae3a353fa5315285cefda9d9 Signed-off-by: Ravi Pendurty --- .github/workflows/gerrit-verify.yaml | 36 +++--- .gitignore | 32 +---- CICD/bin/setup.sh | 130 +++++++++++++++++++++ CICD/config/.env | 12 ++ CICD/config/certs/certs.properties | 4 + CICD/config/certs/keys0.zip | Bin 0 -> 3838 bytes CICD/config/certs/keys1.zip | Bin 0 -> 3917 bytes CICD/config/docker-compose-o-ru-mplane.yaml | 107 +++++++++++++++++ CICD/config/docker-compose-sdnr-mariadb.yaml | 102 ++++++++++++++++ CICD/config/ietf-netconf-server-ssh-callhome.json | 49 ++++++++ CICD/config/ietf-netconf-server-tls-callhome.json | 53 +++++++++ CICD/config/ietf-netconf-server-tls-listen.json | 45 +++++++ CICD/config/sdnc-web/cacert.pem | 31 +++++ CICD/config/sdnc-web/cert.pem | 102 ++++++++++++++++ CICD/config/sdnc-web/key.pem | 29 +++++ CICD/config/sdnr/devicemanager.properties | 49 ++++++++ CICD/config/sdnr/mountpoint-registrar.properties | 44 +++++++ .../sdnr/mountpoint-registrar.properties.bkup | 99 ++++++++++++++++ CICD/config/sdnr/oauth-aaa-app-config.xml | 97 +++++++++++++++ CICD/config/sdnr/oauth-provider.config.json | 22 ++++ CICD/config/sdnrconfig.json | 9 ++ CICD/config/testsuiteconfig.json | 4 + CICD/log/.gitkeep | 0 CICD/src/ApiRequest.py | 27 +++++ CICD/src/Main.py | 107 +++++++++++++++++ CICD/src/SdnrConfigModel.py | 46 ++++++++ CICD/src/TestPlanModel.py | 65 +++++++++++ CICD/src/TestPlanRunner.py | 121 +++++++++++++++++++ CICD/src/TestSuiteConfig.py | 21 ++++ CICD/testplans/001/CREATE-MOUNTPOINT-TLS.json | 24 ++++ CICD/testplans/001/testplan.json | 21 ++++ CICD/testplans/002/CREATE-MOUNTPOINT-SSH.json | 21 ++++ CICD/testplans/002/testplan.json | 21 ++++ CICD/testplans/003/testplan.json | 11 ++ CICD/testplans/004/testplan.json | 11 ++ 35 files changed, 1510 insertions(+), 42 deletions(-) create mode 100755 CICD/bin/setup.sh create mode 100644 CICD/config/.env create mode 100644 CICD/config/certs/certs.properties create mode 100644 CICD/config/certs/keys0.zip create mode 100644 CICD/config/certs/keys1.zip create mode 100644 CICD/config/docker-compose-o-ru-mplane.yaml create mode 100644 CICD/config/docker-compose-sdnr-mariadb.yaml create mode 100644 CICD/config/ietf-netconf-server-ssh-callhome.json create mode 100644 CICD/config/ietf-netconf-server-tls-callhome.json create mode 100644 CICD/config/ietf-netconf-server-tls-listen.json create mode 100644 CICD/config/sdnc-web/cacert.pem create mode 100644 CICD/config/sdnc-web/cert.pem create mode 100644 CICD/config/sdnc-web/key.pem create mode 100644 CICD/config/sdnr/devicemanager.properties create mode 100644 CICD/config/sdnr/mountpoint-registrar.properties create mode 100644 CICD/config/sdnr/mountpoint-registrar.properties.bkup create mode 100644 CICD/config/sdnr/oauth-aaa-app-config.xml create mode 100644 CICD/config/sdnr/oauth-provider.config.json create mode 100644 CICD/config/sdnrconfig.json create mode 100644 CICD/config/testsuiteconfig.json create mode 100644 CICD/log/.gitkeep create mode 100644 CICD/src/ApiRequest.py create mode 100644 CICD/src/Main.py create mode 100644 CICD/src/SdnrConfigModel.py create mode 100644 CICD/src/TestPlanModel.py create mode 100644 CICD/src/TestPlanRunner.py create mode 100644 CICD/src/TestSuiteConfig.py create mode 100644 CICD/testplans/001/CREATE-MOUNTPOINT-TLS.json create mode 100644 CICD/testplans/001/testplan.json create mode 100644 CICD/testplans/002/CREATE-MOUNTPOINT-SSH.json create mode 100644 CICD/testplans/002/testplan.json create mode 100644 CICD/testplans/003/testplan.json create mode 100644 CICD/testplans/004/testplan.json diff --git a/.github/workflows/gerrit-verify.yaml b/.github/workflows/gerrit-verify.yaml index 7f31196..de8ee9f 100644 --- a/.github/workflows/gerrit-verify.yaml +++ b/.github/workflows/gerrit-verify.yaml @@ -82,19 +82,29 @@ jobs: maven-verify: needs: [prepare, sanitize] - # use compose-jjb-verify from the v0.4 series of releng-reusable-workflows - # yamllint disable-line rule:line-length - uses: lfit/releng-reusable-workflows/.github/workflows/compose-make-verify.yaml@f318aaac9f4fce73a8059fe95ba9080833e018c2 - with: - GERRIT_BRANCH: ${{ inputs.GERRIT_BRANCH }} - GERRIT_CHANGE_ID: ${{ inputs.GERRIT_CHANGE_ID }} - GERRIT_PROJECT: ${{ github.repository_owner }}/${{ needs.sanitize.outputs.sanitized_project }} - GERRIT_REFSPEC: ${{ inputs.GERRIT_REFSPEC }} - JDK_VERSION: "21" - MVN_VERSION: "3.9.6" - MAKE_TARGETS: "build" - # yamllint enable rule:line-length - ENV_VARS: ${{ toJSON(vars) }} + runs-on: ubuntu-latest + steps: + - name: Run make + # yamllint disable-line rule:line-length + uses: lfit/releng-reusable-workflows/.github/workflows/compose-make-verify.yaml@f318aaac9f4fce73a8059fe95ba9080833e018c2 + with: + GERRIT_BRANCH: ${{ inputs.GERRIT_BRANCH }} + GERRIT_CHANGE_ID: ${{ inputs.GERRIT_CHANGE_ID }} + GERRIT_PROJECT: ${{ github.repository_owner }}/${{ needs.sanitize.outputs.sanitized_project }} + GERRIT_REFSPEC: ${{ inputs.GERRIT_REFSPEC }} + JDK_VERSION: "21" + MVN_VERSION: "3.9.6" + MAKE_TARGETS: "build" + # yamllint enable rule:line-length + ENV_VARS: ${{ toJSON(vars) }} + - name: Run tests + run: CICD/bin/setup.sh + - name: Print test log + if: always() + run: | + echo "Test log dump - START" + cat CICD/log/testsuite.log + echo "Test log dump - END" vote: if: ${{ always() }} diff --git a/.gitignore b/.gitignore index d789c1e..abbe4b5 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ buildNumber.properties *.pyc append_to_etc_hosts.txt -*/**/bin/ +#*/**/bin/ # Maven target/ @@ -54,38 +54,12 @@ venv # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) !/.mvn/wrapper/maven-wrapper.jar -# VES related -*/**/json/examples -*/**/__pycache__ -*.log - -# avoid copyright issues with 3GPP -*/**/3gpp/**/*.yaml - # node js node_modules package-lock.json -# wireshark -.cache - # ODLUX cache */**/O D L UX* -# nodered -*.backup - -# container-analyis -*.sbom.spdx.json -*.vulnerabilities.vex.json - -# jenkins -*/**/apps/jenkins/* - -# wireshark -*/**/apps/wireshark/* - -# documentation -.tox -docs/_build/ -ci-management/ +#tmp directory +CICD/tmp diff --git a/CICD/bin/setup.sh b/CICD/bin/setup.sh new file mode 100755 index 0000000..47db5c9 --- /dev/null +++ b/CICD/bin/setup.sh @@ -0,0 +1,130 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +#!/bin/bash + +# Log output of each command executed in the script for easier debugging +#exec > >(stdbuf -oL awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a setup.log) 2>&1 + +# 7. Dump the log into the Github window. How ? + + +DOCKER_NETWORK_SUB="172.18.0.0/16" +DOCKER_NETWORK_GW="172.18.0.1" +DOCKER_NETWORK_NAME="CICD-Network" +CUSTOM_O_RU_MPLANE_DC_FILE="docker-compose-o-ru-mplane.yaml" +CUSTOM_O_RU_MPLANE_SSH_CALLHOME="ietf-netconf-server-ssh-callhome.json" +CUSTOM_O_RU_MPLANE_TLS_CALLHOME="ietf-netconf-server-tls-callhome.json" +CUSTOM_O_RU_MPLANE_TLS_NON_CALLHOME="ietf-netconf-server-tls-listen.json" +SDNR_COMPONENTS_DC_FILE="docker-compose-sdnr-mariadb.yaml" +# Code everything relative to the BINDIR +BINDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOTDIR="$(cd "${BINDIR}/.." && pwd)" +CONFIGDIR=${ROOTDIR}/config +TMPDIR=${ROOTDIR}/tmp +LOGDIR=${ROOTDIR}/log +LOGFILE=testsuite.log + +log() { + echo "$1" | tee -a ${LOGDIR}/${LOGFILE} +} + +cleanup() { + log "## Deleting any running/stopped docker containers ##\n" + container_names=$(docker ps --format {{.Names}}) + if [[ "$container_names" != "" ]]; then + docker rm -f $(docker ps -aq) + fi + + log "## Checking if docker network with name - ${DOCKER_NETWORK_NAME} - exists ##\n" + docker_nw=$(docker network ls --filter name=^${DOCKER_NETWORK_NAME}$ --format {{.Name}}) + if [[ "$docker_nw" != "" ]]; then + log "## Docker network with name ${DOCKER_NETWORK_NAME} exists. Deleting it ...##\n" + docker network rm ${DOCKER_NETWORK_NAME} + else + log "## Docker network with name ${DOCKER_NETWORK_NAME} DOES NOT exist ##" + fi + + if [[ -d ${TMPDIR} ]]; then + log "## Deleting tmp directory ..##\n" + sudo rm -rf ${TMPDIR} + fi + + if [[ -f ${LOGDIR}/setup.log ]]; then + rm ${LOGDIR}/setup.log + fi +} + +build_pynts_images() { + log "## Start Building PyNTS ... ##\n" + log "## Cloning PyNTS simulator from https://github.com/o-ran-sc/sim-o1-ofhmp-interfaces ##\n" + git clone https://github.com/o-ran-sc/sim-o1-ofhmp-interfaces.git ${TMPDIR}/sim-o1-ofhmp-interfaces + cd ${TMPDIR}/sim-o1-ofhmp-interfaces + make + if [ $? = 0 ]; then + log "\n## Build of PyNTS Successful ##\n" + log "## Following docker images were built ##\n" + docker images | grep pynts + else + log "\n### Build failed ###\n" + exit 1 + fi +} + +create_docker_network() { + log "\n## Creating docker network - ${DOCKER_NETWORK_NAME} ##\n" + docker network create --subnet ${DOCKER_NETWORK_SUB} --gateway ${DOCKER_NETWORK_GW} ${DOCKER_NETWORK_NAME} +} + +start_pynts() { + log "## Overwriting file - docker-compose-o-ru-mplane.yaml - with custom file ##\n" + cp ${CONFIGDIR}/${CUSTOM_O_RU_MPLANE_DC_FILE} ${TMPDIR}/sim-o1-ofhmp-interfaces + cp ${CONFIGDIR}/${CUSTOM_O_RU_MPLANE_SSH_CALLHOME} ${TMPDIR}/sim-o1-ofhmp-interfaces/o-ru-mplane/data + cp ${CONFIGDIR}/${CUSTOM_O_RU_MPLANE_TLS_CALLHOME} ${TMPDIR}/sim-o1-ofhmp-interfaces/o-ru-mplane/data + cp ${CONFIGDIR}/${CUSTOM_O_RU_MPLANE_TLS_NON_CALLHOME} ${TMPDIR}/sim-o1-ofhmp-interfaces/o-ru-mplane/data + log "## Starting PyNTS simulator ##\n" + docker compose -f ${TMPDIR}/sim-o1-ofhmp-interfaces/${CUSTOM_O_RU_MPLANE_DC_FILE} up -d +} + +start_sdnr_components() { + log "## Starting SDNR Components (MARIADB, SDNR, SDNC-WEB) ##\n" + log "## Copying certs directory to $TMPDIR ##\n" + cp -r ${CONFIGDIR}/certs ${TMPDIR} + log "## Copying sdnr directory to $TMPDIR ##\n" + cp -r ${CONFIGDIR}/sdnr ${TMPDIR} + log "## Copying sdnc-web directory to $TMPDIR ##\n" + cp -r ${CONFIGDIR}/sdnc-web ${TMPDIR} + log "## Copying docker compose file to $TMPDIR ##\n" + cp ${CONFIGDIR}/${SDNR_COMPONENTS_DC_FILE} ${TMPDIR} + cd ${TMPDIR} + docker-compose -f ${TMPDIR}/${SDNR_COMPONENTS_DC_FILE} --env-file ${CONFIGDIR}/.env up -d + cd ${ROOTDIR} +} + +start_test_suite() { + python3 ${ROOTDIR}/src/Main.py --logFile ${LOGDIR}/${LOGFILE} +} + +#Main +log "## Starting CI/CD ##\n" +cleanup +mkdir $TMPDIR +build_pynts_images +create_docker_network +start_sdnr_components +start_pynts +sleep 20 +start_test_suite diff --git a/CICD/config/.env b/CICD/config/.env new file mode 100644 index 0000000..960f1dd --- /dev/null +++ b/CICD/config/.env @@ -0,0 +1,12 @@ +SDNC_IMAGE=o-ran-sc/oam-oam-controller/sdnr-image:latest +ADMIN_PASSWORD=admin +SDNC_REST_PORT=8181 +SDNC_CERT_DIR=/opt/opendaylight/current/certs + +SDNRDB_IMAGE_ES=docker.elastic.co/elasticsearch/elasticsearch-oss:7.9.3 +SDNC_DB_IMAGE=docker.io/library/mariadb:11.1.2 +SDNC_DB_ROOT_PASSWORD=sdnrdb +SDNC_DB_USERNAME=sdnrdb +SDNC_DB_PASSWORD=sdnrdb + +SDNC_WEB_IMAGE=o-ran-sc/oam-oam-controller/sdnr-web-image:latest diff --git a/CICD/config/certs/certs.properties b/CICD/config/certs/certs.properties new file mode 100644 index 0000000..0711ad1 --- /dev/null +++ b/CICD/config/certs/certs.properties @@ -0,0 +1,4 @@ +keys0.zip +*********** +keys1.zip +*********** diff --git a/CICD/config/certs/keys0.zip b/CICD/config/certs/keys0.zip new file mode 100644 index 0000000000000000000000000000000000000000..28a34bdd4a25961ea6374e3a9cbdc72424a997e8 GIT binary patch literal 3838 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 +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIk4s7xBaGXdgCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI7qjnyFxa3mBIIEyHgvXzCmhOT/ +atHsneicZqaGXxz57z1mPosvGwf2w6WerxOyW+cFejNepgMH+c5MQAfTuTD0H5g3 +SoyC9TKfHBld439sKO3hnDBROsypugO2uP4ownGiKQxOdwHNCOS8nC1EbUYC6nHR +B5QtRpDHZzB2t9dd6+RU1PuPUFRxjIPZsCM1DdKKhMHQHr8WDSbi170XfzC6O2Ko +23tgDq9cQYTqmgFedjyWpEmxfcibaujGOZ4VQej+tn60A03cXHG05tN/XvDCbQty +9bw1kiS8e+qmdUhkEIhR2aY0Z9sCUOLwJPDg/1vE0ZwK/bRGRD432PD+dmSLFV+v +m2m/ec8IQer8hCleI6GBaFI28QZyS2jznbzS7b/hU+nyxkZXejAymU1OBcNV4H8M +qf5ITWs+Ma5fc/8X90MlJacmBo3JuusTvDImLFP+5Nn5Yo3cnDeiAyMo0vFuywrv +bATYAncPlzksb6py3D5iXmLxREgLI14/TdZLhcYXBHw76oPz+/CH0A2P/HICPIjr +zF8U6zNI4bIguBTfVmm6YLjzOkVkKx4e/0fJiQO1yhzIsghhByIMg1uPcm0olNQz +r+YRPKTqFCPRxyGgPMleN56qeLhN8Q1WyJzIJoVVpDFc+4Stbv71C/po6/6A3v4r +hGUPCSsj8wJN+ozdamDWpeyRVCwXmmKwJU96pbnhdH/l6CPjmniAuKLzOMLJH1AD +FJEm1Frpz40BDC2U/165+nlfcHZfePWVPpNuqWzUfywqu8ORS/pYhapFoLLafQIn +22KhnPnbNXclIzuI0wiKjoNAfzJM0S9hysdojK/bptaZXUFeBEe41A8exuOjOxRh +pJqqgq2cRx6cmnAy0dr54+GoZr3haQCqTk814cxumOHqQdWllblA1D9b5Wd+8T5+ +tYdzYatsvjeY/VDH5czAbUhgBHGO3Vkxm49QemcopNDeCZ7RXmSwl2X6HLfCwnfH +9zsdNrIMfSTdRk9H4iHTyFRyoPViX6wYxlD7B9hJWggEyDVg9RvJImOSKyWk+NKd +WmfxaywgUJkxsJeEBCso8V690lm//oWrc17qWEd29h/9J0MPNa2zXJyG1Yq1RohZ +JW3IcnE8gCoyHVjxBCVjKPA6dXtfDNfmCDyEG+GgPglQUj9TBIRGmn9e067M6dB9 +vhnK12SBQNTyoH5vWSbP2u5wk6jV5QKYyqMbNHAD1uvsBbWy4FpoI+epp2Y3XcAr +kgBzopKSaCbj1thxxUHsMYBspVDR+D0SR4fsHhj+Y3jmr37s3q1NOSkWUMcMa7Hi +zaozRSo8hYUwP5RHpPcNCTcK0dhFPAWXyGPtP7IribGQDhUAdde/s4yPuSLa28zy +uTKWU5vSlaE+9WRSKvbA8HdKTPv45dV/qUCHITvPOdsqkWJ3qhNQMrrD9Mx17oj/ +zGZTcRGQG62dfYUR9v2rGE6Gj7MzaE1SrQgYqtCzWfJ9e3fBqOlko5jtZ5Kz86DU +ZFISrkb1sATngzWFtvyNgHFx4fUsYDJbc8XlB47H5Byyj/6SypS6dMpwqpNezn8s +xQi3yUfpg7GQzTFKdwmqK/KVeh0KZF/0FM+ZCUPh6IaRDcp8+Hm7H72ZD4vPxs4s +8bvLx9bxfiI+/6Om51IQrQ== +-----END ENCRYPTED PRIVATE KEY----- +Bag Attributes + friendlyName: sdnc@sdnc.onap.org + localKeyID: 54 69 6D 65 20 31 36 31 31 36 38 33 32 39 38 35 32 32 +subject=CN = sdnc, OU = sdnc@sdnc.onap.org:DEV, OU = OSAAF, O = ONAP, C = US + +issuer=C = US, O = ONAP, OU = OSAAF, CN = intermediateCA_9 + +-----BEGIN CERTIFICATE----- +MIIE6zCCA9OgAwIBAgIJALyx+8HFJuYTMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV +BAYTAlVTMQ0wCwYDVQQKDARPTkFQMQ4wDAYDVQQLDAVPU0FBRjEZMBcGA1UEAwwQ +aW50ZXJtZWRpYXRlQ0FfOTAeFw0yMTAxMjYxNzQ4MThaFw0yMjAxMjYxNzQ4MTha +MFwxDTALBgNVBAMMBHNkbmMxHzAdBgNVBAsMFnNkbmNAc2RuYy5vbmFwLm9yZzpE +RVYxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALQtwrW3Eiru18BADUiBIbEU +sruiLu63h6jDprLqrxGt57d5MSpxaRoOPoWDPE/Z6LvMwTGfiQIPsFnZ2H3YtDsI +/p1fOFAHxCUl5Cs4HnYjJUkDs2U7dXUYZR8enNPZRfFZNUOajxERUgyE/0g+yHS1 +AlysMInFDblmNEYgQoNiN996FpBamHivCDXw612bBkkZQOTeKJaCZ0DPGIYGAJtf +Q1kIL7Y1D3c3C0VD39homtxqIb21rje63YVISprbfKX0RxijkWw0wXjaRDwxPGwH +TrDHgsrPH/zv9Hak6cJkTw5e7VBHHlL1sHYgPSDLd/8PFGkmD4a/N/IKLy/14KMC +AwEAAaOCAcMwggG/MAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgXgMCAGA1UdJQEB +/wQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBUBgNVHSMETTBLgBSB95lbELnIjN7z +Ul7qTmmgQz6s3aEwpC4wLDEOMAwGA1UECwwFT1NBQUYxDTALBgNVBAoMBE9OQVAx +CzAJBgNVBAYTAlVTggEHMB0GA1UdDgQWBBRUhHQPlauGoN9fiGiB7WYr+oIHJDCC +AQkGA1UdEQSCAQAwgf2BH21hcmsuZC5tYW5hZ2VyQHBlb3BsZS5vc2FhZi5jb22C +BHNkbmOCG2MxLnZtMS5zZG5jLnNpbXBsZWRlbW8ub25hcIIbYzIudm0xLnNkbmMu +c2ltcGxlZGVtby5vbmFwghtjMy52bTEuc2RuYy5zaW1wbGVkZW1vLm9uYXCCG2M0 +LnZtMS5zZG5jLnNpbXBsZWRlbW8ub25hcIIJb25hcC1zZG5jgg5vbmFwLXNkbmMu +b25hcIIcc2RuYy5hcGkuc2ltcGxlZGVtby5vbmFwLm9yZ4IJc2RuYy5vbmFwghx2 +bTEuc2RuYy5zaW1wbGVkZW1vLm9uYXAub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQAg +7fybHysjWyKejSfPnodYuLfQoCIaXe5C4JbwLGKweAost5E6ud2rscN/c5UYNPs/ +IskfnMxULLzJpEXdUHwLQaLJj0fQQBRHq23s8P7Emu44ZeEzxAQfI+4pKRzTYxag +4dIitf91nhUq5SQI/pcki+/ElkwfeKHYQLBDU8ygG/gZKh1UHxIjfva7v/ENqL2h +H8UDXsLhOx/guaJzH2CRQdKMminsdtnNgSRRPzWRe4EMc2ah6G6E4B/Za/n7Rhq5 +r6jpvM/XIxPCY4ci5jJIbvdahS4I54kMaLRTSl4gT8+n8ie/GzhZlXX+1MR8HCZc +8SWDYxmc8MkJ20iekiSc +-----END CERTIFICATE----- +Bag Attributes + friendlyName: CN=intermediateCA_9,OU=OSAAF,O=ONAP,C=US +subject=C = US, O = ONAP, OU = OSAAF, CN = intermediateCA_9 + +issuer=OU = OSAAF, O = ONAP, C = US + +-----BEGIN CERTIFICATE----- +MIIEdTCCAl2gAwIBAgIBBzANBgkqhkiG9w0BAQsFADAsMQ4wDAYDVQQLDAVPU0FB +RjENMAsGA1UECgwET05BUDELMAkGA1UEBhMCVVMwHhcNMTgwODE3MTg1MTM3WhcN +MjMwODE3MTg1MTM3WjBHMQswCQYDVQQGEwJVUzENMAsGA1UECgwET05BUDEOMAwG +A1UECwwFT1NBQUYxGTAXBgNVBAMMEGludGVybWVkaWF0ZUNBXzkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv0HHUkba3uNtNI3jPKimUcd6RNwmhSCJL +neMWpnjqp5/A+HCKyNsEaT4y177hNLmCm/aMm1u2JIfikc+8wEqLCSBBPz+P0h+d +o+sZ7U+4oeQizdYYpEdzHJ2SieHHa8vtu80rU3nO2NEIkuYC20HcKSEtl8fFKsk3 +nqlhY+tGfYJPTXcDOQAO40BTcgat3C3uIJHkWJJ4RivunE4LEuRv9QyKgAw7rkJV +v+f7guqpZlXy6dzAkuU7XULWcgo55MkZlssoiErMvEZJad5aWKvRY3g7qUjaQ6wO +15wOAUoRBW96eeZZbytgn8kybcBy++Ue49gPtgm1MF/KlAsp0MD5AgMBAAGjgYYw +gYMwHQYDVR0OBBYEFIH3mVsQuciM3vNSXupOaaBDPqzdMB8GA1UdIwQYMBaAFFNV +M/JL69BRscF4msEoMXvv6u1JMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B +AQsFAAOCAgEADxNymiCNr2e37iLReoaxKmZvwox0cTiNAaj7iafRzmwIoY3VXO8Q +ix5IYcp4FaQ7fV1jyp/AmaSnyHf6Osl0sx8PxsQkO7ALttxKUrjfbvNSVUA2C/vl +u5m7UVJLIUtFDZBWanzUSmkTsYLHpiANFQKd2c/cU1qXcyzgJVFEFVyyHNkF7Is+ ++pjG9M1hwQHOoTnEuU013P7X1mHek+RXEfhJWwe7UsZnBKZaZKbQZu7hEtqKWYp/ +QsHgnjoLYXsh0WD5rz/mBxdTdDLGpFqWDzDqb8rsYnqBzoowvsasV8X8OSkov0Ht +8Yka0ckFH9yf8j1Cwmbl6ttuonOhky3N/gwLEozuhy7TPcZGVyzevF70kXy7g1CX +kpFGJyEHXoprlNi8FR4I+NFzbDe6a2cFow1JN19AJ9Z5Rk5m7M0mQPaQ4RcikjB3 +aoLsASCJTm1OpOFHfxEKiBW4Lsp3Uc5/Rb9ZNbfLrwqWZRM7buW1e3ekLqntgbky +uKKISHqVJuw/vXHl1jNibEo9+JuQ88VNuAcm7WpGUogeCa2iAlPTckPZei+MwZ8w +tpvxTyYlZEC8DWzY1VC29+W2N5cvh01e2E3Ql08W1zL63dqrgdEZ3VWjzooYi4ep +BmMXTvouW+Flyvcw/0oTcfN0biDIt0mCkZ5CQVjfGL9DTOYteR5hw+k= +-----END CERTIFICATE----- diff --git a/CICD/config/sdnc-web/key.pem b/CICD/config/sdnc-web/key.pem new file mode 100644 index 0000000..04bc849 --- /dev/null +++ b/CICD/config/sdnc-web/key.pem @@ -0,0 +1,29 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC0LcK1txIq7tfA +QA1IgSGxFLK7oi7ut4eow6ay6q8Rree3eTEqcWkaDj6FgzxP2ei7zMExn4kCD7BZ +2dh92LQ7CP6dXzhQB8QlJeQrOB52IyVJA7NlO3V1GGUfHpzT2UXxWTVDmo8REVIM +hP9IPsh0tQJcrDCJxQ25ZjRGIEKDYjffehaQWph4rwg18OtdmwZJGUDk3iiWgmdA +zxiGBgCbX0NZCC+2NQ93NwtFQ9/YaJrcaiG9ta43ut2FSEqa23yl9EcYo5FsNMF4 +2kQ8MTxsB06wx4LKzx/87/R2pOnCZE8OXu1QRx5S9bB2ID0gy3f/DxRpJg+Gvzfy +Ci8v9eCjAgMBAAECggEAbB+J2MIjhOAPWK8XSYs0TK+/EhohT9+S6RN/1Z4/sLxL +cS6o8m9cQuaJXlWCu+hoYUpeJQk3jqUbjs/LurlwbnzXTlj10hDXA/PZGJZ0sTAm +D8rIvNcRhVM+W45jTj30WwDNleQKNpPOSPUGvLPwVxjIchRijEpUEg3jELILOAuW +ebloKLqc5SDAPKIpepZO7bz4L/dVlQSEBp3OTzyfeecbBNS2Vfw0K+I5BqGJAssZ +Dq+ixSHRj6mdvm7tf5e14j65W8VKvUoHbktp9z2OBCItySV4g1dqrfM7T9SqsosH +cbwR5dIieiFnhdg94rfpzH2QTCBt5MGUpCcv+CbQAQKBgQDkenCAImG1jAjzQNxb +7LXLJeIqJC2E3290hEYge2Bi+1/WmV222AAwNUEPQfKa7qUJRLpX8a4p+9kTaZos +93szyYEyp4vf93GDHvQPmKMJDCbbxa94txd5dnrtYTN+MCPjpwr+75++JRUUwcNr +k3mkzM87zhSBkyYcGiCsza4gQQKBgQDJ4enp8Zly3GqufbWJNpKut6e9hC6f4qWi +4qRUBmjnogm0HiGmn83n9B6SI6OnaRy/dXgPBogZDeETyzGu78nArDK+cy8wSy0H +aPuApqGJzsuAl6YWudYt4ooBcJL99XgTGxFAb2q04JKxh18V6DRfj7pY2uhZongI +OdcMSE2H4wKBgQCUzNEcAkhUbmEd264oCB/VsFR9UZZ7pPD3l3X8jZ2WmVQvdS69 +eCuXOfenMjIIiUfeo24g/HuLSER2Ch6pDnykm6WTEd9c+9Bnru8QgT4dFFbyZusC +2WtmZa1lkBpzInMdPptAsVr+ATSbkh3tn9xnYiPNNUfRo738K2AAauvugQKBgQCd +dzbqoOXdr4sOm0LzybtTyDBwJB/x2ej0Se9/EpjUw5DqCu6YduE2YTVPK7lEpTol +JE0G+0NAt5CtzbntB1/Ihwf1gQZ3lsuCkiJJ0K8DPGeC38ZOx5kFpUObp+EfcU29 +KUmlhsImX1xMWJiUD9B6ETN6hxTghVc2o1bXX7YJnQKBgQCGiRnjCEmKd8hefkS8 +ub9F4kdOzXmG4XhK+oZWVGPXIGfnoxm6IbWcjSArA/m8TLfJSHPKujnLOnOkffpi +7+PWzTHn5BFDGUb8z3mxwJV8e9szoDkljoiUwYU/S8eatAm6lyJv1gp2wmDI9DfT +86BefCEvGk3EzAo3L6hhHdICzA== +-----END PRIVATE KEY----- + diff --git a/CICD/config/sdnr/devicemanager.properties b/CICD/config/sdnr/devicemanager.properties new file mode 100644 index 0000000..346c215 --- /dev/null +++ b/CICD/config/sdnr/devicemanager.properties @@ -0,0 +1,49 @@ +[aai] +aaiPropertiesFile=null +aaiUrl=off +aaiUserCredentials= +aaiHeaders=["X-TransactionId: 9999"] +aaiDeleteOnMountpointRemove=false +aaiTrustAllCerts=false +aaiApiVersion=aai/v13 +aaiPcks12ClientCertFile= +aaiPcks12ClientCertPassphrase= +aaiClientConnectionTimeout=30000 +aaiApplicationId=SDNR +aaiReadTimeout=60000 + +[devicemonitor] +SeverityconnectionLossOAM=Major +SeverityconnectionLossMediator=Major +SeverityconnectionLossNeOAM=Major + +[dmonf] +pollAlarms=false + +[toggleAlarmFilter] +taEnabled=true +taDelay=3000 + +[housekeeping] +hkEnabled=false + +[dcae] +dcaeUrl=off +dcaeUserCredentials=admin:admin +dcaeHeartbeatPeriodSeconds=120 + +[pm] +pmEnabled=true + +[VESCollector] +VES_COLLECTOR_ENABLED=true +VES_COLLECTOR_TLS_ENABLED=true +VES_COLLECTOR_TRUST_ALL_CERTS=true +VES_COLLECTOR_USERNAME=sample1 +VES_COLLECTOR_PASSWORD=sample1 +VES_COLLECTOR_IP=172.18.0.8 +VES_COLLECTOR_PORT=8443 +VES_COLLECTOR_VERSION=v7 +REPORTING_ENTITY_NAME=ONAP SDN-R +EVENTLOG_MSG_DETAIL=SHORT + diff --git a/CICD/config/sdnr/mountpoint-registrar.properties b/CICD/config/sdnr/mountpoint-registrar.properties new file mode 100644 index 0000000..cb73766 --- /dev/null +++ b/CICD/config/sdnr/mountpoint-registrar.properties @@ -0,0 +1,44 @@ +[stndDefinedFault] +topic=unauthenticated.SEC_3GPP_FAULTSUPERVISION_OUTPUT +consumerGroup=myG +consumerID=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + +[general] +baseUrl=http://localhost:8181 +sdnrUser=${SDNRUSERNAME} +sdnrPasswd=${SDNRPASSWORD} + +[strimzi-kafka] +strimziEnabled=true +bootstrapServers=kafka:9092 +securityProtocol=PLAINTEXT +saslMechanism=PLAIN +saslJaasConfig=PLAIN + +[fault] +topic=unauthenticated.SEC_FAULT_OUTPUT +consumerGroup=myG +consumerID=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + +[provisioning] +topic=unauthenticated.SEC_3GPP_PROVISIONING_OUTPUT +consumerGroup=myG +consumerID=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + +[pnfRegistration] +topic=unauthenticated.VES_PNFREG_OUTPUT +consumerGroup=myG +consumerID=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + diff --git a/CICD/config/sdnr/mountpoint-registrar.properties.bkup b/CICD/config/sdnr/mountpoint-registrar.properties.bkup new file mode 100644 index 0000000..fbe68e4 --- /dev/null +++ b/CICD/config/sdnr/mountpoint-registrar.properties.bkup @@ -0,0 +1,99 @@ +[stndDefinedFault] +username=${DMAAP_STNDDEFINED_FAULT_TOPIC_USERNAME} +password=${DMAAP_STNDDEFINED_FAULT_TOPIC_PASSWORD} +topic=unauthenticated.SEC_3GPP_FAULTSUPERVISION_OUTPUT +TransportType=HTTPNOAUTH +Protocol=http +host=onap-dmaap:3904 +contenttype=application/json +group=myG +id=C1 +timeout=20000 +limit=10000 +fetchPause=5000 +jersey.config.client.readTimeout=25000 +jersey.config.client.connectTimeout=25000 +jersey.config.client.proxy.username=${HTTP_PROXY_USERNAME} +jersey.config.client.proxy.password=${HTTP_PROXY_PASSWORD} +jersey.config.client.proxy.uri=${HTTP_PROXY_URI} +consumerGroup=myG +consumerID=C1 + +[general] +dmaapEnabled=false +baseUrl=http://localhost:8181 +sdnrUser=admin +sdnrPasswd=${ODL_ADMIN_PASSWORD} + +[strimzi-kafka] +strimziEnabled=false +bootstrapServers=onap-strimzi-kafka-0:9094,onap-strimzi-kafka-1:9094 +securityProtocol=PLAINTEXT +saslMechanism=PLAIN +saslJaasConfig=PLAIN + +[fault] +faultConsumerClass=org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.impl.DMaaPFaultVESMsgConsumer +TransportType=HTTPNOAUTH +host=onap-dmaap:3904 +topic=unauthenticated.SEC_FAULT_OUTPUT +contenttype=application/json +group=myG +id=C1 +timeout=2000 +limit=1000 +fetchPause=50000 +jersey.config.client.readTimeout=25000 +jersey.config.client.connectTimeout=25000 +jersey.config.client.proxy.username=${HTTP_PROXY_USERNAME} +jersey.config.client.proxy.password=${HTTP_PROXY_PASSWORD} +jersey.config.client.proxy.uri=proxy.conexus.srvc.local:3128 +Protocol=http +username=${DMAAP_FAULT_TOPIC_USERNAME} +password=${DMAAP_FAULT_TOPIC_PASSWORD} +consumerGroup=myG +consumerID=C1 + +[provisioning] +username=${DMAAP_CM_TOPIC_USERNAME} +password=${DMAAP_CM_TOPIC_PASSWORD} +topic=unauthenticated.SEC_3GPP_PROVISIONING_OUTPUT +TransportType=HTTPNOAUTH +Protocol=http +host=onap-dmaap:3904 +contenttype=application/json +group=myG +id=C1 +timeout=20000 +limit=10000 +fetchPause=5000 +jersey.config.client.readTimeout=25000 +jersey.config.client.connectTimeout=25000 +jersey.config.client.proxy.username=${HTTP_PROXY_USERNAME} +jersey.config.client.proxy.password=${HTTP_PROXY_PASSWORD} +jersey.config.client.proxy.uri=${HTTP_PROXY_URI} +consumerGroup=myG +consumerID=C1 + +[pnfRegistration] +pnfRegConsumerClass=org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.impl.DMaaPPNFRegVESMsgConsumer +TransportType=HTTPNOAUTH +host=onap-dmaap:3904 +topic=unauthenticated.VES_PNFREG_OUTPUT +contenttype=application/json +group=myG +id=C1 +timeout=2000 +limit=1000 +fetchPause=25000 +jersey.config.client.readTimeout=25000 +jersey.config.client.connectTimeout=25000 +jersey.config.client.proxy.username=${HTTP_PROXY_USERNAME} +jersey.config.client.proxy.password=${HTTP_PROXY_PASSWORD} +jersey.config.client.proxy.uri=proxy.conexus.srvc.local:3128 +Protocol=http +username=${DMAAP_PNFREG_TOPIC_USERNAME} +password=${DMAAP_PNFREG_TOPIC_PASSWORD} +consumerGroup=myG +consumerID=C1 + diff --git a/CICD/config/sdnr/oauth-aaa-app-config.xml b/CICD/config/sdnr/oauth-aaa-app-config.xml new file mode 100644 index 0000000..65e34db --- /dev/null +++ b/CICD/config/sdnr/oauth-aaa-app-config.xml @@ -0,0 +1,97 @@ + + + + + + +
+ tokenAuthRealm + + org.onap.ccsdk.features.sdnr.wt.oauthprovider.OAuth2Realm +
+ +
+ securityManager.realms + $tokenAuthRealm +
+ +
+ anyroles + org.onap.ccsdk.features.sdnr.wt.oauthprovider.filters.AnyRoleHttpAuthenticationFilter +
+
+ authcBearer + + org.onap.ccsdk.features.sdnr.wt.oauthprovider.filters.BearerAndBasicHttpAuthenticationFilter +
+ + +
+ accountingListener + org.opendaylight.aaa.shiro.filters.AuthenticationListener +
+
+ securityManager.authenticator.authenticationListeners + $accountingListener +
+ + +
+ dynamicAuthorization + org.onap.ccsdk.features.sdnr.wt.oauthprovider.filters.CustomizedMDSALDynamicAuthorizationFilter +
+ + + + /**/operations/cluster-admin** + authcBearer, roles[admin] + + + /**/v1/** + authcBasic, roles[admin] + + + /**/config/aaa*/** + authcBasic, roles[admin] + + + /oauth/** + anon + + + /odlux/** + anon + + + /apidoc/** + authcBasic + + + /rests/** + authcBearer, anyroles["admin,provision"] + + + /** + authcBearer, roles[admin] + +
diff --git a/CICD/config/sdnr/oauth-provider.config.json b/CICD/config/sdnr/oauth-provider.config.json new file mode 100644 index 0000000..e7c8d47 --- /dev/null +++ b/CICD/config/sdnr/oauth-provider.config.json @@ -0,0 +1,22 @@ +{ + "tokenSecret": "secret", + "tokenIssuer": "onap.sdnc", + "publicUrl": "http://172.18.0.4:8080", + "redirectUri": "/odlux/index.html#/oauth?token=", + "supportOdlUsers": "true", + "providers": [ +{ + "id": "identity", + "type": "KEYCLOAK", + "url": "https://identity.smo-int-1.t3.lab.osn-lab.com", + "clientId": "odlux.app", + "secret": "2a64fdca-c205-4b52-9f58-195ccc142ddb", + "scope": "openid", + "title": "ONAP-IDENTITY", + "roleMapping": { + "administration": "admin" + }, + "realmName": "onap", + "trustAll": "true" + }] +} diff --git a/CICD/config/sdnrconfig.json b/CICD/config/sdnrconfig.json new file mode 100644 index 0000000..d4657f6 --- /dev/null +++ b/CICD/config/sdnrconfig.json @@ -0,0 +1,9 @@ +{ + "sdnrHost": "172.18.0.3", + "sdnrPort": 8181, + "basicAuth": true, + "credentials": { + "sdnrUsername": "admin", + "sdnrPassword": "admin" + } +} \ No newline at end of file diff --git a/CICD/config/testsuiteconfig.json b/CICD/config/testsuiteconfig.json new file mode 100644 index 0000000..a0d12a6 --- /dev/null +++ b/CICD/config/testsuiteconfig.json @@ -0,0 +1,4 @@ +{ + "debugLevel": "DEBUG", + "testplanDir": "testplans" +} \ No newline at end of file diff --git a/CICD/log/.gitkeep b/CICD/log/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/CICD/src/ApiRequest.py b/CICD/src/ApiRequest.py new file mode 100644 index 0000000..6d16f47 --- /dev/null +++ b/CICD/src/ApiRequest.py @@ -0,0 +1,27 @@ +# Abstract class which defines the common structure for all REST requests +from abc import ABC, abstractmethod + +class ApiRequest(): + baseurl: str + endpoint: str + headers: dict[str, str] = {} + query_params: dict[str, str] + request_body: str + + @abstractmethod + def __init__(self, baseurl: str, endpoint: str): + self.baseurl = baseurl + self.endpoint = endpoint + + @abstractmethod + def execute(self): + pass + + def add_header(self, key: str, value: str): + self.headers[key] = value + + def add_query_param(self, key: str, value: str): + self.query_params[key] = value + + def set_request_body(self, request_body: str): + self.request_body = request_body diff --git a/CICD/src/Main.py b/CICD/src/Main.py new file mode 100644 index 0000000..55a7cda --- /dev/null +++ b/CICD/src/Main.py @@ -0,0 +1,107 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +#Entry point of the test suite + +from TestPlanModel import TestPlan +from TestPlanRunner import TestPlanRunner +from pydantic import BaseModel +import json +import os +import sys +import argparse +from pathlib import Path +from SdnrConfigModel import SdnrConfig +from TestSuiteConfig import TestSuiteConfig +import logging + +logger = logging.getLogger(__name__) +parser = argparse.ArgumentParser(description="Test Suite") +parser.add_argument("--logFile", type=str, required=True, help="log file name including path") +successCnt: int = 0 +failedCnt: int = 0 + +class Main: + testsuite_config: TestSuiteConfig + sdnrconfig: SdnrConfig + + + def __init__(self, logFile: str): + print("Initializing Test Suite ...") + logging.basicConfig ( + level=logging.DEBUG, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + handlers=[ + logging.FileHandler(logFile), + logging.StreamHandler() + ] + ) + self.load_testsuite_config() + self.load_sdnr_config() + + def load_sdnr_config(self) -> None: + sdnrconfig_path = "config/sdnrconfig.json" + self.sdnrconfig = SdnrConfig.model_validate(json.loads(Path(sdnrconfig_path).read_text())) + + def load_testsuite_config(self) -> None: + testsuiteconfig_path = "config/testsuiteconfig.json" + self.testsuite_config = TestSuiteConfig.model_validate(json.loads(Path(testsuiteconfig_path).read_text())) + + def start(self) -> None: + # Iterate through test plans + for _, dirs, _ in os.walk(self.testsuite_config.testplan_dir): + dirs.sort() + for dir in dirs: + logger.info("Executing Test Plan : %s", dir) + for file in os.listdir(self.testsuite_config.testplan_dir+"/"+dir): + if "plan" in file: + self.executeTest(dir, file) + + def executeTest(self, subdir: str, testplan_file: str): + global successCnt, failedCnt + logger.info("\n======== BEGIN TEST: Test Dir - %s ========", subdir) + # 1. Load test plan + testplan_path = "testplans/" + subdir + "/" + testplan_file + data = json.loads(Path(testplan_path).read_text()) + test_plan = TestPlan.model_validate(data) + + # 2. Execute Plan + testplan_runner = TestPlanRunner(self.testsuite_config, self.sdnrconfig, test_plan) + (create_result, validate_result, cleanup_result) = testplan_runner.run() + if (create_result and validate_result and cleanup_result): + successCnt += 1 + else: + failedCnt += 1 + + # 3. Print test result + logger.info("---------------------------------------------------------------------------") + logger.info("| Test %s Result - Execution - %s, Validation - %s, Cleanup - %s |", + subdir, create_result, validate_result, cleanup_result) + logger.info("---------------------------------------------------------------------------") + logger.info("======== END TEST: Test Dir - %s. ========\n", subdir) + +#Main +if __name__ == '__main__': + args = parser.parse_args() + main = Main(args.logFile) + main.start() + logger.info ("Test Execution Summary - Success = %d Failed = %d", successCnt, failedCnt) + if (failedCnt > 0): + logger.info("TEST Suite Execution Failed") + sys.exit(1) + else: + logger.info("TEST Suite Execution Success") + sys.exit(0) diff --git a/CICD/src/SdnrConfigModel.py b/CICD/src/SdnrConfigModel.py new file mode 100644 index 0000000..a1e175c --- /dev/null +++ b/CICD/src/SdnrConfigModel.py @@ -0,0 +1,46 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +from pydantic import BaseModel, Field +import base64 + +class SdnrCredentials(BaseModel): + sdnr_username: str = Field(..., alias="sdnrUsername") + sdnr_password: str = Field(..., alias="sdnrPassword") + +class SdnrConfig(BaseModel): + sdnr_host: str = Field(..., alias="sdnrHost") + sdnr_port: int = Field(..., alias="sdnrPort") + basic_auth: bool = Field(..., alias="basicAuth") + credentials: SdnrCredentials + #TODO: Enhance for Token based Authentication + + def get_auth_token(self) -> str : + # Return base64 encoded value if authBasic or token if oauth + if self.basic_auth: + auth_bytes = (self.credentials.sdnr_username + ":" + self.credentials.sdnr_password).encode("utf-8") + auth_encoded = base64.b64encode(auth_bytes) + return auth_encoded.decode("utf-8") #return string + + def get_sdnr_headers(self) -> dict: + headers = { + 'accept': 'application/json', + 'authorization': 'Basic ' + self.get_auth_token() + } + return headers + + def get_sdnr_url(self) -> str: + return "http://" + self.sdnr_host + ":" + str(self.sdnr_port) \ No newline at end of file diff --git a/CICD/src/TestPlanModel.py b/CICD/src/TestPlanModel.py new file mode 100644 index 0000000..83cb796 --- /dev/null +++ b/CICD/src/TestPlanModel.py @@ -0,0 +1,65 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +from typing import Optional +from pydantic import BaseModel, Field + +# Class to validate the Test plan data (Ex: testplan.json) +class Input (BaseModel): + req_type: str = Field(..., alias="reqType") + req_endpoint: str = Field(..., alias="reqEndPoint") + req_payload_file: str = Field(..., alias="reqPayloadFile") + +class Validation (BaseModel): + req_type: str = Field(..., alias="reqType") + req_endpoint: str = Field(..., alias="reqEndPoint") + criteria: object + +class Cleanup (BaseModel): + req_type: str = Field(..., alias="reqType") + req_endpoint: str = Field(..., alias="reqEndPoint") + +class TestPlan(BaseModel): + description: str + plan_id: str = Field(..., alias="plan-id") + input: Optional[Input] = None + exp_resp_code: Optional[int] = Field(None, alias="expectedRespCode") + validation: Validation = Field(..., alias="validation") + cleanup: Optional[Cleanup] = None + + def get_validate_url(self): + return self.validation.req_endpoint + + def get_validate_req_type(self): + return self.validation.req_type + + def get_cleanup_url(self): + return self.cleanup.req_endpoint + + def get_cleanup_req_type(self): + return self.cleanup.req_type + + def get_input_url(self): + return self.cleanup.req_endpoint + + def get_input_req_type(self): + return self.cleanup.req_type + + def get_input_payload_file(self): + return self.input.req_payload_file + + def get_input(self): + return self.input \ No newline at end of file diff --git a/CICD/src/TestPlanRunner.py b/CICD/src/TestPlanRunner.py new file mode 100644 index 0000000..fc93629 --- /dev/null +++ b/CICD/src/TestPlanRunner.py @@ -0,0 +1,121 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +from TestPlanModel import TestPlan +import json +import requests +from pathlib import Path +from SdnrConfigModel import SdnrConfig +from TestSuiteConfig import TestSuiteConfig +import logging +from typing import Tuple +import time + +logger = logging.getLogger("TestPlanRunner") + +class TestPlanRunner(): + testplan: TestPlan + sdnrconfig: SdnrConfig + testsuite_cfg: TestSuiteConfig + create_success: bool = False + validate_success: bool = False + cleanup_success: bool = False + + def __init__(self, testsuite_config: TestSuiteConfig, sdnrconfig: SdnrConfig, testplan: TestPlan): + self.testplan = testplan + self.sdnrconfig = sdnrconfig + self.testsuite_cfg = testsuite_config + + def run(self) -> Tuple[bool, bool, bool]: + self.create_test() + if (self.create_success): + self.validate_test() + self.cleanup() + return (self.create_success, self.validate_success, self.cleanup_success) + + def create_test(self): + logger.info("Creating Test - START") + logger.info("Test Description = %s",self.testplan.description) + logger.info("Test Plan Input = %s", self.testplan.get_input()) + if (self.testplan.get_input() is not None): + logger.info("Request Type - %s",self.testplan.get_input_req_type()) + + payload_file = "testplans/"+self.testplan.get_input_payload_file() + payload = json.loads(Path(payload_file).read_text()) + logger.info("Payload = %s", payload) + logger.info(self.sdnrconfig.get_sdnr_url() + self.testplan.get_input_url()) + logger.info(self.sdnrconfig.get_sdnr_headers()) + response = requests.put(self.sdnrconfig.get_sdnr_url() + self.testplan.get_input_url(), + verify=True, + data=json.dumps(payload), + headers=self.sdnrconfig.get_sdnr_headers()) + + if (response.status_code == requests.codes.created): + logger.info("Request Successful - Response code = %s", response.status_code) + self.create_success = True + time.sleep(10) + else: + logger.info("Creation failed - Reason - %s",response.status_code) + logger.info("Error Message - %s", response.json()) + logger.info("Creating Test - END") + else: + logger.info("Nothing to CREATE, Proceeding for VALIDATION") + self.create_success = True + + def validate_test(self) -> bool: + logger.info("Validating test - START") + # 1. get validation type and url + url = self.testplan.get_validate_url() + type = self.testplan.get_validate_req_type() + if type == "GET": + criteria = self.testplan.validation.criteria + for key in criteria.keys(): + response = requests.get(self.sdnrconfig.get_sdnr_url() + url + key, + verify=True, + headers=self.sdnrconfig.get_sdnr_headers()) + if (response.status_code == requests.codes.OK): + logger.info("Response - %s", response.json()) + #TODO: Hard coding for now. + if response.json()["netconf-node-topology:connection-status"] == criteria[key]: + logger.info("VALIDATION SUCCESS") + self.validate_success = True + else: + logger.info("VALIDATION FAILED") + + logger.info("Validating test - END") + + + def cleanup(self): + logger.info("**** Cleanup - BEGIN ****") + logger.info("self.cleanup = %s", self.testplan.cleanup) + if (self.testplan.cleanup is not None): + cleanup_obj = self.testplan.cleanup + if cleanup_obj.req_type == "DELETE": + response = requests.delete(self.sdnrconfig.get_sdnr_url() + self.testplan.get_cleanup_url(), + verify=True, + headers=self.sdnrconfig.get_sdnr_headers()) + if (response.status_code == requests.codes.NO_CONTENT): + print("Cleanup successful") + self.cleanup_success = True + else: + logger.info("Cleanup failed") + + logger.info("**** Cleanup - END ****") + else: + logger.info("Nothing to Clean") + self.cleanup_success = True + + \ No newline at end of file diff --git a/CICD/src/TestSuiteConfig.py b/CICD/src/TestSuiteConfig.py new file mode 100644 index 0000000..137b0b1 --- /dev/null +++ b/CICD/src/TestSuiteConfig.py @@ -0,0 +1,21 @@ +################################################################################ +# Copyright 2025 highstreet technologies GmbH +# +# 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. +# + +from pydantic import BaseModel, Field + +class TestSuiteConfig(BaseModel): + debug_level: str = Field(..., alias="debugLevel") + testplan_dir: str = Field(..., alias="testplanDir") \ No newline at end of file diff --git a/CICD/testplans/001/CREATE-MOUNTPOINT-TLS.json b/CICD/testplans/001/CREATE-MOUNTPOINT-TLS.json new file mode 100644 index 0000000..d97ee22 --- /dev/null +++ b/CICD/testplans/001/CREATE-MOUNTPOINT-TLS.json @@ -0,0 +1,24 @@ +{ + "network-topology:node": [ + { + "node-id": "CICD-NON-CALLHOME-TLS-NODE", + "netconf-node-topology:netconf-node": { + "port": 65131, + "host": "10.20.11.161", + "key-based": { + "username": "netconf", + "key-id": "ODL_private_key_1" + }, + "tcp-only": "false", + "reconnect-on-changed-schema": "false", + "connection-timeout-millis": 20000, + "max-connection-attempts": 100, + "protocol": { + "name": "TLS", + "key-id": ["ODL_private_key_1", "ODL_private_key_0"] + }, + "keepalive-delay": 120 + } + } + ] +} \ No newline at end of file diff --git a/CICD/testplans/001/testplan.json b/CICD/testplans/001/testplan.json new file mode 100644 index 0000000..70b7a3d --- /dev/null +++ b/CICD/testplans/001/testplan.json @@ -0,0 +1,21 @@ +{ + "description": "Test case to mount a device via TLS and validate the ConnectionStatus", + "plan-id": "001", + "input": { + "reqType": "PUT", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-TLS-NODE", + "reqPayloadFile" : "001/CREATE-MOUNTPOINT-TLS.json" + }, + "expectedRespCode": 201, + "validation": { + "reqType": "GET", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-TLS-NODE/netconf-node-topology:netconf-node/", + "criteria": { + "connection-status": "connected" + } + }, + "cleanup": { + "reqType": "DELETE", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-TLS-NODE" + } +} diff --git a/CICD/testplans/002/CREATE-MOUNTPOINT-SSH.json b/CICD/testplans/002/CREATE-MOUNTPOINT-SSH.json new file mode 100644 index 0000000..142f564 --- /dev/null +++ b/CICD/testplans/002/CREATE-MOUNTPOINT-SSH.json @@ -0,0 +1,21 @@ +{ + "network-topology:node": [ + { + "node-id": "CICD-NON-CALLHOME-SSH-NODE", + "netconf-node-topology:netconf-node": { + "port": 8300, + "host": "10.20.11.161", + "login-password-unencrypted": { + "username": "netconf", + "password": "netconf!" + }, + "tcp-only": "false", + "reconnect-on-changed-schema": "false", + "connection-timeout-millis": 20000, + "max-connection-attempts": 100, + + "keepalive-delay": 120 + } + } + ] +} \ No newline at end of file diff --git a/CICD/testplans/002/testplan.json b/CICD/testplans/002/testplan.json new file mode 100644 index 0000000..51f4881 --- /dev/null +++ b/CICD/testplans/002/testplan.json @@ -0,0 +1,21 @@ +{ + "description": "Test case to mount a device via SSH and validate the ConnectionStatus", + "plan-id": "002", + "input": { + "reqType": "PUT", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-SSH-NODE", + "reqPayloadFile" : "002/CREATE-MOUNTPOINT-SSH.json" + }, + "expectedRespCode": 201, + "validation": { + "reqType": "GET", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-SSH-NODE/netconf-node-topology:netconf-node/", + "criteria": { + "connection-status": "connected" + } + }, + "cleanup": { + "reqType": "DELETE", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-NON-CALLHOME-SSH-NODE" + } +} diff --git a/CICD/testplans/003/testplan.json b/CICD/testplans/003/testplan.json new file mode 100644 index 0000000..df0b2b4 --- /dev/null +++ b/CICD/testplans/003/testplan.json @@ -0,0 +1,11 @@ +{ + "description": "Test case to validate a device mounted via callhome TLS", + "plan-id": "003", + "validation": { + "reqType": "GET", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-CALLHOME-TLS-NODE/netconf-node-topology:netconf-node/", + "criteria": { + "connection-status": "connected" + } + } +} diff --git a/CICD/testplans/004/testplan.json b/CICD/testplans/004/testplan.json new file mode 100644 index 0000000..ceba7d2 --- /dev/null +++ b/CICD/testplans/004/testplan.json @@ -0,0 +1,11 @@ +{ + "description": "Test case to validate a device mounted via callhome SSH", + "plan-id": "004", + "validation": { + "reqType": "GET", + "reqEndPoint": "/rests/data/network-topology:network-topology/topology=topology-netconf/node=CICD-CALLHOME-SSH-NODE/netconf-node-topology:netconf-node/", + "criteria": { + "connection-status": "connected" + } + } +} -- 2.16.6