def BUNDLE_PATH = '${WORKSPACE}/../cached_gems'
def CREDENTIALS = '7ce580c0-7d01-412f-bff1-485b4ca6196a'
def HOST_BUNDLE_PATH = '${HOME}/fog-nsx-v/gems-2.7.3'
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()

        NSX_C_API_URL = 'https://nsx-c'
        NSX_C_API_URL_WITHOUT_PROTOCOL = 'nsx-c'
        NSX_C_PASSWORD = 'test'
        NSX_C_LOGIN = 'admin'
        NSX_C_ENCODED_CREDENTIALS = 'test'

        NSX_VC_A_API_URL = 'https://nsx-vc-a'
        NSX_VC_A_API_URL_WITHOUT_PROTOCOL = 'nsx-vc-a'
        NSX_VC_A_PASSWORD = 'test'
        NSX_VC_A_LOGIN = 'admin'
        NSX_VC_A_ENCODED_CREDENTIALS = 'test'
    }

    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)
                runRubocop()
                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 runRubocop() {
    sh('''
        umask 0
        bundle exec rubocop
    ''')
}

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

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)
}
