fog 0.5.3 → 0.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 (388) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +3 -3
  3. data/bin/fog +0 -5
  4. data/changelog.txt +88 -0
  5. data/fog.gemspec +3 -3
  6. data/lib/fog.rb +1 -2
  7. data/lib/fog/aws/elb.rb +2 -0
  8. data/lib/fog/aws/iam.rb +7 -0
  9. data/lib/fog/aws/parsers/iam/get_group.rb +55 -0
  10. data/lib/fog/aws/parsers/iam/get_user_policy.rb +27 -0
  11. data/lib/fog/aws/parsers/iam/update_group.rb +26 -0
  12. data/lib/fog/aws/parsers/iam/update_user.rb +27 -0
  13. data/lib/fog/aws/requests/iam/create_access_key.rb +1 -1
  14. data/lib/fog/aws/requests/iam/get_group.rb +44 -0
  15. data/lib/fog/aws/requests/iam/get_user_policy.rb +36 -0
  16. data/lib/fog/aws/requests/iam/update_group.rb +39 -0
  17. data/lib/fog/aws/requests/iam/update_signing_certificate.rb +32 -0
  18. data/lib/fog/aws/requests/iam/update_user.rb +39 -0
  19. data/lib/fog/aws/ses.rb +2 -0
  20. data/lib/fog/aws/simpledb.rb +2 -0
  21. data/lib/fog/bin.rb +3 -8
  22. data/lib/fog/bin/aws.rb +2 -14
  23. data/lib/fog/bin/bluebox.rb +6 -8
  24. data/lib/fog/bin/dnsimple.rb +30 -0
  25. data/lib/fog/bin/ecloud.rb +30 -0
  26. data/lib/fog/bin/go_grid.rb +1 -7
  27. data/lib/fog/bin/linode.rb +0 -6
  28. data/lib/fog/bin/local.rb +1 -7
  29. data/lib/fog/bin/new_servers.rb +1 -7
  30. data/lib/fog/bin/rackspace.rb +2 -14
  31. data/lib/fog/bin/slicehost.rb +2 -8
  32. data/lib/fog/bin/terremark.rb +0 -5
  33. data/lib/fog/bin/voxel.rb +30 -0
  34. data/lib/fog/cdn/aws.rb +2 -0
  35. data/lib/fog/compute.rb +6 -3
  36. data/lib/fog/compute/aws.rb +4 -18
  37. data/lib/fog/compute/ecloud.rb +1306 -0
  38. data/lib/fog/compute/models/aws/key_pair.rb +0 -2
  39. data/lib/fog/compute/models/aws/security_group.rb +4 -4
  40. data/lib/fog/compute/models/aws/server.rb +13 -3
  41. data/lib/fog/compute/models/aws/snapshot.rb +0 -2
  42. data/lib/fog/compute/models/aws/volume.rb +0 -2
  43. data/lib/fog/compute/models/bluebox/server.rb +23 -11
  44. data/lib/fog/compute/models/brightbox/server.rb +8 -0
  45. data/lib/fog/compute/models/ecloud/backup_internet_service.rb +56 -0
  46. data/lib/fog/compute/models/ecloud/backup_internet_services.rb +33 -0
  47. data/lib/fog/compute/models/ecloud/catalog.rb +28 -0
  48. data/lib/fog/compute/models/ecloud/catalog_item.rb +29 -0
  49. data/lib/fog/compute/models/ecloud/firewall_acl.rb +24 -0
  50. data/lib/fog/compute/models/ecloud/firewall_acls.rb +31 -0
  51. data/lib/fog/compute/models/ecloud/internet_service.rb +117 -0
  52. data/lib/fog/compute/models/ecloud/internet_services.rb +33 -0
  53. data/lib/fog/compute/models/ecloud/ip.rb +49 -0
  54. data/lib/fog/compute/models/ecloud/ips.rb +32 -0
  55. data/lib/fog/compute/models/ecloud/network.rb +72 -0
  56. data/lib/fog/compute/models/ecloud/networks.rb +33 -0
  57. data/lib/fog/compute/models/ecloud/node.rb +43 -0
  58. data/lib/fog/compute/models/ecloud/nodes.rb +31 -0
  59. data/lib/fog/compute/models/ecloud/public_ip.rb +22 -0
  60. data/lib/fog/compute/models/ecloud/public_ips.rb +36 -0
  61. data/lib/fog/compute/models/ecloud/server.rb +209 -0
  62. data/lib/fog/compute/models/ecloud/servers.rb +55 -0
  63. data/lib/fog/compute/models/ecloud/task.rb +21 -0
  64. data/lib/fog/compute/models/ecloud/tasks.rb +31 -0
  65. data/lib/fog/compute/models/ecloud/vdc.rb +81 -0
  66. data/lib/fog/compute/models/ecloud/vdcs.rb +40 -0
  67. data/lib/fog/compute/models/go_grid/server.rb +15 -1
  68. data/lib/fog/compute/models/rackspace/server.rb +16 -0
  69. data/lib/fog/compute/models/slicehost/server.rb +16 -0
  70. data/lib/fog/compute/models/voxel/image.rb +12 -0
  71. data/lib/fog/compute/models/voxel/images.rb +30 -0
  72. data/lib/fog/compute/models/voxel/server.rb +77 -0
  73. data/lib/fog/compute/models/voxel/servers.rb +31 -0
  74. data/lib/fog/compute/new_servers.rb +2 -2
  75. data/lib/fog/compute/parsers/voxel/basic.rb +31 -0
  76. data/lib/fog/compute/parsers/voxel/devices_list.rb +111 -0
  77. data/lib/fog/compute/parsers/voxel/images_list.rb +59 -0
  78. data/lib/fog/compute/parsers/voxel/voxcloud_create.rb +40 -0
  79. data/lib/fog/compute/parsers/voxel/voxcloud_delete.rb +31 -0
  80. data/lib/fog/compute/parsers/voxel/voxcloud_status.rb +42 -0
  81. data/lib/fog/compute/rackspace.rb +0 -16
  82. data/lib/fog/compute/requests/aws/associate_address.rb +2 -0
  83. data/lib/fog/compute/requests/aws/authorize_security_group_ingress.rb +28 -8
  84. data/lib/fog/compute/requests/aws/create_security_group.rb +2 -0
  85. data/lib/fog/compute/requests/aws/create_tags.rb +2 -0
  86. data/lib/fog/compute/requests/aws/delete_key_pair.rb +2 -0
  87. data/lib/fog/compute/requests/aws/delete_security_group.rb +2 -0
  88. data/lib/fog/compute/requests/aws/delete_snapshot.rb +2 -0
  89. data/lib/fog/compute/requests/aws/delete_tags.rb +2 -0
  90. data/lib/fog/compute/requests/aws/delete_volume.rb +2 -0
  91. data/lib/fog/compute/requests/aws/disassociate_address.rb +2 -0
  92. data/lib/fog/compute/requests/aws/modify_image_attributes.rb +2 -0
  93. data/lib/fog/compute/requests/aws/modify_snapshot_attribute.rb +2 -0
  94. data/lib/fog/compute/requests/aws/reboot_instances.rb +2 -0
  95. data/lib/fog/compute/requests/aws/release_address.rb +2 -0
  96. data/lib/fog/compute/requests/aws/revoke_security_group_ingress.rb +2 -0
  97. data/lib/fog/compute/requests/ecloud/add_backup_internet_service.rb +109 -0
  98. data/lib/fog/compute/requests/ecloud/add_internet_service.rb +149 -0
  99. data/lib/fog/compute/requests/ecloud/add_node.rb +62 -0
  100. data/lib/fog/compute/requests/ecloud/clone_vapp.rb +40 -0
  101. data/lib/fog/compute/requests/ecloud/configure_internet_service.rb +112 -0
  102. data/lib/fog/compute/requests/ecloud/configure_network.rb +44 -0
  103. data/lib/fog/compute/requests/ecloud/configure_network_ip.rb +66 -0
  104. data/lib/fog/compute/requests/ecloud/configure_node.rb +56 -0
  105. data/lib/fog/compute/requests/ecloud/configure_vapp.rb +144 -0
  106. data/lib/fog/compute/requests/ecloud/delete_internet_service.rb +22 -0
  107. data/lib/fog/compute/requests/ecloud/delete_node.rb +22 -0
  108. data/lib/fog/compute/requests/ecloud/delete_vapp.rb +29 -0
  109. data/lib/fog/compute/requests/ecloud/get_catalog.rb +44 -0
  110. data/lib/fog/compute/requests/ecloud/get_catalog_item.rb +47 -0
  111. data/lib/fog/compute/requests/ecloud/get_customization_options.rb +22 -0
  112. data/lib/fog/compute/requests/ecloud/get_firewall_acl.rb +11 -0
  113. data/lib/fog/compute/requests/ecloud/get_firewall_acls.rb +11 -0
  114. data/lib/fog/compute/requests/ecloud/get_internet_services.rb +82 -0
  115. data/lib/fog/compute/requests/ecloud/get_network.rb +44 -0
  116. data/lib/fog/compute/requests/ecloud/get_network_extensions.rb +33 -0
  117. data/lib/fog/compute/requests/ecloud/get_network_ip.rb +43 -0
  118. data/lib/fog/compute/requests/ecloud/get_network_ips.rb +35 -0
  119. data/lib/fog/compute/requests/ecloud/get_node.rb +40 -0
  120. data/lib/fog/compute/requests/ecloud/get_nodes.rb +41 -0
  121. data/lib/fog/compute/requests/ecloud/get_organization.rb +49 -0
  122. data/lib/fog/compute/requests/ecloud/get_public_ip.rb +34 -0
  123. data/lib/fog/compute/requests/ecloud/get_public_ips.rb +38 -0
  124. data/lib/fog/compute/requests/ecloud/get_task.rb +11 -0
  125. data/lib/fog/compute/requests/ecloud/get_task_list.rb +11 -0
  126. data/lib/fog/compute/requests/ecloud/get_vapp.rb +99 -0
  127. data/lib/fog/compute/requests/ecloud/get_vapp_template.rb +11 -0
  128. data/lib/fog/compute/requests/ecloud/get_vdc.rb +84 -0
  129. data/lib/fog/compute/requests/ecloud/get_versions.rb +37 -0
  130. data/lib/fog/compute/requests/ecloud/instantiate_vapp_template.rb +142 -0
  131. data/lib/fog/compute/requests/ecloud/login.rb +48 -0
  132. data/lib/fog/compute/requests/ecloud/power_off.rb +23 -0
  133. data/lib/fog/compute/requests/ecloud/power_on.rb +23 -0
  134. data/lib/fog/compute/requests/ecloud/power_reset.rb +11 -0
  135. data/lib/fog/compute/requests/ecloud/power_shutdown.rb +11 -0
  136. data/lib/fog/compute/requests/voxel/devices_list.rb +24 -0
  137. data/lib/fog/compute/requests/voxel/devices_power.rb +22 -0
  138. data/lib/fog/compute/requests/voxel/images_list.rb +31 -0
  139. data/lib/fog/compute/requests/voxel/voxcloud_create.rb +22 -0
  140. data/lib/fog/compute/requests/voxel/voxcloud_delete.rb +20 -0
  141. data/lib/fog/compute/requests/voxel/voxcloud_status.rb +29 -0
  142. data/lib/fog/compute/slicehost.rb +2 -0
  143. data/lib/fog/compute/voxel.rb +112 -0
  144. data/lib/fog/core.rb +1 -0
  145. data/lib/fog/core/credentials.rb +6 -2
  146. data/lib/fog/core/parser.rb +2 -0
  147. data/lib/fog/core/scp.rb +67 -0
  148. data/lib/fog/dns.rb +6 -0
  149. data/lib/fog/dns/aws.rb +2 -0
  150. data/lib/fog/dns/bluebox.rb +110 -0
  151. data/lib/fog/dns/dnsimple.rb +95 -0
  152. data/lib/fog/dns/models/bluebox/record.rb +52 -0
  153. data/lib/fog/dns/models/bluebox/records.rb +36 -0
  154. data/lib/fog/dns/models/bluebox/zone.rb +63 -0
  155. data/lib/fog/dns/models/bluebox/zones.rb +28 -0
  156. data/lib/fog/dns/models/dnsimple/record.rb +54 -0
  157. data/lib/fog/dns/models/dnsimple/records.rb +38 -0
  158. data/lib/fog/dns/models/dnsimple/zone.rb +50 -0
  159. data/lib/fog/dns/models/dnsimple/zones.rb +28 -0
  160. data/lib/fog/dns/parsers/bluebox/create_record.rb +26 -0
  161. data/lib/fog/dns/parsers/bluebox/create_zone.rb +26 -0
  162. data/lib/fog/dns/parsers/bluebox/get_record.rb +21 -0
  163. data/lib/fog/dns/parsers/bluebox/get_records.rb +27 -0
  164. data/lib/fog/{compute/parsers/terremark_ecloud/get_ip_address.rb → dns/parsers/bluebox/get_zone.rb} +6 -6
  165. data/lib/fog/dns/parsers/bluebox/get_zones.rb +30 -0
  166. data/lib/fog/dns/requests/bluebox/create_record.rb +48 -0
  167. data/lib/fog/dns/requests/bluebox/create_zone.rb +52 -0
  168. data/lib/fog/dns/requests/bluebox/delete_record.rb +31 -0
  169. data/lib/fog/dns/requests/bluebox/delete_zone.rb +31 -0
  170. data/lib/fog/dns/requests/bluebox/get_record.rb +40 -0
  171. data/lib/fog/dns/requests/bluebox/get_records.rb +41 -0
  172. data/lib/fog/dns/requests/bluebox/get_zone.rb +44 -0
  173. data/lib/fog/dns/requests/bluebox/get_zones.rb +43 -0
  174. data/lib/fog/dns/requests/bluebox/update_record.rb +34 -0
  175. data/lib/fog/dns/requests/bluebox/update_zone.rb +30 -0
  176. data/lib/fog/dns/requests/dnsimple/create_domain.rb +27 -0
  177. data/lib/fog/dns/requests/dnsimple/create_record.rb +48 -0
  178. data/lib/fog/dns/requests/dnsimple/delete_domain.rb +26 -0
  179. data/lib/fog/dns/requests/dnsimple/delete_record.rb +21 -0
  180. data/lib/fog/dns/requests/dnsimple/get_domain.rb +37 -0
  181. data/lib/fog/dns/requests/dnsimple/list_domains.rb +35 -0
  182. data/lib/fog/dns/requests/dnsimple/list_records.rb +32 -0
  183. data/lib/fog/dns/requests/dnsimple/update_record.rb +42 -0
  184. data/lib/fog/dns/slicehost.rb +2 -0
  185. data/lib/fog/dns/zerigo.rb +2 -0
  186. data/lib/fog/providers.rb +3 -1
  187. data/lib/fog/providers/aws.rb +0 -4
  188. data/lib/fog/providers/bluebox.rb +1 -8
  189. data/lib/fog/providers/dnsimple.rb +11 -0
  190. data/lib/fog/providers/ecloud.rb +11 -0
  191. data/lib/fog/providers/go_grid.rb +0 -8
  192. data/lib/fog/providers/google.rb +0 -3
  193. data/lib/fog/providers/linode.rb +0 -8
  194. data/lib/fog/providers/local.rb +0 -8
  195. data/lib/fog/providers/new_servers.rb +0 -11
  196. data/lib/fog/providers/rackspace.rb +0 -2
  197. data/lib/fog/providers/slicehost.rb +0 -11
  198. data/lib/fog/providers/voxel.rb +16 -0
  199. data/lib/fog/providers/zerigo.rb +0 -3
  200. data/lib/fog/storage/aws.rb +7 -19
  201. data/lib/fog/storage/google.rb +2 -2
  202. data/lib/fog/storage/models/aws/directory.rb +0 -3
  203. data/lib/fog/storage/models/aws/file.rb +0 -3
  204. data/lib/fog/storage/models/google/directory.rb +0 -3
  205. data/lib/fog/storage/models/google/file.rb +0 -3
  206. data/lib/fog/storage/models/local/directory.rb +0 -3
  207. data/lib/fog/storage/models/local/file.rb +29 -1
  208. data/lib/fog/storage/models/local/files.rb +8 -5
  209. data/lib/fog/storage/models/rackspace/directory.rb +1 -3
  210. data/lib/fog/storage/parsers/aws/get_bucket_website.rb +26 -0
  211. data/lib/fog/storage/rackspace.rb +0 -16
  212. data/lib/fog/storage/requests/aws/delete_bucket_website.rb +32 -0
  213. data/lib/fog/storage/requests/aws/get_bucket_website.rb +42 -0
  214. data/lib/fog/storage/requests/aws/put_bucket_website.rb +49 -0
  215. data/lib/fog/terremark.rb +0 -5
  216. data/spec/ecloud/bin_spec.rb +22 -0
  217. data/spec/{vcloud/terremark/ecloud → ecloud}/models/backup_internet_service_spec.rb +5 -5
  218. data/spec/{vcloud/terremark/ecloud → ecloud}/models/backup_internet_services_spec.rb +4 -4
  219. data/spec/{vcloud/terremark/ecloud → ecloud}/models/internet_service_spec.rb +5 -5
  220. data/spec/{vcloud/terremark/ecloud → ecloud}/models/internet_services_spec.rb +4 -4
  221. data/spec/{vcloud/terremark/ecloud → ecloud}/models/ip_spec.rb +5 -5
  222. data/spec/{vcloud/terremark/ecloud → ecloud}/models/ips_spec.rb +4 -4
  223. data/spec/{vcloud/terremark/ecloud → ecloud}/models/network_spec.rb +5 -5
  224. data/spec/{vcloud/terremark/ecloud → ecloud}/models/networks_spec.rb +4 -4
  225. data/spec/{vcloud/terremark/ecloud → ecloud}/models/node_spec.rb +5 -5
  226. data/spec/{vcloud/terremark/ecloud → ecloud}/models/nodes_spec.rb +4 -4
  227. data/spec/{vcloud/terremark/ecloud → ecloud}/models/public_ip_spec.rb +5 -5
  228. data/spec/{vcloud/terremark/ecloud → ecloud}/models/public_ips_spec.rb +4 -4
  229. data/spec/{vcloud/terremark/ecloud → ecloud}/models/server_spec.rb +4 -4
  230. data/spec/{vcloud/terremark/ecloud → ecloud}/models/vdc_spec.rb +5 -5
  231. data/spec/{vcloud/terremark/ecloud → ecloud}/models/vdcs_spec.rb +4 -4
  232. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/add_backup_internet_service_spec.rb +2 -2
  233. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/add_internet_service_spec.rb +2 -2
  234. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/add_node_spec.rb +2 -2
  235. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/configure_internet_service_spec.rb +2 -2
  236. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/configure_network_ip_spec.rb +2 -2
  237. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/configure_node_spec.rb +2 -2
  238. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/configure_vapp_spec.rb +2 -2
  239. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/delete_internet_service_spec.rb +2 -2
  240. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/delete_node_spec.rb +2 -2
  241. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/delete_vapp_spec.rb +2 -2
  242. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_catalog_item_spec.rb +2 -2
  243. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_catalog_spec.rb +2 -2
  244. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_customization_options_spec.rb +2 -2
  245. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_internet_services_spec.rb +2 -2
  246. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_network_ip_spec.rb +2 -2
  247. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_network_ips_spec.rb +2 -2
  248. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_network_spec.rb +2 -2
  249. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_node_spec.rb +2 -2
  250. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_nodes_spec.rb +2 -2
  251. data/spec/{vcloud → ecloud}/requests/get_organization_spec.rb +2 -2
  252. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_public_ip_spec.rb +2 -2
  253. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_public_ips_spec.rb +2 -2
  254. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_vapp_spec.rb +2 -2
  255. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/get_vdc_spec.rb +2 -2
  256. data/spec/ecloud/requests/get_versions_spec.rb +57 -0
  257. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/instantiate_vapp_template_spec.rb +3 -3
  258. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/login_spec.rb +2 -2
  259. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/power_off_spec.rb +2 -2
  260. data/spec/{vcloud/terremark/ecloud → ecloud}/requests/power_on_spec.rb +2 -2
  261. data/spec/{vcloud → ecloud}/spec_helper.rb +14 -29
  262. data/spec/{vcloud → ecloud}/vcloud_spec.rb +4 -4
  263. data/spec/spec_helper.rb +0 -1
  264. data/tests/compute/helper.rb +12 -1
  265. data/tests/compute/models/flavors_tests.rb +2 -0
  266. data/tests/compute/models/server_tests.rb +28 -1
  267. data/tests/compute/requests/voxel/image_tests.rb +46 -0
  268. data/tests/compute/requests/voxel/server_tests.rb +123 -0
  269. data/tests/dns/helper.rb +10 -1
  270. data/tests/dns/models/record_tests.rb +0 -1
  271. data/tests/dns/requests/bluebox/dns_tests.rb +271 -0
  272. data/tests/dns/requests/dnsimple/dns_tests.rb +130 -0
  273. data/tests/helper.rb +1 -1
  274. data/tests/helpers/mock_helper.rb +2 -0
  275. data/tests/storage/models/directory_test.rb +2 -1
  276. metadata +244 -224
  277. data/lib/fog/bin/terremark_ecloud.rb +0 -28
  278. data/lib/fog/bin/vcloud.rb +0 -59
  279. data/lib/fog/compute/parsers/terremark_ecloud/get_catalog.rb +0 -36
  280. data/lib/fog/compute/parsers/terremark_ecloud/get_catalog_item.rb +0 -43
  281. data/lib/fog/compute/parsers/terremark_ecloud/get_ip_addresses.rb +0 -27
  282. data/lib/fog/compute/parsers/terremark_ecloud/get_network.rb +0 -59
  283. data/lib/fog/compute/parsers/terremark_ecloud/get_organization.rb +0 -35
  284. data/lib/fog/compute/parsers/terremark_ecloud/get_task.rb +0 -42
  285. data/lib/fog/compute/parsers/terremark_ecloud/get_task_list.rb +0 -51
  286. data/lib/fog/compute/parsers/terremark_ecloud/get_vdc.rb +0 -110
  287. data/lib/fog/compute/parsers/terremark_ecloud/get_versions.rb +0 -28
  288. data/lib/fog/compute/parsers/terremark_ecloud/login.rb +0 -27
  289. data/lib/fog/compute/requests/terremark_ecloud/get_catalog.rb +0 -19
  290. data/lib/fog/compute/requests/terremark_ecloud/get_catalog_item.rb +0 -19
  291. data/lib/fog/compute/requests/terremark_ecloud/get_ip_address.rb +0 -19
  292. data/lib/fog/compute/requests/terremark_ecloud/get_ip_addresses.rb +0 -19
  293. data/lib/fog/compute/requests/terremark_ecloud/get_network.rb +0 -19
  294. data/lib/fog/compute/requests/terremark_ecloud/get_organization.rb +0 -19
  295. data/lib/fog/compute/requests/terremark_ecloud/get_task.rb +0 -19
  296. data/lib/fog/compute/requests/terremark_ecloud/get_task_list.rb +0 -19
  297. data/lib/fog/compute/requests/terremark_ecloud/get_vdc.rb +0 -19
  298. data/lib/fog/compute/requests/terremark_ecloud/get_versions.rb +0 -26
  299. data/lib/fog/compute/requests/terremark_ecloud/login.rb +0 -29
  300. data/lib/fog/compute/terremark_ecloud.rb +0 -93
  301. data/lib/fog/providers/terremark_ecloud.rb +0 -17
  302. data/lib/fog/terremark/ecloud.rb +0 -73
  303. data/lib/fog/vcloud.rb +0 -337
  304. data/lib/fog/vcloud/collection.rb +0 -30
  305. data/lib/fog/vcloud/generators.rb +0 -33
  306. data/lib/fog/vcloud/mock_data_classes.rb +0 -767
  307. data/lib/fog/vcloud/model.rb +0 -22
  308. data/lib/fog/vcloud/models/vdc.rb +0 -26
  309. data/lib/fog/vcloud/models/vdcs.rb +0 -35
  310. data/lib/fog/vcloud/requests/get_network.rb +0 -47
  311. data/lib/fog/vcloud/requests/get_organization.rb +0 -47
  312. data/lib/fog/vcloud/requests/get_vdc.rb +0 -82
  313. data/lib/fog/vcloud/requests/get_versions.rb +0 -34
  314. data/lib/fog/vcloud/requests/login.rb +0 -46
  315. data/lib/fog/vcloud/terremark/ecloud.rb +0 -187
  316. data/lib/fog/vcloud/terremark/ecloud/models/backup_internet_service.rb +0 -60
  317. data/lib/fog/vcloud/terremark/ecloud/models/backup_internet_services.rb +0 -36
  318. data/lib/fog/vcloud/terremark/ecloud/models/catalog.rb +0 -31
  319. data/lib/fog/vcloud/terremark/ecloud/models/catalog_item.rb +0 -31
  320. data/lib/fog/vcloud/terremark/ecloud/models/firewall_acl.rb +0 -28
  321. data/lib/fog/vcloud/terremark/ecloud/models/firewall_acls.rb +0 -34
  322. data/lib/fog/vcloud/terremark/ecloud/models/internet_service.rb +0 -121
  323. data/lib/fog/vcloud/terremark/ecloud/models/internet_services.rb +0 -36
  324. data/lib/fog/vcloud/terremark/ecloud/models/ip.rb +0 -51
  325. data/lib/fog/vcloud/terremark/ecloud/models/ips.rb +0 -35
  326. data/lib/fog/vcloud/terremark/ecloud/models/network.rb +0 -77
  327. data/lib/fog/vcloud/terremark/ecloud/models/networks.rb +0 -36
  328. data/lib/fog/vcloud/terremark/ecloud/models/node.rb +0 -47
  329. data/lib/fog/vcloud/terremark/ecloud/models/nodes.rb +0 -33
  330. data/lib/fog/vcloud/terremark/ecloud/models/public_ip.rb +0 -25
  331. data/lib/fog/vcloud/terremark/ecloud/models/public_ips.rb +0 -39
  332. data/lib/fog/vcloud/terremark/ecloud/models/server.rb +0 -211
  333. data/lib/fog/vcloud/terremark/ecloud/models/servers.rb +0 -57
  334. data/lib/fog/vcloud/terremark/ecloud/models/task.rb +0 -23
  335. data/lib/fog/vcloud/terremark/ecloud/models/tasks.rb +0 -33
  336. data/lib/fog/vcloud/terremark/ecloud/models/vdc.rb +0 -83
  337. data/lib/fog/vcloud/terremark/ecloud/models/vdcs.rb +0 -42
  338. data/lib/fog/vcloud/terremark/ecloud/requests/add_backup_internet_service.rb +0 -111
  339. data/lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb +0 -152
  340. data/lib/fog/vcloud/terremark/ecloud/requests/add_node.rb +0 -64
  341. data/lib/fog/vcloud/terremark/ecloud/requests/clone_vapp.rb +0 -42
  342. data/lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb +0 -115
  343. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb +0 -46
  344. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb +0 -68
  345. data/lib/fog/vcloud/terremark/ecloud/requests/configure_node.rb +0 -58
  346. data/lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb +0 -147
  347. data/lib/fog/vcloud/terremark/ecloud/requests/delete_internet_service.rb +0 -25
  348. data/lib/fog/vcloud/terremark/ecloud/requests/delete_node.rb +0 -24
  349. data/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb +0 -32
  350. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog.rb +0 -46
  351. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog_item.rb +0 -49
  352. data/lib/fog/vcloud/terremark/ecloud/requests/get_customization_options.rb +0 -24
  353. data/lib/fog/vcloud/terremark/ecloud/requests/get_firewall_acl.rb +0 -13
  354. data/lib/fog/vcloud/terremark/ecloud/requests/get_firewall_acls.rb +0 -13
  355. data/lib/fog/vcloud/terremark/ecloud/requests/get_internet_services.rb +0 -84
  356. data/lib/fog/vcloud/terremark/ecloud/requests/get_network.rb +0 -47
  357. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_extensions.rb +0 -35
  358. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ip.rb +0 -45
  359. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ips.rb +0 -37
  360. data/lib/fog/vcloud/terremark/ecloud/requests/get_node.rb +0 -42
  361. data/lib/fog/vcloud/terremark/ecloud/requests/get_nodes.rb +0 -43
  362. data/lib/fog/vcloud/terremark/ecloud/requests/get_public_ip.rb +0 -36
  363. data/lib/fog/vcloud/terremark/ecloud/requests/get_public_ips.rb +0 -41
  364. data/lib/fog/vcloud/terremark/ecloud/requests/get_task.rb +0 -13
  365. data/lib/fog/vcloud/terremark/ecloud/requests/get_task_list.rb +0 -14
  366. data/lib/fog/vcloud/terremark/ecloud/requests/get_vapp.rb +0 -101
  367. data/lib/fog/vcloud/terremark/ecloud/requests/get_vapp_template.rb +0 -13
  368. data/lib/fog/vcloud/terremark/ecloud/requests/get_vdc.rb +0 -87
  369. data/lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb +0 -144
  370. data/lib/fog/vcloud/terremark/ecloud/requests/power_off.rb +0 -25
  371. data/lib/fog/vcloud/terremark/ecloud/requests/power_on.rb +0 -25
  372. data/lib/fog/vcloud/terremark/ecloud/requests/power_reset.rb +0 -13
  373. data/lib/fog/vcloud/terremark/ecloud/requests/power_shutdown.rb +0 -13
  374. data/lib/fog/vcloud/terremark/vcloud.rb +0 -39
  375. data/lib/fog/vcloud/terremark/vcloud/requests/get_vdc.rb +0 -57
  376. data/spec/vcloud/bin_spec.rb +0 -28
  377. data/spec/vcloud/models/vdc_spec.rb +0 -51
  378. data/spec/vcloud/models/vdcs_spec.rb +0 -1
  379. data/spec/vcloud/requests/get_network_spec.rb +0 -44
  380. data/spec/vcloud/requests/get_vdc_spec.rb +0 -62
  381. data/spec/vcloud/requests/get_versions_spec.rb +0 -54
  382. data/spec/vcloud/requests/login_spec.rb +0 -24
  383. data/tests/compute/requests/terremark_ecloud/catalog_tests.rb +0 -47
  384. data/tests/compute/requests/terremark_ecloud/helper.rb +0 -45
  385. data/tests/compute/requests/terremark_ecloud/network_tests.rb +0 -30
  386. data/tests/compute/requests/terremark_ecloud/organization_tests.rb +0 -28
  387. data/tests/compute/requests/terremark_ecloud/task_tests.rb +0 -39
  388. data/tests/compute/requests/terremark_ecloud/vdc_tests.rb +0 -60
