fog 1.10.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (319) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +1 -0
  3. data/Gemfile +2 -0
  4. data/README.md +4 -3
  5. data/changelog.txt +207 -0
  6. data/fog.gemspec +4 -3
  7. data/lib/fog/aws.rb +0 -2
  8. data/lib/fog/aws/dynamodb.rb +1 -1
  9. data/lib/fog/aws/elasticache.rb +0 -2
  10. data/lib/fog/aws/iam.rb +1 -0
  11. data/lib/fog/aws/models/compute/volume.rb +1 -0
  12. data/lib/fog/aws/models/iam/user.rb +1 -0
  13. data/lib/fog/aws/models/storage/directories.rb +1 -1
  14. data/lib/fog/aws/models/storage/directory.rb +20 -17
  15. data/lib/fog/aws/models/storage/file.rb +4 -5
  16. data/lib/fog/aws/parsers/iam/get_user.rb +2 -0
  17. data/lib/fog/aws/parsers/iam/list_users.rb +2 -0
  18. data/lib/fog/aws/requests/cdn/delete_streaming_distribution.rb +2 -2
  19. data/lib/fog/aws/requests/cdn/put_distribution_config.rb +3 -3
  20. data/lib/fog/aws/requests/cloud_formation/update_stack.rb +3 -3
  21. data/lib/fog/aws/requests/cloud_formation/validate_template.rb +5 -5
  22. data/lib/fog/aws/requests/iam/create_user.rb +5 -4
  23. data/lib/fog/aws/requests/iam/get_user.rb +5 -4
  24. data/lib/fog/aws/requests/iam/list_users.rb +5 -4
  25. data/lib/fog/aws/requests/rds/create_db_instance.rb +25 -25
  26. data/lib/fog/aws/requests/storage/abort_multipart_upload.rb +3 -3
  27. data/lib/fog/aws/requests/storage/complete_multipart_upload.rb +2 -2
  28. data/lib/fog/aws/requests/storage/copy_object.rb +2 -2
  29. data/lib/fog/aws/requests/storage/delete_bucket.rb +1 -1
  30. data/lib/fog/aws/requests/storage/delete_bucket_cors.rb +1 -1
  31. data/lib/fog/aws/requests/storage/delete_bucket_lifecycle.rb +1 -1
  32. data/lib/fog/aws/requests/storage/delete_bucket_policy.rb +1 -1
  33. data/lib/fog/aws/requests/storage/delete_bucket_website.rb +1 -1
  34. data/lib/fog/aws/requests/storage/delete_multiple_objects.rb +1 -1
  35. data/lib/fog/aws/requests/storage/delete_object.rb +1 -1
  36. data/lib/fog/aws/requests/storage/get_bucket.rb +1 -1
  37. data/lib/fog/aws/requests/storage/get_bucket_acl.rb +1 -1
  38. data/lib/fog/aws/requests/storage/get_bucket_cors.rb +1 -1
  39. data/lib/fog/aws/requests/storage/get_bucket_lifecycle.rb +1 -1
  40. data/lib/fog/aws/requests/storage/get_bucket_location.rb +1 -1
  41. data/lib/fog/aws/requests/storage/get_bucket_logging.rb +1 -1
  42. data/lib/fog/aws/requests/storage/get_bucket_object_versions.rb +1 -1
  43. data/lib/fog/aws/requests/storage/get_bucket_policy.rb +1 -1
  44. data/lib/fog/aws/requests/storage/get_bucket_versioning.rb +1 -1
  45. data/lib/fog/aws/requests/storage/get_bucket_website.rb +1 -1
  46. data/lib/fog/aws/requests/storage/get_object.rb +2 -2
  47. data/lib/fog/aws/requests/storage/get_object_acl.rb +2 -2
  48. data/lib/fog/aws/requests/storage/get_object_http_url.rb +1 -19
  49. data/lib/fog/aws/requests/storage/get_object_torrent.rb +2 -2
  50. data/lib/fog/aws/requests/storage/get_object_url.rb +5 -14
  51. data/lib/fog/aws/requests/storage/get_request_payment.rb +1 -1
  52. data/lib/fog/aws/requests/storage/head_object.rb +2 -2
  53. data/lib/fog/aws/requests/storage/initiate_multipart_upload.rb +2 -2
  54. data/lib/fog/aws/requests/storage/list_multipart_uploads.rb +7 -8
  55. data/lib/fog/aws/requests/storage/list_parts.rb +2 -2
  56. data/lib/fog/aws/requests/storage/put_bucket.rb +1 -1
  57. data/lib/fog/aws/requests/storage/put_bucket_acl.rb +1 -1
  58. data/lib/fog/aws/requests/storage/put_bucket_cors.rb +1 -1
  59. data/lib/fog/aws/requests/storage/put_bucket_lifecycle.rb +1 -1
  60. data/lib/fog/aws/requests/storage/put_bucket_logging.rb +1 -1
  61. data/lib/fog/aws/requests/storage/put_bucket_policy.rb +1 -1
  62. data/lib/fog/aws/requests/storage/put_bucket_versioning.rb +1 -1
  63. data/lib/fog/aws/requests/storage/put_bucket_website.rb +1 -1
  64. data/lib/fog/aws/requests/storage/put_object.rb +2 -2
  65. data/lib/fog/aws/requests/storage/put_object_acl.rb +8 -8
  66. data/lib/fog/aws/requests/storage/put_object_url.rb +5 -7
  67. data/lib/fog/aws/requests/storage/put_request_payment.rb +1 -1
  68. data/lib/fog/aws/requests/storage/upload_part.rb +2 -2
  69. data/lib/fog/aws/storage.rb +201 -97
  70. data/lib/fog/bin/google.rb +47 -1
  71. data/lib/fog/bluebox/models/compute/server.rb +3 -1
  72. data/lib/fog/brightbox/compute.rb +11 -26
  73. data/lib/fog/brightbox/compute/image_selector.rb +45 -0
  74. data/lib/fog/cloudstack/compute.rb +70 -2
  75. data/lib/fog/cloudstack/models/compute/disk_offering.rb +46 -0
  76. data/lib/fog/cloudstack/models/compute/disk_offerings.rb +27 -0
  77. data/lib/fog/cloudstack/models/compute/image.rb +1 -1
  78. data/lib/fog/cloudstack/models/compute/servers.rb +3 -2
  79. data/lib/fog/cloudstack/requests/compute/create_disk_offering.rb +51 -0
  80. data/lib/fog/cloudstack/requests/compute/delete_disk_offering.rb +31 -0
  81. data/lib/fog/cloudstack/requests/compute/delete_snapshot.rb +44 -2
  82. data/lib/fog/cloudstack/requests/compute/list_disk_offerings.rb +9 -0
  83. data/lib/fog/cloudstack/requests/compute/list_os_types.rb +9 -0
  84. data/lib/fog/cloudstack/requests/compute/list_snapshots.rb +21 -0
  85. data/lib/fog/core/errors.rb +3 -0
  86. data/lib/fog/core/json.rb +48 -7
  87. data/lib/fog/core/model.rb +11 -10
  88. data/lib/fog/core/service.rb +1 -1
  89. data/lib/fog/digitalocean/CHANGELOG.md +1 -1
  90. data/lib/fog/dreamhost/dns.rb +1 -3
  91. data/lib/fog/google.rb +1 -0
  92. data/lib/fog/google/compute.rb +131 -0
  93. data/lib/fog/google/models/compute/flavor.rb +24 -0
  94. data/lib/fog/google/models/compute/flavors.rb +28 -0
  95. data/lib/fog/google/models/compute/image.rb +19 -0
  96. data/lib/fog/google/models/compute/images.rb +28 -0
  97. data/lib/fog/google/models/compute/server.rb +80 -0
  98. data/lib/fog/google/models/compute/servers.rb +61 -0
  99. data/lib/fog/google/requests/compute/delete_disk.rb +31 -0
  100. data/lib/fog/google/requests/compute/delete_firewall.rb +30 -0
  101. data/lib/fog/google/requests/compute/delete_image.rb +30 -0
  102. data/lib/fog/google/requests/compute/delete_network.rb +30 -0
  103. data/lib/fog/google/requests/compute/delete_operation.rb +30 -0
  104. data/lib/fog/google/requests/compute/delete_server.rb +40 -0
  105. data/lib/fog/google/requests/compute/get_disk.rb +31 -0
  106. data/lib/fog/google/requests/compute/get_firewall.rb +30 -0
  107. data/lib/fog/google/requests/compute/get_image.rb +30 -0
  108. data/lib/fog/google/requests/compute/get_machine_type.rb +30 -0
  109. data/lib/fog/google/requests/compute/get_network.rb +30 -0
  110. data/lib/fog/google/requests/compute/get_server.rb +31 -0
  111. data/lib/fog/google/requests/compute/get_zone.rb +30 -0
  112. data/lib/fog/google/requests/compute/insert_disk.rb +35 -0
  113. data/lib/fog/google/requests/compute/insert_firewall.rb +37 -0
  114. data/lib/fog/google/requests/compute/insert_image.rb +38 -0
  115. data/lib/fog/google/requests/compute/insert_network.rb +34 -0
  116. data/lib/fog/google/requests/compute/insert_server.rb +49 -0
  117. data/lib/fog/google/requests/compute/list_disks.rb +30 -0
  118. data/lib/fog/google/requests/compute/list_firewalls.rb +29 -0
  119. data/lib/fog/google/requests/compute/list_global_operations.rb +28 -0
  120. data/lib/fog/google/requests/compute/list_images.rb +29 -0
  121. data/lib/fog/google/requests/compute/list_machine_types.rb +29 -0
  122. data/lib/fog/google/requests/compute/list_networks.rb +29 -0
  123. data/lib/fog/google/requests/compute/list_servers.rb +30 -0
  124. data/lib/fog/google/requests/compute/list_zone_operations.rb +28 -0
  125. data/lib/fog/google/requests/compute/list_zones.rb +29 -0
  126. data/lib/fog/google/requests/compute/set_metadata.rb +36 -0
  127. data/lib/fog/hp.rb +1 -1
  128. data/lib/fog/hp/storage.rb +1 -1
  129. data/lib/fog/internet_archive/models/storage/ia_attributes.rb +1 -1
  130. data/lib/fog/internet_archive/requests/storage/head_object.rb +1 -2
  131. data/lib/fog/internet_archive/requests/storage/list_multipart_uploads.rb +5 -6
  132. data/lib/fog/openstack.rb +29 -1
  133. data/lib/fog/openstack/CHANGELOG.md +1 -1
  134. data/lib/fog/openstack/compute.rb +3 -2
  135. data/lib/fog/openstack/identity.rb +1 -5
  136. data/lib/fog/openstack/image.rb +8 -9
  137. data/lib/fog/openstack/models/compute/server.rb +24 -0
  138. data/lib/fog/openstack/network.rb +7 -28
  139. data/lib/fog/openstack/requests/compute/allocate_address.rb +1 -1
  140. data/lib/fog/openstack/requests/compute/attach_volume.rb +11 -6
  141. data/lib/fog/openstack/requests/compute/boot_from_snapshot.rb +1 -1
  142. data/lib/fog/openstack/requests/compute/create_flavor.rb +1 -1
  143. data/lib/fog/openstack/requests/compute/create_key_pair.rb +1 -1
  144. data/lib/fog/openstack/requests/compute/create_security_group.rb +1 -1
  145. data/lib/fog/openstack/requests/compute/create_security_group_rule.rb +1 -1
  146. data/lib/fog/openstack/requests/compute/create_volume.rb +15 -14
  147. data/lib/fog/openstack/requests/compute/create_volume_snapshot.rb +1 -1
  148. data/lib/fog/openstack/requests/compute/delete_volume.rb +9 -2
  149. data/lib/fog/openstack/requests/compute/detach_volume.rb +7 -2
  150. data/lib/fog/openstack/requests/compute/get_server_volumes.rb +10 -0
  151. data/lib/fog/openstack/requests/compute/get_volume_details.rb +7 -16
  152. data/lib/fog/openstack/requests/compute/list_tenants.rb +1 -1
  153. data/lib/fog/openstack/requests/compute/list_volumes.rb +4 -26
  154. data/lib/fog/openstack/requests/compute/revert_resize_server.rb +2 -2
  155. data/lib/fog/openstack/requests/compute/update_quota.rb +1 -1
  156. data/lib/fog/openstack/requests/identity/create_ec2_credential.rb +1 -1
  157. data/lib/fog/openstack/requests/identity/create_role.rb +1 -1
  158. data/lib/fog/openstack/requests/identity/create_user.rb +1 -1
  159. data/lib/fog/openstack/requests/identity/update_user.rb +1 -1
  160. data/lib/fog/openstack/requests/image/update_image_members.rb +1 -1
  161. data/lib/fog/openstack/requests/volume/create_volume.rb +1 -1
  162. data/lib/fog/openstack/requests/volume/create_volume_snapshot.rb +1 -1
  163. data/lib/fog/openstack/requests/volume/get_quota.rb +31 -0
  164. data/lib/fog/openstack/requests/volume/get_quota_defaults.rb +31 -0
  165. data/lib/fog/openstack/requests/volume/update_quota.rb +32 -0
  166. data/lib/fog/openstack/volume.rb +11 -7
  167. data/lib/fog/rackspace.rb +11 -5
  168. data/lib/fog/rackspace/block_storage.rb +2 -1
  169. data/lib/fog/rackspace/cdn.rb +15 -15
  170. data/lib/fog/rackspace/compute.rb +2 -2
  171. data/lib/fog/rackspace/compute_v2.rb +8 -5
  172. data/lib/fog/rackspace/databases.rb +2 -1
  173. data/lib/fog/rackspace/dns.rb +2 -1
  174. data/lib/fog/rackspace/errors.rb +27 -0
  175. data/lib/fog/rackspace/load_balancers.rb +2 -1
  176. data/lib/fog/rackspace/mock_data.rb +5 -6
  177. data/lib/fog/rackspace/models/block_storage/snapshot.rb +8 -8
  178. data/lib/fog/rackspace/models/block_storage/snapshots.rb +8 -8
  179. data/lib/fog/rackspace/models/block_storage/volume.rb +16 -16
  180. data/lib/fog/rackspace/models/block_storage/volume_types.rb +8 -8
  181. data/lib/fog/rackspace/models/block_storage/volumes.rb +8 -8
  182. data/lib/fog/rackspace/models/compute_v2/attachment.rb +8 -8
  183. data/lib/fog/rackspace/models/compute_v2/attachments.rb +8 -8
  184. data/lib/fog/rackspace/models/compute_v2/flavors.rb +8 -8
  185. data/lib/fog/rackspace/models/compute_v2/image.rb +8 -8
  186. data/lib/fog/rackspace/models/compute_v2/images.rb +8 -8
  187. data/lib/fog/rackspace/models/compute_v2/metadata.rb +12 -12
  188. data/lib/fog/rackspace/models/compute_v2/metadatum.rb +8 -8
  189. data/lib/fog/rackspace/models/compute_v2/server.rb +94 -55
  190. data/lib/fog/rackspace/models/compute_v2/servers.rb +12 -12
  191. data/lib/fog/rackspace/models/dns/records.rb +1 -1
  192. data/lib/fog/rackspace/models/dns/zones.rb +1 -1
  193. data/lib/fog/rackspace/models/storage/account.rb +8 -8
  194. data/lib/fog/rackspace/models/storage/directories.rb +8 -8
  195. data/lib/fog/rackspace/models/storage/directory.rb +32 -32
  196. data/lib/fog/rackspace/models/storage/file.rb +36 -36
  197. data/lib/fog/rackspace/models/storage/files.rb +20 -20
  198. data/lib/fog/rackspace/requests/block_storage/create_snapshot.rb +4 -4
  199. data/lib/fog/rackspace/requests/block_storage/create_volume.rb +4 -4
  200. data/lib/fog/rackspace/requests/block_storage/delete_snapshot.rb +4 -4
  201. data/lib/fog/rackspace/requests/block_storage/delete_volume.rb +4 -4
  202. data/lib/fog/rackspace/requests/block_storage/get_snapshot.rb +4 -4
  203. data/lib/fog/rackspace/requests/block_storage/get_volume.rb +4 -4
  204. data/lib/fog/rackspace/requests/block_storage/get_volume_type.rb +4 -4
  205. data/lib/fog/rackspace/requests/block_storage/list_snapshots.rb +4 -4
  206. data/lib/fog/rackspace/requests/block_storage/list_volume_types.rb +4 -4
  207. data/lib/fog/rackspace/requests/block_storage/list_volumes.rb +4 -4
  208. data/lib/fog/rackspace/requests/cdn/delete_object.rb +4 -4
  209. data/lib/fog/rackspace/requests/cdn/get_containers.rb +4 -4
  210. data/lib/fog/rackspace/requests/cdn/head_container.rb +4 -4
  211. data/lib/fog/rackspace/requests/cdn/post_container.rb +4 -4
  212. data/lib/fog/rackspace/requests/cdn/put_container.rb +4 -4
  213. data/lib/fog/rackspace/requests/compute/delete_image.rb +1 -1
  214. data/lib/fog/rackspace/requests/compute_v2/attach_volume.rb +4 -4
  215. data/lib/fog/rackspace/requests/compute_v2/change_server_password.rb +4 -4
  216. data/lib/fog/rackspace/requests/compute_v2/confirm_resize_server.rb +4 -4
  217. data/lib/fog/rackspace/requests/compute_v2/create_image.rb +4 -4
  218. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +11 -5
  219. data/lib/fog/rackspace/requests/compute_v2/delete_attachment.rb +4 -4
  220. data/lib/fog/rackspace/requests/compute_v2/delete_image.rb +5 -4
  221. data/lib/fog/rackspace/requests/compute_v2/delete_metadata_item.rb +4 -4
  222. data/lib/fog/rackspace/requests/compute_v2/delete_server.rb +4 -4
  223. data/lib/fog/rackspace/requests/compute_v2/get_attachment.rb +4 -4
  224. data/lib/fog/rackspace/requests/compute_v2/get_flavor.rb +4 -4
  225. data/lib/fog/rackspace/requests/compute_v2/get_image.rb +4 -4
  226. data/lib/fog/rackspace/requests/compute_v2/get_metadata_item.rb +4 -4
  227. data/lib/fog/rackspace/requests/compute_v2/get_server.rb +4 -4
  228. data/lib/fog/rackspace/requests/compute_v2/list_addresses.rb +4 -4
  229. data/lib/fog/rackspace/requests/compute_v2/list_addresses_by_network.rb +4 -4
  230. data/lib/fog/rackspace/requests/compute_v2/list_attachments.rb +4 -4
  231. data/lib/fog/rackspace/requests/compute_v2/list_flavors.rb +4 -4
  232. data/lib/fog/rackspace/requests/compute_v2/list_images.rb +4 -4
  233. data/lib/fog/rackspace/requests/compute_v2/list_metadata.rb +4 -4
  234. data/lib/fog/rackspace/requests/compute_v2/list_servers.rb +4 -4
  235. data/lib/fog/rackspace/requests/compute_v2/reboot_server.rb +4 -4
  236. data/lib/fog/rackspace/requests/compute_v2/rebuild_server.rb +4 -4
  237. data/lib/fog/rackspace/requests/compute_v2/rescue_server.rb +43 -0
  238. data/lib/fog/rackspace/requests/compute_v2/resize_server.rb +4 -4
  239. data/lib/fog/rackspace/requests/compute_v2/revert_resize_server.rb +4 -4
  240. data/lib/fog/rackspace/requests/compute_v2/set_metadata.rb +4 -4
  241. data/lib/fog/rackspace/requests/compute_v2/set_metadata_item.rb +4 -4
  242. data/lib/fog/rackspace/requests/compute_v2/unrescue_server.rb +40 -0
  243. data/lib/fog/rackspace/requests/compute_v2/update_metadata.rb +4 -4
  244. data/lib/fog/rackspace/requests/compute_v2/update_server.rb +4 -4
  245. data/lib/fog/rackspace/requests/storage/copy_object.rb +4 -4
  246. data/lib/fog/rackspace/requests/storage/delete_container.rb +4 -4
  247. data/lib/fog/rackspace/requests/storage/delete_object.rb +4 -4
  248. data/lib/fog/rackspace/requests/storage/get_container.rb +4 -4
  249. data/lib/fog/rackspace/requests/storage/get_containers.rb +4 -4
  250. data/lib/fog/rackspace/requests/storage/get_object.rb +4 -4
  251. data/lib/fog/rackspace/requests/storage/get_object_https_url.rb +4 -4
  252. data/lib/fog/rackspace/requests/storage/head_container.rb +4 -4
  253. data/lib/fog/rackspace/requests/storage/head_containers.rb +4 -4
  254. data/lib/fog/rackspace/requests/storage/head_object.rb +4 -4
  255. data/lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb +4 -4
  256. data/lib/fog/rackspace/requests/storage/put_container.rb +4 -4
  257. data/lib/fog/rackspace/requests/storage/put_object.rb +4 -4
  258. data/lib/fog/rackspace/requests/storage/put_object_manifest.rb +4 -4
  259. data/lib/fog/rackspace/service.rb +1 -1
  260. data/lib/fog/rackspace/storage.rb +12 -6
  261. data/lib/fog/riakcs.rb +3 -3
  262. data/lib/fog/riakcs/provisioning.rb +1 -3
  263. data/lib/fog/riakcs/requests/provisioning/create_user.rb +2 -2
  264. data/lib/fog/riakcs/requests/provisioning/get_user.rb +1 -1
  265. data/lib/fog/riakcs/requests/provisioning/list_users.rb +1 -1
  266. data/lib/fog/riakcs/requests/usage/get_usage.rb +1 -1
  267. data/lib/fog/riakcs/usage.rb +0 -1
  268. data/lib/fog/version.rb +1 -1
  269. data/lib/fog/vsphere/compute.rb +21 -14
  270. data/lib/fog/vsphere/models/compute/networks.rb +2 -2
  271. data/lib/fog/vsphere/models/compute/server.rb +10 -0
  272. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +1 -1
  273. data/lib/fog/vsphere/requests/compute/get_template.rb +16 -0
  274. data/lib/fog/vsphere/requests/compute/list_datacenters.rb +1 -1
  275. data/lib/fog/vsphere/requests/compute/list_templates.rb +49 -0
  276. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +9 -6
  277. data/lib/fog/vsphere/requests/compute/vm_clone.rb +41 -27
  278. data/lib/fog/xenserver/CHANGELOG.md +1 -1
  279. data/lib/fog/xenserver/models/compute/network.rb +2 -2
  280. data/lib/tasks/changelog_task.rb +2 -1
  281. data/tests/aws/models/storage/directory_tests.rb +41 -5
  282. data/tests/aws/models/storage/file_tests.rb +1 -2
  283. data/tests/aws/models/storage/files_tests.rb +6 -4
  284. data/tests/aws/models/storage/url_tests.rb +7 -5
  285. data/tests/aws/models/storage/version_tests.rb +2 -2
  286. data/tests/aws/models/storage/versions_tests.rb +5 -5
  287. data/tests/aws/requests/iam/user_tests.rb +10 -8
  288. data/tests/aws/requests/storage/multipart_upload_tests.rb +1 -1
  289. data/tests/aws/requests/storage/object_tests.rb +15 -13
  290. data/tests/brightbox/compute/image_selector_tests.rb +103 -0
  291. data/tests/cloudstack/compute/models/disk_offering_tests.rb +5 -0
  292. data/tests/cloudstack/compute/models/snapshot_tests.rb +5 -20
  293. data/tests/cloudstack/requests/disk_offering_tests.rb +3 -3
  294. data/tests/cloudstack/requests/os_type_tests.rb +2 -3
  295. data/tests/compute/helper.rb +9 -0
  296. data/tests/core/json_tests.rb +62 -0
  297. data/tests/dynect/requests/dns/dns_tests.rb +0 -3
  298. data/tests/google/models/compute/server_tests.rb +24 -0
  299. data/tests/google/requests/compute/disk_tests.rb +88 -0
  300. data/tests/google/requests/compute/firewall_tests.rb +85 -0
  301. data/tests/google/requests/compute/image_tests.rb +80 -0
  302. data/tests/google/requests/compute/network_tests.rb +74 -0
  303. data/tests/google/requests/compute/operation_tests.rb +19 -0
  304. data/tests/google/requests/compute/server_tests.rb +84 -0
  305. data/tests/google/requests/compute/zone_tests.rb +46 -0
  306. data/tests/helpers/mock_helper.rb +4 -0
  307. data/tests/openstack/models/compute/server_tests.rb +91 -1
  308. data/tests/openstack/requests/compute/volume_tests.rb +11 -9
  309. data/tests/openstack/requests/volume/quota_tests.rb +51 -0
  310. data/tests/openstack/version_tests.rb +55 -0
  311. data/tests/rackspace/helper.rb +10 -0
  312. data/tests/rackspace/models/compute_v2/server_tests.rb +26 -1
  313. data/tests/rackspace/requests/compute/image_tests.rb +1 -1
  314. data/tests/rackspace/requests/compute_v2/image_tests.rb +2 -2
  315. data/tests/rackspace/requests/compute_v2/server_tests.rb +13 -0
  316. data/tests/rackspace/requests/dns/dns_tests.rb +1 -1
  317. data/tests/rackspace/requests/dns/records_tests.rb +3 -3
  318. data/tests/vsphere/requests/compute/vm_clone_tests.rb +10 -0
  319. metadata +109 -747
