pipeline {
  agent any

  stages {
    stage('Build infra') {
      steps {
        sh '''  if [ -e .git ]
                then
                  echo "Detected existing git checkout."
                  SOURCE_PATH="$WORKSPACE"
                else
                  echo "Performing git checkout."
                  mkdir $BUILD_TAG
                  cd $BUILD_TAG
                  git clone https://github.com/shakenfist/shakenfist
                  cd shakenfist
                  git checkout
                  SOURCE_PATH="$WORKSPACE/$BUILD_TAG/shakenfist"
                fi

                . /home/jenkins/sf-ci
                ansible-playbook -i /home/jenkins/hosts \
                    --extra-vars "identifier=$BUILD_TAG source_path=$SOURCE_PATH base_image=https://sfcbr.shakenfist.com/static/ubuntu2004-ci-template.qcow2 base_image_user=ubuntu" \
                    deploy/ansible/ci.yml
           '''
      }
    }
    stage('Run installer on primary') {
      steps {
        sh '''  . $WORKSPACE/$BUILD_TAG/ci-environment.sh
                ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                    ubuntu@$primary sudo /root/sf-deploy.sh
           '''
      }
    }
    stage('Run CI tests on primary') {
      steps {
        sh '''  . $WORKSPACE/$BUILD_TAG/ci-environment.sh
                scp -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                    -rp $source_path ubuntu@$primary:shakenfist
                ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                    ubuntu@$primary "cd shakenfist/deploy; tox -epy3"
           '''
      }
    }
    stage('Log check') {
      steps {
        sh '''  # Ensure we don't have any tracebacks
                if [ `grep -c "Traceback (most recent call last):" /var/log/syslog` -gt 0 ]
                then
                  echo "We have tracebacks in the logs!"
                  exit 1
                fi

                # Ensure we didn't log any errors
                if [ `grep -c "ERROR"` -gt 0 ]
                then
                  echo "Errors were logged!"
                  exit 1
                fi

                # Ensure nothing died
                if [ `grep -c "died"` -gt 0 ]
                then
                  echo "A process died!"
                  exit 1
                fi
          '''
      }
    }
    stage('Process check') {
      steps {
        sh '''  # No zombies!
                if [ `ps -ef | grep sf | grep -c defunct` -gt 0 ]
                then
                  echo "We have zombies!"
                  exit 1
                fi
          '''
      }
    }
  }

  post {
    always {
      sh '''  . /home/jenkins/sf-ci
              . $WORKSPACE/$BUILD_TAG/ci-environment.sh

              echo "=============================="
              ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                  ubuntu@$primary sudo cat /var/log/syslog

              echo "=============================="
              rm -rf $BUILD_TAG

              if [ -e $source_path/keepme ]
              then
                echo "Retaining CI environment because you asked nicely."
              else
                for uuid in `sf-client --simple instance list | grep $BUILD_TAG | cut -f 1 -d ","`
                do
                  sf-client instance delete $uuid
                done

                for uuid in `sf-client --simple network list | grep $BUILD_TAG | cut -f 1 -d ","`
                do
                  sf-client network delete $uuid
                done
              fi
          '''
    }
  }
}