class Pvcglue::CloudProviders::DigitalOcean

Public Class Methods

new(provider_options) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 5
def initialize(provider_options)
  @options = provider_options
end

Public Instance Methods

client() click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 117
def client
  @client ||= get_client
end
create(options) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 9
def create(options)
  validate_options!(options, %w(name region capacity image))
  #doctl compute droplet create test --size 512mb --image ubuntu-16-04-x64 --region sfo2 --ssh-keys d1:fe:e8:53:d4:fb:eb:f1:db:fc:ef:18:f1:cf:1e:5d --enable-backups --enable-private-networking
  cmd = "doctl compute droplet create #{options.name} "
  cmd += "--region #{options.region} "
  cmd += "--size #{options.capacity} "
  cmd += "--image '#{options.image}' "
  cmd += '--enable-private-networking '
  cmd += '--enable-monitoring '
  cmd += '--enable-backups ' if options.backups
  # cmd += "--tags '#{options.group}' " if options.group
  cmd += "--ssh-keys #{options.ssh_keys.join(',')} "
  cmd += '--output json'

  result = Pvcglue.system_get_stdout(cmd, true)
  array_data = JSON.parse(result)
  array_data.each { |h| h['size_data'] = h.delete('size') }
  data = []
  array_data.each do |machine|
    data << ::SafeMash.new(machine)
  end
  droplet = data.first
  Pvcglue.verbose? { data.inspect }
  Pvcglue.logger.debug("Created Digital Ocean droplet, ID:  #{droplet.id}")
  droplet
end
droplets() click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 100
def droplets
  # client.droplets.all
  # @droplets ||= client.droplets.all
  # return nil
  cmd = 'doctl compute droplet list --output json'

  result = Pvcglue.system_get_stdout(cmd, true)
  array_data = JSON.parse(result)
  array_data.each { |h| h['size_data'] = h.delete('size') }
  data = []
  array_data.each do |machine|
    data << ::SafeMash.new(machine)
  end
  Pvcglue.verbose? { data.inspect }
  data
end
find_by_name(minion_name) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 54
def find_by_name(minion_name)
  result = droplets.detect { |droplet| droplet.name == minion_name }
  normalize_machine_data(result) if result
end
get_client() click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 121
def get_client
  access_token = YAML::load(File.open(File.join(ENV['HOME'], '.config/doctl/config.yaml')))['access-token']
  ::DropletKit::Client.new(access_token: access_token)
end
get_ip_addresses(droplet) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 126
def get_ip_addresses(droplet)
  ips = ::SafeMash.new
  droplet.networks.v4.each do |network|
    ips[network.type] = network.ip_address
  end
  ips
end
get_private_ip(droplet) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 73
def get_private_ip(droplet)
  get_ip_addresses(droplet).private
end
get_public_ip(droplet) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 77
def get_public_ip(droplet)
  get_ip_addresses(droplet).public
end
normalize_machine_data(droplet) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 63
def normalize_machine_data(droplet)
  machine = ::SafeMash.new
  machine.raw_data = droplet
  machine.id = droplet.id.to_s
  machine.public_ip = get_public_ip(droplet)
  machine.private_ip = get_private_ip(droplet)
  machine.cloud_provider = 'digital-ocean'
  machine
end
ready?(minion) click to toggle source

def create(options)

validate_options!(options, %w(name region capacity image))
byebug
opts = options.to_h
opts[:size] = opts.delete('capacity')

droplet_options = DropletKit::Droplet.new(opts)
droplet = client.droplets.create(droplet_options)
Pvcglue.logger.debug("Created Digital Ocean droplet, ID:  #{droplet.id}")
droplet

end

# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 48
def ready?(minion)
  droplet = find_by_name(minion.machine_name)

  droplet.raw_data[:status] == 'active'
end
reload_machine_data(minion) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 59
def reload_machine_data(minion)
  find_by_name(minion.machine_name)
end
request_error(data) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 93
def request_error(data)
  # TODO:  Better error handling
  return nil # for now
  # return nil unless data.errors
  # raise data.errors.values.join('.  ')
end
run(cmd) click to toggle source
# File lib/pvcglue/cloud_providers/digital_ocean.rb, line 81
def run(cmd)
  result = Pvcglue.system_get_stdout(cmd, true)
  array_data = JSON.parse(result)
  array_data.each { |h| h['size_data'] = h.delete('size') }
  data = []
  array_data.each do |machine|
    data << ::SafeMash.new(machine)
  end
  Pvcglue.verbose? { data.inspect }
  [data, request_error(data)]
end