@@ -33,10 +33,10 @@ module Fog
33
33
  request({
34
34
  :expects => 200,
35
35
  :headers => {},
36
- :host => "#{bucket_name}.#{@host}",
36
+ :bucket_name => bucket_name,
37
+ :object_name => object_name,
37
38
  :idempotent => true,
38
39
  :method => 'GET',
39
- :path => CGI.escape(object_name),
40
40
  :query => {'torrent' => nil}
41
41
  })
42
42
  end
@@ -11,20 +11,11 @@ module Fog
11
11
  unless object_name
12
12
  raise ArgumentError.new('object_name is required')
13
13
  end
14
- host, path = if bucket_name =~ Fog::AWS::COMPLIANT_BUCKET_NAMES
15
- ["#{bucket_name}.#{@host}", object_name]
16
- else
17
- [@host, "#{bucket_name}/#{object_name}"]
18
- end
19
- scheme_host_path_query({
20
- :scheme => options[:scheme],
21
- :headers => {},
22
- :host => host,
23
- :port => @port,
24
- :method => 'GET',
25
- :path => path,
26
- :query => options[:query]
27
- }, expires)
14
+ signed_url(options.merge({
15
+ :bucket_name => bucket_name,
16
+ :object_name => object_name,
17
+ :method => 'GET'
18
+ }), expires)
28
19
  end
