fog-aws 3.5.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -765
  3. data/LICENSE.md +1 -1
  4. data/README.md +117 -7
  5. data/fog-aws.gemspec +14 -11
  6. data/lib/fog/aws/auto_scaling.rb +1 -1
  7. data/lib/fog/aws/beanstalk.rb +1 -1
  8. data/lib/fog/aws/cdn.rb +1 -1
  9. data/lib/fog/aws/cloud_formation.rb +1 -1
  10. data/lib/fog/aws/cloud_watch.rb +1 -1
  11. data/lib/fog/aws/compute.rb +8 -5
  12. data/lib/fog/aws/credential_fetcher.rb +89 -7
  13. data/lib/fog/aws/data_pipeline.rb +1 -1
  14. data/lib/fog/aws/dns.rb +137 -1
  15. data/lib/fog/aws/dynamodb.rb +1 -1
  16. data/lib/fog/aws/ecs.rb +1 -1
  17. data/lib/fog/aws/elasticache.rb +6 -4
  18. data/lib/fog/aws/elb.rb +2 -2
  19. data/lib/fog/aws/elbv2.rb +72 -0
  20. data/lib/fog/aws/emr.rb +1 -1
  21. data/lib/fog/aws/glacier.rb +84 -22
  22. data/lib/fog/aws/iam.rb +1 -1
  23. data/lib/fog/aws/kinesis.rb +24 -16
  24. data/lib/fog/aws/kms.rb +1 -1
  25. data/lib/fog/aws/lambda.rb +1 -1
  26. data/lib/fog/aws/models/compute/dhcp_option.rb +1 -1
  27. data/lib/fog/aws/models/compute/flavors.rb +3803 -531
  28. data/lib/fog/aws/models/compute/network_interfaces.rb +1 -1
  29. data/lib/fog/aws/models/compute/security_group.rb +13 -5
  30. data/lib/fog/aws/models/compute/server.rb +6 -2
  31. data/lib/fog/aws/models/compute/servers.rb +2 -0
  32. data/lib/fog/aws/models/compute/snapshot.rb +7 -6
  33. data/lib/fog/aws/models/compute/vpc.rb +8 -2
  34. data/lib/fog/aws/models/elasticache/cluster.rb +1 -1
  35. data/lib/fog/aws/models/storage/directories.rb +1 -0
  36. data/lib/fog/aws/models/storage/directory.rb +0 -1
  37. data/lib/fog/aws/models/storage/file.rb +168 -23
  38. data/lib/fog/aws/models/storage/files.rb +33 -2
  39. data/lib/fog/aws/parsers/compute/create_snapshot.rb +1 -1
  40. data/lib/fog/aws/parsers/compute/create_subnet.rb +33 -6
  41. data/lib/fog/aws/parsers/compute/describe_security_groups.rb +18 -4
  42. data/lib/fog/aws/parsers/compute/describe_subnets.rb +33 -6
  43. data/lib/fog/aws/parsers/dns/create_hosted_zone.rb +1 -1
  44. data/lib/fog/aws/parsers/dns/get_hosted_zone.rb +3 -3
  45. data/lib/fog/aws/parsers/dns/list_hosted_zones.rb +3 -1
  46. data/lib/fog/aws/parsers/elbv2/create_load_balancer.rb +88 -0
  47. data/lib/fog/aws/parsers/elbv2/describe_listeners.rb +110 -0
  48. data/lib/fog/aws/parsers/elbv2/describe_load_balancers.rb +88 -0
  49. data/lib/fog/aws/parsers/elbv2/describe_tags.rb +53 -0
  50. data/lib/fog/aws/parsers/elbv2/empty.rb +10 -0
  51. data/lib/fog/aws/parsers/iam/get_group_policy.rb +1 -1
  52. data/lib/fog/aws/parsers/iam/get_role_policy.rb +1 -1
  53. data/lib/fog/aws/parsers/iam/get_user_policy.rb +1 -1
  54. data/lib/fog/aws/parsers/iam/list_server_certificates.rb +1 -1
  55. data/lib/fog/aws/parsers/iam/policy_version.rb +1 -1
  56. data/lib/fog/aws/parsers/rds/db_cluster_parser.rb +1 -1
  57. data/lib/fog/aws/parsers/rds/db_parser.rb +1 -1
  58. data/lib/fog/aws/parsers/rds/modify_db_subnet_group.rb +1 -1
  59. data/lib/fog/aws/parsers/redshift/cluster_subnet_group_parser.rb +1 -1
  60. data/lib/fog/aws/parsers/storage/get_object_tagging.rb +33 -0
  61. data/lib/fog/aws/parsers/storage/upload_part_copy_object.rb +18 -0
  62. data/lib/fog/aws/parsers/sts/assume_role_with_web_identity.rb +1 -1
  63. data/lib/fog/aws/rds.rb +1 -1
  64. data/lib/fog/aws/redshift.rb +1 -1
  65. data/lib/fog/aws/requests/auto_scaling/attach_load_balancer_target_groups.rb +1 -1
  66. data/lib/fog/aws/requests/auto_scaling/describe_scaling_activities.rb +1 -1
  67. data/lib/fog/aws/requests/auto_scaling/put_scheduled_update_group_action.rb +1 -1
  68. data/lib/fog/aws/requests/cloud_formation/create_change_set.rb +1 -1
  69. data/lib/fog/aws/requests/cloud_formation/create_stack.rb +1 -1
  70. data/lib/fog/aws/requests/cloud_formation/get_template_summary.rb +1 -1
  71. data/lib/fog/aws/requests/cloud_formation/update_stack.rb +1 -1
  72. data/lib/fog/aws/requests/cloud_watch/list_metrics.rb +1 -1
  73. data/lib/fog/aws/requests/compute/authorize_security_group_egress.rb +1 -1
  74. data/lib/fog/aws/requests/compute/authorize_security_group_ingress.rb +16 -1
  75. data/lib/fog/aws/requests/compute/create_network_interface.rb +8 -5
  76. data/lib/fog/aws/requests/compute/create_subnet.rb +3 -3
  77. data/lib/fog/aws/requests/compute/create_vpc.rb +3 -3
  78. data/lib/fog/aws/requests/compute/describe_network_interfaces.rb +2 -2
  79. data/lib/fog/aws/requests/compute/describe_security_groups.rb +2 -0
  80. data/lib/fog/aws/requests/compute/modify_network_interface_attribute.rb +1 -1
  81. data/lib/fog/aws/requests/compute/modify_volume.rb +1 -1
  82. data/lib/fog/aws/requests/compute/request_spot_instances.rb +1 -1
  83. data/lib/fog/aws/requests/compute/revoke_security_group_egress.rb +1 -1
  84. data/lib/fog/aws/requests/compute/revoke_security_group_ingress.rb +1 -1
  85. data/lib/fog/aws/requests/compute/run_instances.rb +64 -0
  86. data/lib/fog/aws/requests/compute/stop_instances.rb +11 -3
  87. data/lib/fog/aws/requests/data_pipeline/deactivate_pipeline.rb +1 -1
  88. data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +0 -133
  89. data/lib/fog/aws/requests/ecs/list_task_definitions.rb +1 -1
  90. data/lib/fog/aws/requests/efs/create_file_system.rb +1 -1
  91. data/lib/fog/aws/requests/elasticache/authorize_cache_security_group_ingress.rb +1 -1
  92. data/lib/fog/aws/requests/elasticache/create_cache_cluster.rb +2 -2
  93. data/lib/fog/aws/requests/elasticache/describe_engine_default_parameters.rb +1 -1
  94. data/lib/fog/aws/requests/elb/delete_load_balancer_listeners.rb +1 -1
  95. data/lib/fog/aws/requests/elbv2/add_tags.rb +45 -0
  96. data/lib/fog/aws/requests/elbv2/create_load_balancer.rb +160 -0
  97. data/lib/fog/aws/requests/elbv2/describe_listeners.rb +38 -0
  98. data/lib/fog/aws/requests/elbv2/describe_load_balancers.rb +100 -0
  99. data/lib/fog/aws/requests/elbv2/describe_tags.rb +50 -0
  100. data/lib/fog/aws/requests/elbv2/remove_tags.rb +45 -0
  101. data/lib/fog/aws/requests/glacier/initiate_job.rb +1 -1
  102. data/lib/fog/aws/requests/glacier/initiate_multipart_upload.rb +1 -1
  103. data/lib/fog/aws/requests/kinesis/list_streams.rb +1 -1
  104. data/lib/fog/aws/requests/lambda/invoke.rb +7 -7
  105. data/lib/fog/aws/requests/rds/add_tags_to_resource.rb +12 -10
  106. data/lib/fog/aws/requests/rds/authorize_db_security_group_ingress.rb +2 -2
  107. data/lib/fog/aws/requests/rds/create_db_cluster.rb +1 -1
  108. data/lib/fog/aws/requests/rds/describe_db_snapshots.rb +1 -1
  109. data/lib/fog/aws/requests/rds/list_tags_for_resource.rb +10 -7
  110. data/lib/fog/aws/requests/rds/modify_db_instance.rb +1 -1
  111. data/lib/fog/aws/requests/rds/modify_db_parameter_group.rb +1 -1
  112. data/lib/fog/aws/requests/rds/remove_tags_from_resource.rb +9 -8
  113. data/lib/fog/aws/requests/ses/send_raw_email.rb +1 -1
  114. data/lib/fog/aws/requests/sqs/change_message_visibility.rb +1 -1
  115. data/lib/fog/aws/requests/sqs/delete_message.rb +1 -1
  116. data/lib/fog/aws/requests/storage/copy_object.rb +2 -1
  117. data/lib/fog/aws/requests/storage/delete_multiple_objects.rb +18 -8
  118. data/lib/fog/aws/requests/storage/get_bucket.rb +2 -2
  119. data/lib/fog/aws/requests/storage/get_bucket_object_versions.rb +2 -2
  120. data/lib/fog/aws/requests/storage/get_object.rb +1 -1
  121. data/lib/fog/aws/requests/storage/get_object_tagging.rb +41 -0
  122. data/lib/fog/aws/requests/storage/get_service.rb +1 -1
  123. data/lib/fog/aws/requests/storage/list_parts.rb +1 -1
  124. data/lib/fog/aws/requests/storage/put_bucket.rb +0 -4
  125. data/lib/fog/aws/requests/storage/put_bucket_lifecycle.rb +1 -1
  126. data/lib/fog/aws/requests/storage/put_bucket_notification.rb +1 -1
  127. data/lib/fog/aws/requests/storage/put_object.rb +1 -1
  128. data/lib/fog/aws/requests/storage/put_object_tagging.rb +42 -0
  129. data/lib/fog/aws/requests/storage/shared_mock_methods.rb +2 -1
  130. data/lib/fog/aws/requests/storage/sync_clock.rb +9 -1
  131. data/lib/fog/aws/requests/storage/upload_part_copy.rb +119 -0
  132. data/lib/fog/aws/requests/sts/assume_role_with_web_identity.rb +7 -6
  133. data/lib/fog/aws/ses.rb +20 -17
  134. data/lib/fog/aws/signaturev4.rb +1 -1
  135. data/lib/fog/aws/simpledb.rb +1 -1
  136. data/lib/fog/aws/sns.rb +1 -1
  137. data/lib/fog/aws/sqs.rb +1 -1
  138. data/lib/fog/aws/storage.rb +78 -13
  139. data/lib/fog/aws/support.rb +1 -1
  140. data/lib/fog/aws/version.rb +1 -1
  141. data/lib/fog/aws.rb +11 -2
  142. metadata +49 -294
  143. data/.gitignore +0 -16
  144. data/.travis.yml +0 -53
  145. data/Gemfile +0 -14
  146. data/Rakefile +0 -14
  147. data/gemfiles/Gemfile-edge +0 -14
  148. data/gemfiles/Gemfile-ruby-2.0 +0 -7
  149. data/stale.yml +0 -17
  150. data/tests/credentials_tests.rb +0 -87
  151. data/tests/helper.rb +0 -29
  152. data/tests/helpers/collection_helper.rb +0 -90
  153. data/tests/helpers/compute/flavors_helper.rb +0 -28
  154. data/tests/helpers/compute/server_helper.rb +0 -23
  155. data/tests/helpers/compute/servers_helper.rb +0 -8
  156. data/tests/helpers/dns_helper.rb +0 -56
  157. data/tests/helpers/formats_helper.rb +0 -100
  158. data/tests/helpers/formats_helper_tests.rb +0 -107
  159. data/tests/helpers/mock_helper.rb +0 -109
  160. data/tests/helpers/model_helper.rb +0 -30
  161. data/tests/helpers/responds_to_helper.rb +0 -11
  162. data/tests/helpers/schema_validator_tests.rb +0 -104
  163. data/tests/helpers/succeeds_helper.rb +0 -9
  164. data/tests/lorem.txt +0 -1
  165. data/tests/models/auto_scaling/activities_tests.rb +0 -6
  166. data/tests/models/auto_scaling/configuration_test.rb +0 -13
  167. data/tests/models/auto_scaling/configurations_tests.rb +0 -11
  168. data/tests/models/auto_scaling/groups_test.rb +0 -27
  169. data/tests/models/auto_scaling/helper.rb +0 -0
  170. data/tests/models/auto_scaling/instance_tests.rb +0 -15
  171. data/tests/models/auto_scaling/instances_tests.rb +0 -6
  172. data/tests/models/beanstalk/application_tests.rb +0 -69
  173. data/tests/models/beanstalk/applications_tests.rb +0 -7
  174. data/tests/models/beanstalk/environment_tests.rb +0 -131
  175. data/tests/models/beanstalk/environments_tests.rb +0 -34
  176. data/tests/models/beanstalk/template_tests.rb +0 -47
  177. data/tests/models/beanstalk/templates_tests.rb +0 -62
  178. data/tests/models/beanstalk/version_tests.rb +0 -66
  179. data/tests/models/beanstalk/versions_tests.rb +0 -60
  180. data/tests/models/cdn/distribution_tests.rb +0 -15
  181. data/tests/models/cdn/distributions_tests.rb +0 -15
  182. data/tests/models/cdn/invalidation_tests.rb +0 -31
  183. data/tests/models/cdn/invalidations_tests.rb +0 -14
  184. data/tests/models/cdn/streaming_distribution_tests.rb +0 -15
  185. data/tests/models/cdn/streaming_distributions_tests.rb +0 -15
  186. data/tests/models/cloud_watch/alarm_data_tests.rb +0 -42
  187. data/tests/models/cloud_watch/alarm_history_tests.rb +0 -22
  188. data/tests/models/cloud_watch/metric_statistics_tests.rb +0 -51
  189. data/tests/models/cloud_watch/metrics_tests.rb +0 -32
  190. data/tests/models/compute/address_tests.rb +0 -43
  191. data/tests/models/compute/addresses_tests.rb +0 -5
  192. data/tests/models/compute/dhcp_option_tests.rb +0 -3
  193. data/tests/models/compute/dhcp_options_tests.rb +0 -3
  194. data/tests/models/compute/internet_gateway_tests.rb +0 -3
  195. data/tests/models/compute/internet_gateways_tests.rb +0 -3
  196. data/tests/models/compute/key_pair_tests.rb +0 -26
  197. data/tests/models/compute/key_pairs_tests.rb +0 -5
  198. data/tests/models/compute/network_acl_tests.rb +0 -109
  199. data/tests/models/compute/network_acls_tests.rb +0 -20
  200. data/tests/models/compute/network_interfaces_test.rb +0 -12
  201. data/tests/models/compute/security_group_tests.rb +0 -98
  202. data/tests/models/compute/security_groups_tests.rb +0 -5
  203. data/tests/models/compute/server_tests.rb +0 -94
  204. data/tests/models/compute/snapshot_tests.rb +0 -10
  205. data/tests/models/compute/snapshots_tests.rb +0 -10
  206. data/tests/models/compute/subnet_tests.rb +0 -13
  207. data/tests/models/compute/subnets_tests.rb +0 -5
  208. data/tests/models/compute/volume_tests.rb +0 -65
  209. data/tests/models/compute/volumes_tests.rb +0 -5
  210. data/tests/models/compute/vpc_tests.rb +0 -26
  211. data/tests/models/compute/vpcs_tests.rb +0 -19
  212. data/tests/models/data_pipeline/pipeline_tests.rb +0 -8
  213. data/tests/models/data_pipeline/pipelines_tests.rb +0 -8
  214. data/tests/models/dns/record_tests.rb +0 -33
  215. data/tests/models/dns/records_tests.rb +0 -41
  216. data/tests/models/dns/zone_tests.rb +0 -4
  217. data/tests/models/dns/zones_tests.rb +0 -4
  218. data/tests/models/efs/file_system_tests.rb +0 -12
  219. data/tests/models/efs/mount_target_tests.rb +0 -45
  220. data/tests/models/efs/mount_targets_tests.rb +0 -30
  221. data/tests/models/elasticache/cluster_tests.rb +0 -30
  222. data/tests/models/elasticache/parameter_groups_tests.rb +0 -15
  223. data/tests/models/elasticache/security_groups_tests.rb +0 -52
  224. data/tests/models/elasticache/subnet_groups_tests.rb +0 -43
  225. data/tests/models/elb/model_tests.rb +0 -360
  226. data/tests/models/elb/tagging_tests.rb +0 -15
  227. data/tests/models/glacier/model_tests.rb +0 -47
  228. data/tests/models/iam/access_keys_tests.rb +0 -53
  229. data/tests/models/iam/groups_tests.rb +0 -59
  230. data/tests/models/iam/instance_profile_tests.rb +0 -18
  231. data/tests/models/iam/managed_policies_tests.rb +0 -89
  232. data/tests/models/iam/policies_tests.rb +0 -57
  233. data/tests/models/iam/roles_tests.rb +0 -71
  234. data/tests/models/iam/users_tests.rb +0 -119
  235. data/tests/models/rds/cluster_tests.rb +0 -54
  236. data/tests/models/rds/clusters_tests.rb +0 -5
  237. data/tests/models/rds/event_subscription_tests.rb +0 -9
  238. data/tests/models/rds/event_subscriptions_tests.rb +0 -6
  239. data/tests/models/rds/helper.rb +0 -25
  240. data/tests/models/rds/instance_option_tests.rb +0 -14
  241. data/tests/models/rds/parameter_group_tests.rb +0 -24
  242. data/tests/models/rds/parameter_groups_tests.rb +0 -8
  243. data/tests/models/rds/security_group_tests.rb +0 -77
  244. data/tests/models/rds/security_groups_tests.rb +0 -5
  245. data/tests/models/rds/server_tests.rb +0 -131
  246. data/tests/models/rds/servers_tests.rb +0 -24
  247. data/tests/models/rds/snapshot_tests.rb +0 -12
  248. data/tests/models/rds/snapshots_tests.rb +0 -12
  249. data/tests/models/rds/tagging_tests.rb +0 -20
  250. data/tests/models/sns/topic_tests.rb +0 -15
  251. data/tests/models/sns/topics_tests.rb +0 -6
  252. data/tests/models/storage/directory_tests.rb +0 -91
  253. data/tests/models/storage/file_tests.rb +0 -129
  254. data/tests/models/storage/files_tests.rb +0 -58
  255. data/tests/models/storage/url_tests.rb +0 -25
  256. data/tests/models/storage/version_tests.rb +0 -52
  257. data/tests/models/storage/versions_tests.rb +0 -51
  258. data/tests/models/support/trusted_advisor_tests.rb +0 -25
  259. data/tests/parsers/compute/describe_images_tests.rb +0 -33
  260. data/tests/parsers/elb/describe_load_balancers.rb +0 -65
  261. data/tests/requests/auto_scaling/auto_scaling_tests.rb +0 -111
  262. data/tests/requests/auto_scaling/describe_types_tests.rb +0 -102
  263. data/tests/requests/auto_scaling/helper.rb +0 -229
  264. data/tests/requests/auto_scaling/model_tests.rb +0 -235
  265. data/tests/requests/auto_scaling/notification_configuration_tests.rb +0 -124
  266. data/tests/requests/auto_scaling/tag_tests.rb +0 -63
  267. data/tests/requests/beanstalk/application_tests.rb +0 -140
  268. data/tests/requests/beanstalk/solution_stack_tests.rb +0 -22
  269. data/tests/requests/cdn/cdn_tests.rb +0 -252
  270. data/tests/requests/cloud_formation/stack_tests.rb +0 -167
  271. data/tests/requests/cloud_watch/get_metric_statistics_tests.rb +0 -28
  272. data/tests/requests/cloud_watch/list_metrics_test.rb +0 -64
  273. data/tests/requests/cloud_watch/put_metric_data_tests.rb +0 -36
  274. data/tests/requests/compute/address_tests.rb +0 -144
  275. data/tests/requests/compute/assign_private_ip_tests.rb +0 -55
  276. data/tests/requests/compute/availability_zone_tests.rb +0 -25
  277. data/tests/requests/compute/client_tests.rb +0 -25
  278. data/tests/requests/compute/dhcp_options_tests.rb +0 -39
  279. data/tests/requests/compute/helper.rb +0 -27
  280. data/tests/requests/compute/image_tests.rb +0 -169
  281. data/tests/requests/compute/instance_attrib_tests.rb +0 -168
  282. data/tests/requests/compute/instance_tests.rb +0 -338
  283. data/tests/requests/compute/internet_gateway_tests.rb +0 -49
  284. data/tests/requests/compute/key_pair_tests.rb +0 -67
  285. data/tests/requests/compute/network_acl_tests.rb +0 -112
  286. data/tests/requests/compute/network_interface_tests.rb +0 -239
  287. data/tests/requests/compute/placement_group_tests.rb +0 -48
  288. data/tests/requests/compute/region_tests.rb +0 -52
  289. data/tests/requests/compute/route_tests.rb +0 -341
  290. data/tests/requests/compute/security_group_tests.rb +0 -446
  291. data/tests/requests/compute/snapshot_tests.rb +0 -77
  292. data/tests/requests/compute/spot_datafeed_subscription_tests.rb +0 -47
  293. data/tests/requests/compute/spot_instance_tests.rb +0 -55
  294. data/tests/requests/compute/spot_price_history_tests.rb +0 -23
  295. data/tests/requests/compute/subnet_tests.rb +0 -87
  296. data/tests/requests/compute/tag_tests.rb +0 -101
  297. data/tests/requests/compute/volume_tests.rb +0 -263
  298. data/tests/requests/compute/vpc_tests.rb +0 -216
  299. data/tests/requests/data_pipeline/helper.rb +0 -78
  300. data/tests/requests/data_pipeline/pipeline_tests.rb +0 -80
  301. data/tests/requests/dns/change_resource_record_sets_tests.rb +0 -34
  302. data/tests/requests/dns/dns_tests.rb +0 -240
  303. data/tests/requests/dns/health_check_tests.rb +0 -159
  304. data/tests/requests/dns/helper.rb +0 -21
  305. data/tests/requests/dynamodb/item_tests.rb +0 -137
  306. data/tests/requests/dynamodb/table_tests.rb +0 -99
  307. data/tests/requests/ecs/cluster_tests.rb +0 -112
  308. data/tests/requests/ecs/container_instance_tests.rb +0 -119
  309. data/tests/requests/ecs/helper.rb +0 -276
  310. data/tests/requests/ecs/sample_task_definition1.json +0 -56
  311. data/tests/requests/ecs/service_tests.rb +0 -132
  312. data/tests/requests/ecs/task_definitions_tests.rb +0 -97
  313. data/tests/requests/ecs/task_tests.rb +0 -145
  314. data/tests/requests/efs/file_system_tests.rb +0 -152
  315. data/tests/requests/efs/helper.rb +0 -44
  316. data/tests/requests/elasticache/cache_cluster_tests.rb +0 -137
  317. data/tests/requests/elasticache/describe_events.rb +0 -17
  318. data/tests/requests/elasticache/describe_reserved_cache_nodes.rb +0 -17
  319. data/tests/requests/elasticache/helper.rb +0 -103
  320. data/tests/requests/elasticache/parameter_group_tests.rb +0 -105
  321. data/tests/requests/elasticache/security_group_tests.rb +0 -108
  322. data/tests/requests/elasticache/subnet_group_tests.rb +0 -52
  323. data/tests/requests/elb/helper.rb +0 -91
  324. data/tests/requests/elb/listener_tests.rb +0 -68
  325. data/tests/requests/elb/load_balancer_tests.rb +0 -89
  326. data/tests/requests/elb/policy_tests.rb +0 -132
  327. data/tests/requests/emr/helper.rb +0 -167
  328. data/tests/requests/emr/instance_group_tests.rb +0 -106
  329. data/tests/requests/emr/job_flow_tests.rb +0 -88
  330. data/tests/requests/federation/get_signin_token_tests.rb +0 -11
  331. data/tests/requests/glacier/archive_tests.rb +0 -13
  332. data/tests/requests/glacier/multipart_upload_tests.rb +0 -29
  333. data/tests/requests/glacier/tree_hash_tests.rb +0 -62
  334. data/tests/requests/glacier/vault_tests.rb +0 -35
  335. data/tests/requests/iam/access_key_tests.rb +0 -53
  336. data/tests/requests/iam/account_policy_tests.rb +0 -20
  337. data/tests/requests/iam/account_tests.rb +0 -34
  338. data/tests/requests/iam/group_policy_tests.rb +0 -48
  339. data/tests/requests/iam/group_tests.rb +0 -44
  340. data/tests/requests/iam/helper.rb +0 -154
  341. data/tests/requests/iam/instance_profile_tests.rb +0 -44
  342. data/tests/requests/iam/login_profile_tests.rb +0 -62
  343. data/tests/requests/iam/managed_policy_tests.rb +0 -110
  344. data/tests/requests/iam/mfa_tests.rb +0 -23
  345. data/tests/requests/iam/role_tests.rb +0 -156
  346. data/tests/requests/iam/server_certificate_tests.rb +0 -130
  347. data/tests/requests/iam/user_policy_tests.rb +0 -45
  348. data/tests/requests/iam/user_tests.rb +0 -78
  349. data/tests/requests/iam/versioned_managed_policy_tests.rb +0 -105
  350. data/tests/requests/kinesis/helper.rb +0 -111
  351. data/tests/requests/kinesis/stream_tests.rb +0 -169
  352. data/tests/requests/kms/helper.rb +0 -27
  353. data/tests/requests/kms/key_tests.rb +0 -23
  354. data/tests/requests/lambda/function_sample_1.js +0 -9
  355. data/tests/requests/lambda/function_sample_2.js +0 -9
  356. data/tests/requests/lambda/function_tests.rb +0 -460
  357. data/tests/requests/lambda/helper.rb +0 -81
  358. data/tests/requests/rds/cluster_snapshot_tests.rb +0 -43
  359. data/tests/requests/rds/cluster_tests.rb +0 -37
  360. data/tests/requests/rds/db_engine_versions.rb +0 -7
  361. data/tests/requests/rds/db_snapshot_tests.rb +0 -62
  362. data/tests/requests/rds/describe_events.rb +0 -16
  363. data/tests/requests/rds/event_subscription_tests.rb +0 -30
  364. data/tests/requests/rds/helper.rb +0 -406
  365. data/tests/requests/rds/instance_option_tests.rb +0 -27
  366. data/tests/requests/rds/instance_tests.rb +0 -149
  367. data/tests/requests/rds/log_file_tests.rb +0 -19
  368. data/tests/requests/rds/parameter_group_tests.rb +0 -62
  369. data/tests/requests/rds/parameter_request_tests.rb +0 -32
  370. data/tests/requests/rds/security_group_tests.rb +0 -101
  371. data/tests/requests/rds/subnet_groups_tests.rb +0 -52
  372. data/tests/requests/rds/tagging_tests.rb +0 -78
  373. data/tests/requests/redshift/cluster_parameter_group_tests.rb +0 -76
  374. data/tests/requests/redshift/cluster_security_group_tests.rb +0 -42
  375. data/tests/requests/redshift/cluster_snapshot_tests.rb +0 -73
  376. data/tests/requests/redshift/cluster_tests.rb +0 -80
  377. data/tests/requests/ses/helper.rb +0 -9
  378. data/tests/requests/ses/verified_domain_identity_tests.rb +0 -16
  379. data/tests/requests/ses/verified_email_address_tests.rb +0 -27
  380. data/tests/requests/simpledb/attributes_tests.rb +0 -86
  381. data/tests/requests/simpledb/domain_tests.rb +0 -51
  382. data/tests/requests/simpledb/helper.rb +0 -10
  383. data/tests/requests/sns/helper.rb +0 -9
  384. data/tests/requests/sns/subscription_tests.rb +0 -86
  385. data/tests/requests/sns/topic_tests.rb +0 -53
  386. data/tests/requests/sqs/helper.rb +0 -9
  387. data/tests/requests/sqs/message_tests.rb +0 -51
  388. data/tests/requests/sqs/queue_tests.rb +0 -50
  389. data/tests/requests/storage/acl_utils_tests.rb +0 -209
  390. data/tests/requests/storage/bucket_tests.rb +0 -416
  391. data/tests/requests/storage/cors_utils_tests.rb +0 -108
  392. data/tests/requests/storage/delete_multiple_objects_tests.rb +0 -12
  393. data/tests/requests/storage/multipart_upload_tests.rb +0 -121
  394. data/tests/requests/storage/object_tests.rb +0 -262
  395. data/tests/requests/storage/versioning_tests.rb +0 -262
  396. data/tests/requests/sts/assume_role_tests.rb +0 -19
  397. data/tests/requests/sts/assume_role_with_saml_tests.rb +0 -18
  398. data/tests/requests/sts/assume_role_with_web_identity_tests.rb +0 -28
  399. data/tests/requests/sts/get_federation_token_tests.rb +0 -20
  400. data/tests/requests/sts/session_token_tests.rb +0 -16
  401. data/tests/requests/support/helper.rb +0 -43
  402. data/tests/requests/support/trusted_advisor_check_tests.rb +0 -16
  403. data/tests/signaturev4_tests.rb +0 -106
  404. data/tests/signed_params_tests.rb +0 -17
  405. data/tests/storage_tests.rb +0 -7
