#!/bin/sh
# Consume test requests from AMQP queue and feed them to debci-test
set -eu

short_options='t:'
long_options='tag:,do-request'

usage() {
  cat <<EOF
usage: debci-worker [OPTIONS]

Options:
  -t TAG, --tag TAG         listen to queues which require this platform tag
                            (can be specified multiple times)

$@
EOF
}

debci_base_dir=$(readlink -f $(dirname $(readlink -f $0))/..)
. $debci_base_dir/lib/environment.sh
. $debci_base_dir/lib/functions.sh

tags=''

# Process one request. Read the AMQP message from stdin.
do_request() {
  local pkg
  local suite

  read pkg suite || true  # we expect EOF and thus read to fail

  if [ -z "$suite" ]; then
    suite="$debci_suite"
  fi

  log "$pkg $suite/$debci_arch started"

  local tmp_dir=$(mktemp -d)

  # run the test
  local result_dir="$(
    debci-test \
      --quiet \
      --data-dir "$tmp_dir" \
      --suite "$suite" \
      --print-output "$pkg"
  )"

  if [ ! -s "$result_dir/exitcode" ]; then
    log "E: Test for package $pkg produced no exit code, aborting"
    exit 2
  fi

  # debci_suite has to passed in to report_status because the worker is running
  # using the "default" suite which is usually unstable, which might be
  # different from the suite in which the test has actually just been executed.
  case $(cat "$result_dir/exitcode") in
      0|2)
          debci_suite="$suite" report_status $pkg pass
          ;;
      4|6|8|12)
          debci_suite="$suite" report_status $pkg fail
          ;;
      *)
          debci_suite="$suite" report_status $pkg tmpfail
          ;;
  esac

  # publish results
  result_dir=${result_dir##$tmp_dir/}

  amqp-declare-queue \
    --url="$debci_amqp_server" \
    --durable \
    --queue="$debci_amqp_results_queue" > /dev/null

  ( cd $tmp_dir && tar czf - "$result_dir" ) | amqp-publish \
    --url="${debci_amqp_server}" \
    --persistent \
    --routing-key="${debci_amqp_results_queue}"

  rm -rf "$tmp_dir"
}

# parse CLI arguments
while true; do
  case "$1" in
    -t|--tag)
      tags="${tags}_$2"
      shift 2
      ;;
    --do-request)
      do_request
      exit 0
      ;;
    *)
      break
      ;;
  esac
done

# if the user calls this, we run forever with consuming messages;
# amqp-consume calls ourselves with the (hidden) --do-request option
amqp_queue="${debci_amqp_queue}${tags}"
log "I: Connecting to AMQP queue $amqp_queue on ${debci_amqp_server}"
amqp-declare-queue --url ${debci_amqp_server} --durable -q $amqp_queue >/dev/null
exec amqp-consume --url ${debci_amqp_server} -q $amqp_queue --prefetch-count 1 -- $0 --do-request
