solutious-rudy 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. data/CHANGES.txt +19 -1
  2. data/README.rdoc +66 -35
  3. data/Rakefile +1 -0
  4. data/Rudyfile +97 -6
  5. data/bin/ird +7 -4
  6. data/bin/rudy +120 -212
  7. data/bin/rudy-ec2 +240 -0
  8. data/bin/rudy-s3 +76 -0
  9. data/bin/rudy-sdb +67 -0
  10. data/lib/annoy.rb +61 -18
  11. data/lib/console.rb +10 -5
  12. data/lib/rudy/aws/ec2/address.rb +76 -40
  13. data/lib/rudy/aws/ec2/group.rb +138 -78
  14. data/lib/rudy/aws/ec2/image.rb +134 -12
  15. data/lib/rudy/aws/ec2/instance.rb +116 -89
  16. data/lib/rudy/aws/ec2/keypair.rb +26 -14
  17. data/lib/rudy/aws/ec2/snapshot.rb +23 -12
  18. data/lib/rudy/aws/ec2/volume.rb +198 -202
  19. data/lib/rudy/aws/ec2/zone.rb +77 -0
  20. data/lib/rudy/aws/ec2.rb +56 -25
  21. data/lib/rudy/aws/s3.rb +54 -0
  22. data/lib/rudy/aws/sdb/error.rb +46 -0
  23. data/lib/rudy/aws/sdb.rb +298 -0
  24. data/lib/rudy/aws.rb +29 -57
  25. data/lib/rudy/{metadata/backup.rb → backup.rb} +8 -8
  26. data/lib/rudy/cli/aws/ec2/addresses.rb +105 -0
  27. data/lib/rudy/cli/aws/ec2/candy.rb +208 -0
  28. data/lib/rudy/cli/aws/ec2/groups.rb +121 -0
  29. data/lib/rudy/cli/aws/ec2/images.rb +196 -0
  30. data/lib/rudy/cli/aws/ec2/instances.rb +194 -0
  31. data/lib/rudy/cli/aws/ec2/keypairs.rb +53 -0
  32. data/lib/rudy/cli/aws/ec2/snapshots.rb +49 -0
  33. data/lib/rudy/cli/aws/ec2/volumes.rb +104 -0
  34. data/lib/rudy/cli/aws/ec2/zones.rb +22 -0
  35. data/lib/rudy/cli/aws/s3/buckets.rb +50 -0
  36. data/lib/rudy/cli/aws/s3/store.rb +22 -0
  37. data/lib/rudy/cli/aws/sdb/domains.rb +41 -0
  38. data/lib/rudy/cli/{deploy.rb → candy.rb} +2 -6
  39. data/lib/rudy/cli/config.rb +25 -20
  40. data/lib/rudy/cli/disks.rb +18 -108
  41. data/lib/rudy/cli/machines.rb +94 -0
  42. data/lib/rudy/cli/routines.rb +47 -70
  43. data/lib/rudy/cli.rb +104 -89
  44. data/lib/rudy/config/objects.rb +5 -43
  45. data/lib/rudy/config.rb +8 -24
  46. data/lib/rudy/disks.rb +248 -0
  47. data/lib/rudy/global.rb +121 -0
  48. data/lib/rudy/huxtable.rb +232 -147
  49. data/lib/rudy/machines.rb +245 -0
  50. data/lib/rudy/metadata.rb +136 -0
  51. data/lib/rudy/routines/helpers/diskhelper.rb +101 -0
  52. data/lib/rudy/routines/helpers/scripthelper.rb +91 -0
  53. data/lib/rudy/routines/release.rb +27 -8
  54. data/lib/rudy/routines/shutdown.rb +47 -32
  55. data/lib/rudy/routines/startup.rb +47 -37
  56. data/lib/rudy/routines.rb +30 -37
  57. data/lib/rudy/scm/svn.rb +1 -1
  58. data/lib/rudy/utils.rb +262 -4
  59. data/lib/rudy.rb +76 -248
  60. data/lib/storable.rb +19 -16
  61. data/lib/sysinfo.rb +1 -1
  62. data/rudy.gemspec +88 -68
  63. data/support/rudy-ec2-startup +5 -5
  64. data/test/05_config/00_setup_test.rb +3 -7
  65. data/test/20_sdb/00_setup_test.rb +2 -17
  66. data/test/20_sdb/10_domains_test.rb +18 -16
  67. data/test/25_ec2/00_setup_test.rb +5 -10
  68. data/test/25_ec2/10_keypairs_test.rb +13 -5
  69. data/test/25_ec2/20_groups_test.rb +48 -56
  70. data/test/25_ec2/30_addresses_test.rb +13 -10
  71. data/test/25_ec2/40_volumes_test.rb +11 -8
  72. data/test/25_ec2/50_snapshots_test.rb +17 -12
  73. data/test/26_ec2_instances/00_setup_test.rb +3 -8
  74. data/test/26_ec2_instances/10_instances_test.rb +21 -19
  75. data/test/30_sdb_metadata/00_setup_test.rb +2 -9
  76. data/test/30_sdb_metadata/10_disks_test.rb +47 -37
  77. data/test/30_sdb_metadata/20_backups_test.rb +9 -9
  78. data/test/helper.rb +5 -3
  79. data/vendor/highline-1.5.1/CHANGELOG +222 -0
  80. data/vendor/highline-1.5.1/INSTALL +35 -0
  81. data/vendor/highline-1.5.1/LICENSE +7 -0
  82. data/vendor/highline-1.5.1/README +63 -0
  83. data/vendor/highline-1.5.1/Rakefile +82 -0
  84. data/vendor/highline-1.5.1/TODO +6 -0
  85. data/vendor/highline-1.5.1/examples/ansi_colors.rb +38 -0
  86. data/vendor/highline-1.5.1/examples/asking_for_arrays.rb +18 -0
  87. data/vendor/highline-1.5.1/examples/basic_usage.rb +75 -0
  88. data/vendor/highline-1.5.1/examples/color_scheme.rb +32 -0
  89. data/vendor/highline-1.5.1/examples/limit.rb +12 -0
  90. data/vendor/highline-1.5.1/examples/menus.rb +65 -0
  91. data/vendor/highline-1.5.1/examples/overwrite.rb +19 -0
  92. data/vendor/highline-1.5.1/examples/page_and_wrap.rb +322 -0
  93. data/vendor/highline-1.5.1/examples/password.rb +7 -0
  94. data/vendor/highline-1.5.1/examples/trapping_eof.rb +22 -0
  95. data/vendor/highline-1.5.1/examples/using_readline.rb +17 -0
  96. data/vendor/highline-1.5.1/lib/highline/color_scheme.rb +120 -0
  97. data/vendor/highline-1.5.1/lib/highline/compatibility.rb +17 -0
  98. data/vendor/highline-1.5.1/lib/highline/import.rb +43 -0
  99. data/vendor/highline-1.5.1/lib/highline/menu.rb +395 -0
  100. data/vendor/highline-1.5.1/lib/highline/question.rb +463 -0
  101. data/vendor/highline-1.5.1/lib/highline/system_extensions.rb +193 -0
  102. data/vendor/highline-1.5.1/lib/highline.rb +758 -0
  103. data/vendor/highline-1.5.1/setup.rb +1360 -0
  104. data/vendor/highline-1.5.1/test/tc_color_scheme.rb +56 -0
  105. data/vendor/highline-1.5.1/test/tc_highline.rb +823 -0
  106. data/vendor/highline-1.5.1/test/tc_import.rb +54 -0
  107. data/vendor/highline-1.5.1/test/tc_menu.rb +429 -0
  108. data/vendor/highline-1.5.1/test/ts_all.rb +15 -0
  109. metadata +81 -69
  110. data/lib/aws_sdb/error.rb +0 -42
  111. data/lib/aws_sdb/service.rb +0 -215
  112. data/lib/aws_sdb.rb +0 -3
  113. data/lib/rudy/aws/simpledb.rb +0 -71
  114. data/lib/rudy/cli/addresses.rb +0 -85
  115. data/lib/rudy/cli/backups.rb +0 -175
  116. data/lib/rudy/cli/domains.rb +0 -17
  117. data/lib/rudy/cli/groups.rb +0 -77
  118. data/lib/rudy/cli/images.rb +0 -111
  119. data/lib/rudy/cli/instances.rb +0 -142
  120. data/lib/rudy/cli/keypairs.rb +0 -47
  121. data/lib/rudy/cli/manager.rb +0 -51
  122. data/lib/rudy/cli/release.rb +0 -174
  123. data/lib/rudy/cli/volumes.rb +0 -121
  124. data/lib/rudy/command/addresses.rb +0 -69
  125. data/lib/rudy/command/backups.rb +0 -65
  126. data/lib/rudy/command/disks-old.rb +0 -322
  127. data/lib/rudy/command/disks.rb +0 -9
  128. data/lib/rudy/command/domains.rb +0 -34
  129. data/lib/rudy/command/groups.rb +0 -118
  130. data/lib/rudy/command/instances.rb +0 -278
  131. data/lib/rudy/command/keypairs.rb +0 -149
  132. data/lib/rudy/command/manager.rb +0 -65
  133. data/lib/rudy/command/volumes.rb +0 -127
  134. data/lib/rudy/metadata/disk.rb +0 -149
  135. data/lib/rudy/metadata/machine.rb +0 -34
  136. data/lib/rudy/routines/disk_handler.rb +0 -190
  137. data/lib/rudy/routines/script_runner.rb +0 -65
  138. data/test/50_commands/00_setup_test.rb +0 -11
  139. data/test/50_commands/10_keypairs_test.rb +0 -79
  140. data/test/50_commands/20_groups_test.rb +0 -77
  141. data/test/50_commands/40_volumes_test.rb +0 -55
  142. data/test/50_commands/50_instances_test.rb +0 -110
  143. data/tryouts/console_tryout.rb +0 -91
  144. data/tryouts/disks.rb +0 -55
  145. data/tryouts/nested_methods.rb +0 -36
  146. data/tryouts/session_tryout.rb +0 -46
