add lab pipeline

This pipeline can be used by mutltiple jobs. Stages are selected by
variables.

Change-Id: I88a5325f5290920f39b9d5bd63c7092c860616c1
diff --git a/lab-pipeline.groovy b/lab-pipeline.groovy
new file mode 100644
index 0000000..b10d410
--- /dev/null
+++ b/lab-pipeline.groovy
@@ -0,0 +1,170 @@
+/**
+ *
+ * Launch heat stack with basic k8s
+ * Flow parameters:
+ *   STACK_TYPE                 Orchestration engine: heat, ''
+ *   INSTALL                    What should be installed (k8s, openstack, ...)
+ *   TESTS                      What should be tested (k8s, openstack, ...)
+ *
+ * Expected parameters:
+ *
+ * required for STACK_TYPE=heat
+ *   HEAT_TEMPLATE_URL          URL to git repo with Heat templates
+ *   HEAT_TEMPLATE_CREDENTIALS  Credentials to the Heat templates repo
+ *   HEAT_TEMPLATE_BRANCH       Heat templates repo branch
+ *   HEAT_STACK_TEMPLATE        Heat stack HOT template
+ *   HEAT_STACK_ENVIRONMENT     Heat stack environmental parameters
+ *   HEAT_STACK_ZONE            Heat stack availability zone
+ *   HEAT_STACK_PUBLIC_NET      Heat stack floating IP pool
+ *   HEAT_STACK_DELETE          Delete Heat stack when finished (bool)
+ *   HEAT_STACK_CLEANUP_JOB     Name of job for deleting Heat stack
+ *   HEAT_STACK_REUSE           Reuse Heat stack (don't create one)
+ *   OPENSTACK_API_URL          OpenStack API address
+ *   OPENSTACK_API_CREDENTIALS  Credentials to the OpenStack API
+ *   OPENSTACK_API_PROJECT      OpenStack project to connect to
+ *   OPENSTACK_API_CLIENT       Versions of OpenStack python clients
+ *   OPENSTACK_API_VERSION      Version of the OpenStack API (2/3)
+ *
+ *   SALT_MASTER_CREDENTIALS    Credentials to the Salt API
+ *
+ * required for STACK_TYPE=NONE or empty string
+ *   SALT_MASTER_URL            URL of Salt-API
+
+ *   K8S_API_SERVER             Kubernetes API address
+ *   K8S_CONFORMANCE_IMAGE      Path to docker image with conformance e2e tests
+ *
+ */
+
+git = new com.mirantis.mk.Git()
+openstack = new com.mirantis.mk.Openstack()
+salt = new com.mirantis.mk.Salt()
+orchestrate = new com.mirantis.mk.Orchestrate()
+
+node {
+
+    //
+    // Prepare machines
+    //
+
+    stage ('Create infrastructure') {
+        IF (STACK_TYPE == 'heat') {
+            // value defaults
+            def openstackCloud
+            def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
+            def openstackEnv = "${env.WORKSPACE}/venv"
+
+
+            if (HEAT_STACK_NAME == '') {
+                HEAT_STACK_NAME = BUILD_TAG
+            }
+
+            // get templates
+            git.checkoutGitRepository('template', HEAT_TEMPLATE_URL, HEAT_TEMPLATE_BRANCH, HEAT_TEMPLATE_CREDENTIALS)
+
+            // create openstack env
+            openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
+            openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
+            openstack.getKeystoneToken(openstackCloud, openstackEnv)
+
+
+            // launch stack
+            if (HEAT_STACK_REUSE == 'false') {
+                stage('Launch new Heat stack') {
+                    // create stack
+                    envParams = [
+                        'instance_zone': HEAT_STACK_ZONE,
+                        'public_net': HEAT_STACK_PUBLIC_NET
+                    ]
+                    openstack.createHeatStack(openstackCloud, HEAT_STACK_NAME, HEAT_STACK_TEMPLATE, envParams, HEAT_STACK_ENVIRONMENT, openstackEnv)
+                }
+            }
+
+            // get SALT_MASTER_URL
+            saltMasterHost = openstack.getHeatStackOutputParam(openstackCloud, HEAT_STACK_NAME, 'salt_master_ip', openstackEnv)
+            SALT_MASTER_URL = "http://${saltMasterHost}:8088"
+        }
+    }
+
+    //
+    // Connect to Salt master
+    //
+
+    def saltMaster
+    stage('Connect to Salt API') {
+        saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
+    }
+
+    //
+    // Install
+    //
+
+    stage('Install core infrastructure') {
+        // salt.master, reclass
+        // refresh_pillar
+        // sync_all
+        // linux,openssh,salt.minion.ntp
+
+        orchestrate.installFoundationInfra(saltMaster)
+        orchestrate.validateFoundationInfra(saltMaster)
+    }
+
+
+    // install k8s
+    if (INSTALL.toLowerCase().contains('k8s')) {
+        stage('Install Kubernetes infra') {
+            orchestrate.installOpenstackMcpInfra(saltMaster)
+        }
+
+        stage('Install Kubernetes control') {
+            orchestrate.installOpenstackMcpControl(saltMaster)
+        }
+
+    }
+
+    // install openstack
+    if (INSTALL.toLowerCase().contains('openstack')) {
+        // install Infra and control, tests, ...
+
+        stage('Install OpenStack infra') {
+            orchestrate.installOpenstackMkInfra(saltMaster)
+        }
+
+        stage('Install OpenStack control') {
+            orchestrate.installOpenstackMkControl(saltMaster)
+        }
+
+        stage('Install OpenStack network') {
+            orchestrate.installOpenstackMkNetwork(saltMaster)
+        }
+
+        stage('Install OpenStack compute') {
+            orchestrate.installOpenstackMkCompute(saltMaster)
+        }
+
+    }
+
+    //
+    // Test
+    //
+
+    if (TESTS.toLowerCase().contains('k8s')) {
+        stage('Run k8s bootstrap tests') {
+            orchestrate.runConformanceTests(saltMaster, K8S_API_SERVER, 'tomkukral/k8s-scripts')
+        }
+
+        stage('Run k8s conformance e2e tests') {
+            orchestrate.runConformanceTests(saltMaster, K8S_API_SERVER, K8S_CONFORMANCE_IMAGE)
+        }
+    }
+
+
+    //
+    // Clean
+    //
+
+    if (HEAT_STACK_DELETE == 'true' && STACK_TYPE == 'heat') {
+        stage('Trigger cleanup job') {
+            build job: 'deploy_heat_cleanup', parameters: [[$class: 'StringParameterValue', name: 'HEAT_STACK_NAME', value: HEAT_STACK_NAME]]
+        }
+    }
+}