# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

description   "Start the satlab application, a set of docker containers."
author        "chromium-os-dev@chromium.org"

start on started moblab-dockerd

script
  mkdir -p /var/log/bootup/
  exec >>/var/log/bootup/${UPSTART_JOB}.log 2>&1
  set -x
  set +e

  APP_KEY="$(vpd -i RW_VPD -g application)"
  if [ "$?" != "0" ] || [ "${APP_KEY}" != "satlab" ]; then
    echo "Cannot start ${UPSTART_JOB} for APP_KEY = ${APP_KEY}."
    exit 1
  fi

  set -e
  LABEL=release
  REPO_ADDR=us-docker.pkg.dev/chromeos-partner-moblab/satlab

  if [ -e /etc/lsb-release ]; then
    track=$(cat /etc/lsb-release | \
            grep "CHROMEOS_RELEASE_TRACK" | \
            awk -F = '{ print $2 }')

    case $track in

      beta-channel)
        LABEL=beta
      ;;

      testimage-channel | dev-channel | developer-build )
        LABEL=autopush
        if [ -e /dev/disk/by-label/SATLAB-DEV ] ; then
          mkdir -p /usr/local/tmp/satlab-dev
          umount /usr/local/tmp/satlab-dev || true
          mount "$(readlink -f /dev/disk/by-label/SATLAB-DEV)" \
              /usr/local/tmp/satlab-dev || true
          LABEL=$(cat /usr/local/tmp/satlab-dev/dev-compose-label || echo autopush)
          REPO_ADDR=$(cat /usr/local/tmp/satlab-dev/dev-compose-repo || echo "us-docker.pkg.dev/chromeos-partner-moblab/satlab")
        fi
      ;;
    esac
  fi

  SSH_PORT=22

  case $track in
    testimage-channel )
      SSH_PORT=2222
    ;;
  esac

  reps=0
  while [ ${reps} -lt 100 ] && ! docker info ; do
    : $((reps += 1))
    sleep 1
  done

  reps=0
  while [ ${reps} -lt 100 ] && \
        ! docker pull \
          "${REPO_ADDR}/satlab-compose:${LABEL}" ; do
    : $((reps += 1))
    sleep 1
  done

  docker run --rm --name compose \
    --label=com.centurylinklabs.watchtower.lifecycle.pre-update="docker-compose down" \
    --label=com.centurylinklabs.watchtower.stop-signal=KILL \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v docker_config:/root/.docker \
    -v satlab_keys:/home/satlab/keys \
    -v cache_server:/home/satlab/cache_server \
    -e LABEL=${LABEL} \
    -e SSH_PORT=${SSH_PORT} \
    --add-host dockerhost:172.17.0.1 \
    "${REPO_ADDR}/satlab-compose:${LABEL}" up

end script
