fog 1.5.0 → 1.6.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 (355) hide show
  1. data/.travis.yml +21 -0
  2. data/README.md +3 -1
  3. data/Rakefile +4 -1
  4. data/changelog.txt +462 -0
  5. data/docs/storage/index.markdown +4 -4
  6. data/fog.gemspec +2 -2
  7. data/lib/fog.rb +1 -1
  8. data/lib/fog/atmos.rb +11 -0
  9. data/lib/fog/atmos/models/storage/directories.rb +48 -0
  10. data/lib/fog/atmos/models/storage/directory.rb +53 -0
  11. data/lib/fog/atmos/models/storage/file.rb +107 -0
  12. data/lib/fog/atmos/models/storage/files.rb +73 -0
  13. data/lib/fog/atmos/requests/storage/delete_namespace.rb +19 -0
  14. data/lib/fog/atmos/requests/storage/get_namespace.rb +20 -0
  15. data/lib/fog/atmos/requests/storage/head_namespace.rb +20 -0
  16. data/lib/fog/atmos/requests/storage/post_namespace.rb +20 -0
  17. data/lib/fog/atmos/requests/storage/put_namespace.rb +20 -0
  18. data/lib/fog/atmos/storage.rb +186 -0
  19. data/lib/fog/aws.rb +2 -0
  20. data/lib/fog/aws/auto_scaling.rb +15 -1
  21. data/lib/fog/aws/compute.rb +26 -17
  22. data/lib/fog/aws/elb.rb +14 -2
  23. data/lib/fog/aws/glacier.rb +172 -0
  24. data/lib/fog/aws/iam.rb +35 -29
  25. data/lib/fog/aws/models/auto_scaling/group.rb +1 -1
  26. data/lib/fog/aws/models/compute/flavors.rb +11 -0
  27. data/lib/fog/aws/models/compute/security_group.rb +22 -6
  28. data/lib/fog/aws/models/compute/server.rb +5 -1
  29. data/lib/fog/aws/models/compute/spot_request.rb +12 -0
  30. data/lib/fog/aws/models/compute/spot_requests.rb +1 -2
  31. data/lib/fog/aws/models/compute/volume.rb +7 -1
  32. data/lib/fog/aws/models/glacier/archive.rb +70 -0
  33. data/lib/fog/aws/models/glacier/archives.rb +30 -0
  34. data/lib/fog/aws/models/glacier/job.rb +65 -0
  35. data/lib/fog/aws/models/glacier/jobs.rb +45 -0
  36. data/lib/fog/aws/models/glacier/vault.rb +53 -0
  37. data/lib/fog/aws/models/glacier/vaults.rb +28 -0
  38. data/lib/fog/aws/models/rds/server.rb +3 -1
  39. data/lib/fog/aws/models/rds/snapshot.rb +1 -0
  40. data/lib/fog/aws/models/rds/snapshots.rb +3 -0
  41. data/lib/fog/aws/models/storage/file.rb +4 -3
  42. data/lib/fog/aws/parsers/auto_scaling/describe_auto_scaling_groups.rb +8 -1
  43. data/lib/fog/aws/parsers/compute/create_volume.rb +2 -2
  44. data/lib/fog/aws/parsers/compute/describe_instance_status.rb +8 -1
  45. data/lib/fog/aws/parsers/compute/describe_instances.rb +2 -0
  46. data/lib/fog/aws/parsers/compute/describe_reserved_instances_offerings.rb +1 -1
  47. data/lib/fog/aws/parsers/compute/describe_volumes.rb +2 -2
  48. data/lib/fog/aws/parsers/compute/run_instances.rb +2 -0
  49. data/lib/fog/aws/parsers/compute/spot_instance_requests.rb +1 -1
  50. data/lib/fog/aws/parsers/dns/list_resource_record_sets.rb +3 -1
  51. data/lib/fog/aws/parsers/rds/db_parser.rb +3 -1
  52. data/lib/fog/aws/parsers/rds/snapshot_parser.rb +1 -0
  53. data/lib/fog/aws/rds.rb +9 -9
  54. data/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +1 -0
  55. data/lib/fog/aws/requests/auto_scaling/delete_auto_scaling_group.rb +1 -1
  56. data/lib/fog/aws/requests/compute/create_volume.rb +53 -14
  57. data/lib/fog/aws/requests/compute/describe_instance_status.rb +2 -0
  58. data/lib/fog/aws/requests/compute/describe_instances.rb +3 -1
  59. data/lib/fog/aws/requests/compute/describe_internet_gateways.rb +13 -7
  60. data/lib/fog/aws/requests/compute/describe_spot_instance_requests.rb +1 -0
  61. data/lib/fog/aws/requests/compute/describe_subnets.rb +13 -7
  62. data/lib/fog/aws/requests/compute/describe_volumes.rb +2 -0
  63. data/lib/fog/aws/requests/compute/describe_vpcs.rb +12 -6
  64. data/lib/fog/aws/requests/compute/request_spot_instances.rb +2 -0
  65. data/lib/fog/aws/requests/compute/run_instances.rb +8 -2
  66. data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +20 -1
  67. data/lib/fog/aws/requests/elb/create_load_balancer.rb +2 -2
  68. data/lib/fog/aws/requests/elb/describe_load_balancers.rb +1 -1
  69. data/lib/fog/aws/requests/glacier/abort_multipart_upload.rb +35 -0
  70. data/lib/fog/aws/requests/glacier/complete_multipart_upload.rb +42 -0
  71. data/lib/fog/aws/requests/glacier/create_archive.rb +43 -0
  72. data/lib/fog/aws/requests/glacier/create_vault.rb +34 -0
  73. data/lib/fog/aws/requests/glacier/delete_archive.rb +35 -0
  74. data/lib/fog/aws/requests/glacier/delete_vault.rb +34 -0
  75. data/lib/fog/aws/requests/glacier/delete_vault_notification_configuration.rb +33 -0
  76. data/lib/fog/aws/requests/glacier/describe_job.rb +35 -0
  77. data/lib/fog/aws/requests/glacier/describe_vault.rb +34 -0
  78. data/lib/fog/aws/requests/glacier/get_job_output.rb +41 -0
  79. data/lib/fog/aws/requests/glacier/get_vault_notification_configuration.rb +34 -0
  80. data/lib/fog/aws/requests/glacier/initiate_job.rb +41 -0
  81. data/lib/fog/aws/requests/glacier/initiate_multipart_upload.rb +38 -0
  82. data/lib/fog/aws/requests/glacier/list_jobs.rb +39 -0
  83. data/lib/fog/aws/requests/glacier/list_multipart_uploads.rb +37 -0
  84. data/lib/fog/aws/requests/glacier/list_parts.rb +37 -0
  85. data/lib/fog/aws/requests/glacier/list_vaults.rb +36 -0
  86. data/lib/fog/aws/requests/glacier/set_vault_notification_configuration.rb +37 -0
  87. data/lib/fog/aws/requests/glacier/upload_part.rb +46 -0
  88. data/lib/fog/aws/requests/rds/create_db_instance.rb +7 -5
  89. data/lib/fog/aws/requests/rds/create_db_instance_read_replica.rb +41 -1
  90. data/lib/fog/aws/requests/rds/create_db_snapshot.rb +1 -1
  91. data/lib/fog/aws/requests/rds/describe_db_instances.rb +8 -10
  92. data/lib/fog/aws/requests/rds/describe_db_security_groups.rb +1 -1
  93. data/lib/fog/aws/requests/rds/describe_db_snapshots.rb +2 -0
  94. data/lib/fog/aws/requests/rds/modify_db_instance.rb +7 -6
  95. data/lib/fog/aws/requests/rds/reboot_db_instance.rb +6 -5
  96. data/lib/fog/aws/requests/storage/get_object.rb +45 -2
  97. data/lib/fog/aws/requests/storage/upload_part.rb +1 -0
  98. data/lib/fog/aws/signaturev4.rb +73 -0
  99. data/lib/fog/aws/sqs.rb +2 -6
  100. data/lib/fog/bare_metal_cloud/compute.rb +3 -1
  101. data/lib/fog/bare_metal_cloud/requests/compute/add_server_by_configuration.rb +33 -0
  102. data/lib/fog/bare_metal_cloud/requests/compute/get_server.rb +17 -12
  103. data/lib/fog/bare_metal_cloud/requests/compute/list_configurations.rb +27 -0
  104. data/lib/fog/bare_metal_cloud/requests/compute/list_images.rb +4 -4
  105. data/lib/fog/bare_metal_cloud/requests/compute/list_plans.rb +7 -7
  106. data/lib/fog/bare_metal_cloud/requests/compute/list_servers.rb +2 -2
  107. data/lib/fog/bin.rb +7 -0
  108. data/lib/fog/bin/atmos.rb +31 -0
  109. data/lib/fog/bin/aws.rb +4 -0
  110. data/lib/fog/bin/ecloud.rb +4 -0
  111. data/lib/fog/bin/rackspace.rb +7 -0
  112. data/lib/fog/bin/serverlove.rb +31 -0
  113. data/lib/fog/bluebox/requests/compute/create_block.rb +18 -4
  114. data/lib/fog/brightbox/compute.rb +52 -0
  115. data/lib/fog/brightbox/models/compute/cloud_ip.rb +2 -0
  116. data/lib/fog/brightbox/models/compute/image.rb +1 -0
  117. data/lib/fog/brightbox/models/compute/server.rb +46 -3
  118. data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +3 -3
  119. data/lib/fog/cloudstack/compute.rb +4 -1
  120. data/lib/fog/cloudstack/models/compute/images.rb +15 -6
  121. data/lib/fog/cloudstack/models/compute/job.rb +1 -1
  122. data/lib/fog/cloudstack/requests/compute/attach_volume.rb +1 -1
  123. data/lib/fog/cloudstack/requests/compute/register_template.rb +35 -0
  124. data/lib/fog/compute.rb +15 -3
  125. data/lib/fog/core/errors.rb +1 -0
  126. data/lib/fog/core/time.rb +4 -0
  127. data/lib/fog/dynect/dns.rb +5 -5
  128. data/lib/fog/ecloud.rb +6 -0
  129. data/lib/fog/ecloud/compute.rb +3 -1
  130. data/lib/fog/ecloud/models/compute/ip_addresses.rb +1 -0
  131. data/lib/fog/ecloud/models/compute/networks.rb +1 -0
  132. data/lib/fog/ecloud/models/compute/server.rb +31 -1
  133. data/lib/fog/ecloud/requests/compute/virtual_machine_add_ip.rb +40 -0
  134. data/lib/fog/ecloud/requests/compute/virtual_machine_upload_file.rb +31 -0
  135. data/lib/fog/google/models/storage/directory.rb +2 -2
  136. data/lib/fog/google/models/storage/file.rb +2 -2
  137. data/lib/fog/google/requests/storage/get_bucket.rb +1 -2
  138. data/lib/fog/google/requests/storage/put_object.rb +1 -2
  139. data/lib/fog/google/storage.rb +1 -1
  140. data/lib/fog/hp/models/compute/image.rb +1 -1
  141. data/lib/fog/hp/models/compute/server.rb +4 -0
  142. data/lib/fog/hp/requests/compute/delete_security_group_rule.rb +4 -4
  143. data/lib/fog/hp/requests/storage/get_object.rb +8 -2
  144. data/lib/fog/hp/storage.rb +1 -0
  145. data/lib/fog/libvirt/models/compute/server.rb +1 -1
  146. data/lib/fog/libvirt/models/compute/templates/server.xml.erb +1 -1
  147. data/lib/fog/openstack.rb +7 -0
  148. data/lib/fog/openstack/compute.rb +4 -1
  149. data/lib/fog/openstack/models/compute/server.rb +1 -1
  150. data/lib/fog/openstack/requests/compute/create_server.rb +8 -2
  151. data/lib/fog/openstack/requests/identity/list_roles_for_user_on_tenant.rb +1 -1
  152. data/lib/fog/openstack/requests/identity/list_tenants.rb +1 -0
  153. data/lib/fog/providers.rb +2 -0
  154. data/lib/fog/rackspace.rb +9 -7
  155. data/lib/fog/rackspace/block_storage.rb +114 -0
  156. data/lib/fog/rackspace/compute_v2.rb +123 -0
  157. data/lib/fog/rackspace/models/block_storage/snapshot.rb +46 -0
  158. data/lib/fog/rackspace/models/block_storage/snapshots.rb +25 -0
  159. data/lib/fog/rackspace/models/block_storage/volume.rb +58 -0
  160. data/lib/fog/rackspace/models/block_storage/volume_type.rb +14 -0
  161. data/lib/fog/rackspace/models/block_storage/volume_types.rb +25 -0
  162. data/lib/fog/rackspace/models/block_storage/volumes.rb +25 -0
  163. data/lib/fog/rackspace/models/compute_v2/attachment.rb +34 -0
  164. data/lib/fog/rackspace/models/compute_v2/attachments.rb +25 -0
  165. data/lib/fog/rackspace/models/compute_v2/flavor.rb +17 -0
  166. data/lib/fog/rackspace/models/compute_v2/flavors.rb +25 -0
  167. data/lib/fog/rackspace/models/compute_v2/image.rb +30 -0
  168. data/lib/fog/rackspace/models/compute_v2/images.rb +25 -0
  169. data/lib/fog/rackspace/models/compute_v2/server.rb +147 -0
  170. data/lib/fog/rackspace/models/compute_v2/servers.rb +25 -0
  171. data/lib/fog/rackspace/models/storage/directory.rb +3 -3
  172. data/lib/fog/rackspace/requests/block_storage/create_snapshot.rb +26 -0
  173. data/lib/fog/rackspace/requests/block_storage/create_volume.rb +27 -0
  174. data/lib/fog/rackspace/requests/block_storage/delete_snapshot.rb +15 -0
  175. data/lib/fog/rackspace/requests/block_storage/delete_volume.rb +15 -0
  176. data/lib/fog/rackspace/requests/block_storage/get_snapshot.rb +15 -0
  177. data/lib/fog/rackspace/requests/block_storage/get_volume.rb +15 -0
  178. data/lib/fog/rackspace/requests/block_storage/get_volume_type.rb +15 -0
  179. data/lib/fog/rackspace/requests/block_storage/list_snapshots.rb +15 -0
  180. data/lib/fog/rackspace/requests/block_storage/list_volume_types.rb +15 -0
  181. data/lib/fog/rackspace/requests/block_storage/list_volumes.rb +15 -0
  182. data/lib/fog/rackspace/requests/compute_v2/attach_volume.rb +23 -0
  183. data/lib/fog/rackspace/requests/compute_v2/change_server_password.rb +22 -0
  184. data/lib/fog/rackspace/requests/compute_v2/confirm_resize_server.rb +20 -0
  185. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +28 -0
  186. data/lib/fog/rackspace/requests/compute_v2/delete_attachment.rb +15 -0
  187. data/lib/fog/rackspace/requests/compute_v2/delete_server.rb +15 -0
  188. data/lib/fog/rackspace/requests/compute_v2/get_attachment.rb +15 -0
  189. data/lib/fog/rackspace/requests/compute_v2/get_flavor.rb +15 -0
  190. data/lib/fog/rackspace/requests/compute_v2/get_image.rb +15 -0
  191. data/lib/fog/rackspace/requests/compute_v2/get_server.rb +15 -0
  192. data/lib/fog/rackspace/requests/compute_v2/list_attachments.rb +15 -0
  193. data/lib/fog/rackspace/requests/compute_v2/list_flavors.rb +15 -0
  194. data/lib/fog/rackspace/requests/compute_v2/list_images.rb +15 -0
  195. data/lib/fog/rackspace/requests/compute_v2/list_servers.rb +15 -0
  196. data/lib/fog/rackspace/requests/compute_v2/reboot_server.rb +22 -0
  197. data/lib/fog/rackspace/requests/compute_v2/rebuild_server.rb +22 -0
  198. data/lib/fog/rackspace/requests/compute_v2/resize_server.rb +22 -0
  199. data/lib/fog/rackspace/requests/compute_v2/revert_resize_server.rb +20 -0
  200. data/lib/fog/rackspace/requests/compute_v2/update_server.rb +22 -0
  201. data/lib/fog/rackspace/requests/storage/delete_object.rb +1 -1
  202. data/lib/fog/rackspace/requests/storage/get_object_https_url.rb +51 -0
  203. data/lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb +37 -0
  204. data/lib/fog/rackspace/storage.rb +4 -0
  205. data/lib/fog/serverlove.rb +10 -0
  206. data/lib/fog/serverlove/compute.rb +97 -0
  207. data/lib/fog/serverlove/models/compute/image.rb +57 -0
  208. data/lib/fog/serverlove/models/compute/images.rb +26 -0
  209. data/lib/fog/serverlove/models/compute/server.rb +72 -0
  210. data/lib/fog/serverlove/models/compute/servers.rb +26 -0
  211. data/lib/fog/serverlove/requests/compute/create_image.rb +32 -0
  212. data/lib/fog/serverlove/requests/compute/create_server.rb +34 -0
  213. data/lib/fog/serverlove/requests/compute/destroy_image.rb +13 -0
  214. data/lib/fog/serverlove/requests/compute/destroy_server.rb +13 -0
  215. data/lib/fog/serverlove/requests/compute/get_image.rb +13 -0
  216. data/lib/fog/serverlove/requests/compute/get_images.rb +13 -0
  217. data/lib/fog/serverlove/requests/compute/get_server.rb +13 -0
  218. data/lib/fog/serverlove/requests/compute/get_servers.rb +13 -0
  219. data/lib/fog/serverlove/requests/compute/load_standard_image.rb +13 -0
  220. data/lib/fog/serverlove/requests/compute/reset_server.rb +13 -0
  221. data/lib/fog/serverlove/requests/compute/shutdown_server.rb +13 -0
  222. data/lib/fog/serverlove/requests/compute/start_server.rb +13 -0
  223. data/lib/fog/serverlove/requests/compute/stop_server.rb +13 -0
  224. data/lib/fog/serverlove/requests/compute/update_image.rb +15 -0
  225. data/lib/fog/serverlove/requests/compute/update_server.rb +15 -0
  226. data/lib/fog/serverlove/util/compute/password_generator.rb +11 -0
  227. data/lib/fog/storage.rb +3 -0
  228. data/lib/fog/terremark/models/shared/image.rb +22 -0
  229. data/lib/fog/terremark/models/shared/images.rb +48 -0
  230. data/lib/fog/terremark/models/shared/internetservice.rb +67 -0
  231. data/lib/fog/terremark/models/shared/internetservices.rb +42 -0
  232. data/lib/fog/terremark/models/shared/nodeservice.rb +52 -0
  233. data/lib/fog/terremark/models/shared/nodeservices.rb +32 -0
  234. data/lib/fog/terremark/models/shared/server.rb +114 -15
  235. data/lib/fog/terremark/models/shared/servers.rb +7 -8
  236. data/lib/fog/terremark/models/shared/vdc.rb +6 -1
  237. data/lib/fog/terremark/parsers/shared/get_catalog.rb +7 -2
  238. data/lib/fog/terremark/parsers/shared/get_keys_list.rb +56 -0
  239. data/lib/fog/terremark/requests/shared/add_internet_service.rb +10 -9
  240. data/lib/fog/terremark/requests/shared/add_node_service.rb +10 -12
  241. data/lib/fog/terremark/requests/shared/configure_vapp.rb +61 -0
  242. data/lib/fog/terremark/requests/shared/create_internet_service.rb +16 -11
  243. data/lib/fog/terremark/requests/shared/delete_internet_service.rb +2 -1
  244. data/lib/fog/terremark/requests/shared/delete_node_service.rb +2 -1
  245. data/lib/fog/terremark/requests/shared/delete_public_ip.rb +2 -1
  246. data/lib/fog/terremark/requests/shared/get_internet_services.rb +2 -1
  247. data/lib/fog/terremark/requests/shared/get_keys_list.rb +36 -0
  248. data/lib/fog/terremark/requests/shared/get_node_services.rb +2 -1
  249. data/lib/fog/terremark/requests/shared/instantiate_vapp_template.rb +11 -1
  250. data/lib/fog/terremark/shared.rb +19 -1
  251. data/lib/fog/terremark/vcloud.rb +10 -1
  252. data/lib/fog/vcloud/compute.rb +13 -13
  253. data/lib/fog/vcloud/models/compute/catalog_items.rb +6 -2
  254. data/lib/fog/vcloud/models/compute/organizations.rb +1 -2
  255. data/lib/fog/vcloud/models/compute/server.rb +37 -3
  256. data/lib/fog/vcloud/models/compute/vapps.rb +1 -1
  257. data/lib/fog/vcloud/requests/compute/configure_org_network.rb +141 -0
  258. data/lib/fog/vcloud/requests/compute/configure_vm_cpus.rb +38 -0
  259. data/lib/fog/vcloud/requests/compute/configure_vm_memory.rb +11 -12
  260. data/lib/fog/vcloud/requests/compute/configure_vm_password.rb +39 -0
  261. data/lib/fog/vcloud/requests/compute/undeploy.rb +9 -1
  262. data/lib/fog/vsphere/requests/compute/vm_reboot.rb +1 -1
  263. data/tests/atmos/models/storage/file_update_tests.rb +19 -0
  264. data/tests/atmos/models/storage/nested_directories_tests.rb +23 -0
  265. data/tests/aws/models/compute/security_group_tests.rb +21 -12
  266. data/tests/aws/models/dns/records_tests.rb +8 -2
  267. data/tests/aws/models/glacier/model_tests.rb +47 -0
  268. data/tests/aws/models/iam/policies_tests.rb +2 -2
  269. data/tests/aws/models/rds/server_tests.rb +5 -2
  270. data/tests/aws/models/storage/directory_tests.rb +1 -1
  271. data/tests/aws/models/storage/file_tests.rb +1 -1
  272. data/tests/aws/models/storage/files_tests.rb +1 -1
  273. data/tests/aws/models/storage/url_tests.rb +8 -8
  274. data/tests/aws/models/storage/version_tests.rb +1 -1
  275. data/tests/aws/models/storage/versions_tests.rb +1 -1
  276. data/tests/aws/requests/auto_scaling/auto_scaling_tests.rb +5 -0
  277. data/tests/aws/requests/auto_scaling/helper.rb +2 -1
  278. data/tests/aws/requests/compute/instance_tests.rb +17 -23
  279. data/tests/aws/requests/compute/spot_instance_tests.rb +2 -1
  280. data/tests/aws/requests/compute/tag_tests.rb +1 -0
  281. data/tests/aws/requests/compute/volume_tests.rb +45 -4
  282. data/tests/aws/requests/elb/helper.rb +2 -2
  283. data/tests/aws/requests/elb/listener_tests.rb +2 -2
  284. data/tests/aws/requests/elb/load_balancer_tests.rb +1 -1
  285. data/tests/aws/requests/glacier/archive_tests.rb +13 -0
  286. data/tests/aws/requests/glacier/multipart_upload_tests.rb +30 -0
  287. data/tests/aws/requests/glacier/tree_hash_tests.rb +63 -0
  288. data/tests/aws/requests/glacier/vault_tests.rb +35 -0
  289. data/tests/aws/requests/rds/helper.rb +11 -5
  290. data/tests/aws/requests/rds/instance_tests.rb +0 -2
  291. data/tests/aws/requests/storage/acl_utils_tests.rb +1 -1
  292. data/tests/aws/requests/storage/bucket_tests.rb +1 -1
  293. data/tests/aws/requests/storage/multipart_upload_tests.rb +1 -1
  294. data/tests/aws/requests/storage/object_tests.rb +8 -0
  295. data/tests/aws/requests/storage/versioning_tests.rb +1 -1
  296. data/tests/aws/signaturev4_tests.rb +41 -0
  297. data/tests/brightbox/compute_tests.rb +9 -0
  298. data/tests/brightbox/requests/compute/helper.rb +21 -6
  299. data/tests/cloudstack/compute/models/volume_tests.rb +1 -1
  300. data/tests/cloudstack/requests/volume_tests.rb +1 -1
  301. data/tests/compute/helper.rb +10 -4
  302. data/tests/dynect/requests/dns/dns_tests.rb +39 -0
  303. data/tests/google/requests/storage/bucket_tests.rb +2 -3
  304. data/tests/google/requests/storage/object_tests.rb +1 -1
  305. data/tests/helper.rb +10 -3
  306. data/tests/helpers/formats_helper.rb +4 -2
  307. data/tests/helpers/formats_helper_tests.rb +9 -0
  308. data/tests/helpers/mock_helper.rb +6 -1
  309. data/tests/helpers/model_helper.rb +0 -3
  310. data/tests/hp/models/compute/address_tests.rb +1 -1
  311. data/tests/hp/models/compute/addresses_tests.rb +1 -1
  312. data/tests/hp/models/compute/key_pair_tests.rb +1 -1
  313. data/tests/hp/models/compute/key_pairs_tests.rb +1 -1
  314. data/tests/hp/models/compute/security_group_tests.rb +1 -1
  315. data/tests/hp/models/compute/security_groups_tests.rb +1 -1
  316. data/tests/hp/requests/cdn/container_tests.rb +1 -1
  317. data/tests/hp/requests/compute/address_tests.rb +1 -1
  318. data/tests/hp/requests/compute/flavor_tests.rb +1 -1
  319. data/tests/hp/requests/compute/image_tests.rb +1 -1
  320. data/tests/hp/requests/compute/key_pair_tests.rb +1 -1
  321. data/tests/hp/requests/compute/security_group_rule_tests.rb +1 -1
  322. data/tests/hp/requests/compute/security_group_tests.rb +1 -1
  323. data/tests/hp/requests/compute/server_address_tests.rb +1 -1
  324. data/tests/hp/requests/compute/server_tests.rb +1 -1
  325. data/tests/hp/requests/storage/container_tests.rb +1 -1
  326. data/tests/hp/requests/storage/object_tests.rb +1 -1
  327. data/tests/local/models/file_tests.rb +1 -1
  328. data/tests/rackspace/models/block_storage/snapshot_tests.rb +20 -0
  329. data/tests/rackspace/models/block_storage/snapshots_tests.rb +20 -0
  330. data/tests/rackspace/models/block_storage/volume_tests.rb +27 -0
  331. data/tests/rackspace/models/block_storage/volume_types_tests.rb +20 -0
  332. data/tests/rackspace/models/block_storage/volumes_tests.rb +11 -0
  333. data/tests/rackspace/models/compute_v2/flavors_tests.rb +20 -0
  334. data/tests/rackspace/models/compute_v2/images_tests.rb +22 -0
  335. data/tests/rackspace/models/compute_v2/server_tests.rb +62 -0
  336. data/tests/rackspace/models/compute_v2/servers_tests.rb +14 -0
  337. data/tests/rackspace/requests/block_storage/snapshot_tests.rb +81 -0
  338. data/tests/rackspace/requests/block_storage/volume_tests.rb +61 -0
  339. data/tests/rackspace/requests/block_storage/volume_type_tests.rb +31 -0
  340. data/tests/rackspace/requests/compute_v2/attachment_tests.rb +68 -0
  341. data/tests/rackspace/requests/compute_v2/flavor_tests.rb +43 -0
  342. data/tests/rackspace/requests/compute_v2/image_tests.rb +47 -0
  343. data/tests/rackspace/requests/compute_v2/server_tests.rb +147 -0
  344. data/tests/rackspace/requests/storage/account_tests.rb +17 -0
  345. data/tests/rackspace/requests/storage/container_tests.rb +1 -1
  346. data/tests/rackspace/requests/storage/large_object_tests.rb +1 -1
  347. data/tests/rackspace/requests/storage/object_tests.rb +41 -2
  348. data/tests/serverlove/requests/compute/image_tests.rb +57 -0
  349. data/tests/serverlove/requests/compute/server_tests.rb +85 -0
  350. data/tests/serverlove/util/compute/password_generator_tests.rb +19 -0
  351. data/tests/storage/models/directories_tests.rb +1 -1
  352. data/tests/storage/models/directory_test.rb +1 -1
  353. data/tests/storage/models/file_tests.rb +1 -1
  354. data/tests/storage/models/files_tests.rb +1 -1
  355. metadata +188 -3
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module AWS
3
+ class Glacier
4
+ class Real
5
+
6
+ # Set a vault's notification configuration
7
+ #
8
+ # ==== Parameters
9
+ # * name<~String> Name of the vault
10
+ # * SnsTopic<~String> ARN of the topic to notify
11
+ # * events<~Array> Events you wish to receive. Valid events are ArchiveRetrievalCompleted, InventoryRetrievalCompleted
12
+ # * options<~Hash>
13
+ # * account_id<~String> - The AWS account id. Defaults to the account owning the credentials making the request
14
+ # ==== Returns
15
+ # * response<~Excon::Response>:
16
+ # * body<~Hash>:
17
+ #
18
+ # ==== See Also
19
+ # http://docs.amazonwebservices.com/amazonglacier/latest/dev/api-vault-notifications-put.html
20
+ #
21
+ def set_vault_notification_configuration(name,sns_topic, events, options={})
22
+ account_id = options['account_id'] || '-'
23
+ path = "/#{account_id}/vaults/#{Fog::AWS.escape(name)}/notification-configuration"
24
+ request(
25
+ :expects => 204,
26
+ :idempotent => true,
27
+ :headers => {},
28
+ :method => :put,
29
+ :path => path,
30
+ :body => Fog::JSON.encode('SNSTopic' => sns_topic, 'Events' => events)
31
+ )
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,46 @@
1
+ module Fog
2
+ module AWS
3
+ class Glacier
4
+ class Real
5
+
6
+ # Upload an archive
7
+ #
8
+ # ==== Parameters
9
+ # * name<~String> Name of the vault to upload to
10
+ # * uploadId<~String> Id of the upload
11
+ # * body<~String> The data to upload
12
+ # * offset<~Integer> The offset of the data within the archive
13
+ # * hash<~String> The tree hash for this part
14
+ # * options<~Hash>
15
+ # * account_id<~String> - The AWS account id. Defaults to the account owning the credentials making the request
16
+ # ==== Returns
17
+ # * response<~Excon::Response>:
18
+ #
19
+ # ==== See Also
20
+ # http://docs.amazonwebservices.com/amazonglacier/latest/dev/api-upload-part.html
21
+ #
22
+ def upload_part(vault_name, upload_id, body, offset, hash, options={})
23
+ account_id = options['account_id'] || '-'
24
+ path = "/#{account_id}/vaults/#{Fog::AWS.escape(vault_name)}/multipart-uploads/#{Fog::AWS.escape(upload_id)}"
25
+
26
+ headers = {
27
+ 'Content-Length' => body.bytesize.to_s,
28
+ 'Content-Range' => "bytes #{offset}-#{offset+body.bytesize-1}/*",
29
+ 'x-amz-content-sha256' => Digest::SHA256.hexdigest(body),
30
+ 'x-amz-sha256-tree-hash' => hash
31
+ }
32
+
33
+ request(
34
+ :expects => 204,
35
+ :idempotent => true,
36
+ :headers => headers,
37
+ :method => :put,
38
+ :path => path,
39
+ :body => body
40
+ )
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -26,6 +26,7 @@ module Fog
26
26
  # * Port <~Integer> The port number on which the database accepts connections.
