rudy 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.txt +110 -18
- data/README.rdoc +40 -44
- data/Rudyfile +35 -50
- data/bin/rudy +88 -57
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +59 -91
- data/lib/rudy/aws.rb +4 -45
- data/lib/rudy/aws/ec2.rb +57 -20
- data/lib/rudy/aws/ec2/address.rb +10 -11
- data/lib/rudy/aws/ec2/group.rb +10 -9
- data/lib/rudy/aws/ec2/image.rb +8 -8
- data/lib/rudy/aws/ec2/instance.rb +18 -19
- data/lib/rudy/aws/ec2/keypair.rb +14 -19
- data/lib/rudy/aws/ec2/snapshot.rb +16 -9
- data/lib/rudy/aws/ec2/volume.rb +39 -26
- data/lib/rudy/aws/ec2/zone.rb +5 -4
- data/lib/rudy/aws/s3.rb +2 -1
- data/lib/rudy/aws/sdb.rb +35 -86
- data/lib/rudy/backups.rb +24 -0
- data/lib/rudy/cli.rb +5 -131
- data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
- data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
- data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
- data/lib/rudy/cli/aws/ec2/images.rb +5 -133
- data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
- data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
- data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
- data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
- data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
- data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
- data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
- data/lib/rudy/cli/aws/sdb/select.rb +23 -0
- data/lib/rudy/cli/backups.rb +38 -0
- data/lib/rudy/cli/base.rb +104 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +20 -7
- data/lib/rudy/cli/disks.rb +7 -9
- data/lib/rudy/cli/execbase.rb +56 -0
- data/lib/rudy/cli/machines.rb +242 -45
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/networks.rb +34 -0
- data/lib/rudy/cli/routines.rb +32 -6
- data/lib/rudy/cli/status.rb +60 -0
- data/lib/rudy/config.rb +55 -32
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +99 -0
- data/lib/rudy/global.rb +67 -28
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +67 -58
- data/lib/rudy/machines.rb +41 -263
- data/lib/rudy/metadata.rb +212 -38
- data/lib/rudy/metadata/backup.rb +123 -78
- data/lib/rudy/metadata/disk.rb +153 -170
- data/lib/rudy/metadata/machine.rb +179 -0
- data/lib/rudy/mixins.rb +2 -1
- data/lib/rudy/mixins/hash.rb +3 -1
- data/lib/rudy/mixins/symbol.rb +8 -0
- data/lib/rudy/routines.rb +127 -344
- data/lib/rudy/routines/base.rb +229 -0
- data/lib/rudy/routines/handlers/base.rb +48 -0
- data/lib/rudy/routines/handlers/depends.rb +49 -0
- data/lib/rudy/routines/handlers/disks.rb +249 -0
- data/lib/rudy/routines/handlers/group.rb +44 -0
- data/lib/rudy/routines/handlers/host.rb +70 -0
- data/lib/rudy/routines/handlers/keypair.rb +70 -0
- data/lib/rudy/routines/handlers/machines.rb +15 -0
- data/lib/rudy/routines/handlers/script.rb +85 -0
- data/lib/rudy/routines/handlers/user.rb +45 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +98 -50
- data/lib/rudy/routines/shutdown.rb +65 -14
- data/lib/rudy/routines/startup.rb +112 -17
- data/lib/rudy/utils.rb +35 -68
- data/rudy.gemspec +82 -25
- data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
- data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
- data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
- data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
- data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
- data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
- data/tryouts/12_config/40_machines_tryouts.rb +53 -0
- data/tryouts/12_config/50_commands_tryouts.rb +17 -0
- data/tryouts/12_config/60_routines_tryouts.rb +16 -0
- data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
- data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
- data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
- data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
- data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
- data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
- data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
- data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
- data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
- data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
- data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
- data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
- data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
- data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
- data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
- data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
- data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
- data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
- data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
- data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
- data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
- data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
- data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
- data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
- data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
- data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
- data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
- data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
- data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
- data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
- data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
- data/tryouts/exploration/console.rb +91 -0
- data/tryouts/exploration/machine.rb +23 -0
- data/tryouts/failer +6 -0
- metadata +116 -32
- data/bin/ird +0 -153
- data/lib/rudy/metadata/backups.rb +0 -67
- data/lib/rudy/metadata/debug.rb +0 -38
- data/lib/rudy/metadata/disks.rb +0 -67
- data/lib/rudy/metadata/objectbase.rb +0 -108
- data/lib/rudy/routines/helper.rb +0 -76
- data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
- data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
- data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
- data/lib/rudy/routines/helpers/userhelper.rb +0 -37
- data/support/rudy-ec2-startup +0 -200
@@ -1,34 +0,0 @@
|
|
1
|
-
|
2
|
-
module Rudy; module Routines;
|
3
|
-
module DependsHelper
|
4
|
-
include Rudy::Routines::HelperBase # TODO: use trap_rbox_errors
|
5
|
-
extend self
|
6
|
-
|
7
|
-
def has_depends?(timing, routine)
|
8
|
-
(!routine.is_a?(Caesars::Hash) || routine[timing].is_a?(Caesars::Hash))
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns an Array of the dependent routines for the given +timing+ (before/after)
|
12
|
-
def get(timing, routine)
|
13
|
-
return if !(routine.is_a?(Caesars::Hash) || routine[timing].is_a?(Caesars::Hash))
|
14
|
-
|
15
|
-
# This will produce an Array containing the routines to run. The
|
16
|
-
# elements are the valid routine names.
|
17
|
-
# NOTE: The "timing" elements are removed from the routines hash.
|
18
|
-
dependencies = []
|
19
|
-
routine[timing].each_pair do |n,v|
|
20
|
-
next unless v.nil? # this skips all "script" blocks
|
21
|
-
raise "#{timing}: #{n} is not a known routine" unless valid_routine?(n)
|
22
|
-
routine[timing].delete(n)
|
23
|
-
dependencies << n
|
24
|
-
end
|
25
|
-
|
26
|
-
# We need to return only the keys b/c the values are nil
|
27
|
-
dependencies = nil if dependencies.empty?
|
28
|
-
dependencies
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end; end
|
@@ -1,403 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy; module Routines;
|
4
|
-
module DiskHelper
|
5
|
-
include Rudy::Routines::HelperBase # TODO: use trap_rbox_errors
|
6
|
-
extend self
|
7
|
-
|
8
|
-
def disks?(routine)
|
9
|
-
(routine.is_a?(Caesars::Hash) && routine.disks &&
|
10
|
-
routine.disks.is_a?(Caesars::Hash) && !routine.disks.empty?) ? true : false
|
11
|
-
end
|
12
|
-
|
13
|
-
def paths(routine)
|
14
|
-
return nil unless disks?(routine)
|
15
|
-
routine.disks.values.collect { |d| d.keys }.flatten
|
16
|
-
end
|
17
|
-
|
18
|
-
def execute(routine, machine, rbox)
|
19
|
-
return unless routine
|
20
|
-
raise "Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
21
|
-
raise "Not a Rye::Box" unless rbox.is_a?(Rye::Box)
|
22
|
-
|
23
|
-
@machine = machine
|
24
|
-
@rbox = rbox
|
25
|
-
|
26
|
-
# We need to add mkfs since it's not enabled by default.
|
27
|
-
# We add it only to this instance we're using.
|
28
|
-
# We give it a funny name so we can delete it.
|
29
|
-
def @rbox.rudy_mkfs(*args); cmd('mkfs', args); end
|
30
|
-
|
31
|
-
unless disks?(routine)
|
32
|
-
STDERR.puts "[nothing to do]"
|
33
|
-
return
|
34
|
-
end
|
35
|
-
|
36
|
-
modified = []
|
37
|
-
routine.disks.each_pair do |action, disks|
|
38
|
-
unless DiskHelper.respond_to?(action)
|
39
|
-
STDERR.puts %Q(DiskHelper: unknown action "#{action}")
|
40
|
-
next
|
41
|
-
end
|
42
|
-
send(action, disks) # create, copy, destroy, ...
|
43
|
-
modified << disks
|
44
|
-
end
|
45
|
-
|
46
|
-
# TODO: remove rudy_mkfs method
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
def snapshot(disks)
|
51
|
-
rdisk = Rudy::Disks.new
|
52
|
-
rback = Rudy::Backups.new
|
53
|
-
|
54
|
-
disks.each_pair do |path, props|
|
55
|
-
adisk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
56
|
-
disk = rdisk.get(adisk.name)
|
57
|
-
if disk == nil
|
58
|
-
puts "Not found: #{adisk.name}".color(:red)
|
59
|
-
return
|
60
|
-
end
|
61
|
-
back = disk.backup
|
62
|
-
puts "Created backup: #{back.name}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def restore(disks)
|
67
|
-
rdisk = Rudy::Disks.new
|
68
|
-
rback = Rudy::Backups.new
|
69
|
-
|
70
|
-
disks.each_pair do |path, props|
|
71
|
-
disk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
72
|
-
|
73
|
-
olddisk = rdisk.get(disk.name)
|
74
|
-
back = nil
|
75
|
-
if olddisk && olddisk.exists?
|
76
|
-
olddisk.update
|
77
|
-
puts "Disk found: #{olddisk.name}. Skipping...".color(:red)
|
78
|
-
return
|
79
|
-
else
|
80
|
-
disk.fstype = props[:fstype] || 'ext3'
|
81
|
-
more = [:environment, props[:environment]] if props[:environment]
|
82
|
-
more += [:role, props[:role]] if props[:role]
|
83
|
-
back = (rback.list(more, nil) || []).first
|
84
|
-
raise "No backup found" unless back
|
85
|
-
puts "Found backup #{back.name} "
|
86
|
-
end
|
87
|
-
|
88
|
-
unless disk.exists? # Checks the EBS volume
|
89
|
-
msg = "Creating volume from snapshot (#{back.awsid})... "
|
90
|
-
disk.create(back.size, @@global.zone, back.awsid)
|
91
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
92
|
-
disk.available?
|
93
|
-
}
|
94
|
-
end
|
95
|
-
|
96
|
-
msg = "Attaching #{disk.awsid} to #{@machine.awsid}... "
|
97
|
-
disk.attach(@machine.awsid)
|
98
|
-
Rudy::Utils.waiter(2, 10, STDOUT, msg) {
|
99
|
-
disk.attached?
|
100
|
-
}
|
101
|
-
|
102
|
-
sleep 2
|
103
|
-
|
104
|
-
begin
|
105
|
-
@rbox.mkdir(:p, disk.path)
|
106
|
-
|
107
|
-
print "Mounting at #{disk.path}... "
|
108
|
-
|
109
|
-
ret = @rbox.mount(:t, disk.fstype, disk.device, disk.path)
|
110
|
-
print_response ret
|
111
|
-
if ret.exit_code > 0
|
112
|
-
STDERR.puts "Error creating disk".color(:red)
|
113
|
-
return
|
114
|
-
else
|
115
|
-
puts "done"
|
116
|
-
end
|
117
|
-
disk.mounted = true
|
118
|
-
disk.save
|
119
|
-
|
120
|
-
rescue Net::SSH::AuthenticationFailed, Net::SSH::HostKeyMismatch => ex
|
121
|
-
STDERR.puts "Error creating disk".color(:red)
|
122
|
-
STDERR.puts ex.message.color(:red)
|
123
|
-
rescue Rye::CommandNotFound => ex
|
124
|
-
puts " CommandNotFound: #{ex.message}".color(:red)
|
125
|
-
|
126
|
-
rescue
|
127
|
-
STDERR.puts "Error creating disk" .color(:red)
|
128
|
-
Rudy::Utils.bug
|
129
|
-
end
|
130
|
-
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
|
135
|
-
def create(disks)
|
136
|
-
rdisk = Rudy::Disks.new
|
137
|
-
|
138
|
-
disks.each_pair do |path, props|
|
139
|
-
disk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
140
|
-
olddisk = rdisk.get(disk.name)
|
141
|
-
if olddisk && olddisk.exists?
|
142
|
-
olddisk.update
|
143
|
-
puts "Disk found: #{olddisk.name}"
|
144
|
-
if olddisk.attached?
|
145
|
-
puts "In use. Skipping...".color(:red)
|
146
|
-
return
|
147
|
-
else
|
148
|
-
disk = olddisk
|
149
|
-
end
|
150
|
-
else
|
151
|
-
puts "Creating #{disk.name} "
|
152
|
-
disk.fstype = props[:fstype] || 'ext3'
|
153
|
-
end
|
154
|
-
|
155
|
-
unless disk.exists? # Checks the EBS volume
|
156
|
-
msg = "Creating volume... "
|
157
|
-
disk.create
|
158
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
159
|
-
disk.available?
|
160
|
-
}
|
161
|
-
end
|
162
|
-
|
163
|
-
msg = "Attaching #{disk.awsid} to #{@machine.awsid}... "
|
164
|
-
disk.attach(@machine.awsid)
|
165
|
-
Rudy::Utils.waiter(2, 10, STDOUT, msg) {
|
166
|
-
disk.attached?
|
167
|
-
}
|
168
|
-
|
169
|
-
# The device needs some time.
|
170
|
-
# Otherwise mkfs returns:
|
171
|
-
# "No such file or directory while trying to determine filesystem size"
|
172
|
-
sleep 2
|
173
|
-
|
174
|
-
# TODO: Cleanup. See ScriptHelper
|
175
|
-
begin
|
176
|
-
if disk.raw == true
|
177
|
-
print "Creating #{disk.fstype} filesystem for #{disk.device}... "
|
178
|
-
@rbox.rudy_mkfs(:t, disk.fstype, :F, disk.device)
|
179
|
-
disk.raw = false
|
180
|
-
disk.save
|
181
|
-
puts "done"
|
182
|
-
end
|
183
|
-
|
184
|
-
@rbox.mkdir(:p, disk.path)
|
185
|
-
|
186
|
-
print "Mounting at #{disk.path}... "
|
187
|
-
|
188
|
-
ret = @rbox.mount(:t, disk.fstype, disk.device, disk.path)
|
189
|
-
print_response ret
|
190
|
-
if ret.exit_code > 0
|
191
|
-
STDERR.puts "Error creating disk".color(:red)
|
192
|
-
return
|
193
|
-
else
|
194
|
-
puts "done"
|
195
|
-
end
|
196
|
-
disk.mounted = true
|
197
|
-
disk.save
|
198
|
-
|
199
|
-
rescue Net::SSH::AuthenticationFailed, Net::SSH::HostKeyMismatch => ex
|
200
|
-
STDERR.puts "Error creating disk".color(:red)
|
201
|
-
STDERR.puts ex.message.color(:red)
|
202
|
-
rescue Rye::CommandNotFound => ex
|
203
|
-
puts " CommandNotFound: #{ex.message}".color(:red)
|
204
|
-
|
205
|
-
rescue
|
206
|
-
STDERR.puts "Error creating disk" .color(:red)
|
207
|
-
Rudy::Utils.bug
|
208
|
-
end
|
209
|
-
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
def attach(disks)
|
217
|
-
rdisk = Rudy::Disks.new
|
218
|
-
|
219
|
-
disks.each_pair do |path, props|
|
220
|
-
disk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
221
|
-
olddisk = rdisk.get(disk.name)
|
222
|
-
if olddisk && olddisk.exists?
|
223
|
-
disk.update
|
224
|
-
puts "Disk found: #{olddisk.name}"
|
225
|
-
if disk.attached?
|
226
|
-
puts "In use. Skipping...".color(:red)
|
227
|
-
return
|
228
|
-
else
|
229
|
-
disk = olddisk
|
230
|
-
end
|
231
|
-
else
|
232
|
-
puts "Creating #{disk.name} "
|
233
|
-
end
|
234
|
-
p disk
|
235
|
-
p [disk.exists?, disk.available?, olddisk.exists?, olddisk.available?]
|
236
|
-
disk.save
|
237
|
-
|
238
|
-
unless disk.exists? # Checks the EBS volume
|
239
|
-
msg = "Creating volume... "
|
240
|
-
disk.create
|
241
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
242
|
-
disk.available?
|
243
|
-
}
|
244
|
-
end
|
245
|
-
|
246
|
-
unless disk.attached?
|
247
|
-
msg = "Attaching #{disk.awsid} to #{@machine.awsid}... "
|
248
|
-
disk.attach(@machine.awsid)
|
249
|
-
Rudy::Utils.waiter(2, 10, STDOUT, msg) {
|
250
|
-
disk.attached?
|
251
|
-
}
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def detach(disks, destroy=false)
|
257
|
-
rdisk = Rudy::Disks.new
|
258
|
-
disks.each_pair do |path, props|
|
259
|
-
adisk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
260
|
-
disk = rdisk.get adisk.name
|
261
|
-
|
262
|
-
if disk == nil
|
263
|
-
puts "Not found: #{adisk.name}".color(:red)
|
264
|
-
return
|
265
|
-
end
|
266
|
-
|
267
|
-
if disk.attached?
|
268
|
-
msg = "Detaching #{disk.awsid}..."
|
269
|
-
disk.detach
|
270
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
271
|
-
disk.available?
|
272
|
-
}
|
273
|
-
end
|
274
|
-
|
275
|
-
if destroy
|
276
|
-
puts "Destroying volume and metadata... "
|
277
|
-
disk.destroy
|
278
|
-
end
|
279
|
-
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
def mount(disks)
|
284
|
-
rdisk = Rudy::Disks.new
|
285
|
-
disks.each_pair do |path, props|
|
286
|
-
adisk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
287
|
-
disk = rdisk.get(adisk.name)
|
288
|
-
if disk == nil
|
289
|
-
puts "Not found: #{adisk.name}".color(:red)
|
290
|
-
return
|
291
|
-
end
|
292
|
-
|
293
|
-
unless disk.attached?
|
294
|
-
msg = "Attaching #{disk.awsid} to #{@machine.awsid}... "
|
295
|
-
disk.attach(@machine.awsid)
|
296
|
-
Rudy::Utils.waiter(2, 10, STDOUT, msg) {
|
297
|
-
disk.attached?
|
298
|
-
}
|
299
|
-
|
300
|
-
sleep 2
|
301
|
-
end
|
302
|
-
|
303
|
-
begin
|
304
|
-
@rbox.mkdir(:p, disk.path)
|
305
|
-
|
306
|
-
print "Mounting at #{disk.path}... "
|
307
|
-
|
308
|
-
ret = @rbox.mount(:t, disk.fstype, disk.device, disk.path)
|
309
|
-
print_response ret
|
310
|
-
if ret.exit_code > 0
|
311
|
-
STDERR.puts "Error creating disk".color(:red)
|
312
|
-
return
|
313
|
-
else
|
314
|
-
puts "done"
|
315
|
-
end
|
316
|
-
disk.mounted = true
|
317
|
-
disk.save
|
318
|
-
|
319
|
-
rescue Net::SSH::AuthenticationFailed, Net::SSH::HostKeyMismatch => ex
|
320
|
-
STDERR.puts "Error creating disk".color(:red)
|
321
|
-
STDERR.puts ex.message.color(:red)
|
322
|
-
rescue Rye::CommandNotFound => ex
|
323
|
-
puts " CommandNotFound: #{ex.message}".color(:red)
|
324
|
-
|
325
|
-
rescue
|
326
|
-
STDERR.puts "Error creating disk" .color(:red)
|
327
|
-
Rudy::Utils.bug
|
328
|
-
end
|
329
|
-
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
|
334
|
-
def umount(disks)
|
335
|
-
rdisk = Rudy::Disks.new
|
336
|
-
disks.each_pair do |path, props|
|
337
|
-
adisk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
338
|
-
disk = rdisk.get(adisk.name)
|
339
|
-
if disk == nil
|
340
|
-
puts "Not found: #{adisk.name}".color(:red)
|
341
|
-
return
|
342
|
-
end
|
343
|
-
|
344
|
-
if disk.mounted?
|
345
|
-
print "Unmounting #{disk.path}..."
|
346
|
-
trap_rbox_errors { @rbox.umount(disk.path) }
|
347
|
-
puts " done"
|
348
|
-
sleep 0.5
|
349
|
-
end
|
350
|
-
|
351
|
-
sleep 2
|
352
|
-
|
353
|
-
if disk.attached?
|
354
|
-
msg = "Detaching #{disk.awsid}..."
|
355
|
-
disk.detach
|
356
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
357
|
-
disk.available?
|
358
|
-
}
|
359
|
-
sleep 0.5
|
360
|
-
end
|
361
|
-
|
362
|
-
|
363
|
-
end
|
364
|
-
end
|
365
|
-
alias_method :unmount, :umount
|
366
|
-
|
367
|
-
def destroy(disks)
|
368
|
-
rdisk = Rudy::Disks.new
|
369
|
-
|
370
|
-
disks.each_pair do |path, props|
|
371
|
-
adisk = Rudy::MetaData::Disk.new(path, props[:size], props[:device], @machine.position)
|
372
|
-
disk = rdisk.get(adisk.name)
|
373
|
-
if disk == nil
|
374
|
-
puts "Not found: #{adisk.name}".color(:red)
|
375
|
-
return
|
376
|
-
end
|
377
|
-
|
378
|
-
puts "Destroying #{disk.name}"
|
379
|
-
|
380
|
-
if disk.mounted?
|
381
|
-
print "Unmounting #{disk.path}..."
|
382
|
-
trap_rbox_errors { @rbox.umount(disk.path) }
|
383
|
-
puts " done"
|
384
|
-
sleep 0.5
|
385
|
-
end
|
386
|
-
|
387
|
-
if disk.attached?
|
388
|
-
msg = "Detaching #{disk.awsid}..."
|
389
|
-
disk.detach
|
390
|
-
Rudy::Utils.waiter(2, 60, STDOUT, msg) {
|
391
|
-
disk.available?
|
392
|
-
}
|
393
|
-
sleep 0.5
|
394
|
-
end
|
395
|
-
|
396
|
-
puts "Destroying volume and metadata... "
|
397
|
-
disk.destroy
|
398
|
-
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
end
|
403
|
-
end;end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
|
3
|
-
module Rudy; module Routines;
|
4
|
-
#--
|
5
|
-
# TODO: Rename to ShellHelper
|
6
|
-
#++
|
7
|
-
module ScriptHelper
|
8
|
-
include Rudy::Routines::HelperBase # TODO: use trap_rbox_errors
|
9
|
-
extend self
|
10
|
-
|
11
|
-
@@script_types = [:after, :before, :after_local, :before_local, :script, :script_local]
|
12
|
-
|
13
|
-
|
14
|
-
# TODO: refactor using this_method
|
15
|
-
|
16
|
-
def before_local(routine, sconf, rbox, option=nil, argv=nil)
|
17
|
-
execute_command(:before_local, routine, sconf, 'localhost', rbox, option, argv)
|
18
|
-
end
|
19
|
-
def before_local?(routine)
|
20
|
-
# before_local generally doesn't take a user name like the remote
|
21
|
-
# before block so we add it here (unless the user did specify it)
|
22
|
-
routine[:before_local] = {
|
23
|
-
Rudy.sysinfo.user.to_sym => routine.delete(:before_local)
|
24
|
-
} if routine[:before_local].is_a?(Proc)
|
25
|
-
execute_command?(:before_local, routine)
|
26
|
-
end
|
27
|
-
def script_local(routine, sconf, rbox, option=nil, argv=nil)
|
28
|
-
execute_command(:script_local, routine, sconf, 'localhost', rbox, option, argv)
|
29
|
-
end
|
30
|
-
def script_local?(routine)
|
31
|
-
# before_local generally doesn't take a user name like the remote
|
32
|
-
# before block so we add it here (unless the user did specify it)
|
33
|
-
routine[:script_local] = {
|
34
|
-
Rudy.sysinfo.user.to_sym => routine.delete(:script_local)
|
35
|
-
} if routine[:script_local].is_a?(Proc)
|
36
|
-
execute_command?(:script_local, routine)
|
37
|
-
end
|
38
|
-
|
39
|
-
def after_local(routine, sconf, rbox, option=nil, argv=nil)
|
40
|
-
execute_command(:after_local, routine, sconf, 'localhost', rbox, option, argv)
|
41
|
-
end
|
42
|
-
def after_local?(routine)
|
43
|
-
routine[:after_local] = { # See before_local note
|
44
|
-
Rudy.sysinfo.user.to_sym => routine.delete(:after_local)
|
45
|
-
} if routine[:after_local].is_a?(Proc)
|
46
|
-
execute_command?(:after_local, routine)
|
47
|
-
end
|
48
|
-
|
49
|
-
def before(routine, sconf, machine, rbox, option=nil, argv=nil)
|
50
|
-
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
51
|
-
execute_command(:before, routine, sconf, machine.name, rbox, option, argv)
|
52
|
-
end
|
53
|
-
def before?(routine); execute_command?(:before, routine); end
|
54
|
-
|
55
|
-
def after(routine, sconf, machine, rbox, option=nil, argv=nil)
|
56
|
-
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
57
|
-
execute_command(:after, routine, sconf, machine.name, rbox, option, argv)
|
58
|
-
end
|
59
|
-
def after?(routine); execute_command?(:after, routine); end
|
60
|
-
|
61
|
-
def script(routine, sconf, machine, rbox, option=nil, argv=nil)
|
62
|
-
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
63
|
-
execute_command(:script, routine, sconf, machine.name, rbox, option, argv)
|
64
|
-
end
|
65
|
-
def script?(routine); execute_command?(:script, routine); end
|
66
|
-
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
# Does the routine have the requested script type?
|
71
|
-
# * +timing+ is one of: after, before, after_local, before_local
|
72
|
-
# * +routine+ a single routine hash (startup, shutdown, etc...)
|
73
|
-
# Prints notice to STDERR if there's an empty conf hash
|
74
|
-
def execute_command?(timing, routine)
|
75
|
-
hasconf = (routine.is_a?(Caesars::Hash) && routine.has_key?(timing))
|
76
|
-
return false unless hasconf
|
77
|
-
unless routine[timing].kind_of?(Hash)
|
78
|
-
STDERR.puts "No user supplied for #{timing} block".color(:red)
|
79
|
-
choice = Annoy.get_user_input('(S)kip (A)bort: ') || ''
|
80
|
-
if choice.match(/\AS/i)
|
81
|
-
return
|
82
|
-
else
|
83
|
-
exit 12
|
84
|
-
end
|
85
|
-
return false
|
86
|
-
end
|
87
|
-
routine[timing].each_pair do |user,proc|
|
88
|
-
#p [timing, user, proc].join(', ')
|
89
|
-
if proc.nil? || !proc.is_a?(Proc)
|
90
|
-
STDERR.puts "Empty #{timing} config for #{user}"
|
91
|
-
else
|
92
|
-
return true
|
93
|
-
end
|
94
|
-
end
|
95
|
-
false
|
96
|
-
end
|
97
|
-
|
98
|
-
# * +timing+ is one of: after, before, after_local, before_local
|
99
|
-
# * +routine+ a single routine hash (startup, shutdown, etc...)
|
100
|
-
# * +sconf+ is a config hash from machines config (ignored if nil)
|
101
|
-
# * +hostname+ machine hostname that we're working on
|
102
|
-
# * +rbox+ a Rye::Box instance for the machine we're working on
|
103
|
-
def execute_command(timing, routine, sconf, hostname, rbox, option=nil, argv=nil)
|
104
|
-
raise "ScriptHelper: Not a Rye::Box" unless rbox.is_a?(Rye::Box)
|
105
|
-
raise "ScriptHelper: #{timing}?" unless @@script_types.member?(timing)
|
106
|
-
|
107
|
-
# Do we need to run this again? It's called in generic_routine_runner
|
108
|
-
##if execute_command?(timing, routine) # i.e. before_local?
|
109
|
-
|
110
|
-
# We need to explicitly add the rm command for rbox so we
|
111
|
-
# can delete the script config file when we're done. This
|
112
|
-
# adds the method to this instance of rbox only.
|
113
|
-
# We give it a funny so we can delete it knowing we're not
|
114
|
-
# deleting a method added somewhere else.
|
115
|
-
def rbox.rudy_tmp_rm(*args); cmd('rm', args); end
|
116
|
-
|
117
|
-
original_user = rbox.user
|
118
|
-
user_blocks = routine[timing] || {}
|
119
|
-
users = user_blocks.keys
|
120
|
-
# Root stuff is always run first.
|
121
|
-
users.unshift(users.delete(:root)) if users.member?(:root)
|
122
|
-
users.each do |user|
|
123
|
-
proc = user_blocks[user]
|
124
|
-
|
125
|
-
begin
|
126
|
-
rbox.switch_user user # does nothing if it's the same user
|
127
|
-
rbox.connect(false) # does nothing if already connected
|
128
|
-
rescue Net::SSH::AuthenticationFailed, Net::SSH::HostKeyMismatch => ex
|
129
|
-
STDERR.puts "Error connecting: #{ex.message}".color(:red)
|
130
|
-
STDERR.puts "Skipping user #{user}".color(:red)
|
131
|
-
next
|
132
|
-
end
|
133
|
-
|
134
|
-
begin
|
135
|
-
# We define hooks so we can still print each command and its output
|
136
|
-
# when running the command blocks. NOTE: We only print this in
|
137
|
-
# verbosity mode. We intentionally set and unset the hooks
|
138
|
-
# so the other commands (config file copy) don't get printed.
|
139
|
-
if @@global.verbose > 0
|
140
|
-
# This block gets called for every command method call.
|
141
|
-
rbox.pre_command_hook do |cmd, args, user, host|
|
142
|
-
puts command_separator(rbox.preview_command(cmd, args), user, host)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
if @@global.verbose > 1
|
146
|
-
# And this one gets called after each command method call.
|
147
|
-
rbox.post_command_hook do |ret|
|
148
|
-
puts ' ' << ret.stdout.join("#{$/} ") if !ret.stdout.empty?
|
149
|
-
print_response(ret)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
### EXECUTE THE COMMANDS BLOCK
|
154
|
-
rbox.batch(option, argv, &proc)
|
155
|
-
|
156
|
-
rescue Rye::CommandError => ex
|
157
|
-
print_response(ex)
|
158
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
159
|
-
if choice.match(/\AS/i)
|
160
|
-
return
|
161
|
-
elsif choice.match(/\AR/i)
|
162
|
-
retry
|
163
|
-
else
|
164
|
-
exit 12
|
165
|
-
end
|
166
|
-
rescue Rye::CommandNotFound => ex
|
167
|
-
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
168
|
-
STDERR.puts ex.backtrace if Rudy.debug?
|
169
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
170
|
-
if choice.match(/\AS/i)
|
171
|
-
return
|
172
|
-
elsif choice.match(/\AR/i)
|
173
|
-
retry
|
174
|
-
else
|
175
|
-
exit 12
|
176
|
-
end
|
177
|
-
ensure
|
178
|
-
rbox.pre_command_hook = nil
|
179
|
-
rbox.post_command_hook = nil
|
180
|
-
rbox.enable_safe_mode # In case it was disabled
|
181
|
-
end
|
182
|
-
|
183
|
-
rbox.cd # reset to home dir
|
184
|
-
end
|
185
|
-
|
186
|
-
# Return the borrowed rbox instance to the user it was provided with
|
187
|
-
rbox.switch_user original_user
|
188
|
-
|
189
|
-
##else
|
190
|
-
## puts "Nothing to do"
|
191
|
-
##end
|
192
|
-
|
193
|
-
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
end;end
|