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 +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
data/lib/rudy/metadata/backup.rb
CHANGED
@@ -1,113 +1,158 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module Rudy
|
5
|
+
class Backup < Storable
|
6
|
+
include Rudy::Metadata
|
7
|
+
include Gibbler::Complex
|
4
8
|
|
5
9
|
field :rtype
|
6
|
-
field :
|
10
|
+
field :snapid
|
11
|
+
field :volid
|
7
12
|
|
8
|
-
field :region
|
9
|
-
field :zone
|
10
|
-
field :environment
|
11
|
-
field :role
|
12
|
-
field :position
|
13
13
|
field :path
|
14
14
|
|
15
|
-
field :
|
16
|
-
field :
|
15
|
+
field :created => Time
|
16
|
+
field :year
|
17
|
+
field :month
|
18
|
+
field :day
|
19
|
+
field :hour
|
20
|
+
field :minute
|
17
21
|
field :second
|
18
22
|
|
19
|
-
field :
|
20
|
-
|
23
|
+
field :user
|
21
24
|
field :size
|
22
25
|
field :fstype
|
23
|
-
field :volume
|
24
|
-
|
25
|
-
require 'date'
|
26
|
-
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
# If one argument is supplied:
|
28
|
+
# * +path+ is a an absolute filesystem path
|
29
|
+
# * +opts+ is a hash of disk options.
|
30
|
+
#
|
31
|
+
# If two arguments are supplied:
|
32
|
+
# * +position+
|
33
|
+
# * +path+ is a an absolute filesystem path
|
34
|
+
# * +opts+ is a hash of disk options.
|
35
|
+
#
|
36
|
+
# Valid options are:
|
37
|
+
# * +:path+ is a an absolute filesystem path (overridden by +path+ arg)
|
38
|
+
# * +:position+ (overridden by +position+ arg)
|
39
|
+
# * +:created+ is an instance of Time
|
40
|
+
# * +:user+ is the name of the user which created the backup.
|
41
|
+
#
|
42
|
+
def initialize(position=nil, path=nil, opts={})
|
43
|
+
# Swap arg values if only one is supplied.
|
44
|
+
path, position = position, nil if !position.nil? && path.nil?
|
45
|
+
position ||= '01'
|
46
|
+
|
47
|
+
opts = {
|
48
|
+
:created => Time.now.utc,
|
49
|
+
:user => Rudy.sysinfo.user
|
50
|
+
}.merge opts
|
38
51
|
|
52
|
+
super Rudy::Backups::RTYPE, opts # Rudy::Metadata#initialize
|
39
53
|
|
40
|
-
|
41
|
-
datetime = Backup.format_timestamp(now).split(Rudy::DELIM)
|
42
|
-
@created = now.to_i
|
43
|
-
@date, @time, @second = datetime
|
54
|
+
@position, @path = position, path
|
44
55
|
|
45
56
|
postprocess
|
57
|
+
|
46
58
|
end
|
47
59
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
60
|
+
def postprocess
|
61
|
+
@position &&= @position.to_s.rjust(2, '0')
|
62
|
+
@year = @created.year
|
63
|
+
@month = @created.month.to_s.rjust(2, '0')
|
64
|
+
@day = @created.mday.to_s.rjust(2, '0')
|
65
|
+
@hour = @created.hour.to_s.rjust(2, '0')
|
66
|
+
@minute = @created.min.to_s.rjust(2, '0')
|
67
|
+
@second = @created.sec.to_s.rjust(2, '0')
|
55
68
|
end
|
56
69
|
|
57
|
-
def
|
58
|
-
|
59
|
-
t = @date.scan(/(\d\d\d\d)(\d\d)(\d\d)/).join('-')
|
60
|
-
t << " " << @time.scan(/(\d\d)(\d\d)/).join(':')
|
61
|
-
t
|
70
|
+
def to_s(with_titles=true)
|
71
|
+
"%s; %s" % [self.name, self.to_hash.inspect]
|
62
72
|
end
|
63
73
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
74
|
+
def name
|
75
|
+
sep = File::SEPARATOR
|
76
|
+
dirs = @path.split sep if @path && !@path.empty?
|
77
|
+
unless @path == File::SEPARATOR
|
78
|
+
dirs.shift while dirs && (dirs[0].nil? || dirs[0].empty?)
|
68
79
|
end
|
69
|
-
|
70
|
-
|
80
|
+
# Calls Rudy::Metadata#name with backup specific components
|
81
|
+
super [dirs, date, time, second]
|
82
|
+
end
|
71
83
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
diskobj || disk
|
84
|
+
def date
|
85
|
+
"%s%s%s" % [@year, @month, @day]
|
86
|
+
end
|
87
|
+
|
88
|
+
def time
|
89
|
+
"%s%s" % [@hour, @minute]
|
79
90
|
end
|
80
91
|
|
81
|
-
def create
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
92
|
+
def create
|
93
|
+
raise DuplicateRecord, self.name if exists?
|
94
|
+
disk = self.disk
|
95
|
+
ld "DISK: #{disk.name}"
|
96
|
+
raise Rudy::Backups::NoDisk, disk.name unless disk.exists?
|
97
|
+
@volid ||= disk.volid
|
98
|
+
snap = Rudy::AWS::EC2::Snapshots.create(@volid)
|
99
|
+
#snap = Rudy::AWS::EC2::Snapshots.list.first # debugging
|
100
|
+
ld "SNAP: #{snap.inspect}"
|
101
|
+
@snapid, @raw = snap.awsid, true
|
102
|
+
@size, @fstype = disk.size, disk.fstype
|
103
|
+
self.save :replace
|
86
104
|
self
|
87
105
|
end
|
88
106
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
107
|
+
def restore
|
108
|
+
raise UnknownObject, self.name unless exists?
|
109
|
+
raise Rudy::Backups::NoBackup, self.name unless any?
|
110
|
+
|
93
111
|
end
|
94
112
|
|
95
|
-
|
96
|
-
|
113
|
+
# Are there any backups for the associated disk?
|
114
|
+
def any?
|
115
|
+
backups = Rudy::Backups.list self.descriptors, [:year, :month, :day, :hour, :second]
|
116
|
+
!backups.nil?
|
97
117
|
end
|
98
|
-
|
99
|
-
def
|
100
|
-
|
118
|
+
|
119
|
+
def descriptors
|
120
|
+
super :position, :path, :year, :month, :day, :hour, :second
|
101
121
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
122
|
+
|
123
|
+
def destroy
|
124
|
+
Rudy::AWS::EC2::Snapshots.destroy(@snapid) if snapshot_exists?
|
125
|
+
super()
|
126
|
+
end
|
127
|
+
|
106
128
|
def valid?
|
107
|
-
|
108
|
-
|
129
|
+
!@path.nil? && !@path.empty? && @created.is_a?(Time) && !@volid.nil?
|
130
|
+
end
|
131
|
+
|
132
|
+
def disk
|
133
|
+
opts = {
|
134
|
+
:region => @region, :zone => @zone,
|
135
|
+
:environment => @environment, :role => @role,
|
136
|
+
:size => @size, :fstype => @fstype
|
137
|
+
}
|
138
|
+
disk = Rudy::Disk.new @position, @path, opts
|
139
|
+
disk.refresh! if disk.exists?
|
140
|
+
disk.size = @size
|
141
|
+
disk.fstype = @fstype
|
142
|
+
disk
|
143
|
+
end
|
144
|
+
|
145
|
+
def disk_exists?
|
146
|
+
self.disk.exists?
|
147
|
+
end
|
148
|
+
|
149
|
+
# Create snapshot_*? methods
|
150
|
+
%w[exists? completed?].each do |state|
|
151
|
+
define_method("snapshot_#{state}") do
|
152
|
+
return false if @snapid.nil? || @snapid.empty?
|
153
|
+
Rudy::AWS::EC2::Snapshots.send(state, @snapid)
|
154
|
+
end
|
109
155
|
end
|
110
156
|
|
111
157
|
end
|
112
|
-
end
|
113
|
-
|
158
|
+
end
|
data/lib/rudy/metadata/disk.rb
CHANGED
@@ -1,177 +1,160 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy
|
4
|
+
class Disk < Storable
|
5
|
+
include Rudy::Metadata
|
6
|
+
include Gibbler::Complex
|
7
|
+
|
8
|
+
field :rtype
|
9
|
+
field :volid
|
10
|
+
field :status
|
11
|
+
field :instid
|
12
|
+
|
13
|
+
field :path
|
14
|
+
|
15
|
+
field :device
|
16
|
+
field :size
|
17
|
+
field :fstype
|
18
|
+
|
19
|
+
#field :backups => Array
|
20
|
+
|
21
|
+
# Is the associated volume formatted? One of: true, false
|
22
|
+
field :raw
|
23
|
+
field :mounted
|
24
|
+
field :created => Time
|
25
|
+
|
26
|
+
# If one argument is supplied:
|
27
|
+
# * +path+ is a an absolute filesystem path
|
28
|
+
# * +opts+ is a hash of disk options.
|
29
|
+
#
|
30
|
+
# If two arguments are supplied:
|
31
|
+
# * +position+
|
32
|
+
# * +path+ is a an absolute filesystem path
|
33
|
+
# * +opts+ is a hash of disk options.
|
34
|
+
#
|
35
|
+
# Valid options are:
|
36
|
+
# * +:path+ is a an absolute filesystem path (overridden by +path+ arg)
|
37
|
+
# * +:position+ (overridden by +position+ arg)
|
38
|
+
# * +:size+
|
39
|
+
# * +:device+
|
40
|
+
#
|
41
|
+
def initialize(position=nil, path=nil, opts={})
|
42
|
+
# Swap arg values if only one is supplied.
|
43
|
+
path, position = position, nil if !position.nil? && path.nil?
|
44
|
+
position ||= '01'
|
45
|
+
|
46
|
+
opts = {
|
47
|
+
:size => 1,
|
48
|
+
:device => '/dev/sdh'
|
49
|
+
}.merge opts
|
50
|
+
|
51
|
+
super Rudy::Disks::RTYPE, opts # Rudy::Metadata#initialize
|
52
|
+
|
53
|
+
@position, @path = position, path
|
54
|
+
|
55
|
+
# Defaults:
|
56
|
+
#datetime = Backup.format_timestamp(now).split(Rudy::DELIM)
|
57
|
+
@created = Time.now.utc
|
58
|
+
@mounted = false
|
59
|
+
postprocess
|
60
|
+
|
60
61
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
val = self.send(key)
|
69
|
-
lines << sprintf(" %22s: %s", key, (val.is_a?(Array) ? val.join(', ') : val))
|
62
|
+
|
63
|
+
# sdb values are stored as strings. Some quick conversion.
|
64
|
+
def postprocess
|
65
|
+
@position &&= @position.to_s.rjust(2, '0')
|
66
|
+
@size &&= @size.to_i
|
67
|
+
@raw = true if @raw == "true" unless @raw.is_a?(TrueClass)
|
68
|
+
@mounted = (@mounted == "true") unless @mounted.is_a?(TrueClass)
|
70
69
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
def create(size=nil, zone=nil, snapshot=nil)
|
82
|
-
raise "#{name} already exists" if exists?
|
83
|
-
vol = @rvol.create(size || @size, zone || @zone, snapshot)
|
84
|
-
@awsid = vol.awsid
|
85
|
-
@raw = true
|
86
|
-
self.save
|
87
|
-
self
|
88
|
-
end
|
89
|
-
|
90
|
-
def backup
|
91
|
-
raise "No volume to backup" unless @awsid
|
92
|
-
bup = Rudy::MetaData::Backup.new(@awsid, @path, @position)
|
93
|
-
bup.size = @size || 1
|
94
|
-
bup.fstype = @fstype || 'ext3'
|
95
|
-
bup.create
|
96
|
-
end
|
97
|
-
|
98
|
-
def list_backups
|
99
|
-
rback = Rudy::Backups.new
|
100
|
-
props = {
|
101
|
-
:environment => @environment,
|
102
|
-
:role => @role,
|
103
|
-
:zone => @zone,
|
104
|
-
:region => @region,
|
105
|
-
:position => @position
|
106
|
-
}
|
107
|
-
rback.list([], [], props)
|
108
|
-
end
|
109
|
-
|
110
|
-
def attach(instid)
|
111
|
-
raise "No volume id" unless exists?
|
112
|
-
vol = @rvol.attach(@awsid, instid, @device)
|
113
|
-
end
|
114
|
-
|
115
|
-
def detach
|
116
|
-
raise "No volume id" unless exists?
|
117
|
-
vol = @rvol.detach(@awsid)
|
118
|
-
end
|
119
|
-
|
120
|
-
def destroy(force=false)
|
121
|
-
if @awsid && !deleting?
|
122
|
-
if !force
|
123
|
-
raise Rudy::AWS::EC2::VolumeNotAvailable, @awsid if attached?
|
124
|
-
else
|
125
|
-
detach if exists? && attached?
|
126
|
-
sleep 0.1
|
70
|
+
|
71
|
+
def to_s(with_titles=true)
|
72
|
+
self.name
|
73
|
+
end
|
74
|
+
|
75
|
+
def name
|
76
|
+
sep = File::SEPARATOR
|
77
|
+
dirs = @path.split sep if @path && !@path.empty?
|
78
|
+
unless @path == File::SEPARATOR
|
79
|
+
dirs.shift while dirs && (dirs[0].nil? || dirs[0].empty?)
|
127
80
|
end
|
128
|
-
|
129
|
-
|
81
|
+
# Calls Rudy::Metadata#name with disk specific components
|
82
|
+
super *dirs
|
130
83
|
end
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
@instid = @volume.instid
|
140
|
-
save
|
141
|
-
else
|
142
|
-
@awsid, @status, @instid = nil, nil, nil
|
143
|
-
@mounted = false # I don't like having to set this
|
144
|
-
# Don't save it b/c it's possible the EC2 server is just down
|
84
|
+
|
85
|
+
def create(size=nil, zone=nil, snapshot=nil)
|
86
|
+
raise DuplicateRecord, self.name if exists?
|
87
|
+
vol = Rudy::AWS::EC2::Volumes.create(size || @size, zone || @zone, snapshot)
|
88
|
+
#vol = Rudy::AWS::EC2::Volumes.list(:available).first # debugging
|
89
|
+
@volid, @raw = vol.awsid, true
|
90
|
+
self.save :replace
|
91
|
+
self
|
145
92
|
end
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
93
|
+
|
94
|
+
def archive
|
95
|
+
raise Rudy::AWS::EC2::VolumeNotAvailable, @volid unless volume_attached?
|
96
|
+
back = Rudy::Backup.new @position, @path, self.descriptors
|
97
|
+
back.create
|
98
|
+
back.size, back.fstype = @size, @fstype
|
99
|
+
back.save :replace
|
100
|
+
back
|
101
|
+
end
|
102
|
+
|
103
|
+
def backups
|
104
|
+
Rudy::Backups.list self.descriptors
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def destroy(force=false)
|
109
|
+
if @volid && !volume_deleting?
|
110
|
+
if !force
|
111
|
+
raise Rudy::AWS::EC2::VolumeNotAvailable, @volid if volume_attached?
|
112
|
+
else
|
113
|
+
volume_detach if volume_exists? && volume_attached?
|
114
|
+
sleep 0.1
|
115
|
+
end
|
116
|
+
raise Rudy::AWS::EC2::VolumeNotAvailable, @volid if volume_in_use?
|
117
|
+
Rudy::AWS::EC2::Volumes.destroy(@volid) if volume_exists? && volume_available?
|
118
|
+
end
|
119
|
+
super() # quotes, otherwise Ruby will send this method's args
|
120
|
+
end
|
121
|
+
|
122
|
+
def descriptors
|
123
|
+
super :position, :path
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
def valid?
|
129
|
+
!@path.nil? && !@path.empty?
|
173
130
|
end
|
131
|
+
|
132
|
+
|
133
|
+
def volume_attach(instid)
|
134
|
+
raise Rudy::Error, "No volume id" unless volume_exists?
|
135
|
+
vol = Rudy::AWS::EC2::Volumes.attach(@volid, instid, @device)
|
136
|
+
end
|
137
|
+
|
138
|
+
def volume_detach
|
139
|
+
raise Rudy::Error, "No volume id" unless volume_exists?
|
140
|
+
vol = Rudy::AWS::EC2::Volumes.detach(@volid)
|
141
|
+
end
|
142
|
+
|
143
|
+
def raw?
|
144
|
+
@raw == true
|
145
|
+
end
|
146
|
+
|
147
|
+
def mounted?
|
148
|
+
@mounted == true
|
149
|
+
end
|
150
|
+
|
151
|
+
# Create volume_*? methods
|
152
|
+
%w[exists? deleting? available? attached? in_use?].each do |state|
|
153
|
+
define_method("volume_#{state}") do
|
154
|
+
return false if @volid.nil? || @volid.empty?
|
155
|
+
Rudy::AWS::EC2::Volumes.send(state, @volid) rescue false # deleting?, available?, etc...
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
174
159
|
end
|
175
|
-
|
176
|
-
end
|
177
|
-
end
|
160
|
+
end
|