fog-aws 3.5.2 → 3.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +485 -22
  3. data/LICENSE.md +1 -1
  4. data/README.md +117 -7
  5. data/fog-aws.gemspec +8 -8
  6. data/lib/fog/aws/compute.rb +6 -3
  7. data/lib/fog/aws/credential_fetcher.rb +75 -7
  8. data/lib/fog/aws/elasticache.rb +4 -2
  9. data/lib/fog/aws/elb.rb +1 -1
  10. data/lib/fog/aws/elbv2.rb +72 -0
  11. data/lib/fog/aws/kinesis.rb +23 -15
  12. data/lib/fog/aws/models/compute/flavors.rb +2563 -521
  13. data/lib/fog/aws/models/compute/security_group.rb +13 -5
  14. data/lib/fog/aws/models/compute/server.rb +6 -2
  15. data/lib/fog/aws/models/compute/servers.rb +2 -0
  16. data/lib/fog/aws/models/compute/snapshot.rb +7 -6
  17. data/lib/fog/aws/models/compute/vpc.rb +8 -2
  18. data/lib/fog/aws/models/storage/directories.rb +1 -0
  19. data/lib/fog/aws/models/storage/directory.rb +0 -1
  20. data/lib/fog/aws/models/storage/file.rb +164 -20
  21. data/lib/fog/aws/models/storage/files.rb +32 -2
  22. data/lib/fog/aws/parsers/compute/create_snapshot.rb +1 -1
  23. data/lib/fog/aws/parsers/compute/create_subnet.rb +33 -6
  24. data/lib/fog/aws/parsers/compute/describe_security_groups.rb +18 -4
  25. data/lib/fog/aws/parsers/compute/describe_subnets.rb +33 -6
  26. data/lib/fog/aws/parsers/dns/create_hosted_zone.rb +1 -1
  27. data/lib/fog/aws/parsers/dns/get_hosted_zone.rb +3 -3
  28. data/lib/fog/aws/parsers/dns/list_hosted_zones.rb +3 -1
  29. data/lib/fog/aws/parsers/elbv2/create_load_balancer.rb +88 -0
  30. data/lib/fog/aws/parsers/elbv2/describe_listeners.rb +110 -0
  31. data/lib/fog/aws/parsers/elbv2/describe_load_balancers.rb +88 -0
  32. data/lib/fog/aws/parsers/elbv2/describe_tags.rb +53 -0
  33. data/lib/fog/aws/parsers/elbv2/empty.rb +10 -0
  34. data/lib/fog/aws/parsers/iam/get_group_policy.rb +1 -1
  35. data/lib/fog/aws/parsers/iam/get_role_policy.rb +1 -1
  36. data/lib/fog/aws/parsers/iam/get_user_policy.rb +1 -1
  37. data/lib/fog/aws/parsers/iam/policy_version.rb +1 -1
  38. data/lib/fog/aws/parsers/storage/get_object_tagging.rb +33 -0
  39. data/lib/fog/aws/parsers/storage/upload_part_copy_object.rb +18 -0
  40. data/lib/fog/aws/parsers/sts/assume_role_with_web_identity.rb +1 -1
  41. data/lib/fog/aws/requests/compute/authorize_security_group_ingress.rb +15 -0
  42. data/lib/fog/aws/requests/compute/create_network_interface.rb +7 -4
  43. data/lib/fog/aws/requests/compute/create_subnet.rb +3 -3
  44. data/lib/fog/aws/requests/compute/create_vpc.rb +2 -2
  45. data/lib/fog/aws/requests/compute/describe_security_groups.rb +2 -0
  46. data/lib/fog/aws/requests/compute/request_spot_instances.rb +1 -1
  47. data/lib/fog/aws/requests/compute/run_instances.rb +64 -0
  48. data/lib/fog/aws/requests/compute/stop_instances.rb +11 -3
  49. data/lib/fog/aws/requests/elbv2/add_tags.rb +45 -0
  50. data/lib/fog/aws/requests/elbv2/create_load_balancer.rb +160 -0
  51. data/lib/fog/aws/requests/elbv2/describe_listeners.rb +38 -0
  52. data/lib/fog/aws/requests/elbv2/describe_load_balancers.rb +100 -0
  53. data/lib/fog/aws/requests/elbv2/describe_tags.rb +50 -0
  54. data/lib/fog/aws/requests/elbv2/remove_tags.rb +45 -0
  55. data/lib/fog/aws/requests/rds/add_tags_to_resource.rb +12 -10
  56. data/lib/fog/aws/requests/rds/list_tags_for_resource.rb +10 -7
  57. data/lib/fog/aws/requests/rds/remove_tags_from_resource.rb +9 -8
  58. data/lib/fog/aws/requests/storage/delete_multiple_objects.rb +18 -8
  59. data/lib/fog/aws/requests/storage/get_object.rb +1 -1
  60. data/lib/fog/aws/requests/storage/get_object_tagging.rb +41 -0
  61. data/lib/fog/aws/requests/storage/get_service.rb +1 -1
  62. data/lib/fog/aws/requests/storage/put_object_tagging.rb +42 -0
  63. data/lib/fog/aws/requests/storage/shared_mock_methods.rb +1 -0
  64. data/lib/fog/aws/requests/storage/sync_clock.rb +9 -1
  65. data/lib/fog/aws/requests/storage/upload_part_copy.rb +119 -0
  66. data/lib/fog/aws/requests/sts/assume_role_with_web_identity.rb +7 -6
  67. data/lib/fog/aws/storage.rb +56 -5
  68. data/lib/fog/aws/version.rb +1 -1
  69. data/lib/fog/aws.rb +7 -2
  70. metadata +35 -295
  71. data/.gitignore +0 -16
  72. data/.travis.yml +0 -53
  73. data/Gemfile +0 -14
  74. data/Rakefile +0 -14
  75. data/gemfiles/Gemfile-edge +0 -14
  76. data/gemfiles/Gemfile-ruby-2.0 +0 -7
  77. data/stale.yml +0 -17
  78. data/tests/credentials_tests.rb +0 -87
  79. data/tests/helper.rb +0 -29
  80. data/tests/helpers/collection_helper.rb +0 -90
  81. data/tests/helpers/compute/flavors_helper.rb +0 -28
  82. data/tests/helpers/compute/server_helper.rb +0 -23
  83. data/tests/helpers/compute/servers_helper.rb +0 -8
  84. data/tests/helpers/dns_helper.rb +0 -56
  85. data/tests/helpers/formats_helper.rb +0 -100
  86. data/tests/helpers/formats_helper_tests.rb +0 -107
  87. data/tests/helpers/mock_helper.rb +0 -109
  88. data/tests/helpers/model_helper.rb +0 -30
  89. data/tests/helpers/responds_to_helper.rb +0 -11
  90. data/tests/helpers/schema_validator_tests.rb +0 -104
  91. data/tests/helpers/succeeds_helper.rb +0 -9
  92. data/tests/lorem.txt +0 -1
  93. data/tests/models/auto_scaling/activities_tests.rb +0 -6
  94. data/tests/models/auto_scaling/configuration_test.rb +0 -13
  95. data/tests/models/auto_scaling/configurations_tests.rb +0 -11
  96. data/tests/models/auto_scaling/groups_test.rb +0 -27
  97. data/tests/models/auto_scaling/helper.rb +0 -0
  98. data/tests/models/auto_scaling/instance_tests.rb +0 -15
  99. data/tests/models/auto_scaling/instances_tests.rb +0 -6
  100. data/tests/models/beanstalk/application_tests.rb +0 -69
  101. data/tests/models/beanstalk/applications_tests.rb +0 -7
  102. data/tests/models/beanstalk/environment_tests.rb +0 -131
  103. data/tests/models/beanstalk/environments_tests.rb +0 -34
  104. data/tests/models/beanstalk/template_tests.rb +0 -47
  105. data/tests/models/beanstalk/templates_tests.rb +0 -62
  106. data/tests/models/beanstalk/version_tests.rb +0 -66
  107. data/tests/models/beanstalk/versions_tests.rb +0 -60
  108. data/tests/models/cdn/distribution_tests.rb +0 -15
  109. data/tests/models/cdn/distributions_tests.rb +0 -15
  110. data/tests/models/cdn/invalidation_tests.rb +0 -31
  111. data/tests/models/cdn/invalidations_tests.rb +0 -14
  112. data/tests/models/cdn/streaming_distribution_tests.rb +0 -15
  113. data/tests/models/cdn/streaming_distributions_tests.rb +0 -15
  114. data/tests/models/cloud_watch/alarm_data_tests.rb +0 -42
  115. data/tests/models/cloud_watch/alarm_history_tests.rb +0 -22
  116. data/tests/models/cloud_watch/metric_statistics_tests.rb +0 -51
  117. data/tests/models/cloud_watch/metrics_tests.rb +0 -32
  118. data/tests/models/compute/address_tests.rb +0 -43
  119. data/tests/models/compute/addresses_tests.rb +0 -5
  120. data/tests/models/compute/dhcp_option_tests.rb +0 -3
  121. data/tests/models/compute/dhcp_options_tests.rb +0 -3
  122. data/tests/models/compute/internet_gateway_tests.rb +0 -3
  123. data/tests/models/compute/internet_gateways_tests.rb +0 -3
  124. data/tests/models/compute/key_pair_tests.rb +0 -26
  125. data/tests/models/compute/key_pairs_tests.rb +0 -5
  126. data/tests/models/compute/network_acl_tests.rb +0 -109
  127. data/tests/models/compute/network_acls_tests.rb +0 -20
  128. data/tests/models/compute/network_interfaces_test.rb +0 -12
  129. data/tests/models/compute/security_group_tests.rb +0 -98
  130. data/tests/models/compute/security_groups_tests.rb +0 -5
  131. data/tests/models/compute/server_tests.rb +0 -94
  132. data/tests/models/compute/snapshot_tests.rb +0 -10
  133. data/tests/models/compute/snapshots_tests.rb +0 -10
  134. data/tests/models/compute/subnet_tests.rb +0 -13
  135. data/tests/models/compute/subnets_tests.rb +0 -5
  136. data/tests/models/compute/volume_tests.rb +0 -65
  137. data/tests/models/compute/volumes_tests.rb +0 -5
  138. data/tests/models/compute/vpc_tests.rb +0 -26
  139. data/tests/models/compute/vpcs_tests.rb +0 -19
  140. data/tests/models/data_pipeline/pipeline_tests.rb +0 -8
  141. data/tests/models/data_pipeline/pipelines_tests.rb +0 -8
  142. data/tests/models/dns/record_tests.rb +0 -33
  143. data/tests/models/dns/records_tests.rb +0 -41
  144. data/tests/models/dns/zone_tests.rb +0 -4
  145. data/tests/models/dns/zones_tests.rb +0 -4
  146. data/tests/models/efs/file_system_tests.rb +0 -12
  147. data/tests/models/efs/mount_target_tests.rb +0 -45
  148. data/tests/models/efs/mount_targets_tests.rb +0 -30
  149. data/tests/models/elasticache/cluster_tests.rb +0 -30
  150. data/tests/models/elasticache/parameter_groups_tests.rb +0 -15
  151. data/tests/models/elasticache/security_groups_tests.rb +0 -52
  152. data/tests/models/elasticache/subnet_groups_tests.rb +0 -43
  153. data/tests/models/elb/model_tests.rb +0 -360
  154. data/tests/models/elb/tagging_tests.rb +0 -15
  155. data/tests/models/glacier/model_tests.rb +0 -47
  156. data/tests/models/iam/access_keys_tests.rb +0 -53
  157. data/tests/models/iam/groups_tests.rb +0 -59
  158. data/tests/models/iam/instance_profile_tests.rb +0 -18
  159. data/tests/models/iam/managed_policies_tests.rb +0 -89
  160. data/tests/models/iam/policies_tests.rb +0 -57
  161. data/tests/models/iam/roles_tests.rb +0 -71
  162. data/tests/models/iam/users_tests.rb +0 -119
  163. data/tests/models/rds/cluster_tests.rb +0 -54
  164. data/tests/models/rds/clusters_tests.rb +0 -5
  165. data/tests/models/rds/event_subscription_tests.rb +0 -9
  166. data/tests/models/rds/event_subscriptions_tests.rb +0 -6
  167. data/tests/models/rds/helper.rb +0 -25
  168. data/tests/models/rds/instance_option_tests.rb +0 -14
  169. data/tests/models/rds/parameter_group_tests.rb +0 -24
  170. data/tests/models/rds/parameter_groups_tests.rb +0 -8
  171. data/tests/models/rds/security_group_tests.rb +0 -77
  172. data/tests/models/rds/security_groups_tests.rb +0 -5
  173. data/tests/models/rds/server_tests.rb +0 -131
  174. data/tests/models/rds/servers_tests.rb +0 -24
  175. data/tests/models/rds/snapshot_tests.rb +0 -12
  176. data/tests/models/rds/snapshots_tests.rb +0 -12
  177. data/tests/models/rds/tagging_tests.rb +0 -20
  178. data/tests/models/sns/topic_tests.rb +0 -15
  179. data/tests/models/sns/topics_tests.rb +0 -6
  180. data/tests/models/storage/directory_tests.rb +0 -91
  181. data/tests/models/storage/file_tests.rb +0 -129
  182. data/tests/models/storage/files_tests.rb +0 -58
  183. data/tests/models/storage/url_tests.rb +0 -25
  184. data/tests/models/storage/version_tests.rb +0 -52
  185. data/tests/models/storage/versions_tests.rb +0 -51
  186. data/tests/models/support/trusted_advisor_tests.rb +0 -25
  187. data/tests/parsers/compute/describe_images_tests.rb +0 -33
  188. data/tests/parsers/elb/describe_load_balancers.rb +0 -65
  189. data/tests/requests/auto_scaling/auto_scaling_tests.rb +0 -111
  190. data/tests/requests/auto_scaling/describe_types_tests.rb +0 -102
  191. data/tests/requests/auto_scaling/helper.rb +0 -229
  192. data/tests/requests/auto_scaling/model_tests.rb +0 -235
  193. data/tests/requests/auto_scaling/notification_configuration_tests.rb +0 -124
  194. data/tests/requests/auto_scaling/tag_tests.rb +0 -63
  195. data/tests/requests/beanstalk/application_tests.rb +0 -140
  196. data/tests/requests/beanstalk/solution_stack_tests.rb +0 -22
  197. data/tests/requests/cdn/cdn_tests.rb +0 -252
  198. data/tests/requests/cloud_formation/stack_tests.rb +0 -167
  199. data/tests/requests/cloud_watch/get_metric_statistics_tests.rb +0 -28
  200. data/tests/requests/cloud_watch/list_metrics_test.rb +0 -64
  201. data/tests/requests/cloud_watch/put_metric_data_tests.rb +0 -36
  202. data/tests/requests/compute/address_tests.rb +0 -144
  203. data/tests/requests/compute/assign_private_ip_tests.rb +0 -55
  204. data/tests/requests/compute/availability_zone_tests.rb +0 -25
  205. data/tests/requests/compute/client_tests.rb +0 -25
  206. data/tests/requests/compute/dhcp_options_tests.rb +0 -39
  207. data/tests/requests/compute/helper.rb +0 -27
  208. data/tests/requests/compute/image_tests.rb +0 -169
  209. data/tests/requests/compute/instance_attrib_tests.rb +0 -168
  210. data/tests/requests/compute/instance_tests.rb +0 -338
  211. data/tests/requests/compute/internet_gateway_tests.rb +0 -49
  212. data/tests/requests/compute/key_pair_tests.rb +0 -67
  213. data/tests/requests/compute/network_acl_tests.rb +0 -112
  214. data/tests/requests/compute/network_interface_tests.rb +0 -239
  215. data/tests/requests/compute/placement_group_tests.rb +0 -48
  216. data/tests/requests/compute/region_tests.rb +0 -52
  217. data/tests/requests/compute/route_tests.rb +0 -341
  218. data/tests/requests/compute/security_group_tests.rb +0 -446
  219. data/tests/requests/compute/snapshot_tests.rb +0 -77
  220. data/tests/requests/compute/spot_datafeed_subscription_tests.rb +0 -47
  221. data/tests/requests/compute/spot_instance_tests.rb +0 -55
  222. data/tests/requests/compute/spot_price_history_tests.rb +0 -23
  223. data/tests/requests/compute/subnet_tests.rb +0 -87
  224. data/tests/requests/compute/tag_tests.rb +0 -101
  225. data/tests/requests/compute/volume_tests.rb +0 -263
  226. data/tests/requests/compute/vpc_tests.rb +0 -216
  227. data/tests/requests/data_pipeline/helper.rb +0 -78
  228. data/tests/requests/data_pipeline/pipeline_tests.rb +0 -80
  229. data/tests/requests/dns/change_resource_record_sets_tests.rb +0 -34
  230. data/tests/requests/dns/dns_tests.rb +0 -240
  231. data/tests/requests/dns/health_check_tests.rb +0 -159
  232. data/tests/requests/dns/helper.rb +0 -21
  233. data/tests/requests/dynamodb/item_tests.rb +0 -137
  234. data/tests/requests/dynamodb/table_tests.rb +0 -99
  235. data/tests/requests/ecs/cluster_tests.rb +0 -112
  236. data/tests/requests/ecs/container_instance_tests.rb +0 -119
  237. data/tests/requests/ecs/helper.rb +0 -276
  238. data/tests/requests/ecs/sample_task_definition1.json +0 -56
  239. data/tests/requests/ecs/service_tests.rb +0 -132
  240. data/tests/requests/ecs/task_definitions_tests.rb +0 -97
  241. data/tests/requests/ecs/task_tests.rb +0 -145
  242. data/tests/requests/efs/file_system_tests.rb +0 -152
  243. data/tests/requests/efs/helper.rb +0 -44
  244. data/tests/requests/elasticache/cache_cluster_tests.rb +0 -137
  245. data/tests/requests/elasticache/describe_events.rb +0 -17
  246. data/tests/requests/elasticache/describe_reserved_cache_nodes.rb +0 -17
  247. data/tests/requests/elasticache/helper.rb +0 -103
  248. data/tests/requests/elasticache/parameter_group_tests.rb +0 -105
  249. data/tests/requests/elasticache/security_group_tests.rb +0 -108
  250. data/tests/requests/elasticache/subnet_group_tests.rb +0 -52
  251. data/tests/requests/elb/helper.rb +0 -91
  252. data/tests/requests/elb/listener_tests.rb +0 -68
  253. data/tests/requests/elb/load_balancer_tests.rb +0 -89
  254. data/tests/requests/elb/policy_tests.rb +0 -132
  255. data/tests/requests/emr/helper.rb +0 -167
  256. data/tests/requests/emr/instance_group_tests.rb +0 -106
  257. data/tests/requests/emr/job_flow_tests.rb +0 -88
  258. data/tests/requests/federation/get_signin_token_tests.rb +0 -11
  259. data/tests/requests/glacier/archive_tests.rb +0 -13
  260. data/tests/requests/glacier/multipart_upload_tests.rb +0 -29
  261. data/tests/requests/glacier/tree_hash_tests.rb +0 -91
  262. data/tests/requests/glacier/vault_tests.rb +0 -35
  263. data/tests/requests/iam/access_key_tests.rb +0 -53
  264. data/tests/requests/iam/account_policy_tests.rb +0 -20
  265. data/tests/requests/iam/account_tests.rb +0 -34
  266. data/tests/requests/iam/group_policy_tests.rb +0 -48
  267. data/tests/requests/iam/group_tests.rb +0 -44
  268. data/tests/requests/iam/helper.rb +0 -154
  269. data/tests/requests/iam/instance_profile_tests.rb +0 -44
  270. data/tests/requests/iam/login_profile_tests.rb +0 -62
  271. data/tests/requests/iam/managed_policy_tests.rb +0 -110
  272. data/tests/requests/iam/mfa_tests.rb +0 -23
  273. data/tests/requests/iam/role_tests.rb +0 -156
  274. data/tests/requests/iam/server_certificate_tests.rb +0 -130
  275. data/tests/requests/iam/user_policy_tests.rb +0 -45
  276. data/tests/requests/iam/user_tests.rb +0 -78
  277. data/tests/requests/iam/versioned_managed_policy_tests.rb +0 -105
  278. data/tests/requests/kinesis/helper.rb +0 -111
  279. data/tests/requests/kinesis/stream_tests.rb +0 -169
  280. data/tests/requests/kms/helper.rb +0 -27
  281. data/tests/requests/kms/key_tests.rb +0 -23
  282. data/tests/requests/lambda/function_sample_1.js +0 -9
  283. data/tests/requests/lambda/function_sample_2.js +0 -9
  284. data/tests/requests/lambda/function_tests.rb +0 -460
  285. data/tests/requests/lambda/helper.rb +0 -81
  286. data/tests/requests/rds/cluster_snapshot_tests.rb +0 -43
  287. data/tests/requests/rds/cluster_tests.rb +0 -37
  288. data/tests/requests/rds/db_engine_versions.rb +0 -7
  289. data/tests/requests/rds/db_snapshot_tests.rb +0 -62
  290. data/tests/requests/rds/describe_events.rb +0 -16
  291. data/tests/requests/rds/event_subscription_tests.rb +0 -30
  292. data/tests/requests/rds/helper.rb +0 -406
  293. data/tests/requests/rds/instance_option_tests.rb +0 -27
  294. data/tests/requests/rds/instance_tests.rb +0 -149
  295. data/tests/requests/rds/log_file_tests.rb +0 -19
  296. data/tests/requests/rds/parameter_group_tests.rb +0 -62
  297. data/tests/requests/rds/parameter_request_tests.rb +0 -32
  298. data/tests/requests/rds/security_group_tests.rb +0 -101
  299. data/tests/requests/rds/subnet_groups_tests.rb +0 -52
  300. data/tests/requests/rds/tagging_tests.rb +0 -78
  301. data/tests/requests/redshift/cluster_parameter_group_tests.rb +0 -76
  302. data/tests/requests/redshift/cluster_security_group_tests.rb +0 -42
  303. data/tests/requests/redshift/cluster_snapshot_tests.rb +0 -73
  304. data/tests/requests/redshift/cluster_tests.rb +0 -80
  305. data/tests/requests/ses/helper.rb +0 -9
  306. data/tests/requests/ses/verified_domain_identity_tests.rb +0 -16
  307. data/tests/requests/ses/verified_email_address_tests.rb +0 -27
  308. data/tests/requests/simpledb/attributes_tests.rb +0 -86
  309. data/tests/requests/simpledb/domain_tests.rb +0 -51
  310. data/tests/requests/simpledb/helper.rb +0 -10
  311. data/tests/requests/sns/helper.rb +0 -9
  312. data/tests/requests/sns/subscription_tests.rb +0 -86
  313. data/tests/requests/sns/topic_tests.rb +0 -53
  314. data/tests/requests/sqs/helper.rb +0 -9
  315. data/tests/requests/sqs/message_tests.rb +0 -51
  316. data/tests/requests/sqs/queue_tests.rb +0 -50
  317. data/tests/requests/storage/acl_utils_tests.rb +0 -209
  318. data/tests/requests/storage/bucket_tests.rb +0 -416
  319. data/tests/requests/storage/cors_utils_tests.rb +0 -108
  320. data/tests/requests/storage/delete_multiple_objects_tests.rb +0 -12
  321. data/tests/requests/storage/multipart_upload_tests.rb +0 -121
  322. data/tests/requests/storage/object_tests.rb +0 -262
  323. data/tests/requests/storage/versioning_tests.rb +0 -262
  324. data/tests/requests/sts/assume_role_tests.rb +0 -19
  325. data/tests/requests/sts/assume_role_with_saml_tests.rb +0 -18
  326. data/tests/requests/sts/assume_role_with_web_identity_tests.rb +0 -28
  327. data/tests/requests/sts/get_federation_token_tests.rb +0 -20
  328. data/tests/requests/sts/session_token_tests.rb +0 -16
  329. data/tests/requests/support/helper.rb +0 -43
  330. data/tests/requests/support/trusted_advisor_check_tests.rb +0 -16
  331. data/tests/signaturev4_tests.rb +0 -106
  332. data/tests/signed_params_tests.rb +0 -17
  333. data/tests/storage_tests.rb +0 -7
