aws-sdk 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. data/ca-bundle.crt +2 -348
  2. data/lib/aws.rb +24 -49
  3. data/lib/aws/{common.rb → core.rb} +120 -9
  4. data/lib/aws/{api_config.rb → core/api_config.rb} +19 -20
  5. data/lib/aws/core/api_config_transform.rb +36 -0
  6. data/lib/aws/core/async_handle.rb +91 -0
  7. data/lib/aws/core/authorize_v2.rb +39 -0
  8. data/lib/aws/{authorize_v3.rb → core/authorize_v3.rb} +16 -15
  9. data/lib/aws/{api_config_transform.rb → core/authorize_with_session_token.rb} +9 -12
  10. data/lib/aws/core/autoloader.rb +64 -0
  11. data/lib/aws/core/cacheable.rb +78 -0
  12. data/lib/aws/core/client.rb +471 -0
  13. data/lib/aws/core/client_logging.rb +125 -0
  14. data/lib/aws/core/collections.rb +229 -0
  15. data/lib/aws/core/configuration.rb +358 -0
  16. data/lib/aws/core/configured_client_methods.rb +76 -0
  17. data/lib/aws/core/configured_grammars.rb +63 -0
  18. data/lib/aws/{configured_option_grammars.rb → core/configured_option_grammars.rb} +18 -20
  19. data/lib/aws/{configured_xml_grammars.rb → core/configured_xml_grammars.rb} +19 -21
  20. data/lib/aws/core/default_signer.rb +67 -0
  21. data/lib/aws/core/http/curb_handler.rb +129 -0
  22. data/lib/aws/core/http/handler.rb +77 -0
  23. data/lib/aws/core/http/httparty_handler.rb +113 -0
  24. data/lib/aws/core/http/net_http_handler.rb +124 -0
  25. data/lib/aws/core/http/request.rb +207 -0
  26. data/lib/aws/core/http/response.rb +73 -0
  27. data/lib/aws/{ignore_result_element.rb → core/ignore_result_element.rb} +14 -18
  28. data/lib/aws/core/indifferent_hash.rb +88 -0
  29. data/lib/aws/core/inflection.rb +47 -0
  30. data/lib/aws/core/lazy_error_classes.rb +62 -0
  31. data/lib/aws/{uri_escape.rb → core/meta_utils.rb} +24 -23
  32. data/lib/aws/core/model.rb +57 -0
  33. data/lib/aws/{authorize_with_session_token.rb → core/naming.rb} +9 -8
  34. data/lib/aws/core/option_grammar.rb +562 -0
  35. data/lib/aws/core/policy.rb +914 -0
  36. data/lib/aws/core/resource.rb +380 -0
  37. data/lib/aws/core/resource_cache.rb +40 -0
  38. data/lib/aws/core/response.rb +125 -0
  39. data/lib/aws/core/response_cache.rb +50 -0
  40. data/lib/aws/core/service_interface.rb +60 -0
  41. data/lib/aws/core/uri_escape.rb +46 -0
  42. data/lib/aws/core/xml_grammar.rb +926 -0
  43. data/lib/aws/ec2.rb +47 -16
  44. data/lib/aws/ec2/attachment.rb +0 -2
  45. data/lib/aws/ec2/attachment_collection.rb +1 -6
  46. data/lib/aws/ec2/availability_zone.rb +0 -2
  47. data/lib/aws/ec2/availability_zone_collection.rb +0 -3
  48. data/lib/aws/ec2/client.rb +6 -9
  49. data/lib/aws/ec2/client/xml.rb +3 -6
  50. data/lib/aws/ec2/collection.rb +1 -4
  51. data/lib/aws/ec2/config.rb +18 -0
  52. data/lib/aws/ec2/elastic_ip.rb +0 -2
  53. data/lib/aws/ec2/elastic_ip_collection.rb +0 -4
  54. data/lib/aws/ec2/errors.rb +1 -4
  55. data/lib/aws/ec2/has_permissions.rb +0 -2
  56. data/lib/aws/ec2/image.rb +0 -5
  57. data/lib/aws/ec2/image_collection.rb +0 -6
  58. data/lib/aws/ec2/instance.rb +23 -9
  59. data/lib/aws/ec2/instance_collection.rb +85 -22
  60. data/lib/aws/ec2/key_pair.rb +0 -2
  61. data/lib/aws/ec2/key_pair_collection.rb +1 -4
  62. data/lib/aws/ec2/permission_collection.rb +2 -5
  63. data/lib/aws/ec2/region.rb +0 -2
  64. data/lib/aws/ec2/region_collection.rb +0 -4
  65. data/lib/aws/ec2/request.rb +4 -9
  66. data/lib/aws/ec2/reserved_instances.rb +0 -3
  67. data/lib/aws/ec2/reserved_instances_collection.rb +0 -4
  68. data/lib/aws/ec2/reserved_instances_offering.rb +0 -3
  69. data/lib/aws/ec2/reserved_instances_offering_collection.rb +0 -4
  70. data/lib/aws/ec2/resource.rb +3 -5
  71. data/lib/aws/ec2/resource_tag_collection.rb +1 -6
  72. data/lib/aws/ec2/security_group.rb +204 -72
  73. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +53 -0
  74. data/lib/aws/ec2/security_group/ip_permission.rb +92 -10
  75. data/lib/aws/ec2/security_group/ip_permission_collection.rb +14 -15
  76. data/lib/aws/ec2/security_group_collection.rb +11 -8
  77. data/lib/aws/ec2/snapshot.rb +0 -4
  78. data/lib/aws/ec2/snapshot_collection.rb +0 -4
  79. data/lib/aws/ec2/tag.rb +0 -3
  80. data/lib/aws/ec2/tag_collection.rb +1 -8
  81. data/lib/aws/ec2/tagged_item.rb +1 -3
  82. data/lib/aws/ec2/volume.rb +0 -6
  83. data/lib/aws/ec2/volume_collection.rb +0 -4
  84. data/lib/aws/errors.rb +0 -3
  85. data/lib/aws/iam.rb +33 -12
  86. data/lib/aws/iam/access_key.rb +0 -3
  87. data/lib/aws/iam/access_key_collection.rb +0 -3
  88. data/lib/aws/iam/account_alias_collection.rb +0 -2
  89. data/lib/aws/iam/client.rb +6 -8
  90. data/lib/aws/iam/client/xml.rb +4 -8
  91. data/lib/aws/iam/collection.rb +2 -5
  92. data/lib/aws/iam/config.rb +18 -0
  93. data/lib/aws/iam/errors.rb +2 -4
  94. data/lib/aws/iam/group.rb +0 -5
  95. data/lib/aws/iam/group_collection.rb +0 -3
  96. data/lib/aws/iam/group_policy_collection.rb +0 -2
  97. data/lib/aws/iam/group_user_collection.rb +1 -4
  98. data/lib/aws/iam/login_profile.rb +0 -2
  99. data/lib/aws/iam/mfa_device.rb +1 -3
  100. data/lib/aws/iam/mfa_device_collection.rb +0 -3
  101. data/lib/aws/iam/policy.rb +2 -4
  102. data/lib/aws/iam/policy_collection.rb +0 -3
  103. data/lib/aws/iam/request.rb +3 -7
  104. data/lib/aws/iam/resource.rb +1 -4
  105. data/lib/aws/iam/server_certificate.rb +0 -2
  106. data/lib/aws/iam/server_certificate_collection.rb +0 -3
  107. data/lib/aws/iam/signing_certificate.rb +0 -2
  108. data/lib/aws/iam/signing_certificate_collection.rb +0 -3
  109. data/lib/aws/iam/user.rb +0 -7
  110. data/lib/aws/iam/user_collection.rb +0 -3
  111. data/lib/aws/iam/user_group_collection.rb +0 -3
  112. data/lib/aws/iam/user_policy.rb +0 -2
  113. data/lib/aws/iam/user_policy_collection.rb +0 -3
  114. data/lib/aws/rails.rb +5 -4
  115. data/lib/aws/record.rb +4 -1
  116. data/lib/aws/record/base.rb +3 -2
  117. data/lib/aws/record/errors.rb +1 -3
  118. data/lib/aws/s3.rb +31 -6
  119. data/lib/aws/s3/access_control_list.rb +0 -2
  120. data/lib/aws/s3/acl_object.rb +10 -12
  121. data/lib/aws/s3/bucket.rb +1 -9
  122. data/lib/aws/s3/bucket_collection.rb +2 -5
  123. data/lib/aws/s3/bucket_version_collection.rb +1 -5
  124. data/lib/aws/s3/client.rb +34 -37
  125. data/lib/aws/s3/client/xml.rb +11 -14
  126. data/lib/aws/{resource_cache.rb → s3/config.rb} +6 -20
  127. data/lib/aws/s3/errors.rb +6 -7
  128. data/lib/aws/s3/multipart_upload.rb +1 -4
  129. data/lib/aws/s3/multipart_upload_collection.rb +1 -6
  130. data/lib/aws/s3/object_collection.rb +1 -5
  131. data/lib/aws/s3/object_metadata.rb +1 -3
  132. data/lib/aws/s3/object_upload_collection.rb +1 -7
  133. data/lib/aws/s3/object_version.rb +1 -4
  134. data/lib/aws/s3/object_version_collection.rb +1 -4
  135. data/lib/aws/s3/policy.rb +3 -5
  136. data/lib/aws/s3/prefix_and_delimiter_collection.rb +0 -2
  137. data/lib/aws/s3/prefixed_collection.rb +0 -2
  138. data/lib/aws/s3/presigned_post.rb +1 -3
  139. data/lib/aws/s3/request.rb +2 -5
  140. data/lib/aws/s3/s3_object.rb +1 -8
  141. data/lib/aws/s3/tree.rb +8 -6
  142. data/lib/aws/s3/tree/branch_node.rb +0 -3
  143. data/lib/aws/s3/tree/child_collection.rb +1 -5
  144. data/lib/aws/s3/tree/leaf_node.rb +0 -5
  145. data/lib/aws/s3/tree/parent.rb +1 -4
  146. data/lib/aws/s3/uploaded_part.rb +1 -3
  147. data/lib/aws/s3/uploaded_part_collection.rb +1 -5
  148. data/lib/aws/simple_db.rb +21 -6
  149. data/lib/aws/simple_db/attribute.rb +1 -6
  150. data/lib/aws/simple_db/attribute_collection.rb +1 -7
  151. data/lib/aws/simple_db/client.rb +7 -9
  152. data/lib/aws/simple_db/client/options.rb +2 -4
  153. data/lib/aws/simple_db/client/xml.rb +5 -10
  154. data/lib/aws/{naming.rb → simple_db/config.rb} +3 -14
  155. data/lib/aws/simple_db/delete_attributes.rb +0 -2
  156. data/lib/aws/simple_db/domain.rb +1 -6
  157. data/lib/aws/simple_db/domain_collection.rb +1 -4
  158. data/lib/aws/simple_db/domain_metadata.rb +1 -3
  159. data/lib/aws/simple_db/errors.rb +1 -4
  160. data/lib/aws/simple_db/item.rb +1 -7
  161. data/lib/aws/simple_db/item_collection.rb +22 -23
  162. data/lib/aws/simple_db/put_attributes.rb +0 -2
  163. data/lib/aws/simple_db/request.rb +3 -7
  164. data/lib/aws/simple_email_service.rb +11 -6
  165. data/lib/aws/simple_email_service/client.rb +7 -9
  166. data/lib/aws/simple_email_service/client/options.rb +3 -6
  167. data/lib/aws/simple_email_service/client/xml.rb +4 -8
  168. data/lib/aws/simple_email_service/config.rb +19 -0
  169. data/lib/aws/simple_email_service/email_address_collection.rb +1 -3
  170. data/lib/aws/simple_email_service/errors.rb +1 -4
  171. data/lib/aws/simple_email_service/quotas.rb +1 -3
  172. data/lib/aws/simple_email_service/request.rb +3 -7
  173. data/lib/aws/sns.rb +15 -8
  174. data/lib/aws/sns/client.rb +7 -8
  175. data/lib/aws/sns/client/options.rb +3 -6
  176. data/lib/aws/sns/client/xml.rb +4 -8
  177. data/lib/aws/sns/config.rb +18 -0
  178. data/lib/aws/sns/errors.rb +1 -4
  179. data/lib/aws/sns/policy.rb +3 -5
  180. data/lib/aws/sns/request.rb +4 -9
  181. data/lib/aws/sns/subscription.rb +1 -5
  182. data/lib/aws/sns/subscription_collection.rb +1 -5
  183. data/lib/aws/sns/topic.rb +1 -6
  184. data/lib/aws/sns/topic_collection.rb +1 -4
  185. data/lib/aws/sns/topic_subscription_collection.rb +1 -4
  186. data/lib/aws/sqs.rb +14 -5
  187. data/lib/aws/sqs/client.rb +6 -9
  188. data/lib/aws/sqs/client/xml.rb +4 -7
  189. data/lib/aws/sqs/config.rb +18 -0
  190. data/lib/aws/sqs/errors.rb +1 -4
  191. data/lib/aws/sqs/policy.rb +3 -5
  192. data/lib/aws/sqs/queue.rb +2 -7
  193. data/lib/aws/sqs/queue_collection.rb +4 -5
  194. data/lib/aws/sqs/received_message.rb +1 -3
  195. data/lib/aws/sqs/received_sns_message.rb +2 -2
  196. data/lib/aws/sqs/request.rb +4 -7
  197. data/lib/aws/sts.rb +12 -6
  198. data/lib/aws/sts/client.rb +6 -8
  199. data/lib/aws/sts/client/xml.rb +4 -8
  200. data/lib/aws/sts/config.rb +18 -0
  201. data/lib/aws/sts/errors.rb +1 -4
  202. data/lib/aws/sts/federated_session.rb +0 -2
  203. data/lib/aws/sts/policy.rb +3 -5
  204. data/lib/aws/sts/request.rb +3 -7
  205. metadata +60 -50
  206. data/lib/aws/async_handle.rb +0 -90
  207. data/lib/aws/authorize_v2.rb +0 -37
  208. data/lib/aws/base_client.rb +0 -488
  209. data/lib/aws/cacheable.rb +0 -79
  210. data/lib/aws/client_logging.rb +0 -122
  211. data/lib/aws/collections.rb +0 -230
  212. data/lib/aws/configuration.rb +0 -357
  213. data/lib/aws/configured_client_methods.rb +0 -81
  214. data/lib/aws/configured_grammars.rb +0 -65
  215. data/lib/aws/default_signer.rb +0 -65
  216. data/lib/aws/http/curb_handler.rb +0 -127
  217. data/lib/aws/http/handler.rb +0 -77
  218. data/lib/aws/http/httparty_handler.rb +0 -103
  219. data/lib/aws/http/request.rb +0 -165
  220. data/lib/aws/http/request_param.rb +0 -64
  221. data/lib/aws/http/response.rb +0 -72
  222. data/lib/aws/indifferent_hash.rb +0 -86
  223. data/lib/aws/inflection.rb +0 -46
  224. data/lib/aws/lazy_error_classes.rb +0 -64
  225. data/lib/aws/meta_utils.rb +0 -43
  226. data/lib/aws/model.rb +0 -57
  227. data/lib/aws/option_grammar.rb +0 -565
  228. data/lib/aws/policy.rb +0 -914
  229. data/lib/aws/resource.rb +0 -381
  230. data/lib/aws/response.rb +0 -125
  231. data/lib/aws/response_cache.rb +0 -50
  232. data/lib/aws/service_interface.rb +0 -60
  233. data/lib/aws/xml_grammar.rb +0 -925
