aws-sdk 1.1.4 → 1.2.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.
Files changed (58) hide show
  1. data/lib/aws.rb +2 -0
  2. data/lib/aws/api_config/ELB-2011-08-15.yml +380 -0
  3. data/lib/aws/api_config/SNS-2010-03-31.yml +2 -2
  4. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +5 -5
  5. data/lib/aws/core.rb +18 -3
  6. data/lib/aws/core/client_logging.rb +5 -6
  7. data/lib/aws/core/collection.rb +241 -0
  8. data/lib/aws/core/collection/batchable.rb +133 -0
  9. data/lib/aws/core/collection/limitable.rb +92 -0
  10. data/lib/aws/core/collection/simple.rb +89 -0
  11. data/lib/aws/core/configuration.rb +23 -0
  12. data/lib/aws/core/option_grammar.rb +2 -0
  13. data/lib/aws/core/page_result.rb +73 -0
  14. data/lib/aws/ec2/security_group.rb +154 -89
  15. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +1 -2
  16. data/lib/aws/ec2/security_group/{ip_permission_collection.rb → ingress_ip_permission_collection.rb} +4 -1
  17. data/lib/aws/ec2/security_group/ip_permission.rb +23 -45
  18. data/lib/aws/elb.rb +65 -0
  19. data/lib/aws/elb/availability_zone_collection.rb +138 -0
  20. data/lib/aws/elb/backend_server_policy_collection.rb +150 -0
  21. data/lib/aws/elb/client.rb +35 -0
  22. data/lib/aws/elb/client/xml.rb +33 -0
  23. data/lib/aws/elb/config.rb +18 -0
  24. data/lib/aws/elb/errors.rb +30 -0
  25. data/lib/aws/elb/instance_collection.rb +174 -0
  26. data/lib/aws/elb/listener.rb +189 -0
  27. data/lib/aws/elb/listener_collection.rb +119 -0
  28. data/lib/aws/elb/listener_opts.rb +45 -0
  29. data/lib/aws/elb/listener_spec.rb +14 -0
  30. data/lib/aws/elb/load_balancer.rb +255 -0
  31. data/lib/aws/elb/load_balancer_collection.rb +113 -0
  32. data/lib/aws/elb/load_balancer_policy.rb +93 -0
  33. data/lib/aws/elb/load_balancer_policy_collection.rb +208 -0
  34. data/lib/aws/elb/request.rb +23 -0
  35. data/lib/aws/iam/collection.rb +24 -26
  36. data/lib/aws/iam/group_user_collection.rb +21 -28
  37. data/lib/aws/iam/server_certificate_collection.rb +1 -37
  38. data/lib/aws/record.rb +1 -1
  39. data/lib/aws/record/base.rb +14 -1
  40. data/lib/aws/record/finder_methods.rb +4 -1
  41. data/lib/aws/record/validations.rb +73 -32
  42. data/lib/aws/{core/api_config_transform.rb → record/validators/method.rb} +9 -12
  43. data/lib/aws/s3/bucket_collection.rb +6 -4
  44. data/lib/aws/s3/client.rb +37 -6
  45. data/lib/aws/s3/config.rb +3 -1
  46. data/lib/aws/s3/prefixed_collection.rb +1 -2
  47. data/lib/aws/s3/presigned_post.rb +37 -4
  48. data/lib/aws/s3/s3_object.rb +93 -1
  49. data/lib/aws/simple_db/domain.rb +8 -0
  50. data/lib/aws/simple_db/item.rb +15 -0
  51. data/lib/aws/simple_db/item_collection.rb +255 -201
  52. data/lib/aws/simple_db/item_data.rb +1 -1
  53. data/lib/aws/simple_email_service/client.rb +0 -1
  54. data/lib/aws/sns/client.rb +0 -1
  55. metadata +107 -55
  56. data/lib/aws/core/collections.rb +0 -229
  57. data/lib/aws/simple_email_service/client/options.rb +0 -21
  58. data/lib/aws/sns/client/options.rb +0 -21
