class Kontena::Machine::DigitalOcean::NodeProvisioner

Attributes

api_client[R]
client[R]

Public Class Methods

new(api_client, token) click to toggle source

@param [Kontena::Client] api_client Kontena api client @param [String] token Digital Ocean token

# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 16
def initialize(api_client, token)
  @api_client = api_client
  @client = DropletKit::Client.new(access_token: token)
end

Public Instance Methods

droplet_exists_in_grid?(grid, droplet) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 75
def droplet_exists_in_grid?(grid, droplet)
  api_client.get("grids/#{grid}/nodes")['nodes'].find{|n| n['name'] == droplet.name}
end
erb(template, vars) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 79
def erb(template, vars)
  ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
end
generate_name() click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 67
def generate_name
  "#{super}-#{rand(1..99)}"
end
run!(opts) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 21
def run!(opts)
  userdata_vars = {
    version: opts[:version],
    master_uri: opts[:master_uri],
    grid_token: opts[:grid_token],
  }
  image = "coreos-#{opts[:channel]}"
  droplets = []
  opts[:count].to_i.times do
    droplet = DropletKit::Droplet.new(
      name: opts[:name] || generate_name,
      region: opts[:region],
      image: image,
      size: opts[:size],
      private_networking: true,
      user_data: user_data(userdata_vars),
      ssh_keys: [opts[:ssh_key_id]],
      tags: [opts[:grid]]
    )
    created = client.droplets.create(droplet)
    spinner "Creating DigitalOcean droplet #{droplet.name.colorize(:cyan)} " do
      sleep 1 until client.droplets.find(id: created.id).status == 'active'
    end
    droplets << droplet
  end
  droplets.each do |droplet|
    node = nil
    spinner "Waiting for node #{droplet.name.colorize(:cyan)} join to grid #{opts[:grid].colorize(:cyan)} " do
      sleep 1 until node = droplet_exists_in_grid?(opts[:grid], droplet)
    end
    set_labels(
      node,
      [
        "region=#{opts[:region]}",
        "az=#{opts[:region]}",
        "provider=digitalocean"
      ]
    )
  end
end
set_labels(node, labels) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 83
def set_labels(node, labels)
  data = {labels: labels}
  api_client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
end
ssh_key(public_key) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 71
def ssh_key(public_key)
  ssh_key = client.ssh_keys.all.find{|key| key.public_key == public_key}
end
user_data(vars) click to toggle source
# File lib/kontena/machine/digital_ocean/node_provisioner.rb, line 62
def user_data(vars)
  cloudinit_template = File.join(__dir__ , '/cloudinit.yml')
  erb(File.read(cloudinit_template), vars)
end