fog-maestrodev 1.19.0.20140212012611 → 1.20.0.20140305101305

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 (513) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +2 -0
  3. data/.travis.yml +10 -0
  4. data/CONTRIBUTORS.md +694 -0
  5. data/Gemfile.1.8.7 +1 -1
  6. data/LICENSE.md +17 -17
  7. data/Rakefile +1 -1
  8. data/benchs/each_provider.sh +6 -0
  9. data/benchs/each_service.sh +6 -0
  10. data/benchs/load_times.rb +6 -0
  11. data/changelog.txt +312 -0
  12. data/fog.gemspec +3 -5
  13. data/lib/fog.rb +1 -0
  14. data/lib/fog/atmos.rb +1 -11
  15. data/lib/fog/atmos/core.rb +11 -0
  16. data/lib/fog/atmos/requests/storage/get_namespace.rb +1 -1
  17. data/lib/fog/atmos/requests/storage/head_namespace.rb +1 -1
  18. data/lib/fog/atmos/storage.rb +1 -1
  19. data/lib/fog/aws.rb +22 -323
  20. data/lib/fog/aws/auto_scaling.rb +1 -1
  21. data/lib/fog/aws/beanstalk.rb +1 -1
  22. data/lib/fog/aws/cdn.rb +1 -1
  23. data/lib/fog/aws/cloud_formation.rb +1 -1
  24. data/lib/fog/aws/cloud_watch.rb +1 -1
  25. data/lib/fog/aws/compute.rb +12 -1
  26. data/lib/fog/aws/core.rb +329 -0
  27. data/lib/fog/aws/data_pipeline.rb +1 -1
  28. data/lib/fog/aws/dns.rb +1 -1
  29. data/lib/fog/aws/dynamodb.rb +1 -1
  30. data/lib/fog/aws/elasticache.rb +10 -3
  31. data/lib/fog/aws/elb.rb +1 -1
  32. data/lib/fog/aws/emr.rb +1 -2
  33. data/lib/fog/aws/glacier.rb +1 -1
  34. data/lib/fog/aws/iam.rb +1 -1
  35. data/lib/fog/aws/models/compute/dhcp_option.rb +2 -2
  36. data/lib/fog/aws/models/compute/flavor.rb +2 -0
  37. data/lib/fog/aws/models/compute/flavors.rb +363 -49
  38. data/lib/fog/aws/models/compute/network_acl.rb +170 -0
  39. data/lib/fog/aws/models/compute/network_acls.rb +138 -0
  40. data/lib/fog/aws/models/compute/server.rb +2 -2
  41. data/lib/fog/aws/models/compute/servers.rb +7 -2
  42. data/lib/fog/aws/models/compute/subnet.rb +2 -2
  43. data/lib/fog/aws/models/elasticache/cluster.rb +6 -0
  44. data/lib/fog/aws/models/elasticache/subnet_group.rb +35 -0
  45. data/lib/fog/aws/models/elasticache/subnet_groups.rb +27 -0
  46. data/lib/fog/aws/models/rds/snapshot.rb +1 -0
  47. data/lib/fog/aws/models/storage/file.rb +1 -1
  48. data/lib/fog/aws/parsers/compute/create_network_acl.rb +28 -0
  49. data/lib/fog/aws/parsers/compute/create_subnet.rb +2 -3
  50. data/lib/fog/aws/parsers/compute/describe_network_acls.rb +42 -0
  51. data/lib/fog/aws/parsers/compute/describe_reserved_instances.rb +29 -3
  52. data/lib/fog/aws/parsers/compute/network_acl_parser.rb +105 -0
  53. data/lib/fog/aws/parsers/compute/network_interface_parser.rb +16 -0
  54. data/lib/fog/aws/parsers/compute/replace_network_acl_association.rb +20 -0
  55. data/lib/fog/aws/parsers/compute/run_instances.rb +1 -1
  56. data/lib/fog/aws/parsers/elasticache/cache_cluster_parser.rb +2 -2
  57. data/lib/fog/aws/parsers/elasticache/create_cache_subnet_group.rb +38 -0
  58. data/lib/fog/aws/parsers/elasticache/describe_cache_subnet_groups.rb +38 -0
  59. data/lib/fog/aws/parsers/elasticache/subnet_group_parser.rb +38 -0
  60. data/lib/fog/aws/parsers/iam/upload_server_certificate.rb +1 -1
  61. data/lib/fog/aws/parsers/rds/db_parser.rb +6 -0
  62. data/lib/fog/aws/parsers/rds/snapshot_parser.rb +1 -0
  63. data/lib/fog/aws/rds.rb +1 -1
  64. data/lib/fog/aws/redshift.rb +1 -1
  65. data/lib/fog/aws/requests/compute/create_network_acl.rb +105 -0
  66. data/lib/fog/aws/requests/compute/create_network_acl_entry.rb +80 -0
  67. data/lib/fog/aws/requests/compute/create_subnet.rb +14 -4
  68. data/lib/fog/aws/requests/compute/create_vpc.rb +7 -1
  69. data/lib/fog/aws/requests/compute/delete_network_acl.rb +52 -0
  70. data/lib/fog/aws/requests/compute/delete_network_acl_entry.rb +55 -0
  71. data/lib/fog/aws/requests/compute/delete_vpc.rb +4 -0
  72. data/lib/fog/aws/requests/compute/describe_network_acls.rb +104 -0
  73. data/lib/fog/aws/requests/compute/describe_network_interfaces.rb +4 -0
  74. data/lib/fog/aws/requests/compute/disassociate_address.rb +4 -3
  75. data/lib/fog/aws/requests/compute/replace_network_acl_association.rb +66 -0
  76. data/lib/fog/aws/requests/compute/replace_network_acl_entry.rb +81 -0
  77. data/lib/fog/aws/requests/compute/replace_route.rb +84 -0
  78. data/lib/fog/aws/requests/compute/request_spot_instances.rb +8 -0
  79. data/lib/fog/aws/requests/compute/run_instances.rb +23 -3
  80. data/lib/fog/aws/requests/data_pipeline/put_pipeline_definition.rb +29 -21
  81. data/lib/fog/aws/requests/elasticache/create_cache_cluster.rb +18 -11
  82. data/lib/fog/aws/requests/elasticache/create_cache_subnet_group.rb +66 -0
  83. data/lib/fog/aws/requests/elasticache/delete_cache_subnet_group.rb +40 -0
  84. data/lib/fog/aws/requests/elasticache/describe_cache_subnet_groups.rb +63 -0
  85. data/lib/fog/aws/requests/elb/create_load_balancer.rb +3 -2
  86. data/lib/fog/aws/requests/iam/delete_server_certificate.rb +3 -1
  87. data/lib/fog/aws/requests/rds/create_db_instance.rb +2 -0
  88. data/lib/fog/aws/requests/rds/create_db_instance_read_replica.rb +1 -0
  89. data/lib/fog/aws/requests/rds/create_db_snapshot.rb +1 -1
  90. data/lib/fog/aws/requests/rds/create_db_subnet_group.rb +2 -0
  91. data/lib/fog/aws/requests/rds/modify_db_instance.rb +1 -0
  92. data/lib/fog/aws/requests/storage/abort_multipart_upload.rb +18 -0
  93. data/lib/fog/aws/requests/storage/complete_multipart_upload.rb +23 -0
  94. data/lib/fog/aws/requests/storage/initiate_multipart_upload.rb +24 -0
  95. data/lib/fog/aws/requests/storage/put_object.rb +18 -54
  96. data/lib/fog/aws/requests/storage/shared_mock_methods.rb +87 -0
  97. data/lib/fog/aws/requests/storage/upload_part.rb +18 -0
  98. data/lib/fog/aws/ses.rb +1 -1
  99. data/lib/fog/aws/simpledb.rb +1 -1
  100. data/lib/fog/aws/sns.rb +1 -2
  101. data/lib/fog/aws/sqs.rb +5 -4
  102. data/lib/fog/aws/storage.rb +15 -5
  103. data/lib/fog/aws/sts.rb +1 -1
  104. data/lib/fog/bare_metal_cloud.rb +1 -11
  105. data/lib/fog/bare_metal_cloud/compute.rb +1 -1
  106. data/lib/fog/bare_metal_cloud/core.rb +11 -0
  107. data/lib/fog/bin.rb +1 -0
  108. data/lib/fog/bin/rage4.rb +31 -0
  109. data/lib/fog/bluebox.rb +3 -13
  110. data/lib/fog/bluebox/blb.rb +2 -2
  111. data/lib/fog/bluebox/compute.rb +1 -1
  112. data/lib/fog/bluebox/core.rb +13 -0
  113. data/lib/fog/bluebox/dns.rb +2 -2
  114. data/lib/fog/bluebox/models/compute/server.rb +1 -1
  115. data/lib/fog/brightbox.rb +1 -10
  116. data/lib/fog/brightbox/compute.rb +20 -1
  117. data/lib/fog/brightbox/core.rb +10 -0
  118. data/lib/fog/brightbox/models/compute/cloud_ip.rb +5 -0
  119. data/lib/fog/brightbox/models/compute/database_server.rb +91 -0
  120. data/lib/fog/brightbox/models/compute/database_servers.rb +28 -0
  121. data/lib/fog/brightbox/models/compute/database_snapshot.rb +52 -0
  122. data/lib/fog/brightbox/models/compute/database_snapshots.rb +24 -0
  123. data/lib/fog/brightbox/models/compute/database_type.rb +19 -0
  124. data/lib/fog/brightbox/models/compute/database_types.rb +26 -0
  125. data/lib/fog/brightbox/requests/compute/create_database_server.rb +25 -0
  126. data/lib/fog/brightbox/requests/compute/delete_database_server.rb +26 -0
  127. data/lib/fog/brightbox/requests/compute/delete_database_snapshot.rb +26 -0
  128. data/lib/fog/brightbox/requests/compute/get_database_server.rb +19 -0
  129. data/lib/fog/brightbox/requests/compute/get_database_snapshot.rb +19 -0
  130. data/lib/fog/brightbox/requests/compute/get_database_type.rb +21 -0
  131. data/lib/fog/brightbox/requests/compute/list_database_servers.rb +17 -0
  132. data/lib/fog/brightbox/requests/compute/list_database_snapshots.rb +17 -0
  133. data/lib/fog/brightbox/requests/compute/list_database_types.rb +19 -0
  134. data/lib/fog/brightbox/requests/compute/reset_password_database_server.rb +19 -0
  135. data/lib/fog/brightbox/requests/compute/snapshot_database_server.rb +19 -0
  136. data/lib/fog/brightbox/requests/compute/update_database_server.rb +25 -0
  137. data/lib/fog/brightbox/requests/compute/update_database_snapshot.rb +26 -0
  138. data/lib/fog/clodo.rb +1 -34
  139. data/lib/fog/clodo/compute.rb +2 -0
  140. data/lib/fog/clodo/core.rb +34 -0
  141. data/lib/fog/clodo/models/compute/server.rb +2 -2
  142. data/lib/fog/cloudsigma.rb +1 -9
  143. data/lib/fog/cloudsigma/compute.rb +2 -2
  144. data/lib/fog/cloudsigma/core.rb +9 -0
  145. data/lib/fog/cloudstack.rb +1 -40
  146. data/lib/fog/cloudstack/compute.rb +1 -1
  147. data/lib/fog/cloudstack/core.rb +40 -0
  148. data/lib/fog/cloudstack/models/compute/server.rb +3 -0
  149. data/lib/fog/compute/models/server.rb +33 -7
  150. data/lib/fog/core/collection.rb +1 -3
  151. data/lib/fog/core/errors.rb +2 -0
  152. data/lib/fog/core/hmac.rb +3 -16
  153. data/lib/fog/core/logger.rb +3 -3
  154. data/lib/fog/core/provider.rb +1 -2
  155. data/lib/fog/digitalocean.rb +1 -9
  156. data/lib/fog/digitalocean/compute.rb +1 -1
  157. data/lib/fog/digitalocean/core.rb +9 -0
  158. data/lib/fog/digitalocean/models/compute/server.rb +3 -2
  159. data/lib/fog/digitalocean/models/compute/servers.rb +23 -4
  160. data/lib/fog/digitalocean/requests/compute/create_server.rb +2 -1
  161. data/lib/fog/digitalocean/requests/compute/destroy_server.rb +3 -1
  162. data/lib/fog/dnsimple.rb +1 -11
  163. data/lib/fog/dnsimple/core.rb +11 -0
  164. data/lib/fog/dnsimple/dns.rb +5 -2
  165. data/lib/fog/dnsimple/models/dns/record.rb +3 -3
  166. data/lib/fog/dnsimple/requests/dns/create_domain.rb +26 -22
  167. data/lib/fog/dnsimple/requests/dns/create_record.rb +21 -24
  168. data/lib/fog/dnsimple/requests/dns/delete_domain.rb +7 -6
  169. data/lib/fog/dnsimple/requests/dns/delete_record.rb +7 -5
  170. data/lib/fog/dnsimple/requests/dns/get_domain.rb +12 -18
  171. data/lib/fog/dnsimple/requests/dns/get_record.rb +11 -17
  172. data/lib/fog/dnsimple/requests/dns/list_domains.rb +7 -15
  173. data/lib/fog/dnsimple/requests/dns/list_records.rb +10 -15
  174. data/lib/fog/dnsimple/requests/dns/update_record.rb +14 -19
  175. data/lib/fog/dnsmadeeasy.rb +1 -11
  176. data/lib/fog/dnsmadeeasy/core.rb +11 -0
  177. data/lib/fog/dnsmadeeasy/dns.rb +1 -1
  178. data/lib/fog/dreamhost.rb +1 -11
  179. data/lib/fog/dreamhost/core.rb +11 -0
  180. data/lib/fog/dreamhost/dns.rb +1 -1
  181. data/lib/fog/dynect.rb +1 -26
  182. data/lib/fog/dynect/core.rb +26 -0
  183. data/lib/fog/dynect/dns.rb +1 -1
  184. data/lib/fog/dynect/requests/dns/put_record.rb +5 -4
  185. data/lib/fog/dynect/requests/dns/put_zone.rb +5 -4
  186. data/lib/fog/ecloud.rb +1 -31
  187. data/lib/fog/ecloud/compute.rb +1 -0
  188. data/lib/fog/ecloud/core.rb +31 -0
  189. data/lib/fog/glesys.rb +1 -11
  190. data/lib/fog/glesys/compute.rb +6 -4
  191. data/lib/fog/glesys/core.rb +11 -0
  192. data/lib/fog/glesys/models/compute/server.rb +2 -2
  193. data/lib/fog/go_grid.rb +1 -11
  194. data/lib/fog/go_grid/compute.rb +1 -1
  195. data/lib/fog/go_grid/core.rb +11 -0
  196. data/lib/fog/go_grid/models/compute/server.rb +2 -2
  197. data/lib/fog/google.rb +2 -24
  198. data/lib/fog/google/README.md +8 -5
  199. data/lib/fog/google/compute.rb +10 -3
  200. data/lib/fog/google/core.rb +24 -0
  201. data/lib/fog/google/models/compute/flavors.rb +1 -1
  202. data/lib/fog/google/models/compute/images.rb +2 -0
  203. data/lib/fog/google/models/compute/servers.rb +1 -1
  204. data/lib/fog/google/models/compute/zones.rb +1 -1
  205. data/lib/fog/google/requests/compute/attach_disk.rb +29 -0
  206. data/lib/fog/google/requests/compute/delete_address.rb +31 -0
  207. data/lib/fog/google/requests/compute/delete_snapshot.rb +35 -0
  208. data/lib/fog/google/requests/compute/detach_disk.rb +29 -0
  209. data/lib/fog/google/requests/compute/get_address.rb +31 -0
  210. data/lib/fog/google/requests/compute/insert_address.rb +30 -0
  211. data/lib/fog/google/requests/compute/insert_firewall.rb +6 -9
  212. data/lib/fog/google/requests/compute/list_addresses.rb +28 -0
  213. data/lib/fog/google/requests/compute/set_metadata.rb +4 -5
  214. data/lib/fog/google/requests/compute/set_tags.rb +33 -0
  215. data/lib/fog/google/requests/storage/get_bucket_acl.rb +2 -2
  216. data/lib/fog/google/requests/storage/put_bucket_acl.rb +39 -48
  217. data/lib/fog/google/requests/storage/put_object_acl.rb +55 -0
  218. data/lib/fog/google/storage.rb +2 -1
  219. data/lib/fog/hp.rb +9 -352
  220. data/lib/fog/hp/block_storage.rb +1 -1
  221. data/lib/fog/hp/block_storage_v2.rb +1 -1
  222. data/lib/fog/hp/cdn.rb +1 -1
  223. data/lib/fog/hp/compute.rb +1 -1
  224. data/lib/fog/hp/compute_v2.rb +1 -1
  225. data/lib/fog/hp/core.rb +352 -0
  226. data/lib/fog/hp/dns.rb +1 -1
  227. data/lib/fog/hp/lb.rb +1 -1
  228. data/lib/fog/hp/models/compute/server.rb +2 -2
  229. data/lib/fog/hp/models/compute_v2/server.rb +2 -2
  230. data/lib/fog/hp/models/storage/directory.rb +12 -6
  231. data/lib/fog/hp/network.rb +1 -1
  232. data/lib/fog/hp/storage.rb +1 -1
  233. data/lib/fog/ibm.rb +2 -176
  234. data/lib/fog/ibm/compute.rb +1 -1
  235. data/lib/fog/ibm/core.rb +176 -0
  236. data/lib/fog/ibm/storage.rb +1 -1
  237. data/lib/fog/internet_archive.rb +1 -292
  238. data/lib/fog/internet_archive/core.rb +292 -0
  239. data/lib/fog/internet_archive/models/storage/file.rb +1 -1
  240. data/lib/fog/internet_archive/storage.rb +1 -1
  241. data/lib/fog/joyent.rb +2 -10
  242. data/lib/fog/joyent/compute.rb +1 -1
  243. data/lib/fog/joyent/core.rb +10 -0
  244. data/lib/fog/joyent/errors.rb +1 -0
  245. data/lib/fog/libvirt.rb +1 -11
  246. data/lib/fog/libvirt/compute.rb +1 -1
  247. data/lib/fog/libvirt/core.rb +11 -0
  248. data/lib/fog/libvirt/models/compute/README.md +1 -1
  249. data/lib/fog/libvirt/models/compute/server.rb +6 -6
  250. data/lib/fog/libvirt/models/compute/templates/volume.xml.erb +12 -0
  251. data/lib/fog/libvirt/models/compute/volume.rb +1 -0
  252. data/lib/fog/linode.rb +2 -10
  253. data/lib/fog/linode/compute.rb +1 -1
  254. data/lib/fog/linode/core.rb +10 -0
  255. data/lib/fog/linode/dns.rb +1 -1
  256. data/lib/fog/local.rb +1 -11
  257. data/lib/fog/local/core.rb +11 -0
  258. data/lib/fog/local/storage.rb +1 -1
  259. data/lib/fog/ninefold.rb +1 -12
  260. data/lib/fog/ninefold/compute.rb +1 -1
  261. data/lib/fog/ninefold/core.rb +12 -0
  262. data/lib/fog/openstack.rb +8 -249
  263. data/lib/fog/openstack/compute.rb +3 -1
  264. data/lib/fog/openstack/core.rb +249 -0
  265. data/lib/fog/openstack/docs/compute.md +681 -0
  266. data/lib/fog/openstack/docs/getting_started.md +81 -0
  267. data/lib/fog/openstack/docs/storage.md +441 -0
  268. data/lib/fog/openstack/identity.rb +1 -1
  269. data/lib/fog/openstack/image.rb +1 -1
  270. data/lib/fog/openstack/metering.rb +1 -1
  271. data/lib/fog/openstack/models/compute/server.rb +13 -5
  272. data/lib/fog/openstack/models/compute/servers.rb +13 -0
  273. data/lib/fog/openstack/models/network/network.rb +9 -11
  274. data/lib/fog/openstack/models/network/security_group.rb +32 -0
  275. data/lib/fog/openstack/models/network/security_group_rule.rb +33 -0
  276. data/lib/fog/openstack/models/network/security_group_rules.rb +33 -0
  277. data/lib/fog/openstack/models/network/security_groups.rb +34 -0
  278. data/lib/fog/openstack/models/storage/directories.rb +1 -0
  279. data/lib/fog/openstack/network.rb +19 -1
  280. data/lib/fog/openstack/orchestration.rb +1 -1
  281. data/lib/fog/openstack/requests/compute/add_security_group.rb +24 -0
  282. data/lib/fog/openstack/requests/compute/create_flavor.rb +1 -1
  283. data/lib/fog/openstack/requests/compute/create_server.rb +3 -3
  284. data/lib/fog/openstack/requests/compute/remove_security_group.rb +24 -0
  285. data/lib/fog/openstack/requests/image/update_image_members.rb +2 -2
  286. data/lib/fog/openstack/requests/network/create_security_group.rb +94 -0
  287. data/lib/fog/openstack/requests/network/create_security_group_rule.rb +79 -0
  288. data/lib/fog/openstack/requests/network/delete_security_group.rb +32 -0
  289. data/lib/fog/openstack/requests/network/delete_security_group_rule.rb +36 -0
  290. data/lib/fog/openstack/requests/network/get_security_group.rb +52 -0
  291. data/lib/fog/openstack/requests/network/get_security_group_rule.rb +47 -0
  292. data/lib/fog/openstack/requests/network/list_networks.rb +0 -1
  293. data/lib/fog/openstack/requests/network/list_security_group_rules.rb +52 -0
  294. data/lib/fog/openstack/requests/network/list_security_groups.rb +57 -0
  295. data/lib/fog/openstack/storage.rb +2 -2
  296. data/lib/fog/openstack/volume.rb +1 -1
  297. data/lib/fog/openvz.rb +1 -9
  298. data/lib/fog/openvz/compute.rb +1 -1
  299. data/lib/fog/openvz/core.rb +9 -0
  300. data/lib/fog/ovirt.rb +1 -17
  301. data/lib/fog/ovirt/compute.rb +2 -0
  302. data/lib/fog/ovirt/core.rb +17 -0
  303. data/lib/fog/rackspace.rb +12 -145
  304. data/lib/fog/rackspace/auto_scale.rb +1 -1
  305. data/lib/fog/rackspace/block_storage.rb +5 -1
  306. data/lib/fog/rackspace/cdn.rb +22 -16
  307. data/lib/fog/rackspace/compute.rb +1 -1
  308. data/lib/fog/rackspace/compute_v2.rb +6 -2
  309. data/lib/fog/rackspace/core.rb +145 -0
  310. data/lib/fog/rackspace/databases.rb +5 -1
  311. data/lib/fog/rackspace/dns.rb +1 -1
  312. data/lib/fog/rackspace/docs/compute_v2.md +2 -10
  313. data/lib/fog/rackspace/errors.rb +1 -1
  314. data/lib/fog/rackspace/examples/storage/upload_file.rb +1 -1
  315. data/lib/fog/rackspace/identity.rb +26 -16
  316. data/lib/fog/rackspace/load_balancers.rb +7 -1
  317. data/lib/fog/rackspace/mock_data.rb +17 -0
  318. data/lib/fog/rackspace/models/compute/server.rb +2 -2
  319. data/lib/fog/rackspace/models/compute_v2/key_pair.rb +1 -1
  320. data/lib/fog/rackspace/models/compute_v2/server.rb +42 -5
  321. data/lib/fog/rackspace/models/monitoring/entities.rb +1 -1
  322. data/lib/fog/rackspace/models/queues/claim.rb +9 -1
  323. data/lib/fog/rackspace/models/storage/directory.rb +5 -2
  324. data/lib/fog/rackspace/models/storage/file.rb +14 -0
  325. data/lib/fog/rackspace/monitoring.rb +11 -2
  326. data/lib/fog/rackspace/queues.rb +318 -34
  327. data/lib/fog/rackspace/requests/compute_v2/create_keypair.rb +16 -5
  328. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +7 -1
  329. data/lib/fog/rackspace/requests/compute_v2/delete_keypair.rb +1 -1
  330. data/lib/fog/rackspace/requests/identity/create_token.rb +192 -0
  331. data/lib/fog/rackspace/requests/identity/list_tenants.rb +23 -0
  332. data/lib/fog/rackspace/requests/monitoring/get_agent.rb +45 -0
  333. data/lib/fog/rackspace/requests/monitoring/get_cpus_info.rb +63 -0
  334. data/lib/fog/rackspace/requests/monitoring/get_disks_info.rb +56 -0
  335. data/lib/fog/rackspace/requests/monitoring/get_filesystems_info.rb +64 -0
  336. data/lib/fog/rackspace/requests/monitoring/get_logged_in_user_info.rb +58 -0
  337. data/lib/fog/rackspace/requests/monitoring/get_memory_info.rb +59 -0
  338. data/lib/fog/rackspace/requests/monitoring/get_network_interfaces_info.rb +91 -0
  339. data/lib/fog/rackspace/requests/monitoring/get_processes_info.rb +72 -0
  340. data/lib/fog/rackspace/requests/monitoring/get_system_info.rb +53 -0
  341. data/lib/fog/rackspace/requests/monitoring/list_agents.rb +62 -0
  342. data/lib/fog/rackspace/requests/queues/create_claim.rb +37 -0
  343. data/lib/fog/rackspace/requests/queues/create_message.rb +23 -0
  344. data/lib/fog/rackspace/requests/queues/create_queue.rb +15 -1
  345. data/lib/fog/rackspace/requests/queues/delete_claim.rb +18 -0
  346. data/lib/fog/rackspace/requests/queues/delete_message.rb +34 -0
  347. data/lib/fog/rackspace/requests/queues/delete_queue.rb +12 -0
  348. data/lib/fog/rackspace/requests/queues/get_claim.rb +15 -0
  349. data/lib/fog/rackspace/requests/queues/get_message.rb +17 -0
  350. data/lib/fog/rackspace/requests/queues/get_queue.rb +14 -1
  351. data/lib/fog/rackspace/requests/queues/get_queue_stats.rb +36 -0
  352. data/lib/fog/rackspace/requests/queues/list_messages.rb +33 -0
  353. data/lib/fog/rackspace/requests/queues/list_queues.rb +35 -1
  354. data/lib/fog/rackspace/requests/queues/update_claim.rb +17 -0
  355. data/lib/fog/rackspace/requests/storage/delete_container.rb +15 -0
  356. data/lib/fog/rackspace/requests/storage/delete_multiple_objects.rb +57 -0
  357. data/lib/fog/rackspace/requests/storage/delete_object.rb +14 -0
  358. data/lib/fog/rackspace/requests/storage/delete_static_large_object.rb +33 -0
  359. data/lib/fog/rackspace/requests/storage/extract_archive.rb +39 -0
  360. data/lib/fog/rackspace/requests/storage/get_container.rb +25 -0
  361. data/lib/fog/rackspace/requests/storage/get_containers.rb +17 -0
  362. data/lib/fog/rackspace/requests/storage/get_object.rb +26 -0
  363. data/lib/fog/rackspace/requests/storage/get_object_http_url.rb +9 -2
  364. data/lib/fog/rackspace/requests/storage/get_object_https_url.rb +8 -1
  365. data/lib/fog/rackspace/requests/storage/head_container.rb +12 -0
  366. data/lib/fog/rackspace/requests/storage/head_containers.rb +19 -0
  367. data/lib/fog/rackspace/requests/storage/head_object.rb +26 -0
  368. data/lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb +10 -0
  369. data/lib/fog/rackspace/requests/storage/put_container.rb +16 -0
  370. data/lib/fog/rackspace/requests/storage/put_dynamic_obj_manifest.rb +23 -0
  371. data/lib/fog/rackspace/requests/storage/put_object.rb +39 -0
  372. data/lib/fog/rackspace/requests/storage/put_object_manifest.rb +9 -1
  373. data/lib/fog/rackspace/requests/storage/put_static_obj_manifest.rb +48 -0
  374. data/lib/fog/rackspace/storage.rb +320 -67
  375. data/lib/fog/rage4.rb +2 -0
  376. data/lib/fog/rage4/core.rb +11 -0
  377. data/lib/fog/rage4/dns.rb +74 -0
  378. data/lib/fog/rage4/models/dns/record.rb +77 -0
  379. data/lib/fog/rage4/models/dns/records.rb +42 -0
  380. data/lib/fog/rage4/models/dns/zone.rb +46 -0
  381. data/lib/fog/rage4/models/dns/zones.rb +34 -0
  382. data/lib/fog/rage4/requests/dns/create_domain.rb +33 -0
  383. data/lib/fog/rage4/requests/dns/create_domain_vanity.rb +34 -0
  384. data/lib/fog/rage4/requests/dns/create_record.rb +65 -0
  385. data/lib/fog/rage4/requests/dns/create_reverse_domain_4.rb +32 -0
  386. data/lib/fog/rage4/requests/dns/delete_domain.rb +28 -0
  387. data/lib/fog/rage4/requests/dns/delete_record.rb +28 -0
  388. data/lib/fog/rage4/requests/dns/get_domain.rb +30 -0
  389. data/lib/fog/rage4/requests/dns/get_domain_by_name.rb +30 -0
  390. data/lib/fog/rage4/requests/dns/list_domains.rb +41 -0
  391. data/lib/fog/rage4/requests/dns/list_geo_regions.rb +27 -0
  392. data/lib/fog/rage4/requests/dns/list_record_types.rb +26 -0
  393. data/lib/fog/rage4/requests/dns/list_records.rb +31 -0
  394. data/lib/fog/rage4/requests/dns/set_record_failover.rb +29 -0
  395. data/lib/fog/rage4/requests/dns/show_current_usage.rb +25 -0
  396. data/lib/fog/rage4/requests/dns/show_global_usage.rb +25 -0
  397. data/lib/fog/rage4/requests/dns/update_domain.rb +43 -0
  398. data/lib/fog/rage4/requests/dns/update_record.rb +64 -0
  399. data/lib/fog/riakcs.rb +2 -122
  400. data/lib/fog/riakcs/core.rb +122 -0
  401. data/lib/fog/riakcs/provisioning.rb +1 -1
  402. data/lib/fog/riakcs/usage.rb +1 -1
  403. data/lib/fog/serverlove.rb +1 -10
  404. data/lib/fog/serverlove/compute.rb +2 -0
  405. data/lib/fog/serverlove/core.rb +10 -0
  406. data/lib/fog/storm_on_demand.rb +9 -20
  407. data/lib/fog/storm_on_demand/account.rb +1 -1
  408. data/lib/fog/storm_on_demand/billing.rb +1 -1
  409. data/lib/fog/storm_on_demand/compute.rb +1 -1
  410. data/lib/fog/storm_on_demand/core.rb +20 -0
  411. data/lib/fog/storm_on_demand/dns.rb +1 -1
  412. data/lib/fog/storm_on_demand/monitoring.rb +1 -1
  413. data/lib/fog/storm_on_demand/network.rb +1 -1
  414. data/lib/fog/storm_on_demand/shared.rb +0 -1
  415. data/lib/fog/storm_on_demand/storage.rb +1 -1
  416. data/lib/fog/storm_on_demand/support.rb +1 -1
  417. data/lib/fog/storm_on_demand/vpn.rb +1 -1
  418. data/lib/fog/vcloud.rb +1 -11
  419. data/lib/fog/vcloud/compute.rb +1 -1
  420. data/lib/fog/vcloud/core.rb +11 -0
  421. data/lib/fog/vcloud_director.rb +1 -67
  422. data/lib/fog/vcloud_director/compute.rb +1 -1
  423. data/lib/fog/vcloud_director/core.rb +67 -0
  424. data/lib/fog/vcloud_director/generators/compute/edge_gateway_service_configuration.rb +1 -1
  425. data/lib/fog/version.rb +1 -1
  426. data/lib/fog/vmfusion.rb +1 -11
  427. data/lib/fog/vmfusion/compute.rb +1 -1
  428. data/lib/fog/vmfusion/core.rb +11 -0
  429. data/lib/fog/vmfusion/models/compute/server.rb +5 -5
  430. data/lib/fog/voxel.rb +1 -16
  431. data/lib/fog/voxel/compute.rb +1 -1
  432. data/lib/fog/voxel/core.rb +16 -0
  433. data/lib/fog/vsphere.rb +1 -17
  434. data/lib/fog/vsphere/compute.rb +1 -0
  435. data/lib/fog/vsphere/core.rb +17 -0
  436. data/lib/fog/xenserver.rb +1 -83
  437. data/lib/fog/xenserver/compute.rb +1 -1
  438. data/lib/fog/xenserver/core.rb +83 -0
  439. data/lib/fog/xenserver/models/compute/storage_manager.rb +1 -1
  440. data/lib/fog/zerigo.rb +1 -11
  441. data/lib/fog/zerigo/core.rb +11 -0
  442. data/lib/fog/zerigo/dns.rb +1 -1
  443. data/lib/tasks/changelog_task.rb +2 -0
  444. data/tests/aws/models/compute/network_acl_tests.rb +109 -0
  445. data/tests/aws/models/compute/network_acls_tests.rb +7 -0
  446. data/tests/aws/models/elasticache/subnet_groups_tests.rb +44 -0
  447. data/tests/aws/requests/compute/network_acl_tests.rb +86 -0
  448. data/tests/aws/requests/compute/route_tests.rb +64 -3
  449. data/tests/aws/requests/compute/subnet_tests.rb +18 -11
  450. data/tests/aws/requests/elasticache/helper.rb +19 -0
  451. data/tests/aws/requests/elasticache/subnet_group_tests.rb +52 -0
  452. data/tests/aws/requests/iam/server_certificate_tests.rb +3 -0
  453. data/tests/aws/requests/rds/subnet_groups_tests.rb +1 -1
  454. data/tests/aws/requests/storage/multipart_upload_tests.rb +3 -14
  455. data/tests/brightbox/compute/schema.rb +118 -2
  456. data/tests/brightbox/helper.rb +1 -0
  457. data/tests/brightbox/models/compute/cloud_ip_tests.rb +32 -0
  458. data/tests/brightbox/models/compute/database_server_tests.rb +66 -0
  459. data/tests/brightbox/models/compute/database_snapshot_tests.rb +26 -0
  460. data/tests/brightbox/models/compute/database_type_tests.rb +27 -0
  461. data/tests/brightbox/requests/compute/database_server_tests.rb +54 -0
  462. data/tests/brightbox/requests/compute/database_snapsnot_tests.rb +47 -0
  463. data/tests/brightbox/requests/compute/database_type_tests.rb +17 -0
  464. data/tests/compute/models/server_tests.rb +20 -2
  465. data/tests/digitalocean/helper.rb +9 -4
  466. data/tests/digitalocean/models/compute/server_tests.rb +1 -0
  467. data/tests/digitalocean/models/compute/servers_tests.rb +19 -4
  468. data/tests/digitalocean/requests/compute/create_server_tests.rb +13 -6
  469. data/tests/digitalocean/requests/compute/list_servers_tests.rb +2 -1
  470. data/tests/dns/helper.rb +3 -0
  471. data/tests/dns/models/record_tests.rb +1 -1
  472. data/tests/dns/models/records_tests.rb +1 -1
  473. data/tests/dns/models/zone_tests.rb +1 -1
  474. data/tests/dns/models/zones_tests.rb +1 -1
  475. data/tests/helper.rb +7 -1
  476. data/tests/helpers/compute/server_helper.rb +1 -0
  477. data/tests/helpers/compute/servers_helper.rb +1 -0
  478. data/tests/openstack/models/network/security_group_rule_tests.rb +27 -0
  479. data/tests/openstack/models/network/security_group_rules_tests.rb +25 -0
  480. data/tests/openstack/models/network/security_group_tests.rb +17 -0
  481. data/tests/openstack/models/network/security_groups_tests.rb +16 -0
  482. data/tests/openstack/requests/compute/helper.rb +5 -0
  483. data/tests/openstack/requests/compute/server_tests.rb +11 -0
  484. data/tests/openstack/requests/network/security_group_rule_tests.rb +58 -0
  485. data/tests/openstack/requests/network/security_group_tests.rb +43 -0
  486. data/tests/rackspace/identity_tests.rb +0 -4
  487. data/tests/rackspace/models/compute_v2/server_tests.rb +36 -8
  488. data/tests/rackspace/models/queues/claim_tests.rb +1 -3
  489. data/tests/rackspace/models/queues/claims_tests.rb +1 -3
  490. data/tests/rackspace/models/queues/message_tests.rb +1 -3
  491. data/tests/rackspace/models/queues/messages_tests.rb +1 -3
  492. data/tests/rackspace/models/queues/queue_tests.rb +1 -3
  493. data/tests/rackspace/models/queues/queues_tests.rb +1 -3
  494. data/tests/rackspace/models/storage/account_tests.rb +0 -2
  495. data/tests/rackspace/models/storage/directories_tests.rb +0 -3
  496. data/tests/rackspace/models/storage/directory_tests.rb +2 -5
  497. data/tests/rackspace/models/storage/file_tests.rb +49 -2
  498. data/tests/rackspace/models/storage/files_tests.rb +1 -4
  499. data/tests/rackspace/queues_tests.rb +0 -13
  500. data/tests/rackspace/requests/identity/token_tests.rb +1 -3
  501. data/tests/rackspace/requests/monitoring/agent_tests.rb +42 -0
  502. data/tests/rackspace/requests/queues/claim_tests.rb +1 -3
  503. data/tests/rackspace/requests/queues/messages_tests.rb +0 -6
  504. data/tests/rackspace/requests/queues/queues_tests.rb +0 -5
  505. data/tests/rackspace/requests/storage/account_tests.rb +0 -1
  506. data/tests/rackspace/requests/storage/container_tests.rb +7 -11
  507. data/tests/rackspace/requests/storage/large_object_tests.rb +33 -43
  508. data/tests/rackspace/requests/storage/object_tests.rb +2 -27
  509. data/tests/rackspace/storage_tests.rb +9 -15
  510. data/tests/rage4/requests/dns/dns_tests.rb +241 -0
  511. data/tests/vcloud/requests/compute/disk_configure_tests.rb +0 -8
  512. metadata +190 -33
  513. data/lib/fog/brightbox/requests/compute/destroy_user_collaboration.rb +0 -21