@@ -0,0 +1,89 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+ module Collection
17
+
18
+ # AWS::Core::Collection::Simple is used by collections that always
19
+ # recieve every matching items in a single response.
20
+ #
21
+ # This means:
22
+ #
23
+ # * Paging methods are simulated
24
+ #
25
+ # * Next tokens are artificial (guessable numeric offsets)
26
+ #
27
+ # AWS services generally return all items only for requests with a
28
+ # small maximum number of results.
29
+ #
30
+ # See {AWS::Core::Collection} for documentation on the available
31
+ # collection methods.
32
+ module Simple
33
+
34
+ include Model
35
+ include Enumerable
36
+ include Collection
37
+
38
+ # (see AWS::Core::Collection#each_batch)
39
+ def each_batch options = {}, &block
40
+
41
+ each_opts = options.dup
42
+ limit = each_opts.delete(:limit)
43
+ next_token = each_opts.delete(:next_token)
44
+ offset = next_token ? next_token.to_i - 1 : 0
45
+ total = 0
46
+
47
+ nil_or_next_token = nil
48
+
49
+ batch = []
50
+ _each_item(each_opts.dup) do |item|
51
+
52
+ total += 1
53
+
54
+ # skip until we reach our offset (derived from the "next token")
55
+ next if total <= offset
56
+
57
+ if limit
58
+
59
+ if batch.size < limit
60
+ batch << item
61
+ else
62
+ # allow _each_item to yield one more item than needed
63
+ # so we can determine if we should return a "next token"
64
+ nil_or_next_token = total
65
+ break
66
+ end
67
+
68
+ else
69
+ batch << item
70
+ end
71
+
72
+ end
73
+
74
+ yield(batch)
75
+
76
+ nil_or_next_token
77
+
78
+ end
79
+
80
+ protected
81
+ def _each_item options = {}, &block
82
+ raise NotImplementedError
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -102,6 +102,26 @@ module AWS
102
102
  # size (in bytes) each S3 multipart segment should be.
103
103
  # Defaults to 5242880 (5MB).
104
104
  #
105
+ # @attr_reader [Symbol] s3_server_side_encryption The algorithm to
106
+ # use when encrypting object data on the server side. The only
107
+ # valid value is +:aes256+, which specifies that the object
108
+ # should be stored using the AES encryption algorithm with 256
109
+ # bit keys. Defaults to +nil+, meaning server side encryption
110
+ # is not used unless specified on each individual call to upload
111
+ # an object. This option controls the default behavior for the
112
+ # following method:
113
+ #
114
+ # * {S3::S3Object#write}
115
+ # * {S3::S3Object#multipart_upload}
116
+ # * {S3::S3Object#copy_from} and {S3::S3Object#copy_to}
117
+ # * {S3::S3Object#presigned_post}
118
+ # * {S3::Bucket#presigned_post}
119
+ #
120
+ # You can construct an interface to Amazon S3 which always
121
+ # stores data using server side encryption as follows:
122
+ #
123
+ # s3 = AWS::S3.new(:s3_server_side_encryption => :aes256)
124
+ #
105
125
  # @attr_reader [String,nil] secret_access_key AWS secret access key
106
126
  # credential. Defaults to +nil+.
107
127
  #
@@ -306,6 +326,7 @@ module AWS
306
326
  :ssl_ca_file,
307
327
  :user_agent_prefix,
308
328
  :logger,
329
+ :logger_truncate_strings_at,
309
330
  ]
310
331
 
311
332
  add_option :"#{ruby_name}_endpoint", default_endpoint
@@ -322,6 +343,8 @@ module AWS
322
343
  add_option :http_handler, Core::Http::NetHttpHandler.new
323
344
 
324
345
  add_option :logger
346
+
347
+ add_option :logger_truncate_strings_at, 1000
325
348
 
326
349
  add_option :max_retries, 3
327
350
 
@@ -130,6 +130,8 @@ module AWS
130
130
  end
131
131
 
132
132
  end
133
+
134
+ Long = Integer
133
135
 
134
136
  # @private
135
137
  module Boolean
