Merge "Add TestRail reporting stage for devcloud deployments"
diff --git a/build-mirror-image.groovy b/build-mirror-image.groovy
index d9169b4..822d398 100644
--- a/build-mirror-image.groovy
+++ b/build-mirror-image.groovy
@@ -4,6 +4,7 @@
  *
  * Expected parameters:
  * CLUSTER_MODEL - An URL to the Reclass model for the mirror VM.
+ * CLUSTER_MODEL_REF - Branch or tag to use for cluster model
  * CLUSTER_NAME - Cluster name used in the above model.
  * IMAGE_NAME - Name of the result image.
  * OS_CREDENTIALS_ID - ID of credentials for OpenStack API stored in Jenkins.
@@ -33,7 +34,7 @@
 def openstack = new com.mirantis.mk.Openstack()
 def date = new Date()
 def dateTime = date.format("ddMMyyyy-HHmmss")
-def venvPepper = "venvPepper"
+def venvPepper = ""
 def privateKey = ""
 def floatingIP = ""
 def openstackServer = ""
@@ -61,8 +62,9 @@
     node("python&&disk-xl") {
         try {
             def workspace = common.getWorkspace()
-            rcFile = openstack.createOpenstackEnv(OS_URL, OS_CREDENTIALS_ID, OS_PROJECT, "default", "", "default", "2", "")
             openstackEnv = String.format("%s/venv", workspace)
+            venvPepper = String.format("%s/venvPepper", workspace)
+            rcFile = openstack.createOpenstackEnv(openstackEnv, OS_URL, OS_CREDENTIALS_ID, OS_PROJECT, "default", "", "default", "2", "")
             def openstackVersion = OS_VERSION
 
             VM_IP_DELAY = VM_IP_DELAY as Integer
@@ -88,7 +90,7 @@
 
                 floatingIP = openstack.runOpenstackCommand("openstack ip floating create --format value -c floating_ip_address ${VM_FLOATING_IP_POOL}", rcFile, openstackEnv)
 
-                withEnv(["CLUSTER_NAME=${CLUSTER_NAME}", "CLUSTER_MODEL=${CLUSTER_MODEL}"]) {
+                withEnv(["CLUSTER_NAME=${CLUSTER_NAME}", "CLUSTER_MODEL=${CLUSTER_MODEL}", "CLUSTER_MODEL_REF=${CLUSTER_MODEL_REF}", "MCP_VERSION=${MCP_VERSION}"]) {
                     sh "envsubst < salt-bootstrap.sh > salt-bootstrap.sh.temp;mv salt-bootstrap.sh.temp salt-bootstrap.sh; cat salt-bootstrap.sh"
                 }
 
@@ -226,4 +228,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/ceph-remove-osd.groovy b/ceph-remove-osd.groovy
index 04a176b..71946b7 100644
--- a/ceph-remove-osd.groovy
+++ b/ceph-remove-osd.groovy
@@ -75,7 +75,11 @@
 
         // get list of osd disks of the host
         salt.runSaltProcessStep(pepperEnv, HOST, 'saltutil.sync_grains', [], null, true, 5)
-        def ceph_disks = salt.getGrain(pepperEnv, HOST, 'ceph')['return'][0].values()[0].values()[0]['ceph_disk']
+        def cephGrain = salt.getGrain(pepperEnv, HOST, 'ceph')['return']
+        if(cephGrain['return'].isEmpty()){
+            throw new Exception("Ceph salt grain cannot be found!")
+        }
+        def ceph_disks = cephGrain['return'][0].values()[0].values()[0]['ceph_disk']
         common.prettyPrint(ceph_disks)
 
         for (i in ceph_disks) {
@@ -89,7 +93,7 @@
         }
 
         // wait for healthy cluster
-        if (WAIT_FOR_HEALTHY.toBoolean() == true) {
+        if (WAIT_FOR_HEALTHY.toBoolean()) {
             waitForHealthy(pepperEnv)
         }
 
@@ -99,7 +103,7 @@
         }
 
         // wait for healthy cluster
-        if (WAIT_FOR_HEALTHY.toBoolean() == true) {
+        if (WAIT_FOR_HEALTHY.toBoolean()) {
             sleep(5)
             waitForHealthy(pepperEnv)
         }
diff --git a/cicd-lab-pipeline.groovy b/cicd-lab-pipeline.groovy
index d985b3f..6236f2a 100644
--- a/cicd-lab-pipeline.groovy
+++ b/cicd-lab-pipeline.groovy
@@ -80,7 +80,7 @@
             }
 
             stage('Connect to OpenStack cloud') {
-                openstackCloud = openstack.createOpenstackEnv(
+                openstackCloud = openstack.createOpenstackEnv(openstackEnv,
                     OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS,
                     OPENSTACK_API_PROJECT, OPENSTACK_API_PROJECT_DOMAIN,
                     OPENSTACK_API_PROJECT_ID, OPENSTACK_API_USER_DOMAIN,
diff --git a/cleanup-pipeline.groovy b/cleanup-pipeline.groovy
index ec3e19d..001e6c0 100644
--- a/cleanup-pipeline.groovy
+++ b/cleanup-pipeline.groovy
@@ -28,8 +28,8 @@
 salt = new com.mirantis.mk.Salt()
 timeout(time: 12, unit: 'HOURS') {
     node {
-
-        def venv_path = "${env.WORKSPACE}/venv"
+        def workspace = common.getWorkspace()
+        def venv_path = "${workspace}/venv"
         def env_vars
 
         // default STACK_TYPE is heat
@@ -56,7 +56,7 @@
 
         stage('Delete stack') {
             if (STACK_TYPE == 'heat') {
-                def openstackCloud = openstack.createOpenstackEnv(
+                def openstackCloud = openstack.createOpenstackEnv(venv_path,
                     OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS,
                     OPENSTACK_API_PROJECT,OPENSTACK_API_PROJECT_DOMAIN,
                     OPENSTACK_API_PROJECT_ID, OPENSTACK_API_USER_DOMAIN,
diff --git a/cloud-deploy-pipeline.groovy b/cloud-deploy-pipeline.groovy
index 947904a..fa30579 100644
--- a/cloud-deploy-pipeline.groovy
+++ b/cloud-deploy-pipeline.groovy
@@ -98,8 +98,9 @@
     node(slave_node) {
         try {
             // Set build-specific variables
-            venv = "${env.WORKSPACE}/venv"
-            venvPepper = "${env.WORKSPACE}/venvPepper"
+            def workspace = common.getWorkspace()
+            venv = "${workspace}/venv"
+            venvPepper = "${workspace}/venvPepper"
 
             //
             // Prepare machines
@@ -143,7 +144,7 @@
 
                     // create openstack env
                     openstack.setupOpenstackVirtualenv(venv, OPENSTACK_API_CLIENT)
-                    openstackCloud = openstack.createOpenstackEnv(
+                    openstackCloud = openstack.createOpenstackEnv(venv,
                         OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS,
                         OPENSTACK_API_PROJECT, OPENSTACK_API_PROJECT_DOMAIN,
                         OPENSTACK_API_PROJECT_ID, OPENSTACK_API_USER_DOMAIN,
diff --git a/cvp-sanity.groovy b/cvp-sanity.groovy
index ed87cd6..7adca5a 100644
--- a/cvp-sanity.groovy
+++ b/cvp-sanity.groovy
@@ -1,6 +1,6 @@
 /**
  *
- * Launch sanity validation of the cloud
+ * Launch sanity verification of the cloud
  *
  * Expected parameters:
  *   SALT_MASTER_URL             URL of Salt master
@@ -8,6 +8,7 @@
  *
  *   SANITY_TESTS_SET            Leave empty for full run or choose a file (test), e.g. test_mtu.py
  *   SANITY_TESTS_REPO           CVP-sanity-checks repo to clone
+ *   SANITY_TESTS_SETTINGS       Additional envrionment variables for cvp-sanity-checks
  *   PROXY                       Proxy to use for cloning repo or for pip
  *
  */
@@ -24,7 +25,7 @@
 
             stage('Run Infra tests') {
                 sh "mkdir -p ${artifacts_dir}"
-                validate.runSanityTests(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS, SANITY_TESTS_SET, artifacts_dir)
+                validate.runSanityTests(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS, SANITY_TESTS_SET, artifacts_dir, SANITY_TESTS_SETTINGS)
             }
             stage ('Publish results') {
                 archiveArtifacts artifacts: "${artifacts_dir}/*"
diff --git a/delete-broken-stacks-pipeline.groovy b/delete-broken-stacks-pipeline.groovy
index c68fe9e..df938ed 100644
--- a/delete-broken-stacks-pipeline.groovy
+++ b/delete-broken-stacks-pipeline.groovy
@@ -22,14 +22,15 @@
         def openstackCloud
         // value defaults
         def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
-        def openstackEnv = "${env.WORKSPACE}/venv"
+        def workspace = common.getWorkspace()
+        def openstackEnv = "${workspace}/venv"
 
         stage('Install OpenStack env') {
             openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
         }
 
         stage('Connect to OpenStack cloud') {
-            openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
+            openstackCloud = openstack.createOpenstackEnv(openstackEnv, OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
             openstack.getKeystoneToken(openstackCloud, openstackEnv)
         }
 
diff --git a/generate-cookiecutter-products.groovy b/generate-cookiecutter-products.groovy
index 1fa3c43..a4b646e 100644
--- a/generate-cookiecutter-products.groovy
+++ b/generate-cookiecutter-products.groovy
@@ -45,7 +45,7 @@
             print("Using context:\n" + COOKIECUTTER_TEMPLATE_CONTEXT)
 
             stage ('Download Cookiecutter template') {
-                if (COOKIECUTTER_TEMPLATE_BRANCH.startsWith('refs/changes/')) {
+                if (COOKIECUTTER_TEMPLATE_BRANCH.startsWith('refs/')) {
                     git.checkoutGitRepository(templateEnv, COOKIECUTTER_TEMPLATE_URL, 'master', COOKIECUTTER_TEMPLATE_CREDENTIALS)
 
                     dir(templateEnv) {
diff --git a/ironic-node-provision-pipeline.groovy b/ironic-node-provision-pipeline.groovy
index 1826100..3d2717b 100644
--- a/ironic-node-provision-pipeline.groovy
+++ b/ironic-node-provision-pipeline.groovy
@@ -40,7 +40,7 @@
 test = new com.mirantis.mk.Test()
 def python = new com.mirantis.mk.Python()
 
-def pepperEnv = "pepperEnv"
+def pepperEnv
 def venv
 def outputs = [:]
 
@@ -76,7 +76,9 @@
     node("python") {
         try {
             // Set build-specific variables
-            venv = "${env.WORKSPACE}/venv"
+            def workspace = common.getWorkspace()
+            venv = "${workspace}/venv"
+            venvPepper = "${workspace}/venvPepper"
 
             def required_params = ['IRONIC_AUTHORIZATION_PROFILE', 'IRONIC_DEPLOY_NODES']
             def missed_params = []
@@ -112,7 +114,7 @@
 
                         // create openstack env
                         openstack.setupOpenstackVirtualenv(venv, OPENSTACK_API_CLIENT)
-                        openstackCloud = openstack.createOpenstackEnv(
+                        openstackCloud = openstack.createOpenstackEnv(venv,
                             OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS,
                             OPENSTACK_API_PROJECT, OPENSTACK_API_PROJECT_DOMAIN,
                             OPENSTACK_API_PROJECT_ID, OPENSTACK_API_USER_DOMAIN,
diff --git a/mk-k8s-cleanup-pipeline.groovy b/mk-k8s-cleanup-pipeline.groovy
index db5aa8a..b907709 100644
--- a/mk-k8s-cleanup-pipeline.groovy
+++ b/mk-k8s-cleanup-pipeline.groovy
@@ -25,14 +25,15 @@
 
         // value defaults
         def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
-        def openstackEnv = "${env.WORKSPACE}/venv"
+        def workspace = common.getWorkspace()
+        def openstackEnv = "${workspace}/venv"
 
         stage('Install OpenStack env') {
             openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
         }
 
         stage('Connect to OpenStack cloud') {
-            openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
+            openstackCloud = openstack.createOpenstackEnv(openstackEnv, OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
             openstack.getKeystoneToken(openstackCloud, openstackEnv)
         }
 
diff --git a/mk-k8s-simple-deploy-pipeline.groovy b/mk-k8s-simple-deploy-pipeline.groovy
index 39ddc9c..2a3653c 100644
--- a/mk-k8s-simple-deploy-pipeline.groovy
+++ b/mk-k8s-simple-deploy-pipeline.groovy
@@ -31,7 +31,6 @@
 test = new com.mirantis.mk.Test()
 def python = new com.mirantis.mk.Python()
 
-def pepperEnv = "pepperEnv"
 artifacts_dir = "_artifacts"
 timeout(time: 12, unit: 'HOURS') {
     node {
@@ -41,8 +40,9 @@
 
         // value defaults
         def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
-        def openstackEnv = "${env.WORKSPACE}/venv"
-
+        def workspace = common.getWorkspace()
+        def openstackEnv = "${workspace}/venv"
+        def pepperEnv = "${workspace}/pepperEnv"
         if (HEAT_STACK_NAME == "") {
             HEAT_STACK_NAME = BUILD_TAG
         }
@@ -56,7 +56,7 @@
         }
 
         stage('Connect to OpenStack cloud') {
-            openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT,
+            openstackCloud = openstack.createOpenstackEnv(openstackEnv, OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT,
             "", OPENSTACK_API_PROJECT_DOMAIN_ID, OPENSTACK_API_USER_DOMAIN_ID, OPENSTACK_API_VERSION)
             openstack.getKeystoneToken(openstackCloud, openstackEnv)
         }
diff --git a/mk-maaas-deploy-pipeline.groovy b/mk-maaas-deploy-pipeline.groovy
index 924019e..9a2244e 100644
--- a/mk-maaas-deploy-pipeline.groovy
+++ b/mk-maaas-deploy-pipeline.groovy
@@ -32,8 +32,9 @@
         def saltMaster
 
         // value defaults
+        def workspace = common.getWorkspace()
         def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : "liberty"
-        def openstackEnv = "${env.WORKSPACE}/venv"
+        def openstackEnv = "${workspace}/venv"
 
         stage ('Download Heat templates') {
             git.checkoutGitRepository('template', HEAT_TEMPLATE_URL, HEAT_TEMPLATE_BRANCH, HEAT_TEMPLATE_CREDENTIALS)
@@ -44,7 +45,7 @@
         }
 
         stage('Connect to OpenStack cloud') {
-            openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
+            openstackCloud = openstack.createOpenstackEnv(openstackEnv, OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
             openstack.getKeystoneToken(openstackCloud, openstackEnv)
         }
 
diff --git a/test-salt-models-pipeline.groovy b/test-salt-models-pipeline.groovy
index 3ac1275..fa784ea 100644
--- a/test-salt-models-pipeline.groovy
+++ b/test-salt-models-pipeline.groovy
@@ -158,12 +158,9 @@
       stage("test-nodes") {
         if(checkouted) {
           def modifiedClusters = null
-
-          if (gerritRef) {
-            checkChange = sh(script: "git diff-tree --no-commit-id --name-only -r HEAD | grep -v classes/cluster", returnStatus: true)
-            if (checkChange == 1) {
-              modifiedClusters = sh(script: "git diff-tree --no-commit-id --name-only -r HEAD | grep classes/cluster/ | awk -F/ '{print \$3}' | uniq", returnStdout: true).tokenize()
-            }
+          def checkChange = sh(script: "git diff-tree --no-commit-id --name-only -r HEAD | grep -v classes/cluster", returnStatus: true)
+          if (checkChange == 1) {
+            modifiedClusters = sh(script: "git diff-tree --no-commit-id --name-only -r HEAD | grep classes/cluster/ | awk -F/ '{print \$3}' | uniq", returnStdout: true).tokenize()
           }
 
           def infraYMLs = sh(script: "find ./classes/ -regex '.*cluster/[-_a-zA-Z0-9]*/[infra/]*init\\.yml' -exec grep -il 'cluster_name' {} \\;", returnStdout: true).tokenize()