2013-01-29 15:25:06 -05:00
|
|
|
require 'fog/compute/models/server'
|
|
|
|
|
|
|
|
module Fog
|
|
|
|
module Compute
|
|
|
|
class DigitalOcean
|
2013-01-31 19:08:04 -05:00
|
|
|
|
2013-01-29 15:25:06 -05:00
|
|
|
# A DigitalOcean Droplet
|
|
|
|
#
|
|
|
|
class Server < Fog::Compute::Server
|
|
|
|
|
|
|
|
identity :id
|
|
|
|
attribute :name
|
2013-03-21 08:28:41 -04:00
|
|
|
attribute :state, :aliases => 'status'
|
2013-01-29 15:25:06 -05:00
|
|
|
attribute :image_id
|
|
|
|
attribute :region_id
|
2013-03-21 08:28:41 -04:00
|
|
|
attribute :flavor_id, :aliases => 'size_id'
|
2013-02-26 14:42:08 -05:00
|
|
|
# Not documented in their API, but
|
|
|
|
# available nevertheless
|
|
|
|
attribute :ip_address
|
2013-01-29 15:25:06 -05:00
|
|
|
attribute :backups_active
|
|
|
|
|
2013-01-31 19:08:04 -05:00
|
|
|
# Reboot the server (soft reboot).
|
|
|
|
#
|
|
|
|
# The preferred method of rebooting a server.
|
2013-01-29 15:25:06 -05:00
|
|
|
def reboot
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
|
|
|
service.reboot_server self.id
|
2013-01-31 19:08:04 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Reboot the server (hard reboot).
|
|
|
|
#
|
|
|
|
# Powers the server off and then powers it on again.
|
|
|
|
def power_cycle
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
|
|
|
service.power_cycle_server self.id
|
2013-01-29 15:25:06 -05:00
|
|
|
end
|
|
|
|
|
2013-01-31 19:08:04 -05:00
|
|
|
# Shutdown the server
|
|
|
|
#
|
|
|
|
# Sends a shutdown signal to the operating system.
|
|
|
|
# The server consumes resources while powered off
|
|
|
|
# so you are still charged.
|
|
|
|
#
|
|
|
|
# @see https://www.digitalocean.com/community/questions/am-i-charged-while-my-droplet-is-in-a-powered-off-state
|
2013-01-29 15:25:06 -05:00
|
|
|
def shutdown
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
|
|
|
service.shutdown_server self.id
|
2013-01-31 19:08:04 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Power off the server
|
|
|
|
#
|
|
|
|
# Works as a power switch.
|
|
|
|
# The server consumes resources while powered off
|
|
|
|
# so you are still charged.
|
|
|
|
#
|
|
|
|
# @see https://www.digitalocean.com/community/questions/am-i-charged-while-my-droplet-is-in-a-powered-off-state
|
|
|
|
def stop
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
|
|
|
service.power_off_server self.id
|
2013-01-29 15:25:06 -05:00
|
|
|
end
|
|
|
|
|
2013-01-31 19:08:04 -05:00
|
|
|
# Power on the server.
|
|
|
|
#
|
|
|
|
# The server consumes resources while powered on
|
|
|
|
# so you will be charged.
|
|
|
|
#
|
|
|
|
# Each time a server is spun up, even if for a few seconds,
|
|
|
|
# it is charged for an hour.
|
|
|
|
#
|
|
|
|
def start
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
|
|
|
service.power_on_server self.id
|
2013-01-31 19:08:04 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Creates the server (not to be called directly).
|
|
|
|
#
|
|
|
|
# Usually called by Fog::Collection#create
|
|
|
|
#
|
|
|
|
# do = Fog::Compute.new({
|
|
|
|
# :provider => 'DigitalOcean',
|
|
|
|
# :digitalocean_api_key => 'key-here', # your API key here
|
|
|
|
# :digitalocean_client_id => 'client-id-here' # your client key here
|
|
|
|
# })
|
|
|
|
# do.servers.create :name => 'foobar',
|
|
|
|
# :image_id => image_id_here,
|
|
|
|
# :flavor_id => flavor_id_here,
|
|
|
|
# :region_id => region_id_here
|
|
|
|
#
|
|
|
|
# @return [Boolean]
|
2013-01-29 15:25:06 -05:00
|
|
|
def save
|
|
|
|
raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
|
|
|
|
requires :name, :flavor_id, :image_id, :region_id
|
2013-03-02 19:12:40 -05:00
|
|
|
|
|
|
|
options = {}
|
|
|
|
if attributes[:ssh_key_ids]
|
|
|
|
options[:ssh_key_ids] = attributes[:ssh_key_ids]
|
|
|
|
end
|
|
|
|
data = service.create_server name,
|
|
|
|
flavor_id,
|
|
|
|
image_id,
|
|
|
|
region_id,
|
|
|
|
options
|
2013-01-29 15:25:06 -05:00
|
|
|
merge_attributes(data.body['droplet'])
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2013-01-31 19:08:04 -05:00
|
|
|
# Destroy the server, freeing up the resources.
|
|
|
|
#
|
|
|
|
# DigitalOcean will stop charging you for the resources
|
|
|
|
# the server was using.
|
|
|
|
#
|
|
|
|
# Once the server has been destroyed, there's no way
|
|
|
|
# to recover it so the data is irrecoverably lost.
|
|
|
|
#
|
|
|
|
# IMPORTANT: As of 2013/01/31, you should wait some time to
|
|
|
|
# destroy the server after creating it. If you try to destroy
|
|
|
|
# the server too fast, the destroy event may be lost and the
|
|
|
|
# server will remain running and consuming resources, so
|
|
|
|
# DigitalOcean will keep charging you.
|
|
|
|
# Double checked this with DigitalOcean staff and confirmed
|
|
|
|
# that it's the way it works right now.
|
|
|
|
#
|
|
|
|
# Double check the server has been destroyed!
|
2013-01-29 15:25:06 -05:00
|
|
|
def destroy
|
2013-02-26 14:42:08 -05:00
|
|
|
requires :id
|
2013-01-29 15:25:06 -05:00
|
|
|
service.destroy_server id
|
|
|
|
end
|
|
|
|
|
2013-01-31 19:08:04 -05:00
|
|
|
# Checks whether the server status is 'active'.
|
|
|
|
#
|
|
|
|
# The server transitions from 'new' to 'active' sixty to ninety
|
|
|
|
# seconds after creating it (time varies and may take more
|
|
|
|
# than 90 secs).
|
|
|
|
#
|
|
|
|
# @return [Boolean]
|
2013-01-29 15:25:06 -05:00
|
|
|
def ready?
|
2013-03-21 08:28:41 -04:00
|
|
|
state == 'active'
|
2013-01-29 15:25:06 -05:00
|
|
|
end
|
2013-01-31 19:08:04 -05:00
|
|
|
|
2013-02-26 14:42:08 -05:00
|
|
|
# DigitalOcean API does not support updating server state
|
|
|
|
def update
|
|
|
|
msg = 'DigitalOcean servers do not support updates'
|
|
|
|
raise NotImplementedError.new(msg)
|
|
|
|
end
|
|
|
|
|
2013-01-29 15:25:06 -05:00
|
|
|
end
|
2013-01-31 19:08:04 -05:00
|
|
|
|
2013-01-29 15:25:06 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|