@@ -0,0 +1,73 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+
17
+ class PageResult < Array
18
+
19
+ # @return [Collection] Returns the collection that was used to
20
+ # populated this page of results.
21
+ attr_reader :collection
22
+
23
+ # @return [Integer] Returns the maximum number of results per page.
24
+ # The final page in a collection may return fewer than +:per_page+
25
+ # items (e.g. +:per_page+ is 10 and there are only 7 items).
26
+ attr_reader :per_page
27
+
28
+ # @return [String] An opaque token that can be passed the #page method
29
+ # of the collection that returned this page of results. This next
30
+ # token behaves as a pseudo offset. If +next_token+ is +nil+ then
31
+ # there are no more results for the collection.
32
+ attr_reader :next_token
33
+
34
+ # @param [Collection] collection The collection that was used to
35
+ # request this page of results. The collection should respond to
36
+ # #page and accept a :next_token option.
37
+ #
38
+ # @param [Array] items An array of result items that represent a
39
+ # page of results.
40
+ #
41
+ # @param [Integer] per_page The number of requested items for this
42
+ # page of results. If the count of items is smaller than +per_page+
43
+ # then this is the last page of results.
44
+ #
45
+ # @param [String] next_token (nil) A token that can be passed to the
46
+ #
47
+ def initialize collection, items, per_page, next_token
48
+ @collection = collection
49
+ @per_page = per_page
50
+ @next_token = next_token
51
+ super(items)
52
+ end
53
+
54
+ def next_page
55
+ if last_page?
56
+ raise 'unable to get the next page, already at the last page'
57
+ end
58
+ collection.page(:per_page => per_page, :next_token => next_token)
59
+ end
60
+
61
+ # @return [Boolean] Returns true if this is the last page of results.
62
+ def last_page?
63
+ next_token.nil?
64
+ end
65
+
66
+ # @return [Boolean] Returns true if there are more pages of results.
67
+ def more?
68
+ !!next_token
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -30,9 +30,10 @@ module AWS
30
30
  class SecurityGroup < Resource
31
31
 
32
32
  AWS.register_autoloads(self, 'aws/ec2/security_group') do
33
- autoload :IpPermission, 'ip_permission'
34
- autoload :IpPermissionCollection, 'ip_permission_collection'
35
- autoload :EgressIpPermissionCollection, 'egress_ip_permission_collection'
33
+ autoload :IpPermission, 'ip_permission'
34
+ autoload :IpPermissionCollection, 'ingress_ip_permission_collection'
35
+ autoload :IngressIpPermissionCollection, 'ingress_ip_permission_collection'
36
+ autoload :EgressIpPermissionCollection, 'egress_ip_permission_collection'
36
37
  end
37
38
 
38
39
  include TaggedItem
@@ -79,12 +80,12 @@ module AWS
79
80
  vpc_id ? true : false
80
81
  end
81
82
 
82
- # @return [SecurityGroup::IpPermissionCollection] Returns a
83
+ # @return [SecurityGroup::IngressIpPermissionCollection] Returns a
83
84
  # collection of {IpPermission} objects that represents all of
84
85
  # the (ingress) permissions this security group has
85
86
  # authorizations for.
86
87
  def ingress_ip_permissions
87
- IpPermissionCollection.new(self, :config => config)
88
+ IngressIpPermissionCollection.new(self, :config => config)
88
89
  end
89
90
  alias_method :ip_permissions, :ingress_ip_permissions
90
91
 
@@ -105,8 +106,9 @@ module AWS
105
106
  #
106
107
  # @param [String] ip_ranges One or more IP ranges to allow ping from.
107
108
  # Defaults to 0.0.0.0/0
108
- # @return [IpPermission] Returns an IpPermission object that was added
109
- # to this security group.
109
+ #
110
+ # @return [nil]
111
+ #
110
112
  def allow_ping *sources
111
113
  sources << '0.0.0.0/0' if sources.empty?
112
114
  authorize_ingress('icmp', -1, *sources)
@@ -117,8 +119,9 @@ module AWS
117
119
  #
118
120
  # @param [String] ip_ranges One or more IP ranges to allow ping from.
119
121
  # Defaults to 0.0.0.0/0
120
- # @return [IpPermission] Returns an IpPermission object that was added
121
- # to this security group.
122
+ #
123
+ # @return [nil]
124
+ #
122
125
  def disallow_ping *sources
123
126
  sources << '0.0.0.0/0' if sources.empty?