@@ -62,7 +62,8 @@ module Fog
62
62
  # options::
63
63
  # A hash that can contain any of the following keys:
64
64
  # :cidr_ip (defaults to "0.0.0.0/0")
65
- # :group - ("account:group_name" or "account:group_id"), cannot be used with :cidr_ip
65
+ # :cidr_ipv6 cannot be used with :cidr_ip
66
+ # :group - ("account:group_name" or "account:group_id"), cannot be used with :cidr_ip or :cidr_ipv6
66
67
  # :ip_protocol (defaults to "tcp")
67
68
  #
68
69
  # == Returns:
@@ -178,7 +179,8 @@ module Fog
178
179
  # options::
179
180
  # A hash that can contain any of the following keys:
180
181
  # :cidr_ip (defaults to "0.0.0.0/0")
181
- # :group - ("account:group_name" or "account:group_id"), cannot be used with :cidr_ip
182
+ # :cidr_ipv6 cannot be used with :cidr_ip
183
+ # :group - ("account:group_name" or "account:group_id"), cannot be used with :cidr_ip or :cidr_ipv6
182
184
  # :ip_protocol (defaults to "tcp")
183
185
  #
184
186
  # == Returns:
@@ -327,9 +329,15 @@ module Fog
327
329
  }
328
330
 
