Module: Chef::Knife::DigitalOceanBase

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(includer) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/chef/knife/digital_ocean_base.rb', line 24

def self.included(includer)
  includer.class_eval do
    category 'digital_ocean'

    # Lazy load our dependencies. Later calls to `Knife#deps` override
    # previous ones, so if the including class calls it, it needs to also
    # call our #load_deps, i.e:
    #
    #   Include Chef::Knife::DigitalOceanBase
    #
    #   deps do
    #     require 'foo'
    #     require 'bar'
    #     Chef::Knife::DigitalOceanBase.load_deps
    #   end
    #
    deps { Chef::Knife::DigitalOceanBase.load_deps }

    option :digital_ocean_access_token,
           short: '-A ACCESS_TOKEN',
           long: '--digital_ocean_access_token ACCESS_TOKEN',
           description: 'Your DigitalOcean ACCESS_TOKEN',
           proc: proc { |access_token| Chef::Config[:knife][:digital_ocean_access_token] = access_token }
  end
end

.load_depsObject



18
19
20
21
22
# File 'lib/chef/knife/digital_ocean_base.rb', line 18

def self.load_deps
  require 'droplet_kit'
  require 'json'
  require 'chef/mixin/shell_out'
end

Instance Method Details

#clientObject



50
51
52
# File 'lib/chef/knife/digital_ocean_base.rb', line 50

def client
  DropletKit::Client.new(access_token: Chef::Config[:knife][:digital_ocean_access_token])
end

#locate_config_value(key) ⇒ Object



67
68
69
70
# File 'lib/chef/knife/digital_ocean_base.rb', line 67

def locate_config_value(key)
  key = key.to_sym
  config[key] || Chef::Config[:knife][key]
end

#validate!(keys = [:digital_ocean_access_token]) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/chef/knife/digital_ocean_base.rb', line 54

def validate!(keys = [:digital_ocean_access_token])
  errors = []

  keys.each do |k|
    if locate_config_value(k).nil?
      errors << "You did not provide a valid '#{k}' value. " \
                "Please set knife[:#{k}] in your knife.rb or pass as an option."
    end
  end

  exit 1 if errors.each { |e| ui.error(e) }.any?
end

#wait_for_status(result, status: 'in-progress', sleep: 3) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/chef/knife/digital_ocean_base.rb', line 72

def wait_for_status(result, status: 'in-progress', sleep: 3)
  print 'Waiting '
  while result.status == 'in-progress'
    sleep sleep
    print('.')

    if status == 'in-progress'
      break if client.droplets.find(id: locate_config_value(:id)).status != 'in-progress'
    else
      break if client.droplets.find(id: locate_config_value(:id)).status == status
    end
  end
  ui.info 'OK'
end