@@ -1,234 +1,230 @@
1
1
 
2
2
 
3
3
  module Rudy::AWS
4
- class EC2
4
+ module EC2
5
5
  class Volume < Storable
6
- field :awsid
7
- field :status
8
- field :size
9
- field :snapid
10
- field :zone
11
- field :create_time
12
- field :attach_time
13
- field :instid
14
- field :device
15
-
16
- def to_s
17
- lines = ["Volume: #{self.awsid.bright}"]
18
- field_names.each do |n|
19
- lines << sprintf(" %12s: %s", n, self.send(n)) if self.send(n)
20
- end
21
- lines.join($/)
22
- end
23
-
24
- # Alias for status
25
- def state
26
- status
27
- end
28
-
29
- def available?
30
- (status && status == "available")
31
- end
32
-
33
- def creating?
34
- (status && status == "creating")
35
- end
6
+ @@sformat = "%s %10s;%4sGB; %s " # cram the terabyte
7
+
8
+ field :awsid
9
+ field :status
10
+ field :size
11
+ field :snapid
12
+ field :zone
13
+ field :create_time
14
+ field :attach_time
15
+ field :instid
16
+ field :device
17
+
18
+ def liner_note
19
+ info = attached? ? "attached to #{@instid}" : @status
20
+ "%s (%s)" % [(self.awsid || '').bright, info]
21
+ end
22
+
23
+ def to_s(with_title=false)
24
+ line = @@sformat % [liner_note, @zone, @size, @device]
25
+ line << " <- %s" % [@snapid] if @snapid
26
+ line
27
+ end
28
+
29
+ def inspect
30
+ lines = [liner_note]
31
+ field_names.each do |n|
32
+ lines << sprintf(" %12s: %s", n, self.send(n)) if self.send(n)
33
+ end
34
+ lines.join($/)
35
+ end
36
36
 