@@ -54,7 +54,7 @@ module Fog
54
54
  #
55
55
  # Returns an array of all network interfaces
56
56
  #
57
- #>> AWS.network_interfaves.all
57
+ #>> AWS.network_interfaces.all
58
58
  # <Fog::AWS::Compute::NetworkInterfaces
59
59
  # filters={}
60
60
  # [
@@ -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)
@@ -54,7 +54,7 @@ module Fog
54
54
  :engine_version => engine_version,
55
55
  :notification_topic_arn => notification_config['TopicArn'],
56
56
  :port => port,
57
- :preferred_availablility_zone => zone,
57
+ :preferred_availability_zone => zone,
58
58
  :preferred_maintenance_window => maintenance_window,
59
59
  :s3_snapshot_location => s3_snapshot_location,
60
60
  :parameter_group_name => parameter_group_name || parameter_group['CacheParameterGroupName'],
@@ -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
@@ -120,7 +180,8 @@ module Fog
120
180
 
121
181
  remove_method :metadata
122
182
  def metadata
123
- attributes.reject {|key, value| !(key.to_s =~ /^x-amz-/)}
183
+ attributes.reject {|key, value| !(key.to_s =~ /^x-amz-/) }
184
+ .reject {|key, value| ['x-amz-id-2', 'x-amz-request-id'].include?(key) }
124
185
  end
