fog 0.9.0 → 0.10.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 (428) hide show
  1. data/Rakefile +7 -4
  2. data/bin/fog +4 -1
  3. data/changelog.txt +464 -0
  4. data/docs/index.markdown +2 -2
  5. data/fog.gemspec +11 -11
  6. data/lib/fog.rb +1 -1
  7. data/lib/fog/aws/auto_scaling.rb +221 -0
  8. data/lib/fog/aws/cloud_formation.rb +1 -1
  9. data/lib/fog/aws/cloud_watch.rb +110 -0
  10. data/lib/fog/aws/elb.rb +58 -26
  11. data/lib/fog/aws/iam.rb +65 -13
  12. data/lib/fog/aws/models/auto_scaling/activities.rb +30 -0
  13. data/lib/fog/aws/models/auto_scaling/activity.rb +29 -0
  14. data/lib/fog/aws/models/auto_scaling/configuration.rb +63 -0
  15. data/lib/fog/aws/models/auto_scaling/configurations.rb +35 -0
  16. data/lib/fog/aws/models/auto_scaling/group.rb +140 -0
  17. data/lib/fog/aws/models/auto_scaling/groups.rb +35 -0
  18. data/lib/fog/aws/models/auto_scaling/instance.rb +60 -0
  19. data/lib/fog/aws/models/auto_scaling/instances.rb +30 -0
  20. data/lib/fog/aws/models/cloud_watch/metric.rb +14 -0
  21. data/lib/fog/aws/models/cloud_watch/metric_statistic.rb +46 -0
  22. data/lib/fog/aws/models/cloud_watch/metric_statistics.rb +23 -0
  23. data/lib/fog/aws/models/cloud_watch/metrics.rb +32 -0
  24. data/lib/fog/aws/models/elb/listener.rb +6 -0
  25. data/lib/fog/aws/models/elb/listeners.rb +2 -2
  26. data/lib/fog/aws/models/elb/load_balancer.rb +8 -5
  27. data/lib/fog/aws/models/rds/server.rb +3 -1
  28. data/lib/fog/aws/parsers/auto_scaling/basic.rb +28 -0
  29. data/lib/fog/aws/parsers/auto_scaling/describe_adjustment_types.rb +39 -0
  30. data/lib/fog/aws/parsers/auto_scaling/describe_auto_scaling_groups.rb +126 -0
  31. data/lib/fog/aws/parsers/auto_scaling/describe_auto_scaling_instances.rb +43 -0
  32. data/lib/fog/aws/parsers/auto_scaling/describe_launch_configurations.rb +94 -0
  33. data/lib/fog/aws/parsers/auto_scaling/describe_metric_collection_types.rb +66 -0
  34. data/lib/fog/aws/parsers/auto_scaling/describe_policies.rb +66 -0
  35. data/lib/fog/aws/parsers/auto_scaling/describe_scaling_activities.rb +47 -0
  36. data/lib/fog/aws/parsers/auto_scaling/describe_scaling_process_types.rb +39 -0
  37. data/lib/fog/aws/parsers/auto_scaling/describe_scheduled_actions.rb +46 -0
  38. data/lib/fog/aws/parsers/auto_scaling/put_scaling_policy.rb +30 -0
  39. data/lib/fog/aws/parsers/auto_scaling/terminate_instance_in_auto_scaling_group.rb +35 -0
  40. data/lib/fog/aws/parsers/cloud_watch/get_metric_statistics.rb +42 -0
  41. data/lib/fog/aws/parsers/cloud_watch/list_metrics.rb +58 -0
  42. data/lib/fog/aws/parsers/cloud_watch/put_metric_data.rb +26 -0
  43. data/lib/fog/aws/parsers/elb/describe_load_balancers.rb +1 -1
  44. data/lib/fog/aws/parsers/iam/get_group_policy.rb +27 -0
  45. data/lib/fog/aws/parsers/iam/list_account_aliases.rb +28 -0
  46. data/lib/fog/aws/parsers/rds/db_engine_version_parser.rb +35 -0
  47. data/lib/fog/aws/parsers/rds/db_parser.rb +1 -1
  48. data/lib/fog/aws/parsers/rds/describe_db_engine_versions.rb +39 -0
  49. data/lib/fog/aws/parsers/rds/describe_db_reserved_instances.rb +43 -0
  50. data/lib/fog/aws/parsers/sns/add_permission.rb +24 -0
  51. data/lib/fog/aws/parsers/sns/confirm_subscription.rb +24 -0
  52. data/lib/fog/aws/parsers/sns/create_topic.rb +24 -0
  53. data/lib/fog/aws/parsers/sns/delete_topic.rb +24 -0
  54. data/lib/fog/aws/parsers/sns/get_topic_attributes.rb +32 -0
  55. data/lib/fog/aws/parsers/sns/list_subscriptions.rb +29 -0
  56. data/lib/fog/aws/parsers/sns/list_topics.rb +26 -0
  57. data/lib/fog/aws/parsers/sns/publish.rb +24 -0
  58. data/lib/fog/aws/parsers/sns/remove_permission.rb +24 -0
  59. data/lib/fog/aws/parsers/sns/set_topic_attributes.rb +24 -0
  60. data/lib/fog/aws/parsers/sns/subscribe.rb +24 -0
  61. data/lib/fog/aws/parsers/sns/unsubscribe.rb +24 -0
  62. data/lib/fog/aws/parsers/sqs/basic.rb +23 -0
  63. data/lib/fog/aws/parsers/sqs/create_queue.rb +26 -0
  64. data/lib/fog/aws/parsers/sqs/get_queue_attributes.rb +35 -0
  65. data/lib/fog/aws/parsers/sqs/list_queues.rb +25 -0
  66. data/lib/fog/aws/parsers/sqs/receive_message.rb +41 -0
  67. data/lib/fog/aws/parsers/sqs/send_message.rb +28 -0
  68. data/lib/fog/aws/rds.rb +3 -1
  69. data/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +108 -0
  70. data/lib/fog/aws/requests/auto_scaling/create_launch_configuration.rb +105 -0
  71. data/lib/fog/aws/requests/auto_scaling/delete_auto_scaling_group.rb +45 -0
  72. data/lib/fog/aws/requests/auto_scaling/delete_launch_configuration.rb +48 -0
  73. data/lib/fog/aws/requests/auto_scaling/delete_policy.rb +47 -0
  74. data/lib/fog/aws/requests/auto_scaling/delete_scheduled_action.rb +48 -0
  75. data/lib/fog/aws/requests/auto_scaling/describe_adjustment_types.rb +52 -0
  76. data/lib/fog/aws/requests/auto_scaling/describe_auto_scaling_groups.rb +128 -0
  77. data/lib/fog/aws/requests/auto_scaling/describe_auto_scaling_instances.rb +96 -0
  78. data/lib/fog/aws/requests/auto_scaling/describe_launch_configurations.rb +108 -0
  79. data/lib/fog/aws/requests/auto_scaling/describe_metric_collection_types.rb +60 -0
  80. data/lib/fog/aws/requests/auto_scaling/describe_policies.rb +85 -0
  81. data/lib/fog/aws/requests/auto_scaling/describe_scaling_activities.rb +88 -0
  82. data/lib/fog/aws/requests/auto_scaling/describe_scaling_process_types.rb +54 -0
  83. data/lib/fog/aws/requests/auto_scaling/describe_scheduled_actions.rb +83 -0
  84. data/lib/fog/aws/requests/auto_scaling/disable_metrics_collection.rb +56 -0
  85. data/lib/fog/aws/requests/auto_scaling/enable_metrics_collection.rb +66 -0
  86. data/lib/fog/aws/requests/auto_scaling/execute_policy.rb +50 -0
  87. data/lib/fog/aws/requests/auto_scaling/put_scaling_policy.rb +66 -0
  88. data/lib/fog/aws/requests/auto_scaling/put_scheduled_update_group_action.rb +57 -0
  89. data/lib/fog/aws/requests/auto_scaling/resume_processes.rb +50 -0
  90. data/lib/fog/aws/requests/auto_scaling/set_desired_capacity.rb +87 -0
  91. data/lib/fog/aws/requests/auto_scaling/set_instance_health.rb +55 -0
  92. data/lib/fog/aws/requests/auto_scaling/suspend_processes.rb +57 -0
  93. data/lib/fog/aws/requests/auto_scaling/terminate_instance_in_auto_scaling_group.rb +65 -0
  94. data/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb +79 -0
  95. data/lib/fog/aws/requests/cloud_watch/get_metric_statistics.rb +48 -0
  96. data/lib/fog/aws/requests/cloud_watch/list_metrics.rb +38 -0
  97. data/lib/fog/aws/requests/cloud_watch/put_metric_data.rb +73 -0
  98. data/lib/fog/aws/requests/elb/configure_health_check.rb +24 -0
  99. data/lib/fog/aws/requests/elb/create_app_cookie_stickiness_policy.rb +21 -0
  100. data/lib/fog/aws/requests/elb/create_lb_cookie_stickiness_policy.rb +21 -0
  101. data/lib/fog/aws/requests/elb/create_load_balancer.rb +55 -0
  102. data/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb +28 -0
  103. data/lib/fog/aws/requests/elb/delete_load_balancer.rb +18 -0
  104. data/lib/fog/aws/requests/elb/delete_load_balancer_listeners.rb +20 -1
  105. data/lib/fog/aws/requests/elb/delete_load_balancer_policy.rb +23 -0
  106. data/lib/fog/aws/requests/elb/deregister_instances_from_load_balancer.rb +21 -5
  107. data/lib/fog/aws/requests/elb/describe_instance_health.rb +35 -0
  108. data/lib/fog/aws/requests/elb/describe_load_balancers.rb +29 -0
  109. data/lib/fog/aws/requests/elb/disable_availability_zones_for_load_balancer.rb +18 -5
  110. data/lib/fog/aws/requests/elb/enable_availability_zones_for_load_balancer.rb +18 -3
  111. data/lib/fog/aws/requests/elb/register_instances_with_load_balancer.rb +22 -5
  112. data/lib/fog/aws/requests/elb/set_load_balancer_listener_ssl_certificate.rb +40 -0
  113. data/lib/fog/aws/requests/elb/set_load_balancer_policies_of_listener.rb +37 -0
  114. data/lib/fog/aws/requests/iam/create_account_alias.rb +19 -0
  115. data/lib/fog/aws/requests/iam/delete_account_alias.rb +19 -0
  116. data/lib/fog/aws/requests/iam/delete_server_certificate.rb +14 -0
  117. data/lib/fog/aws/requests/iam/get_group_policy.rb +36 -0
  118. data/lib/fog/aws/requests/iam/get_server_certificate.rb +50 -0
  119. data/lib/fog/aws/requests/iam/list_account_aliases.rb +18 -0
  120. data/lib/fog/aws/requests/iam/list_server_certificates.rb +12 -0
  121. data/lib/fog/aws/requests/iam/put_group_policy.rb +1 -1
  122. data/lib/fog/aws/requests/iam/put_user_policy.rb +1 -1
  123. data/lib/fog/aws/requests/iam/upload_server_certificate.rb +53 -5
  124. data/lib/fog/aws/requests/rds/describe_db_engine_versions.rb +34 -0
  125. data/lib/fog/aws/requests/rds/describe_db_reserved_instances.rb +42 -0
  126. data/lib/fog/aws/requests/simpledb/get_attributes.rb +29 -17
  127. data/lib/fog/aws/requests/simpledb/select.rb +11 -3
  128. data/lib/fog/aws/requests/sns/add_permission.rb +26 -0
  129. data/lib/fog/aws/requests/sns/confirm_subscription.rb +33 -0
  130. data/lib/fog/aws/requests/sns/create_topic.rb +29 -0
  131. data/lib/fog/aws/requests/sns/delete_topic.rb +29 -0
  132. data/lib/fog/aws/requests/sns/get_topic_attributes.rb +29 -0
  133. data/lib/fog/aws/requests/sns/list_subscriptions.rb +29 -0
  134. data/lib/fog/aws/requests/sns/list_subscriptions_by_topic.rb +31 -0
  135. data/lib/fog/aws/requests/sns/list_topics.rb +29 -0
  136. data/lib/fog/aws/requests/sns/publish.rb +34 -0
  137. data/lib/fog/aws/requests/sns/remove_permission.rb +26 -0
  138. data/lib/fog/aws/requests/sns/set_topic_attributes.rb +33 -0
  139. data/lib/fog/aws/requests/sns/subscribe.rb +33 -0
  140. data/lib/fog/aws/requests/sns/unsubscribe.rb +29 -0
  141. data/lib/fog/aws/requests/sqs/change_message_visibility.rb +33 -0
  142. data/lib/fog/aws/requests/sqs/create_queue.rb +31 -0
  143. data/lib/fog/aws/requests/sqs/delete_message.rb +31 -0
  144. data/lib/fog/aws/requests/sqs/delete_queue.rb +29 -0
  145. data/lib/fog/aws/requests/sqs/get_queue_attributes.rb +31 -0
  146. data/lib/fog/aws/requests/sqs/list_queues.rb +28 -0
  147. data/lib/fog/aws/requests/sqs/receive_message.rb +34 -0
  148. data/lib/fog/aws/requests/sqs/send_message.rb +31 -0
  149. data/lib/fog/aws/requests/sqs/set_queue_attributes.rb +33 -0
  150. data/lib/fog/aws/sns.rb +112 -0
  151. data/lib/fog/aws/sqs.rb +115 -0
  152. data/lib/fog/bin.rb +1 -0
  153. data/lib/fog/bin/aws.rb +16 -0
  154. data/lib/fog/bin/brightbox.rb +1 -1
  155. data/lib/fog/bin/ninefold.rb +5 -0
  156. data/lib/fog/bin/vcloud.rb +30 -0
  157. data/lib/fog/bin/virtual_box.rb +5 -1
  158. data/lib/fog/cdn/rackspace.rb +16 -8
  159. data/lib/fog/compute.rb +4 -1
  160. data/lib/fog/compute/aws.rb +16 -4
  161. data/lib/fog/compute/bluebox.rb +2 -2
  162. data/lib/fog/compute/brightbox.rb +4 -4
  163. data/lib/fog/compute/go_grid.rb +2 -2
  164. data/lib/fog/compute/linode.rb +2 -2
  165. data/lib/fog/compute/models/aws/server.rb +17 -3
  166. data/lib/fog/compute/models/aws/spot_request.rb +93 -0
  167. data/lib/fog/compute/models/aws/spot_requests.rb +48 -0
  168. data/lib/fog/compute/models/aws/volume.rb +13 -13
  169. data/lib/fog/compute/models/bluebox/server.rb +4 -4
  170. data/lib/fog/compute/models/go_grid/server.rb +2 -2
  171. data/lib/fog/compute/models/ninefold/server.rb +18 -14
  172. data/lib/fog/compute/models/rackspace/flavor.rb +3 -2
  173. data/lib/fog/compute/models/rackspace/server.rb +2 -2
  174. data/lib/fog/compute/models/slicehost/server.rb +1 -1
  175. data/lib/fog/compute/models/vcloud/catalog.rb +22 -0
  176. data/lib/fog/compute/models/vcloud/catalog_item.rb +29 -0
  177. data/lib/fog/compute/models/vcloud/catalog_items.rb +32 -0
  178. data/lib/fog/compute/models/vcloud/catalogs.rb +39 -0
  179. data/lib/fog/compute/models/vcloud/ip.rb +42 -0
  180. data/lib/fog/compute/models/vcloud/ips.rb +33 -0
  181. data/lib/fog/compute/models/vcloud/network.rb +65 -0
  182. data/lib/fog/compute/models/vcloud/networks.rb +34 -0
  183. data/lib/fog/compute/models/vcloud/server.rb +291 -0
  184. data/lib/fog/compute/models/vcloud/servers.rb +58 -0
  185. data/lib/fog/compute/models/vcloud/task.rb +21 -0
  186. data/lib/fog/compute/models/vcloud/tasks.rb +32 -0
  187. data/lib/fog/compute/models/vcloud/vdc.rb +56 -0
  188. data/lib/fog/compute/models/vcloud/vdcs.rb +40 -0
  189. data/lib/fog/compute/models/virtual_box/server.rb +2 -2
  190. data/lib/fog/compute/ninefold.rb +3 -3
  191. data/lib/fog/compute/parsers/aws/cancel_spot_instance_requests.rb +30 -0
  192. data/lib/fog/compute/parsers/aws/describe_instances.rb +9 -4
  193. data/lib/fog/compute/parsers/aws/describe_placement_groups.rb +30 -0
  194. data/lib/fog/compute/parsers/aws/describe_reserved_instances.rb +1 -1
  195. data/lib/fog/compute/parsers/aws/describe_reserved_instances_offerings.rb +2 -2
  196. data/lib/fog/compute/parsers/aws/describe_spot_price_history.rb +34 -0
  197. data/lib/fog/compute/parsers/aws/purchase_reserved_instances_offering.rb +24 -0
  198. data/lib/fog/compute/parsers/aws/run_instances.rb +17 -16
  199. data/lib/fog/compute/parsers/aws/spot_datafeed_subscription.rb +29 -0
  200. data/lib/fog/compute/parsers/aws/spot_instance_requests.rb +67 -0
  201. data/lib/fog/compute/rackspace.rb +6 -5
  202. data/lib/fog/compute/requests/aws/cancel_spot_instance_requests.rb +34 -0
  203. data/lib/fog/compute/requests/aws/create_placement_group.rb +34 -0
  204. data/lib/fog/compute/requests/aws/create_spot_datafeed_subscription.rb +41 -0
  205. data/lib/fog/compute/requests/aws/delete_placement_group.rb +32 -0
  206. data/lib/fog/compute/requests/aws/delete_spot_datafeed_subscription.rb +28 -0
  207. data/lib/fog/compute/requests/aws/describe_placement_groups.rb +35 -0
  208. data/lib/fog/compute/requests/aws/describe_reserved_instances.rb +14 -0
  209. data/lib/fog/compute/requests/aws/describe_reserved_instances_offerings.rb +25 -0
  210. data/lib/fog/compute/requests/aws/describe_spot_datafeed_subscription.rb +35 -0
  211. data/lib/fog/compute/requests/aws/describe_spot_instance_requests.rb +47 -0
  212. data/lib/fog/compute/requests/aws/describe_spot_price_history.rb +37 -0
  213. data/lib/fog/compute/requests/aws/describe_volumes.rb +1 -1
  214. data/lib/fog/compute/requests/aws/purchase_reserved_instances_offering.rb +63 -0
  215. data/lib/fog/compute/requests/aws/request_spot_instances.rb +83 -0
  216. data/lib/fog/compute/requests/aws/run_instances.rb +2 -3
  217. data/lib/fog/compute/requests/brightbox/activate_console_server.rb +1 -1
  218. data/lib/fog/compute/requests/brightbox/add_listeners_load_balancer.rb +1 -1
  219. data/lib/fog/compute/requests/brightbox/add_nodes_load_balancer.rb +1 -1
  220. data/lib/fog/compute/requests/brightbox/create_api_client.rb +1 -1
  221. data/lib/fog/compute/requests/brightbox/create_cloud_ip.rb +1 -1
  222. data/lib/fog/compute/requests/brightbox/create_image.rb +1 -1
  223. data/lib/fog/compute/requests/brightbox/create_load_balancer.rb +1 -1
  224. data/lib/fog/compute/requests/brightbox/create_server.rb +1 -1
  225. data/lib/fog/compute/requests/brightbox/destroy_api_client.rb +1 -1
  226. data/lib/fog/compute/requests/brightbox/destroy_cloud_ip.rb +1 -1
  227. data/lib/fog/compute/requests/brightbox/destroy_image.rb +1 -1
  228. data/lib/fog/compute/requests/brightbox/destroy_load_balancer.rb +1 -1
  229. data/lib/fog/compute/requests/brightbox/destroy_server.rb +1 -1
  230. data/lib/fog/compute/requests/brightbox/get_account.rb +1 -1
  231. data/lib/fog/compute/requests/brightbox/get_api_client.rb +1 -1
  232. data/lib/fog/compute/requests/brightbox/get_cloud_ip.rb +1 -1
  233. data/lib/fog/compute/requests/brightbox/get_image.rb +1 -1
  234. data/lib/fog/compute/requests/brightbox/get_interface.rb +1 -1
  235. data/lib/fog/compute/requests/brightbox/get_load_balancer.rb +1 -1
  236. data/lib/fog/compute/requests/brightbox/get_server.rb +1 -1
  237. data/lib/fog/compute/requests/brightbox/get_server_type.rb +1 -1
  238. data/lib/fog/compute/requests/brightbox/get_user.rb +1 -1
  239. data/lib/fog/compute/requests/brightbox/get_zone.rb +1 -1
  240. data/lib/fog/compute/requests/brightbox/list_api_clients.rb +1 -1
  241. data/lib/fog/compute/requests/brightbox/list_cloud_ips.rb +1 -1
  242. data/lib/fog/compute/requests/brightbox/list_images.rb +1 -1
  243. data/lib/fog/compute/requests/brightbox/list_load_balancers.rb +1 -1
  244. data/lib/fog/compute/requests/brightbox/list_server_types.rb +1 -1
  245. data/lib/fog/compute/requests/brightbox/list_servers.rb +1 -1
  246. data/lib/fog/compute/requests/brightbox/list_users.rb +1 -1
  247. data/lib/fog/compute/requests/brightbox/list_zones.rb +1 -1
  248. data/lib/fog/compute/requests/brightbox/map_cloud_ip.rb +1 -1
  249. data/lib/fog/compute/requests/brightbox/remove_listeners_load_balancer.rb +1 -1
  250. data/lib/fog/compute/requests/brightbox/remove_nodes_load_balancer.rb +1 -1
  251. data/lib/fog/compute/requests/brightbox/reset_ftp_password_account.rb +1 -1
  252. data/lib/fog/compute/requests/brightbox/resize_server.rb +1 -1
  253. data/lib/fog/compute/requests/brightbox/shutdown_server.rb +1 -1
  254. data/lib/fog/compute/requests/brightbox/snapshot_server.rb +1 -1
  255. data/lib/fog/compute/requests/brightbox/start_server.rb +1 -1
  256. data/lib/fog/compute/requests/brightbox/stop_server.rb +1 -1
  257. data/lib/fog/compute/requests/brightbox/unmap_cloud_ip.rb +1 -1
  258. data/lib/fog/compute/requests/brightbox/update_account.rb +1 -1
  259. data/lib/fog/compute/requests/brightbox/update_api_client.rb +1 -1
  260. data/lib/fog/compute/requests/brightbox/update_image.rb +1 -1
  261. data/lib/fog/compute/requests/brightbox/update_load_balancer.rb +1 -1
  262. data/lib/fog/compute/requests/brightbox/update_server.rb +1 -1
  263. data/lib/fog/compute/requests/brightbox/update_user.rb +1 -1
  264. data/lib/fog/compute/requests/linode/linode_disk_createfromstackscript.rb +1 -1
  265. data/lib/fog/compute/requests/rackspace/create_image.rb +1 -1
  266. data/lib/fog/compute/requests/rackspace/create_server.rb +1 -1
  267. data/lib/fog/compute/requests/rackspace/server_action.rb +2 -2
  268. data/lib/fog/compute/requests/rackspace/update_server.rb +1 -1
  269. data/lib/fog/compute/requests/storm_on_demand/add_balancer_node.rb +1 -1
  270. data/lib/fog/compute/requests/storm_on_demand/clone_server.rb +1 -1
  271. data/lib/fog/compute/requests/storm_on_demand/create_server.rb +1 -1
  272. data/lib/fog/compute/requests/storm_on_demand/delete_server.rb +1 -1
  273. data/lib/fog/compute/requests/storm_on_demand/get_server.rb +1 -1
  274. data/lib/fog/compute/requests/storm_on_demand/get_stats.rb +1 -1
  275. data/lib/fog/compute/requests/storm_on_demand/list_balancers.rb +1 -1
  276. data/lib/fog/compute/requests/storm_on_demand/list_configs.rb +1 -1
  277. data/lib/fog/compute/requests/storm_on_demand/list_images.rb +1 -1
  278. data/lib/fog/compute/requests/storm_on_demand/list_private_ips.rb +1 -1
  279. data/lib/fog/compute/requests/storm_on_demand/list_servers.rb +1 -1
  280. data/lib/fog/compute/requests/storm_on_demand/list_templates.rb +1 -1
  281. data/lib/fog/compute/requests/storm_on_demand/reboot_server.rb +1 -1
  282. data/lib/fog/compute/requests/storm_on_demand/remove_balancer_node.rb +1 -1
  283. data/lib/fog/compute/requests/storm_on_demand/resize_server.rb +1 -1
  284. data/lib/fog/compute/requests/vcloud/clone_vapp.rb +40 -0
  285. data/lib/fog/compute/requests/vcloud/configure_network.rb +43 -0
  286. data/lib/fog/compute/requests/vcloud/configure_network_ip.rb +46 -0
  287. data/lib/fog/compute/requests/vcloud/configure_node.rb +38 -0
  288. data/lib/fog/compute/requests/vcloud/configure_vapp.rb +112 -0
  289. data/lib/fog/compute/requests/vcloud/configure_vm.rb +247 -0
  290. data/lib/fog/compute/requests/vcloud/configure_vm_disks.rb +100 -0
  291. data/lib/fog/compute/requests/vcloud/configure_vm_memory.rb +40 -0
  292. data/lib/fog/compute/requests/vcloud/configure_vm_name_description.rb +30 -0
  293. data/lib/fog/compute/requests/vcloud/delete_node.rb +10 -0
  294. data/lib/fog/compute/requests/vcloud/delete_vapp.rb +10 -0
  295. data/lib/fog/compute/requests/vcloud/get_catalog.rb +10 -0
  296. data/lib/fog/compute/requests/vcloud/get_catalog_item.rb +10 -0
  297. data/lib/fog/compute/requests/vcloud/get_customization_options.rb +10 -0
  298. data/lib/fog/compute/requests/vcloud/get_network.rb +10 -0
  299. data/lib/fog/compute/requests/vcloud/get_network_extensions.rb +11 -0
  300. data/lib/fog/compute/requests/vcloud/get_network_ip.rb +15 -0
  301. data/lib/fog/compute/requests/vcloud/get_network_ips.rb +15 -0
  302. data/lib/fog/compute/requests/vcloud/get_organization.rb +11 -0
  303. data/lib/fog/compute/requests/vcloud/get_task.rb +11 -0
  304. data/lib/fog/compute/requests/vcloud/get_task_list.rb +11 -0
  305. data/lib/fog/compute/requests/vcloud/get_vapp.rb +10 -0
  306. data/lib/fog/compute/requests/vcloud/get_vapp_template.rb +11 -0
  307. data/lib/fog/compute/requests/vcloud/get_vdc.rb +10 -0
  308. data/lib/fog/compute/requests/vcloud/get_vm_disks.rb +16 -0
  309. data/lib/fog/compute/requests/vcloud/get_vm_memory.rb +16 -0
  310. data/lib/fog/compute/requests/vcloud/instantiate_vapp_template.rb +83 -0
  311. data/lib/fog/compute/requests/vcloud/login.rb +23 -0
  312. data/lib/fog/compute/requests/vcloud/power_off.rb +10 -0
  313. data/lib/fog/compute/requests/vcloud/power_on.rb +11 -0
  314. data/lib/fog/compute/requests/vcloud/power_reset.rb +11 -0
  315. data/lib/fog/compute/requests/vcloud/power_shutdown.rb +11 -0
  316. data/lib/fog/compute/requests/vcloud/undeploy.rb +23 -0
  317. data/lib/fog/compute/storm_on_demand.rb +2 -2
  318. data/lib/fog/compute/vcloud.rb +310 -0
  319. data/lib/fog/core.rb +2 -1
  320. data/lib/fog/core/attributes.rb +23 -11
  321. data/lib/fog/core/collection.rb +7 -7
  322. data/lib/fog/core/credentials.rb +4 -2
  323. data/lib/fog/core/model.rb +4 -4
  324. data/lib/fog/core/time.rb +1 -2
  325. data/lib/fog/core/timeout.rb +11 -0
  326. data/lib/fog/core/wait_for.rb +2 -2
  327. data/lib/fog/dns/dnsimple.rb +2 -2
  328. data/lib/fog/dns/dnsmadeeasy.rb +2 -2
  329. data/lib/fog/dns/linode.rb +2 -2
  330. data/lib/fog/dns/requests/dnsimple/create_domain.rb +1 -1
  331. data/lib/fog/dns/requests/dnsimple/create_record.rb +1 -1
  332. data/lib/fog/dns/requests/dnsimple/update_record.rb +1 -1
  333. data/lib/fog/dns/requests/dnsmadeeasy/create_record.rb +1 -1
  334. data/lib/fog/dns/requests/dnsmadeeasy/create_secondary.rb +1 -1
  335. data/lib/fog/dns/requests/dnsmadeeasy/update_record.rb +1 -1
  336. data/lib/fog/dns/requests/dnsmadeeasy/update_secondary.rb +1 -1
  337. data/lib/fog/providers.rb +1 -0
  338. data/lib/fog/providers/aws.rb +15 -2
  339. data/lib/fog/providers/ninefold.rb +1 -0
  340. data/lib/fog/providers/rackspace.rb +4 -3
  341. data/lib/fog/providers/vcloud.rb +11 -0
  342. data/lib/fog/storage.rb +9 -6
  343. data/lib/fog/storage/aws.rb +18 -1
  344. data/lib/fog/storage/google.rb +19 -1
  345. data/lib/fog/storage/models/aws/file.rb +3 -3
  346. data/lib/fog/storage/models/aws/files.rb +9 -2
  347. data/lib/fog/storage/models/google/files.rb +9 -2
  348. data/lib/fog/storage/models/ninefold/directories.rb +48 -0
  349. data/lib/fog/storage/models/ninefold/directory.rb +53 -0
  350. data/lib/fog/storage/models/ninefold/file.rb +99 -0
  351. data/lib/fog/storage/models/ninefold/files.rb +72 -0
  352. data/lib/fog/storage/models/rackspace/directory.rb +7 -2
  353. data/lib/fog/storage/ninefold.rb +149 -0
  354. data/lib/fog/storage/rackspace.rb +8 -2
  355. data/lib/fog/storage/requests/aws/get_bucket_policy.rb +1 -1
  356. data/lib/fog/storage/requests/aws/get_object.rb +6 -2
  357. data/lib/fog/storage/requests/aws/get_object_http_url.rb +51 -0
  358. data/lib/fog/storage/requests/aws/get_object_https_url.rb +51 -0
  359. data/lib/fog/storage/requests/aws/get_object_url.rb +4 -24
  360. data/lib/fog/storage/requests/aws/post_object_hidden_fields.rb +1 -1
  361. data/lib/fog/storage/requests/aws/put_bucket_policy.rb +1 -1
  362. data/lib/fog/storage/requests/google/get_object_http_url.rb +51 -0
  363. data/lib/fog/storage/requests/google/get_object_https_url.rb +51 -0
  364. data/lib/fog/storage/requests/google/get_object_url.rb +8 -25
  365. data/lib/fog/storage/requests/ninefold/delete_namespace.rb +19 -0
  366. data/lib/fog/storage/requests/ninefold/get_namespace.rb +20 -0
  367. data/lib/fog/storage/requests/ninefold/post_namespace.rb +20 -0
  368. data/lib/fog/storage/requests/ninefold/put_namespace.rb +20 -0
  369. data/lib/fog/storage/requests/rackspace/put_object.rb +3 -0
  370. data/lib/fog/storage/requests/rackspace/put_object_manifest.rb +25 -0
  371. data/tests/aws/models/auto_scaling/activities_tests.rb +6 -0
  372. data/tests/aws/models/auto_scaling/configuration_test.rb +13 -0
  373. data/tests/aws/models/auto_scaling/configurations_tests.rb +11 -0
  374. data/tests/aws/models/auto_scaling/helper.rb +0 -0
  375. data/tests/aws/models/auto_scaling/instances_tests.rb +6 -0
  376. data/tests/aws/models/cloud_watch/metric_statistics_tests.rb +51 -0
  377. data/tests/aws/models/cloud_watch/metrics_tests.rb +17 -0
  378. data/tests/aws/{requests → models}/elb/model_tests.rb +82 -18
  379. data/tests/aws/models/rds/security_group_tests.rb +1 -1
  380. data/tests/aws/requests/auto_scaling/auto_scaling_tests.rb +80 -0
  381. data/tests/aws/requests/auto_scaling/helper.rb +185 -0
  382. data/tests/aws/requests/auto_scaling/model_tests.rb +235 -0
  383. data/tests/aws/requests/cloud_formation/stack_tests.rb +1 -1
  384. data/tests/aws/requests/cloud_watch/get_metric_statistics_tests.rb +28 -0
  385. data/tests/aws/requests/cloud_watch/list_metrics_test.rb +64 -0
  386. data/tests/aws/requests/cloud_watch/put_metric_data_tests.rb +36 -0
  387. data/tests/aws/requests/elb/listener_tests.rb +50 -0
  388. data/tests/aws/requests/elb/load_balancer_tests.rb +23 -44
  389. data/tests/aws/requests/elb/policy_tests.rb +41 -0
  390. data/tests/aws/requests/iam/helper.rb +29 -0
  391. data/tests/aws/requests/iam/login_profile_tests.rb +2 -2
  392. data/tests/aws/requests/iam/server_certificate_tests.rb +39 -6
  393. data/tests/aws/requests/rds/helper.rb +1 -0
  394. data/tests/aws/requests/simpledb/attributes_tests.rb +10 -15
  395. data/tests/aws/requests/sns/helper.rb +9 -0
  396. data/tests/aws/requests/sns/subscription_tests.rb +86 -0
  397. data/tests/aws/requests/sns/topic_tests.rb +50 -0
  398. data/tests/aws/requests/sqs/helper.rb +15 -0
  399. data/tests/aws/requests/sqs/message_tests.rb +57 -0
  400. data/tests/aws/requests/sqs/queue_tests.rb +55 -0
  401. data/tests/aws/signed_params_tests.rb +3 -1
  402. data/tests/compute/models/aws/volume_tests.rb +13 -0
  403. data/tests/compute/models/vcloud/helper.rb +25 -0
  404. data/tests/compute/models/vcloud/servers_tests.rb +95 -0
  405. data/tests/compute/requests/aws/address_tests.rb +1 -1
  406. data/tests/compute/requests/aws/instance_tests.rb +65 -4
  407. data/tests/compute/requests/aws/placement_group_tests.rb +48 -0
  408. data/tests/compute/requests/aws/spot_datafeed_subscription_tests.rb +47 -0
  409. data/tests/compute/requests/aws/spot_instance_tests.rb +53 -0
  410. data/tests/compute/requests/aws/spot_price_history_tests.rb +24 -0
  411. data/tests/compute/requests/aws/volume_tests.rb +4 -0
  412. data/tests/compute/requests/brightbox/helper.rb +2 -1
  413. data/tests/compute/requests/brightbox/interface_tests.rb +4 -4
  414. data/tests/compute/requests/ninefold/helper.rb +1 -1
  415. data/tests/compute/requests/vcloud/disk_configure_tests.rb +114 -0
  416. data/tests/compute/requests/voxel/server_tests.rb +2 -2
  417. data/tests/core/attribute_tests.rb +10 -1
  418. data/tests/core/credential_tests.rb +6 -0
  419. data/tests/core/timeout_tests.rb +10 -0
  420. data/tests/helpers/collection_helper.rb +4 -1
  421. data/tests/helpers/formats_helper.rb +1 -1
  422. data/tests/helpers/mock_helper.rb +5 -0
  423. data/tests/storage/helper.rb +4 -1
  424. data/tests/storage/models/ninefold/file_update_tests.rb +19 -0
  425. data/tests/storage/models/ninefold/nested_directories_tests.rb +23 -0
  426. data/tests/storage/requests/aws/multipart_upload_tests.rb +2 -5
  427. data/tests/storage/requests/rackspace/large_object_tests.rb +47 -0
  428. metadata +366 -105
