pipeline {
  agent any
  options {
    timeout(time: 1, unit: 'HOURS')
  }

  stages {
    stage('Build infra') {
      steps {
        sh '''  mkdir -p $WORKSPACE/$BUILD_TAG

                if [ -e .git ]
                then
                  echo "Detected existing git checkout."
                  git remote -v

                  if [ "https://github.com/shakenfist/shakenfist" == "https://github.com/shakenfist/shakenfist" ]
                  then
                    mkdir $WORKSPACE/$BUILD_TAG/shakenfist
                    ls -A | grep -v $BUILD_TAG | xargs -t -I '__' mv __ $WORKSPACE/$BUILD_TAG/shakenfist/
                  elif [ "https://github.com/shakenfist/shakenfist" == "https://github.com/shakenfist/client-python" ]
                  then
                    mkdir $WORKSPACE/$BUILD_TAG/client-python
                    ls -A | grep -v $BUILD_TAG | xargs -t -I '__' mv __ $WORKSPACE/$BUILD_TAG/client-python/
                  else
                    echo "Unknown github_url!"
                    exit 1
                  fi
                fi

                if [ ! -e $WORKSPACE/$BUILD_TAG/shakenfist ]
                then
                  echo "Performing shakenfist git checkout."
                  cd $WORKSPACE/$BUILD_TAG
                  git clone https://github.com/shakenfist/shakenfist
                  cd shakenfist
                  git checkout
                fi

                if [ ! -e $WORKSPACE/$BUILD_TAG/client-python ]
                then
                  echo "Performing client-python git checkout."
                  cd $WORKSPACE/$BUILD_TAG
                  git clone https://github.com/shakenfist/client-python
                  cd client-python
                  git checkout master
                fi

                SOURCE_PATH="$WORKSPACE/$BUILD_TAG"

                echo "==== shakenfist git log ===="
                cd $SOURCE_PATH/shakenfist
                git log -5 --no-merges

                echo "==== client-python git log ===="
                cd $SOURCE_PATH/client-python
                git log -5 --no-merges

                echo "==== end git logs ===="

                cd $SOURCE_PATH/shakenfist
                . /home/jenkins/sf-ci
                ansible-playbook -i /home/jenkins/hosts \
                    --extra-vars "identifier=$BUILD_TAG source_path=$SOURCE_PATH \
                    base_image=label:sfci-image \
                    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('Create a base level of activity in the cluster') {
      steps {
        sh '''  . $WORKSPACE/$BUILD_TAG/ci-environment.sh
                ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                    ubuntu@$primary \
                    'for i in `seq 100`; do . /etc/sf/sfrc; sf-client --async=continue network create background-$i 10.$i.0.0/24; done'
           '''
      }
    }
    stage('Run CI tests on primary') {
      steps {
        sh '''  . $WORKSPACE/$BUILD_TAG/ci-environment.sh
                scp -rp -i /home/jenkins/id_ci -o StrictHostKeyChecking=no \
                    -o UserKnownHostsFile=/dev/null \
                    $source_path/shakenfist \
                    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 '''  # Copy across syslog
                mkdir -p $WORKSPACE_TMP
                . $WORKSPACE/$BUILD_TAG/ci-environment.sh
                scp -rp -i /home/jenkins/id_ci -o StrictHostKeyChecking=no \
                    -o UserKnownHostsFile=/dev/null \
                    ubuntu@$primary:/var/log/syslog \
                    $WORKSPACE_TMP/syslog

                # Ensure we don't have any tracebacks
                if [ `grep -c "Traceback (most recent call last):" $WORKSPACE_TMP/syslog` -gt 0 ]
                then
                  echo "We have tracebacks in the logs!"
                  exit 1
                fi

                # Ensure we didn't log any errors -- note the inclusion of the start
                # of the process name here to avoid errors from things like prometheus
                # node exporter.
                if [ `grep -c "ERROR sf" $WORKSPACE_TMP/syslog` -gt 0 ]
                then
                  echo "Errors were logged!"
                  exit 1
                fi

                # Ensure nothing died
                if [ `grep -c "died" $WORKSPACE_TMP/syslog` -gt 0 ]
                then
                  echo "A process died!"
                  exit 1
                fi

                # Ensure no leaked vxlans
                if [ `grep -c "Extra vxlan present" $WORKSPACE_TMP/syslog` -gt 0 ]
                then
                  echo "vxlans leaked!"
                  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 /etc/sf/sfrc || true

              echo "=============================="
              ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                  ubuntu@$primary sudo cat /etc/sf/shakenfist.json || true

              echo "=============================="
              # We do not use the locally cached syslog from the log check here,
              # because if the CI run failed earlier, the log check was skipped.
              ssh -i /home/jenkins/id_ci -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                  ubuntu@$primary sudo cat /var/log/syslog || true

              echo "=============================="

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

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

              rm -rf $WORKSPACE/$BUILD_TAG
          '''
    }
  }
}