37
- def deleting?
38
- (status && status == "deleting")
39
- end
37
+ # Alias for status
38
+ def state
39
+ status
40
+ end
40
41
 
41
- def attached?
42
- (status && (status == "attached"))
43
- end
42
+ def available?; (status && status == "available"); end
43
+ def creating?; (status && status == "creating"); end
44
+ def deleting?; (status && status == "deleting"); end
45
+ def attached?; (status && status == "attached"); end
46
+ def in_use?; (status && status == "in-use"); end
44
47
 
45
- def in_use?
46
- (status && (status == "in-use"))
47
48
  end
48
-
49
- end
50
49
 
51
50
 
52
- class EC2::Volumes
53
- include Rudy::AWS::ObjectBase
51
+ class Volumes
52
+ include Rudy::AWS::ObjectBase
53
+ include Rudy::AWS::EC2::Base
54
54
 
55
- unless defined?(KNOWN_STATES)
56
- KNOWN_STATES = [:available, :creating, :deleting, :attached, :detaching].freeze
57
- end
55
+ unless defined?(KNOWN_STATES)
56
+ KNOWN_STATES = [:available, :creating, :deleting, :attached, :detaching].freeze
57
+ end
58
58
 
59
- def attach(inst_id, vol_id, device)
60
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
61
- inst_id = inst_id.is_a?(Rudy::AWS::EC2::Instance) ? inst_id.awsid : inst_id
59
+ # * +size+ the number of GB
60
+ def create(size, zone, snapid=nil)
61
+ opts = {
62
+ :availability_zone => zone.to_s,
63
+ :size => (size || 1).to_s
64
+ }
62
65
 