29
20
  end
30
21
 
@@ -19,7 +19,7 @@ module Fog
19
19
  request({
20
20
  :expects => 200,
21
21
  :headers => {},
22
- :host => "#{bucket_name}.#{@host}",
22
+ :bucket_name => bucket_name,
23
23
  :idempotent => true,
24
24
  :method => 'GET',
25
25
  :parser => Fog::Parsers::Storage::AWS::GetRequestPayment.new,
@@ -42,10 +42,10 @@ module Fog
42
42
  request({
43
43
  :expects => 200,
44
44
  :headers => headers,
45
- :host => "#{bucket_name}.#{@host}",
45
+ :bucket_name => bucket_name,
46
+ :object_name => object_name,
46
47
  :idempotent => true,
47
48
  :method => 'HEAD',
48
- :path => CGI.escape(object_name),
49
49
  :query => query
50
50
  })
51
51
  end
@@ -30,10 +30,10 @@ module Fog
30
30
  request({
31
31
  :expects => 200,
32
32
  :headers => options,
33
- :host => "#{bucket_name}.#{@host}",
33
+ :bucket_name => bucket_name,
34
+ :object_name => object_name,
34
35
  :method => 'POST',
35
36
  :parser => Fog::Parsers::Storage::AWS::InitiateMultipartUpload.new,
36
- :path => CGI.escape(object_name),
37
37
  :query => {'uploads' => nil}
38
38
  })
39
39
  end
@@ -7,16 +7,15 @@ module Fog
7
7
 
8
8
  # List multipart uploads for a bucket
9
9
  #
10
- # @param bucket_name [String] Name of bucket to list multipart uploads for
11
- # @param upload_id [String] upload id to list objects for
12
- # @param options [Hash] config arguments for list. Defaults to {}.
13
- # @option options key-marker[String] limits parts to only those that appear lexicographically after this key.
14
- # @option options max-uploads [Integer] limits number of uploads returned
15
- # @option options upload-id-marker [String] limits uploads to only those that appear lexicographically after this upload id.
10
+ # @param [String] bucket_name Name of bucket to list multipart uploads for
11
+ # @param [Hash] options config arguments for list. Defaults to {}.
12
+ # @option options [String] key-marker limits parts to only those that appear lexicographically after this key.
13
+ # @option options [Integer] max-uploads limits number of uploads returned
14
+ # @option options [String] upload-id-marker limits uploads to only those that appear lexicographically after this upload id.
16
15
  #
17
16
  # @return [Excon::Response] response:
18
17
  # * body [Hash]:
19
- # * Bucket [string] Bucket where the multipart upload was initiated
18
+ # * Bucket [String] Bucket where the multipart upload was initiated
20
19
  # * IsTruncated [Boolean] Whether or not the listing is truncated
21
20
  # * KeyMarker [String] first key in list, only upload ids after this lexographically will appear
22
21
  # * MaxUploads [Integer] Maximum results to return
@@ -41,7 +40,7 @@ module Fog
41
40
  request({
42
41
  :expects => 200,
43
42
  :headers => {},
44
- :host => "#{bucket_name}.#{@host}",
43
+ :bucket_name => bucket_name,
45
44
  :idempotent => true,
46
45
  :method => 'GET',
47
46
  :parser => Fog::Parsers::Storage::AWS::ListMultipartUploads.new,
@@ -40,11 +40,11 @@ module Fog
40
40
  request({
41
41
  :expects => 200,
42
42
  :headers => {},
43
- :host => "#{bucket_name}.#{@host}",
43
+ :bucket_name => bucket_name,
44
+ :object_name => object_name,
44
45
  :idempotent => true,
45
46
  :method => 'GET',
46
47
  :parser => Fog::Parsers::Storage::AWS::ListParts.new,
47
- :path => CGI.escape(object_name),
48
48
  :query => options.merge!({'uploadId' => upload_id})
49
49
  })
50
50
  end
@@ -31,7 +31,7 @@ DATA
31
31
  :body => data,
32
32
  :headers => options,
33
33
  :idempotent => true,
34
- :host => "#{bucket_name}.#{@host}",
34
+ :bucket_name => bucket_name,
35
35
  :method => 'PUT'
36
36
  })
37
37
  end
@@ -46,7 +46,7 @@ module Fog
46
46
  :body => data,
47
47
  :expects => 200,
48
48
  :headers => headers,
49
- :host => "#{bucket_name}.#{@host}",
49
+ :bucket_name => bucket_name,
50
50
  :method => 'PUT',
51
51
  :query => {'acl' => nil}
52
52
  })
