2013-01-29 21:25:06 +01:00
|
|
|
require 'fog/core/collection'
|
|
|
|
require 'fog/digitalocean/models/compute/server'
|
|
|
|
|
|
|
|
module Fog
|
|
|
|
module Compute
|
|
|
|
class DigitalOcean
|
|
|
|
|
|
|
|
class Servers < Fog::Collection
|
2013-07-21 11:09:53 -07:00
|
|
|
|
2013-01-29 21:25:06 +01:00
|
|
|
model Fog::Compute::DigitalOcean::Server
|
|
|
|
|
2013-03-20 22:08:40 +01:00
|
|
|
def all(filters = {})
|
2013-07-21 11:09:53 -07:00
|
|
|
data = service.list_servers.body['droplets']
|
|
|
|
load(data)
|
2013-01-29 21:25:06 +01:00
|
|
|
end
|
|
|
|
|
2013-07-21 11:09:53 -07:00
|
|
|
def bootstrap(new_attributes = {})
|
|
|
|
server = new(new_attributes)
|
|
|
|
|
2013-12-27 14:02:38 -06:00
|
|
|
check_keys(new_attributes)
|
|
|
|
|
2013-07-21 11:09:53 -07:00
|
|
|
credential = Fog.respond_to?(:credential) && Fog.credential || :default
|
|
|
|
name = "fog_#{credential}"
|
|
|
|
ssh_key = service.ssh_keys.detect { |key| key.name == name }
|
|
|
|
if ssh_key.nil?
|
|
|
|
ssh_key = service.ssh_keys.create(
|
|
|
|
:name => name,
|
2013-12-27 14:02:38 -06:00
|
|
|
:ssh_pub_key => (new_attributes[:public_key] || File.read(new_attributes[:public_key_path]))
|
2013-07-21 11:09:53 -07:00
|
|
|
)
|
2013-01-29 21:25:06 +01:00
|
|
|
end
|
2013-07-21 11:09:53 -07:00
|
|
|
server.ssh_keys = [ssh_key]
|
|
|
|
|
|
|
|
server.save
|
|
|
|
server.wait_for { ready? }
|
2013-12-27 14:02:38 -06:00
|
|
|
|
|
|
|
if new_attributes[:private_key]
|
|
|
|
server.setup :key_data => [new_attributes[:private_key]]
|
|
|
|
else
|
|
|
|
server.setup :keys => [new_attributes[:private_key_path]]
|
|
|
|
end
|
|
|
|
|
2013-07-21 11:09:53 -07:00
|
|
|
server
|
|
|
|
end
|
|
|
|
|
|
|
|
def get(id)
|
|
|
|
server = service.get_server_details(id).body['droplet']
|
|
|
|
new(server) if server
|
2013-01-29 21:25:06 +01:00
|
|
|
rescue Fog::Errors::NotFound
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
2013-12-27 14:02:38 -06:00
|
|
|
protected
|
|
|
|
|
|
|
|
def check_keys(attributes)
|
|
|
|
check_key :public, attributes[:public_key], attributes[:public_key_path]
|
|
|
|
check_key :private, attributes[:private_key], attributes[:private_key_path]
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_key(name, data, path)
|
|
|
|
if [data, path].all?(&:nil?)
|
|
|
|
raise ArgumentError, "either #{name}_key or #{name}_key_path is required to configure the server"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-01-29 21:25:06 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|