125
186
 
126
187
  remove_method :metadata=
@@ -185,13 +246,15 @@ module Fog
185
246
  # @param [Hash] options
186
247
  # @option options [String] acl sets x-amz-acl HTTP header. Valid values include, private | public-read | public-read-write | authenticated-read | bucket-owner-read | bucket-owner-full-control
187
248
  # @option options [String] cache_control sets Cache-Control header. For example, 'No-cache'
188
- # @option options [String] content_disposition sets Content-Disposition HTTP header. For exampple, 'attachment; filename=testing.txt'
249
+ # @option options [String] content_disposition sets Content-Disposition HTTP header. For example, 'attachment; filename=testing.txt'
189
250
  # @option options [String] content_encoding sets Content-Encoding HTTP header. For example, 'x-gzip'
190
251
  # @option options [String] content_md5 sets Content-MD5. For example, '79054025255fb1a26e4bc422aef54eb4'
191
252
  # @option options [String] content_type Content-Type. For example, 'text/plain'
192
253
  # @option options [String] expires sets number of seconds before AWS Object expires.
193
254
  # @option options [String] storage_class sets x-amz-storage-class HTTP header. Defaults to 'STANDARD'. Or, 'REDUCED_REDUNDANCY'
194
255
  # @option options [String] encryption sets HTTP encryption header. Set to 'AES256' to encrypt files at rest on S3