@@ -31,7 +31,7 @@ module Fog
31
31
  :body => data,
32
32
  :expects => 200,
33
33
  :headers => headers,
34
- :host => "#{bucket_name}.#{@host}",
34
+ :bucket_name => bucket_name,
35
35
  :method => 'PUT',
36
36
  :query => {'cors' => nil}
37
37
  })
@@ -66,7 +66,7 @@ module Fog
66
66
  :expects => 200,
67
67
  :headers => {'Content-MD5' => Base64.encode64(Digest::MD5.digest(body)).chomp!,
68
68
  'Content-Type' => 'application/xml'},
69
- :host => "#{bucket_name}.#{@host}",
69
+ :bucket_name => bucket_name,
70
70
  :method => 'PUT',
71
71
  :query => {'lifecycle' => nil}
72
72
  })
@@ -69,7 +69,7 @@ DATA
69
69
  :body => data,
70
70
  :expects => 200,
71
71
  :headers => {},
72
- :host => "#{bucket_name}.#{@host}",
72
+ :bucket_name => bucket_name,
73
73
  :method => 'PUT',
74
74
  :query => {'logging' => nil}
75
75
  })
@@ -15,7 +15,7 @@ module Fog
15
15
  :body => Fog::JSON.encode(policy),
16
16
  :expects => 204,