329
331
  if options[:group].nil?
330
- ip_permission['IpRanges'] = [
331
- { 'CidrIp' => options[:cidr_ip] || '0.0.0.0/0' }
332
- ]
332
+ if options[:cidr_ipv6].nil?
333
+ ip_permission['IpRanges'] = [
334
+ { 'CidrIp' => options[:cidr_ip] || '0.0.0.0/0' }
335
+ ]
336
+ else
337
+ ip_permission['Ipv6Ranges'] = [
338
+ { 'CidrIpv6' => options[:cidr_ipv6] }
339
+ ]
340
+ end
333
341
  else
334
342
  ip_permission['Groups'] = [
335
343
  group_info(options[:group])
@@ -14,6 +14,7 @@ module Fog
14
14
  attribute :associate_public_ip, :aliases => 'associatePublicIP'
15
15
  attribute :availability_zone, :aliases => 'availabilityZone'
16
16
  attribute :block_device_mapping, :aliases => 'blockDeviceMapping'
17
+ attribute :hibernation_options, :aliases => 'hibernationOptions'
17
18
  attribute :network_interfaces, :aliases => 'networkInterfaces'
18
19
  attribute :client_token, :aliases => 'clientToken'
19
20
  attribute :disable_api_termination, :aliases => 'disableApiTermination'
@@ -49,6 +50,7 @@ module Fog
49
50
  attribute :subnet_id, :aliases => 'subnetId'
50
51
  attribute :tenancy
51
52
  attribute :tags, :aliases => 'tagSet'
53
+ attribute :tag_specifications, :aliases => 'tagSpecifications'
52
54
  attribute :user_data
53
55
  attribute :virtualization_type, :aliases => 'virtualizationType'
54
56
  attribute :vpc_id, :aliases => 'vpcId'
@@ -144,6 +146,7 @@ module Fog
144
146
 
145
147
  options = {
146
148
  'BlockDeviceMapping' => block_device_mapping,
149
+ 'HibernationOptions' => hibernation_options,
147
150
  'NetworkInterfaces' => network_interfaces,
148
151
  'ClientToken' => client_token,
149
152
  'DisableApiTermination' => disable_api_termination,
@@ -164,6 +167,7 @@ module Fog
164
167
  'SecurityGroupId' => security_group_ids,
165
168
  'SubnetId' => subnet_id,
166
169
  'UserData' => user_data,
170
+ 'TagSpecifications' => tag_specifications,
167
171
  }
168
172
  options.delete_if {|key, value| value.nil?}
169
173
 
@@ -227,9 +231,9 @@ module Fog
227
231
  true
228
232
  end
229
233
 
230
- def stop(force = false)
234
+ def stop(options = {})
231
235
  requires :id
232
- service.stop_instances(id, force)
236
+ service.stop_instances(id, options)
233
237
  true
234
238
  end
235
239
 
@@ -22,6 +22,7 @@ module Fog
22
22
  # ami_launch_index=nil,
23
23
  # availability_zone=nil,
24
24
  # block_device_mapping=nil,
25
+ # hibernation_options=nil,
25
26
  # network_interfaces=nil,
26
27
  # client_token=nil,
27
28
  # dns_name=nil,
@@ -119,6 +120,7 @@ module Fog
119
120
  # ami_launch_index=0,
120
121
  # availability_zone="us-east-1b",
121
122
  # block_device_mapping=[],
123
+ # hibernation_options=[],
122
124
  # client_token=nil,
123
125
  # dns_name="ec2-25-2-474-44.compute-1.amazonaws.com",
124
126
  # groups=["default"],
@@ -7,12 +7,13 @@ module Fog
7
7
  attribute :description
8
8
  attribute :encrypted
9
9
  attribute :progress
10
- attribute :created_at, :aliases => 'startTime'
11
- attribute :owner_id, :aliases => 'ownerId'
12
- attribute :state, :aliases => 'status'
13
- attribute :tags, :aliases => 'tagSet'
14
- attribute :volume_id, :aliases => 'volumeId'
15
- attribute :volume_size, :aliases => 'volumeSize'
10
+ attribute :created_at, :aliases => 'startTime'
11
+ attribute :owner_id, :aliases => 'ownerId'
12
+ attribute :state, :aliases => 'status'
13
+ attribute :tags, :aliases => 'tagSet'
14
+ attribute :volume_id, :aliases => 'volumeId'
15
+ attribute :volume_size, :aliases => 'volumeSize'
16
+ attribute :status_message, :aliases => 'statusMessage'
16
17
 
17
18
  def destroy
18
19
  requires :id
@@ -39,7 +39,7 @@ module Fog
39
39
  end
40
40
 
41
41
  def is_default?
42
- require :is_default
42
+ requires :is_default
43
43
  is_default
44
44
  end
45
45
 
@@ -106,7 +106,13 @@ module Fog
106
106
 
107
107
  def save
108
108
  requires :cidr_block
109
- data = service.create_vpc(cidr_block, { 'AmazonProvidedIpv6CidrBlock' => amazon_provided_ipv_6_cidr_block }).body['vpcSet'].first
109
+
110
+ options = {
111
+ 'AmazonProvidedIpv6CidrBlock' => amazon_provided_ipv_6_cidr_block,
112
+ 'InstanceTenancy' => tenancy
113
+ }
114
+
115
+ data = service.create_vpc(cidr_block, options).body['vpcSet'].first
110
116
  new_attributes = data.reject {|key,value| key == 'requestId'}
111
117
  new_attributes = data.reject {|key,value| key == 'requestId' || key == 'tagSet' }
112
118
  merge_attributes(new_attributes)
@@ -11,6 +11,7 @@ module Fog
11
11
  load(data)
12
12
  end
13
13
 
14
+ # Warning! This retrieves and caches meta data for the first 10,000 objects in the bucket, which can be very expensive. When possible use directories.new
14
15
  def get(key, options = {})
15
16
  remap_attributes(options, {
16
17
  :delimiter => 'delimiter',
@@ -12,7 +12,6 @@ module Fog
12
12
  identity :key, :aliases => ['Name', 'name']
13
13
 
14
14
  attribute :creation_date, :aliases => 'CreationDate', :type => 'time'
15
- attribute :location, :aliases => 'LocationConstraint', :type => 'string'
16
15
 
17
16
  def acl=(new_acl)
18
17
  unless VALID_ACLS.include?(new_acl)
@@ -4,6 +4,13 @@ module Fog
4
4
  module AWS
5
5
  class Storage
6
6
  class File < Fog::Model
7
+ # @deprecated use {Fog::AWS::Storage::MIN_MULTIPART_CHUNK_SIZE} instead
8
+ MIN_MULTIPART_CHUNK_SIZE = Fog::AWS::Storage::MIN_MULTIPART_CHUNK_SIZE
9
+ # @deprecated use {Fog::AWS::Storage::MAX_SINGLE_PUT_SIZE} instead
10
+ MAX_SINGLE_PUT_SIZE = Fog::AWS::Storage::MAX_SINGLE_PUT_SIZE
11
+ # @deprecated not used for anything
12
+ MULTIPART_COPY_THRESHOLD = 15728640
13
+
7
14
  # @see AWS Object docs http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectOps.html
8
15
 
9
16
  identity :key, :aliases => 'Key'
@@ -25,15 +32,57 @@ module Fog
25
32
  attribute :encryption_key, :aliases => 'x-amz-server-side-encryption-customer-key'
26
33
  attribute :version, :aliases => 'x-amz-version-id'
27
34
  attribute :kms_key_id, :aliases => 'x-amz-server-side-encryption-aws-kms-key-id'
35
+ attribute :tags, :aliases => 'x-amz-tagging'
36
+ attribute :website_redirect_location, :aliases => 'x-amz-website-redirect-location'
37
+
38
+ UploadPartData = Struct.new(:part_number, :upload_options, :etag)
39
+
40
+ class PartList
41
+ def initialize(parts = [])
42
+ @parts = parts
43
+ @mutex = Mutex.new
44
+ end
45
+
46
+ def push(part)
47
+ @mutex.synchronize { @parts.push(part) }
48
+ end
49
+
50
+ def shift
51
+ @mutex.synchronize { @parts.shift }
52
+ end
53
+
54
+ def clear!
55
+ @mutex.synchronize { @parts.clear }
56
+ end
57
+
58
+ def size
59
+ @mutex.synchronize { @parts.size }
60
+ end
61
+
62
+ def to_a
63
+ @mutex.synchronize { @parts.dup }
64
+ end
65
+ end
28
66
 
29
67
  # @note Chunk size to use for multipart uploads.
30
68
  # Use small chunk sizes to minimize memory. E.g. 5242880 = 5mb
31
69
  attr_reader :multipart_chunk_size
32
70
  def multipart_chunk_size=(mp_chunk_size)
33
- raise ArgumentError.new("minimum multipart_chunk_size is 5242880") if mp_chunk_size < 5242880
71
+ service.validate_chunk_size(mp_chunk_size, 'multipart_chunk_size')
34
72
  @multipart_chunk_size = mp_chunk_size
35
73
  end
36
74
 
75
+ # @note Number of threads used to copy files.
76
+ def concurrency=(concurrency)
77
+ raise ArgumentError.new('minimum concurrency is 1') if concurrency.to_i < 1
78
+
79
+ @concurrency = concurrency.to_i
80
+ end
81
+
82
+ def concurrency
83
+ @concurrency || 1
84
+ end
85
+
37
86
  def acl
38
87
  requires :directory, :key
39
88
  service.get_object_acl(directory.key, key).body['AccessControlList']
@@ -59,15 +108,16 @@ module Fog
59
108
  # @return [File]
60
109
  #
61
110
  def body
62
- return attributes[:body] if attributes[:body]
63
- return '' unless last_modified
111
+ return attributes[:body] if attributes.key?(:body)
64
112
 
65
113
  file = collection.get(identity)
66
- if file
67
- attributes[:body] = file.body
68
- else
69
- attributes[:body] = ''
70
- end
114
+
115
+ attributes[:body] =
116
+ if file
117
+ file.body
118
+ else
119
+ ''
120
+ end
71
121
  end
72
122
 
73
123
  # Set body attribute.
@@ -98,7 +148,17 @@ module Fog
98
148
  #
99
149
  def copy(target_directory_key, target_file_key, options = {})
100
150
  requires :directory, :key
101
- service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
151
+
152
+ self.multipart_chunk_size = service.max_copy_chunk_size if multipart_chunk_size.nil?
153
+
154
+ if multipart_chunk_size > 0 && self.content_length.to_i >= multipart_chunk_size
155
+ upload_part_options = options.select { |key, _| ALLOWED_UPLOAD_PART_OPTIONS.include?(key.to_sym) }
156
+ upload_part_options = upload_part_options.merge({ 'x-amz-copy-source' => "#{directory.key}/#{key}" })
157
+ multipart_copy(options, upload_part_options, target_directory_key, target_file_key)
158
+ else
159
+ service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
160
+ end
161
+
102
162
  target_directory = service.directories.new(:key => target_directory_key)
103
163
  target_directory.files.head(target_file_key)
104
164
  end
@@ -192,6 +252,8 @@ module Fog
192
252
  # @option options [String] expires sets number of seconds before AWS Object expires.
193
253
  # @option options [String] storage_class sets x-amz-storage-class HTTP header. Defaults to 'STANDARD'. Or, 'REDUCED_REDUNDANCY'
194
254
  # @option options [String] encryption sets HTTP encryption header. Set to 'AES256' to encrypt files at rest on S3
255
+ # @option options [String] tags sets x-amz-tagging HTTP header. For example, 'Org-Id=1' or 'Org-Id=1&Service=MyService'
256
+ # @option options [String] website_redirect_location sets x-amz-website-redirect-location HTTP header. For example, 'website_redirect_location=http://www.rubydoc.info/github/fog/fog-aws'
195
257
  # @return [Boolean] true if no errors
196
258
  #
197
259
  def save(options = {})
@@ -208,12 +270,12 @@ module Fog
208
270
  options['Expires'] = expires if expires
209
271
  options.merge!(metadata)
210
272
  options['x-amz-storage-class'] = storage_class if storage_class
273
+ options['x-amz-tagging'] = tags if tags
274
+ options['x-amz-website-redirect-location'] = website_redirect_location if website_redirect_location
211
275
  options.merge!(encryption_headers)
212
276
 
213
- # With a single PUT operation you can upload objects up to 5 GB in size. Automatically set MP for larger objects.
214
- self.multipart_chunk_size = 5242880 if !multipart_chunk_size && Fog::Storage.get_body_size(body) > 5368709120
215
-
216
- if multipart_chunk_size && Fog::Storage.get_body_size(body) >= multipart_chunk_size && body.respond_to?(:read)
277
+ self.multipart_chunk_size = service.max_put_chunk_size if multipart_chunk_size.nil?
278
+ if multipart_chunk_size > 0 && Fog::Storage.get_body_size(body) >= multipart_chunk_size && body.respond_to?(:read)
217
279
  data = multipart_save(options)
218
280
  merge_attributes(data.body)
219
281
  else
@@ -273,12 +335,12 @@ module Fog
273
335
  body.rewind rescue nil
274
336
  end
275
337
  while (chunk = body.read(multipart_chunk_size)) do
276
- part_upload = service.upload_part(directory.key, key, upload_id, part_tags.size + 1, chunk, part_headers(chunk, options))
338
+ part_upload = service.upload_part(directory.key, key, upload_id, part_tags.size + 1, chunk, part_headers(chunk))
277
339
  part_tags << part_upload.headers["ETag"]
278
340
  end
279
341
 
280
342
  if part_tags.empty? #it is an error to have a multipart upload with no parts
281
- part_upload = service.upload_part(directory.key, key, upload_id, 1, '', part_headers('', options))
343
+ part_upload = service.upload_part(directory.key, key, upload_id, 1, '', part_headers(''))
282
344
  part_tags << part_upload.headers["ETag"]
283
345
  end
284
346
 
@@ -291,6 +353,30 @@ module Fog
291
353
  service.complete_multipart_upload(directory.key, key, upload_id, part_tags)
292
354
  end
293
355
 
356
+ def multipart_copy(options, upload_part_options, target_directory_key, target_file_key)
357
+ # Initiate the upload
358
+ res = service.initiate_multipart_upload(target_directory_key, target_file_key, options)
359
+ upload_id = res.body["UploadId"]
360
+
361
+ # Store ETags of upload parts
362
+ part_tags = []
363
+ pending = PartList.new(create_part_list(upload_part_options))
364
+ thread_count = self.concurrency
365
+ completed = PartList.new
366
+ errors = upload_in_threads(target_directory_key, target_file_key, upload_id, pending, completed, thread_count)
367
+
368
+ raise errors.first if errors.any?
369
+
370
+ part_tags = completed.to_a.sort_by { |part| part.part_number }.map(&:etag)
371
+ rescue => e
372
+ # Abort the upload & reraise
373
+ service.abort_multipart_upload(target_directory_key, target_file_key, upload_id) if upload_id
374
+ raise
375
+ else
376
+ # Complete the upload
377
+ service.complete_multipart_upload(target_directory_key, target_file_key, upload_id, part_tags)
378
+ end
379
+
294
380
  def encryption_headers
295
381
  if encryption && encryption_key
296
382
  encryption_customer_key_headers
@@ -301,11 +387,18 @@ module Fog
301
387
  end
302
388
  end
303
389
 
304
- def part_headers(chunk, options)
305
- md5 = Base64.encode64(OpenSSL::Digest::MD5.digest(chunk)).strip
306
- encryption_keys = encryption_customer_key_headers.keys
307
- encryption_headers = options.select { |key| encryption_keys.include?(key) }
308
- { 'Content-MD5' => md5 }.merge(encryption_headers)
390
+ def part_headers(chunk)
391
+ base_headers = part_checksum_headers(chunk)
392
+
393
+ # Only SSE-C headers needed in the UploadPart request. [1]
394
+ # x-amz-server-side-encryption and
395
+ # x-amz-server-side-encryption-aws-kms-key-id are only needed
396
+ # in the CreateMultipartUpload request. [2]
397
+ # [1] https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html
398
+ # [2] https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html
399
+ base_headers.merge!(encryption_customer_key_headers) if encryption && encryption_key
400
+
401
+ base_headers
309
402
  end
310
403
 
311
404
  def encryption_customer_key_headers
@@ -315,6 +408,57 @@ module Fog
315
408
  'x-amz-server-side-encryption-customer-key-md5' => Base64.encode64(OpenSSL::Digest::MD5.digest(encryption_key.to_s)).chomp!
316
409
  }
317
410
  end
411
+
412
+ def part_checksum_headers(chunk)
413
+ if service.disable_content_md5_validation
414
+ {}
415
+ else
416
+ { 'Content-MD5' => Base64.encode64(OpenSSL::Digest::MD5.digest(chunk)).strip }
417
+ end
418
+ end
419
+
420
+ def create_part_list(upload_part_options)
421
+ current_pos = 0
422
+ count = 0
423
+ pending = []
424
+
425
+ while current_pos < self.content_length do
426
+ start_pos = current_pos
427
+ end_pos = [current_pos + self.multipart_chunk_size, self.content_length - 1].min
428
+ range = "bytes=#{start_pos}-#{end_pos}"
429
+ part_options = upload_part_options.dup
430
+ part_options['x-amz-copy-source-range'] = range
431
+ pending << UploadPartData.new(count + 1, part_options, nil)
432
+ count += 1
433
+ current_pos = end_pos + 1
434
+ end
435
+
436
+ pending
437
+ end
438
+
439
+ def upload_in_threads(target_directory_key, target_file_key, upload_id, pending, completed, thread_count)
440
+ threads = []
441
+
442
+ thread_count.times do
443
+ thread = Thread.new do
444
+ begin
445
+ while part = pending.shift
446
+ part_upload = service.upload_part_copy(target_directory_key, target_file_key, upload_id, part.part_number, part.upload_options)
447
+ part.etag = part_upload.body['ETag']
448
+ completed.push(part)
449
+ end
450
+ rescue => error
451
+ pending.clear!
452
+ error
453
+ end
454
+ end
455
+
456
+ thread.abort_on_exception = true
457
+ threads << thread
458
+ end
459
+
460
+ threads.map(&:value).compact
461
+ end
318
462
  end
319
463
  end
320
464
  end
@@ -17,6 +17,15 @@ module Fog
17
17
 
18
18
  model Fog::AWS::Storage::File
19
19
 
20
+ DASHED_HEADERS = %w(
21
+ Cache-Control
22
+ Content-Disposition
23
+ Content-Encoding
24
+ Content-Length
25
+ Content-MD5
26
+ Content-Type
27
+ ).freeze
28
+
20
29
  def all(options = {})
21
30
  requires :directory
22
31
  options = {
@@ -114,8 +123,29 @@ module Fog
114
123
  end
115
124
 
116
125
  def normalize_headers(data)
117
- data.headers['Last-Modified'] = Time.parse(data.get_header('Last-Modified'))
118
- data.headers['ETag'] = data.get_header('ETag').gsub('"','')
126
+ data.headers['Last-Modified'] = Time.parse(fetch_and_delete_header(data, 'Last-Modified'))
127
+
128
+ etag = fetch_and_delete_header(data, 'ETag').gsub('"','')
129
+ data.headers['ETag'] = etag
130
+
131
+ DASHED_HEADERS.each do |header|
132
+ value = fetch_and_delete_header(data, header)
133
+ data.headers[header] = value if value
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def fetch_and_delete_header(response, header)
140
+ value = response.get_header(header)
141
+
142
+ return unless value
143
+
144
+ response.headers.keys.each do |key|
145
+ response.headers.delete(key) if key.downcase == header.downcase
146
+ end
147
+
148
+ value
119
149
  end
120
150
  end
121
151
  end
@@ -5,7 +5,7 @@ module Fog
5
5
  class CreateSnapshot < Fog::Parsers::Base
6
6
  def end_element(name)
7
7
  case name
8
- when 'description', 'ownerId', 'progress', 'snapshotId', 'status', 'volumeId'
8
+ when 'description', 'ownerId', 'progress', 'snapshotId', 'status', 'volumeId', 'statusMessage'
9
9
  @response[name] = value
10
10
  when 'requestId'
11
11
  @response[name] = value
@@ -7,6 +7,10 @@ module Fog
7
7
  @subnet = { 'tagSet' => {} }
8
8
  @response = { 'subnet' => [] }
9
9
  @tag = {}
10
+ @ipv6_cidr_block_association = {}
11
+ @in_tag_set = false
12
+ @in_ipv6_cidr_block_association_set = false
13
+ @in_cidr_block_state = false
10
14
  end
11
15
 
12
16
  def start_element(name, attrs = [])
@@ -14,19 +18,42 @@ module Fog
14
18
  case name
15
19
  when 'tagSet'
16
20
  @in_tag_set = true
21
+ when 'ipv6CidrBlockAssociationSet'
22
+ @in_ipv6_cidr_block_association_set = true
23
+ when 'ipv6CidrBlockState'
24
+ @in_cidr_block_state = true
17
25
  end
18
26
  end
19
27
 
20
28
  def end_element(name)
21
29
  if @in_tag_set
22
30
  case name
31
+ when 'item'
32
+ @subnet['tagSet'][@tag['key']] = @tag['value']
33
+ @tag = {}
34
+ when 'key', 'value'
35
+ @tag[name] = value
36
+ when 'tagSet'
37
+ @in_tag_set = false
38
+ end
39
+ elsif @in_ipv6_cidr_block_association_set
40
+ if @in_cidr_block_state
41
+ case name
42
+ when 'state'
43
+ @ipv6_cidr_block_association['ipv6CidrBlockState'] = { name => value }
44
+ when 'ipv6CidrBlockState'
45
+ @in_cidr_block_state = false
46
+ end
47
+ else
48
+ case name
23
49
  when 'item'
24
- @subnet['tagSet'][@tag['key']] = @tag['value']
25
- @tag = {}
26
- when 'key', 'value'
27
- @tag[name] = value
28
- when 'tagSet'
29
- @in_tag_set = false
50
+ @subnet['ipv6CidrBlockAssociationSet'] = @ipv6_cidr_block_association
51
+ @ipv6_cidr_block_association = {}
52
+ when 'ipv6CidrBlock', 'associationId'
53
+ @ipv6_cidr_block_association[name] = value
54
+ when 'ipv6CidrBlockAssociationSet'
55
+ @in_ipv6_cidr_block_association_set = false
56
+ end
30
57
  end
31
58
  else
32
59
  case name
@@ -5,9 +5,10 @@ module Fog
5
5
  class DescribeSecurityGroups < Fog::Parsers::Base
6
6
  def reset
7
7
  @group = {}
8
- @ip_permission = { 'groups' => [], 'ipRanges' => []}
9
- @ip_permission_egress = { 'groups' => [], 'ipRanges' => []}
8
+ @ip_permission = { 'groups' => [], 'ipRanges' => [], 'ipv6Ranges' => []}
9
+ @ip_permission_egress = { 'groups' => [], 'ipRanges' => [], 'ipv6Ranges' => []}
10
10
  @ip_range = {}
11
+ @ipv6_range = {}
11
12
  @security_group = { 'ipPermissions' => [], 'ipPermissionsEgress' => [], 'tagSet' => {} }
12
13
  @response = { 'securityGroupInfo' => [] }
13
14
  @tag = {}
@@ -24,6 +25,8 @@ module Fog
24
25
  @in_ip_permissions_egress = true
25
26
  when 'ipRanges'
26
27
  @in_ip_ranges = true
28
+ when 'ipv6Ranges'
29
+ @in_ipv6_ranges = true
27
30
  when 'tagSet'
28
31
  @in_tag_set = true
29
32
  end
@@ -44,6 +47,8 @@ module Fog
44
47
  case name
45
48
  when 'cidrIp'
46
49
  @ip_range[name] = value
50
+ when 'cidrIpv6'
51
+ @ipv6_range[name] = value
47
52
  when 'fromPort', 'toPort'
48
53
  if @in_ip_permissions_egress
49
54
  @ip_permission_egress[name] = value.to_i
@@ -72,6 +77,8 @@ module Fog
72
77
  end
73
78
  when 'ipRanges'
74
79
  @in_ip_ranges = false
80
+ when 'ipv6Ranges'
81
+ @in_ipv6_ranges = false
75
82
  when 'item'
76
83
  if @in_groups
77
84
  if @in_ip_permissions_egress
@@ -87,12 +94,19 @@ module Fog
87
94
  @ip_permission['ipRanges'] << @ip_range
88
95
  end
89
96
  @ip_range = {}
97
+ elsif @in_ipv6_ranges
98
+ if @in_ip_permissions_egress
99
+ @ip_permission_egress['ipv6Ranges'] << @ipv6_range
100
+ else
101
+ @ip_permission['ipv6Ranges'] << @ipv6_range
102
+ end
103
+ @ipv6_range = {}
90
104
  elsif @in_ip_permissions
91
105
  @security_group['ipPermissions'] << @ip_permission
92
- @ip_permission = { 'groups' => [], 'ipRanges' => []}
106
+ @ip_permission = { 'groups' => [], 'ipRanges' => [], 'ipv6Ranges' => []}
93
107
  elsif @in_ip_permissions_egress
94
108
  @security_group['ipPermissionsEgress'] << @ip_permission_egress
95
- @ip_permission_egress = { 'groups' => [], 'ipRanges' => []}
109
+ @ip_permission_egress = { 'groups' => [], 'ipRanges' => [], 'ipv6Ranges' => []}
96
110
  else
97
111
  @response['securityGroupInfo'] << @security_group
98
112
  @security_group = { 'ipPermissions' => [], 'ipPermissionsEgress' => [], 'tagSet' => {} }
@@ -7,6 +7,10 @@ module Fog
7
7
  @subnet = { 'tagSet' => {} }
8
8
  @response = { 'subnetSet' => [] }
9
9
  @tag = {}
10
+ @ipv6_cidr_block_association = {}
11
+ @in_tag_set = false
12
+ @in_ipv6_cidr_block_association_set = false
13
+ @in_cidr_block_state = false
10
14
  end
11
15
 
12
16
  def start_element(name, attrs = [])
@@ -14,19 +18,42 @@ module Fog
14
18
  case name
15
19
  when 'tagSet'
16
20
  @in_tag_set = true
21
+ when 'ipv6CidrBlockAssociationSet'
22
+ @in_ipv6_cidr_block_association_set = true
23
+ when 'ipv6CidrBlockState'
24
+ @in_cidr_block_state = true
17
25
  end
18
26
  end
19
27
 
20
28
  def end_element(name)
21
29
  if @in_tag_set
22
30
  case name
31
+ when 'item'
32
+ @subnet['tagSet'][@tag['key']] = @tag['value']
33
+ @tag = {}
34
+ when 'key', 'value'
35
+ @tag[name] = value
36
+ when 'tagSet'
37
+ @in_tag_set = false
38
+ end
39
+ elsif @in_ipv6_cidr_block_association_set
40
+ if @in_cidr_block_state
41
+ case name
42
+ when 'state'
43
+ @ipv6_cidr_block_association['ipv6CidrBlockState'] = { name => value }
44
+ when 'ipv6CidrBlockState'
45
+ @in_cidr_block_state = false
46
+ end
47
+ else
48
+ case name
23
49
  when 'item'
24
- @subnet['tagSet'][@tag['key']] = @tag['value']
25
- @tag = {}
26
- when 'key', 'value'
27
- @tag[name] = value
28
- when 'tagSet'
29
- @in_tag_set = false
50
+ @subnet['ipv6CidrBlockAssociationSet'] = @ipv6_cidr_block_association
51
+ @ipv6_cidr_block_association = {}
52
+ when 'ipv6CidrBlock', 'associationId'
53
+ @ipv6_cidr_block_association[name] = value
54
+ when 'ipv6CidrBlockAssociationSet'
55
+ @in_ipv6_cidr_block_association_set = false
56
+ end
30
57
  end
31
58
  else
32
59
  case name