256
+ # @option options [String] tags sets x-amz-tagging HTTP header. For example, 'Org-Id=1' or 'Org-Id=1&Service=MyService'
257
+ # @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
258
  # @return [Boolean] true if no errors
196
259
  #
197
260
  def save(options = {})
@@ -208,17 +271,17 @@ module Fog
208
271
  options['Expires'] = expires if expires
209
272
  options.merge!(metadata)
210
273
  options['x-amz-storage-class'] = storage_class if storage_class
274
+ options['x-amz-tagging'] = tags if tags
275
+ options['x-amz-website-redirect-location'] = website_redirect_location if website_redirect_location
211
276
  options.merge!(encryption_headers)
212
277
 
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)
278
+ self.multipart_chunk_size = service.max_put_chunk_size if multipart_chunk_size.nil?
279
+ if multipart_chunk_size > 0 && Fog::Storage.get_body_size(body) >= multipart_chunk_size && body.respond_to?(:read)
217
280
  data = multipart_save(options)
218
281
  merge_attributes(data.body)
219
282
  else
220
283
  data = service.put_object(directory.key, key, body, options)
221
- merge_attributes(data.headers.reject {|key, value| ['Content-Length', 'Content-Type'].include?(key)})
284
+ merge_attributes(data.headers.reject {|key, value| ['Connection', 'Content-Length', 'Content-Type'].include?(key)})
222
285
  end