17
17
  :headers => {},
18
- :host => "#{bucket_name}.#{@host}",
18
+ :bucket_name => bucket_name,
19
19
  :method => 'PUT',
20
20
  :query => {'policy' => nil}
21
21
  })
@@ -22,7 +22,7 @@ DATA
22
22
  :body => data,
23
23
  :expects => 200,
24
24
  :headers => {},
25
- :host => "#{bucket_name}.#{@host}",
25
+ :bucket_name => bucket_name,
26
26
  :method => 'PUT',
27
27
  :query => {'versioning' => nil}
28
28
  })
@@ -35,7 +35,7 @@ DATA
35
35
  :body => data,
36
36
  :expects => 200,
37
37
  :headers => {},
38
- :host => "#{bucket_name}.#{@host}",
38
+ :bucket_name => bucket_name,
39
39
  :method => 'PUT',
40
40
  :query => {'website' => nil}
41
41
  })
@@ -33,10 +33,10 @@ module Fog
33
33
  :body => data[:body],
34
34
  :expects => 200,
35
35
  :headers => headers,
36
- :host => "#{bucket_name}.#{@host}",
36
+ :bucket_name => bucket_name,
37
+ :object_name => object_name,
37
38
  :idempotent => true,
38
39
  :method => 'PUT',
