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,186 @@
1
+ require 'fog/atmos'
2
+ require 'fog/storage'
3
+
4
+ module Fog
5
+ module Storage
6
+ class Atmos < Fog::Service
7
+ requires :atmos_storage_endpoint,
8
+ :atmos_storage_secret,
9
+ :atmos_storage_token
10
+ recognizes :persistent
11
+
12
+ model_path 'fog/atmos/models/storage'
13
+ model :directory
14
+ collection :directories
15
+ model :file
16
+ collection :files
17
+
18
+ request_path 'fog/atmos/requests/storage'
19
+ # request :delete_container
20
+ request :get_namespace
21
+ request :head_namespace
22
+ request :post_namespace
23
+ request :put_namespace
24
+ request :delete_namespace
25
+
26
+ module Utils
27
+ ENDPOINT_REGEX = /(https*):\/\/([a-zA-Z0-9\.\-]+)(:[0-9]+)?(\/.*)?/
28
+
29
+ def ssl?
30
+ protocol = @endpoint.match(ENDPOINT_REGEX)[1]
31
+ raise ArgumentError, 'Invalid endpoint URL' if protocol.nil?
32
+
33
+ return true if protocol == 'https'
34
+ return false if protocol == 'http'
35
+
36
+ raise ArgumentError, "Unknown protocol #{protocol}"
37
+ end
38
+
39
+ def port
40
+ port = @endpoint.match(ENDPOINT_REGEX)[3]
41
+ return ssl? ? 443 : 80 if port.nil?
42
+ port.split(':')[1].to_i
43
+ end
44
+
45
+ def host
46
+ @endpoint.match(ENDPOINT_REGEX)[2]
47
+ end
48
+
49
+ def api_path
50
+ @endpoint.match(ENDPOINT_REGEX)[4]
51
+ end
52
+
53
+ def setup_credentials(options)
54
+ @storage_token = options[:atmos_storage_token]
55
+ @storage_secret = options[:atmos_storage_secret]
56
+ @storage_secret_decoded = Base64.decode64(@storage_secret)
57
+ @endpoint = options[:atmos_storage_endpoint]
58
+ @prefix = self.ssl? ? 'https' : 'http'
59
+ @storage_host = self.host
60
+ @storage_port = self.port
61
+ @api_path = self.api_path
62
+ end
63
+ end
64
+
65
+ class Mock
66
+ include Utils
67
+
68
+ def initialize(options={})
69
+ require 'mime/types'
70
+ setup_credentials(options)
71
+ end
72
+
73
+ def request(options)
74
+ raise "Atmos Storage mocks not implemented"
75
+ end
76
+
77
+ end
78
+
79
+ class Real
80
+ include Utils
81
+
82
+ def initialize(options={})
83
+ require 'mime/types'
84
+
85
+ setup_credentials(options)
86
+ @connection_options = options[:connection_options] || {}
87
+ @hmac = Fog::HMAC.new('sha1', @storage_secret_decoded)
88
+ @persistent = options.fetch(:persistent, false)
89
+
90
+ @connection = Fog::Connection.new("#{@prefix}://#{@storage_host}:#{@storage_port}",
91
+ @persistent, @connection_options)
92
+ end
93
+
94
+ def uid
95
+ @storage_token#.split('/')[-1]
96
+ end
97
+
98
+ def sign(string)
99
+ value = @hmac.sign(string)
100
+ Base64.encode64( value ).chomp()
101
+ end
102
+
103
+ def reload
104
+ @connection.reset
105
+ end
106
+
107
+ def request(params, &block)
108
+ req_path = params[:path]
109
+ # Force set host and port
110
+ params.merge!({
111
+ :host => @storage_host,
112
+ :path => "#{@api_path}/rest/#{params[:path]}",
113
+ })
114
+ # Set default method and headers
115
+ params = {:method => 'GET', :headers => {}}.merge params
116
+
117
+ params[:headers]["Content-Type"] ||= "application/octet-stream"
118
+
119
+ # Add request date
120
+ params[:headers]["date"] = Time.now().httpdate()
121
+ params[:headers]["x-emc-uid"] = @storage_token
122
+
123
+ # Build signature string
124
+ signstring = ""
125
+ signstring += params[:method]
126
+ signstring += "\n"
127
+ signstring += params[:headers]["Content-Type"]
128
+ signstring += "\n"
129
+ if( params[:headers]["range"] )
130
+ signstring += params[:headers]["range"]
131
+ end
132
+ signstring += "\n"
133
+ signstring += params[:headers]["date"]
134
+ signstring += "\n"
135
+
136
+ signstring += "/rest/" + URI.unescape( req_path ).downcase
137
+ query_str = params[:query].map{|k,v| "#{k}=#{v}"}.join('&')
138
+ signstring += '?' + query_str unless query_str.empty?
139
+ signstring += "\n"
140
+
141
+ customheaders = {}
142
+ params[:headers].each { |key,value|
143
+ case key
144
+ when 'x-emc-date', 'x-emc-signature'
145
+ #skip
146
+ when /^x-emc-/
147
+ customheaders[ key.downcase ] = value
148
+ end
149
+ }
150
+ header_arr = customheaders.sort()
151
+
152
+ header_arr.each { |key,value|
153
+ # Values are lowercase and whitespace-normalized
154
+ signstring += key + ":" + value.strip.chomp.squeeze( " " ) + "\n"
155
+ }
156
+
157
+ digest = @hmac.sign(signstring.chomp())
158
+ signature = Base64.encode64( digest ).chomp()
159
+ params[:headers]["x-emc-signature"] = signature
160
+
161
+ begin
162
+ response = @connection.request(params, &block)
163
+ rescue Excon::Errors::HTTPStatusError => error
164
+ raise case error
165
+ when Excon::Errors::NotFound
166
+ Fog::Storage::Atmos::NotFound.slurp(error)
167
+ else
168
+ error
169
+ end
170
+ end
171
+ unless response.body.empty?
172
+ if params[:parse]
173
+ document = Fog::ToHashDocument.new
174
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
175
+ parser << response.body
176
+ parser.finish
177
+ response.body = document.body
178
+ end
179
+ end
180
+ response
181
+ end
182
+
183
+ end
184
+ end
185
+ end
186
+ end
@@ -1,5 +1,6 @@
1
1
  require 'fog/core'