@@ -11,8 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/resource'
15
-
16
14
  module AWS
17
15
  class EC2
18
16
 
@@ -11,11 +11,8 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/model'
15
- require 'aws/ec2/collection'
16
- require 'aws/ec2/key_pair'
17
- require 'digest/md5'
18
14
  require 'base64'
15
+ require 'digest/md5'
19
16
 
20
17
  module AWS
21
18
  class EC2
@@ -11,9 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/model'
15
- require 'aws/inflection'
16
-
17
14
  module AWS
18
15
  class EC2
19
16
 
@@ -24,7 +21,7 @@ module AWS
24
21
  # that use this interface.
25
22
  class PermissionCollection
26
23
 
27
- include Model
24
+ include Core::Model
28
25
  include Enumerable
29
26
 
30
27
  # @private
@@ -137,7 +134,7 @@ module AWS
137
134
  # @private
138
135
  private
139
136
  def inflected_permissions_attribute
140
- Inflection.ruby_name(permissions_attribute).to_sym
137
+ Core::Inflection.ruby_name(permissions_attribute).to_sym
141
138
  end
142
139
 
143
140
  # @private
@@ -11,8 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/resource'
15
-
16
14
  module AWS
17
15
  class EC2
18
16
 
@@ -11,10 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/model'
15
- require 'aws/ec2/collection'
16
- require 'aws/ec2/region'
17
-
18
14
  module AWS