@@ -0,0 +1,23 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+
7
+
8
+ def login
9
+ unauthenticated_request({
10
+ :expects => 200,
11
+ :headers => {
12
+ 'Authorization' => authorization_header
13
+ },
14
+ :method => 'POST',
15
+ :parse => true,
16
+ :uri => "#{base_url}/login"
17
+ })
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+ basic_request :power_off, 202, 'POST'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+ basic_request :power_on, 202, 'POST'
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+ basic_request :power_reset, 202, 'POST'
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+ basic_request :power_shutdown, 204, 'POST'
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+ class Real
5
+ def undeploy(vapp_uri, save_state = false)
6
+ # builder = Builder::XmlMarkup.new
7
+ # builder.UndeployVAppParams(:xmlns => 'http://www.vmware.com/vcloud/v1',
8
+ # :saveState => save_state) {}
9
+ builder = "<UndeployVAppParams saveState=\"#{save_state.to_s}\" xmlns=\"http://www.vmware.com/vcloud/v1\"/>"
10
+
11
+ request(
12
+ :body => builder,
13
+ :expects => 202,
14
+ :headers => {'Content-Type' => 'application/vnd.vmware.vcloud.undeployVAppParams+xml' },
15
+ :method => 'POST',
16
+ :uri => vapp_uri + '/action/undeploy',
17
+ :parse => true
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -82,7 +82,7 @@ module Fog
82
82
  class Real
83
83
 
84
84
  def initialize(options={})
85
- require 'json'
85
+ require 'multi_json'
86
86
  uri = URI.parse(options[:storm_on_demand_auth_url] ||= API_URL)
87
87
  @host = uri.host
88
88
  @path = uri.path
@@ -118,7 +118,7 @@ module Fog
118
118
  end
119
119
  end
120
120
  unless response.body.empty?
121
- response.body = JSON.parse(response.body)
121
+ response.body = MultiJson.decode(response.body)
122
122
  end
123
123
  if response.body.keys.include?('full_error')
124
124
  raise(Fog::Compute::StormOnDemand::Error, response.body.inspect)
@@ -0,0 +1,310 @@
1
+ require 'fog/core'
2
+
3
+ module Fog
4
+ module Vcloud
5
+ class Collection < Fog::Collection
6
+
7
+ def load(objects)
8
+ objects = [ objects ] if objects.is_a?(Hash)
9
+ super
10
+ end
11
+
12
+ def check_href!(opts = {})
13
+ self.href = connection.default_vdc_href unless href
14
+ unless href
15
+ if opts.is_a?(String)
16
+ t = Hash.new
17
+ t[:parent] = opts
18
+ opts = t
19
+ end
20
+ msg = ":href missing, call with a :href pointing to #{if opts[:message]
21
+ opts[:message]
22
+ elsif opts[:parent]
23
+ "the #{opts[:parent]} whos #{self.class.to_s.split('::').last.downcase} you want to enumerate"
24
+ else
25
+ "the resource"
26
+ end}"
27
+ raise Fog::Errors::Error.new(msg)
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+
35
+ module Fog
36
+ module Vcloud
37
+ class Model < Fog::Model
38
+
39
+ attr_accessor :loaded
40
+ alias_method :loaded?, :loaded
41
+
42
+ def reload
43
+ instance = super
44
+ @loaded = true
45
+ instance
46
+ end
47
+
48
+ def load_unless_loaded!
49
+ unless @loaded
50
+ reload
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+
58
+ module Fog
59
+ module Vcloud
60
+ class Compute < Fog::Service
61
+
62
+ PATH = '/api/v1.0'
63
+ PORT = 443
64
+ SCHEME = 'https'
65
+
66
+ requires :vcloud_username, :vcloud_password, :vcloud_host
67
+ recognizes :vcloud_port, :vcloud_scheme, :vcloud_path, :vcloud_default_vdc
68
+ recognizes :provider # remove post deprecation
69
+
70
+ model_path 'fog/compute/models/vcloud'
71
+ model :catalog
72
+ require 'fog/compute/models/vcloud/catalog' # why do I need to do this?
73
+ collection :catalogs
74
+ model :catalog_item
75
+ model :catalog_items
76
+ model :ip
77
+ collection :ips
78
+ model :network
79
+ collection :networks
80
+ model :server
81
+ collection :servers
82
+ model :task
83
+ collection :tasks
84
+ model :vdc
85
+ collection :vdcs
86
+
87
+ request_path 'fog/compute/requests/vcloud'
88
+ request :clone_vapp
89
+ request :configure_network
90
+ request :configure_network_ip
91
+ request :configure_vapp
92
+ request :configure_vm_memory
93
+ request :configure_vm_name_description
94
+ request :configure_vm_disks
95
+ request :delete_vapp
96
+ request :get_catalog
97
+ request :get_catalog_item
98
+ request :get_customization_options
99
+ request :get_network
100
+ request :get_network_ip
101
+ request :get_network_ips
102
+ request :get_network_extensions
103
+ request :get_organization
104
+ request :get_task
105
+ request :get_task_list
106
+ request :get_vapp
107
+ request :get_vapp_template
108
+ request :get_vm_disks
109
+ request :get_vm_memory
110
+ request :get_vdc
111
+ request :instantiate_vapp_template
112
+ request :login
113
+ request :power_off
114
+ request :power_on
115
+ request :power_reset
116
+ request :power_shutdown
117
+ request :undeploy
118
+
119
+ class Mock
120
+
121
+ def initialize(options={})
122
+ Fog::Mock.not_implemented
123
+ end
124
+
125
+ end
126
+
127
+ class Real
128
+
129
+ class << self
130
+
131
+ def basic_request(*args)
132
+ self.class_eval <<-EOS, __FILE__,__LINE__
133
+ def #{args[0]}(uri)
134
+ request({
135
+ :expects => #{args[1] || 200},
136
+ :method => '#{args[2] || 'GET'}',
137
+ :headers => #{args[3] ? args[3].inspect : '{}'},
138
+ :body => '#{args[4] ? args[4] : ''}',
139
+ :parse => true,
140
+ :uri => uri })
141
+ end
142
+ EOS
143
+ end
144
+
145
+ def unauthenticated_basic_request(*args)
146
+ self.class_eval <<-EOS, __FILE__,__LINE__
147
+ def #{args[0]}(uri)
148
+ unauthenticated_request({
149
+ :expects => #{args[1] || 200},
150
+ :method => '#{args[2] || 'GET'}',
151
+ :headers => #{args[3] ? args[3].inspect : '{}'},
152
+ :parse => true,
153
+ :uri => uri })
154
+ end
155
+ EOS
156
+ end
157
+
158
+ end
159
+
160
+ def initialize(options = {})
161
+ require 'builder'
162
+ require 'fog/core/parser'
163
+
164
+ @connections = {}
165
+ @persistent = options[:persistent]
166
+
167
+ @username = options[:vcloud_username]
168
+ @password = options[:vcloud_password]
169
+ @host = options[:vcloud_host]
170
+ @vdc_href = options[:vcloud_default_vdc]
171
+ @path = options[:vcloud_path] || Fog::Vcloud::Compute::PATH
172
+ @port = options[:vcloud_port] || Fog::Vcloud::Compute::PORT
173
+ @scheme = options[:vcloud_scheme] || Fog::Vcloud::Compute::SCHEME
174
+ end
175
+
176
+ def reload
177
+ @connections.each_value { |k,v| v.reset if v }
178
+ end
179
+
180
+ def default_organization_uri
181
+ @default_organization_uri ||= begin
182
+ unless @login_results
183
+ do_login
184
+ end
185
+ case @login_results.body[:Org]
186
+ when Array
187
+ @login_results.body[:Org].first[:href]
188
+ when Hash
189
+ @login_results.body[:Org][:href]
190
+ else
191
+ nil
192
+ end
193
+ end
194
+ end
195
+
196
+ def default_vdc_href
197
+ @vdc_href
198
+ end
199
+
200
+ # login handles the auth, but we just need the Set-Cookie
201
+ # header from that call.
202
+ def do_login
203
+ @login_results = login
204
+ @cookie = @login_results.headers['Set-Cookie']
205
+ end
206
+
207
+ def ensure_unparsed(uri)
208
+ if uri.is_a?(String)
209
+ uri
210
+ else
211
+ uri.to_s
212
+ end
213
+ end
214
+
215
+ def xmlns
216
+ { "xmlns" => "http://www.vmware.com/vcloud/v1",
217
+ "xmlns:ovf" => "http://schemas.dmtf.org/ovf/envelope/1",
218
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
219
+ "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" }
220
+ end
221
+
222
+ # If the cookie isn't set, do a get_organizations call to set it
223
+ # and try the request.
224
+ # If we get an Unauthorized error, we assume the token expired, re-auth and try again
225
+ def request(params)
226
+ unless @cookie
227
+ do_login
228
+ end
229
+ begin
230
+ do_request(params)
231
+ rescue Excon::Errors::Unauthorized => e
232
+ do_login
233
+ do_request(params)
234
+ end
235
+ end
236
+
237
+ private
238
+
239
+ def ensure_parsed(uri)
240
+ if uri.is_a?(String)
241
+ URI.parse(uri)
242
+ else
243
+ uri
244
+ end
245
+ end
246
+
247
+ # Don't need to set the cookie for these or retry them if the cookie timed out
248
+ def unauthenticated_request(params)
249
+ do_request(params)
250
+ end
251
+
252
+ def base_url
253
+ "#{@scheme}://#{@host}:#{@port}#{@path}"
254
+ end
255
+
256
+ # Use this to set the Authorization header for login
257
+ def authorization_header
258
+ "Basic #{Base64.encode64("#{@username}:#{@password}").chomp!}"
259
+ end
260
+
261
+ # Actually do the request
262
+ def do_request(params)
263
+ # Convert the uri to a URI if it's a string.
264
+ if params[:uri].is_a?(String)
265
+ params[:uri] = URI.parse(params[:uri])
266
+ end
267
+ host_url = "#{params[:uri].scheme}://#{params[:uri].host}#{params[:uri].port ? ":#{params[:uri].port}" : ''}"
268
+
269
+ # Hash connections on the host_url ... There's nothing to say we won't get URI's that go to
270
+ # different hosts.
271
+ @connections[host_url] ||= Fog::Connection.new(host_url, @persistent)
272
+
273
+ # Set headers to an empty hash if none are set.
274
+ headers = params[:headers] || {}
275
+
276
+ # Add our auth cookie to the headers
277
+ if @cookie
278
+ headers.merge!('Cookie' => @cookie)
279
+ end
280
+
281
+ # Make the request
282
+ response = @connections[host_url].request({
283
+ :body => params[:body] || '',
284
+ :expects => params[:expects] || 200,
285
+ :headers => headers,
286
+ :method => params[:method] || 'GET',
287
+ :path => params[:uri].path
288
+ })
289
+
290
+ # Parse the response body into a hash
291
+ #puts response.body
292
+ unless response.body.empty?
293
+ if params[:parse]
294
+ document = Fog::ToHashDocument.new
295
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
296
+ parser << response.body
297
+ parser.finish
298
+
299
+ response.body = document.body
300
+ end
301
+ end
302
+
303
+ response
304
+ end
305
+
306
+ end
307
+
308
+ end
309
+ end
310
+ end
@@ -25,10 +25,11 @@ require 'fog/core/errors'
25
25
  require 'fog/core/hmac'