2
2
  require 'fog/aws/credential_fetcher'
3
+ require 'fog/aws/signaturev4'
3
4
  module Fog
4
5
  module AWS
5
6
 
@@ -16,6 +17,7 @@ module Fog
16
17
  service(:elasticache, 'aws/elasticache', 'Elasticache')
17
18
  service(:elb, 'aws/elb', 'ELB')
18
19
  service(:emr, 'aws/emr', 'EMR')
20
+ service(:glacier, 'aws/glacier', 'Glacier')
19
21
  service(:iam, 'aws/iam', 'IAM')
20
22
  service(:rds, 'aws/rds', 'RDS')
21
23
  service(:ses, 'aws/ses', 'SES')
@@ -10,7 +10,7 @@ module Fog
10
10
  class ValidationError < Fog::Errors::Error; end
11
11
 
12
12
  requires :aws_access_key_id, :aws_secret_access_key
13
- recognizes :host, :path, :port, :scheme, :persistent, :region, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at
13
+ recognizes :host, :path, :port, :scheme, :persistent, :region, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :instrumentor, :instrumentor_name
14
14
 
15
15
  request_path 'fog/aws/requests/auto_scaling'
16
16
  request :create_auto_scaling_group
@@ -79,6 +79,10 @@ module Fog
79
79
  setup_credentials(options)
80
80
 
81
81
  @connection_options = options[:connection_options] || {}