223
286
  self.etag = self.etag.gsub('"','') if self.etag
224
287
  self.content_length = Fog::Storage.get_body_size(body)
@@ -273,12 +336,12 @@ module Fog
273
336
  body.rewind rescue nil
274
337
  end
275
338
  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))
339
+ part_upload = service.upload_part(directory.key, key, upload_id, part_tags.size + 1, chunk, part_headers(chunk))
277
340
  part_tags << part_upload.headers["ETag"]
278
341
  end
279
342
 
280
343
  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))
344
+ part_upload = service.upload_part(directory.key, key, upload_id, 1, '', part_headers(''))
282
345
  part_tags << part_upload.headers["ETag"]
283
346
  end
284
347
 
@@ -291,6 +354,30 @@ module Fog
291
354
  service.complete_multipart_upload(directory.key, key, upload_id, part_tags)
292
355
  end
293
356
 
357
+ def multipart_copy(options, upload_part_options, target_directory_key, target_file_key)
358
+ # Initiate the upload
359
+ res = service.initiate_multipart_upload(target_directory_key, target_file_key, options)
360
+ upload_id = res.body["UploadId"]
361
+
362
+ # Store ETags of upload parts
363
+ part_tags = []
364
+ pending = PartList.new(create_part_list(upload_part_options))
365
+ thread_count = self.concurrency
366
+ completed = PartList.new
367
+ errors = upload_in_threads(target_directory_key, target_file_key, upload_id, pending, completed, thread_count)
368
+
369
+ raise errors.first if errors.any?
370
+
371
+ part_tags = completed.to_a.sort_by { |part| part.part_number }.map(&:etag)
372
+ rescue => e
373
+ # Abort the upload & reraise
374
+ service.abort_multipart_upload(target_directory_key, target_file_key, upload_id) if upload_id
375
+ raise
376
+ else
377
+ # Complete the upload
378
+ service.complete_multipart_upload(target_directory_key, target_file_key, upload_id, part_tags)
379
+ end
380
+
294
381
  def encryption_headers