27
27
  # * PreferredBackupWindow <~String> The daily time range during which automated backups are created if automated backups are enabled
28
28
  # * PreferredMaintenanceWindow <~String> The weekly time range (in UTC) during which system maintenance can occur, which may result in an outage
29
+ # * DBSubnetGroupName <~String> The name, if any, of the VPC subnet for this RDS instance
29
30
  # ==== Returns
30
31
  # * response<~Excon::Response>:
31
32
  # * body<~Hash>:
@@ -80,19 +81,19 @@ module Fog
80
81
  "InstanceCreateTime" => nil,
81
82
  "AutoMinorVersionUpgrade"=>true,
82
83
  "Endpoint"=>{},
83
- "ReadReplicaDBInstanceIdentifiers"=>['bla'],
84
+ "ReadReplicaDBInstanceIdentifiers"=>[],
84
85
  "PreferredMaintenanceWindow"=>"mon:04:30-mon:05:00",
85
86
  "Engine"=> options["Engine"],
86
- "EngineVersion"=> options["EngineVersion"] || "5.1.57",
87
+ "EngineVersion"=> options["EngineVersion"] || "5.5.12",
87
88
  "PendingModifiedValues"=>{"MasterUserPassword"=>"****"}, # This clears when is available
88
- "MultiAZ"=>false,
89
+ "MultiAZ"=> !!options['MultiAZ'],
89
90
  "MasterUsername"=> options["MasterUsername"],