data/lib/fog/cdn/aws.rb CHANGED
@@ -79,6 +79,8 @@ module Fog
79
79
  Formatador.display_line(warning)
80
80
  end
81
81
 
82
+ require 'fog/core/parser'
83
+
82
84
  @aws_access_key_id = options[:aws_access_key_id]
83
85
  @aws_secret_access_key = options[:aws_secret_access_key]
84
86
  @hmac = Fog::HMAC.new('sha1', @aws_secret_access_key)
data/lib/fog/compute.rb CHANGED
@@ -13,6 +13,9 @@ module Fog
13
13
  when 'Brightbox'
14
14
  require 'fog/compute/brightbox'
15
15
  Fog::Brightbox::Compute.new(attributes)
16
+ when 'Ecloud'
17
+ require 'fog/compute/ecloud'
18
+ Fog::Ecloud::Compute.new(attributes)
16
19
  when 'GoGrid'
17
20
  require 'fog/compute/go_grid'
18
21
  Fog::GoGrid::Compute.new(attributes)
@@ -25,12 +28,12 @@ module Fog
25
28
  when 'Rackspace'
26
29
  require 'fog/compute/rackspace'
27
30
  Fog::Rackspace::Compute.new(attributes)
31
+ when 'Voxel'
32
+ require 'fog/compute/voxel'
33
+ Fog::Voxel::Compute.new(attributes)
28
34
  when 'Slicehost'
