Add TCP-QA pipeline

Change-Id: If6f26e72294b9464716033cdda6c5b8c8b1d8514
diff --git a/tcp-qa-pipeline.groovy b/tcp-qa-pipeline.groovy
new file mode 100644
index 0000000..1b178b4
--- /dev/null
+++ b/tcp-qa-pipeline.groovy
@@ -0,0 +1,138 @@
+/*
+ *
+ * Launcher for TCP-QA tests
+ *
+ * Expected parameters:
+ *   ENV_NAME                 Environment name
+ *   REPOSITORY_SUITE         Packagfe repository (stable, testing, nightly)
+ *   TEST_GROUP               TCQ-QA test group or a test name
+ *   LAB_CONFIG_NAME          Environment confguration for deploy
+ *   ADDITIONAL_PARAMETERS    Additional shell environment variables
+ *   TCP_QA_COMMIT            TCQ-QA commit or branch
+ *   TCP_QA_REFS              TCP-QA refs for cherry-pick
+ *   TCP_QA_GERRIT_HOST       TCQ-QA repo Gerrit host
+ *   SHUTDOWN_ENV_ON_TEARDOWN Destroy virtual environment after test run
+ *   KEEP_BEFORE              Keep virtual environment before run tests or erase it
+ *   KEEP_AFTER               Keep virtual environment after run tests or erase it
+ *   VENV_PATH                Path to python virtual environment
+ *   SLAVE_LABELS             Jenkins slave node labels
+ *   TEST_TIMEOUT             Timeout for test job in minutes
+ *   UPLOAD_RESULTS           Upload or not test results to Testrail
+ *   TESTRAIL_MILESTONE       Testrail milestone
+ *   TESTRAIL_TEST_SUITE      Testrail test suite
+ *
+ */
+
+git = new com.mirantis.mcp.Git()
+qaCommon = new com.mirantis.tcp_qa.Common()
+testRunner = new com.mirantis.tcp_qa.RunTest()
+environment = new com.mirantis.tcp_qa.EnvActions()
+
+def runTests() {
+    def additionalParameters = []
+
+    if (!env.ENV_NAME) {
+        error("Error! Test path (ENV_NAME) is not specified!")
+    }
+
+    if (!env.REPOSITORY_SUITE) {
+        error("Error! Test path (REPOSITORY_SUITE) is not specified!")
+    }
+    if (!env.TEST_GROUP){
+        error("Error! Test path (TEST_GROUP) is not specified!")
+    }
+    if (!env.LAB_CONFIG_NAME){
+        error("Error! Test path (LAB_CONFIG_NAME) is not specified!")
+    }
+
+    if (params.ADDITIONAL_PARAMETERS) {
+        for (p in params.ADDITIONAL_PARAMETERS.split('\n')) {
+            additionalParameters << p
+        }
+        echo("Additional parameters are: ${additionalParameters.join(' ')}")
+    }
+
+    withEnv(additionalParameters) {
+
+        stage('Clone tcp-qa') {
+            git.gitCheckout ([
+                protocol: 'https',
+                port: '443',
+                branch : env.TCP_QA_COMMIT,
+                host : 'github.com',
+                project : 'Mirantis/tcp-qa',
+                targetDir : '.'
+            ])
+            if ( env.TCP_QA_REFS && ! env.TCP_QA_REFS.equals('none') ) {
+                def refs = "${env.TCP_QA_REFS}".split("\n")
+                qaCommon.getCustomRefs(env.TCP_QA_GERRIT_HOST, 'Mirantis/tcp-qa', env.WORKSPACE, refs)
+            }
+        }
+
+        stage('Update python venv') {
+            environment.prepareEnv()
+        }
+
+        stage('Run tests') {
+            if (!((env.KEEP_BEFORE == "yes") || (env.KEEP_BEFORE == "true"))){
+                environment.eraseEnv()
+            }
+            sh """
+            . ${VENV_PATH}/bin/activate
+
+            cd tcp_tests
+            if ! py.test -vvv -s -p no:django -p no:ipdb --junit-xml=nosetests.xml -k ${TEST_GROUP}; then
+              echo "Tests failed!"
+              exit 1
+            fi
+            """
+
+            // testRunner.runTest("-k ${env.TEST_GROUP}", jobSetParameters)
+        }
+
+        if (!((env.KEEP_AFTER == "yes") || (env.KEEP_AFTER == "true"))){
+            environment.eraseEnv()
+        }
+    }
+}
+
+def uploadResults(){
+    stage('Upload tests results'){
+        def thisBuildUrl = "${env.JENKINS_URL}/job/${JOB_NAME}/${BUILD_NUMBER}/"
+        def testPlanName = "${env.TESTRAIL_MILESTONE} Integration-${new Date().format('yyyy-MM-dd')}"
+
+        qaCommon.uploadResultsTestRail([
+            junitXml: "${env.WORKSPACE}/nosetests.xml",
+            testPlanName: testPlanName,
+            testSuiteName: "${env.TESTRAIL_TEST_SUITE}",
+            testrailMilestone: "${env.TESTRAIL_MILESTONE}",
+            jobURL: thisBuildUrl,
+        ])
+    }
+}
+
+def runSlavesLabels = params.SLAVE_LABELS ?: 'tcp-qa-slaves'
+def runTimeout = params.TEST_TIMEOUT ?: 240
+
+node (runSlavesLabels) {
+    try {
+      timeout(time: runTimeout.toInteger(), unit: 'MINUTES') {
+        runTests()
+      }
+    }
+    catch (err) {
+        echo "Failed: ${err}"
+        currentBuild.result = 'FAILURE'
+    }
+    finally {
+        if (env.UPLOAD_RESULTS == "true") {
+            testRunUrl = uploadResults()
+            currentBuild.description = """
+            <a href="${testRunUrl}">TestRail report</a>
+            """
+        }
+        environment.destroyEnv()
+        archiveArtifacts allowEmptyArchive: true, artifacts: 'nosetests.xml,tests.log,*.ini', excludes: null
+        junit keepLongStdio: false, testResults: 'nosetests.xml'
+    }
+}