63
- ret = execute_request(false) {
64
- @aws.attach_volume(:volume_id => vol_id, :instance_id => inst_id, :device => device)
65
- }
66
- (ret['status'] == 'attaching')
67
- end
68
-
69
- def detach(vol_id)
70
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
66
+ opts[:snapshot_id] = snapid if snapid
71
67
 
72
- ret = execute_request({}) {
73
- @aws.detach_volume(:volume_id => vol_id)
74
- }
75
- (ret['status'] == 'detaching')
76
- end
77
-
68
+ # "status"=>"creating",
69
+ # "size"=>"1",
70
+ # "snapshotId"=>nil,
71
+ # "requestId"=>"d42ff744-48b5-4f47-a3f0-7aba57a13eb9",
72
+ # "availabilityZone"=>"us-east-1b",
73
+ # "createTime"=>"2009-03-17T20:10:48.000Z",
74
+ # "volumeId"=>"vol-48826421"
75
+ vol = execute_request({}) { @ec2.create_volume(opts) }
76
+
77
+ # TODO: use a waiter?
78
+ #Rudy.waiter(1, 30) do
79
+ # ret = @@ec2.volumes.available?(volume.awsid)
80
+ #end
81
+
82
+ reqid = vol['requestId']
83
+ Volumes.from_hash(vol) || nil
84
+ end
78
85
 
79
- def list(state=nil, vol_id=[])
80
- list_as_hash(state, vol_id).values
81
- end
86
+ def destroy(vol_id)
87
+ vol_id = Volumes.get_vol_id(vol_id)
88
+ raise VolumeNotAvailable, vol_id unless available?(vol_id)
89
+ ret = execute_request({}) { @ec2.delete_volume(:volume_id => vol_id) }
90
+ (ret['return'] == 'true')
91
+ end
82
92
 
83
- def list_as_hash(state=nil, vol_id=[])
84
- state &&= state.to_sym
85
- state = nil if state == :any
86
- raise "Unknown state: #{state}" if state && !Volumes.known_state?(state)
93
+ def attach(vol_id, inst_id, device)
94
+ vol_id = Volumes.get_vol_id(vol_id)
95
+ inst_id = inst_id.is_a?(Rudy::AWS::EC2::Instance) ? inst_id.awsid : inst_id
96
+ raise NoVolumeID unless vol_id
97
+ raise VolumeAlreadyAttached, vol_id if attached?(vol_id)
98
+ raise NoInstanceID unless inst_id
99
+ raise NoDevice unless device
87
100
 