29
35
  require 'fog/compute/slicehost'
30
36
  Fog::Slicehost::Compute.new(attributes)
31
- when 'TerremarkEcloud'
32
- require 'fog/compute/terremark_ecloud'
33
- Fog::TerremarkEcloud::Compute.new(attributes)
34
37
  else
35
38
  raise ArgumentError.new("#{provider} is not a recognized compute provider")
36
39
  end
@@ -1,19 +1,3 @@
1
- module Fog
2
- module AWS
3
- class EC2
4
-
5
- def self.new(attributes = {})
6
- location = caller.first
7
- warning = "[yellow][WARN] Fog::AWS::EC2#new is deprecated, use Fog::AWS::Compute#new instead[/]"
8
- warning << " [light_black](" << location << ")[/] "
9
- Formatador.display_line(warning)
10
- Fog::AWS::Compute.new(attributes)
11
- end
12
-
13
- end
14
- end
15
- end
16
-
17
1
  module Fog
18
2
  module AWS
19
3
  class Compute < Fog::Service
@@ -42,8 +26,6 @@ module Fog
42
26
  model :volume
43
27
  collection :volumes
44
28
 
45
- require 'fog/compute/parsers/aws/basic'
46
-
47
29
  request_path 'fog/compute/requests/aws'
48
30
  request :allocate_address
