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