def BUNDLE_PATH = '${WORKSPACE}/../cached_gems'
def CREDENTIALS = '7ce580c0-7d01-412f-bff1-485b4ca6196a'
def HOST_BUNDLE_PATH = '${HOME}/onapp-vcloud-sdk/gems-3.0.5'
def RCOV_HEALTHY = 90
def RCOV_UNHEALTHY = 50
def RCOV_UNSTABLE = 0
def RSPEC_RESULTS_PATH = 'rspec_results.xml'

pipeline {
    agent {
        dockerfile {
            dir('testing-image')
            args("""\
                -u root:root \
                -v ${HOST_BUNDLE_PATH}:${BUNDLE_PATH} \
            """)
        }
    }

    options {
        buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '7'))
    }

    environment {
        BUNDLE_PATH = sh(script: "readlink -f ${BUNDLE_PATH}", returnStdout: true).trim()

        PASSWORD = 'test'
        LOGIN = 'devs'
        ORGANIZATION = 'system'
        ENCODED_CREDENTIALS = 'test'

        ONAPPDEV_DOMAIN = 'onappdev.lviv'
        ONAPPLAB_DOMAIN = 'onapp.lab'

        VCD_A_API_URL = 'https://vcd-a.onappdev.lviv'
        VCD_A_API_URL_WITHOUT_PROTOCOL = 'vcd-a.onappdev.lviv'
        VCD_A_VCENTER_API_URL = 'vc-a.onappdev.lviv'

        VCD_B_API_URL = 'https://vcd-b.onappdev.lviv'
        VCD_B_API_URL_WITHOUT_PROTOCOL = 'vcd-b.onappdev.lviv'
        VCD_B_VCENTER_API_URL = 'vc-b.onappdev.lviv'

        VCD_C_API_URL = 'https://vcd-c.onappdev.com'
        VCD_C_API_URL_WITHOUT_PROTOCOL = 'vcd-c.onappdev.com'
        VCD_C_VCENTER_API_URL = 'vc-c.onappdev.lviv'

        VCD_D_API_URL = 'https://vcd-d.onappdev.com'
        VCD_D_API_URL_WITHOUT_PROTOCOL = 'vcd-d.onappdev.com'

        VCD_E_API_URL = 'https://vcd-e.onappdev.lviv'
        VCD_E_API_URL_WITHOUT_PROTOCOL = 'vcd-e.onappdev.lviv'

        VCD_DEVS_API_URL = 'https://vcd-devs.onappdev.com'
        VCD_DEVS_API_URL_WITHOUT_PROTOCOL = 'vcd-devs.onappdev.com'
        VCD_DEVS_VCENTER_API_URL = 'vc-devs-180.onappdev.lviv'

        A_VCD_API_URL = 'https://a-vcd.onapp.lab'
        A_VCD_API_URL_WITHOUT_PROTOCOL = 'a-vcd.onapp.lab'
        A_VCD_VCENTER_API_URL = 'a-vcsa.onapp.lab'

        B_VCD_API_URL = 'https://b-vcd.onapp.lab'
        B_VCD_API_URL_WITHOUT_PROTOCOL = 'b-vcd.onapp.lab'
        B_VCD_VCENTER_API_URL = 'b-vcsa.onapp.lab'

        VCD_A_NSX_API_URL = '10.63.0.73'
    }

    stages {
        stage('Test') {
            post {
                always {
                    saveRspecResults(RSPEC_RESULTS_PATH)
                    saveRcovResults(RCOV_HEALTHY, RCOV_UNHEALTHY, RCOV_UNSTABLE)
                }

                cleanup {
                    cleanupWorkspace()
                }
            }

            steps {
                populateKnownHosts('bitbucket.org')
                populateKnownHosts('github.com')
                configureBundler()
                bundleInstall(CREDENTIALS)
                runSpecs(RSPEC_RESULTS_PATH)
            }
        }
    }
}

def bundleInstall(credentials) {
    sshagent(credentials: [credentials]) {
        sh('bundle install')
    }
}

def configureBundler() {
    sh('bundle config jobs 8')
}

def cleanupWorkspace() {
    deleteDir()
    // additional cleanup required due to https://issues.jenkins.io/browse/JENKINS-41805
    dir("${WORKSPACE}@libs") {
        deleteDir()
    }
    dir("${WORKSPACE}@script") {
        deleteDir()
    }
    dir("${WORKSPACE}@tmp") {
        deleteDir()
    }
}

def populateKnownHosts(domain) {
    sh("""
        mkdir -p /root/.ssh
        ssh-keyscan ${domain} >> /root/.ssh/known_hosts
    """)
}

def runSpecs(path) {
    sh("""
        umask 0
        bundle exec rspec spec \
            --format progress \
            --format RspecJunitFormatter \
            --out ${path} \
            --backtrace \
            --tag ~flaky
    """)
}

def saveRcovResults(healthy, unhealthy, unstable) {
  archiveArtifacts('coverage/**/*')
  step([
      $class: 'RcovPublisher',
      reportDir: 'coverage/rcov',
      targets: [
          [metric: 'CODE_COVERAGE', healthy: healthy, unhealthy: unhealthy, unstable: unstable]
      ]
  ])
}

def saveRspecResults(path) {
    archiveArtifacts(artifacts: path, allowEmptyArchive: true)
    junit(testResults: path, allowEmptyResults: true)
}
