Merge "Fix checkout of refspec"
diff --git a/src/com/mirantis/mk/KaasUtils.groovy b/src/com/mirantis/mk/KaasUtils.groovy
index 29d3cff..cbc771f 100644
--- a/src/com/mirantis/mk/KaasUtils.groovy
+++ b/src/com/mirantis/mk/KaasUtils.groovy
@@ -55,6 +55,7 @@
     def attachBYO = env.ATTACH_BYO ? env.ATTACH_BYO.toBoolean() : false
     def upgradeBYO = env.UPGRADE_BYO ? env.UPGRADE_BYO.toBoolean() : false
     def runBYOMatrix = env.RUN_BYO_MATRIX ? env.RUN_BYO_MATRIX.toBoolean() : false
+    def defaultBYOOs = env.DEFAULT_BYO_OS ? env.DEFAULT_BYO_OS.toString() : 'ubuntu'
     def upgradeMgmt = env.UPGRADE_MGMT_CLUSTER ? env.UPGRADE_MGMT_CLUSTER.toBoolean() : false
     def enableLMALogging = env.ENABLE_LMA_LOGGING ? env.ENABLE_LMA_LOGGING.toBoolean(): false
     def runUie2e = env.RUN_UI_E2E ? env.RUN_UI_E2E.toBoolean() : false
@@ -88,6 +89,7 @@
     def enableVsphereDemo = true
     def enableOSDemo = true
     def enableBMDemo = true
+    def openstackIMC = env.OPENSTACK_CLOUD_LOCATION ? env.OPENSTACK_CLOUD_LOCATION : 'us'
 
     def commitMsg = env.GERRIT_CHANGE_COMMIT_MESSAGE ? new String(env.GERRIT_CHANGE_COMMIT_MESSAGE.decodeBase64()) : ''
     if (commitMsg ==~ /(?s).*\[mgmt-proxy\].*/ || env.GERRIT_EVENT_COMMENT_TEXT ==~ /(?s).*mgmt-proxy.*/) {
@@ -104,11 +106,11 @@
         deployChild = true
         upgradeChild = true
     }
