# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'json'
require 'ipaddr'

ip = IPAddr.new("172.28.128.10")
boxes = (1..6).each_with_object({}) { |i,h| h["xenial" + i.to_s] = {"ip" => ip.succ.to_s}; ip = ip.succ}

consul_server_config_testdc = {
  "datacenter" => "testdc",
  "server" => true,
  "bootstrap_expect" => boxes.map {|k,v| v["ip"] }.first(boxes.keys.length / 2).length,
  "retry_join"  => boxes.map {|k,v| v["ip"] }.first(boxes.keys.length / 2),
  "retry_join_wan"  => boxes.map {|k,v| v["ip"] }.last(boxes.keys.length / 2),
}.to_json

consul_server_config_testdc2 = {
  "datacenter" => "testdc2",
  "server" => true,
  "bootstrap_expect" => boxes.map {|k,v| v["ip"] }.last(boxes.keys.length / 2).length,
  "retry_join"  => boxes.map {|k,v| v["ip"] }.last(boxes.keys.length / 2),
  "retry_join_wan"  => boxes.map {|k,v| v["ip"] }.first(boxes.keys.length / 2),
}.to_json

Vagrant.configure("2") do |config|

  boxes.each_pair do |name,opts|
    config.vm.define name do |box|
      box.vm.box = opts['box'] || 'ubuntu/xenial64'
      box.vm.hostname = name
      box.vm.box_check_update = false
      box.vm.network :private_network, ip: opts["ip"], nic_type: 'virtio'

      box.vm.provision "ansible" do |ansible|
        ansible.playbook = "consul.yml"

        ansible.raw_arguments = ['--diff']
        ansible.groups = {
          "leader" => boxes.keys.first,
          "followers" => boxes.keys[1..2],
        }
        ansible.host_vars = boxes.merge(boxes) do |k,v|
          if boxes.keys.first(boxes.keys.length / 2).include?(k)
            {
              "consul_server_config" => "'#{consul_server_config_testdc}'",
              "ignore_puppet" => true,
            }
          elsif boxes.keys.last(boxes.keys.length / 2).include?(k)
            {
              "consul_server_config" => "'#{consul_server_config_testdc2}'",
              "ignore_puppet" => true,
            }
          end
        end
      end
    end
  end
end
