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
data/lib/rudy/aws/ec2/address.rb
CHANGED
@@ -22,13 +22,12 @@ module Rudy::AWS
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
include Rudy::AWS::
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
module Addresses
|
26
|
+
include Rudy::AWS::EC2 # important! include,
|
27
|
+
extend self # then extend
|
28
|
+
|
30
29
|
def create
|
31
|
-
ret =
|
30
|
+
ret = @@ec2.allocate_address
|
32
31
|
return false unless ret && ret['publicIp']
|
33
32
|
address = Rudy::AWS::EC2::Address.new
|
34
33
|
address.ipaddress = ret['publicIp']
|
@@ -42,7 +41,7 @@ module Rudy::AWS
|
|
42
41
|
opts ={
|
43
42
|
:public_ip => address || raise("No public IP address supplied")
|
44
43
|
}
|
45
|
-
ret =
|
44
|
+
ret = @@ec2.release_address(opts)
|
46
45
|
(ret && ret['return'] == 'true')
|
47
46
|
end
|
48
47
|
|
@@ -61,7 +60,7 @@ module Rudy::AWS
|
|
61
60
|
:instance_id => instance,
|
62
61
|
:public_ip => address
|
63
62
|
}
|
64
|
-
ret =
|
63
|
+
ret = @@ec2.associate_address(opts)
|
65
64
|
(ret && ret['return'] == 'true')
|
66
65
|
end
|
67
66
|
|
@@ -76,7 +75,7 @@ module Rudy::AWS
|
|
76
75
|
opts ={
|
77
76
|
:public_ip => address
|
78
77
|
}
|
79
|
-
ret =
|
78
|
+
ret = @@ec2.disassociate_address(opts)
|
80
79
|
(ret && ret['return'] == 'true')
|
81
80
|
end
|
82
81
|
|
@@ -93,7 +92,7 @@ module Rudy::AWS
|
|
93
92
|
def list_as_hash(addresses=[])
|
94
93
|
addresses ||= []
|
95
94
|
addresses = [addresses].flatten.compact
|
96
|
-
alist =
|
95
|
+
alist = @@ec2.describe_addresses(:addresses=> addresses)
|
97
96
|
|
98
97
|
return nil unless alist['addressesSet'].is_a?(Hash)
|
99
98
|
|
@@ -102,7 +101,7 @@ module Rudy::AWS
|
|
102
101
|
address = Addresses.from_hash(address)
|
103
102
|
addresses[address.ipaddress] = address
|
104
103
|
end
|
105
|
-
|
104
|
+
addresses = nil if addresses.empty?
|
106
105
|
addresses
|
107
106
|
end
|
108
107
|
|
data/lib/rudy/aws/ec2/group.rb
CHANGED
@@ -42,7 +42,7 @@ module Rudy::AWS
|
|
42
42
|
lines.join($/)
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def pretty
|
46
46
|
lines = [@name.bright]
|
47
47
|
field_names.each do |key|
|
48
48
|
next unless self.respond_to?(key)
|
@@ -84,15 +84,15 @@ module Rudy::AWS
|
|
84
84
|
|
85
85
|
|
86
86
|
module EC2
|
87
|
-
|
88
|
-
include Rudy::AWS::
|
89
|
-
|
87
|
+
module Groups
|
88
|
+
include Rudy::AWS::EC2 # important! include,
|
89
|
+
extend self # then extend
|
90
90
|
|
91
91
|
# Create a new EC2 security group
|
92
92
|
# Returns list of created groups
|
93
93
|
def create(name, desc=nil, addresses=[], ports=[], protocols=[], &each_group)
|
94
94
|
desc ||= "Security Group #{name}"
|
95
|
-
ret =
|
95
|
+
ret = @@ec2.create_security_group(:group_name => name, :group_description => desc)
|
96
96
|
return false unless (ret && ret['return'] == 'true')
|
97
97
|
authorize(name, addresses, ports, protocols)
|
98
98
|
get(name, &each_group)
|
@@ -102,7 +102,7 @@ module Rudy::AWS
|
|
102
102
|
# Returns true/false whether successful
|
103
103
|
def destroy(name, &each_group)
|
104
104
|
list(name, &each_group) if each_group
|
105
|
-
ret =
|
105
|
+
ret = @@ec2.delete_security_group(:group_name => name)
|
106
106
|
(ret && ret['return'] == 'true')
|
107
107
|
end
|
108
108
|
|
@@ -140,7 +140,7 @@ module Rudy::AWS
|
|
140
140
|
# Returns an Array of Rudy::AWS::EC2::Group objects
|
141
141
|
def list_as_hash(group_names=[], &each_group)
|
142
142
|
group_names = [group_names].flatten.compact
|
143
|
-
glist =
|
143
|
+
glist = @@ec2.describe_security_groups(:group_name => group_names) || {}
|
144
144
|
return unless glist['securityGroupInfo'].is_a?(Hash)
|
145
145
|
groups = {}
|
146
146
|
glist['securityGroupInfo']['item'].each do |oldg|
|
@@ -148,6 +148,7 @@ module Rudy::AWS
|
|
148
148
|
groups[g.name] = g
|
149
149
|
end
|
150
150
|
groups.each_value { |g| each_group.call(g) } if each_group
|
151
|
+
groups = nil if groups.empty?
|
151
152
|
groups
|
152
153
|
end
|
153
154
|
|
@@ -274,7 +275,7 @@ module Rudy::AWS
|
|
274
275
|
:to_port => to_port,
|
275
276
|
:cidr_ip => ipa
|
276
277
|
}
|
277
|
-
ret =
|
278
|
+
ret = @@ec2.send("#{meth}_security_group_ingress", opts)
|
278
279
|
(ret && ret['return'] == 'true')
|
279
280
|
end
|
280
281
|
|
@@ -289,7 +290,7 @@ module Rudy::AWS
|
|
289
290
|
:source_security_group_name => gname,
|
290
291
|
:source_security_group_owner_id => gowner
|
291
292
|
}
|
292
|
-
ret =
|
293
|
+
ret = @@ec2.send("#{meth}_security_group_ingress", opts)
|
293
294
|
(ret && ret['return'] == 'true')
|
294
295
|
end
|
295
296
|
|
data/lib/rudy/aws/ec2/image.rb
CHANGED
@@ -52,11 +52,11 @@ module Rudy::AWS
|
|
52
52
|
|
53
53
|
end
|
54
54
|
|
55
|
-
module EC2
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
module EC2
|
56
|
+
module Images
|
57
|
+
include Rudy::AWS::EC2 # important! include,
|
58
|
+
extend self # then extend
|
59
|
+
|
60
60
|
|
61
61
|
def list(owner=[], image_ids=[], executable_by=[], &each_image)
|
62
62
|
images = list_as_hash(owner, image_ids, executable_by)
|
@@ -81,7 +81,7 @@ module Rudy::AWS
|
|
81
81
|
:executable_by => executable_by || []
|
82
82
|
}
|
83
83
|
|
84
|
-
response = execute_request({}) {
|
84
|
+
response = Rudy::AWS::EC2.execute_request({}) { @@ec2.describe_images(opts) }
|
85
85
|
|
86
86
|
return nil unless response['imagesSet'].is_a?(Hash) # No instances
|
87
87
|
|
@@ -105,7 +105,7 @@ module Rudy::AWS
|
|
105
105
|
opts = {
|
106
106
|
:image_id => id
|
107
107
|
}
|
108
|
-
ret =
|
108
|
+
ret = @@ec2.deregister_image(opts)
|
109
109
|
return false unless ret && ret.is_a?(Hash)
|
110
110
|
true
|
111
111
|
end
|
@@ -116,7 +116,7 @@ module Rudy::AWS
|
|
116
116
|
opts = {
|
117
117
|
:image_location => path
|
118
118
|
}
|
119
|
-
ret =
|
119
|
+
ret = @@ec2.register_image(opts)
|
120
120
|
return nil unless ret && ret.is_a?(Hash)
|
121
121
|
ret['imageId']
|
122
122
|
end
|
@@ -46,7 +46,7 @@ module Rudy::AWS
|
|
46
46
|
lines.join($/)
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
49
|
+
def pretty
|
50
50
|
lines = []
|
51
51
|
lines << liner_note
|
52
52
|
field_names.each do |key|
|
@@ -67,9 +67,9 @@ module Rudy::AWS
|
|
67
67
|
|
68
68
|
|
69
69
|
module EC2
|
70
|
-
|
71
|
-
include Rudy::AWS::
|
72
|
-
|
70
|
+
module Instances
|
71
|
+
include Rudy::AWS::EC2 # important! include,
|
72
|
+
extend self # then extend
|
73
73
|
|
74
74
|
unless defined?(KNOWN_STATES)
|
75
75
|
KNOWN_STATES = [:running, :pending, :shutting_down, :terminated, :degraded].freeze
|
@@ -81,6 +81,7 @@ module Rudy::AWS
|
|
81
81
|
#
|
82
82
|
# +opts+ supports the following parameters:
|
83
83
|
#
|
84
|
+
# * +:zone+
|
84
85
|
# * +:ami+
|
85
86
|
# * +:group+
|
86
87
|
# * +:size+
|
@@ -112,13 +113,11 @@ module Rudy::AWS
|
|
112
113
|
:instance_type => opts[:size].to_s,
|
113
114
|
:kernel_id => nil
|
114
115
|
}
|
115
|
-
#p opts[:machine_data]
|
116
|
-
#exit
|
117
116
|
|
118
|
-
response = execute_request({}) {
|
117
|
+
response = Rudy::AWS::EC2.execute_request({}) { @@ec2.run_instances(old_opts) }
|
119
118
|
return nil unless response['instancesSet'].is_a?(Hash)
|
120
119
|
instances = response['instancesSet']['item'].collect do |inst|
|
121
|
-
self.
|
120
|
+
self.from_hash(inst)
|
122
121
|
end
|
123
122
|
instances.each { |inst|
|
124
123
|
each_inst.call(inst)
|
@@ -130,8 +129,8 @@ module Rudy::AWS
|
|
130
129
|
instances = list(:running, inst_ids, &each_inst) || []
|
131
130
|
raise NoRunningInstances if instances.empty?
|
132
131
|
inst_ids = objects_to_instance_ids(inst_ids)
|
133
|
-
response = execute_request({}) {
|
134
|
-
|
132
|
+
response = Rudy::AWS::EC2.execute_request({}) {
|
133
|
+
@@ec2.reboot_instances(:instance_id => inst_ids)
|
135
134
|
}
|
136
135
|
response['return'] == 'true'
|
137
136
|
end
|
@@ -142,8 +141,8 @@ module Rudy::AWS
|
|
142
141
|
|
143
142
|
inst_ids = objects_to_instance_ids(inst_ids)
|
144
143
|
|
145
|
-
response = execute_request({}) {
|
146
|
-
|
144
|
+
response = Rudy::AWS::EC2.execute_request({}) {
|
145
|
+
@@ec2.terminate_instances(:instance_id => inst_ids)
|
147
146
|
}
|
148
147
|
|
149
148
|
#instancesSet:
|
@@ -228,8 +227,8 @@ module Rudy::AWS
|
|
228
227
|
# This method always returns an Array.
|
229
228
|
inst_ids = objects_to_instance_ids(inst_ids)
|
230
229
|
|
231
|
-
response = execute_request({}) {
|
232
|
-
|
230
|
+
response = Rudy::AWS::EC2.execute_request({}) {
|
231
|
+
@@ec2.describe_instances(:instance_id => inst_ids)
|
233
232
|
}
|
234
233
|
|
235
234
|
# requestId: c16878ac-28e4-4859-9878-ef93af45789c
|
@@ -280,8 +279,8 @@ module Rudy::AWS
|
|
280
279
|
#
|
281
280
|
def console(inst_id, &each_inst)
|
282
281
|
inst_ids = objects_to_instance_ids([inst_id])
|
283
|
-
response = execute_request({}) {
|
284
|
-
|
282
|
+
response = Rudy::AWS::EC2.execute_request({}) {
|
283
|
+
@@ec2.get_console_output(:instance_id => inst_ids.first)
|
285
284
|
}
|
286
285
|
response['output']
|
287
286
|
end
|
data/lib/rudy/aws/ec2/keypair.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
module Rudy::AWS
|
3
3
|
module EC2
|
4
4
|
|
5
|
-
class
|
5
|
+
class Keypair < Storable
|
6
6
|
|
7
7
|
field :name
|
8
8
|
field :fingerprint
|
@@ -25,20 +25,20 @@ module Rudy::AWS
|
|
25
25
|
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
include Rudy::AWS::
|
30
|
-
|
28
|
+
module EC2::Keypairs
|
29
|
+
include Rudy::AWS::EC2 # important! include,
|
30
|
+
extend self # then extend
|
31
31
|
|
32
32
|
def create(name)
|
33
33
|
raise "No name provided" unless name
|
34
|
-
ret =
|
35
|
-
|
34
|
+
ret = @@ec2.create_keypair(:key_name => name)
|
35
|
+
from_hash(ret)
|
36
36
|
end
|
37
37
|
|
38
38
|
def destroy(name)
|
39
|
-
name = name.name if name.is_a?(Rudy::AWS::EC2::
|
39
|
+
name = name.name if name.is_a?(Rudy::AWS::EC2::Keypair)
|
40
40
|
raise "No name provided" unless name.is_a?(String)
|
41
|
-
ret =
|
41
|
+
ret = @@ec2.delete_keypair(:key_name => name)
|
42
42
|
(ret && ret['return'] == 'true') # BUG? Always returns true
|
43
43
|
end
|
44
44
|
|
@@ -50,23 +50,24 @@ module Rudy::AWS
|
|
50
50
|
|
51
51
|
def list_as_hash(*names)
|
52
52
|
names = names.flatten
|
53
|
-
klist =
|
53
|
+
klist = @@ec2.describe_keypairs(:key_name => names)
|
54
54
|
return unless klist['keySet'].is_a?(Hash)
|
55
55
|
keypairs = {}
|
56
56
|
klist['keySet']['item'].each do |oldkp|
|
57
|
-
kp =
|
57
|
+
kp = from_hash(oldkp)
|
58
58
|
keypairs[kp.name] = kp
|
59
59
|
end
|
60
|
+
keypairs = nil if keypairs.empty?
|
60
61
|
keypairs
|
61
62
|
end
|
62
63
|
|
63
|
-
def
|
64
|
+
def from_hash(h)
|
64
65
|
# keyName: test-c5g4v3pe
|
65
66
|
# keyFingerprint: 65:d0:ce:e7:6a:b0:88:4a:9c:c7:2d:b8:33:0c:fd:3b:c8:0f:0a:3c
|
66
67
|
# keyMaterial: |-
|
67
68
|
# -----BEGIN RSA PRIVATE KEY-----
|
68
69
|
#
|
69
|
-
keypair = Rudy::AWS::EC2::
|
70
|
+
keypair = Rudy::AWS::EC2::Keypair.new
|
70
71
|
keypair.fingerprint = h['keyFingerprint']
|
71
72
|
keypair.name = h['keyName']
|
72
73
|
keypair.private_key = h['keyMaterial']
|
@@ -91,13 +92,7 @@ module Rudy::AWS
|
|
91
92
|
end
|
92
93
|
|
93
94
|
end
|
94
|
-
|
95
|
-
class Keypairs #:nodoc:
|
96
|
-
def initialize(*args)
|
97
|
-
raise "Oops! The correct class uses a capital 'P': Rudy::AWS::EC2::KeyPairs"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
95
|
+
|
101
96
|
end
|
102
97
|
end
|
103
98
|
|
@@ -21,7 +21,7 @@ module Rudy::AWS
|
|
21
21
|
@@sformat % [liner_note, @volid, @status]
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def pretty
|
25
25
|
lines = []
|
26
26
|
lines << liner_note
|
27
27
|
field_names.each do |key|
|
@@ -38,9 +38,10 @@ module Rudy::AWS
|
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
|
-
include Rudy::AWS::
|
43
|
-
|
41
|
+
module Snapshots
|
42
|
+
include Rudy::AWS::EC2 # important! include,
|
43
|
+
extend self # then extend
|
44
|
+
|
44
45
|
|
45
46
|
def list(snap_id=[])
|
46
47
|
snapshots = list_as_hash(snap_id)
|
@@ -51,25 +52,26 @@ module Rudy::AWS
|
|
51
52
|
end
|
52
53
|
def list_as_hash(snap_id=[])
|
53
54
|
snap_id = [snap_id].flatten.compact
|
54
|
-
slist =
|
55
|
+
slist = @@ec2.describe_snapshots(:snapshot_id => snap_id)
|
55
56
|
return unless slist['snapshotSet'].is_a?(Hash)
|
56
57
|
snapshots = {}
|
57
58
|
slist['snapshotSet']['item'].each do |snap|
|
58
|
-
kp = self.
|
59
|
+
kp = self.from_hash(snap)
|
59
60
|
snapshots[kp.awsid] = kp
|
60
61
|
end
|
62
|
+
snapshots = nil if snapshots.empty?
|
61
63
|
snapshots
|
62
64
|
end
|
63
65
|
|
64
66
|
def create(vol_id)
|
65
67
|
vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
66
|
-
shash =
|
68
|
+
shash = @@ec2.create_snapshot(:volume_id => vol_id)
|
67
69
|
snap = Snapshots.from_hash(shash)
|
68
70
|
snap
|
69
71
|
end
|
70
72
|
|
71
73
|
def destroy(snap_id)
|
72
|
-
ret =
|
74
|
+
ret = @@ec2.delete_snapshot(:snapshot_id => snap_id)
|
73
75
|
(ret && ret['return'] == 'true')
|
74
76
|
end
|
75
77
|
|
@@ -99,10 +101,15 @@ module Rudy::AWS
|
|
99
101
|
list(snap_id).first || nil
|
100
102
|
end
|
101
103
|
|
102
|
-
def exists?(
|
104
|
+
def exists?(snap_id)
|
103
105
|
!get(snap_id).nil?
|
104
106
|
end
|
105
107
|
|
108
|
+
def completed?(snap_id)
|
109
|
+
s = get(snap_id)
|
110
|
+
return false if s.nil?
|
111
|
+
s.completed?
|
112
|
+
end
|
106
113
|
end
|
107
114
|
|
108
115
|
end
|
data/lib/rudy/aws/ec2/volume.rb
CHANGED
@@ -7,14 +7,19 @@ module Rudy::AWS
|
|
7
7
|
|
8
8
|
field :awsid
|
9
9
|
field :status
|
10
|
-
field :size
|
10
|
+
field :size => Integer
|
11
11
|
field :snapid
|
12
|
-
field :zone
|
13
|
-
field :create_time
|
14
|
-
field :attach_time
|
12
|
+
field :zone => Symbol
|
13
|
+
field :create_time => Time
|
14
|
+
field :attach_time => Time
|
15
15
|
field :instid
|
16
16
|
field :device
|
17
17
|
|
18
|
+
def postprocess
|
19
|
+
@zone &&= @zone.to_sym
|
20
|
+
@size &&= @size.to_i
|
21
|
+
end
|
22
|
+
|
18
23
|
def liner_note
|
19
24
|
info = attached? ? "attached to #{@instid}" : @status
|
20
25
|
"%s (%s)" % [(self.awsid || '').bright, info]
|
@@ -26,7 +31,7 @@ module Rudy::AWS
|
|
26
31
|
line
|
27
32
|
end
|
28
33
|
|
29
|
-
def
|
34
|
+
def pretty
|
30
35
|
lines = [liner_note]
|
31
36
|
field_names.each do |n|
|
32
37
|
lines << sprintf(" %12s: %s", n, self.send(n)) if self.send(n)
|
@@ -48,10 +53,11 @@ module Rudy::AWS
|
|
48
53
|
end
|
49
54
|
|
50
55
|
|
51
|
-
|
52
|
-
include Rudy::AWS::
|
53
|
-
|
54
|
-
|
56
|
+
module Volumes
|
57
|
+
include Rudy::AWS::EC2 # important! include,
|
58
|
+
extend self # then extend
|
59
|
+
|
60
|
+
|
55
61
|
unless defined?(KNOWN_STATES)
|
56
62
|
KNOWN_STATES = [:available, :creating, :deleting, :attached, :detaching].freeze
|
57
63
|
end
|
@@ -72,11 +78,11 @@ module Rudy::AWS
|
|
72
78
|
# "availabilityZone"=>"us-east-1b",
|
73
79
|
# "createTime"=>"2009-03-17T20:10:48.000Z",
|
74
80
|
# "volumeId"=>"vol-48826421"
|
75
|
-
vol = execute_request({}) {
|
81
|
+
vol = Rudy::AWS::EC2.execute_request({}) { @@ec2.create_volume(opts) }
|
76
82
|
|
77
83
|
# TODO: use a waiter?
|
78
84
|
#Rudy.waiter(1, 30) do
|
79
|
-
# ret =
|
85
|
+
# ret = @@@ec2.volumes.available?(volume.awsid)
|
80
86
|
#end
|
81
87
|
|
82
88
|
reqid = vol['requestId']
|
@@ -86,7 +92,7 @@ module Rudy::AWS
|
|
86
92
|
def destroy(vol_id)
|
87
93
|
vol_id = Volumes.get_vol_id(vol_id)
|
88
94
|
raise VolumeNotAvailable, vol_id unless available?(vol_id)
|
89
|
-
ret = execute_request({}) {
|
95
|
+
ret = Rudy::AWS::EC2.execute_request({}) { @@ec2.delete_volume(:volume_id => vol_id) }
|
90
96
|
(ret['return'] == 'true')
|
91
97
|
end
|
92
98
|
|
@@ -103,7 +109,7 @@ module Rudy::AWS
|
|
103
109
|
:instance_id => inst_id,
|
104
110
|
:device => device.to_s # Solaris devices are numbers
|
105
111
|
}
|
106
|
-
ret = execute_request(false) {
|
112
|
+
ret = Rudy::AWS::EC2.execute_request(false) { @@ec2.attach_volume(opts) }
|
107
113
|
(ret['status'] == 'attaching')
|
108
114
|
end
|
109
115
|
|
@@ -111,16 +117,20 @@ module Rudy::AWS
|
|
111
117
|
vol_id = Volumes.get_vol_id(vol_id)
|
112
118
|
raise NoVolumeID unless vol_id
|
113
119
|
raise VolumeNotAttached, vol_id unless attached?(vol_id)
|
114
|
-
ret = execute_request({}) {
|
120
|
+
ret = Rudy::AWS::EC2.execute_request({}) {
|
121
|
+
@@ec2.detach_volume(:volume_id => vol_id)
|
122
|
+
}
|
115
123
|
(ret['status'] == 'detaching')
|
116
124
|
end
|
117
125
|
|
118
126
|
|
119
|
-
def list(state=nil, vol_id=[])
|
120
|
-
list_as_hash(state, vol_id)
|
127
|
+
def list(state=nil, vol_id=[], &each_vol)
|
128
|
+
volumes = list_as_hash(state, vol_id, &each_vol)
|
129
|
+
volumes &&= volumes.values
|
130
|
+
volumes
|
121
131
|
end
|
122
132
|
|
123
|
-
def list_as_hash(state=nil, vol_id=[])
|
133
|
+
def list_as_hash(state=nil, vol_id=[], &each_vol)
|
124
134
|
state &&= state.to_sym
|
125
135
|
state = nil if state == :any
|
126
136
|
# A nil state is fine, but we don't want an unknown one!
|
@@ -130,7 +140,9 @@ module Rudy::AWS
|
|
130
140
|
:volume_id => vol_id ? [vol_id].flatten : []
|
131
141
|
}
|
132
142
|
|
133
|
-
vlist = execute_request({}) {
|
143
|
+
vlist = Rudy::AWS::EC2.execute_request({}) {
|
144
|
+
@@ec2.describe_volumes(opts)
|
145
|
+
}
|
134
146
|
|
135
147
|
volumes = {}
|
136
148
|
return volumes unless vlist['volumeSet'].is_a?(Hash)
|
@@ -139,16 +151,21 @@ module Rudy::AWS
|
|
139
151
|
next if state && v.state != state.to_s
|
140
152
|
volumes[v.awsid] = v
|
141
153
|
end
|
154
|
+
volumes.values.each { |v| each_vol.call(v) } if each_vol
|
155
|
+
volumes = nil if volumes.empty?
|
142
156
|
volumes
|
143
157
|
end
|
144
158
|
|
145
159
|
def any?(state=nil,vol_id=[])
|
146
|
-
|
160
|
+
vols = list(state, vol_id)
|
161
|
+
!vols.nil?
|
147
162
|
end
|
148
163
|
|
149
164
|
def exists?(vol_id)
|
150
165
|
vol_id = Volumes.get_vol_id(vol_id)
|
151
166
|
vol = get(vol_id)
|
167
|
+
return false if vol.nil?
|
168
|
+
return false if vol.deleting?
|
152
169
|
!vol.nil?
|
153
170
|
end
|
154
171
|
|
@@ -203,6 +220,7 @@ module Rudy::AWS
|
|
203
220
|
vol.attach_time = item['attachTime']
|
204
221
|
vol.instid = item['instanceId']
|
205
222
|
end
|
223
|
+
vol.postprocess
|
206
224
|
vol
|
207
225
|
end
|
208
226
|
|
@@ -223,8 +241,3 @@ module Rudy::AWS
|
|
223
241
|
end
|
224
242
|
end
|
225
243
|
|
226
|
-
|
227
|
-
class Rudy::AWS::EC2::Volumes
|
228
|
-
|
229
|
-
|
230
|
-
end
|