class Pvcglue::CloudProviders::Linode
Public Class Methods
new(provider_options)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 5 def initialize(provider_options) @options = provider_options end
Public Instance Methods
create(options)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 9 def create(options) # TODO: Set machine name. Example: "thekraken-alpha@ubuntu:~$" should be "thekraken-alpha@staging-web:~$" validate_options!(options, %w(name region capacity image)) cmd = "linode create #{options.name} " cmd += "--location #{options.region} " cmd += "--plan #{options.capacity} " cmd += '--payment-term 1 ' cmd += "--distribution '#{options.image}' " cmd += "--group '#{options.group}' " if options.group cmd += "--password #{generate_password} " cmd += "--pubkey-file '#{File.expand_path('~/.ssh/id_rsa.pub')}' " cmd += '--json' data, error = run(cmd) raise(error) if error.present? cmd = "linode ip-add --label #{options.name} --private " cmd += '--json' data, error = run(cmd) raise(error) if error.present? #<SafeMash staging-lb=#<SafeMash job="start" jobid=45919584 message="Completed. Booting staging-lb..." request_action="create" request_error="">> machine = find_by_name(options.name) Pvcglue.logger.debug("Created Linode, ID: #{machine.id}") machine end
find_by_name(name)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 52 def find_by_name(name) # return nil cmd = "linode show --label #{name} " cmd += '--json' data, error = run(cmd) if error =~ /Couldn't find/ return nil elsif error.present? raise(error) end normalize_machine_data(data) end
generate_password()
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 37 def generate_password password = "#{SecureRandom.hex}a1" # ensure required 'character classes' Pvcglue.verbose? { password } password end
get_private_ip(ips)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 97 def get_private_ip(ips) ips.each { |ip| return ip if is_private?(ip) } nil end
get_public_ip(ips)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 102 def get_public_ip(ips) ips.each { |ip| return ip unless is_private?(ip) } nil end
is_private?(ip)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 107 def is_private?(ip) ip =~ /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/m end
normalize_machine_data(data)
click to toggle source
> linode show staging-lb –json {
"staging-lb" : { "backupsenabled" : false, "totalram" : "1.00GB", "group" : "", "request_error" : "", "ips" : [ "192.168.132.194", "104.237.159.149" ], "location" : "fremont", "totalhd" : "20.00GB", "status" : "running", "label" : "staging-lb", "request_action" : "show", "linodeid" : 2817249 }
}
# File lib/pvcglue/cloud_providers/linode.rb, line 87 def normalize_machine_data(data) machine = ::SafeMash.new machine.raw_data = data machine.id = data.values.first.linodeid machine.public_ip = get_public_ip(data.values.first.ips) machine.private_ip = get_private_ip(data.values.first.ips) machine.cloud_provider = 'linode' machine end
ready?(minion)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 47 def ready?(minion) machine = find_by_name(minion.machine_name) machine.raw_data.values.first.status == 'running' end
reload_machine_data(minion)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 43 def reload_machine_data(minion) find_by_name(minion.machine_name) end
request_error(data)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 119 def request_error(data) data.values.first.request_error end
run(cmd)
click to toggle source
# File lib/pvcglue/cloud_providers/linode.rb, line 112 def run(cmd) result = Pvcglue.system_get_stdout(cmd) data = ::SafeMash.new(JSON.parse(result)) Pvcglue.verbose? { data.inspect } [data, request_error(data)] end