Class: Provisional::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/provisional/server.rb

Class Method Summary collapse

Class Method Details

.all(environment = nil) ⇒ Object



10
11
12
13
# File 'lib/provisional/server.rb', line 10

def self.all(environment = nil)
  # TODO: Filter by environment (and domain), if given.
  Provisional.digital_ocean.droplets.all.to_a
end

.create(options = {}) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/provisional/server.rb', line 15

def self.create(options = {})
  raise "Must pass in a hash" unless options.is_a?(Hash)
  name = options[:name]
  image = options[:image]
  server_options = { region: 'nyc3', size: '512mb', ssh_keys: all_ssh_keys }
  droplet = DropletKit::Droplet.new({name: name, image: image.id}.merge(server_options))
  server = Provisional.digital_ocean.droplets.create(droplet)
  print "Building server '#{name}' from image '#{image.slug || image.name}'."
  $stdout.flush
  while find(id: server.id).status == "new"
    putc(".")
    $stdout.flush
    sleep 5
  end
  puts "DONE"
  # Have to re-get the server, so it's populated with its IP address.
  find(id: server.id)
end

.delete(server) ⇒ Object



64
65
66
67
68
# File 'lib/provisional/server.rb', line 64

def self.delete(server)
  return unless server
  Provisional.digital_ocean.droplets.delete(id: server.id)
  # Don't really need to wait for this operation to complete.
end

.find(options = {}) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/provisional/server.rb', line 34

def self.find(options = {})
  raise "Must pass in a hash" unless options.is_a?(Hash)
  if options[:id]
    Provisional.digital_ocean.droplets.find(id: options[:id])
  elsif options[:name]
    all.select{|server| server.name == options[:name]}.first
  end
end

.list(environment) ⇒ Object



6
7
8
# File 'lib/provisional/server.rb', line 6

def self.list(environment)
  all.map(&:name)
end

.stop(server) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/provisional/server.rb', line 43

def self.stop(server)
  return unless server
  action = Provisional.digital_ocean.droplet_actions.shutdown(droplet_id: server.id)
  action_id = action.id
  print "Stopping server '#{server.name}' (action_id = #{action_id})."
  until action.status == "completed" do
    putc(".")
    # $stdout.flush
    sleep 1
    action = Provisional.digital_ocean.actions.find(id: action_id)
  end
  # TODO: I've seen a shutdown not work, so we'll need a timeout.
  until Provisional.digital_ocean.droplets.find(id: server.id).status == "off" do
    putc(".")
    $stdout.flush
    sleep 1
  end
  puts "DONE"
end