@@ -1,6 +1,7 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
+
4
5
  class Real
5
6
 
6
7
  # Get headers for object
@@ -21,6 +22,31 @@ module Fog
21
22
  end
22
23
 
23
24
  end
25
+
26
+ class Mock
27
+ def head_object(container, object)
28
+ c = mock_container! container
29
+ o = c.mock_object! object
30
+
31
+ headers = o.to_headers
32
+
33
+ hashes, length = [], 0
34
+ o.each_part do |part|
35
+ hashes << part.hash
36
+ length += part.bytes_used
37
+ end
38
+
39
+ headers['Etag'] = "\"#{Digest::MD5.hexdigest(hashes.join)}\""
40
+ headers['Content-Length'] = length.to_s
41
+ headers['X-Static-Large-Object'] = "True" if o.static_manifest?
42
+
43
+ response = Excon::Response.new
44
+ response.status = 200
45
+ response.headers = headers
46
+ response
47
+ end
48
+ end
49
+
24
50
  end
25
51
  end
26
52
  end
@@ -35,6 +35,16 @@ module Fog
35
35
 
36
36
  end
37
37
 
38
+ class Mock
39
+ def post_set_meta_temp_url_key(key)
40
+ account_meta['X-Account-Meta-Temp-Url-Key'] = key
41
+
42
+ response = Excon::Response.new
43
+ response.status = 204
44
+ response
45
+ end
46
+ end
47
+
38
48
  end