-    def deployMatches = (commitMsg =~ /(\[child-deploy\s*(\w|\-)+?\])/)
-    if (deployMatches.size() > 0) {
+    def childDeployMatches = (commitMsg =~ /(\[child-deploy\s*(\w|\-)+?\])/)
+    if (childDeployMatches.size() > 0) {
         // override child version when it set explicitly
         deployChild = true
-        customChildRelease = deployMatches[0][0].split('child-deploy')[1].replaceAll('[\\[\\]]', '').trim()
+        customChildRelease = childDeployMatches[0][0].split('child-deploy')[1].replaceAll('[\\[\\]]', '').trim()
         common.warningMsg("Forced child deployment using custom release version ${customChildRelease}")
     }
     if (commitMsg ==~ /(?s).*\[byo-attach\].*/ || env.GERRIT_EVENT_COMMENT_TEXT ==~ /(?s).*byo-attach.*/) {
@@ -118,9 +120,16 @@
         attachBYO = true
         upgradeBYO = true
     }
-    if (commitMsg ==~ /(?s).*\[run-byo-matrix\].*/ || env.GERRIT_EVENT_COMMENT_TEXT ==~ /(?s).*run-byo-matrix\.*/) {
+
+    def byoDeployMatches = (commitMsg =~ /(\[run-byo-matrix\s*(ubuntu|centos)\])/)
+    if (commitMsg ==~ /(?s).*\[run-byo-matrix\].*/ || env.GERRIT_EVENT_COMMENT_TEXT ==~ /(?s).*run-byo-matrix\.*/ || byoDeployMatches.size() > 0) {
         runBYOMatrix = true
 
+        if (byoDeployMatches.size() > 0) {
+            defaultBYOOs = byoDeployMatches[0][2]
+            common.warningMsg("Custom BYO OS detected, using ${defaultBYOOs}")
+        }
+
         common.warningMsg('Forced byo matrix test via run-byo-matrix, all other byo triggers will be skipped')
         attachBYO = false
         upgradeBYO = false
@@ -248,6 +257,10 @@
             common.warningMsg('Forced running additional kaas deployment with Equinix provider according multiregional demo request')
             equinixOnDemandDemo = true
             break
+        case 'equinixmetalv2':
+            common.warningMsg('Forced running additional kaas deployment with Equinix Metal V2 provider according multiregional demo request')
+            equinixMetalV2OnDemandDemo = true
+            break
         case 'azure':
             common.warningMsg('Forced running additional kaas deployment with Azure provider according multiregional demo request')
             azureOnDemandDemo = true
@@ -265,10 +278,19 @@
         ],
     ]
 
+    if (commitMsg ==~ /(?s).*\[eu-demo\].*/ || env.GERRIT_EVENT_COMMENT_TEXT ==~ /(?s).*eu-demo.*/) {
+        openstackIMC = 'eu'
+        // use internal-eu because on internal-ci with eu cloud image pull takes much time
+        def cdnRegion = (proxyConfig['mgmtOffline'] == true) ? 'public-ci' : 'internal-eu'
+        common.infoMsg("eu-demo was triggered, force switching CDN region to ${cdnRegion}")
+        cdnConfig['mgmt']['openstack'] = cdnRegion
+    }
+
     // calculate weight of current demo run to manage lockable resources
     def demoWeight = (deployChild) ? 2 : 1 // management = 1, child = 1
 
     common.infoMsg("""
+        OpenStack Cloud location: ${openstackIMC}
         CDN deployment configuration: ${cdnConfig}
         MCC offline deployment configuration: ${proxyConfig}
         Use MacOS node as seed: ${seedMacOs}
@@ -279,6 +301,7 @@
         Single BYO cluster attachment scheduled: ${attachBYO}
         Single Attached BYO cluster upgrade test scheduled: ${upgradeBYO}
         BYO test matrix whole suite scheduled: ${runBYOMatrix}
+        Default BYO OS: ${defaultBYOOs}
         Mgmt cluster release upgrade scheduled: ${upgradeMgmt}
         Mgmt LMA logging enabled: ${enableLMALogging}
         Mgmt conformance testing scheduled: ${runMgmtConformance}
@@ -300,6 +323,7 @@
         Current weight of the demo run: ${demoWeight} (Used to manage lockable resources)
         Triggers: https://gerrit.mcp.mirantis.com/plugins/gitiles/kaas/core/+/refs/heads/master/hack/ci-gerrit-keywords.md""")
     return [
+        osCloudLocation                      : openstackIMC,
         cdnConfig                            : cdnConfig,
         proxyConfig                          : proxyConfig,
         useMacOsSeedNode                     : seedMacOs,
@@ -310,6 +334,7 @@
         attachBYOEnabled                     : attachBYO,
         upgradeBYOEnabled                    : upgradeBYO,
         runBYOMatrixEnabled                  : runBYOMatrix,
+        defaultBYOOs                         : defaultBYOOs,
         upgradeMgmtEnabled                   : upgradeMgmt,
         enableLMALoggingEnabled              : enableLMALogging,
         runUie2eEnabled                      : runUie2e,
@@ -346,8 +371,8 @@
  */
 def multiregionWorkflowParser(keyword) {
     def common = new com.mirantis.mk.Common()
-    def supportedManagementProviders = ['os', 'aws', 'vsphere', 'equinix', 'azure']
-    def supportedRegionalProviders = ['os', 'vsphere', 'equinix', 'bm', 'azure', 'aws']
+    def supportedManagementProviders = ['os', 'aws', 'vsphere', 'equinix', 'equinixmetalv2', 'azure']
+    def supportedRegionalProviders = ['os', 'vsphere', 'equinix', 'equinixmetalv2', 'bm', 'azure', 'aws']
 
     def clusterTypes = ''
     if (keyword.toString().contains('multiregion')) {
@@ -579,6 +604,7 @@
         string(name: 'SI_PIPELINES_REFSPEC', value: siRefspec.siPipelines),
         string(name: 'CUSTOM_RELEASE_PATCH_SPEC', value: patchSpec),
         string(name: 'KAAS_CHILD_CLUSTER_RELEASE_NAME', value: triggers.childDeployCustomRelease),
+        string(name: 'OPENSTACK_CLOUD_LOCATION', value: triggers.osCloudLocation),
         booleanParam(name: 'OFFLINE_MGMT_CLUSTER', value: triggers.proxyConfig['mgmtOffline']),
         booleanParam(name: 'OFFLINE_CHILD_CLUSTER', value: triggers.proxyConfig['childOffline']),
         booleanParam(name: 'PROXY_CHILD_CLUSTER', value: triggers.proxyConfig['childProxy']),
diff --git a/src/com/mirantis/mk/Openstack.groovy b/src/com/mirantis/mk/Openstack.groovy
index fa87220..f552fc3 100644
--- a/src/com/mirantis/mk/Openstack.groovy
+++ b/src/com/mirantis/mk/Openstack.groovy
@@ -589,7 +589,7 @@
 def createOpenstackEnvInDocker(authUrl, credentialsId, project, project_domain="default", project_id="", user_domain="default", cacert="/etc/ssl/certs/ca-certificates.crt") {
     def common = new com.mirantis.mk.Common()
     creds = common.getPasswordCredentials(credentialsId)
-    def env = " -e OS_USERNAME=${creds.username} -e OS_PASSWORD=${creds.password.toString()} -e OS_TENANT_NAME=${project} -e OS_AUTH_URL=${authUrl} -e OS_AUTH_STRATEGY=keystone -e OS_PROJECT_NAME=${project} -e OS_PROJECT_ID=${project_id} -e OS_PROJECT_DOMAIN_ID=${project_domain} -e OS_USER_DOMAIN_NAME=${user_domain} -e OS_CACERT=${cacert} "
+    def env = ["OS_USERNAME=${creds.username}", "OS_PASSWORD=${creds.password.toString()}", "OS_TENANT_NAME=${project}", "OS_AUTH_URL=${authUrl}", "OS_AUTH_STRATEGY=keystone -e OS_PROJECT_NAME=${project}", "OS_PROJECT_ID=${project_id}", "OS_PROJECT_DOMAIN_ID=${project_domain}", "OS_USER_DOMAIN_NAME=${user_domain}", "OS_CACERT=${cacert}"]
     return env
 }
 
@@ -614,7 +614,6 @@
     return img
 }
 
-
 /**
  * create connection to OpenStack API endpoint in the Docker container
  *
@@ -625,8 +624,10 @@
 def runOpenstackCommandInDocker(cmd, env, img) {
     def dockerImg = docker.image(img)
     def result
-    dockerImg.inside("${env}") {
-        result = sh(script: "${cmd}", returnStdout: true).trim()
+    dockerImg.inside() {
+        withEnv(env) {
+            result = sh(script: "${cmd}", returnStdout: true).trim()
+        }
     }
     return result
 }