19
15
  class EC2
20
16
 
@@ -11,19 +11,14 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/http/request'
15
- require 'aws/authorize_v2'
16
- require 'aws/authorize_with_session_token'
17
-
18
14
  module AWS
19
15
  class EC2
20
16
 
21
17
  # @private
22
- class Request < AWS::Http::Request
23
-
24
- include AuthorizeV2
25
- include AuthorizeWithSessionToken
26
-
18
+ class Request < Core::Http::Request
19
+ include Core::AuthorizeV2
20
+ include Core::AuthorizeWithSessionToken
27
21
  end
22
+
28
23
  end
29
24
  end
@@ -11,9 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/resource'
15
- require 'aws/ec2/tagged_item'
16
-
17
14
  module AWS
18
15
  class EC2
19
16
  class ReservedInstances < Resource
@@ -11,10 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/collection'
15
- require 'aws/ec2/reserved_instances'
16
- require 'aws/ec2/tagged_collection'
17
-
18
14
  module AWS
19
15
  class EC2
20
16
  class ReservedInstancesCollection < Collection
@@ -11,9 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/resource'
15
- require 'aws/ec2/tagged_item'
16
-
17
14
  module AWS
18
15
  class EC2
19
16
  class ReservedInstancesOffering < Resource
@@ -11,10 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/collection'
15
- require 'aws/ec2/tagged_collection'
16
- require 'aws/ec2/reserved_instances_offering'
17
-
18
14
  module AWS