39
49
  end
40
50
  end
@@ -1,6 +1,7 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
+
4
5
  class Real
5
6
 
6
7
  # Create a new container
@@ -21,6 +22,21 @@ module Fog
21
22
  end
22
23
 
23
24
  end
25
+
26
+ class Mock
27
+ def put_container(name, options={})
28
+ existed = ! mock_container(name).nil?
29
+ container = add_container(name)
30
+ options.keys.each do |k|
31
+ container.meta[k] = options[k].to_s if k =~ /^X-Container-Meta/
32
+ end
33
+
34
+ response = Excon::Response.new
35
+ response.status = existed ? 202 : 201
36
+ response
37
+ end
38
+ end
39
+
24
40
  end
25
41
  end
26
42
  end
@@ -1,6 +1,7 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
+
4
5
  class Real
5
6
 
6
7
  # Create a new dynamic large object manifest
@@ -39,6 +40,28 @@ module Fog
39
40
  end
40
41
 
41
42
  end
43
+
44
+ class Mock
45
+ def put_dynamic_obj_manifest(container, object, options = {})
46
+ path = "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
47
+
48
+ # Escape the X-Object-Manifest header to match.
49
+ explicit_manifest = options['X-Object-Manifest']
50
+ if explicit_manifest
51
+ parts = explicit_manifest.split('/', 2)
52
+ explicit_manifest = parts.map { |p| Fog::Rackspace.escape p }.join('/')
53
+ end
54
+
55
+ c = mock_container! container
56
+ o = c.add_object object, ''
57
+ o.meta['X-Object-Manifest'] = explicit_manifest || path
58
+
59
+ response = Excon::Response.new
60
+ response.status = 201
61
+ response
62
+ end
63
+ end
64
+
42
65
  end
