#!/bin/bash
#
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -euxo pipefail

# Use a local SSD if available, otherwise use a RAM disk for our builds.
# if [ -e /dev/nvme0n1 ]; then
#   mkfs.ext4 -F /dev/nvme0n1
#   # TODO(philwo) add 'discard' option again, when b/68062163 is fixed.
#   mount -o defaults,nobarrier /dev/nvme0n1 /var/lib/buildkite-agent
#   chown -R buildkite-agent:buildkite-agent /var/lib/buildkite-agent
#   chmod 0755 /var/lib/buildkite-agent
#   mkdir /var/lib/buildkite-agent/docker
#   chown root:root /var/lib/buildkite-agent/docker
#   chmod 0711 /var/lib/buildkite-agent/docker
# fi

# Use the local SSD as swap space.
if [ -e /dev/nvme0n1 ]; then
  mkswap -f /dev/nvme0n1
  swapon /dev/nvme0n1

  # Move fast and lose data.
  mount -t tmpfs -o mode=1777,uid=root,gid=root,size=$((100 * 1024 * 1024 * 1024)) tmpfs /tmp
  mount -t tmpfs -o mode=0711,uid=root,gid=root,size=$((100 * 1024 * 1024 * 1024)) tmpfs /var/lib/docker
  mount -t tmpfs -o mode=0755,uid=buildkite-agent,gid=buildkite-agent,size=$((100 * 1024 * 1024 * 1024)) tmpfs /var/lib/buildkite-agent
fi

# Start Docker.
if [[ $(docker --version 2>/dev/null) ]]; then
  if [[ $(systemctl --version 2>/dev/null) ]]; then
    systemctl start docker
  else
    service docker start
  fi
fi

# Get the Buildkite Token from GCS and decrypt it using KMS.
BUILDKITE_TOKEN=$(curl -sS "https://storage.googleapis.com/bazel-encrypted-secrets/buildkite-agent-token.enc" | \
  gcloud kms decrypt --location global --keyring buildkite --key buildkite-agent-token --ciphertext-file - --plaintext-file -)

# Insert the Buildkite Token into the agent configuration.
sed -i "s/token=\"xxx\"/token=\"${BUILDKITE_TOKEN}\"/" /etc/buildkite-agent/buildkite-agent.cfg

# Only start the Buildkite Agent if this is a worker node (as opposed to a VM
# being used by someone for testing / development).
if [[ $(hostname) == buildkite* ]]; then
  if [[ -e /bin/systemctl ]]; then
    systemctl start buildkite-agent
  else
    service buildkite-agent start
  fi
fi

exit 0