49
31
  request :associate_address
@@ -154,6 +136,8 @@ module Fog
154
136
  Formatador.display_line(warning)
155
137
  end
156
138
 
139
+ require 'fog/compute/parsers/aws/basic'
140
+
157
141
  @aws_access_key_id = options[:aws_access_key_id]
158
142
  @region = options[:region] || 'us-east-1'
159
143
  @data = self.class.data[@region][@aws_access_key_id]
@@ -190,6 +174,8 @@ module Fog
190
174
  Formatador.display_line(warning)
191
175
  end
192
176
 
177
+ require 'fog/core/parser'
178
+
193
179
  @aws_access_key_id = options[:aws_access_key_id]
194
180
  @aws_secret_access_key = options[:aws_secret_access_key]
195
181
  @hmac = Fog::HMAC.new('sha256', @aws_secret_access_key)
@@ -0,0 +1,1306 @@
1
+ require 'fog/core'
2
+ require 'ipaddr'
3
+
4
+ class IPAddr
5
+ def mask
6
+ _to_string(@mask_addr)
7
+ end
8
+ end
9
+
10
+ module Fog
11
+ module Ecloud
12
+ class Collection < Fog::Collection
13
+
14
+ def load(objects)
15
+ objects = [ objects ] if objects.is_a?(Hash)
16
+ super
17
+ end
18
+
19
+ def check_href!(opts = {})
20
+ unless href
21
+ if opts.is_a?(String)
22
+ t = Hash.new
23
+ t[:parent] = opts
24
+ opts = t
25
+ end
26
+ msg = ":href missing, call with a :href pointing to #{if opts[:message]
27
+ opts[:message]
28
+ elsif opts[:parent]
29
+ "the #{opts[:parent]} whos #{self.class.to_s.split('::').last.downcase} you want to enumerate"
30
+ else
31
+ "the resource"
32
+ end}"
33
+ raise Fog::Errors::Error.new(msg)
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+
41
+ module Fog
42
+ module Ecloud
43
+ module MockDataClasses
44
+ class Base < Hash
45
+ def self.base_url=(url)
46
+ @base_url = url
47
+ end
48
+
49
+ self.base_url = "http://vcloud.example.com"
50
+
51
+ def self.base_url
52
+ @base_url
53
+ end
54
+
55
+ def first
56
+ raise "Don't do this"
57
+ end
58
+
59
+ def last
60
+ raise "Don't do this"
61
+ end
62
+
63
+ def initialize(data = {}, parent = nil)
64
+ @parent = parent
65
+
66
+ replace(data)
67
+ end
68
+
69
+ def _parent
70
+ @parent
71
+ end
72
+
73
+ def base_url
74
+ Base.base_url
75
+ end
76
+
77
+ def href
78
+ [base_url, self.class.name.split("::").last, object_id].join("/")
79
+ end
80
+
81
+ def inspect
82
+ "<#{self.class.name} #{object_id} data=#{super}>"
83
+ end
84
+ end
85
+
86
+ class MockData < Base
87
+ def versions
88
+ @versions ||= []
89
+ end
90
+
91
+ def organizations
92
+ @organizations ||= []
93
+ end
94
+
95
+ def organization_from_href(href)
96
+ find_href_in(href, organizations)
97
+ end
98
+
99
+ def all_vdcs
100
+ organizations.map(&:vdcs).flatten
101
+ end
102
+
103
+ def vdc_from_href(href)
104
+ find_href_in(href, all_vdcs)
105
+ end
106
+
107
+ def all_catalogs
108
+ all_vdcs.map(&:catalog).flatten
109
+ end
110
+
111
+ def catalog_from_href(href)
112
+ find_href_in(href, all_catalogs)
113
+ end
114
+
115
+ def all_catalog_items
116
+ all_catalogs.map(&:items).flatten
117
+ end
118
+
119
+ def catalog_item_from_href(href)
120
+ find_href_in(href, all_catalog_items)
121
+ end
122
+
123
+ def all_virtual_machines
124
+ all_vdcs.map(&:virtual_machines).flatten
125
+ end
126
+
127
+ def virtual_machine_from_href(href)
128
+ find_href_prefixed_in(href, all_virtual_machines)
129
+ end
130
+
131
+
132
+ def all_networks
133
+ all_vdcs.map(&:networks).flatten
134
+ end
135
+
136
+ def network_from_href(href)
137
+ find_href_in(href, all_networks)
138
+ end
139
+
140
+ def all_network_extensions
141
+ all_networks.map(&:extensions).flatten
142
+ end
143
+
144
+ def network_extension_from_href(href)
145
+ find_href_in(href, all_network_extensions)
146
+ end
147
+
148
+ def all_vdc_internet_service_collections
149
+ all_vdcs.map(&:internet_service_collection).flatten
150
+ end
151
+
152
+ def vdc_internet_service_collection_from_href(href)
153
+ find_href_in(href, all_vdc_internet_service_collections)
154
+ end
155
+
156
+ def all_backup_internet_services
157
+ all_vdc_internet_service_collections.map(&:backup_internet_services).flatten
158
+ end
159
+
160
+ def backup_internet_service_from_href(href)
161
+ find_href_in(href, all_backup_internet_services)
162
+ end
163
+
164
+ def all_public_ip_collections
165
+ all_vdcs.map {|v| v.public_ip_collection }.flatten
166
+ end
167
+
168
+ def public_ip_collection_from_href(href)
169
+ find_href_in(href, all_public_ip_collections)
170
+ end
171
+
172
+ def all_public_ips
173
+ all_public_ip_collections.map(&:items).flatten
174
+ end
175
+
176
+ def public_ip_from_href(href)
177
+ find_href_in(href, all_public_ips)
178
+ end
179
+
180
+ def all_public_ip_internet_service_collections
181
+ all_public_ips.map(&:internet_service_collection).flatten
182
+ end
183
+
184
+ def public_ip_internet_service_collection_from_href(href)
185
+ find_href_in(href, all_public_ip_internet_service_collections)
186
+ end
187
+
188
+ def all_public_ip_internet_services
189
+ all_public_ip_internet_service_collections.map(&:items).flatten
190
+ end
191
+
192
+ def public_ip_internet_service_from_href(href)
193
+ find_href_in(href, all_public_ip_internet_services)
194
+ end
195
+
196
+ def all_public_ip_internet_service_node_collections
197
+ all_public_ip_internet_services.map(&:node_collection).flatten
198
+ end
199
+
200
+ def public_ip_internet_service_node_collection_from_href(href)
201
+ find_href_in(href, all_public_ip_internet_service_node_collections)
202
+ end
203
+
204
+ def all_public_ip_internet_service_nodes
205
+ all_public_ip_internet_service_node_collections.map(&:items).flatten
206
+ end
207
+
208
+ def public_ip_internet_service_node_from_href(href)
209
+ find_href_in(href, all_public_ip_internet_service_nodes)
210
+ end
211
+
212
+ def all_network_ip_collections
213
+ all_networks.map(&:ip_collection)
214
+ end
215
+
216
+ def network_ip_collection_from_href(href)
217
+ find_href_in(href, all_network_ip_collections)
218
+ end
219
+
220
+ def all_network_ips
221
+ all_network_ip_collections.map {|c| c.items.values }.flatten
222
+ end
223
+
224
+ def network_ip_from_href(href)
225
+ find_href_in(href, all_network_ips)
226
+ end
227
+
228
+ private
229
+
230
+ def find_href_in(href, objects)
231
+ objects.detect {|o| o.href == href }
232
+ end
233
+
234
+ def find_href_prefixed_in(href, objects)
235
+ objects.detect {|o| href =~ %r{^#{o.href}($|/)} }
236
+ end
237
+ end
238
+
239
+ class MockVersion < Base
240
+ def version
241
+ self[:version]
242
+ end
243
+
244
+ def supported
245
+ !!self[:supported]
246
+ end
247
+
248
+ def login_url
249
+ href
250
+ end
251
+ end
252
+
253
+ class MockOrganization < Base
254
+ def name
255
+ self[:name]
256
+ end
257
+
258
+ def vdcs
259
+ @vdcs ||= []
260
+ end
261
+ end
262
+
263
+ class MockVdc < Base
264
+ def name
265
+ self[:name]
266
+ end
267
+
268
+ def storage_allocated
269
+ self[:storage_allocated] || 200
270
+ end
271
+
272
+ def storage_used
273
+ self[:storage_used] || 105
274
+ end
275
+
276
+ def cpu_allocated
277
+ self[:cpu_allocated] || 10000
278
+ end
279
+
280
+ def memory_allocated
281
+ self[:memory_allocated] || 20480
282
+ end
283
+
284
+ def catalog
285
+ @catalog ||= MockCatalog.new({}, self)
286
+ end
287
+
288
+ def networks
289
+ @networks ||= []
290
+ end
291
+
292
+ def virtual_machines
293
+ @virtual_machines ||= []
294
+ end
295
+
296
+ def task_list
297
+ @task_list ||= MockTaskList.new({}, self)
298
+ end
299
+
300
+ # for TM eCloud, should probably be subclassed
301
+ def public_ip_collection
302
+ @public_ip_collection ||= MockPublicIps.new({}, self)
303
+ end
304
+
305
+ def internet_service_collection
306
+ @internet_service_collection ||= MockVdcInternetServices.new({}, self)
307
+ end
308
+
309
+ def firewall_acls
310
+ @firewall_acls ||= MockFirewallAcls.new({}, self)
311
+ end
312
+ end
313
+
314
+ class MockTaskList < Base
315
+ def name
316
+ self[:name] || "Tasks List"
317
+ end
318
+ end
319
+
320
+ class MockCatalog < Base
321
+ def name
322
+ self[:name] || "Catalog"
323
+ end
324
+
325
+ def items
326
+ @items ||= []
327
+ end
328
+ end
329
+
330
+ class MockCatalogItem < Base
331
+ def name
332
+ self[:name]
333
+ end
334
+
335
+ def disks
336
+ @disks ||= MockVirtualMachineDisks.new(self)
337
+ end
338
+
339
+ def customization
340
+ @customization ||= MockCatalogItemCustomization.new({}, self)
341
+ end
342
+
343
+ def vapp_template
344
+ @vapp_template ||= MockCatalogItemVappTemplate.new({ :name => name }, self)
345
+ end
346
+ end
347
+
348
+ class MockCatalogItemCustomization < Base
349
+ def name
350
+ self[:name] || "Customization Options"
351
+ end
352
+ end
353
+
354
+ class MockCatalogItemVappTemplate < Base
355
+ def name
356
+ self[:name]
357
+ end
358
+ end
359
+
360
+ class MockNetwork < Base
361
+ def name
362
+ self[:name] || subnet
363
+ end
364
+
365
+ def subnet
366
+ self[:subnet]
367
+ end
368
+
369
+ def gateway
370
+ self[:gateway] || subnet_ips[1]
371
+ end
372
+
373
+ def netmask
374
+ self[:netmask] || subnet_ipaddr.mask
375
+ end
376
+
377
+ def dns
378
+ "8.8.8.8"
379
+ end
380
+
381
+ def features
382
+ [
383
+ { :type => :FenceMode, :value => "isolated" }
384
+ ]
385
+ end
386
+
387
+ def ip_collection
388
+ @ip_collection ||= MockNetworkIps.new({}, self)
389
+ end
390
+
391
+ def extensions
392
+ @extensions ||= MockNetworkExtensions.new({}, self)
393
+ end
394
+
395
+ def random_ip
396
+ usable_subnet_ips[rand(usable_subnet_ips.length)]
397
+ end
398
+
399
+ # for TM eCloud. should probably be a subclass
400
+ def rnat
401
+ self[:rnat]
402
+ end
403
+
404
+ def usable_subnet_ips
405
+ subnet_ips[3..-2]
406
+ end
407
+
408
+ def address
409
+ subnet_ips.first
410
+ end
411
+
412
+ def broadcast
413
+ subnet_ips.last
414
+ end
415
+
416
+ private
417
+
418
+ def subnet_ipaddr
419
+ @ipaddr ||= IPAddr.new(subnet)
420
+ end
421
+
422
+ def subnet_ips
423
+ subnet_ipaddr.to_range.to_a.map(&:to_s)
424
+ end
425
+ end
426
+
427
+ class MockNetworkIps < Base
428
+ def items
429
+ @items ||= _parent.usable_subnet_ips.inject({}) do |out, subnet_ip|
430
+ out.update(subnet_ip => MockNetworkIp.new({ :ip => subnet_ip }, self))
431
+ end
432
+ end
433
+
434
+ def ordered_ips
435
+ items.values.sort_by {|i| i.ip.split(".").map(&:to_i) }
436
+ end
437
+
438
+ def name
439
+ "IP Addresses"
440
+ end
441
+ end
442
+
443
+ class MockNetworkIp < Base
444
+ def name
445
+ self[:name] || ip
446
+ end
447
+
448
+ def ip
449
+ self[:ip]
450
+ end
451
+
452
+ def used_by
453
+ self[:used_by] || _parent._parent._parent.virtual_machines.detect {|v| v.ip == ip }
454
+ end
455
+
456
+ def status
457
+ if used_by
458
+ "Assigned"
459
+ else
460
+ "Available"
461
+ end
462
+ end
463
+
464
+ def rnat
465
+ self[:rnat] || _parent._parent.rnat
466
+ end
467
+
468
+ def rnat_set?
469
+ !!self[:rnat]
470
+ end
471
+ end
472
+
473
+ class MockNetworkExtensions < Base
474
+ def name
475
+ _parent.name
476
+ end
477
+
478
+ def gateway
479
+ _parent.gateway
480
+ end
481
+
482
+ def broadcast
483
+ _parent.broadcast
484
+ end
485
+
486
+ def address
487
+ _parent.address
488
+ end
489
+
490
+ def rnat
491
+ _parent.rnat
492
+ end
493
+
494
+ def type
495
+ self[:type] || "DMZ"
496
+ end
497
+
498
+ def vlan
499
+ object_id.to_s
500
+ end
501
+
502
+ def friendly_name
503
+ "#{name} (#{type}_#{object_id})"
504
+ end
505
+ end
506
+
507
+ class MockVirtualMachine < Base
508
+ def name
509
+ self[:name]
510
+ end
511
+
512
+ def ip
513
+ self[:ip]
514
+ end
515
+
516
+ def cpus
517
+ self[:cpus] || 1
518
+ end
519
+
520
+ def memory
521
+ self[:memory] || 1024
522
+ end
523
+
524
+ def disks
525
+ @disks ||= MockVirtualMachineDisks.new(self)
526
+ end
527
+
528
+ def status
529
+ self[:status] || 2
530
+ end
531
+
532
+ def power_off!
533
+ self[:status] = 2
534
+ end
535
+
536
+ def power_on!
537
+ self[:status] = 4
538
+ end
539
+
540
+ def size
541
+ disks.inject(0) {|s, d| s + d.vcloud_size }
542
+ end
543
+
544
+ def network_ip
545
+ if network = _parent.networks.detect {|n| n.ip_collection.items[ip] }
546
+ network.ip_collection.items[ip]
547
+ end
548
+ end
549
+
550
+ # from fog ecloud server's _compose_vapp_data
551
+ def to_configure_vapp_hash
552
+ {
553
+ :name => name,
554
+ :cpus => cpus,
555
+ :memory => memory,
556
+ :disks => disks.map {|d| { :number => d.address.to_s, :size => d.vcloud_size, :resource => d.vcloud_size.to_s } }
557
+ }
558
+ end
559
+
560
+ def href(purpose = :base)
561
+ case purpose
562
+ when :base
563
+ super()
564
+ when :power_on
565
+ super() + "/power/action/powerOn"
566
+ when :power_off
567
+ super() + "/power/action/powerOff"
568
+ end
569
+ end
570
+ end
571
+
572
+ class MockVirtualMachineDisks < Array
573
+ def initialize(parent = nil)
574
+ @parent = parent
575
+ end
576
+
577
+ def _parent
578
+ @parent
579
+ end
580
+
581
+ def <<(disk)
582
+ next_address = 0
583
+ disk_with_max_address = max {|a, b| a[:address] <=> b[:address] }
584
+ disk_with_max_address && next_address = disk_with_max_address.address + 1
585
+ disk[:address] ||= next_address
586
+
587
+ super(disk)
588
+
589
+ if (addresses = map {|d| d.address }).uniq.size != size
590
+ raise "Duplicate disk address in: #{addresses.inspect} (#{size})"
591
+ end
592
+
593
+ sort! {|a, b| a.address <=> b.address }
594
+ self
595
+ end
596
+
597
+ def at_address(address)
598
+ detect {|d| d.address == address }
599
+ end
600
+ end
601
+
602
+ class MockVirtualMachineDisk < Base
603
+ def size
604
+ self[:size].to_i
605
+ end
606
+
607
+ def vcloud_size
608
+ # kilobytes
609
+ size * 1024
610
+ end
611
+
612
+ def address
613
+ self[:address].to_i
614
+ end
615
+ end
616
+
617
+ # for Terremark eCloud
618
+
619
+ class MockVdcInternetServices < Base
620
+ def href
621
+ _parent.href + "/internetServices"
622
+ end
623
+
624
+ def name
625
+ "Internet Services"
626
+ end
627
+
628
+ def items
629
+ public_ip_internet_services + backup_internet_services
630
+ end
631
+
632
+ def public_ip_internet_services
633
+ _parent.public_ip_collection.items.inject([]) do |services, public_ip|
634
+ services + public_ip.internet_service_collection.items
635
+ end
636
+ end
637
+
638
+ def backup_internet_services
639
+ @backup_internet_services ||= []
640
+ end
641
+ end
642
+
643
+ class MockBackupInternetService < Base
644
+ def name
645
+ self[:name] || "Backup Internet Service #{object_id}"
646
+ end
647
+
648
+ def protocol
649
+ self[:protocol]
650
+ end
651
+
652
+ def port
653
+ 0
654
+ end
655
+
656
+ def enabled
657
+ self[:enabled].to_s.downcase != "false"
658
+ end
659
+
660
+ def timeout
661
+ self[:timeout] || 2
662
+ end
663
+
664
+ def description
665
+ self[:description] || "Description for Backup Service #{name}"
666
+ end
667
+
668
+ def redirect_url
669
+ nil
670
+ end
671
+
672
+ def node_collection
673
+ @node_collection ||= MockPublicIpInternetServiceNodes.new({}, self)
674
+ end
675
+ end
676
+
677
+ class MockFirewallAcls < Base
678
+ def name
679
+ "Firewall Access List"
680
+ end
681
+ end
682
+
683
+ class MockPublicIps < Base
684
+ def name
685
+ self[:name] || "Public IPs"
686
+ end
687
+
688
+ def items
689
+ @items ||= []
690
+ end
691
+ end
692
+
693
+ class MockPublicIp < Base
694
+ def name
695
+ self[:name]
696
+ end
697
+
698
+ def internet_service_collection
699
+ @internet_service_collection ||= MockPublicIpInternetServices.new({}, self)
700
+ end
701
+ end
702
+
703
+ class MockPublicIpInternetServices < Base
704
+ def href
705
+ _parent.href + "/internetServices"
706
+ end
707
+
708
+ def items
709
+ @items ||= []
710
+ end
711
+ end
712
+
713
+ class MockPublicIpInternetService < Base
714
+ def name
715
+ self[:name] || "Public IP Service #{object_id}"
716
+ end
717
+
718
+ def description
719
+ self[:description] || "Description for Public IP Service #{name}"
720
+ end
721
+
722
+ def protocol
723
+ self[:protocol]
724
+ end
725
+
726
+ def port
727
+ self[:port]
728
+ end
729
+
730
+ def enabled
731
+ !!self[:enabled]
732
+ end
733
+
734
+ def redirect_url
735
+ self[:redirect_url]
736
+ end
737
+
738
+ def timeout
739
+ self[:timeout] || 2
740
+ end
741
+
742
+ def node_collection
743
+ @node_collection ||= MockPublicIpInternetServiceNodes.new({}, self)
744
+ end
745
+
746
+ def monitor
747
+ nil
748
+ end
749
+
750
+ def backup_service
751
+ self[:backup_service]
752
+ end
753
+ end
754
+
755
+ class MockPublicIpInternetServiceNodes < Base
756
+ def href
757
+ _parent.href + "/nodeServices"
758
+ end
759
+
760
+ def items
761
+ @items ||= [].tap do |node_array|
762
+ node_array.instance_variable_set("@default_port", _parent.port)
763
+
764
+ def node_array.<<(node)
765
+ node[:port] ||= @default_port
766
+ super
767
+ end
768
+ end
769
+ end
770
+ end
771
+
772
+ class MockPublicIpInternetServiceNode < Base
773
+ def ip_address
774
+ self[:ip_address]
775
+ end
776
+
777
+ def name
778
+ self[:name] || "Public IP Service Node #{object_id}"
779
+ end
780
+
781
+ def description
782
+ self[:description] || "Description for Public IP Service Node #{name}"
783
+ end
784
+
785
+ def port
786
+ self[:port]
787
+ end
788
+
789
+ def enabled
790
+ self[:enabled].to_s.downcase != "false"
791
+ end
792
+
793
+ def enabled=(new_value)
794
+ self[:enabled] = new_value
795
+ end
796
+ end
797
+ end
798
+ end
799
+ end
800
+
801
+
802
+ module Fog
803
+ module Ecloud
804
+ class Model < Fog::Model
805
+
806
+ attr_accessor :loaded
807
+ alias_method :loaded?, :loaded
808
+
809
+ def reload
810
+ instance = super
811
+ @loaded = true
812
+ instance
813
+ end
814
+
815
+ def load_unless_loaded!
816
+ unless @loaded
817
+ reload
818
+ end
819
+ end
820
+
821
+ end
822
+ end
823
+ end
824
+
825
+ module Fog
826
+ module Ecloud
827
+ class Compute < Fog::Service
828
+
829
+ class UnsupportedVersion < Exception ; end
830
+
831
+ requires :ecloud_username, :ecloud_password, :ecloud_versions_uri
832
+ recognizes :ecloud_version
833
+ recognizes :provider # remove post deprecation
834
+
835
+ model_path 'fog/compute/models/ecloud'
836
+ model :catalog_item
837
+ model :catalog
838
+ model :firewall_acl
839
+ collection :firewall_acls
840
+ model :internet_service
841
+ collection :internet_services
842
+ model :backup_internet_service
843
+ collection :backup_internet_services
844
+ model :ip
845
+ collection :ips
846
+ model :network
847
+ collection :networks
848
+ model :node
849
+ collection :nodes
850
+ model :public_ip
851
+ collection :public_ips
852
+ model :server
853
+ collection :servers
854
+ model :task
855
+ collection :tasks
856
+ model :vdc
857
+ collection :vdcs
858
+
859
+ request_path 'fog/compute/requests/ecloud'
860
+ request :add_internet_service
861
+ request :add_backup_internet_service
862
+ request :add_node
863
+ request :clone_vapp
864
+ request :configure_internet_service
865
+ request :configure_network
866
+ request :configure_network_ip
867
+ request :configure_node
868
+ request :configure_vapp
869
+ request :delete_internet_service
870
+ request :delete_node
871
+ request :delete_vapp
872
+ request :get_catalog
873
+ request :get_catalog_item
874
+ request :get_customization_options
875
+ request :get_firewall_acls
876
+ request :get_firewall_acl
877
+ request :get_internet_services
878
+ request :get_network
879
+ request :get_network_ip
880
+ request :get_network_ips
881
+ request :get_network_extensions
882
+ request :get_organization
883
+ request :get_node
884
+ request :get_nodes
885
+ request :get_public_ip
886
+ request :get_public_ips
887
+ request :get_task
888
+ request :get_task_list
889
+ request :get_vapp
890
+ request :get_vapp_template
891
+ request :get_vdc
892
+ request :get_versions
893
+ request :instantiate_vapp_template
894
+ request :login
895
+ request :power_off
896
+ request :power_on
897
+ request :power_reset
898
+ request :power_shutdown
899
+
900
+ module Shared
901
+
902
+ attr_reader :versions_uri
903
+
904
+ def default_organization_uri
905
+ @default_organization_uri ||= begin
906
+ unless @login_results
907
+ do_login
908
+ end
909
+ case @login_results.body[:Org]
910
+ when Array
911
+ @login_results.body[:Org].first[:href]
912
+ when Hash
913
+ @login_results.body[:Org][:href]
914
+ else
915
+ nil
916
+ end
917
+ end
918
+ end
919
+
920
+ # login handles the auth, but we just need the Set-Cookie
921
+ # header from that call.
922
+ def do_login
923
+ @login_results = login
924
+ @cookie = @login_results.headers['Set-Cookie']
925
+ end
926
+
927
+ def ecloud_xmlns
928
+ {
929
+ "xmlns" => "urn:tmrk:eCloudExtensions-2.6",
930
+ "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance"
931
+ }
932
+ end
933
+
934
+ def ensure_unparsed(uri)
935
+ if uri.is_a?(String)
936
+ uri
937
+ else
938
+ uri.to_s
939
+ end
940
+ end
941
+
942
+ def supported_versions
943
+ @supported_versions ||= get_versions(@versions_uri).body[:VersionInfo]
944
+ end
945
+
946
+ def xmlns
947
+ { "xmlns" => "http://www.vmware.com/vcloud/v0.8",
948
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
949
+ "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" }
950
+ end
951
+
952
+ end
953
+
954
+ class Mock
955
+ include Shared
956
+ include MockDataClasses
957
+
958
+ def self.base_url
959
+ "https://fakey.com/api/v0.8b-ext2.6"
960
+ end
961
+
962
+ def self.data_reset
963
+ @mock_data = nil
964
+ end
965
+
966
+ def self.data( base_url = self.base_url )
967
+ @mock_data ||= MockData.new.tap do |vcloud_mock_data|
968
+ vcloud_mock_data.versions.clear
969
+ vcloud_mock_data.versions << MockVersion.new(:version => "v0.8b-ext2.6", :supported => true)
970
+
971
+ vcloud_mock_data.organizations << MockOrganization.new(:name => "Boom Inc.").tap do |mock_organization|
972
+ mock_organization.vdcs << MockVdc.new(:name => "Boomstick").tap do |mock_vdc|
973
+ mock_vdc.catalog.items << MockCatalogItem.new(:name => "Item 0").tap do |mock_catalog_item|
974
+ mock_catalog_item.disks << MockVirtualMachineDisk.new(:size => 25 * 1024)
975
+ end
976
+ mock_vdc.catalog.items << MockCatalogItem.new(:name => "Item 1").tap do |mock_catalog_item|
977
+ mock_catalog_item.disks << MockVirtualMachineDisk.new(:size => 25 * 1024)
978
+ end
979
+ mock_vdc.catalog.items << MockCatalogItem.new(:name => "Item 2").tap do |mock_catalog_item|
980
+ mock_catalog_item.disks << MockVirtualMachineDisk.new(:size => 25 * 1024)
981
+ end
982
+
983
+ mock_vdc.networks << MockNetwork.new({ :subnet => "1.2.3.0/24" }, mock_vdc)
984
+ mock_vdc.networks << MockNetwork.new({ :subnet => "4.5.6.0/24" }, mock_vdc)
985
+
986
+ mock_vdc.virtual_machines << MockVirtualMachine.new({ :name => "Broom 1", :ip => "1.2.3.3" }, mock_vdc)
987
+ mock_vdc.virtual_machines << MockVirtualMachine.new({ :name => "Broom 2", :ip => "1.2.3.4" }, mock_vdc)
988
+ mock_vdc.virtual_machines << MockVirtualMachine.new({ :name => "Email!", :ip => "1.2.3.10" }, mock_vdc)
989
+ end
990
+
991
+ mock_organization.vdcs << MockVdc.new(:name => "Rock-n-Roll", :storage_allocated => 150, :storage_used => 40, :cpu_allocated => 1000, :memory_allocated => 2048).tap do |mock_vdc|
992
+ mock_vdc.networks << MockNetwork.new({ :subnet => "7.8.9.0/24" }, mock_vdc)
993
+
994
+ mock_vdc.virtual_machines << MockVirtualMachine.new({ :name => "Master Blaster", :ip => "7.8.9.10" }, mock_vdc)
995
+ end
996
+ end
997
+
998
+ vcloud_mock_data.organizations.detect {|o| o.name == "Boom Inc." }.tap do |mock_organization|
999
+ mock_organization.vdcs.detect {|v| v.name == "Boomstick" }.tap do |mock_vdc|
1000
+ mock_vdc.public_ip_collection.items << MockPublicIp.new(:name => "99.1.2.3").tap do |mock_public_ip|
1001
+ mock_public_ip.internet_service_collection.items << MockPublicIpInternetService.new({
1002
+ :protocol => "HTTP",
1003
+ :port => 80,
1004
+ :name => "Web Site",
1005
+ :description => "Web Servers",
1006
+ :redirect_url => "http://fakey.com"
1007
+ }, mock_public_ip.internet_service_collection
1008
+ ).tap do |mock_public_ip_service|
1009
+ mock_public_ip_service.node_collection.items << MockPublicIpInternetServiceNode.new({:ip_address => "1.2.3.5", :name => "Test Node 1", :description => "web 1"}, mock_public_ip_service.node_collection)
1010
+ mock_public_ip_service.node_collection.items << MockPublicIpInternetServiceNode.new({:ip_address => "1.2.3.6", :name => "Test Node 2", :description => "web 2"}, mock_public_ip_service.node_collection)
1011
+ mock_public_ip_service.node_collection.items << MockPublicIpInternetServiceNode.new({:ip_address => "1.2.3.7", :name => "Test Node 3", :description => "web 3"}, mock_public_ip_service.node_collection)
1012
+ end
1013
+
1014
+ mock_public_ip.internet_service_collection.items << MockPublicIpInternetService.new({
1015
+ :protocol => "TCP",
1016
+ :port => 7000,
1017
+ :name => "An SSH Map",
1018
+ :description => "SSH 1"
1019
+ }, mock_public_ip.internet_service_collection
1020
+ ).tap do |mock_public_ip_service|
1021
+ mock_public_ip_service.node_collection.items << MockPublicIpInternetServiceNode.new({ :ip_address => "1.2.3.5", :port => 22, :name => "SSH", :description => "web ssh" }, mock_public_ip_service.node_collection)
1022
+ end
1023
+ end
1024
+
1025
+ mock_vdc.public_ip_collection.items << MockPublicIp.new(:name => "99.1.2.4").tap do |mock_public_ip|
1026
+ mock_public_ip.internet_service_collection.items << MockPublicIpInternetService.new({
1027
+ :protocol => "HTTP",
1028
+ :port => 80,
1029
+ :name => "Web Site",
1030
+ :description => "Web Servers",
1031
+ :redirect_url => "http://fakey.com"
1032
+ }, mock_public_ip.internet_service_collection
1033
+ )
1034
+
1035
+ mock_public_ip.internet_service_collection.items << MockPublicIpInternetService.new({
1036
+ :protocol => "TCP",
1037
+ :port => 7000,
1038
+ :name => "An SSH Map",
1039
+ :description => "SSH 2"
1040
+ }, mock_public_ip.internet_service_collection
1041
+ )
1042
+ end
1043
+
1044
+ mock_vdc.public_ip_collection.items << MockPublicIp.new(:name => "99.1.9.7")
1045
+
1046
+ mock_vdc.internet_service_collection.backup_internet_services << MockBackupInternetService.new({ :port => 10000, :protocol => "TCP"}, self)
1047
+ end
1048
+
1049
+ mock_organization.vdcs.detect {|v| v.name == "Rock-n-Roll" }.tap do |mock_vdc|
1050
+ mock_vdc.public_ip_collection.items << MockPublicIp.new(:name => "99.99.99.99")
1051
+ end
1052
+ end
1053
+
1054
+ vcloud_mock_data.organizations.each do |organization|
1055
+ organization.vdcs.each do |vdc|
1056
+ vdc.networks.each do |network|
1057
+ network[:rnat] = vdc.public_ip_collection.items.first.name
1058
+ end
1059
+ vdc.virtual_machines.each do |virtual_machine|
1060
+ virtual_machine.disks << MockVirtualMachineDisk.new(:size => 25 * 1024)
1061
+ virtual_machine.disks << MockVirtualMachineDisk.new(:size => 50 * 1024)
1062
+ end
1063
+ end
1064
+ end
1065
+ end
1066
+ end
1067
+
1068
+ def initialize(options = {})
1069
+ require 'builder'
1070
+ require 'fog/core/parser'
1071
+
1072
+ @versions_uri = URI.parse('https://vcloud.fakey.com/api/versions')
1073
+ end
1074
+
1075
+ def mock_data
1076
+ Fog::Ecloud::Compute::Mock.data
1077
+ end
1078
+
1079
+ def mock_error(expected, status, body='', headers={})
1080
+ raise Excon::Errors::Unauthorized.new("Expected(#{expected}) <=> Actual(#{status})")
1081
+ end
1082
+
1083
+ def mock_it(status, mock_data, mock_headers = {})
1084
+ response = Excon::Response.new
1085
+
1086
+ #Parse the response body into a hash
1087
+ if mock_data.empty?
1088
+ response.body = mock_data
1089
+ else
1090
+ document = Fog::ToHashDocument.new
1091
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
1092
+ parser << mock_data
1093
+ parser.finish
1094
+ response.body = document.body
1095
+ end
1096
+
1097
+ response.status = status
1098
+ response.headers = mock_headers
1099
+ response
1100
+ end
1101
+
1102
+ end
1103
+
1104
+ class Real
1105
+ include Shared
1106
+
1107
+ class << self
1108
+
1109
+ def basic_request(*args)
1110
+ self.class_eval <<-EOS, __FILE__,__LINE__
1111
+ def #{args[0]}(uri)
1112
+ request({
1113
+ :expects => #{args[1] || 200},
1114
+ :method => '#{args[2] || 'GET'}',
1115
+ :headers => #{args[3] ? args[3].inspect : '{}'},
1116
+ :body => '#{args[4] ? args[4] : ''}',
1117
+ :parse => true,
1118
+ :uri => uri })
1119
+ end
1120
+ EOS
1121
+ end
1122
+
1123
+ def unauthenticated_basic_request(*args)
1124
+ self.class_eval <<-EOS, __FILE__,__LINE__
1125
+ def #{args[0]}(uri)
1126
+ unauthenticated_request({
1127
+ :expects => #{args[1] || 200},
1128
+ :method => '#{args[2] || 'GET'}',
1129
+ :headers => #{args[3] ? args[3].inspect : '{}'},
1130
+ :parse => true,
1131
+ :uri => uri })
1132
+ end
1133
+ EOS
1134
+ end
1135
+
1136
+ end
1137
+
1138
+ def initialize(options = {})
1139
+ require 'builder'
1140
+ require 'fog/core/parser'
1141
+
1142
+ @connections = {}
1143
+ @versions_uri = URI.parse(options[:ecloud_versions_uri])
1144
+ @version = options[:ecloud_version]
1145
+ @username = options[:ecloud_username]
1146
+ @password = options[:ecloud_password]
1147
+ @persistent = options[:persistent]
1148
+ end
1149
+
1150
+ def default_organization_uri
1151
+ @default_organization_uri ||= begin
1152
+ unless @login_results
1153
+ do_login
1154
+ end
1155
+ case @login_results.body[:Org]
1156
+ when Array
1157
+ @login_results.body[:Org].first[:href]
1158
+ when Hash
1159
+ @login_results.body[:Org][:href]
1160
+ else
1161
+ nil
1162
+ end
1163
+ end
1164
+ end
1165
+
1166
+ def reload
1167
+ @connections.each_value { |k,v| v.reset if v }
1168
+ end
1169
+
1170
+ # If the cookie isn't set, do a get_organizations call to set it
1171
+ # and try the request.
1172
+ # If we get an Unauthorized error, we assume the token expired, re-auth and try again
1173
+ def request(params)
1174
+ unless @cookie
1175
+ do_login
1176
+ end
1177
+ begin
1178
+ do_request(params)
1179
+ rescue Excon::Errors::Unauthorized => e
1180
+ do_login
1181
+ do_request(params)
1182
+ end
1183
+ end
1184
+
1185
+ def supporting_versions
1186
+ ["v0.8b-ext2.6", "0.8b-ext2.6"]
1187
+ end
1188
+
1189
+ private
1190
+
1191
+ def ensure_parsed(uri)
1192
+ if uri.is_a?(String)
1193
+ URI.parse(uri)
1194
+ else
1195
+ uri
1196
+ end
1197
+ end
1198
+
1199
+ def supported_version_numbers
1200
+ case supported_versions
1201
+ when Array
1202
+ supported_versions.map { |version| version[:Version] }
1203
+ when Hash
1204
+ [ supported_versions[:Version] ]
1205
+ end
1206
+ end
1207
+
1208
+ def get_login_uri
1209
+ check_versions
1210
+ URI.parse case supported_versions
1211
+ when Array
1212
+ supported_versions.detect {|version| version[:Version] == @version }[:LoginUrl]
1213
+ when Hash
1214
+ supported_versions[:LoginUrl]
1215
+ end
1216
+ end
1217
+
1218
+ # If we don't support any versions the service does, then raise an error.
1219
+ # If the @version that super selected isn't in our supported list, then select one that is.
1220
+ def check_versions
1221
+ if @version
1222
+ unless supported_version_numbers.include?(@version.to_s)
1223
+ raise UnsupportedVersion.new("#{@version} is not supported by the server.")
1224
+ end
1225
+ unless supporting_versions.include?(@version.to_s)
1226
+ raise UnsupportedVersion.new("#{@version} is not supported by #{self.class}")
1227
+ end
1228
+ else
1229
+ unless @version = (supported_version_numbers & supporting_versions).sort.first
1230
+ raise UnsupportedVersion.new("\nService @ #{@versions_uri} supports: #{supported_version_numbers.join(', ')}\n" +
1231
+ "#{self.class} supports: #{supporting_versions.join(', ')}")
1232
+ end
1233
+ end
1234
+ end
1235
+
1236
+ # Don't need to set the cookie for these or retry them if the cookie timed out
1237
+ def unauthenticated_request(params)
1238
+ do_request(params)
1239
+ end
1240
+
1241
+ # Use this to set the Authorization header for login
1242
+ def authorization_header
1243
+ "Basic #{Base64.encode64("#{@username}:#{@password}").chomp!}"
1244
+ end
1245
+
1246
+ def login_uri
1247
+ @login_uri ||= get_login_uri
1248
+ end
1249
+
1250
+ # login handles the auth, but we just need the Set-Cookie
1251
+ # header from that call.
1252
+ def do_login
1253
+ @login_results = login
1254
+ @cookie = @login_results.headers['Set-Cookie']
1255
+ end
1256
+
1257
+ # Actually do the request
1258
+ def do_request(params)
1259
+ # Convert the uri to a URI if it's a string.
1260
+ if params[:uri].is_a?(String)
1261
+ params[:uri] = URI.parse(params[:uri])
1262
+ end
1263
+ host_url = "#{params[:uri].scheme}://#{params[:uri].host}#{params[:uri].port ? ":#{params[:uri].port}" : ''}"
1264
+
1265
+ # Hash connections on the host_url ... There's nothing to say we won't get URI's that go to
1266
+ # different hosts.
1267
+ @connections[host_url] ||= Fog::Connection.new(host_url, @persistent)
1268
+
1269
+ # Set headers to an empty hash if none are set.
1270
+ headers = params[:headers] || {}
1271
+
1272
+ # Add our auth cookie to the headers
1273
+ if @cookie
1274
+ headers.merge!('Cookie' => @cookie)
1275
+ end
1276
+
1277
+ # Make the request
1278
+ response = @connections[host_url].request({
1279
+ :body => params[:body] || '',
1280
+ :expects => params[:expects] || 200,
1281
+ :headers => headers,
1282
+ :method => params[:method] || 'GET',
1283
+ :path => params[:uri].path
1284
+ })
1285
+
1286
+ # Parse the response body into a hash
1287
+ #puts response.body
1288
+ unless response.body.empty?
1289
+ if params[:parse]
1290
+ document = Fog::ToHashDocument.new
1291
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
1292
+ parser << response.body
1293
+ parser.finish
1294
+
1295
+ response.body = document.body
1296
+ end
1297
+ end
1298
+
1299
+ response
1300
+ end
1301
+
1302
+ end
1303
+
1304
+ end
1305
+ end
1306
+ end