39
- :path => CGI.escape(object_name)
40
40
  })
41
41
  end
42
42
 
@@ -7,9 +7,9 @@ module Fog
7
7
 
8
8
  # Change access control list for an S3 object
9
9
  #
10
- # @param bucket_name [String] name of bucket to modify
11
- # @param object_name [String] name of object to get access control list for
12
- # @param acl [Hash]:
10
+ # @param [String] bucket_name name of bucket to modify
11
+ # @param [String] object_name name of object to get access control list for
12
+ # @param [Hash] acl
13
13
  # * Owner [Hash]
14
14
  # * ID [String] id of owner
15
15
  # * DisplayName [String] display name of owner
@@ -22,9 +22,9 @@ module Fog
22
22
  # or
23
23
  # * URI [String] URI of group to grant access for
24
24
  # * Permission [String] Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
25
- # @param acl [String] Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
26
- # @param options [Hash]
27
- # @option options versionId [String] specify a particular version to retrieve
25
+ # @param [String] acl Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
26
+ # @param [Hash] options
27
+ # @option options [String] versionId specify a particular version to retrieve
28
28
  #
29
29
  # @see http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUTacl.html
30
30
 
@@ -54,9 +54,9 @@ module Fog
54
54
  :body => data,
55
55
  :expects => 200,
56
56
  :headers => headers,
57
- :host => "#{bucket_name}.#{@host}",
57
+ :bucket_name => bucket_name,
58
+ :object_name => object_name,
58
59
  :method => 'PUT',
59
- :path => CGI.escape(object_name),
60
60
  :query => query
61
61
  })
62
62
  end
@@ -10,14 +10,12 @@ module Fog
10
10
  unless object_name
11
11
  raise ArgumentError.new('object_name is required')
12
12
  end
13
- scheme_host_path_query({
14
- :scheme => options[:scheme],
15
- :headers => headers,
16
- :host => @host,
17
- :port => @port,
13
+ signed_url(options.merge({
14
+ :bucket_name => bucket_name,
15
+ :object_name => object_name,
18
16
  :method => 'PUT',
19
- :path => "#{bucket_name}/#{object_name}"
20
- }, expires)
17
+ :headers => headers,
18
+ }), expires)
21
19
  end
22
20
  end
23
21
 
@@ -21,7 +21,7 @@ DATA
21
21
  :body => data,
22
22
  :expects => 200,
23
23
  :headers => {},
24
- :host => "#{bucket_name}.#{@host}",
24
+ :bucket_name => bucket_name,
25
25
  :method => 'PUT',
26
26
  :query => {'requestPayment' => nil}
27
27
  })
@@ -28,9 +28,9 @@ module Fog
28
28
  :expects => 200,
29
29
  :idempotent => true,
30
30
  :headers => headers,
31
- :host => "#{bucket_name}.#{@host}",
31
+ :bucket_name => bucket_name,
32
+ :object_name => object_name,
32
33
  :method => 'PUT',
33
- :path => CGI.escape(object_name),
34
34
  :query => {'uploadId' => upload_id, 'partNumber' => part_number}
35
35
  })
36
36
  end
@@ -6,6 +6,42 @@ module Fog
6
6
  class AWS < Fog::Service
7
7
  extend Fog::AWS::CredentialFetcher::ServiceMethods
8
8
 
9
+ COMPLIANT_BUCKET_NAMES = /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/
10
+
11
+ DEFAULT_REGION = 'us-east-1'
12
+
13
+ DEFAULT_SCHEME = 'https'
14
+ DEFAULT_SCHEME_PORT = {
15
+ 'http' => 80,
16
+ 'https' => 443
17
+ }
18
+
19
+ VALID_QUERY_KEYS = %w[
20
+ acl
21
+ cors
22
+ delete
23
+ lifecycle
24
+ location
25
+ logging
26
+ notification
27
+ partNumber
28
+ policy
29
+ requestPayment
30
+ response-cache-control
31
+ response-content-disposition
32
+ response-content-encoding
33
+ response-content-language
34
+ response-content-type
35
+ response-expires
36
+ torrent
37
+ uploadId
38
+ uploads
39
+ versionId
40
+ versioning
41
+ versions
42
+ website
43
+ ]
44
+
9
45
  requires :aws_access_key_id, :aws_secret_access_key
10
46
  recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :path_style
11
47
 
@@ -79,11 +115,11 @@ module Fog
79
115
  end
80
116
 
81
117
  def http_url(params, expires)
82
- scheme_host_path_query(params.merge(:scheme => 'http', :port => 80), expires)
118
+ signed_url(params.merge(:scheme => 'http'), expires)
83
119
  end
84
120
 
85
121
  def https_url(params, expires)
86
- scheme_host_path_query(params.merge(:scheme => 'https', :port => 443), expires)
122
+ signed_url(params.merge(:scheme => 'https'), expires)
87
123
  end
88
124
 
89
125
  def url(params, expires)
@@ -91,32 +127,124 @@ module Fog
91
127
  https_url(params, expires)