90
91
  "DBInstanceClass"=> options["DBInstanceClass"],
91
92
  "DBInstanceStatus"=>"creating",
92
93
  "BackupRetentionPeriod"=> options["BackupRetentionPeriod"] || 1,
93
94
  "AllocatedStorage"=> options["AllocatedStorage"],
94
95
  "DBParameterGroups"=> # I think groups should be in the self.data method
95
- [{"DBParameterGroupName"=>"default.mysql5.1",
96
+ [{"DBParameterGroupName"=>"default.mysql5.5",
96
97
  "ParameterApplyStatus"=>"in-sync"}],
97
98
  "DBSecurityGroups"=>
98
99
  [{"Status"=>"active",
@@ -101,7 +102,8 @@ module Fog
101
102
  "PreferredBackupWindow"=>"08:00-08:30",
102
103
  # "ReadReplicaSourceDBInstanceIdentifier" => nil,
103
104
  # "LatestRestorableTime" => nil,
104
- "AvailabilityZone" => options["AvailabilityZone"]
105
+ "AvailabilityZone" => options["AvailabilityZone"],
106
+ "DBSubnetGroupName" => options["DBSubnetGroupName"]
105
107
  }
106
108
 
107
109
 
@@ -33,7 +33,47 @@ module Fog
33
33
  class Mock
34
34
 
35
35
  def create_db_instance_read_replica(instance_identifier, source_identifier, options={})
36
- Fog::Mock.not_implemented
36
+ # TODO: throw error when instance_identifier already exists,
37
+ # or source_identifier doesn't exist
38
+
39
+ source = self.data[:servers][source_identifier]
40
+ data = {
41
+ 'AllocatedStorage' => source['AllocatedStorage'],
42
+ 'AutoMinorVersionUpgrade' => options.key?('AutoMinorVersionUpgrade') ? options['AutoMinorVersionUpgrade'] : true,
43
+ 'AvailabilityZone' => options['AvailabilityZone'],
44
+ 'DBInstanceClass' => options['DBInstanceClass'] || 'db.m1.small',
45
+ 'DBInstanceIdentifier' => instance_identifier,
46
+ 'DBInstanceStatus' => 'creating',
47
+ 'DBName' => source['DBName'],
48
+ 'DBParameterGroups' => source['DBParameterGroups'],
49
+ 'DBSecurityGroups' => source['DBSecurityGroups'],
50
+ 'Endpoint' => {},
51
+ 'Engine' => source['Engine'],
52
+ 'EngineVersion' => options['EngineVersion'] || '5.5.12',
53
+ 'InstanceCreateTime' => nil,
54
+ 'LatestRestorableTime' => nil,
55
+ 'LicenseModel' => 'general-public-license',
56
+ 'MasterUsername' => source['MasterUsername'],
57
+ 'MultiAZ' => false,
58
+ 'PendingModifiedValues' => {},
59
+ 'PreferredBackupWindow'=> '08:00-08:30',
60
+ 'PreferredMaintenanceWindow'=> "mon:04:30-mon:05:00",
61
+ 'ReadReplicaDBInstanceIdentifiers'=> [],
62
+ 'ReadReplicaSourceDBInstanceIdentifier'=> source_identifier
63
+ }
64
+ self.data[:servers][instance_identifier] = data
65
+ self.data[:servers][source_identifier]['ReadReplicaDBInstanceIdentifiers'] << instance_identifier
66
+
67
+ response = Excon::Response.new
68
+ response.body = {
69
+ "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
70
+ "CreateDBInstanceReadReplicaResult"=> {"DBInstance"=> data}
71
+ }
72
+ response.status = 200
73
+ # This values aren't showed at creating time but at available time
74
+ self.data[:servers][instance_identifier]["InstanceCreateTime"] = Time.now
75
+
76
+ response
37
77
  end
38
78
 
39
79
  end
@@ -41,7 +41,7 @@ module Fog
41
41
 
42
42
  snapshot_data = {
43
43
  'Status' => 'creating',
44
- #'SnapshotType' => 'manual', # In a newer RDS version
44
+ 'SnapshotType' => 'manual',
45
45
  'DBInstanceIdentifier' => identifier,
46
46
  'DBSnapshotIdentifier' => name,
47
47
  'InstanceCreateTime' => Time.now
@@ -51,25 +51,23 @@ module Fog
51
51
  if Time.now - server['InstanceCreateTime'] >= Fog::Mock.delay * 2
52
52
  region = "us-east-1"
53
53
  server["DBInstanceStatus"] = "available"
54
- server["AvailabilityZone"] = region + 'a'
54
+ server["AvailabilityZone"] ||= region + 'a'
55
55
  server["Endpoint"] = {"Port"=>3306,
56
56
  "Address"=> Fog::AWS::Mock.rds_address(server["DBInstanceIdentifier"],region) }
57
57
  server["PendingModifiedValues"] = {}
58
58
  end
59
- when "rebooting" # I don't know how to show rebooting just once before it changes to available
60
- # it applies pending modified values
61
- unless server["PendingModifiedValues"].empty?
59
+ when "rebooting"
60
+ if Time.now - self.data[:reboot_time] >= Fog::Mock.delay
61
+ # apply pending modified values
62
62
  server.merge!(server["PendingModifiedValues"])
63
63
  server["PendingModifiedValues"] = {}
64
- self.data[:tmp] ||= Time.now + Fog::Mock.delay * 2
65
- if self.data[:tmp] <= Time.now
66
- server["DBInstanceStatus"] = 'available'
67
- self.data.delete(:tmp)
68
- end
64
+
65
+ server["DBInstanceStatus"] = 'available'
66
+ self.data.delete(:reboot_time)
69
67
  end
70
68
  when "modifying"
71
69
  # TODO there are some fields that only applied after rebooting
72
- unless server["PendingModifiedValues"].empty?
70
+ if Time.now - self.data[:modify_time] >= Fog::Mock.delay
73
71
  server.merge!(server["PendingModifiedValues"])
74
72
  server["PendingModifiedValues"] = {}
75
73
  server["DBInstanceStatus"] = 'available'
@@ -59,7 +59,7 @@ module Fog
59
59
  # TODO: refactor to not delete items that we're iterating over. Causes
60
60
  # model tests to fail (currently pending)
61
61
  sec_group["EC2SecurityGroups"].each do |ec2_secg|
62
- if ec2_secg["Status"] == "authorizing" || iprange["Status"] == "revoking"
62
+ if ec2_secg["Status"] == "authorizing" || ec2_secg["Status"] == "revoking"
63
63
  ec2_secg[:tmp] ||= Time.now + Fog::Mock.delay * 2
64
64
  if ec2_secg[:tmp] <= Time.now
65
65
  ec2_secg["Status"] = "authorized" if ec2_secg["Status"] == "authorizing"
@@ -10,6 +10,7 @@ module Fog
10
10
  # ==== Parameters
11
11
  # * DBInstanceIdentifier <~String> - ID of instance to retrieve information for. if absent information for all instances is returned
12
12
  # * DBSnapshotIdentifier <~String> - ID of snapshot to retrieve information for. if absent information for all snapshots is returned
13
+ # * SnapshotType <~String> - type of snapshot to retrive (automated|manual)
13
14
  # * Marker <~String> - An optional marker provided in the previous DescribeDBInstances request
14
15
  # * MaxRecords <~Integer> - Max number of records to return (between 20 and 100)
15
16
  # Only one of DBInstanceIdentifier or DBSnapshotIdentifier can be specified
@@ -18,6 +19,7 @@ module Fog
18
19
  # * body<~Hash>:
19
20
  def describe_db_snapshots(opts={})
20
21
  params = {}
22
+ params['SnapshotType'] = opts[:type] if opts[:type]
21
23
  params['DBInstanceIdentifier'] = opts[:identifier] if opts[:identifier]
22
24
  params['DBSnapshotIdentifier'] = opts[:snapshot_id] if opts[:snapshot_id]
23
25
  params['Marker'] = opts[:marker] if opts[:marker]
@@ -10,7 +10,7 @@ module Fog
10
10
  # ==== Parameters
11
11
  # * DBInstanceIdentifier <~String> - name of the db instance to modify
12
12
  # * ApplyImmediately <~Boolean> - whether to apply the changes immediately or wait for the next maintenance window
13
- #
13
+ #
14
14
  # * AllocatedStorage <~Integer> Storage space, in GB
15
15
  # * AllowMajorVersionUpgrade <~Boolean> Must be set to true if EngineVersion specifies a different major version
16
16
  # * AutoMinorVersionUpgrade <~Boolean> Indicates that minor version upgrades will be applied automatically to the DB Instance during the maintenance window
@@ -27,11 +27,11 @@ module Fog
27
27
  # * response<~Excon::Response>:
28
28
  # * body<~Hash>:
29
29
  def modify_db_instance(db_name, apply_immediately, options={})
30
-
30
+
31
31
  if security_groups = options.delete('DBSecurityGroups')
32
32
  options.merge!(Fog::AWS.indexed_param('DBSecurityGroups.member.%d', [*security_groups]))
33
33
  end
34
-
34
+
35
35
  request({
36
36
  'Action' => 'ModifyDBInstance',
37
37
  'DBInstanceIdentifier' => db_name,
@@ -50,8 +50,9 @@ module Fog
50
50
  if self.data[:servers][db_name]["DBInstanceStatus"] != "available"
51
51
  raise Fog::AWS::RDS::NotFound.new("DBInstance #{db_name} not available for modification")
52
52
  else
53
+ self.data[:modify_time] = Time.now
53
54
  # TODO verify the params options
54
- # if apply_immediately is false, all the options go to pending_modified_values and then apply and clear after either
55
+ # if apply_immediately is false, all the options go to pending_modified_values and then apply and clear after either
55
56
  # a reboot or the maintainance window
56
57
  #if apply_immediately
57
58
  # modified_server = server.merge(options)
@@ -59,14 +60,14 @@ module Fog
59
60
  # modified_server = server["PendingModifiedValues"].merge!(options) # it appends
60
61
  #end
61
62
  self.data[:servers][db_name]["PendingModifiedValues"].merge!(options) # it appends
62
- #self.data[:servers][db_name]["DBInstanceStatus"] = "modifying"
63
+ self.data[:servers][db_name]["DBInstanceStatus"] = "modifying"
63
64
  response.status = 200
64
65
  response.body = {
65
66
  "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
66
67
  "ModifyDBInstanceResult" => { "DBInstance" => self.data[:servers][db_name] }
67
68
  }
68
69
  response
69
-
70
+
70
71
  end
71
72
  else
72
73
  raise Fog::AWS::RDS::NotFound.new("DBInstance #{db_name} not found")
@@ -26,18 +26,19 @@ module Fog
26
26
 
27
27
  def reboot_db_instance(instance_identifier)
28
28
  response = Excon::Response.new
29
- if self.data[:servers][instance_identifier]
30
- if self.data[:servers][instance_identifier]["DBInstanceStatus"] != "available"
29
+ if server = self.data[:servers][instance_identifier]
30
+ if server["DBInstanceStatus"] != "available"
31
31
  raise Fog::AWS::RDS::NotFound.new("DBInstance #{instance_identifier} not available for rebooting")
32
32
  else
33
- self.data[:servers][instance_identifier]["DBInstanceStatus"] = 'rebooting'
33
+ server["DBInstanceStatus"] = 'rebooting'
34
+ self.data[:reboot_time] = Time.now
34
35
  response.status = 200
35
36
  response.body = {
36
37
  "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
37
- "RebootDBInstanceResult" => { "DBInstance" => self.data[:servers][instance_identifier] }
38
+ "RebootDBInstanceResult" => { "DBInstance" => server }
38
39
  }
39
40
  response
40
-
41
+
41
42
  end
42
43
  else
43
44
  raise Fog::AWS::RDS::NotFound.new("DBInstance #{instance_identifier} not found")
@@ -103,10 +103,20 @@ module Fog
103
103
 
104
104
  response.headers['x-amz-version-id'] = object['VersionId'] if bucket[:versioning]
105
105
 
106
+ body = object[:body]
107
+ if options['Range']
108
+ # since AWS S3 itself does not support multiple range headers, we will use only the first
109
+ ranges = byte_ranges(options['Range'], body.size)
110
+ unless ranges.nil? || ranges.empty?
111
+ response.status = 206
112
+ body = body[ranges.first]
113
+ end
114
+ end
115
+
106
116
  unless block_given?
107
- response.body = object[:body]
117
+ response.body = body
108
118
  else
109
- data = StringIO.new(object[:body])
119
+ data = StringIO.new(body)
110
120
  remaining = data.length
111
121
  while remaining > 0
112
122
  chunk = data.read([remaining, Excon::CHUNK_SIZE].min)
@@ -142,6 +152,39 @@ module Fog
142
152
  response
143
153
  end
144
154
 
155
+ private
156
+
157
+ # === Borrowed from rack
158
+ # Parses the "Range:" header, if present, into an array of Range objects.
159
+ # Returns nil if the header is missing or syntactically invalid.
160
+ # Returns an empty array if none of the ranges are satisfiable.
161
+ def byte_ranges(http_range, size)
162
+ # See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
163
+ return nil unless http_range
164
+ ranges = []
165
+ http_range.split(/,\s*/).each do |range_spec|
166
+ matches = range_spec.match(/bytes=(\d*)-(\d*)/)
167
+ return nil unless matches
168
+ r0,r1 = matches[1], matches[2]
169
+ if r0.empty?
170
+ return nil if r1.empty?
171
+ # suffix-byte-range-spec, represents trailing suffix of file
172
+ r0 = [size - r1.to_i, 0].max
173
+ r1 = size - 1
174
+ else
175
+ r0 = r0.to_i
176
+ if r1.empty?
177
+ r1 = size - 1
178
+ else
179
+ r1 = r1.to_i
180
+ return nil if r1 < r0 # backwards range is syntactically invalid
181
+ r1 = size-1 if r1 >= size
182
+ end
183
+ end
184
+ ranges << (r0..r1) if r0 <= r1
185
+ end
186
+ ranges
187
+ end
145
188
  end
146
189
  end
147
190
  end
@@ -29,6 +29,7 @@ module Fog
29
29
  request({
30
30
  :body => data[:body],
31
31
  :expects => 200,
32
+ :idempotent => true,
32
33
  :headers => headers,
33
34
  :host => "#{bucket_name}.#{@host}",
34
35
  :method => 'PUT',
@@ -0,0 +1,73 @@
1
+ # See http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html
2
+ #
3
+ module Fog
4
+ module AWS
5
+ class SignatureV4
6
+ def initialize(aws_access_key_id, secret_key, region,service)
7
+ @region = region
8
+ @service = service
9
+ @aws_access_key_id = aws_access_key_id
10
+ @hmac = Fog::HMAC.new('sha256', 'AWS4' + secret_key)
11
+ end
12
+
13
+ def sign(params, date)
14
+ canonical_request = <<-DATA
15
+ #{params[:method].to_s.upcase}
16
+ #{params[:path]}
17
+ #{canonical_query_string(params[:query])}
18
+ #{canonical_headers(params[:headers])}
19
+ #{signed_headers(params[:headers])}
20
+ #{Digest::SHA256.hexdigest(params[:body] || '')}
21
+ DATA
22
+ canonical_request.chop!
23
+ credential_scope = "#{date.utc.strftime('%Y%m%d')}/#{@region}/#{@service}/aws4_request"
24
+ string_to_sign = <<-DATA
25
+ AWS4-HMAC-SHA256
26
+ #{date.to_iso8601_basic}
27
+ #{credential_scope}
28
+ #{Digest::SHA256.hexdigest(canonical_request)}
29
+ DATA
30
+
31
+ string_to_sign.chop!
32
+
33
+ signature = derived_hmac(date).sign(string_to_sign)
34
+
35
+ "AWS4-HMAC-SHA256 Credential=#{@aws_access_key_id}/#{credential_scope}, SignedHeaders=#{signed_headers(params[:headers])}, Signature=#{signature.unpack('H*').first}"
36
+ end
37
+
38
+ protected
39
+
40
+ def canonical_query_string(query)
41
+ canonical_query_string = []
42
+ for key in (query || {}).keys.sort_by {|k| k.to_s}
43
+ component = "#{Fog::AWS.escape(key.to_s)}=#{Fog::AWS.escape(query[key].to_s)}"
44
+ canonical_query_string << component
45
+ end
46
+ canonical_query_string.join("&")
47
+ end
48
+
49
+ def canonical_headers(headers)
50
+ canonical_headers = ''
51
+
52
+ for key in headers.keys.sort_by {|k| k.to_s}
53
+ canonical_headers << "#{key.to_s.downcase}:#{headers[key].to_s.strip}\n"
54
+ end
55
+ canonical_headers
56
+ end
57
+
58
+ def signed_headers(headers)
59
+ headers.keys.collect {|key| key.to_s}.sort.collect {|key| key.downcase}.join(';')
60
+ end
61
+
62
+ def derived_hmac(date)
63
+ kDate = @hmac.sign(date.utc.strftime('%Y%m%d'))
64
+ kRegion = Fog::HMAC.new('sha256', kDate).sign(@region)
65
+ kService = Fog::HMAC.new('sha256', kRegion).sign(@service)
66
+ kSigning = Fog::HMAC.new('sha256', kService).sign('aws4_request')
67
+ Fog::HMAC.new('sha256', kSigning)
68
+ end
69
+
70
+
71
+ end
72
+ end
73
+ end