43
66
  end
44
67
  end
@@ -1,6 +1,7 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
+
4
5
  class Real
5
6
 
6
7
  # Create a new object
@@ -36,6 +37,44 @@ module Fog
36
37
  request(params)
37
38
  end
38
39
  end
40
+
41
+ class Mock
42
+ HeaderOptions = %w{
43
+ Content-Type Access-Control-Allow-Origin Origin Content-Disposition
44
+ Etag Content-Encoding
45
+ }.freeze
46
+
47
+ def put_object(container, object, data, options = {}, &block)
48
+ c = mock_container! container
49
+
50
+ if block_given?
51
+ data = ""
52
+ loop do
53
+ chunk = yield
54
+ break if chunk.empty?
55
+ data << chunk
56
+ end
57
+ end
58
+
59
+ o = c.add_object object, data
60
+ options.keys.each do |k|
61
+ o.meta[k] = options[k].to_s if k =~ /^X-Object-Meta/
62
+ o.meta[k] = options[k] if HeaderOptions.include? k
63
+ end
64
+
65
+ # Validate the provided Etag
66
+ etag = o.meta['Etag']
67
+ if etag && etag != o.hash
68
+ c.remove_object object
69
+ raise Fog::Storage::Rackspace::ServiceError.new
70
+ end
71
+
72
+ response = Excon::Response.new
73
+ response.status = 201
74
+ response
75
+ end
76
+ end
77
+
39
78
  end
