# -*- mode: ruby -*-
# # vi: set ft=ruby :
# Specify minimum Vagrant version and Vagrant API version
Vagrant.require_version '>= 1.6.0'
VAGRANTFILE_API_VERSION = '2'.freeze
# Require YAML module
require 'yaml'

# Read YAML file with box details
servers = YAML.load_file('servers.yaml')

# Create boxes
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Iterate through entries in YAML file
  servers.each do |server|
    config.env.enable
    config.vm.define server['name'] do |srv|
      srv.vm.box = server['box']
      srv.vm.synced_folder '../', '/deploy-sourcegraph-docker'
      srv.vm.boot_timeout = 600

      # Setup for CI or Local
      case ENV['VAGRANT_RUN_ENV']
      when 'CI'
        project_id = server['project_id']
        external_ip = server['external_ip']
        use_private_ip = server['use_private_ip']
        username = server['username']
        ssh_key_path = server['ssh_key_path']
      else
        project_id = ENV['VAGRANT_GCP_PROJECT_ID'] || 'sourcegraph-server'
        external_ip = nil
        use_private_ip = false
        username = ENV['VAGRANT_SSH_USER'] || ENV['USER']
        ssh_key_path = ENV['VAGRANT_SSH_KEY'] || '~/.ssh/id_rsa'
      end

      srv.vm.provider :google do |g, o|
        g.machine_type = server['machine_type']
        g.image = ENV['IMAGE']
        g.image_project_id = 'sourcegraph-ci'
        g.google_project_id = project_id
        g.name = "#{server['name']}-"+"#{Time.now.to_i}"+"#{rand(100000)}"
        g.network = server['network']
        g.external_ip = external_ip
        g.use_private_ip = use_private_ip
        g.service_account = server['service_account']
        g.labels = {
          "team" => "dev-infra",
          "type" => "vagrant"
        }
        g.scopes = [
            "compute-rw",
            "storage-ro"
        ]
        o.ssh.username = username
        o.ssh.private_key_path = ssh_key_path
      end

      srv.vm.provision 'shell', inline: <<-SHELL
        #!/usr/bin/env bash
        cat << EOF >> /root/.profile
export GIT_BRANCH=#{ENV['BUILDKITE_BRANCH']}
export TEST_TYPE=#{ENV['TEST_TYPE']}
export DOCKER_USERNAME=#{ENV['DOCKER_USERNAME']}
export DOCKER_PASSWORD=#{ENV['DOCKER_PASSWORD']}
EOF
        SHELL

      server['shell_commands'].each do |sh|
        srv.vm.provision 'shell', inline: sh
      end
    end
  end
end