82
+
83
+ @instrumentor = options[:instrumentor]
84
+ @instrumentor_name = options[:instrumentor_name] || 'fog.aws.auto_scaling'
85
+
82
86
  options[:region] ||= 'us-east-1'
83
87
  @host = options[:host] || "autoscaling.#{options[:region]}.amazonaws.com"
84
88
  @path = options[:path] || '/'
@@ -113,6 +117,16 @@ module Fog
113
117
  }
114
118
  )
115
119
 
120
+ if @instrumentor
121
+ @instrumentor.instrument("#{@instrumentor_name}.request", params) do
122
+ _request(body, idempotent, parser)
123
+ end
124
+ else
125
+ _request(body, idempotent, parser)
126
+ end
127
+ end
128
+
129
+ def _request(body, idempotent, parser)
116
130
  begin
117
131
  response = @connection.request({
118
132
  :body => body,
@@ -7,7 +7,7 @@ module Fog
7
7
  extend Fog::AWS::CredentialFetcher::ServiceMethods
8
8
 
9
9
  requires :aws_access_key_id, :aws_secret_access_key
10
- recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent, :aws_session_token, :use_iam_profile, :aws_credentials_expire_at
10
+ recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent, :aws_session_token, :use_iam_profile, :aws_credentials_expire_at, :instrumentor, :instrumentor_name, :version
11
11
 
12
12
  secrets :aws_secret_access_key, :hmac, :aws_session_token
13
13
 
@@ -315,6 +315,9 @@ module Fog
315
315
  setup_credentials(options)
316
316
  @connection_options = options[:connection_options] || {}
317
317
  @region = options[:region] ||= 'us-east-1'
318
+ @instrumentor = options[:instrumentor]
319
+ @instrumentor_name = options[:instrumentor_name] || 'fog.aws.compute'
320
+ @version = options[:version] || '2012-07-20'
318
321
 
319
322
  if @endpoint = options[:endpoint]
320
323
  endpoint = URI.parse(@endpoint)
@@ -360,12 +363,21 @@ module Fog
360
363
  :host => @host,
361
364
  :path => @path,
362
365
  :port => @port,
363
- :version => '2012-06-01'
366
+ :version => @version
364
367
  }
365
368
  )
366
369
 
367
- begin
368
- response = @connection.request({
370
+ if @instrumentor
371
+ @instrumentor.instrument("#{@instrumentor_name}.request", params) do
372
+ _request(body, idempotent, parser)
373
+ end
374
+ else
375
+ _request(body, idempotent, parser)
376
+ end
377
+ end
378
+
379
+ def _request(body, idempotent, parser)
380
+ @connection.request({
369
381
  :body => body,
370
382
  :expects => 200,
371
383
  :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
@@ -374,20 +386,17 @@ module Fog
374
386
  :method => 'POST',
375
387
  :parser => parser
376
388
  })
377
- rescue Excon::Errors::HTTPStatusError => error
378
- if match = error.message.match(/<Code>(.*)<\/Code><Message>(.*)<\/Message>/)
379
- raise case match[1].split('.').last
380
- when 'NotFound', 'Unknown'
381
- Fog::Compute::AWS::NotFound.slurp(error, match[2])
382
- else
383
- Fog::Compute::AWS::Error.slurp(error, "#{match[1]} => #{match[2]}")
384
- end
385
- else
386
- raise error
387
- end
389
+ rescue Excon::Errors::HTTPStatusError => error
390
+ if match = error.message.match(/<Code>(.*)<\/Code><Message>(.*)<\/Message>/)
391
+ raise case match[1].split('.').last
392
+ when 'NotFound', 'Unknown'
393
+ Fog::Compute::AWS::NotFound.slurp(error, match[2])
394
+ else
395
+ Fog::Compute::AWS::Error.slurp(error, "#{match[1]} => #{match[2]}")
396
+ end
397
+ else
398
+ raise error
388
399
  end
389
-
390
- response
391
400
  end
392
401
 
393
402
  end
@@ -16,7 +16,7 @@ module Fog
16
16
  class ValidationError < Fog::Errors::Error; end
17
17
 
18
18
  requires :aws_access_key_id, :aws_secret_access_key
19
- recognizes :region, :host, :path, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at
19
+ recognizes :region, :host, :path, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :instrumentor, :instrumentor_name
20
20
 
21
21
  request_path 'fog/aws/requests/elb'
22
22
  request :configure_health_check
@@ -125,7 +125,9 @@ module Fog
125
125
  @use_iam_profile = options[:use_iam_profile]
126
126
  setup_credentials(options)
127
127
  @connection_options = options[:connection_options] || {}
128
-
128
+ @instrumentor = options[:instrumentor]
129
+ @instrumentor_name = options[:instrumentor_name] || 'fog.aws.elb'
130
+
129
131
  options[:region] ||= 'us-east-1'
130
132
  @host = options[:host] || "elasticloadbalancing.#{options[:region]}.amazonaws.com"
131
133
  @path = options[:path] || '/'
@@ -169,6 +171,16 @@ module Fog
169
171
  }
170
172
  )