19
15
  class EC2
20
16
  class ReservedInstancesOfferingCollection < Collection
@@ -11,13 +11,11 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/resource'
15
-
16
14
  module AWS
17
15
  class EC2
18
16
 
19
17
  # @private
20
- class Resource < AWS::Resource
18
+ class Resource < Core::Resource
21
19
 
22
20
  # @private
23
21
  protected
@@ -78,7 +76,7 @@ module AWS
78
76
  def describe_attribute_call(attribute)
79
77
  name = describe_attribute_call_name
80
78
 
81
- attr_opt_name = Inflection.class_name(attribute.get_as.to_s)
79
+ attr_opt_name = Core::Inflection.class_name(attribute.get_as.to_s)
82
80
  attr_opt_name = attr_opt_name[0,1].downcase + attr_opt_name[1..-1]
83
81
 
84
82
  client.send(name, Hash[[[response_id_method.to_sym,
@@ -119,7 +117,7 @@ module AWS
119
117
 
120
118
  protected
121
119
  def inflected_name
122
- Inflection.ruby_name(class_name)
120
+ Core::Inflection.ruby_name(class_name)
123
121
  end
124
122
 
125
123
  protected
@@ -11,11 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/model'
15
- require 'aws/inflection'
16
- require 'aws/ec2/resource'
17
- require 'aws/ec2/tag'
18
-
19
14
  module AWS
20
15
  class EC2
21
16
 
@@ -29,7 +24,7 @@ module AWS
29
24
  # i.tags.stage # => "production"
30
25
  class ResourceTagCollection
31
26
 
32
- include Model
27
+ include Core::Model
33
28
  include Enumerable
34
29
 
35
30
  # @private
@@ -11,11 +11,6 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'aws/ec2/resource'
15
- require 'aws/ec2/tagged_item'
16
- require 'aws/ec2/security_group/ip_permission'
17
- require 'aws/ec2/security_group/ip_permission_collection'
18
-
19
14
  module AWS
20
15
  class EC2
21
16
 
@@ -28,19 +23,26 @@ module AWS
28
23
  #
29
24
  # @attr_reader [String] owner_id The security group owner's id.
30
25
  #
26
+ # @attr_reader [String,nil] vpc_id If this is a VPC security group,
27
+ # vpc_id is the ID of the VPC this group was created in.
28
+ # Returns false otherwise.
29
+ #
31
30
  class SecurityGroup < Resource
32
31
 
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'
36
+ end
37
+
33
38
  include TaggedItem
34
39
 
35
40
  def initialize id, options = {}
36
41
  @id = id
37
- @name = options[:name]
38
- @description = options[:description]
39
- @owner_id = options[:owner_id]
40
42
  super
41
43
  end
42
44
 
43
- # @return [String] The id of the security group.
45
+ # @return [String] The ID of the security group.
44
46
  attr_reader :id
45
47
 
46
48
  alias_method :group_id, :id
@@ -49,10 +51,14 @@ module AWS
49
51
 
50
52
  attribute :owner_id, :static => true
51
53
 
54
+ attribute :vpc_id, :static => true
55
+
52
56
  attribute :description, :as => :group_description, :static => true
53
57
 
54
58
  attribute :ip_permissions_list, :as => :ip_permissions
55
59
 
60
+ attribute :ip_permissions_list_egress, :as => :ip_permissions_egress
61
+
56
62
  populates_from(:describe_security_groups) do |resp|
57
63
  resp.security_group_index[id]
58
64
  end
@@ -64,12 +70,30 @@ module AWS
64
70
  ]).security_group_index.key?(id)
65
71
  end
66
72
 
73
+ # Returns true if this security group is a VPC security group and
74
+ # not an EC2 security group. VPC security groups belong to a VPC
75
+ # subnet and can have egress rules.
76
+ # @return [Boolean] Returns true if this is a VPC security group and
77
+ # false if this is an EC2 security group.
78
+ def vpc?
79
+ vpc_id ? true : false
80
+ end
81
+
67
82
  # @return [SecurityGroup::IpPermissionCollection] Returns a
68
83
  # collection of {IpPermission} objects that represents all of
69
- # the permissions this security group has authorizations for.
70
- def ip_permissions
84
+ # the (ingress) permissions this security group has
85
+ # authorizations for.
86
+ def ingress_ip_permissions
71
87
  IpPermissionCollection.new(self, :config => config)
72
88
  end
89
+ alias_method :ip_permissions, :ingress_ip_permissions
90
+
91
+ # @return [SecurityGroup::EgressIpPermissionCollection] Returns a
92
+ # collection of {IpPermission} objects that represents all of
93
+ # the egress permissions this security group has authorizations for.
94
+ def egress_ip_permissions
95
+ EgressIpPermissionCollection.new(self, :config => config)
96
+ end
73
97
 
74
98
  # Adds ingress rules for ICMP pings. Defaults to 0.0.0.0/0 for
75
99
  # the list of allowed IP ranges the ping can come from.
@@ -81,6 +105,8 @@ module AWS
81
105
  #
82
106
  # @param [String] ip_ranges One or more IP ranges to allow ping from.
83
107
  # Defaults to 0.0.0.0/0
108
+ # @return [IpPermission] Returns an IpPermission object that was added
109
+ # to this security group.
84
110
  def allow_ping *sources
85
111
  sources << '0.0.0.0/0' if sources.empty?
86
112
  authorize_ingress('icmp', -1, *sources)
@@ -91,48 +117,52 @@ module AWS
91
117
  #
92
118
  # @param [String] ip_ranges One or more IP ranges to allow ping from.
93
119
  # Defaults to 0.0.0.0/0
120
+ # @return [IpPermission] Returns an IpPermission object that was added
121
+ # to this security group.
94
122
  def disallow_ping *sources
95
123
  sources << '0.0.0.0/0' if sources.empty?
96
124
  revoke_ingress('icmp', -1, *sources)
97
125
  end
98
126
 
99
- # Adds an ingress rules to a security group.
100
- #
101
- # Each ingress exception is comprised of a protocol a port range
102
- # and a list of sources.
103
- #
127
+ # Add an ingress rules to this security group.
128
+ # Ingress rules permit inbound traffic over a given protocol for
129
+ # a given port range from one or more souce ip addresses.
104
130
  #
105
131
  # This example grants the whole internet (0.0.0.0/0) access to port 80
106
132
  # over TCP (HTTP web traffic).
107
133
  #
108
- # security_groups['websrv'].authorize_ingress(:tcp, 80)
134
+ # security_group.authorize_ingress(:tcp, 80)
109
135
  #
110
- # In the following example we grant SSH access from a list of
136
+ # You can specify port ranges as well:
137
+ #
138
+ # # ftp
139
+ # security_group.authorize_ingress(:tcp, 20..21)
140
+ #
141
+ # In the following example allow incoming SSH from a list of
111
142
  # IP address.
112
143
  #
113
- # security_groups['appsrv'].authorize_ingress(:tcp, 22,
144
+ # security_group.authorize_ingress(:tcp, 22,
114
145
  # '111.111.111.111/0', '222.222.222.222/0')
115
146
  #
116
- # You can also grant privileges to other security groups. This
117
- # is a convenient shortcut for granting permissions to all EC2
118
- # servers in a particular security group access.
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.
119
150
  #
120
- # web = security_groups['httpservers']
121
- # db = security_groups['dbservers']
151
+ # web = security_groups.create('webservers')
152
+ # db = security_groups.create('database')
122
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
123
157
  # db.authorize_ingress(:tcp, 3306, web)
124
158
  #
125
- # You can specify port ranges as well:
126
- #
127
- # security_groups['ftpsvr'].authorize_ingress(:tcp, 20..21)
128
- #
129
- # You can even mix and match IP address and security groups.
159
+ # You can even mix and match IP address and security group sources.
130
160
  #
131
161
  # @param [String, Symbol] protocol Should be :tcp, :udp or :icmp
132
162
  # or the string equivalent.
133
163
  #
134
164
  # @param [Integer, Range] ports The port (or port range) to allow
135
- # ingress traffic over. You can pass a single integer (like 80)
165
+ # traffic through. You can pass a single integer (like 80)
136
166
  # or a range (like 20..21).
137
167
  #
138
168
  # @param [Mixed] sources One or more CIDR IP addresses,
@@ -142,23 +172,81 @@ module AWS
142
172
  # user id should be the owner_id (account id) of the security
143
173
  # group.
144
174
  #
145
- # @return [nil]
175
+ # @return [IpPermission] Returns an IpPermission object that was added
176
+ # to this security group.
177
+ #
146
178
  def authorize_ingress protocol, ports, *sources
147
- permissions = format_permission(protocol, ports, sources)
148
- client.authorize_security_group_ingress(
149
- :group_id => id,
150
- :ip_permissions => permissions)
151
- nil
179
+ parse_ingress_sources(sources) do |options|
180
+ permission = IpPermission.new(self, protocol, ports, options)
181
+ permission.authorize
182
+ permission
183
+ end
152
184
  end
153
185
 
154
- # @param see #authorize_ingress
155
- # @return [nil]
186
+ # Revokes an ingress (inbound) ip permission. This is the inverse
187
+ # operation to {#authorize_ingress}. See {#authorize_ingress}
188
+ # for param and option documentation.
189
+ # @see #authorize_ingress
190
+ # @return [IpPermission] Returns an IpPermission object that was added
191
+ # to this security group.
156
192
  def revoke_ingress protocol, ports, *sources
157
- permissions = format_permission(protocol, ports, sources)
158
- client.revoke_security_group_ingress(
159
- :group_id => id,
160
- :ip_permissions => permissions)
161
- nil
193
+ parse_ingress_sources(sources) do |options|
194
+ permission = IpPermission.new(self, protocol, ports, options)
195
+ permission.revoke
196
+ permission
197
+ end
198
+ end
199
+
200
+ # Authorize egress (outbound) traffic for a VPC security group.
201
+ #
202
+ # # allow traffic for all protocols/ports from the given sources
203
+ # security_group.authorize_egress('10.0.0.0/16', '10.0.0.1/16')
204
+ #
205
+ # # allow tcp traffic outband via port 80
206
+ # security_group.authorize_egress('10.0.0.0/16',
207
+ # :protocol => :tcp, :ports => 80..80)
208
+ #
209
+ # @note Calling this method on a non-VPC security group raises an error.
210
+ #
211
+ # @overload authorize_egress(*sources, options = {})
212
+ # @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.
218
+ # @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
223
+ # @option options [Range<Integer>,Integer] :ports (nil) An optional
224
+ # 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
236
+ end
237
+
238
+ # Revokes an egress (outound) ip permission. This is the inverse
239
+ # operation to {#authorize_egress}. See {#authorize_egress}
240
+ # for param and option documentation.
241
+ # @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
162
250
  end
163
251
 
164
252
  # Deletes this security group.
@@ -193,58 +281,102 @@ module AWS
193
281
 
194
282
  # @private
195
283
  protected
196
- def find_in_response(resp)
197
- resp.security_group_index[id]
284
+ def parse_ingress_sources sources
285
+
286
+ ips, groups = parse_sources(sources)
287
+
288
+ options = {}
289
+ options[:ip_ranges] = ips unless ips.empty?
290
+ options[:groups] = groups unless groups.empty?
291
+ options[:egress] = false
292
+
293
+ yield(options)
294
+
198
295
  end
199
296
 
200
297
  # @private
201
298
  protected
202
- def format_permission protocol, ports, sources
299
+ def parse_egress_args *args, &block
300
+ ensure_vpc do
301
+
302
+ last = args.last
303
+
304
+ if last.is_a?(Hash) and (last.key?(:protocol) or last.key?(:ports))
305
+ # hashes at the end of egress methods could be a hash intedned
306
+ # to be a source, like:
307
+ #
308
+ # { :group_id => ..., :user_id => ... }
309
+ #
310
+ options = args.pop
311
+ else
312
+ options = {}
313
+ end
203
314
 
204
- permission = {}
205
- permission[:ip_protocol] = protocol.to_s.downcase
206
- permission[:from_port] = Array(ports).first.to_i
207
- permission[:to_port] = Array(ports).last.to_i
315
+ protocol = options[:protocol] || :any
208
316
 
209
- ip_ranges = []
210
- groups = []
317
+ ports = options[:ports]
211
318
 
212
- # default to 0.0.0.0/0
213
- sources << '0.0.0.0/0' if sources.empty?
319
+ ips, groups = parse_sources(args)
320
+
321
+ options[:ip_ranges] = ips unless ips.empty?
322
+ options[:groups] = groups unless groups.empty?
323
+ options[:egress] = true
324
+
325
+ yield(protocol, ports, options)
326
+
327
+ end
328
+ end
214
329
 
215
- sources.each do |where|
216
- case where
330
+ # @private
331
+ protected
332
+ def parse_sources sources
333
+
334
+ ips = []
335
+ groups = []
336
+
337
+ sources.each do |source|
338
+ 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)
217
343
 
218
- when String
219
- ip_ranges << where
344
+ group = SecurityGroup.new(source[:group_id],
345
+ :owner_id => source[:user_id],
346
+ :config => config)
220
347
 
221
- when SecurityGroup
222
- groups << {:group_id => where.id, :user_id => where.owner_id}
348
+ groups << group
223
349
 
224
- when Hash
225
- if where.has_key?(:group_id) and where.has_key?(:user_id)
226
- groups << where
227
350
  else
228
- raise ArgumentError, 'invalid ingress ip permission, hashes ' +
229
- 'must have :group_id and :user_id key/values'
351
+ raise ArgumentError, 'invalid ip permission hash, ' +
352
+ 'must provide :group_id and :user_id'
230
353
  end
354
+
231
355
  else
232
356
  raise ArgumentError, 'invalid ingress ip permission, ' +
233
357
  'expected CIDR IP addres or SecurityGroup'
234
358
  end
235
359
  end
236
360
 
237
- unless ip_ranges.empty?
238
- permission[:ip_ranges] = ip_ranges.collect{|ip| { :cidr_ip => ip } }
239
- end
361
+ ips << '0.0.0.0/0' if ips.empty? and groups.empty?
240
362
 
241
- unless groups.empty?
242
- permission[:user_id_group_pairs] = groups
243
- end
363
+ [ips, groups]
364
+
365
+ end
244
366
 
245
- [permission]
367
+ # @private
368
+ protected
369
+ def ensure_vpc &block
370
+ raise 'operation permitted for VPC security groups only' unless vpc?
371
+ yield
372
+ end
246
373
 
374
+ # @private
375
+ protected
376
+ def find_in_response(resp)
377
+ resp.security_group_index[id]
247
378
  end
379
+
248
380
  end
249
381
  end
250
382
  end