92
128
  end
93
129
 
130
+ def request_url(params)
131
+ params = request_params(params)
132
+ params_to_url(params)
133
+ end
134
+
135
+ def signed_url(params, expires)
136
+ expires = expires.to_i
137
+ signature = signature(params, expires)
138
+ params = request_params(params)
139
+
140
+ params[:query] = (params[:query] || {}).merge({
141
+ 'AWSAccessKeyId' => @aws_access_key_id,
142
+ 'Signature' => signature,
143
+ 'Expires' => expires,
144
+ })
145
+ params[:query]['x-amz-security-token'] = @aws_session_token if @aws_session_token
146
+
147
+ params_to_url(params)
148
+ end
149
+
94
150
  private
95
151
 
96
- def scheme_host_path_query(params, expires)
97
- params[:scheme] ||= @scheme
98
- if params[:port] == 80 && params[:scheme] == 'http'
99
- params.delete(:port)
152
+ def region_to_host(region=nil)
153
+ case region.to_s
154
+ when DEFAULT_REGION, ''
155
+ 's3.amazonaws.com'
156
+ else
157
+ "s3-#{region}.amazonaws.com"
158
+ end
159
+ end
160
+
161
+ def object_to_path(object_name=nil)
162
+ '/' + Fog::AWS.escape(object_name.to_s).gsub('%2F','/')
163
+ end
164
+
165
+ def bucket_to_path(bucket_name, path=nil)
166
+ "/#{Fog::AWS.escape(bucket_name.to_s)}#{path}"
167
+ end
168
+
169
+ # Transforms things like bucket_name, object_name, region
170
+ #
171
+ # Should yield the same result when called f*f
172
+ def request_params(params)
173
+ headers = params[:headers] || {}
174
+
175
+ if params[:scheme]
176
+ scheme = params[:scheme]
177
+ port = params[:port]
178
+ else
179
+ scheme = @scheme || DEFAULT_SCHEME
180
+ port = @port
100
181
  end
101
- if params[:port] == 443 && params[:scheme] == 'https'
102
- params.delete(:port)
182
+ if DEFAULT_SCHEME_PORT[scheme] == port
183
+ port = nil
103
184
  end
104
- params[:headers] ||= {}
105
- params[:headers]['Date'] = expires.to_i
106
- params[:path] = Fog::AWS.escape(params[:path]).gsub('%2F', '/')
107
- query = []
108
- params[:headers]['x-amz-security-token'] = @aws_session_token if @aws_session_token
109
- if params[:query]
110
- for key, value in params[:query]
111
- query << "#{key}=#{Fog::AWS.escape(value)}"
185
+
186
+ if params[:region]
187
+ region = params[:region]
188
+ host = params[:host] || region_to_host(region)
189
+ else
190
+ region = @region || DEFAULT_REGION
191
+ host = params[:host] || @host || region_to_host(region)
192
+ end
193
+
194
+ path = params[:path] || object_to_path(params[:object_name])
195
+ path = '/' + path if path[0..0] != '/'
196
+
197
+ if params[:bucket_name]
198
+ bucket_name = params[:bucket_name]
199
+
200
+ path_style = params.fetch(:path_style, @path_style)
201
+ if !path_style && COMPLIANT_BUCKET_NAMES !~ bucket_name
202
+ Fog::Logger.warning("fog: the specified s3 bucket name(#{bucket_name}) is not a valid dns name, which will negatively impact performance. For details see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/BucketRestrictions.html")
203
+ path_style = true
204
+ elsif bucket_name.include?('.')
205
+ Fog::Logger.warning("fog: the specified s3 bucket name(#{bucket_name}) might fail with https.")
206
+ end
207
+
208
+ if path_style
209
+ path = bucket_to_path bucket_name, path
210
+ else
211
+ host = [bucket_name, host].join('.')
112
212
  end
113
213
  end
114
- query << "AWSAccessKeyId=#{@aws_access_key_id}"
115
- query << "Signature=#{Fog::AWS.escape(signature(params))}"
116
- query << "Expires=#{params[:headers]['Date']}"
117
- query << "x-amz-security-token=#{Fog::AWS.escape(@aws_session_token)}" if @aws_session_token
118
- port_part = params[:port] && ":#{params[:port]}"
119
- "#{params[:scheme]}://#{params[:host]}#{port_part}/#{params[:path]}?#{query.join('&')}"
214
+
215
+ ret = params.merge({
216
+ :scheme => scheme,
217
+ :host => host,
218
+ :port => port,
219
+ :path => path,
220
+ :headers => headers,
221
+ })
222
+
223
+ #
224
+ ret.delete(:path_style)
225
+ ret.delete(:bucket_name)
226
+ ret.delete(:object_name)
227
+ ret.delete(:region)
228
+
229
+ ret
230
+ end
231
+
232
+ def params_to_url(params)
233
+ query = params[:query] && params[:query].map do |key, value|
234
+ if value
235
+ [key, Fog::AWS.escape(value.to_s)].join('=')
236
+ else
237
+ key
238
+ end
239
+ end.join('&')
240
+
241
+ URI::Generic.build({
242
+ :scheme => params[:scheme],
243
+ :host => params[:host],
244
+ :port => params[:port],
245
+ :path => params[:path],
246
+ :query => query,
247
+ }).to_s
120
248
  end
121
249
 
122
250
  end
@@ -210,15 +338,9 @@ module Fog
210
338
  require 'mime/types'
211
339
  @use_iam_profile = options[:use_iam_profile]
212
340
  setup_credentials(options)
213
- options[:region] ||= 'us-east-1'
214
- @host = options[:host] || case options[:region]
215
- when 'us-east-1'
216
- 's3.amazonaws.com'
217
- else
218
- "s3-#{options[:region]}.amazonaws.com"
219
- end
220
- @scheme = options[:scheme] || 'https'
221
- @region = options[:region]
341
+ @region = options[:region] || DEFAULT_REGION
342
+ @host = options[:host] || region_to_host(@region)
343
+ @scheme = options[:scheme] || DEFAULT_SCHEME
222
344
  end
223
345
 
224
346
  def data
@@ -229,7 +351,7 @@ module Fog
229
351
  self.class.data[@region].delete(@aws_access_key_id)
230
352
  end
231
353
 
232
- def signature(params)
354
+ def signature(params, expires)
233
355
  "foo"
234
356
  end
235
357
 
@@ -270,6 +392,7 @@ module Fog
270
392
  @use_iam_profile = options[:use_iam_profile]
271
393
  setup_credentials(options)
272
394
  @connection_options = options[:connection_options] || {}