40
79
  end
41
80
  end
@@ -1,16 +1,24 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
- class Real
5
4
 
5
+ module Common
6
6
  # Create a new dynamic large object manifest
7
7
  #
8
8
  # This is an alias for {#put_dynamic_obj_manifest} for backward compatibility.
9
9
  def put_object_manifest(container, object, options = {})
10
10
  put_dynamic_obj_manifest(container, object, options)
11
11
  end
12
+ end
13
+
14
+ class Real
15
+ include Common
16
+ end
12
17
 
18
+ class Mock
19
+ include Common
13
20
  end
21
+
14
22
  end
15
23
  end
16
24
  end
@@ -1,6 +1,7 @@
1
1
  module Fog
2
2
  module Storage
3
3
  class Rackspace
4
+
4
5
  class Real
5
6
 
6
7
  # Create a new static large object manifest.
@@ -53,6 +54,53 @@ module Fog
53
54
  end
54
55
 
55
56
  end
57
+
58
+ class Mock
59
+ def put_static_obj_manifest(container, object, segments, options = {})
60
+ c = mock_container! container
61
+
62
+ # Verify paths.
63
+ errors = []
64
+ segments.each do |segment|
65
+ cname, oname = segment[:path].split('/', 2)
66
+ target_container = mock_container(cname)
67
+
68
+ raise Fog::Storage::Rackspace::NotFound.new unless target_container
69
+
70
+ target_object = target_container.mock_object oname
71
+ unless target_object
72
+ errors << [segment[:path], '404 Not Found']
73
+ next
74
+ end
75
+
76
+ unless target_object.hash == segment[:etag]
77
+ errors << [segment[:path], 'Etag Mismatch']
78
+ end
79
+
80
+ unless target_object.bytes_used == segment[:size_bytes]
81
+ errors << [segment[:path], 'Size Mismatch']
82
+ end
83
+ end
84
+
85
+ unless errors.empty?
86
+ response = Excon::Response.new
87
+ response.status = 400
88
+ response.body = Fog::JSON.encode({ 'Errors' => errors })
89
+
90
+ error = Excon::Errors.status_error({}, response)
91
+ raise Fog::Storage::Rackspace::BadRequest.slurp(error)
92
+ end
93
+
94
+ data = Fog::JSON.encode(segments)
95
+ o = c.add_object object, data
96
+ o.static_manifest = true
97
+
98
+ response = Excon::Response.new
99
+ response.status = 201
100
+ response
101
+ end
102
+ end
103
+
56
104
  end