124
127
  revoke_ingress('icmp', -1, *sources)
@@ -138,25 +141,67 @@ module AWS
138
141
  # # ftp
139
142
  # security_group.authorize_ingress(:tcp, 20..21)
140
143
  #
144
+ # == Sources
145
+ #
146
+ # Security groups accept ingress trafic from:
147
+ #
148
+ # * CIDR IP addresses
149
+ # * security groups
150
+ # * load balancers
151
+ #
152
+ # === Ip Addresses
153
+ #
141
154
  # In the following example allow incoming SSH from a list of
142
- # IP address.
155
+ # IP address ranges.
143
156
  #
144
157
  # security_group.authorize_ingress(:tcp, 22,
145
158
  # '111.111.111.111/0', '222.222.222.222/0')
146
159
  #
147
- # You can also pass another security group as an ingress source.
148
- # Allows traffic through that originates from EC2 instances inside
149
- # the given security group.
160
+ # === Security Groups
161
+ #
162
+ # To autohrize ingress traffic from all EC2 instance in another
163
+ # security group, just pass the security group:
150
164
  #
151
165
  # web = security_groups.create('webservers')
152
166
  # db = security_groups.create('database')
153
- #
154
- # # allows ec2 instances in the webservers security group to make
155
- # # tcp requests via port 3306 to instances in the database
156
- # # security group
157
167
  # db.authorize_ingress(:tcp, 3306, web)
158
168
  #
159
- # You can even mix and match IP address and security group sources.
169
+ # You can also pass a hash of security group details instead of
170
+ # a {SecurityGroup} object.
171
+ #
172
+ # # by security group name
173
+ # sg.authorize_ingress(:tcp, 80, { :group_name => 'other-group' })
174
+ #
175
+ # # by security group id
176
+ # sg.authorize_ingress(:tcp, 80, { :group_id => 'sg-1234567' })
177
+ #
178
+ # If the security group belongs to a different account, just make
179
+ # sure it has the correct owner ID populated:
180
+ #
181
+ # not_my_sg = SecurityGroup.new('sg-1234567', :owner_id => 'abcxyz123')
182
+ # my_sg.authorize_ingress(:tcp, 80, not_my_sg)
183
+ #
184
+ # You can do the same with a hash as well (with either +:group_id+
185
+ # or +:group_name+):
186
+ #
187
+ # sg.authorize_ingress(:tcp, 21..22, { :group_id => 'sg-id', :user_id => 'abcxyz123' })
188
+ #
189
+ # === Load Balancers
190
+ #
191
+ # If you use ELB to manage load balancers, then you need to add
192
+ # ingress permissions to the security groups they route traffic into.
193
+ # You can do this by passing the {LoadBalancer} into authorize_ingress:
194
+ #
195
+ # load_balancer = AWS::ELB.new.load_balancers['web-load-balancer']
196
+ #
197
+ # sg.authorize_ingress(:tcp, 80, load_balancer)
198
+ #
199
+ # === Multiple Sources
200
+ #
201
+ # You can provide multiple sources each time you call authorize
202
+ # ingress, and you can mix and match the source types:
203
+ #
204
+ # sg.authorize_ingress(:tcp, 80, other_sg, '1.2.3.4/0', load_balancer)
160
205
  #
161
206
  # @param [String, Symbol] protocol Should be :tcp, :udp or :icmp
162
207
  # or the string equivalent.
@@ -166,35 +211,38 @@ module AWS
166
211
  # or a range (like 20..21).
167
212
  #
168
213
  # @param [Mixed] sources One or more CIDR IP addresses,
169
- # security groups, or hashes. Hash values should
170
- # have :group_id and :user_id keys/values. This is useful
171
- # for when the security group belongs to another account. The
172
- # user id should be the owner_id (account id) of the security
173
- # group.
214
+ # security groups, or load balancers. Security groups
215
+ # can be specified as hashes.
216
+ #
217
+ # A security group hash must provide either +:group_id+ or
218
+ # +:group_name+ for the security group. If the security group
219
+ # does not belong to you aws account then you must also
220
+ # provide +:user_id+ (which can be an AWS account ID or alias).
174
221
  #
