aws-sdk 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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