26
26
  require 'fog/core/model'
27
27
  require 'fog/core/mock'
28
- # require 'fog/core/parser'
28
+ require 'fog/core/parser' # FIXME: would be better to only load when nokogiri is required
29
29
  require 'fog/core/provider'
30
30
  require 'fog/core/service'
31
31
  require 'fog/core/ssh'
32
32
  require 'fog/core/scp'
33
33
  require 'fog/core/time'
34
+ require 'fog/core/timeout'
34
35
  require 'fog/core/wait_for'
@@ -71,8 +71,10 @@ module Fog
71
71
  class_eval <<-EOS, __FILE__, __LINE__
72
72
  def #{name}=(new_data)
73
73
  if new_data.is_a?(Hash)
74
- if new_data[:#{squash}] || new_data["#{squash}"]
75
- attributes[:#{name}] = new_data[:#{squash}] || new_data["#{squash}"]
74
+ if new_data.has_key?(:#{squash})
75
+ attributes[:#{name}] = new_data[:#{squash}]
76
+ elsif new_data.has_key?("#{squash}")
77
+ attributes[:#{name}] = new_data["#{squash}"]
76
78
  else
77
79
  attributes[:#{name}] = [ new_data ]
78
80
  end
@@ -156,23 +158,33 @@ module Fog
156
158
 
157
159
  # check that the attributes specified in args exist and is not nil
158
160
  def requires(*args)
161
+ missing = missing_attributes(args)
162
+ if missing.length == 1
163
+ raise(ArgumentError, "#{missing.first} is required for this operation")
164
+ elsif missing.any?
165
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} and #{missing[-1]} are required for this operation")
166
+ end
167
+ end
168
+
169
+ def requires_one(*args)
170
+ missing = missing_attributes(args)
171
+ if missing.length == args.length
172
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} or #{missing[-1]} are required for this operation")
173
+ end
174
+ end
175
+
176
+ protected
177
+
178
+ def missing_attributes(args)
159
179
  missing = []
160
180
  for arg in [:connection] | args
161
181
  unless send("#{arg}") || attributes.has_key?(arg)
162
182
  missing << arg
163
183
  end
164
184
  end
165
- unless missing.empty?
166
- if missing.length == 1
167
- raise(ArgumentError, "#{missing.first} is required for this operation")
168
- else
169
- raise(ArgumentError, "#{missing[0...-1].join(", ")} and #{missing[-1]} are required for this operation")
170
- end
171
- end
185
+ missing
172
186
  end
173
187
 
174
- protected
175
-
176
188
  def dup_attributes!
177
189
  @attributes = @attributes.dup
178
190
  end