solutious-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 +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
|