Meridio: update node to 2204
[infra/cicd.git] / jjb / nsm / e2e.Jenkinsfile
index 343205098bb24e754232bf238e92df22141a3400..d38d88f2140de2ced112578f929cb141c4254a0d 100644 (file)
@@ -1,6 +1,21 @@
+/*
+Copyright (c) 2022 Nordix Foundation
+
+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.
+*/
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 
-node('nordix-nsm-build-ubuntu1804') {
+node('nordix-nsm-build-ubuntu2204') {
     build_number = env.BUILD_NUMBER
     workspace = env.WORKSPACE
     ws("${workspace}/${build_number}") {
@@ -14,6 +29,12 @@ node('nordix-nsm-build-ubuntu1804') {
         def kubernetes_version = params.KUBERNETES_VERSION
         def nsm_version = params.NSM_VERSION
         def ip_family = params.IP_FAMILY
+        def number_of_workers = params.NUMBER_OF_WORKERS
+        def environment_name = params.ENVIRONMENT_NAME
+        def focus = params.FOCUS
+        def skip = params.SKIP
+
+        def seed = params.SEED
 
         stage('Clone/Checkout') {
             git branch: default_branch, url: git_project
@@ -30,63 +51,75 @@ node('nordix-nsm-build-ubuntu1804') {
         }
         timeout(60) {
             stage('Environment') {
-                currentBuild.description = "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Current Branch: $current_branch"
+                currentBuild.description = "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Current Branch: $current_branch / Seed: $seed"
 
+                def command = "make -s -C test/e2e/environment/$environment_name/ KUBERNETES_VERSION=$kubernetes_version NSM_VERSION=$nsm_version IP_FAMILY=$ip_family KUBERNETES_WORKERS=$number_of_workers MERIDIO_VERSION=$meridio_version TAPA_VERSION=$tapa_version"
                 try {
-                    ExecSh("make -s -C docs/demo/scripts/kind/ KUBERNETES_VERSION=$kubernetes_version NSM_VERSION=$nsm_version KUBERNETES_IP_FAMILY=$ip_family").call()
-                    ExecSh("helm install deployments/helm/ --generate-name --create-namespace --namespace red --set trench.name=trench-a --set ipFamily=$ip_family").call()
-                    ExecSh("helm install deployments/helm/ --generate-name --create-namespace --namespace red --set trench.name=trench-b --set vlan.id=200 --set ipFamily=$ip_family").call()
-                    ExecSh('helm install examples/target/deployments/helm/ --generate-name --create-namespace --namespace red --set applicationName=target-a --set default.trench.name=trench-a').call()
-                    ExecSh('helm install examples/target/deployments/helm/ --generate-name --create-namespace --namespace red --set applicationName=target-b --set default.trench.name=trench-b').call()
-                    sh 'sleep 10'
-                    ExecSh('kubectl wait --for=condition=Ready pods --all --all-namespaces --timeout=5m').call()
+                    ExecSh(command).call()
                 } catch (Exception e) {
-                    Error('Error creating the environment').call()
+                    unstable 'Environment setup failed'
+                    currentBuild.result = 'FAILURE'
                 }
             }
             stage('E2E') {
-                try {
-                    ExecSh("make e2e E2E_PARAMETERS=\"\$(cat ./test/e2e/environment/kind-helm/$ip_family/config.txt | tr '\\n' ' ')\"").call()
-                } catch (Exception e) {
-                    unstable 'E2E Tests failed'
-                    currentBuild.result = 'FAILURE'
+                if (currentBuild.result != 'FAILURE') {
+                    def command = "make e2e E2E_PARAMETERS=\"\$(cat ./test/e2e/environment/$environment_name/$ip_family/config.txt | tr '\\n' ' ')\" E2E_SEED=$seed E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\""
+                    try {
+                        ExecSh(command).call()
+                        currentBuild.result = 'SUCCESS'
+                    } catch (Exception e) {
+                        unstable 'E2E Tests failed'
+                        currentBuild.result = 'FAILURE'
+                    }
+                } else {
+                    Utils.markStageSkippedForConditional('E2E')
                 }
             }
         }
-        stage('Cleanup') {
-            Cleanup()
-        }
         stage('Report') {
-            Report().call()
+            try {
+                Report().call()
+            } catch (Exception e) {
+                unstable 'Failed to create the report'
+            }
         }
         stage('Next') {
-            Next(next).call()
+            if (next == true && currentBuild.result != 'ABORTED') {
+                Next(next, number_of_workers, environment_name, focus, skip, current_branch).call()
+            } else {
+                Utils.markStageSkippedForConditional('Next')
+            }
+        }
+        stage('Cleanup') {
+            Cleanup()
         }
     }
 }
 
-def Next(next) {
-    if (next == 'true') {
-        return {
-            def meridio_version = GetMeridioVersion()
-            def tapa_version = GetTAPAVersion()
-            def nsm_version = GetNSMVersion()
-            def kubernetes_version = GetKubernetesVersion()
-            def ip_family = GetIPFamily()
-            echo "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version"
-            build job: 'meridio-e2e-test-kind', parameters: [
+def Next(next, number_of_workers, environment_name, focus, skip, current_branch) {
+    return {
+        def meridio_version = GetMeridioVersion()
+        def tapa_version = GetTAPAVersion()
+        def nsm_version = GetNSMVersion()
+        def kubernetes_version = GetKubernetesVersion()
+        def ip_family = GetIPFamily()
+        def seed = GetSeed()
+        echo "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Seed: $seed"
+        build job: 'meridio-e2e-test-kind', parameters: [
                 string(name: 'NEXT', value: 'true'),
                 string(name: 'MERIDIO_VERSION', value: "$meridio_version"),
                 string(name: 'TAPA_VERSION', value: "$tapa_version"),
                 string(name: 'KUBERNETES_VERSION', value: "$kubernetes_version"),
                 string(name: 'NSM_VERSION', value: "$nsm_version"),
-                string(name: 'IP_FAMILY', value: "$ip_family")
+                string(name: 'IP_FAMILY', value: "$ip_family"),
+                string(name: 'NUMBER_OF_WORKERS', value: "$number_of_workers"),
+                string(name: 'ENVIRONMENT_NAME', value: "$environment_name"),
+                string(name: 'SEED', value: "$seed"),
+                string(name: 'FOCUS', value: "$focus"),
+                string(name: 'SKIP', value: "$skip"),
+                string(name: 'CURRENT_BRANCH', value: "$current_branch"),
+                string(name: 'DRY_RUN', value: env.DRY_RUN)
             ], wait: false
-        }
-    } else {
-        return {
-            Utils.markStageSkippedForConditional('Next')
-        }
     }
 }
 
@@ -125,6 +158,10 @@ def GetIPFamily() {
     return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.IP-Family[$index_of_ip_family]'", returnStdout: true).trim()
 }
 
+def GetSeed() {
+    return sh(script: 'shuf -i 1-2147483647 -n1', returnStdout: true).trim()
+}
+
 // http://JENKINS_URL/job/meridio-e2e-test-kind/api/json?tree=allBuilds[status,timestamp,id,result,description]{0,9}&pretty=true
 def Report() {
     return {
@@ -133,7 +170,7 @@ def Report() {
         def success = ''
         try {
             success = sh(script: """
-            data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,999\\}&pretty=true")
+            data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,1000\\}&pretty=true")
             success=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"SUCCESS\") | [.description] | @tsv' | grep -v \"^\$\")
             echo \$success
             """, returnStdout: true).trim()
@@ -143,7 +180,7 @@ def Report() {
         def failure = ''
         try {
             failure = sh(script: """
-            data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,999\\}&pretty=true")
+            data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,1000\\}&pretty=true")
             failure=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"FAILURE\") | [.description] | @tsv' | grep -v \"^\$\")
             echo \$failure
             """, returnStdout: true).trim()
@@ -155,6 +192,11 @@ def Report() {
         ReportNSM(success, failure).call()
         ReportIPFamily(success, failure).call()
         ReportKubernetes(success, failure).call()
+
+        try {
+            archiveArtifacts artifacts: '_output/*', followSymlinks: false
+        } catch (Exception e) {
+        }
     }
 }
 
@@ -165,7 +207,7 @@ def ReportMeridio(success, failure) {
         def meridio = sh(script: "echo \"$meridio_success\\n$meridio_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
         def formatted = sh(script: "echo \"$meridio\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3  }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
         echo "Meridio: $formatted"
-        def meridio_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-meridio', subject: 'Meridio', color: '#0B1F67', status: "$formatted")
+        badge('meridio-e2e-kind-meridio', 'Meridio', formatted)
     }
 }
 
@@ -176,7 +218,7 @@ def ReportTAPA(success, failure) {
         def tapa = sh(script: "echo \"$tapa_success\\n$tapa_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
         def formatted = sh(script: "echo \"$tapa\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3  }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
         echo "TAPA: $formatted"
-        def tapa_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-tapa', subject: 'TAPA', color: '#0B1F67', status: "$formatted")
+        badge('meridio-e2e-kind-tapa', 'TAPA', formatted)
     }
 }
 
@@ -187,7 +229,7 @@ def ReportNSM(success, failure) {
         def nsm = sh(script: "echo \"$nsm_success\\n$nsm_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
         def formatted = sh(script: "echo \"$nsm\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3  }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
         echo "NSM: $formatted"
-        def nsm_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-nsm', subject: 'NSM', color: '#0B1F67', status: "$formatted")
+        badge('meridio-e2e-kind-nsm', 'NSM', formatted)
     }
 }
 
@@ -198,7 +240,7 @@ def ReportIPFamily(success, failure) {
         def ip_family = sh(script: "echo \"$ip_family_success\\n$ip_family_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
         def formatted = sh(script: "echo \"$ip_family\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3  }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
         echo "IP Family: $formatted"
-        def ip_family_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-ip-family', subject: 'IP Family', color: '#0B1F67', status: "$formatted")
+        badge('meridio-e2e-kind-ip-family', 'IP Family', formatted)
     }
 }
 
@@ -209,10 +251,23 @@ def ReportKubernetes(success, failure) {
         def kubernetes = sh(script: "echo \"$kubernetes_success\\n$kubernetes_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
         def formatted = sh(script: "echo \"$kubernetes\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3  }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
         echo "Kubernetes: $formatted"
-        def kubernetes_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-kubernetes', subject: 'Kubernetes', color: '#0B1F67', status: "$formatted")
+        badge('meridio-e2e-kind-kubernetes', 'Kubernetes', formatted)
     }
 }
 
+def badge(id, subject, message) {
+    addEmbeddableBadgeConfiguration(id: "${id}", subject: "${subject}", color: '#0B1F67', status: "$message")
+    sh """
+    mkdir -p _output
+    echo '{' >> _output/${id}.json
+    echo '"schemaVersion": 1,' >> _output/${id}.json
+    echo '"label": "${subject}",' >> _output/${id}.json
+    echo '"message": "${message}",' >> _output/${id}.json
+    echo '"color": "#0B1F67"' >> _output/${id}.json
+    echo '}' >> _output/${id}.json
+    """
+}
+
 // Raise error in Jenkins job
 def Error(e) {
     return {
@@ -223,16 +278,21 @@ def Error(e) {
 
 // Cleanup directory and kind cluster
 def Cleanup() {
-    ExecSh('make -s -C docs/demo/scripts/kind/ clean').call()
+    def command = 'make -s -C docs/demo/scripts/kind/ clean'
+    ExecSh(command).call()
     cleanWs()
 }
 
 // Execute command
 def ExecSh(command) {
     return {
-        sh """
-            . \${HOME}/.profile
-            ${command}
-        """
+        if (env.DRY_RUN != 'true') {
+            sh """
+                . \${HOME}/.profile
+                ${command}
+            """
+        } else {
+            echo "${command}"
+        }
     }
 }