class Kontena::Machine::Vagrant::MasterProvisioner

Constants

API_URL

Attributes

client[R]

Public Class Methods

new() click to toggle source
# File lib/kontena/machine/vagrant/master_provisioner.rb, line 16
def initialize
  @client = Excon.new(API_URL)
end

Public Instance Methods

generate_name() click to toggle source
# File lib/kontena/machine/vagrant/master_provisioner.rb, line 90
def generate_name
  "krates-master-#{super}-#{rand(1..99)}"
end
master_running?() click to toggle source
# File lib/kontena/machine/vagrant/master_provisioner.rb, line 84
def master_running?
  client.get(path: '/').status == 200
rescue
  false
end
run!(opts) click to toggle source
# File lib/kontena/machine/vagrant/master_provisioner.rb, line 20
def run!(opts)
  name = opts[:name] || generate_name
  version = opts[:version]
  memory = opts[:memory] || 1024
  vault_secret = opts[:vault_secret]
  vault_iv = opts[:vault_iv]
  initial_admin_code = opts[:initial_admin_code]
  coreos_channel = opts[:coreos_channel]
  vagrant_path = "#{Dir.home}/.krates/vagrant_master/"
  if Dir.exist?(vagrant_path)
    puts "Oops... cannot create Krates Master because installation path already exists."
    puts "If you are sure that no Krates Master(s) exist on this machine, remove folder: #{vagrant_path}"
    abort
  end
  FileUtils.mkdir_p(vagrant_path)

  template = File.join(__dir__ , '/Vagrantfile.master.rb.erb')
  cloudinit_template = File.join(__dir__ , '/cloudinit.yml')
  vars = {
    name: name,
    server_name: name.sub('krates-master-', ''),
    version: version,
    memory: memory,
    vault_secret: vault_secret,
    initial_admin_code: initial_admin_code,
    vault_iv: vault_iv,
    coreos_channel: coreos_channel,
    cloudinit: "#{vagrant_path}/cloudinit.yml"
  }
  spinner "Creating Vagrant config " do
    vagrant_data = erb(File.read(template), vars)
    cloudinit = erb(File.read(cloudinit_template), vars)
    File.write("#{vagrant_path}/Vagrantfile", vagrant_data)
    File.write("#{vagrant_path}/cloudinit.yml", cloudinit)
  end

  Dir.chdir(vagrant_path) do
    spinner "Triggering CoreOS Container Linux box update"
    system('vagrant box update')
    spinner "Executing 'vagrant up'"
    run_command('vagrant up')
    spinner "'vagrant up' executed successfully"
  end

  spinner "Waiting for #{name.colorize(:cyan)} to start " do
    sleep 1 until master_running?
  end

  master_version = nil
  spinner "Retrieving #{name.colorize(:cyan)} version" do
    master_version = JSON.parse(client.get(path: '/'))["version"] rescue nil
  end

  spinner "Krates Master #{master_version} is now running at #{API_URL}"

  {
    name: name.sub('krates-master-', ''),
    public_ip: API_URL.split('//').last,
    provider: 'vagrant',
    version: master_version,
    code: opts[:initial_admin_code]
  }
end