solutious-rudy 0.8.5 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +55 -14
- data/README.rdoc +26 -34
- data/Rudyfile +27 -32
- data/bin/rudy +47 -27
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +49 -89
- data/lib/rudy/aws.rb +2 -43
- 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 +15 -16
- 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 +37 -24
- 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 +32 -7
- 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 +98 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +7 -4
- data/lib/rudy/cli/disks.rb +6 -8
- data/lib/rudy/cli/execbase.rb +53 -0
- data/lib/rudy/cli/machines.rb +14 -18
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/routines.rb +31 -5
- data/lib/rudy/config.rb +17 -22
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +95 -0
- data/lib/rudy/global.rb +46 -23
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +66 -57
- 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 +152 -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 +226 -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 +239 -0
- data/lib/rudy/routines/handlers/group.rb +42 -0
- data/lib/rudy/routines/handlers/host.rb +72 -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 +41 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +82 -51
- data/lib/rudy/routines/shutdown.rb +61 -14
- data/lib/rudy/routines/startup.rb +111 -17
- data/lib/rudy/utils.rb +12 -59
- data/rudy.gemspec +85 -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/failer +6 -0
- data/tryouts/misc/console_tryout.rb +91 -0
- data/tryouts/misc/disks_tryout.rb +48 -0
- data/tryouts/misc/drydock_tryout.rb +48 -0
- data/tryouts/misc/nested_methods.rb +103 -0
- data/tryouts/misc/session_tryout.rb +46 -0
- data/tryouts/misc/tryouts.rb +33 -0
- data/tryouts/misc/usage_tryout.rb +23 -0
- metadata +119 -31
- 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,67 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy
|
4
|
-
class Backups
|
5
|
-
include Rudy::MetaData
|
6
|
-
|
7
|
-
def init
|
8
|
-
now = Time.now.utc
|
9
|
-
datetime = Rudy::MetaData::Backup.format_timestamp(now).split(Rudy::DELIM)
|
10
|
-
@created = now.to_i
|
11
|
-
@date, @time, @second = datetime
|
12
|
-
end
|
13
|
-
|
14
|
-
#def create(&each_mach)
|
15
|
-
|
16
|
-
#end
|
17
|
-
|
18
|
-
|
19
|
-
def destroy(&each_mach)
|
20
|
-
list do |backup|
|
21
|
-
puts "Destroying #{backup.name}"
|
22
|
-
backup.destroy
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def list(more=[], less=[], local={}, &each_backup)
|
27
|
-
backups = list_as_hash(more, less, local, &each_backup)
|
28
|
-
backups &&= backups.values
|
29
|
-
backups
|
30
|
-
end
|
31
|
-
|
32
|
-
def list_as_hash(more=[], less=[], local={}, &each_backup)
|
33
|
-
more ||= []
|
34
|
-
more += [:rtype, 'back']
|
35
|
-
query = to_select(more, less, local)
|
36
|
-
list = @sdb.select(query) || {}
|
37
|
-
backups = {}
|
38
|
-
list.each_pair do |n,d|
|
39
|
-
backups[n] = Rudy::MetaData::Backup.from_hash(d)
|
40
|
-
end
|
41
|
-
backups.each_pair { |n,backup| each_backup.call(backup) } if each_backup
|
42
|
-
backups = nil if backups.empty?
|
43
|
-
backups
|
44
|
-
end
|
45
|
-
|
46
|
-
def get(rname=nil)
|
47
|
-
dhash = @sdb.get(Rudy::DOMAIN, rname)
|
48
|
-
return nil if dhash.nil? || dhash.empty?
|
49
|
-
d = Rudy::MetaData::Backup.from_hash(dhash)
|
50
|
-
d.update if d
|
51
|
-
d
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
def running?
|
56
|
-
!list.nil?
|
57
|
-
# TODO: add logic that checks whether the instances are running.
|
58
|
-
end
|
59
|
-
|
60
|
-
def to_select(*args)
|
61
|
-
query = super(*args)
|
62
|
-
query << " and created != '0' order by created desc"
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
data/lib/rudy/metadata/debug.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy; module MetaData
|
4
|
-
class Debug
|
5
|
-
include Rudy::MetaData
|
6
|
-
|
7
|
-
def init
|
8
|
-
end
|
9
|
-
|
10
|
-
def list(more=[], less=[], local={}, &block)
|
11
|
-
objects = list_as_hash(more, less, local, &block)
|
12
|
-
objects &&= objects.values
|
13
|
-
objects
|
14
|
-
end
|
15
|
-
|
16
|
-
def list_as_hash(more=[], less=[], local={}, &block)
|
17
|
-
query = to_select(more, less, local)
|
18
|
-
list = @sdb.select(query) || {}
|
19
|
-
objects = {}
|
20
|
-
list.each_pair do |n,d|
|
21
|
-
objects[n] = d
|
22
|
-
end
|
23
|
-
objects.each_pair { |n,obj| block.call(obj) } if block
|
24
|
-
objects = nil if objects.empty?
|
25
|
-
objects
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
def to_select(more, less, local)
|
30
|
-
query = super(more, less, local)
|
31
|
-
# query << " order by created desc"
|
32
|
-
puts query if @@global.verbose > 0
|
33
|
-
query
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end; end
|
38
|
-
|
data/lib/rudy/metadata/disks.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy
|
4
|
-
class Disks
|
5
|
-
include Rudy::MetaData
|
6
|
-
|
7
|
-
|
8
|
-
def init
|
9
|
-
@rback = Rudy::Backups.new
|
10
|
-
end
|
11
|
-
|
12
|
-
#def create(&each_mach)
|
13
|
-
|
14
|
-
#end
|
15
|
-
|
16
|
-
|
17
|
-
def destroy(&each_mach)
|
18
|
-
#raise MachineGroupNotRunning, current_machine_group unless running?
|
19
|
-
#raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
20
|
-
list do |disk|
|
21
|
-
puts "Destroying #{disk.name}"
|
22
|
-
disk.destroy
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def backups
|
27
|
-
@rback.list()
|
28
|
-
end
|
29
|
-
|
30
|
-
def list(more=[], less=[], &each_disk)
|
31
|
-
disks = list_as_hash(&each_disk)
|
32
|
-
disks &&= disks.values
|
33
|
-
disks
|
34
|
-
end
|
35
|
-
|
36
|
-
def list_as_hash(more=[], less=[], &each_disk)
|
37
|
-
query = to_select([:rtype, 'disk'], less)
|
38
|
-
list = @sdb.select(query) || {}
|
39
|
-
disks = {}
|
40
|
-
list.each_pair do |n,d|
|
41
|
-
disks[n] = Rudy::MetaData::Disk.from_hash(d)
|
42
|
-
end
|
43
|
-
disks.each_pair { |n,disk| each_disk.call(disk) } if each_disk
|
44
|
-
disks = nil if disks.empty?
|
45
|
-
disks
|
46
|
-
end
|
47
|
-
|
48
|
-
def get(rname=nil)
|
49
|
-
dhash = @sdb.get(Rudy::DOMAIN, rname)
|
50
|
-
return nil if dhash.nil? || dhash.empty?
|
51
|
-
d = Rudy::MetaData::Disk.from_hash(dhash)
|
52
|
-
d.update if d
|
53
|
-
d
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
def running?
|
58
|
-
!list.nil?
|
59
|
-
# TODO: add logic that checks whether the instances are running.
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
@@ -1,108 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy
|
4
|
-
module MetaData
|
5
|
-
module ObjectBase
|
6
|
-
include Rudy::Huxtable
|
7
|
-
|
8
|
-
attr_accessor :sdb_domain
|
9
|
-
|
10
|
-
def initialize(*args)
|
11
|
-
a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
|
12
|
-
@sdb = Rudy::AWS::SDB.new(a, s, r)
|
13
|
-
@ec2inst = Rudy::AWS::EC2::Instances.new(a, s, r)
|
14
|
-
@rvol = Rudy::AWS::EC2::Volumes.new(a, s, r)
|
15
|
-
@radd = Rudy::AWS::EC2::Addresses.new(a, s, r)
|
16
|
-
@rsnap = Rudy::AWS::EC2::Snapshots.new(a, s, r)
|
17
|
-
@sdb_domain = Rudy::DOMAIN
|
18
|
-
init(*args)
|
19
|
-
end
|
20
|
-
|
21
|
-
def init(*args); raise "Must override init"; end
|
22
|
-
|
23
|
-
def valid?; raise "#{self.class} must override 'valid?'"; end
|
24
|
-
|
25
|
-
def to_query(more=[], less=[])
|
26
|
-
Rudy::AWS::SDB.generate_query build_criteria(more, less)
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_select(more=[], less=[])
|
30
|
-
s = Rudy::AWS::SDB.generate_select ['*'], @sdb_domain, build_criteria(more, less)
|
31
|
-
s
|
32
|
-
end
|
33
|
-
|
34
|
-
def name(identifier, zon, env, rol, pos, *other)
|
35
|
-
pos = pos.to_s.rjust 2, '0'
|
36
|
-
[identifier, zon, env, rol, pos, *other].flatten.compact.join(Rudy::DELIM)
|
37
|
-
end
|
38
|
-
|
39
|
-
def save(replace=true)
|
40
|
-
replace = true if replace.nil?
|
41
|
-
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
42
|
-
@sdb.put(@sdb_domain, name, self.to_hash, replace) # Always returns nil
|
43
|
-
true
|
44
|
-
end
|
45
|
-
|
46
|
-
def destroy
|
47
|
-
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
48
|
-
@sdb.destroy(@sdb_domain, name)
|
49
|
-
true
|
50
|
-
end
|
51
|
-
|
52
|
-
def refresh
|
53
|
-
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
54
|
-
h = @sdb.get(@sdb_domain, name) || {}
|
55
|
-
from_hash(h)
|
56
|
-
end
|
57
|
-
|
58
|
-
def ==(other)
|
59
|
-
return false unless other.is_a?(self.class)
|
60
|
-
self.name == other.name
|
61
|
-
end
|
62
|
-
|
63
|
-
# A generic default
|
64
|
-
def to_s
|
65
|
-
str = ""
|
66
|
-
field_names.each do |key|
|
67
|
-
str << sprintf(" %22s: %s#{$/}", key, self.send(key.to_sym))
|
68
|
-
end
|
69
|
-
str
|
70
|
-
end
|
71
|
-
|
72
|
-
def liner_note
|
73
|
-
info = @awsid && !@awsid.empty? ? @awsid : "[no aws object]"
|
74
|
-
"%s %s" % [self.name.bright, info]
|
75
|
-
end
|
76
|
-
|
77
|
-
def inspect
|
78
|
-
lines = []
|
79
|
-
lines << liner_note
|
80
|
-
field_names.each do |key|
|
81
|
-
next unless self.respond_to?(key)
|
82
|
-
val = self.send(key)
|
83
|
-
lines << sprintf(" %22s: %s", key, (val.is_a?(Array) ? val.join(', ') : val))
|
84
|
-
end
|
85
|
-
lines.join($/)
|
86
|
-
end
|
87
|
-
|
88
|
-
protected
|
89
|
-
|
90
|
-
# Builds a zipped Array from a list of criteria.
|
91
|
-
# The list of criteria is made up of metadata object attributes.
|
92
|
-
# The list is constructed by taking the adding +more+, and
|
93
|
-
# subtracting +less+ from <tt>:rtype, :region, :zone, :environment, :role, :position</tt>
|
94
|
-
#
|
95
|
-
# Returns [[:rtype, value], [:zone, value], ...]
|
96
|
-
def build_criteria(more=[], less=[])
|
97
|
-
criteria = [:rtype, :region, :zone, :environment, :role, :position, *more].compact
|
98
|
-
criteria -= [*less].flatten.uniq.compact
|
99
|
-
values = criteria.collect do |n|
|
100
|
-
self.send(n.to_sym)
|
101
|
-
end
|
102
|
-
criteria.zip(values)
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
data/lib/rudy/routines/helper.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Rudy
|
4
|
-
module Routines
|
5
|
-
module HelperBase
|
6
|
-
include Rudy::Huxtable
|
7
|
-
|
8
|
-
def trap_rbox_errors(ret=nil, &command)
|
9
|
-
begin
|
10
|
-
ret = command.call if command
|
11
|
-
return unless ret.is_a?(Rye::Rap)
|
12
|
-
puts ' ' << ret.stdout.join("#{$/} ") if !ret.stdout.empty?
|
13
|
-
print_response(ret)
|
14
|
-
rescue IOError => ex
|
15
|
-
STDERR.puts " Connection Error (#{ex.message})".color(:red)
|
16
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
17
|
-
if choice.match(/\AS/i)
|
18
|
-
return
|
19
|
-
elsif choice.match(/\AR/i)
|
20
|
-
retry
|
21
|
-
else
|
22
|
-
exit 12
|
23
|
-
end
|
24
|
-
rescue Rye::CommandError => ex
|
25
|
-
print_response(ex)
|
26
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
27
|
-
if choice.match(/\AS/i)
|
28
|
-
return
|
29
|
-
elsif choice.match(/\AR/i)
|
30
|
-
retry
|
31
|
-
else
|
32
|
-
exit 12
|
33
|
-
end
|
34
|
-
rescue Rye::CommandNotFound => ex
|
35
|
-
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
36
|
-
STDERR.puts ex.backtrace if Rudy.debug?
|
37
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
38
|
-
if choice.match(/\AS/i)
|
39
|
-
return
|
40
|
-
elsif choice.match(/\AR/i)
|
41
|
-
retry
|
42
|
-
else
|
43
|
-
exit 12
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
ret
|
48
|
-
end
|
49
|
-
|
50
|
-
def keep_going?
|
51
|
-
Annoy.pose_question(" Keep going?\a ", /yes|y|ya|sure|you bet!/i, STDERR)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Returns a formatted string for printing command info
|
55
|
-
def command_separator(cmd, user, host)
|
56
|
-
cmd ||= ""
|
57
|
-
cmd, user = cmd.to_s, user.to_s
|
58
|
-
prompt = user == "root" ? "#" : "$"
|
59
|
-
("%s@%s%s %s" % [user, host, prompt, cmd.bright])
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
def print_response(rap)
|
64
|
-
colour = rap.exit_code != 0 ? :red : :normal
|
65
|
-
[:stderr].each do |sumpin|
|
66
|
-
next if rap.send(sumpin).empty?
|
67
|
-
STDERR.puts
|
68
|
-
STDERR.puts((" #{sumpin.to_s.upcase} " << '-'*38).color(colour).bright)
|
69
|
-
STDERR.puts " " << rap.send(sumpin).join("#{$/} ").color(colour)
|
70
|
-
end
|
71
|
-
STDERR.puts " Exit code: #{rap.exit_code}".color(colour) if rap.exit_code != 0
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -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
|