#!groovy
@Library('infraLib') _

pipeline {
  agent {
    label 'linux-agents-xlarge'
  }
  options {
    timeout(time: 900, unit: 'MINUTES')
    disableConcurrentBuilds()
    ansiColor('xterm')
    buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5'))
  }
  parameters {
    choice(
      choices: [
        'qa',
        'qa-new',
        'staging'
      ],
      description: 'Select environment.',
      name: 'ENV_CHOICE'
    )
  }
  environment {
    NOTIFICATIONS_CHANNEL='#apollo-test-reports'
  }
  stages {
    stage('Notify start') {
      steps {
        script {
          utility.slackNotify(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL, "started ${env.JOB_NAME} <${env.BUILD_URL}|Open>")
        } /** end: script */
      } /** end: steps */
    } /** end: stage */
    stage('Build') {
      steps {
        sh 'make docker/image/build'
      } /** end: steps */
    } /** end: stage */
    stage('Static') {
      when {
        not {
          expression { return params.SKIP_STATIC }
        }
      }
      parallel {
        stage('Checkstyle') {
          steps {
            sh label: 'checkstyle', script: 'make docker/checkstyle'
          } /** end: steps */
          post {
            always {
              sh "sudo chown \$(whoami):\$(whoami) -R ${env.WORKSPACE}"
            }
          }
        } /** end: stage */
        stage('Security') {
          steps {
            sh label: 'check dependencies', script: 'make docker/security'
          } /** end: steps */
          post {
            always {
              sh "sudo chown \$(whoami):\$(whoami) -R ${env.WORKSPACE}"
            }
          }
        } /** end: stage */
      } /** end: parallel */
    } /** end: stage */
    stage('Test') {
      environment {
        AWS_PROFILE = "gdb-delphi-dev"

        USER_EMAIL    = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/USER_EMAIL', env.AWS_PROFILE)
        USER_PASSWORD = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/USER_PASSWORD', env.AWS_PROFILE)
        NOTIFICATIONS_EMAIL    = ' '
        NOTIFICATIONS_PASSWORD = ' '

        MYSQL_DB_NAME = "dbSony_dbo"
        MYSQL_DB_HOST = "dev-apollo-aurora-cep.cluster-custom-cic9zqsxd2y6.us-east-1.rds.amazonaws.com"
        MYSQL_DB_PORT = 3306
        MYSQL_DB_USER = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/MYSQL_DB_USER', env.AWS_PROFILE)
        MYSQL_DB_PASS = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/MYSQL_DB_PASS', env.AWS_PROFILE)

        AUTH0_CLIENT_ID     = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/CLIENT_ID', env.AWS_PROFILE)
        AUTH0_CLIENT_SECRET = utility.getSecretValueById('infra/jenkins/apollo/dev/uitest/CLIENT_SECRET', env.AWS_PROFILE)
        AUTH0_REALM         = 'LevelDB'
        AUTH0_GRANT_TYPE    = 'http://auth0.com/oauth/grant-type/password-realm'
        AUTH0_AUDIENCE      = 'https://apollo-private-api/'
        AUTH0_HOST          = 'https://sme-dna.auth0.com/oauth/token'
        AUTH0_CLIENT_ID_PROD       = ' '
        AUTH0_REALM_PROD           = ' '
        AUTH0_CLIENT_SECRET_PROD   = ' '
        AUTH0_HOST_PROD            = ' '
        AUTH0_SCOPE_PROD           = ' '
        TARGET_API_URL_PROD        = ' '
        USER_PASSWORD_PROD         = ' '
        AUTH0_CLIENT_ID_DELPHI     = ' '
        AUTH0_GRANT_TYPE_DELPHI    = ' '
        AUTH0_CLIENT_SECRET_DELPHI = ' '
        DELPHI_API_URL = ' '

        PYTEST_XDIST_WORKER = 'master'
        SELENIUM_HEADLESS   = 'False'
        SELENIUM_ENV        = 'web'
        CHROMEDRIVER_PATH   = 'path'
        SELENOID_HOST       = 'selinoid'
        BROWSER_NAME        = 'chrome'
        SELENIUM_TIMEOUT    = 50

        TARGET_API_URL = "https://qa-proxy.apollo.stream"
        ENV_BASE_URL   = "https://qa.apollo.stream"
//        TARGET_API_URL = "https://stage-proxy.apollo.stream"
//        ENV_BASE_URL   = "https://staging.apollo.stream"

        BROWSER_LATEST_TAG   = "${env.BROWSER_NAME}_${env.BROWSER_LATEST_VER}"
        BROWSER_LATEST_VER   = '96.0'
        UI_FRAMEWORK_PKG_VER = '1.3.45'
      } /** end: environment */
      steps {
        script {
          def data = "ENV=${env.ENV_BASE_URL}\nBROWSER=${env.BROWSER_LATEST_TAG}"
          writeFile(file: 'allure_report/environment.properties', text: data)
          sh "ls -l"
          sh """
          aws ecr get-login --no-include-email --profile ${env.AWS_PROFILE} --region us-east-1 | awk '{print \$6}' | docker login -u AWS --password-stdin https://475275892927.dkr.ecr.us-east-1.amazonaws.com
          docker pull selenoid/vnc:${env.BROWSER_LATEST_TAG}
          docker pull 475275892927.dkr.ecr.us-east-1.amazonaws.com/apollo/ui-test-selinoid-runner:${env.UI_FRAMEWORK_PKG_VER}
          mkdir selenoid_logs
          """
          docker.image('aerokube/selenoid:latest-release').withRun("-p 4444:4444 --entrypoint /entrypoint.sh -e BROWSER_NAME=${env.BROWSER_NAME} -e BROWSER_LATEST_VER=${env.BROWSER_LATEST_VER} -v ${env.WORKSPACE}/selenoid_logs:/tmp/logs -v /var/run/docker.sock:/var/run/docker.sock -v ${env.WORKSPACE}/entrypoint.sh:/entrypoint.sh:ro") { c ->
            docker.image("475275892927.dkr.ecr.us-east-1.amazonaws.com/apollo/ui-test-selinoid-runner:${env.UI_FRAMEWORK_PKG_VER}").inside("--link ${c.id}:selinoid") {
              sh '''
              set +e
              while ! curl -q selinoid:4444; do sleep 1; done
              py.test --html=report.html --self-contained-html --alluredir=allure_report  app/src/tests/ -n 10 --reruns 2
              test -d /usr/local/lib/python3.8/screenshots && cp -r /usr/local/lib/python3.8/screenshots .
              ls -ashil screenshots/
              '''
            } /** end: docker.image */
          } /** end: docker.image */
        } /** end: script */
      } /** end: steps */
      post {
        always {
          script {
            publishHTML target: [
                        allowMissing         : false,
                        alwaysLinkToLastBuild: false,
                        keepAll              : true,
                        reportDir            : '',
                        reportFiles          : 'report.html',
                        reportName           : 'Selenoid report',
            ]
            allure([
              includeProperties: false,
              jdk              : '',
              properties       : [],
              reportBuildPolicy: 'ALWAYS',
              results          : [[path: 'allure_report']]
            ])
          } /** end: always */
        } /** end: always */
      } /** end: post */
    } /** end: stage */
  } /** end: stages */
  post {
    always {
      script {
        utility.slackNotify(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL, "finished ${env.JOB_NAME} <${env.BUILD_URL}|Open>")
      } /** end: script */
    } /** end: always */
  } /** end: post */
}