57
105
  end
58
106
  end
@@ -1,4 +1,4 @@
1
- require 'fog/rackspace'
1
+ require 'fog/rackspace/core'
2
2
  require 'fog/storage'
3
3
 
4
4
  module Fog
@@ -41,8 +41,23 @@ module Fog
41
41
  request :put_dynamic_obj_manifest
42
42
  request :put_static_obj_manifest
43
43
  request :post_set_meta_temp_url_key
44
+ request :extract_archive
44
45
 
45
- module Utils
46
+ module Common
47
+ def apply_options(options)
48
+ @rackspace_api_key = options[:rackspace_api_key]
49
+ @rackspace_username = options[:rackspace_username]
50
+ @rackspace_cdn_ssl = options[:rackspace_cdn_ssl]
51
+ @rackspace_auth_url = options[:rackspace_auth_url]
52
+ @rackspace_servicenet = options[:rackspace_servicenet]
53
+ @rackspace_auth_token = options[:rackspace_auth_token]
54
+ @rackspace_storage_url = options[:rackspace_storage_url]
55
+ @rackspace_cdn_url = options[:rackspace_cdn_url]
56
+ @rackspace_region = options[:rackspace_region] || :dfw
57
+ @rackspace_temp_url_key = options[:rackspace_temp_url_key]
58
+ @rackspace_must_reauthenticate = false
59
+ @connection_options = options[:connection_options] || {}
60
+ end
46
61
 