88
- opts = {
89
- :volume_id => vol_id ? [vol_id].flatten : []
90
- }
91
- begin
92
-
93
- vlist = execute_request({}) {
94
- @aws.describe_volumes(opts)
101
+ opts = {
102
+ :volume_id => vol_id,
103
+ :instance_id => inst_id,
104
+ :device => device
95
105
  }
96
-
97
- # NOTE: The InternalError is returned for non-existent volume IDs.
98
- # It's probably a bug so we're ignoring it -- Dave.
99
- rescue ::EC2::InternalError => ex
100
- vlist = {}
101
- end
102
- volumes = {}
103
- return volumes unless vlist['volumeSet'].is_a?(Hash)
104
- vlist['volumeSet']['item'].each do |vol|
105
- v = Volumes.from_hash(vol)
106
- next if state && v.state != state.to_s
107
- volumes[v.awsid] = v
108
- end
109
- volumes
110
- end
111
-
106
+ ret = execute_request(false) { @ec2.attach_volume(opts) }
107
+ (ret['status'] == 'attaching')
108
+ end
112
109
 
113
- # * +size+ the number of GB
114
- def create(size, zone, snapid=nil)
115
- opts = {
116
- :availability_zone => zone.to_s,
117
- :size => (size || 1).to_s
118
- }
119
-
120
- opts[:snapshot_id] = snapid if snapid
121
-
122
- # "status"=>"creating",
123
- # "size"=>"1",
124
- # "snapshotId"=>nil,
125
- # "requestId"=>"d42ff744-48b5-4f47-a3f0-7aba57a13eb9",
126
- # "availabilityZone"=>"us-east-1b",
127
- # "createTime"=>"2009-03-17T20:10:48.000Z",
128
- # "volumeId"=>"vol-48826421"
129
- vol = execute_request({}) {
130
- @aws.create_volume(opts)
131
- }
132
-
133
- reqid = vol['requestId']
134
- Volumes.from_hash(vol) || nil
135
- end
110
+ def detach(vol_id)
111
+ vol_id = Volumes.get_vol_id(vol_id)
112
+ raise NoVolumeID unless vol_id
113
+ raise VolumeNotAttached, vol_id unless attached?(vol_id)
114
+ ret = execute_request({}) { @ec2.detach_volume(:volume_id => vol_id) }
115
+ (ret['status'] == 'detaching')
116
+ end
136
117
 
137
118
 
138
- def destroy(vol_id)
139
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
140
- ret = execute_request({}) {
141
- @aws.delete_volume(:volume_id => vol_id)
142
- }
143
- (ret['return'] == 'true')
144
- end
119
+ def list(state=nil, vol_id=[])
120
+ list_as_hash(state, vol_id).values
121
+ end
145
122
 
146
- def self.from_hash(h)
147
- # ---
148
- # volumeSet:
149
- # item:
150
- # - status: available
151
- # size: "1"
152
- # snapshotId:
153
- # availabilityZone: us-east-1b
154
- # attachmentSet:
155
- # createTime: "2009-03-17T20:10:48.000Z"
156
- # volumeId: vol-48826421
157
- # attachmentSet:
158
- # item:
159
- # - attachTime: "2009-03-17T21:49:54.000Z"
160
- # status: attached
161
- # device: /dev/sdh
162
- # instanceId: i-956af3fc
163
- # volumeId: vol-48826421
164
- #
165
- # requestId: 8fc30e5b-a9c3-4fe0-a979-0f71e639a7c7
166
- vol = Rudy::AWS::EC2::Volume.new
167
- vol.status = h['status']
168
- vol.size = h['size']
169
- vol.snapid = h['snapshotId']
170
- vol.zone = h['availabilityZone']
171
- vol.awsid = h['volumeId']
172
- vol.create_time = h['createTime']
173
- if h['attachmentSet'].is_a?(Hash)
174
- item = h['attachmentSet']['item'].first
175
- vol.status = item['status'] # Overwrite "available status". Possibly a bad idea.
176
- vol.device = item['device']
177
- vol.attach_time = item['attachTime']
178
- vol.instid = item['instanceId']
179
- end
180
- vol
181
- end
123
+ def list_as_hash(state=nil, vol_id=[])
124
+ state &&= state.to_sym
125
+ state = nil if state == :any
126
+ # A nil state is fine, but we don't want an unknown one!
127
+ raise UnknownState, state if state && !Volumes.known_state?(state)
128
+
129
+ opts = {
130
+ :volume_id => vol_id ? [vol_id].flatten : []
131
+ }
182
132
 
133
+ vlist = execute_request({}) { @ec2.describe_volumes(opts) }
134
+
135
+ volumes = {}
136
+ return volumes unless vlist['volumeSet'].is_a?(Hash)
137
+ vlist['volumeSet']['item'].each do |vol|
138
+ v = Volumes.from_hash(vol)
139
+ next if state && v.state != state.to_s
140
+ volumes[v.awsid] = v
141
+ end
142
+ volumes
143
+ end
183
144
 
184
- def any?(state=nil,vol_id=[])
185
- !(list(state, vol_id) || []).empty?
186
- end
187
-
188
- def exists?(vol_id)
189
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
190
- !get(vol_id).nil?
191
- end
145
+ def any?(state=nil,vol_id=[])
146
+ !list(state, vol_id).nil?
147
+ end
192
148
 
193
- def get(vol_id)
194
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
195
- list(:any, vol_id).first || nil
196
- end
149
+ def exists?(vol_id)
150
+ vol_id = Volumes.get_vol_id(vol_id)
151
+ vol = get(vol_id)
152
+ !vol.nil?
153
+ end
197
154
 
198
- def deleting?(vol_id)
199
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
200
- return false unless vol_id
201
- vol = get(vol_id)
202
- (vol && vol.status == "deleting")
203
- end
155
+ def get(vol_id)
156
+ vol_id = Volumes.get_vol_id(vol_id)
157
+ list(:any, vol_id).first || nil
158
+ end
204
159
 
205
- def available?(vol_id)
206
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
207
- return false unless vol_id
208
- vol = get(vol_id)
209
- (vol && vol.status == "available")
210
- end
160
+ # deleting?, available?, etc...
161
+ %w[deleting available attached in-use].each do |state|
162
+ define_method("#{state.tr('-', '_')}?") do |vol_id|
163
+ vol_id = Volumes.get_vol_id(vol_id)
164
+ return false unless vol_id
165
+ vol = get(vol_id)
166
+ (vol && vol.status == state)
167
+ end
168
+ end
211
169
 
212
- def attached?(vol_id)
213
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
214
- return false unless vol_id
215
- vol = get(vol_id)
216
- (vol && (vol.status == "attached"))
217
- end
170
+ # Creates a Rudy::AWS::EC2::Volume object from:
171
+ #
172
+ # volumeSet:
173
+ # item:
174
+ # - status: available
175
+ # size: "1"
176
+ # snapshotId:
177
+ # availabilityZone: us-east-1b
178
+ # attachmentSet:
179
+ # createTime: "2009-03-17T20:10:48.000Z"
180
+ # volumeId: vol-48826421
181
+ # attachmentSet:
182
+ # item:
183
+ # - attachTime: "2009-03-17T21:49:54.000Z"
184
+ # status: attached
185
+ # device: /dev/sdh
186
+ # instanceId: i-956af3fc
187
+ # volumeId: vol-48826421
188
+ #
189
+ # requestId: 8fc30e5b-a9c3-4fe0-a979-0f71e639a7c7
190
+ #
191
+ def self.from_hash(h)
192
+ vol = Rudy::AWS::EC2::Volume.new
193
+ vol.status = h['status']
194
+ vol.size = h['size']
195
+ vol.snapid = h['snapshotId']
196
+ vol.zone = h['availabilityZone']
197
+ vol.awsid = h['volumeId']
198
+ vol.create_time = h['createTime']
199
+ if h['attachmentSet'].is_a?(Hash)
200
+ item = h['attachmentSet']['item'].first
201
+ vol.status = item['status'] # Overwrite "available status". Possibly a bad idea.
202
+ vol.device = item['device']
203
+ vol.attach_time = item['attachTime']
204
+ vol.instid = item['instanceId']
205
+ end
206
+ vol
207
+ end
208
+
209
+ # * +vol_id+ is a String or Rudy::AWS::EC2::Volume
210
+ # Returns the volume ID
211
+ def self.get_vol_id(vol_id)
212
+ (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
213
+ end
214
+
215
+ # Is +state+ a known EC2 volume state? See: KNOWN_STATES
216
+ def self.known_state?(state)
217
+ return false unless state
218
+ state &&= state.to_sym
219
+ KNOWN_STATES.member?(state)
220
+ end
218
221
 
219
- def in_use?(vol_id)
220
- vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
221
- return false unless vol_id
222
- vol = get(vol_id)
223
- (vol && (vol.status == "in-use"))
224
- end
225
-
226
- # Is +state+ a known EC2 volume state? See: KNOWN_STATES
227
- def self.known_state?(state)
228
- return false unless state
229
- state &&= state.to_sym
230
- KNOWN_STATES.member?(state)
231
222
  end
232
223
  end
233
224
  end
234
- end
225
+
226
+
227
+ class Rudy::AWS::EC2::Volumes
228
+
229
+
230
+ end
@@ -0,0 +1,77 @@
1
+
2
+ module Rudy::AWS
3
+ module EC2
4
+
5
+ class Zone < Storable
6
+
7
+ field :name
8
+ field :region
9
+ field :state
10
+
11
+ def liner_note
12
+ "%-10s %9s %s" % [self.name, self.region, self.state]
13
+ end
14
+
15
+ def to_s(titles=false)
16
+ str = titles ? "%-20s %s#{$/}" % ['name', 'region', 'state'] : ""
17
+ str << liner_note
18
+ end
19
+
20
+ end
21
+
22
+ class Zones
23
+ include Rudy::AWS::ObjectBase
24
+ include Rudy::AWS::EC2::Base
25
+
26
+ def list(*names)
27
+ zones = list_as_hash(names)
28
+ zones &&= zones.values
29
+ zones
30
+ end
31
+
32
+ def list_as_hash(*names)
33
+ names = names.flatten
34
+ zlist = @ec2.describe_availability_zones(:zone_name => names)
35
+ return unless zlist['availabilityZoneInfo'].is_a?(Hash)
36
+ zones = {}
37
+ zlist['availabilityZoneInfo']['item'].each do |zhash|
38
+ zon = Zones.from_hash(zhash)
39
+ zones[zon.name] = zon
40
+ end
41
+ zones
42
+ end
43
+
44
+ def self.from_hash(h)
45
+ zone = Rudy::AWS::EC2::Zone.new
46
+ zone.name = h['zoneName']
47
+ zone.region = h['regionName']
48
+ zone.state = h['zoneState']
49
+ zone
50
+ end
51
+
52
+ def any?
53
+ zones = list || []
54
+ !zones.empty?
55
+ end
56
+
57
+ def get(name)
58
+ zones = list(name) || []
59
+ return if zones.empty?
60
+ zones.first
61
+ end
62
+
63
+ def zone?(name)
64
+ begin
65
+ kp = get(name)
66
+ kp.is_a?(Rudy::AWS::EC2::Zone)
67
+ rescue => ex
68
+ false
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+ end
76
+
77
+
data/lib/rudy/aws/ec2.rb CHANGED
@@ -1,28 +1,59 @@
1
1
 
2
- module Rudy::AWS
3
- class EC2
4
- @@logger = StringIO.new
5
-
6
- attr_reader :instances
7
- attr_reader :images
8
- attr_reader :addresses
9
- attr_reader :groups
10
- attr_reader :volumes
11
- attr_reader :snapshots
12
- attr_reader :aws
13
- attr_reader :keypairs
14
-
15
- def initialize(access_key, secret_key)
16
- ec2 = ::EC2::Base.new(:access_key_id => access_key, :secret_access_key => secret_key)
17
- @instances = Rudy::AWS::EC2::Instances.new(ec2)
18
- @images = Rudy::AWS::EC2::Images.new(ec2)
19
- @groups = Rudy::AWS::EC2::Groups.new(ec2)
20
- @addresses = Rudy::AWS::EC2::Addresses.new(ec2)
21
- @snapshots = Rudy::AWS::EC2::Snapshots.new(ec2)
22
- @volumes = Rudy::AWS::EC2::Volumes.new(ec2)
23
- @keypairs = Rudy::AWS::EC2::KeyPairs.new(ec2)
2
+ module Rudy; module AWS
3
+ module EC2
4
+ module Base
5
+ attr_accessor :ec2
6
+ def initialize(access_key=nil, secret_key=nil, region=nil, logger=nil)
7
+
8
+ if region
9
+ raise InvalidRegion, region unless Rudy::AWS.valid_region?(region)
10
+ host = "#{region}.ec2.amazonaws.com"
11
+ elsif ENV['EC2_URL']
12
+ host = URL.parse(ENV['EC2_URL']).host
13
+ end
14
+
15
+ host ||= DEFAULT_EC2_HOST
16
+ port ||= DEFAULT_EC2_PORT
17
+
18
+ @ec2 = ::EC2::Base.new(:port => port, :server=> host, :access_key_id => access_key, :secret_access_key => secret_key)
19
+ @logger = logger
20
+ end
21
+ end
22
+
23
+ class NoRunningInstances < Rudy::Error; end
24
+ class MalformedResponse < Rudy::Error; end
25
+ class InvalidRegion < Rudy::Error; end
26
+ class UnknownState < Rudy::Error; end
27
+ class NoGroup < Rudy::Error; end
28
+ class NoKeyPair < Rudy::Error; end
29
+ class NoAMI < Rudy::Error; end
30
+
31
+ class NoAddress < Rudy::Error; end
32
+ class UnknownAddress < Rudy::Error; end
33
+ class NoInstanceID < Rudy::Error; end
34
+ class AddressAssociated < Rudy::Error; end
35
+ class ErrorCreatingAddress < Rudy::Error; end
36
+ class AddressNotAssociated < Rudy::Error; end
37
+ class InsecureKeyPairPermissions < Rudy::Error; end
38
+
39
+ class InsecureKeyPairPermissions < Rudy::Error; end
40
+ class ErrorCreatingKeyPair < Rudy::Error; end
41
+ class NoPrivateKeyFile < Rudy::Error; end
42
+ class KeyPairExists < Rudy::Error; end
43
+ class KeyPairAlreadyDefined < Rudy::Error
44
+ def message
45
+ "A keypair is defined for #{@obj}. Check your Rudy config."
46
+ end
24
47
  end
25
-
48
+
49
+ class VolumeAlreadyAttached < Rudy::Error; end
50
+ class VolumeNotAvailable < Rudy::Error; end
51
+ class VolumeNotAttached < Rudy::Error; end
52
+ class NoInstanceID < Rudy::Error; end
53
+ class NoVolumeID < Rudy::Error; end
54
+ class UnknownState < Rudy::Error; end
55
+ class NoDevice < Rudy::Error; end
56
+
57
+
26
58
  end
27
-
28
- end
59
+ end; end
data/lib/rudy/aws/s3.rb CHANGED
@@ -1,3 +1,57 @@
1
1
 
2
2
  module Rudy::AWS
3
+ class S3
4
+
5
+ def initialize(access_key=nil, secret_key=nil, region=nil, debug=nil)
6
+
7
+ url ||= 'http://sdb.amazonaws.com'
8
+ # There is a bug with passing :server to EC2::Base.new so
9
+ # we'll use the environment variable for now.
10
+ #if region && Rudy::AWS.valid_region?(region)
11
+ # "#{region}.sdb.amazonaws.com"
12
+ #end
13
+
14
+ @access_key_id = access_key || ENV['AWS_ACCESS_KEY'] || ENV['AMAZON_ACCESS_KEY_ID']
15
+ @secret_access_key = secret_key || ENV['AWS_SECRET_KEY'] || ENV['AMAZON_SECRET_ACCESS_KEY']
16
+ @base_url = url
17
+ @debug = debug || StringIO.new
18
+
19
+
20
+ AWS::S3::Base.establish_connection!(
21
+ :access_key_id => @access_key_id,
22
+ :secret_access_key => @secret_access_key
23
+ )
24
+
25
+ end
26
+
27
+ def list_buckets
28
+ ::AWS::S3::Service.buckets
29
+ end
30
+
31
+ def create_bucket(name)
32
+ ::AWS::S3::Bucket.create(name)
33
+ end
34
+
35
+ def destroy_bucket(name)
36
+ ::AWS::S3::Bucket.delete(name)
37
+ end
38
+
39
+ def find_bucket(name)
40
+ ::AWS::S3::Bucket.delete(name)
41
+ end
42
+
43
+ def list_bucket_objects(name)
44
+ ::AWS::S3::Bucket.objects(name)
45
+ end
46
+
47
+ #def store(path, bucket)
48
+ # fname = File.basename(path)
49
+ # S3Object.store(fname, open(path), bucket)
50
+ #end
51
+
52
+ def bucket_exists?(name)
53
+ b = find_bucket(name)
54
+ !b.nil?
55
+ end
56
+ end
3
57
  end