175
- # @return [IpPermission] Returns an IpPermission object that was added
176
- # to this security group.
222
+ # @return [nil]
177
223
  #
178
224
  def authorize_ingress protocol, ports, *sources
179
- parse_ingress_sources(sources) do |options|
180
- permission = IpPermission.new(self, protocol, ports, options)
181
- permission.authorize
182
- permission
183
- end
225
+ client.authorize_security_group_ingress(
226
+ :group_id => id,
227
+ :ip_permissions => [ingress_opts(protocol, ports, sources)]
228
+ )
229
+ nil
184
230
  end
185
231
 
186
232
  # Revokes an ingress (inbound) ip permission. This is the inverse
187
233
  # operation to {#authorize_ingress}. See {#authorize_ingress}
188
234
  # for param and option documentation.
235
+ #
189
236
  # @see #authorize_ingress
190
- # @return [IpPermission] Returns an IpPermission object that was added
191
- # to this security group.
237
+ #
238
+ # @return [nil]
239
+ #
192
240
  def revoke_ingress protocol, ports, *sources
193
- parse_ingress_sources(sources) do |options|
194
- permission = IpPermission.new(self, protocol, ports, options)
195
- permission.revoke
196
- permission
197
- end
241
+ client.revoke_security_group_ingress(
242
+ :group_id => id,
243
+ :ip_permissions => [ingress_opts(protocol, ports, sources)]
244
+ )
245
+ nil
198
246
  end
199
247
 
200
248
  # Authorize egress (outbound) traffic for a VPC security group.
@@ -209,44 +257,43 @@ module AWS
209
257
  # @note Calling this method on a non-VPC security group raises an error.
210
258
  #
211
259
  # @overload authorize_egress(*sources, options = {})
260
+ #
212
261
  # @param [Mixed] sources One or more CIDR IP addresses,
213
- # security groups, or hashes. Hash values should
214
- # have :group_id and :user_id keys/values. This is useful
215
- # for when the security group belongs to another account. The
216
- # user id should be the owner_id (account id) of the security
217
- # group.
262
+ # security groups or load balancers. See {#authorize_ingress}
263
+ # for more information on accepted formats for sources.
264
+ #
218
265
  # @param [Hash] options
219
- # @option options [Symbol] :protocol (:any) The protocol to authorize
220
- # traffic for. If this option is ommitted, all protocols are
221
- # allowed. Defaults to the symbol +:any+. For a complete list of
222
- # supported protocols, see
266
+ #
267
+ # @option options [Symbol] :protocol (:any) The protocol name or number
268
+ # to authorize egress traffic for. For a complete list of protocols
269
+ # see: {http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml}
270
+ #
223
271
  # @option options [Range<Integer>,Integer] :ports (nil) An optional
224
272
  # port or range of ports. This option is required depending on
225
- # the protocal.
226
- #
227
- # @param
228
- # @return [IpPermission] Returns an IpPermission object that was added
229
- # to this security group.
230
- def authorize_egress *args
231
- parse_egress_args(*args) do |protocol, ports, options|
232
- permission = IpPermission.new(self, protocol, ports, options)
233
- permission.authorize
234
- permission
235
- end
273
+ # the protocol.
274
+ #
275
+ # @return [nil]
276
+ #
277
+ def authorize_egress *sources
278
+ client.authorize_security_group_egress(
279
+ :group_id => id,
280
+ :ip_permissions => [egress_opts(sources)])
281
+ nil
236
282
  end
237
283
 
238
284
  # Revokes an egress (outound) ip permission. This is the inverse
239
285
  # operation to {#authorize_egress}. See {#authorize_egress}
240
286
  # for param and option documentation.
287
+ #
241
288
  # @see #authorize_egress
242
- # @return [IpPermission] Returns an IpPermission object that was added
243
- # to this security group.
244
- def revoke_egress *args
245
- parse_egress_args(*args) do |protocol, ports, options|
246
- permission = IpPermission.new(self, protocol, ports, options)
247
- permission.revoke
248
- permission
249
- end
289
+ #
290
+ # @return [nil]
291
+ #
292
+ def revoke_egress *sources
293
+ client.revoke_security_group_egress(
294
+ :group_id => id,
295
+ :ip_permissions => [egress_opts(sources)])
296
+ nil
250
297
  end