47
62
  def cdn
48
63
  @cdn ||= Fog::CDN.new(
@@ -59,10 +74,249 @@ module Fog
59
74
  end
60
75
  end
61
76
 
77
+ def service_net?
78
+ @rackspace_servicenet == true
79
+ end
80
+
81
+ def authenticate
82
+ if @rackspace_must_reauthenticate || @rackspace_auth_token.nil?
83
+ options = {
84
+ :rackspace_api_key => @rackspace_api_key,
85
+ :rackspace_username => @rackspace_username,
86
+ :rackspace_auth_url => @rackspace_auth_url,
87
+ :connection_options => @connection_options
88
+ }
89
+ super(options)
90
+ else
91
+ @auth_token = @rackspace_auth_token
92
+ @uri = URI.parse(@rackspace_storage_url)
93
+ end
94
+ end
95
+
96
+ def service_name
97
+ :cloudFiles
98
+ end
99
+
100
+ def request_id_header
101
+ "X-Trans-Id"
102
+ end
103
+
104
+ def region
105
+ @rackspace_region
106
+ end
107
+
108
+ def endpoint_uri(service_endpoint_url=nil)
109
+ return @uri if @uri
110
+ super(@rackspace_storage_url || service_endpoint_url, :rackspace_storage_url)
111
+ end
112
+
113
+ # Return Account Details
114
+ # @return [Fog::Storage::Rackspace::Account] account details object
115
+ def account
116
+ account = Fog::Storage::Rackspace::Account.new(:service => self)
117
+ account.reload
118
+ end
62
119
  end
63
120
 
64
121
  class Mock < Fog::Rackspace::Service
65
- include Utils
122
+ include Common
123
+
124
+ # An in-memory container for use with Rackspace storage mocks. Includes
125
+ # many `objects` mapped by (escaped) object name. Tracks container
126
+ # metadata.
127
+ class MockContainer
128
+ attr_reader :objects, :meta, :service
129
+
130
+ # Create a new container. Generally, you should call
131
+ # {Fog::Rackspace::Storage#add_container} instead.
132
+ def initialize(service)
133
+ @service = service
134
+ @objects, @meta = {}, {}
135
+ end
136
+
137
+ # Determine if this container contains any MockObjects or not.
138
+ #
139
+ # @return [Boolean]
140
+ def empty?
141
+ @objects.empty?
142
+ end
143
+
144
+ # Total sizes of all objects added to this container.
145
+ #
146
+ # @return [Integer] The number of bytes occupied by each contained
147
+ # object.
148
+ def bytes_used
149
+ @objects.values.map { |o| o.bytes_used }.inject(0) { |a, b| a + b }
150
+ end
151
+
152
+ # Render the HTTP headers that would be associated with this
153
+ # container.
154
+ #
155
+ # @return [Hash<String, String>] Any metadata supplied to this
156
+ # container, plus additional headers indicating the container's
157
+ # size.
158
+ def to_headers
159
+ @meta.merge({
160
+ 'X-Container-Object-Count' => @objects.size,
161
+ 'X-Container-Bytes-Used' => bytes_used
162
+ })
163
+ end
164
+
165
+ # Access a MockObject within this container by (unescaped) name.
166
+ #
167
+ # @return [MockObject, nil] Return the MockObject at this name if
168
+ # one exists; otherwise, `nil`.
169
+ def mock_object(name)
170
+ @objects[Fog::Rackspace.escape(name)]
171
+ end
172
+
173
+ # Access a MockObject with a specific name, raising a
174
+ # `Fog::Storage::Rackspace::NotFound` exception if none are present.
175
+ #
176
+ # @param name [String] (Unescaped) object name.
177
+ # @return [MockObject] The object within this container with the
178
+ # specified name.
179
+ def mock_object!(name)
180
+ mock_object(name) or raise Fog::Storage::Rackspace::NotFound.new
181
+ end
182
+
183
+ # Add a new MockObject to this container. An existing object with
184
+ # the same name will be overwritten.
185
+ #
186
+ # @param name [String] The object's name, unescaped.
187
+ # @param data [String, #read] The contents of the object.
188
+ def add_object(name, data)
189
+ @objects[Fog::Rackspace.escape(name)] = MockObject.new(data, service)
190
+ end
191
+
192
+ # Remove a MockObject from the container by name. No effect if the
193
+ # object is not present beforehand.
194
+ #
195
+ # @param name [String] The (unescaped) object name to remove.
196
+ def remove_object(name)
197
+ @objects.delete Fog::Rackspace.escape(name)
198
+ end
199
+ end
200
+
201
+ # An in-memory Swift object.
202
+ class MockObject
203
+ attr_reader :hash, :bytes_used, :content_type, :last_modified
204
+ attr_reader :body, :meta, :service
205
+ attr_accessor :static_manifest
206
+
207
+ # Construct a new object. Generally, you should call
208
+ # {MockContainer#add_object} instead of instantiating these directly.
209
+ def initialize(data, service)
210
+ data = Fog::Storage.parse_data(data)
211
+ @service = service
212
+
213
+ @bytes_used = data[:headers]['Content-Length']
214
+ @content_type = data[:headers]['Content-Type']
215
+ if data[:body].respond_to? :read
216
+ @body = data[:body].read
217
+ else
218
+ @body = data[:body]
219
+ end
220
+ @last_modified = Time.now.utc
221
+ @hash = Digest::MD5.hexdigest(@body)
222
+ @meta = {}
223
+ @static_manifest = false
224
+ end
225
+
226
+ # Determine if this object was created as a static large object
227
+ # manifest.
228
+ #
229
+ # @return [Boolean]
230
+ def static_manifest?
231
+ @static_manifest
232
+ end
233
+
234
+ # Determine if this object has the metadata header that marks it as a
235
+ # dynamic large object manifest.
236
+ #
237
+ # @return [Boolean]
238
+ def dynamic_manifest?
239
+ ! large_object_prefix.nil?
240
+ end
241
+
242
+ # Iterate through each MockObject that contains a part of the data for
243
+ # this logical object. In the normal case, this will only yield the
244
+ # receiver directly. For dynamic and static large object manifests,
245
+ # however, this call will yield each MockObject that contains a part
246
+ # of the whole, in sequence.
247
+ #
248
+ # Manifests that refer to containers or objects that don't exist will
249
+ # skip those sections and log a warning, instead.
250
+ #
251
+ # @yield [MockObject] Each object that holds a part of this logical
252
+ # object.
253
+ def each_part
254
+ case
255
+ when dynamic_manifest?
256
+ # Concatenate the contents and sizes of each matching object.
257
+ # Note that cname and oprefix are already escaped.
258
+ cname, oprefix = large_object_prefix.split('/', 2)
259
+
260
+ target_container = service.data[cname]
261
+ if target_container
262
+ all = target_container.objects.keys
263
+ matching = all.select { |name| name.start_with? oprefix }
264
+ keys = matching.sort
265
+
266
+ keys.each do |name|
267
+ yield target_container.objects[name]
268
+ end
269
+ else
270
+ Fog::Logger.warning "Invalid container in dynamic object manifest: #{cname}"
271
+ yield self
272
+ end
273
+ when static_manifest?
274
+ Fog::JSON.decode(body).each do |segment|
275
+ cname, oname = segment['path'].split('/', 2)
276
+
277
+ cont = service.mock_container cname
278
+ unless cont
279
+ Fog::Logger.warning "Invalid container in static object manifest: #{cname}"
280
+ next
281
+ end
282
+
283
+ obj = cont.mock_object oname
284
+ unless obj
285
+ Fog::Logger.warning "Invalid object in static object manifest: #{oname}"
286
+ next
287
+ end
288
+
289
+ yield obj
290
+ end
291
+ else
292
+ yield self
293
+ end
294
+ end
295
+
296
+ # Access the object name prefix that controls which other objects
297
+ # comprise a dynamic large object.
298
+ #
299
+ # @return [String, nil] The object name prefix, or `nil` if none is
300
+ # present.
301
+ def large_object_prefix
302
+ @meta['X-Object-Manifest']
303
+ end
304
+
305
+ # Construct the fake HTTP headers that should be returned on requests
306
+ # targetting this object. Includes computed `Content-Type`,
307
+ # `Content-Length`, `Last-Modified` and `ETag` headers in addition to
308
+ # whatever metadata has been associated with this object manually.
309
+ #
310
+ # @return [Hash<String, String>] Header values stored in a Hash.
311
+ def to_headers
312
+ {
313
+ 'Content-Type' => @content_type,
314
+ 'Content-Length' => @bytes_used,
315
+ 'Last-Modified' => @last_modified.strftime('%a, %b %d %Y %H:%M:%S %Z'),
316
+ 'ETag' => @hash
317
+ }.merge(@meta)
318
+ end
319
+ end
66
320
 
67
321
  def self.data
68
322
  @data ||= Hash.new do |hash, key|
@@ -70,56 +324,98 @@ module Fog
70
324
  end
71
325
  end
72
326
 
327
+ # Access or create account-wide metadata.
328
+ #
329
+ # @return [Hash<String,String>] A metadata hash pre-populated with
330
+ # a (fake) temp URL key.
331
+ def self.account_meta
332
+ @account_meta ||= Hash.new do |hash, key|
333
+ hash[key] = {
334
+ 'X-Account-Meta-Temp-Url-Key' => Fog::Mock.random_hex(32)
335
+ }
336
+ end
337
+ end
338
+
73
339
  def self.reset
74
340
  @data = nil
341
+ @account_meta = nil
75
342
  end
76
343
 
77
344
  def initialize(options={})
78
- @rackspace_api_key = options[:rackspace_api_key]
79
- @rackspace_username = options[:rackspace_username]
80
- @rackspace_cdn_ssl = options[:rackspace_cdn_ssl]
345
+ apply_options(options)
346
+ authenticate
347
+ endpoint_uri
81
348
  end
82
349
 
83
350
  def data
84
351
  self.class.data[@rackspace_username]
85
352
  end
86
353
 
354
+ def account_meta
355
+ self.class.account_meta[@rackspace_username]
356
+ end
357
+
87
358
  def reset_data
88
359
  self.class.data.delete(@rackspace_username)
89
360
  end
90
361
 
91
- def service_name
92
- :cloudFiles
362
+ # Access a MockContainer with the specified name, if one exists.
363
+ #
364
+ # @param cname [String] The (unescaped) container name.
365
+ # @return [MockContainer, nil] The named MockContainer, or `nil` if
366
+ # none exist.
367
+ def mock_container(cname)
368
+ data[Fog::Rackspace.escape(cname)]
93
369
  end
94
370
 
95
- def region
96
- @rackspace_region
371
+ # Access a MockContainer with the specified name, raising a
372
+ # {Fog::Storage::Rackspace::NotFound} exception if none exist.
373
+ #
374
+ # @param cname [String] The (unescaped) container name.
375
+ # @throws [Fog::Storage::Rackspace::NotFound] If no container with the
376
+ # given name exists.
377
+ # @return [MockContainer] The existing MockContainer.
378
+ def mock_container!(cname)
379
+ mock_container(cname) or raise Fog::Storage::Rackspace::NotFound.new
380
+ end
381
+
382
+ # Create and add a new, empty MockContainer with the given name. An
383
+ # existing container with the same name will be replaced.
384
+ #
385
+ # @param cname [String] The (unescaped) container name.
386
+ # @return [MockContainer] The container that was added.
387
+ def add_container(cname)
388
+ data[Fog::Rackspace.escape(cname)] = MockContainer.new(self)
389
+ end
390
+
391
+ # Remove a MockContainer with the specified name. No-op if the
392
+ # container does not exist.
393
+ #
394
+ # @param cname [String] The (unescaped) container name.
395
+ def remove_container(cname)
396
+ data.delete Fog::Rackspace.escape(cname)
97
397
  end
98
398
 
99
399
  def ssl?
100
400
  !!@rackspace_cdn_ssl
101
401
  end
102
402
 
403
+ private
404
+
405
+ def authenticate_v1(options)
406
+ uuid = Fog::Rackspace::MockData.uuid
407
+ endpoint_uri "https://storage101.#{region}1.clouddrive.com/v1/MockCloudFS_#{uuid}"
408
+ @auth_token = Fog::Mock.random_hex(32)
409
+ end
103
410
  end
104
411
 
105
412
  class Real < Fog::Rackspace::Service
106
- include Utils
413
+ include Common
107
414
 
108
415
  attr_reader :rackspace_cdn_ssl
109
416
 
110
417
  def initialize(options={})
111
- @rackspace_api_key = options[:rackspace_api_key]
112
- @rackspace_username = options[:rackspace_username]
113
- @rackspace_cdn_ssl = options[:rackspace_cdn_ssl]
114
- @rackspace_auth_url = options[:rackspace_auth_url]
115
- @rackspace_servicenet = options[:rackspace_servicenet]
116
- @rackspace_auth_token = options[:rackspace_auth_token]
117
- @rackspace_storage_url = options[:rackspace_storage_url]
118
- @rackspace_cdn_url = options[:rackspace_cdn_url]
119
- @rackspace_region = options[:rackspace_region] || :dfw
120
- @rackspace_temp_url_key = options[:rackspace_temp_url_key]
121
- @rackspace_must_reauthenticate = false
122
- @connection_options = options[:connection_options] || {}
418
+ apply_options(options)
123
419
 
124
420
  authenticate
125
421
  @persistent = options[:persistent] || false
@@ -127,13 +423,6 @@ module Fog
127
423
  @connection = Fog::Connection.new(endpoint_uri.to_s, @persistent, @connection_options)
128
424
  end
129
425
 
130
- # Return Account Details
131
- # @return [Fog::Storage::Rackspace::Account] account details object
132
- def account
133
- account = Fog::Storage::Rackspace::Account.new(:service => self)
134
- account.reload
135
- end
136
-
137
426
  # Using SSL?
138
427
  # @return [Boolean] return true if service is returning SSL-Secured URLs in public_url methods
139
428
  # @see Directory#public_url
@@ -158,42 +447,6 @@ module Fog
158
447
  raise ServiceError.slurp(error, self)
159
448
  end
160
449
 
161
- def service_net?
162
- @rackspace_servicenet == true
163
- end
164
-
165
- def authenticate
166
- if @rackspace_must_reauthenticate || @rackspace_auth_token.nil?
167
- options = {
168
- :rackspace_api_key => @rackspace_api_key,
169
- :rackspace_username => @rackspace_username,
170
- :rackspace_auth_url => @rackspace_auth_url,
171
- :connection_options => @connection_options
172
- }
173
- super(options)
174
- else
175
- @auth_token = @rackspace_auth_token
176
- @uri = URI.parse(@rackspace_storage_url)
177
- end
178
- end
179
-
180
- def service_name
181
- :cloudFiles
182
- end
183
-
184
- def request_id_header
185
- "X-Trans-Id"
186
- end
187
-
188
- def region
189
- @rackspace_region
190
- end
191
-
192
- def endpoint_uri(service_endpoint_url=nil)
193
- return @uri if @uri
194
- super(@rackspace_storage_url || service_endpoint_url, :rackspace_storage_url)
195
- end
196
-
197
450
  private
198
451
 
199
452
  def authenticate_v1(options)
@@ -201,8 +454,8 @@ module Fog
201
454
  endpoint_uri credentials['X-Storage-Url']
202
455
  @auth_token = credentials['X-Auth-Token']
203
456
  end
204
-
205
457
  end
458
+
206
459
  end
207
460
  end
208
461
  end