pipeline {

  agent {
    kubernetes {
      label 'nuscenes-builder-' + UUID.randomUUID().toString()
      cloud 'boston'
      yamlFile 'setup/docker.yaml'
    }// kubernetes
  } // agent

  environment {
    PROD_IMAGE = "nuscenes:production"
    TEST_IMAGE_3_6 = "registry-local.nutonomy.team:5000/nuscenes-test:kube${UUID.nameUUIDFromBytes(new String(env.BUILD_TAG).getBytes())}"
    TEST_IMAGE_3_7 = "registry-local.nutonomy.team:5000/nuscenes-test:kube${UUID.nameUUIDFromBytes(new String(env.BUILD_TAG).getBytes())}"
    NUSCENES = "/data/sets/nuscenes"
  }

  stages {
    stage('Build'){
      steps {
        container('docker') {
          // Build the Docker image, and then run python -m unittest inside
          // an activated Conda environment inside of the container.
          sh """#!/bin/bash
            set -eux
            docker build -t $TEST_IMAGE_3_6 -f setup/Dockerfile_3.6 .
            docker push $TEST_IMAGE_3_6

            docker build -t $TEST_IMAGE_3_7 -f setup/Dockerfile_3.7 .
            docker push $TEST_IMAGE_3_7
          """
        } // container
      } // steps
    } // stage

    stage('Tests') {
      failFast true
      parallel  {
        stage('Test 3.6'){
          agent {
            kubernetes {
              label 'nuscenes-test3.6-' + UUID.randomUUID().toString()
              cloud 'boston'
              yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  labels:
                    app: nuscenes
                spec:
                  containers:
                  - name: jnlp
                    image: registry.nutonomy.com:5000/nu/jnlp-slave:3.19-1-lfs
                    imagePullPolicy: Always
                  - name: docker
                    image: $TEST_IMAGE_3_6
                    command:
                    - cat
                    tty: true
                    volumeMounts:
                    - mountPath: /var/run/docker.sock
                      name: docker
                    - mountPath: /data/
                      name: nudeep-ci
                      subPath: data
                  imagePullSecrets:
                  - name: regcredjenkins
                  volumes:
                  - name: docker
                    hostPath:
                      path: /var/run/docker.sock
                  - name: nudeep-ci
                    persistentVolumeClaim:
                      claimName: nudeep-ci
                  env:
                  - name: NUSCENES
                    value: $NUSCENES
              """
            }// kubernetes
          } // agent

          steps {
            container('docker') {
              sh """#!/bin/bash
                set -e
                source activate nuscenes && python -m unittest discover python-sdk
                bash setup/test_tutorial.sh
              """
            } // container
          } // steps
        } // stage

        stage('Test 3.7'){
          agent {
            kubernetes {
              label 'nuscenes-test3.7-' + UUID.randomUUID().toString()
              cloud 'boston'
              yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  labels:
                    app: nuscenes
                spec:
                  containers:
                  - name: jnlp
                    image: registry.nutonomy.com:5000/nu/jnlp-slave:3.19-1-lfs
                    imagePullPolicy: Always
                  - name: docker
                    image: $TEST_IMAGE_3_7
                    command:
                    - cat
                    tty: true
                    volumeMounts:
                    - mountPath: /var/run/docker.sock
                      name: docker
                    - mountPath: /data/
                      name: nudeep-ci
                      subPath: data
                  imagePullSecrets:
                  - name: regcredjenkins
                  volumes:
                  - name: docker
                    hostPath:
                      path: /var/run/docker.sock
                  - name: nudeep-ci
                    persistentVolumeClaim:
                      claimName: nudeep-ci
                  env:
                  - name: NUSCENES
                    value: $NUSCENES
              """
            }// kubernetes
          } // agent

          steps {
            container('docker') {
              sh """#!/bin/bash
                set -e
                source activate nuscenes && python -m unittest discover python-sdk
                bash setup/test_tutorial.sh
              """
            } // container
          } // steps
        } // stage
      } // parallel
    } // stage

    stage('Deploy') {
      when {
        branch 'master'
      }

      steps {
        // TODO: determine where to deploy Docker images.
        container('docker'){
          withCredentials([[
              $class: 'AmazonWebServicesCredentialsBinding',
              credentialsId: 'aws-ecr-staging',
          ]]){
              sh """#!/bin/bash
              echo 'Tagging docker image as ready for production.  For now, this stage of the pipeline does nothing.'
              # docker build -t $PROD_IMAGE .
              # docker push $PROD_IMAGE
              """
          }
        } // container('docker')
      } //steps
    } // stage('Deploy')
  } // stages

  post {
    // only clean up if the build was successful; this allows us to debug failed builds
    success {
        // sh """git clean -fdx"""
        slackSend channel: "#nuscenes-ci", token: "bWyF0sJAVlMPOTs2lUTt5c2N", color: "#00cc00", message: """Success ${env.JOB_NAME} #${env.BUILD_NUMBER} [${env.CHANGE_AUTHOR}] (<${env.BUILD_URL}|Open>)
${env.CHANGE_BRANCH}: ${env.CHANGE_TITLE}"""
    }
    aborted {
        slackSend channel: "#nuscenes-ci", token: "bWyF0sJAVlMPOTs2lUTt5c2N", color: "#edb612", message: """Aborted ${env.JOB_NAME} #${env.BUILD_NUMBER} [${env.CHANGE_AUTHOR}] (<${env.BUILD_URL}|Open>)
${env.CHANGE_BRANCH}: ${env.CHANGE_TITLE}"""
    }
    failure {
        slackSend channel: "#nuscenes-ci", token: "bWyF0sJAVlMPOTs2lUTt5c2N", color: "#c61515", message: """Failed ${env.JOB_NAME} #${env.BUILD_NUMBER} [${env.CHANGE_AUTHOR}] (<${env.BUILD_URL}|Open>)
${env.CHANGE_BRANCH}: ${env.CHANGE_TITLE}"""
    }
    //changed {
        // only run if the current Pipeline run has a different status from previously completed Pipeline
    //}
  } // post

} // Pipeline
