Class: Judo::Snapshot

Inherits:
Object
  • Object
show all
Defined in:
lib/judo/snapshot.rb

Overview

sdb name {

"version"    => [ server.version ],
"devs"       => [ "/dev/sde1:snap-abc123", "/dev/sde2:snap-abc456" ],
"server"     => server.id
"group"      => server.group.name
"virgin"     => server.virgin
"note"       => server.note
"data"       => server.data
"created_at" => unixtime

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base, name, server_id) ⇒ Snapshot

Returns a new instance of Snapshot.



15
16
17
18
19
# File 'lib/judo/snapshot.rb', line 15

def initialize(base, name, server_id)
  @base = base
  @name = name
  @server_id = server_id
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



13
14
15
# File 'lib/judo/snapshot.rb', line 13

def name
  @name
end

#server_idObject

Returns the value of attribute server_id.



13
14
15
# File 'lib/judo/snapshot.rb', line 13

def server_id
  @server_id
end

Instance Method Details

#animate(new_server) ⇒ Object

Raises:



86
87
88
89
# File 'lib/judo/snapshot.rb', line 86

def animate(new_server)
  raise JudoError, "cannot animate, snapshotting not complete" unless completed?
  @base.create_server(new_server, group_name, :version => version, :snapshots => devs, :virgin => virgin, :note => note, :data => data , :clone => name)
end

#completed?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/judo/snapshot.rb', line 122

def completed?
  not ec2_data.detect { |s| s[:aws_status] != "completed" }
end

#createObject

Raises:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/judo/snapshot.rb', line 65

def create
  raise JudoError,"snapshot already exists" unless state.empty?
  raise JudoError,"server has no disks to clone: #{server.volumes}" if server.volumes.empty?
  @base.task("Snapshotting #{server.name}") do
    devs = server.volumes.map do |dev,vol|
      "#{dev}:#{@base.ec2.create_snapshot(vol)[:aws_id]}"
    end
    @base.sdb.put_attributes(@base.snapshot_domain, name, {
      "version" => server.version,
      "virgin" => server.virgin?,
      "note" => server.note,
      "data" => server.data,
      "devs" => devs,
      "server" => server.id,
      "group" => server.group.name,
      "created_at" => Time.now.to_i.to_s
    }, :replace)
    server.add "snapshots", name
  end
end

#created_atObject



41
42
43
# File 'lib/judo/snapshot.rb', line 41

def created_at
  Time.at(get("created_at").to_i)
end

#dataObject



53
54
55
# File 'lib/judo/snapshot.rb', line 53

def data
  get("data")
end

#deleteObject



91
92
93
94
95
# File 'lib/judo/snapshot.rb', line 91

def delete
  ### TODO - wait for snapshotting to finish
  @base.sdb.delete_attributes(@base.snapshot_domain, name)
  server.remove("snapshots", name) if server
end

#destroyObject



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/judo/snapshot.rb', line 101

def destroy
  devs.each do |dev,snapshot_id|
    @base.task("Deleting snapshot #{snapshot_id}") do
      begin
        @base.ec2.delete_snapshot(snapshot_id)
      rescue Object => e
        puts "Error destrotying snapshot #{e.message}"
      end
    end
  end
  delete
end

#devsObject



61
62
63
# File 'lib/judo/snapshot.rb', line 61

def devs
  (state["devs"] || []).inject({}) { |out, kv| k, v = kv.split(':'); out[k] = v; out }
end

#ec2_dataObject



118
119
120
# File 'lib/judo/snapshot.rb', line 118

def ec2_data
  @base.ec2_snapshots.select { |s| ec2_ids.include? s[:aws_id] }
end

#ec2_idsObject



114
115
116
# File 'lib/judo/snapshot.rb', line 114

def ec2_ids
  devs.values
end

#fetch_stateObject



29
30
31
# File 'lib/judo/snapshot.rb', line 29

def fetch_state
  @base.sdb.get_attributes(@base.snapshot_domain, name)[:attributes]
end

#get(key) ⇒ Object



97
98
99
# File 'lib/judo/snapshot.rb', line 97

def get(key)
  state[key] && [state[key]].flatten.first
end

#groupObject



138
139
140
# File 'lib/judo/snapshot.rb', line 138

def group
  @group ||= @base.groups.detect { |g| g.name == group_name }
end

#group_nameObject



37
38
39
# File 'lib/judo/snapshot.rb', line 37

def group_name
  get("group")
end

#noteObject



49
50
51
# File 'lib/judo/snapshot.rb', line 49

def note
  get("note")
end

#progressObject



126
127
128
# File 'lib/judo/snapshot.rb', line 126

def progress
  "#{(ec2_data.inject(0) { |sum,a| sum + a[:aws_progress].to_i } / ec2_data.size).to_i}%"
end

#serverObject



25
26
27
# File 'lib/judo/snapshot.rb', line 25

def server
  @server ||= @base.servers.detect { |s| s.id == server_id }
end

#server_nameObject



21
22
23
# File 'lib/judo/snapshot.rb', line 21

def server_name
  server.name rescue '(deleted)'
end

#size(snap_id) ⇒ Object



130
131
132
# File 'lib/judo/snapshot.rb', line 130

def size(snap_id)
  @base.ec2_snapshots.detect { |s| s[:aws_id] == snap_id }
end

#stateObject



33
34
35
# File 'lib/judo/snapshot.rb', line 33

def state
  @base.snapshots_state[name] ||= fetch_state
end

#versionObject



45
46
47
# File 'lib/judo/snapshot.rb', line 45

def version
  get("version").to_i
end

#version_descObject



134
135
136
# File 'lib/judo/snapshot.rb', line 134

def version_desc
  group.version_desc(version)
end

#virginObject



57
58
59
# File 'lib/judo/snapshot.rb', line 57

def virgin
  get("virgin").to_s == "true"
end