395
+ @persistent = options.fetch(:persistent, false)
273
396
 
274
397
  if @endpoint = options[:endpoint]
275
398
  endpoint = URI.parse(@endpoint)
@@ -279,23 +402,17 @@ module Fog
279
402
  else
280
403
  endpoint.path
281
404
  end
282
- @port = endpoint.port
283
405
  @scheme = endpoint.scheme
406
+ @port = endpoint.port
284
407
  else
285
- options[:region] ||= 'us-east-1'
286
- @region = options[:region]
287
- @host = options[:host] || case options[:region]
288
- when 'us-east-1'
289
- 's3.amazonaws.com'
290
- else
291
- "s3-#{options[:region]}.amazonaws.com"
292
- end
408
+ @region = options[:region] || DEFAULT_REGION
409
+ @host = options[:host] || region_to_host(@region)
293
410
  @path = options[:path] || '/'
294
- @persistent = options.fetch(:persistent, false)
295
- @port = options[:port] || 443
296
- @scheme = options[:scheme] || 'https'
411
+ @scheme = options[:scheme] || DEFAULT_SCHEME
412
+ @port = options[:port] || DEFAULT_SCHEME_PORT[@scheme]
297
413
  @path_style = options[:path_style] || false
298
414
  end
415
+
299
416
  @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", @persistent, @connection_options)
300
417
  end
301
418
 
@@ -303,17 +420,19 @@ module Fog
303
420
  @connection.reset
304
421
  end
305
422
 
306
- def signature(params)
423
+ def signature(params, expires)
424
+ headers = params[:headers] || {}
425
+
307
426
  string_to_sign =
308
427
  <<-DATA
309
428
  #{params[:method].to_s.upcase}
310
- #{params[:headers]['Content-MD5']}
311
- #{params[:headers]['Content-Type']}
312
- #{params[:headers]['Date']}
429
+ #{headers['Content-MD5']}
430
+ #{headers['Content-Type']}
431
+ #{expires}
313
432
  DATA
314
433
 
315
434
  amz_headers, canonical_amz_headers = {}, ''
316
- for key, value in params[:headers]
435
+ for key, value in headers
317
436
  if key[0..5] == 'x-amz-'
318
437
  amz_headers[key] = value
319
438
  end
@@ -324,55 +443,33 @@ DATA
324
443
  end
325
444
  string_to_sign << canonical_amz_headers
326
445
 
327
- subdomain = params[:host].split(".#{@host}").first
328
- valid_dns = !!(subdomain =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/)
329
- if !valid_dns || @path_style
330
- Fog::Logger.warning("fog: the specified s3 bucket name(#{subdomain}) is not a valid dns name, which will negatively impact performance. For details see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/BucketRestrictions.html") unless valid_dns
331
- params[:host] = params[:host].split("#{subdomain}.")[-1]
332
- if params[:path]
333
- params[:path] = "#{subdomain}/#{params[:path]}" unless subdomain == @host
334
- else
335
- params[:path] = subdomain
446
+
447
+ query_string = ''
448
+ if params[:query]
449
+ query_args = []
450
+ for key in params[:query].keys.sort
451
+ if VALID_QUERY_KEYS.include?(key)
452
+ value = params[:query][key]
453
+ if value
454
+ query_args << "#{key}=#{Fog::AWS.escape(value.to_s)}"
455
+ else
456
+ query_args << key
457
+ end
458
+ end
459
+ end
460
+ if query_args.any?
461
+ query_string = '?' + query_args.join('&')
336
462
  end
337
- subdomain = nil
338
463
  end
339
464
 
340
- canonical_resource = @path.dup
341
- unless subdomain.nil? || subdomain == @host
342
- canonical_resource << "#{Fog::AWS.escape(subdomain).downcase}/"
343
- end
344
- canonical_resource << params[:path].to_s
345
- canonical_resource << '?'
346
- for key in (params[:query] || {}).keys.sort
347
- if %w{
348
- acl
349
- cors
350
- delete
351
- lifecycle
352
- location
353
- logging
354
- notification
355
- partNumber
356
- policy
357
- requestPayment
358
- response-cache-control
359
- response-content-disposition
360
- response-content-encoding
361
- response-content-language
362
- response-content-type
363
- response-expires
364
- torrent
365
- uploadId
366
- uploads
367
- versionId
368
- versioning
369
- versions
370
- website
371
- }.include?(key)
372
- canonical_resource << "#{key}#{"=#{params[:query][key]}" unless params[:query][key].nil?}&"
373
- end
465
+ canonical_path = (params[:path] || object_to_path(params[:object_name])).to_s
466
+ canonical_path = '/' + canonical_path if canonical_path[0..0] != '/'
467
+ if params[:bucket_name]
468
+ canonical_resource = "/#{params[:bucket_name]}#{canonical_path}"
469
+ else
470
+ canonical_resource = canonical_path
374
471
  end
375
- canonical_resource.chop!
472
+ canonical_resource << query_string
376
473
  string_to_sign << canonical_resource
377
474
 
378
475
  signed_string = @hmac.sign(string_to_sign)
@@ -393,16 +490,23 @@ DATA
393
490
  def request(params, &block)
394
491
  refresh_credentials_if_expired
395
492
 
396
- params[:headers]['Date'] = Fog::Time.now.to_date_header
493
+ expires = Fog::Time.now.to_date_header
494
+ signature = signature(params, expires)
495
+
496
+ params = request_params(params)
497
+ params.delete(:port) unless params[:port]
498
+
499
+ params[:headers]['Date'] = expires
397
500
  params[:headers]['x-amz-security-token'] = @aws_session_token if @aws_session_token
398
- params[:headers]['Authorization'] = "AWS #{@aws_access_key_id}:#{signature(params)}"
501
+ params[:headers]['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
399
502
  # FIXME: ToHashParser should make this not needed
400
503
  original_params = params.dup
401
504
 
402
505
  begin
403
506
  response = @connection.request(params, &block)
404
507
  rescue Excon::Errors::TemporaryRedirect => error
405
- uri = URI.parse(error.response.is_a?(Hash) ? error.response[:headers]['Location'] : error.response.headers['Location'])
508
+ headers = (error.response.is_a?(Hash) ? error.response[:headers] : error.response.headers)
509
+ uri = URI.parse(headers['Location'])
406
510
  Fog::Logger.warning("fog: followed redirect to #{uri.host}, connecting to the matching region will be more performant")
407
511
  response = Fog::Connection.new("#{@scheme}://#{uri.host}:#{@port}", false, @connection_options).request(original_params, &block)
408
512
  end