171
173
 
174
+ if @instrumentor
175
+ @instrumentor.instrument("#{@instrumentor_name}.request", params) do
176
+ _request(body, idempotent, parser)
177
+ end
178
+ else
179
+ _request(body, idempotent, parser)
180
+ end
181
+ end
182
+
183
+ def _request(body, idempotent, parser)
172
184
  @connection.request({
173
185
  :body => body,
174
186
  :expects => 200,
@@ -0,0 +1,172 @@
1
+ require 'fog/aws'
2
+
3
+ module Fog
4
+ module AWS
5
+ class Glacier < Fog::Service
6
+ extend Fog::AWS::CredentialFetcher::ServiceMethods
7
+
8
+ requires :aws_access_key_id, :aws_secret_access_key
9
+ recognizes :region, :host, :path, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at
10
+
11
+ request_path 'fog/aws/requests/glacier'
12
+
13
+ request :abort_multipart_upload
14
+ request :complete_multipart_upload
15
+ request :create_archive
16
+ request :create_vault
17
+ request :delete_archive
18
+ request :delete_vault
19
+ request :delete_vault_notification_configuration
20
+ request :describe_job
21
+ request :describe_vault
22
+ request :get_job_output
23
+ request :get_vault_notification_configuration
24
+ request :initiate_job
25
+ request :initiate_multipart_upload
26
+ request :list_jobs
27
+ request :list_multipart_uploads
28
+ request :list_parts
29
+ request :list_vaults
30
+ request :set_vault_notification_configuration
31
+ request :upload_part
32
+
33
+ model_path 'fog/aws/models/glacier'
34
+ model :vault
35
+ collection :vaults
36
+
37
+ MEGABYTE = 1024*1024
38
+
39
+ class TreeHash
40
+
41
+ def self.digest(body)
42
+ new.add_part(body)
43
+ end
44
+
45
+ def reduce_digests(digests)
46
+ while digests.length > 1
47
+ digests = digests.each_slice(2).collect do |pair|
48
+ if pair.length == 2
49
+ Digest::SHA256.digest(pair[0]+pair[1])
50
+ else
51
+ pair.first
52
+ end
53
+ end
54
+ end
55
+ digests.first
56
+ end
57
+
58
+ def initialize
59
+ @digests = []
60
+ end
61
+
62
+ def add_part(bytes)
63
+ part = self.digest_for_part(bytes)
64
+ @digests << part
65
+ part.unpack('H*').first
66
+ end
67
+
68
+ def digest_for_part(body)
69
+ chunk_count = [body.bytesize / MEGABYTE + (body.bytesize % MEGABYTE > 0 ? 1 : 0), 1].max
70
+ if body.respond_to? :byteslice
71
+ digests_for_part = chunk_count.times.collect {|chunk_index| Digest::SHA256.digest(body.byteslice(chunk_index * MEGABYTE, MEGABYTE))}
72
+ else
73
+ if body.respond_to? :encoding
74
+ old_encoding = body.encoding
75
+ body.force_encoding('BINARY')
76
+ end
77
+ digests_for_part = chunk_count.times.collect {|chunk_index| Digest::SHA256.digest(body.slice(chunk_index * MEGABYTE, MEGABYTE))}
78
+ if body.respond_to? :encoding
79
+ body.force_encoding(old_encoding)
80
+ end
81
+ end
82
+ reduce_digests(digests_for_part)
83
+ end
84
+
85
+ def hexdigest
86
+ digest.unpack('H*').first
87
+ end
88
+
89
+ def digest
90
+ reduce_digests(@digests)
91
+ end
92
+ end
93
+
94
+ class Mock
95
+
96
+ def initialize(options={})
97
+ Fog::Mock.not_implemented
98
+ end
99
+
100
+ end
101
+
102
+ class Real
103
+ include Fog::AWS::CredentialFetcher::ConnectionMethods
104
+ # Initialize connection to Glacier
105
+ #
106
+ # ==== Notes
107
+ # options parameter must include values for :aws_access_key_id and
108
+ # :aws_secret_access_key in order to create a connection
109
+ #
110
+ # ==== Examples
111
+ # ses = SES.new(
112
+ # :aws_access_key_id => your_aws_access_key_id,
113
+ # :aws_secret_access_key => your_aws_secret_access_key
114
+ # )
115
+ #
116
+ # ==== Parameters
117
+ # * options<~Hash> - config arguments for connection. Defaults to {}.
118
+ # * region<~String> - optional region to use. For instance, 'us-east-1' and etc.
119
+ #
120
+ # ==== Returns
121
+ # * Glacier object with connection to AWS.
122
+ def initialize(options={})
123
+
124
+ @use_iam_profile = options[:use_iam_profile]
125
+ @region = options[:region] || 'us-east-1'
126
+
127
+ setup_credentials(options)
128
+
129
+ @connection_options = options[:connection_options] || {}
130
+ @host = options[:host] || "glacier.#{@region}.amazonaws.com"
131
+ @version = '2012-06-01'
132
+ @path = options[:path] || '/'
133
+ @persistent = options[:persistent] || false
134
+ @port = options[:port] || 443
135
+ @scheme = options[:scheme] || 'https'
136
+
137
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", @persistent, @connection_options)
138
+ end
139
+
140
+
141
+ private
142
+ def setup_credentials(options)
143
+ @aws_access_key_id = options[:aws_access_key_id]
144
+ @aws_secret_access_key = options[:aws_secret_access_key]
145
+ @aws_session_token = options[:aws_session_token]
146
+ @aws_credentials_expire_at = options[:aws_credentials_expire_at]
147
+
148
+ @signer = Fog::AWS::SignatureV4.new( @aws_access_key_id, @aws_secret_access_key,@region,'glacier')
149
+ end
150
+
151
+ def request(params, &block)
152
+ refresh_credentials_if_expired
153
+
154
+ date = Fog::Time.now
155
+ params[:headers]['Date'] = date.to_date_header
156
+ params[:headers]['x-amz-date'] = date.to_iso8601_basic
157
+
158
+ params[:headers]['Host'] = @host
159
+ params[:headers]['x-amz-glacier-version'] = @version
160
+ params[:headers]['x-amz-security-token'] = @aws_session_token if @aws_session_token
161
+ params[:headers]['Authorization'] = @signer.sign params, date
162
+
163
+ response = @connection.request(params, &block)
164
+ if response.headers['Content-Type'] == 'application/json' && response.body.size > 0 #body will be empty if the streaming form has been used
165
+ response.body = Fog::JSON.decode(response.body)
166
+ end
167
+ response
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end