From 535d85651ed08495509a0cc7dff40b26daf07cc5 Mon Sep 17 00:00:00 2001 From: Shai Oren Date: Sun, 28 Jun 2026 13:25:10 +0300 Subject: [PATCH] Add eco-gotests suites ibu --- ...-kni-eco-ci-cd-main__cnf-ran-ibu-4.20.yaml | 1 + ...l-cnf-ran-ibu-eco-gotests-seed-commands.sh | 64 +++++++--- ...onal-cnf-ran-ibu-eco-gotests-seed-ref.yaml | 8 +- .../cnf-ran/ibu-eco-gotests-upgrade/OWNERS | 9 ++ ...nf-ran-ibu-eco-gotests-upgrade-commands.sh | 114 ++++++++++++++++++ ...-ibu-eco-gotests-upgrade-ref.metadata.json | 15 +++ ...l-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml | 44 +++++++ ...nal-cnf-ran-ibu-mirror-seed-image-ref.yaml | 3 + .../functional/cnf-ran/ibu-report/OWNERS | 9 ++ ...-functional-cnf-ran-ibu-report-commands.sh | 107 ++++++++++++++++ ...ional-cnf-ran-ibu-report-ref.metadata.json | 15 +++ ...10n-functional-cnf-ran-ibu-report-ref.yaml | 54 +++++++++ .../ibu-send-slack-notification/OWNERS | 9 ++ ...an-ibu-send-slack-notification-commands.sh | 88 ++++++++++++++ ...-send-slack-notification-ref.metadata.json | 15 +++ ...f-ran-ibu-send-slack-notification-ref.yaml | 37 ++++++ ...ov10n-functional-cnf-ran-ibu-workflow.yaml | 7 +- 17 files changed, 578 insertions(+), 21 deletions(-) create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/OWNERS create mode 100755 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-commands.sh create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.metadata.json create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/OWNERS create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-commands.sh create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.metadata.json create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.yaml create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/OWNERS create mode 100755 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-commands.sh create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.metadata.json create mode 100644 ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.yaml diff --git a/ci-operator/config/openshift-kni/eco-ci-cd/openshift-kni-eco-ci-cd-main__cnf-ran-ibu-4.20.yaml b/ci-operator/config/openshift-kni/eco-ci-cd/openshift-kni-eco-ci-cd-main__cnf-ran-ibu-4.20.yaml index bf434c1da7d45..bd27d3a4049a4 100644 --- a/ci-operator/config/openshift-kni/eco-ci-cd/openshift-kni-eco-ci-cd-main__cnf-ran-ibu-4.20.yaml +++ b/ci-operator/config/openshift-kni/eco-ci-cd/openshift-kni-eco-ci-cd-main__cnf-ran-ibu-4.20.yaml @@ -33,6 +33,7 @@ tests: {"name":"multicluster-engine","catalog":"redhat-operators","nsname":"multicluster-engine","channel":"stable-2.10","og_name":"multicluster-engine","subscription_name":"multicluster-engine","deploy_default_config":true,"og_spec":{}}, {"name":"topology-aware-lifecycle-manager","catalog":"topology-aware-lifecycle-manager-fbc","og_name":"global-operators","nsname":"openshift-operators","fbc_iib_repo":"latest","channel":"stable","deploy_default_config":false,"ocp_operator_mirror_fbc_image_base":"quay.io/redhat-user-workloads/telco-5g-tenant/topology-aware-lifecycle-manager-fbc-${VERSION_TAG}"} ] + REPORTER_TEMPLATE_NAME: Telco 5G RAN IBU 4_20 - Telco 5G RAN IBU SPOKE_CLUSTER: '[''ibu-seed'']' SPOKE_OPERATORS: | [ diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-commands.sh b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-commands.sh index 882b22539b79b..15a0940092b0f 100644 --- a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-commands.sh +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-commands.sh @@ -22,32 +22,31 @@ echo "" # Copy inventory from SHARED_DIR (already processed by earlier hub-deploy step) echo "=== Copying inventory for seed hub ${CLUSTER_NAME} from SHARED_DIR ===" -# Set up ocp-deployment inventory (used by ibu-prepare-seed-sno.yml and ibu-poweroff-seed-spoke.yml) -# Use seed- prefixed files explicitly to avoid ambiguity with target hub files in SHARED_DIR +# Set up ocp-deployment inventory (used by prepare-ibu-seed-sno.yml and ibu-poweroff-seed-spoke.yml) mkdir -p "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars" mkdir -p "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars" -cp "${SHARED_DIR}/seed-all" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/all" -cp "${SHARED_DIR}/seed-bastions" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/bastions" -cp "${SHARED_DIR}/seed-hypervisors" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/hypervisors" -cp "${SHARED_DIR}/seed-nodes" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/nodes" -cp "${SHARED_DIR}/seed-masters" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/masters" -cp "${SHARED_DIR}/seed-bastion" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/bastion" -cp "${SHARED_DIR}/seed-hypervisor" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/hypervisor" -cp "${SHARED_DIR}/seed-master0" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/master0" +cp "${SHARED_DIR}/all" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/all" +cp "${SHARED_DIR}/bastions" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/bastions" +cp "${SHARED_DIR}/hypervisors" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/hypervisors" +cp "${SHARED_DIR}/nodes" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/nodes" +cp "${SHARED_DIR}/masters" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/masters" +cp "${SHARED_DIR}/bastion" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/bastion" +cp "${SHARED_DIR}/hypervisor" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/hypervisor" +cp "${SHARED_DIR}/master0" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/master0" # Set up cnf inventory (used by deploy-run-eco-gotests.yaml) mkdir -p "${CNF_INVENTORY_PATH}/group_vars" mkdir -p "${CNF_INVENTORY_PATH}/host_vars" -cp "${SHARED_DIR}/seed-masters" "${CNF_INVENTORY_PATH}/group_vars/masters.yaml" -cp "${SHARED_DIR}/seed-nodes" "${CNF_INVENTORY_PATH}/group_vars/nodes.yaml" -cp "${SHARED_DIR}/seed-hypervisors" "${CNF_INVENTORY_PATH}/group_vars/hypervisors.yaml" -cp "${SHARED_DIR}/seed-bastions" "${CNF_INVENTORY_PATH}/group_vars/bastions.yaml" -cp "${SHARED_DIR}/seed-all" "${CNF_INVENTORY_PATH}/group_vars/all.yaml" -cp "${SHARED_DIR}/seed-bastion" "${CNF_INVENTORY_PATH}/host_vars/bastion.yaml" -cp "${SHARED_DIR}/seed-master0" "${CNF_INVENTORY_PATH}/host_vars/master-0.yaml" -cp "${SHARED_DIR}/seed-hypervisor" "${CNF_INVENTORY_PATH}/host_vars/hypervisor.yaml" +cp "${SHARED_DIR}/masters" "${CNF_INVENTORY_PATH}/group_vars/masters.yaml" +cp "${SHARED_DIR}/nodes" "${CNF_INVENTORY_PATH}/group_vars/nodes.yaml" +cp "${SHARED_DIR}/hypervisors" "${CNF_INVENTORY_PATH}/group_vars/hypervisors.yaml" +cp "${SHARED_DIR}/bastions" "${CNF_INVENTORY_PATH}/group_vars/bastions.yaml" +cp "${SHARED_DIR}/all" "${CNF_INVENTORY_PATH}/group_vars/all.yaml" +cp "${SHARED_DIR}/bastion" "${CNF_INVENTORY_PATH}/host_vars/bastion.yaml" +cp "${SHARED_DIR}/master0" "${CNF_INVENTORY_PATH}/host_vars/master-0.yaml" +cp "${SHARED_DIR}/hypervisor" "${CNF_INVENTORY_PATH}/host_vars/hypervisor.yaml" echo "Inventory copied from SHARED_DIR" @@ -56,7 +55,7 @@ echo "=== Step 1: Prepare IBU seed SNO and retrieve kubeconfig ===" SEED_VM_NAME="master-0.${CLUSTER_NAME}" cd /eco-ci-cd -ansible-playbook playbooks/ran/ibu-prepare-seed-sno.yml \ +ansible-playbook playbooks/ran/ibu-prepare-spoke-sno.yml \ -i "${OCP_DEPLOYMENT_INVENTORY_PATH}/build-inventory.py" \ --extra-vars "hub_cluster=${CLUSTER_NAME}" \ --extra-vars "spoke_cluster=${SEED_SPOKE_CLUSTER}" \ @@ -83,6 +82,33 @@ ansible-playbook playbooks/deploy-run-eco-gotests.yaml \ --extra-vars 'eco_gotests_tag=latest' \ --extra-vars "additional_test_env_variables=\"${ECO_GOTESTS_ENV_VARS}\"" +echo "Set bastion SSH configuration" +PROJECT_DIR="/tmp" +grep ansible_ssh_private_key -A 100 "${CNF_INVENTORY_PATH}/group_vars/all.yaml" | sed 's/ansible_ssh_private_key: //g' | sed "s/'//g" > "${PROJECT_DIR}/temp_ssh_key" +chmod 600 "${PROJECT_DIR}/temp_ssh_key" + +BASTION_IP=$(grep -oP '(?<=ansible_host: ).*' "${CNF_INVENTORY_PATH}/host_vars/bastion.yaml" | sed "s/'//g") +BASTION_USER=$(grep -oP '(?<=ansible_user: ).*' "${CNF_INVENTORY_PATH}/group_vars/all.yaml" | sed "s/'//g") + +echo "Run eco-gotests via SSH tunnel" +ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 \ + -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + "${BASTION_USER}@${BASTION_IP}" -i "${PROJECT_DIR}/temp_ssh_key" \ + "cd /tmp/eco_gotests && ./eco-gotests-run.sh || true" + +echo "Gather artifacts from bastion" +mkdir -p "${ARTIFACT_DIR}/junit_eco_gotests" +scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + -i "${PROJECT_DIR}/temp_ssh_key" \ + "${BASTION_USER}@${BASTION_IP}:/tmp/eco_gotests/report/*.xml" \ + "${ARTIFACT_DIR}/junit_eco_gotests/" +rm -f "${PROJECT_DIR}/temp_ssh_key" + +# Save junit XMLs to SHARED_DIR with junit_ prefix for ibu-report step +for f in "${ARTIFACT_DIR}/junit_eco_gotests/"*.xml; do + [[ -f "$f" ]] && cp "$f" "${SHARED_DIR}/junit_ibu_seed_$(basename "$f")" +done + echo "" echo "=== Step 3: Power off seed spoke VM ===" ansible-playbook playbooks/ran/ibu-poweroff-seed-spoke.yml \ diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-ref.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-ref.yaml index b100617839b98..807ec9a382ecd 100644 --- a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-ref.yaml +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-seed/telcov10n-functional-cnf-ran-ibu-eco-gotests-seed-ref.yaml @@ -10,7 +10,7 @@ ref: seed spoke VM. Flow: - 1. Retrieve seed spoke kubeconfig from hub cluster ACM + 1. Run ibu-prepare-spoke-sno.yml to retrieve seed spoke kubeconfig from hub cluster ACM 2. Attach container storage disk to seed SNO VM 3. Configure shared container storage mount on seed SNO 4. Run eco-gotests IBU seedgeneration test suite @@ -25,6 +25,9 @@ ref: memory: 200Mi env: + - name: CLUSTER_NAME + default: "kni-qe-108" + documentation: Seed hub cluster name (manages the seed spoke via ACM) - name: SEED_SPOKE_CLUSTER default: "ibu-seed" documentation: Seed spoke SNO cluster name (where seed image is generated) @@ -34,3 +37,6 @@ ref: - name: MIRROR_REGISTRY default: "disconnected.registry.local:5000" documentation: Disconnected mirror registry address for seed image + - name: VERSION + default: "4.20" + documentation: OCP version used to tag the seed image diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/OWNERS b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/OWNERS new file mode 100644 index 0000000000000..b63f3e9982495 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/OWNERS @@ -0,0 +1,9 @@ +approvers: +- ccardenosa +- eifrach +- kononovn +- mkochanowski +- rdiazcam +- rdiscala +- shaior +- timurmp diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-commands.sh b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-commands.sh new file mode 100755 index 0000000000000..72218f575ffd7 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-commands.sh @@ -0,0 +1,114 @@ +#!/bin/bash +set -e +set -o pipefail + +echo "Checking if the job should be skipped..." +if [ -f "${SHARED_DIR}/skip.txt" ]; then + echo "Detected skip.txt file — skipping the job" + exit 0 +fi + +OCP_DEPLOYMENT_INVENTORY_PATH="/eco-ci-cd/inventories/ocp-deployment" +CNF_INVENTORY_PATH="/eco-ci-cd/inventories/cnf" + +echo "=== IBU Upgrade eco-gotests Configuration ===" +echo "TARGET_CLUSTER_NAME=${TARGET_CLUSTER_NAME}" +echo "TARGET_SPOKE_CLUSTER=${TARGET_SPOKE_CLUSTER}" +echo "ECO_GOTESTS_FEATURES=${ECO_GOTESTS_FEATURES}" +echo "MIRROR_REGISTRY=${MIRROR_REGISTRY}" +echo "VERSION=${VERSION}" +echo "" + +# Copy target hub inventory from SHARED_DIR (target-* prefixed files saved by ibu-target-hub-deploy) +echo "=== Copying target hub inventory from SHARED_DIR ===" + +mkdir -p "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars" +mkdir -p "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars" + +cp "${SHARED_DIR}/target-all" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/all" +cp "${SHARED_DIR}/target-bastions" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/bastions" +cp "${SHARED_DIR}/target-hypervisors" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/hypervisors" +cp "${SHARED_DIR}/target-nodes" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/nodes" +cp "${SHARED_DIR}/target-masters" "${OCP_DEPLOYMENT_INVENTORY_PATH}/group_vars/masters" +cp "${SHARED_DIR}/target-bastion" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/bastion" +cp "${SHARED_DIR}/target-hypervisor" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/hypervisor" +cp "${SHARED_DIR}/target-master0" "${OCP_DEPLOYMENT_INVENTORY_PATH}/host_vars/master0" + +mkdir -p "${CNF_INVENTORY_PATH}/group_vars" +mkdir -p "${CNF_INVENTORY_PATH}/host_vars" + +cp "${SHARED_DIR}/target-masters" "${CNF_INVENTORY_PATH}/group_vars/masters.yaml" +cp "${SHARED_DIR}/target-nodes" "${CNF_INVENTORY_PATH}/group_vars/nodes.yaml" +cp "${SHARED_DIR}/target-hypervisors" "${CNF_INVENTORY_PATH}/group_vars/hypervisors.yaml" +cp "${SHARED_DIR}/target-bastions" "${CNF_INVENTORY_PATH}/group_vars/bastions.yaml" +cp "${SHARED_DIR}/target-all" "${CNF_INVENTORY_PATH}/group_vars/all.yaml" +cp "${SHARED_DIR}/target-bastion" "${CNF_INVENTORY_PATH}/host_vars/bastion.yaml" +cp "${SHARED_DIR}/target-master0" "${CNF_INVENTORY_PATH}/host_vars/master-0.yaml" +cp "${SHARED_DIR}/target-hypervisor" "${CNF_INVENTORY_PATH}/host_vars/hypervisor.yaml" + +echo "Target hub inventory copied from SHARED_DIR" + +# Target hub kubeconfig at the standard telcov10n path on the target bastion +TARGET_HUB_KUBECONFIG="/home/telcov10n/project/generated/${TARGET_CLUSTER_NAME}/auth/kubeconfig" +TARGET_VM_NAME="master-0.${TARGET_CLUSTER_NAME}" + +echo "" +echo "=== Step 1: Prepare IBU target SNO and retrieve kubeconfig ===" + +cd /eco-ci-cd +ansible-playbook playbooks/ran/ibu-prepare-spoke-sno.yml \ + -i "${OCP_DEPLOYMENT_INVENTORY_PATH}/build-inventory.py" \ + --extra-vars "hub_cluster=${TARGET_CLUSTER_NAME}" \ + --extra-vars "spoke_cluster=${TARGET_SPOKE_CLUSTER}" \ + --extra-vars "seed_vm_name=${TARGET_VM_NAME}" + +echo "" +echo "=== Step 2: Run eco-gotests IBU upgrade suite ===" +TARGET_SPOKE_KUBECONFIG="/tmp/${TARGET_SPOKE_CLUSTER}-kubeconfig" + +# Build eco-gotests environment variables +ECO_GOTESTS_ENV_VARS="-e ECO_CNF_RAN_SKIP_TLS_VERIFY=true" +ECO_GOTESTS_ENV_VARS+=" -e ECO_LCA_IBGU_SEED_IMAGE=${MIRROR_REGISTRY}/ibu/seed:${VERSION}" +ECO_GOTESTS_ENV_VARS+=" -e ECO_LCA_IBU_CNF_KUBECONFIG_TARGET_SNO=${TARGET_HUB_KUBECONFIG}" + +ansible-playbook playbooks/deploy-run-eco-gotests.yaml \ + -i "${CNF_INVENTORY_PATH}/switch-config.yaml" \ + --extra-vars "kubeconfig=${TARGET_SPOKE_KUBECONFIG}" \ + --extra-vars "features=${ECO_GOTESTS_FEATURES}" \ + --extra-vars 'labels=!no-container' \ + --extra-vars 'eco_worker_label=""' \ + --extra-vars 'eco_cnf_core_net_switch_user=""' \ + --extra-vars 'eco_cnf_core_net_switch_pass=""' \ + --extra-vars 'eco_gotests_tag=latest' \ + --extra-vars "additional_test_env_variables=\"${ECO_GOTESTS_ENV_VARS}\"" + +echo "Set bastion SSH configuration" +PROJECT_DIR="/tmp" +grep ansible_ssh_private_key -A 100 "${CNF_INVENTORY_PATH}/group_vars/all.yaml" | sed 's/ansible_ssh_private_key: //g' | sed "s/'//g" > "${PROJECT_DIR}/temp_ssh_key" +chmod 600 "${PROJECT_DIR}/temp_ssh_key" + +BASTION_IP=$(grep -oP '(?<=ansible_host: ).*' "${CNF_INVENTORY_PATH}/host_vars/bastion.yaml" | sed "s/'//g") +BASTION_USER=$(grep -oP '(?<=ansible_user: ).*' "${CNF_INVENTORY_PATH}/group_vars/all.yaml" | sed "s/'//g") + +echo "Run eco-gotests via SSH tunnel" +ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 \ + -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + "${BASTION_USER}@${BASTION_IP}" -i "${PROJECT_DIR}/temp_ssh_key" \ + "cd /tmp/eco_gotests && ./eco-gotests-run.sh || true" + +echo "Gather artifacts from bastion" +mkdir -p "${ARTIFACT_DIR}/junit_eco_gotests_upgrade" +scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + -i "${PROJECT_DIR}/temp_ssh_key" \ + "${BASTION_USER}@${BASTION_IP}:/tmp/eco_gotests/report/*.xml" \ + "${ARTIFACT_DIR}/junit_eco_gotests_upgrade/" +rm -f "${PROJECT_DIR}/temp_ssh_key" + +# Save junit XMLs to SHARED_DIR with junit_ prefix for ibu-report step +for f in "${ARTIFACT_DIR}/junit_eco_gotests_upgrade/"*.xml; do + [[ -f "$f" ]] && cp "$f" "${SHARED_DIR}/junit_ibu_upgrade_$(basename "$f")" +done + +echo "" +echo "=== IBU Upgrade Eco-Gotests Complete ===" +echo "Seed image: ${MIRROR_REGISTRY}/ibu/seed:${VERSION}" diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.metadata.json b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.metadata.json new file mode 100644 index 0000000000000..89046bc0356c2 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.metadata.json @@ -0,0 +1,15 @@ +{ + "path": "telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml", + "owners": { + "approvers": [ + "ccardenosa", + "eifrach", + "kononovn", + "mkochanowski", + "rdiazcam", + "rdiscala", + "shaior", + "timurmp" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml new file mode 100644 index 0000000000000..cb60beabe897c --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-eco-gotests-upgrade/telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-ref.yaml @@ -0,0 +1,44 @@ +ref: + as: telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade + from_image: + namespace: telcov10n-ci + name: eco-ci-cd + tag: eco-ci-cd + commands: telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade-commands.sh + documentation: |- + Prepare IBU target SNO and run eco-gotests upgrade suite against the target + spoke cluster managed by the target hub (kni-qe-109). + + Flow: + 1. Copy target hub inventory from SHARED_DIR (target-* prefixed files saved + by ibu-target-hub-deploy) + 2. Run ibu-prepare-spoke-sno.yml to retrieve the target spoke kubeconfig + from the target hub ACM + 3. Run eco-gotests IBU upgrade test suite using the retrieved spoke kubeconfig; + ECO_LCA_IBU_CNF_KUBECONFIG_TARGET_SNO points to the target hub kubeconfig + at the standard telcov10n path on the target bastion + + This step runs after the seed image has been mirrored to the target bastion + and is ready for use in upgrade testing. + timeout: 90m + resources: + requests: + cpu: 100m + memory: 200Mi + + env: + - name: TARGET_CLUSTER_NAME + default: "kni-qe-109" + documentation: Target hub cluster name (manages target spoke clusters via ACM) + - name: TARGET_SPOKE_CLUSTER + default: "ibu-target" + documentation: Target spoke SNO cluster name (the cluster being upgraded via IBU) + - name: ECO_GOTESTS_FEATURES + default: "upgrade" + documentation: Space-separated list of eco-gotests features (IBU tests) + - name: MIRROR_REGISTRY + default: "disconnected.registry.local:5000" + documentation: Disconnected mirror registry address for seed image + - name: VERSION + default: "4.20" + documentation: OCP version used to tag the seed image diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-mirror-seed-image/telcov10n-functional-cnf-ran-ibu-mirror-seed-image-ref.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-mirror-seed-image/telcov10n-functional-cnf-ran-ibu-mirror-seed-image-ref.yaml index 43fb212ebb9e8..914324a3ccc9b 100644 --- a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-mirror-seed-image/telcov10n-functional-cnf-ran-ibu-mirror-seed-image-ref.yaml +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-mirror-seed-image/telcov10n-functional-cnf-ran-ibu-mirror-seed-image-ref.yaml @@ -14,6 +14,9 @@ ref: cpu: 100m memory: 200Mi env: + - name: VERSION + default: "4.20" + documentation: OCP version used to tag the seed image - name: TARGET_REGISTRY_HOST default: "10.6.184.4" documentation: IP or hostname of the target bastion's disconnected registry diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/OWNERS b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/OWNERS new file mode 100644 index 0000000000000..b63f3e9982495 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/OWNERS @@ -0,0 +1,9 @@ +approvers: +- ccardenosa +- eifrach +- kononovn +- mkochanowski +- rdiazcam +- rdiscala +- shaior +- timurmp diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-commands.sh b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-commands.sh new file mode 100644 index 0000000000000..e802c7e887358 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-commands.sh @@ -0,0 +1,107 @@ +#!/bin/bash +set -e +set -o pipefail + +if [ -f "${SHARED_DIR}/skip.txt" ]; then + echo "Detected skip.txt — skipping" + exit 0 +fi + +ECO_CI_CD_INVENTORY_PATH="/eco-ci-cd/inventories/cnf" +HUB_KUBECONFIG="/home/telcov10n/project/generated/${TARGET_CLUSTER_NAME}/auth/kubeconfig" + +process_inventory() { + local directory="$1" + local dest_file="$2" + + if [ -z "$directory" ]; then + echo "Usage: process_inventory " + return 1 + fi + + if [ ! -d "$directory" ]; then + echo "Error: '$directory' is not a valid directory" + return 1 + fi + + find "$directory" -type f | while IFS= read -r filename; do + if [[ $filename == *"secretsync-vault-source-path"* ]]; then + continue + fi + local content + content=$(cat "$filename") + local varname + varname=$(basename "${filename}") + if [[ "$content" == *$'\n'* ]]; then + echo "${varname}: |" + echo "$content" | sed 's/^/ /' + else + echo "${varname}": \'"${content}"\' + fi + done > "${dest_file}" +} + +echo "Processing common group_vars" +mkdir -p "${ECO_CI_CD_INVENTORY_PATH}/group_vars" + +find /var/group_variables/common/ -mindepth 1 -type d 2>/dev/null | while read -r dir; do + echo " group_var: $(basename "${dir}")" + process_inventory "$dir" "${ECO_CI_CD_INVENTORY_PATH}/group_vars/$(basename "${dir}")" +done + +echo "Processing hub host_vars (${TARGET_CLUSTER_NAME})" +mkdir -p "${ECO_CI_CD_INVENTORY_PATH}/host_vars" + +find "/var/host_variables/${TARGET_CLUSTER_NAME}/" -mindepth 1 -type d 2>/dev/null | while read -r dir; do + echo " host_var: $(basename "${dir}")" + process_inventory "$dir" "${ECO_CI_CD_INVENTORY_PATH}/host_vars/$(basename "${dir}")" +done + +rm -rf /tmp/reports /tmp/junit + +mkdir -p /tmp/reports +for f in "${SHARED_DIR}"/polarion_*.xml; do + if [[ -f "$f" ]]; then + filename=$(basename "$f" | sed 's/^polarion_//') + cp "$f" "/tmp/reports/${filename}" + fi +done + +mkdir -p /tmp/junit +for f in "${SHARED_DIR}"/junit_*.xml; do + if [[ -f "$f" ]]; then + filename=$(basename "$f" | sed 's/^junit_//') + cp "$f" "/tmp/junit/${filename}" + fi +done + +cd /eco-ci-cd + +METRICS_FILE="/tmp/metrics/ran-metrics.txt" + +echo "Collecting metrics" +ansible-playbook ./playbooks/collect-metrics.yml \ + -i ./inventories/cnf/switch-config.yaml \ + --extra-vars "kubeconfig=${HUB_KUBECONFIG} \ + ci_lane='${REPORTER_LAUNCH_NAME}' \ + output_file=${METRICS_FILE} \ + metrics_list=${RAN_METRICS_LIST}" || true + +REPORTS_PORTAL_ATTRIBUTES="" +if [[ -f "${METRICS_FILE}" ]]; then + REPORTS_PORTAL_ATTRIBUTES="$(cat "${METRICS_FILE}")" + echo "REPORTS_PORTAL_ATTRIBUTES: ${REPORTS_PORTAL_ATTRIBUTES}" +fi + +echo "Uploading reports to Polarion and Report Portal" +ansible-playbook ./playbooks/upload-report.yaml \ + -i ./inventories/cnf/switch-config.yaml \ + --extra-vars "kubeconfig=${HUB_KUBECONFIG} \ + reporter_template_name='${REPORTER_TEMPLATE_NAME}' \ + processed_report_dir=/tmp/reports \ + junit_report_dir=/tmp/junit \ + reports_directory=/tmp/upload \ + reporter_launch_name='${REPORTER_LAUNCH_NAME}' \ + upload_to_report_portal=${UPLOAD_TO_REPORT_PORTAL} \ + report_portal_url_filename='${REPORTPORTAL_FILES}' \ + reports_portal_attributes='${REPORTS_PORTAL_ATTRIBUTES}'" diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.metadata.json b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.metadata.json new file mode 100644 index 0000000000000..1c1c6332cbceb --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.metadata.json @@ -0,0 +1,15 @@ +{ + "path": "telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.yaml", + "owners": { + "approvers": [ + "ccardenosa", + "eifrach", + "kononovn", + "mkochanowski", + "rdiazcam", + "rdiscala", + "shaior", + "timurmp" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.yaml new file mode 100644 index 0000000000000..a1da1646535f7 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-report/telcov10n-functional-cnf-ran-ibu-report-ref.yaml @@ -0,0 +1,54 @@ +ref: + as: telcov10n-functional-cnf-ran-ibu-report + from_image: + namespace: telcov10n-ci + name: eco-ci-cd + tag: eco-ci-cd + commands: telcov10n-functional-cnf-ran-ibu-report-commands.sh + documentation: |- + Collect IBU lane metrics and upload reports to Polarion and Report Portal. + Targets the IBU target hub (kni-qe-109). Identical logic to the standard + report step but with credentials and defaults configured for the IBU lane. + grace_period: 10s + timeout: 4h0m0s + resources: + requests: + cpu: 100m + memory: 200Mi + + env: + - name: REPORTER_TEMPLATE_NAME + default: "Telco 5G RAN IBU 4_20 - Telco 5G RAN IBU" + documentation: Template name for Report Portal + - name: REPORTPORTAL_FILES + default: ".reportportal_url_ibu" + documentation: Report Portal file to upload + - name: UPLOAD_TO_REPORT_PORTAL + default: "true" + documentation: Whether to upload reports to Report Portal + - name: REPORTS_PORTAL_ATTRIBUTES_ENV + default: "" + documentation: Additional Report Portal attributes in key:value;key:value format, appended to metrics-based attributes + - name: REPORTER_LAUNCH_NAME + default: "telco-ft-ran-ibu" + documentation: Report Portal launch name and ci_lane identifier for metrics + - name: TARGET_CLUSTER_NAME + default: "kni-qe-109" + documentation: IBU target hub cluster name (must match mounted credential path) + - name: SPOKE_CLUSTER + default: "ibu-target" + documentation: Target spoke cluster name + - name: RAN_METRICS_LIST + default: "hub_general_ocp,spoke_general_ocp,acm,talm" + documentation: Comma-separated list of metrics to collect (e.g. hub_general_ocp,spoke_general_ocp,acm,talm) + credentials: + - namespace: test-credentials + name: telcov10n-ansible-group-all + mount_path: /var/group_variables/common/all + - namespace: test-credentials + name: telcov10n-ansible-group-bastions + mount_path: /var/group_variables/common/bastions + # kni-qe-109 (IBU target hub) + - namespace: test-credentials + name: telcov10n-ansible-kni-qe-109-bastion + mount_path: /var/host_variables/kni-qe-109/bastion diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/OWNERS b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/OWNERS new file mode 100644 index 0000000000000..b63f3e9982495 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/OWNERS @@ -0,0 +1,9 @@ +approvers: +- ccardenosa +- eifrach +- kononovn +- mkochanowski +- rdiazcam +- rdiscala +- shaior +- timurmp diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-commands.sh b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-commands.sh new file mode 100755 index 0000000000000..fafb4538906df --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-commands.sh @@ -0,0 +1,88 @@ +#!/bin/bash +set -e +set -o pipefail + +if [ -f "${SHARED_DIR}/skip.txt" ]; then + echo "Detected skip.txt — skipping" + exit 0 +fi + +if [ "$JOB_TYPE" = "presubmit" ]; then + echo "JOB_TYPE=presubmit — skipping" + exit 0 +fi + +SCRIPTS_FOLDER="/eco-ci-cd/scripts/ran" +PYTHON_SCRIPT="send-ran-slack-notification.py" +WEBHOOK_URL_FILE=/var/run/slack-webhook-url/url + +if [[ ! -f "$WEBHOOK_URL_FILE" ]]; then + echo "Error: Webhook URL file not found: '$WEBHOOK_URL_FILE'" >&2 + exit 1 +fi + +WEBHOOK_URL="$(cat "$WEBHOOK_URL_FILE")" + +JOB_NAME="${JOB_NAME:-unknown}" +BUILD_ID="${BUILD_ID:-unknown}" +JOB_URL="https://prow.ci.openshift.org/view/gs/test-platform-results/logs/${JOB_NAME}/${BUILD_ID}" + +if [[ -f "${SHARED_DIR}/cluster_version" ]]; then + BUILD_VERSION="$(cat "${SHARED_DIR}/cluster_version")" + echo "Build version: ${BUILD_VERSION}" +else + echo "Error: cluster_version file not found: '${SHARED_DIR}/cluster_version'" >&2 + exit 1 +fi + +echo "Fetching bastion credentials for ${TARGET_CLUSTER_NAME}" +BASTION_IP=$(cat /var/host_variables/${TARGET_CLUSTER_NAME}/bastion/ansible_host) +BASTION_USER=$(cat /var/group_variables/common/all/ansible_user) + +cat /var/group_variables/common/all/ansible_ssh_private_key > "/tmp/temp_ssh_key" +chmod 600 "/tmp/temp_ssh_key" + +SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /tmp/temp_ssh_key" + +echo "Collecting ReportPortal URLs" +REPORT_FLAGS="" +for REPORTPORTAL_FILE in ${REPORTPORTAL_FILES//;/ }; do + REPORT_NAME="${REPORTPORTAL_FILE#.reportportal_url_}" + REPORT_NAME="${REPORT_NAME//_/ }" + + if scp ${SSH_OPTS} \ + "${BASTION_USER}@${BASTION_IP}:/tmp/${REPORTPORTAL_FILE}" \ + "${SHARED_DIR}/${REPORTPORTAL_FILE}" 2>/dev/null; then + + if [[ -f "${SHARED_DIR}/${REPORTPORTAL_FILE}" ]] && [[ -s "${SHARED_DIR}/${REPORTPORTAL_FILE}" ]]; then + REPORTPORTAL_FILE_CONTENT="$(cat "${SHARED_DIR}/${REPORTPORTAL_FILE}")" + echo "ReportPortal ${REPORT_NAME} URL: ${REPORTPORTAL_FILE_CONTENT}" + REPORT_FLAG=" --${REPORTPORTAL_FILE,,}" + REPORT_FLAG="${REPORT_FLAG//_/-}" + REPORT_FLAG="${REPORT_FLAG//--./--} ${REPORTPORTAL_FILE_CONTENT}" + REPORT_FLAGS+=" ${REPORT_FLAG}" + fi + else + echo "No ReportPortal ${REPORT_NAME} URL file found on bastion" + fi +done + +POLARION_URL="N/A" +if scp ${SSH_OPTS} "${BASTION_USER}@${BASTION_IP}:/tmp/.polarion_url" "${SHARED_DIR}/polarion_url" 2>/dev/null; then + if [[ -f "${SHARED_DIR}/polarion_url" ]] && [[ -s "${SHARED_DIR}/polarion_url" ]]; then + POLARION_URL="$(cat "${SHARED_DIR}/polarion_url")" + fi +fi +echo "Polarion URL: ${POLARION_URL}" + +echo "Sending Slack notification" +cd "$SCRIPTS_FOLDER" + +python3 "$PYTHON_SCRIPT" \ + --webhook-url "$WEBHOOK_URL" \ + --build "$BUILD_VERSION" \ + --polarion-url "$POLARION_URL" \ + --job-url "$JOB_URL" \ + ${REPORT_FLAGS} + +echo "Slack notification sent successfully" diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.metadata.json b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.metadata.json new file mode 100644 index 0000000000000..f75cf437ae982 --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.metadata.json @@ -0,0 +1,15 @@ +{ + "path": "telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.yaml", + "owners": { + "approvers": [ + "ccardenosa", + "eifrach", + "kononovn", + "mkochanowski", + "rdiazcam", + "rdiscala", + "shaior", + "timurmp" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.yaml new file mode 100644 index 0000000000000..7658ab8b643df --- /dev/null +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu-send-slack-notification/telcov10n-functional-cnf-ran-ibu-send-slack-notification-ref.yaml @@ -0,0 +1,37 @@ +ref: + as: telcov10n-functional-cnf-ran-ibu-send-slack-notification + from_image: + namespace: telcov10n-ci + name: eco-ci-cd + tag: eco-ci-cd + commands: telcov10n-functional-cnf-ran-ibu-send-slack-notification-commands.sh + documentation: |- + Send Slack notification after IBU workflow completion. SCPs the Report Portal + URL from the IBU target hub (kni-qe-109) bastion and sends a notification with + build version, Polarion URL, and Report Portal URL. + timeout: 30m + resources: + requests: + cpu: 100m + memory: 200Mi + env: + - name: TARGET_CLUSTER_NAME + default: "kni-qe-109" + documentation: IBU target hub cluster name (bastion used to fetch Report Portal URL) + - name: REPORTPORTAL_FILES + default: ".reportportal_url_ibu" + documentation: Report Portal URL file(s) to fetch from the bastion (semicolon-separated) + credentials: + - namespace: test-credentials + name: telcov10n-ansible-group-all + mount_path: /var/group_variables/common/all + - namespace: test-credentials + name: telcov10n-ansible-group-bastions + mount_path: /var/group_variables/common/bastions + # kni-qe-109 (IBU target hub) + - namespace: test-credentials + name: telcov10n-ansible-kni-qe-109-bastion + mount_path: /var/host_variables/kni-qe-109/bastion + - namespace: test-credentials + name: vran-qe-ci-webhook + mount_path: /var/run/slack-webhook-url diff --git a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu/telcov10n-functional-cnf-ran-ibu-workflow.yaml b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu/telcov10n-functional-cnf-ran-ibu-workflow.yaml index 19293f9179c84..4cd9abe923777 100644 --- a/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu/telcov10n-functional-cnf-ran-ibu-workflow.yaml +++ b/ci-operator/step-registry/telcov10n/functional/cnf-ran/ibu/telcov10n-functional-cnf-ran-ibu-workflow.yaml @@ -37,5 +37,10 @@ workflow: - ref: telcov10n-functional-cnf-ran-ibu-eco-gotests-seed # Mirror the generated seed image from seed bastion to target bastion's disconnected registry - ref: telcov10n-functional-cnf-ran-ibu-mirror-seed-image - post: [] + # Prepare target SNO, run eco-gotests IBU upgrade suite against target spoke + - ref: telcov10n-functional-cnf-ran-ibu-eco-gotests-upgrade + # Collect IBU metrics and upload reports to Polarion and Report Portal + - ref: telcov10n-functional-cnf-ran-ibu-report + # Send Slack notification + - ref: telcov10n-functional-cnf-ran-ibu-send-slack-notification