295
382
  if encryption && encryption_key
296
383
  encryption_customer_key_headers
@@ -301,11 +388,18 @@ module Fog
301
388
  end
302
389
  end
303
390
 
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)
391
+ def part_headers(chunk)
392
+ base_headers = part_checksum_headers(chunk)
393
+
394
+ # Only SSE-C headers needed in the UploadPart request. [1]
395
+ # x-amz-server-side-encryption and
396
+ # x-amz-server-side-encryption-aws-kms-key-id are only needed
397
+ # in the CreateMultipartUpload request. [2]
398
+ # [1] https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html
399
+ # [2] https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html
400
+ base_headers.merge!(encryption_customer_key_headers) if encryption && encryption_key
401
+
402
+ base_headers
309
403
  end
310
404
 
311
405
  def encryption_customer_key_headers
@@ -315,6 +409,57 @@ module Fog
315
409
  'x-amz-server-side-encryption-customer-key-md5' => Base64.encode64(OpenSSL::Digest::MD5.digest(encryption_key.to_s)).chomp!
316
410
  }
317
411
  end
412
+
413
+ def part_checksum_headers(chunk)
414
+ if service.disable_content_md5_validation
415
+ {}
416
+ else
417
+ { 'Content-MD5' => Base64.encode64(OpenSSL::Digest::MD5.digest(chunk)).strip }
418
+ end
419
+ end
420
+
421
+ def create_part_list(upload_part_options)
422
+ current_pos = 0
423
+ count = 0
424
+ pending = []
425
+
426
+ while current_pos < self.content_length do
427
+ start_pos = current_pos
428
+ end_pos = [current_pos + self.multipart_chunk_size, self.content_length - 1].min
429
+ range = "bytes=#{start_pos}-#{end_pos}"
430
+ part_options = upload_part_options.dup
431
+ part_options['x-amz-copy-source-range'] = range
432
+ pending << UploadPartData.new(count + 1, part_options, nil)
433
+ count += 1
434
+ current_pos = end_pos + 1
435
+ end
436
+
437
+ pending
438
+ end
439
+
440
+ def upload_in_threads(target_directory_key, target_file_key, upload_id, pending, completed, thread_count)
441
+ threads = []
442
+
443
+ thread_count.times do
444
+ thread = Thread.new do
445
+ begin
446
+ while part = pending.shift
447
+ part_upload = service.upload_part_copy(target_directory_key, target_file_key, upload_id, part.part_number, part.upload_options)
448
+ part.etag = part_upload.body['ETag']
449
+ completed.push(part)
450
+ end
451
+ rescue => error
452
+ pending.clear!
453
+ error
454
+ end
455
+ end
456
+
457
+ thread.abort_on_exception = true
458
+ threads << thread
459
+ end
460
+
461
+ threads.map(&:value).compact
462
+ end
318
463
  end
319
464
  end
320
465
  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,30 @@ 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
+ if (etag = fetch_and_delete_header(data, 'ETag'))
129
+ data.headers['ETag'] = etag.gsub('"', '')
130
+ end
131
+
132
+ DASHED_HEADERS.each do |header|
133
+ value = fetch_and_delete_header(data, header)
134
+ data.headers[header] = value if value
135
+ end
136
+ end
137
+
138
+ private
139
+
140
+ def fetch_and_delete_header(response, header)
141
+ value = response.get_header(header)
142
+
143
+ return unless value
144
+
145
+ response.headers.keys.each do |key|
146
+ response.headers.delete(key) if key.downcase == header.downcase
147
+ end
148
+
149
+ value
119
150
  end
120
151
  end
121
152
  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' => {} }