251
298
 
252
299
  # Deletes this security group.
@@ -281,22 +328,25 @@ module AWS
281
328
 
282
329
  # @private
283
330
  protected
284
- def parse_ingress_sources sources
331
+ def ingress_opts protocol, ports, sources
332
+
333
+ opts = {}
334
+ opts[:ip_protocol] = protocol.to_s.downcase
335
+ opts[:from_port] = Array(ports).first.to_i
336
+ opts[:to_port] = Array(ports).last.to_i
285
337
 
286
338
  ips, groups = parse_sources(sources)
287
339
 
288
- options = {}
289
- options[:ip_ranges] = ips unless ips.empty?
290
- options[:groups] = groups unless groups.empty?
291
- options[:egress] = false
340
+ opts[:ip_ranges] = ips unless ips.empty?
341
+ opts[:user_id_group_pairs] = groups unless groups.empty?
292
342
 
293
- yield(options)
343
+ opts
294
344
 
295
345
  end
296
346
 
297
347
  # @private
298
348
  protected
299
- def parse_egress_args *args, &block
349
+ def egress_opts args
300
350
  ensure_vpc do
301
351
 
302
352
  last = args.last
@@ -312,17 +362,22 @@ module AWS
312
362
  options = {}
313
363
  end
314
364
 
315
- protocol = options[:protocol] || :any
365
+ opts = {}
366
+
367
+ opts[:ip_protocol] = [nil,:any, '-1'].include?(options[:protocol]) ?
368
+ '-1' : options[:protocol].to_s.downcase
316
369
 
317
- ports = options[:ports]
370
+ if options[:ports]
371
+ opts[:from_port] = Array(options[:ports]).first.to_i
372
+ opts[:to_port] = Array(options[:ports]).last.to_i
373
+ end
318
374
 
319
375
  ips, groups = parse_sources(args)
320
376
 
321
- options[:ip_ranges] = ips unless ips.empty?
322
- options[:groups] = groups unless groups.empty?
323
- options[:egress] = true
377
+ opts[:ip_ranges] = ips unless ips.empty?
378
+ opts[:user_id_group_pairs] = groups unless groups.empty?
324
379
 
325
- yield(protocol, ports, options)
380
+ opts
326
381
 
327
382
  end
328
383
  end
@@ -336,29 +391,39 @@ module AWS
336
391
 
337
392
  sources.each do |source|
338
393
  case source
339
- when String then ips << source
340
- when SecurityGroup then groups << source
341
- when Hash
342
- if source.has_key?(:group_id) and source.has_key?(:user_id)
343
394
 
344
- group = SecurityGroup.new(source[:group_id],
345
- :owner_id => source[:user_id],
346
- :config => config)
395
+ when String
396
+ ips << { :cidr_ip => source }
397
+
398
+ when SecurityGroup
399
+ groups << { :group_id => source.id, :user_id => source.owner_id }
347
400
 
348
- groups << group
401
+ when ELB::LoadBalancer
402
+ groups << source.source_security_group
349
403
 
350
- else
404
+ when Hash
405
+
406
+ # group name or id required
407
+ unless source.has_key?(:group_id) or source.has_key?(:group_name)
351
408
  raise ArgumentError, 'invalid ip permission hash, ' +
352
- 'must provide :group_id and :user_id'
409
+ 'must provide :group_id or :group_name'
353
410
  end
354
411
 
412
+ # prevent typos
413
+ unless source.keys - [:group_id, :group_name, :user_id] == []
414
+ raise ArgumentError, 'invalid ip permission hash, ' +
415
+ 'only accepts the following keys, :group_id, :group_name, :user_id'
416
+ end
417
+
418
+ groups << source
419
+
355
420
  else
356
421
  raise ArgumentError, 'invalid ingress ip permission, ' +
357
422
  'expected CIDR IP addres or SecurityGroup'
358
423
  end
359
424
  end
360
425
 
361
- ips << '0.0.0.0/0' if ips.empty? and groups.empty?
426
+ ips << { :cidr_ip => '0.0.0.0/0' } if ips.empty? and groups.empty?
362
427
 
363
428
  [ips, groups]
364
429