fog 1.14.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +2 -2
  3. data/changelog.txt +296 -0
  4. data/fog.gemspec +2 -2
  5. data/lib/fog/atmos/models/storage/file.rb +2 -2
  6. data/lib/fog/aws/compute.rb +42 -2
  7. data/lib/fog/aws/elb.rb +3 -0
  8. data/lib/fog/aws/elb/policy_types.rb +441 -430
  9. data/lib/fog/aws/models/auto_scaling/activities.rb +11 -3
  10. data/lib/fog/aws/models/auto_scaling/groups.rb +6 -3
  11. data/lib/fog/aws/models/auto_scaling/policies.rb +7 -3
  12. data/lib/fog/aws/models/compute/flavors.rb +19 -0
  13. data/lib/fog/aws/models/compute/volume.rb +1 -1
  14. data/lib/fog/aws/models/elb/backend_server_description.rb +11 -0
  15. data/lib/fog/aws/models/elb/backend_server_descriptions.rb +22 -0
  16. data/lib/fog/aws/models/elb/load_balancer.rb +15 -2
  17. data/lib/fog/aws/models/elb/policies.rb +28 -13
  18. data/lib/fog/aws/models/elb/policy.rb +20 -10
  19. data/lib/fog/aws/models/rds/instance_option.rb +21 -0
  20. data/lib/fog/aws/models/rds/instance_options.rb +30 -0
  21. data/lib/fog/aws/models/rds/server.rb +1 -0
  22. data/lib/fog/aws/parsers/auto_scaling/describe_policies.rb +5 -5
  23. data/lib/fog/aws/parsers/compute/describe_account_attributes.rb +42 -0
  24. data/lib/fog/aws/parsers/elb/describe_load_balancers.rb +44 -13
  25. data/lib/fog/aws/parsers/rds/db_parser.rb +28 -6
  26. data/lib/fog/aws/parsers/rds/describe_orderable_db_instance_options.rb +47 -0
  27. data/lib/fog/aws/rds.rb +5 -0
  28. data/lib/fog/aws/requests/auto_scaling/describe_auto_scaling_groups.rb +9 -1
  29. data/lib/fog/aws/requests/auto_scaling/describe_policies.rb +15 -1
  30. data/lib/fog/aws/requests/compute/describe_account_attributes.rb +49 -0
  31. data/lib/fog/aws/requests/elb/create_app_cookie_stickiness_policy.rb +0 -2
  32. data/lib/fog/aws/requests/elb/create_lb_cookie_stickiness_policy.rb +0 -2
  33. data/lib/fog/aws/requests/elb/create_load_balancer.rb +30 -9
  34. data/lib/fog/aws/requests/elb/create_load_balancer_policy.rb +11 -8
  35. data/lib/fog/aws/requests/elb/describe_load_balancers.rb +21 -1
  36. data/lib/fog/aws/requests/elb/set_load_balancer_policies_for_backend_server.rb +67 -0
  37. data/lib/fog/aws/requests/iam/upload_server_certificate.rb +1 -1
  38. data/lib/fog/aws/requests/rds/describe_orderable_db_instance_options.rb +76 -0
  39. data/lib/fog/aws/requests/ses/verify_domain_identity.rb +1 -1
  40. data/lib/fog/bin/rackspace.rb +4 -0
  41. data/lib/fog/brightbox/models/compute/collaboration.rb +10 -2
  42. data/lib/fog/brightbox/models/compute/collaborations.rb +26 -2
  43. data/lib/fog/brightbox/models/compute/user_collaboration.rb +16 -1
  44. data/lib/fog/brightbox/models/compute/user_collaborations.rb +10 -2
  45. data/lib/fog/cloudstack/models/compute/server.rb +4 -0
  46. data/lib/fog/cloudstack/models/compute/servers.rb +1 -1
  47. data/lib/fog/compute/models/server.rb +16 -10
  48. data/lib/fog/core.rb +1 -0
  49. data/lib/fog/core/collection.rb +18 -0
  50. data/lib/fog/core/credentials.rb +6 -1
  51. data/lib/fog/core/mock.rb +16 -0
  52. data/lib/fog/digitalocean/compute.rb +32 -3
  53. data/lib/fog/digitalocean/models/compute/server.rb +43 -14
  54. data/lib/fog/digitalocean/models/compute/servers.rb +27 -4
  55. data/lib/fog/digitalocean/models/compute/ssh_keys.rb +2 -3
  56. data/lib/fog/digitalocean/requests/compute/create_server.rb +9 -7
  57. data/lib/fog/digitalocean/requests/compute/destroy_server.rb +3 -0
  58. data/lib/fog/digitalocean/requests/compute/list_images.rb +6 -6
  59. data/lib/fog/dnsimple/dns.rb +4 -1
  60. data/lib/fog/dnsimple/models/dns/record.rb +3 -3
  61. data/lib/fog/dnsimple/requests/dns/create_domain.rb +36 -0
  62. data/lib/fog/dnsimple/requests/dns/create_record.rb +27 -0
  63. data/lib/fog/dnsimple/requests/dns/delete_domain.rb +12 -0
  64. data/lib/fog/dnsimple/requests/dns/delete_record.rb +12 -0
  65. data/lib/fog/dnsimple/requests/dns/get_domain.rb +12 -0
  66. data/lib/fog/dnsimple/requests/dns/get_record.rb +24 -0
  67. data/lib/fog/dnsimple/requests/dns/list_domains.rb +12 -0
  68. data/lib/fog/dnsimple/requests/dns/list_records.rb +12 -0
  69. data/lib/fog/dnsimple/requests/dns/update_record.rb +20 -0
  70. data/lib/fog/glesys/models/compute/server.rb +6 -0
  71. data/lib/fog/google/README.md +28 -0
  72. data/lib/fog/google/Rakefile +17 -0
  73. data/lib/fog/google/compute.rb +5 -0
  74. data/lib/fog/google/examples/bootstrap.rb +9 -0
  75. data/lib/fog/google/examples/create.rb +37 -0
  76. data/lib/fog/google/examples/eric-fail.rb +19 -0
  77. data/lib/fog/google/examples/get_list_images.rb +27 -0
  78. data/lib/fog/google/examples/get_list_snapshots.rb +20 -0
  79. data/lib/fog/google/examples/image_create.rb +18 -0
  80. data/lib/fog/google/examples/launch_micro_instance.rb +26 -0
  81. data/lib/fog/google/examples/metadata.rb +18 -0
  82. data/lib/fog/google/examples/network.rb +21 -0
  83. data/lib/fog/google/models/compute/disk.rb +16 -5
  84. data/lib/fog/google/models/compute/disks.rb +16 -6
  85. data/lib/fog/google/models/compute/flavors.rb +2 -1
  86. data/lib/fog/google/models/compute/image.rb +36 -18
  87. data/lib/fog/google/models/compute/images.rb +38 -5
  88. data/lib/fog/google/models/compute/server.rb +20 -6
  89. data/lib/fog/google/models/compute/servers.rb +8 -5
  90. data/lib/fog/google/models/compute/snapshot.rb +36 -0
  91. data/lib/fog/google/models/compute/snapshots.rb +28 -0
  92. data/lib/fog/google/models/storage/file.rb +7 -1
  93. data/lib/fog/google/parsers/storage/access_control_list.rb +2 -2
  94. data/lib/fog/google/requests/compute/delete_disk.rb +5 -1
  95. data/lib/fog/google/requests/compute/get_disk.rb +2 -1
  96. data/lib/fog/google/requests/compute/get_snapshot.rb +34 -0
  97. data/lib/fog/google/requests/compute/insert_disk.rb +23 -7
  98. data/lib/fog/google/requests/compute/insert_image.rb +16 -9
  99. data/lib/fog/google/requests/compute/insert_server.rb +22 -10
  100. data/lib/fog/google/requests/compute/list_disks.rb +1 -1
  101. data/lib/fog/google/requests/compute/list_images.rb +3 -2
  102. data/lib/fog/google/requests/compute/list_snapshots.rb +30 -0
  103. data/lib/fog/openstack.rb +11 -2
  104. data/lib/fog/openstack/network.rb +23 -0
  105. data/lib/fog/openstack/requests/compute/add_flavor_access.rb +1 -1
  106. data/lib/fog/openstack/requests/compute/create_volume.rb +8 -7
  107. data/lib/fog/openstack/requests/compute/list_tenants_with_flavor_access.rb +1 -1
  108. data/lib/fog/openstack/requests/compute/remove_flavor_access.rb +1 -1
  109. data/lib/fog/openstack/requests/image/create_image.rb +23 -23
  110. data/lib/fog/openstack/requests/image/update_image.rb +31 -33
  111. data/lib/fog/openstack/requests/network/delete_quota.rb +26 -0
  112. data/lib/fog/openstack/requests/network/get_quota.rb +31 -0
  113. data/lib/fog/openstack/requests/network/get_quotas.rb +31 -0
  114. data/lib/fog/openstack/requests/network/update_quota.rb +33 -0
  115. data/lib/fog/openstack/requests/storage/get_object_https_url.rb +3 -3
  116. data/lib/fog/openstack/requests/storage/post_set_meta_temp_url_key.rb +1 -1
  117. data/lib/fog/openstack/requests/storage/put_object.rb +8 -5
  118. data/lib/fog/openstack/storage.rb +10 -9
  119. data/lib/fog/rackspace.rb +15 -5
  120. data/lib/fog/rackspace/block_storage.rb +8 -4
  121. data/lib/fog/rackspace/cdn.rb +21 -4
  122. data/lib/fog/rackspace/compute.rb +4 -4
  123. data/lib/fog/rackspace/compute_v2.rb +15 -4
  124. data/lib/fog/rackspace/databases.rb +4 -4
  125. data/lib/fog/rackspace/dns.rb +6 -6
  126. data/lib/fog/rackspace/errors.rb +12 -5
  127. data/lib/fog/rackspace/load_balancers.rb +4 -4
  128. data/lib/fog/rackspace/mock_data.rb +18 -7
  129. data/lib/fog/rackspace/models/compute_v2/key_pair.rb +56 -0
  130. data/lib/fog/rackspace/models/compute_v2/key_pairs.rb +43 -0
  131. data/lib/fog/rackspace/models/compute_v2/server.rb +7 -2
  132. data/lib/fog/rackspace/models/compute_v2/servers.rb +2 -1
  133. data/lib/fog/rackspace/models/identity/service_catalog.rb +34 -16
  134. data/lib/fog/rackspace/models/monitoring/agent_token.rb +40 -0
  135. data/lib/fog/rackspace/models/monitoring/agent_tokens.rb +28 -0
  136. data/lib/fog/rackspace/models/monitoring/alarm.rb +59 -0
  137. data/lib/fog/rackspace/models/monitoring/alarm_example.rb +26 -0
  138. data/lib/fog/rackspace/models/monitoring/alarm_examples.rb +31 -0
  139. data/lib/fog/rackspace/models/monitoring/alarms.rb +40 -0
  140. data/lib/fog/rackspace/models/monitoring/base.rb +30 -0
  141. data/lib/fog/rackspace/models/monitoring/check.rb +75 -0
  142. data/lib/fog/rackspace/models/monitoring/check_type.rb +15 -0
  143. data/lib/fog/rackspace/models/monitoring/check_types.rb +23 -0
  144. data/lib/fog/rackspace/models/monitoring/checks.rb +40 -0
  145. data/lib/fog/rackspace/models/monitoring/data_point.rb +18 -0
  146. data/lib/fog/rackspace/models/monitoring/data_points.rb +49 -0
  147. data/lib/fog/rackspace/models/monitoring/entities.rb +48 -0
  148. data/lib/fog/rackspace/models/monitoring/entity.rb +64 -0
  149. data/lib/fog/rackspace/models/monitoring/metric.rb +25 -0
  150. data/lib/fog/rackspace/models/monitoring/metrics.rb +27 -0
  151. data/lib/fog/rackspace/monitoring.rb +153 -0
  152. data/lib/fog/rackspace/requests/compute_v2/create_keypair.rb +53 -0
  153. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +10 -8
  154. data/lib/fog/rackspace/requests/compute_v2/delete_keypair.rb +36 -0
  155. data/lib/fog/rackspace/requests/compute_v2/get_keypair.rb +41 -0
  156. data/lib/fog/rackspace/requests/compute_v2/list_keypairs.rb +37 -0
  157. data/lib/fog/rackspace/requests/monitoring/create_agent_token.rb +19 -0
  158. data/lib/fog/rackspace/requests/monitoring/create_alarm.rb +19 -0
  159. data/lib/fog/rackspace/requests/monitoring/create_check.rb +19 -0
  160. data/lib/fog/rackspace/requests/monitoring/create_entity.rb +19 -0
  161. data/lib/fog/rackspace/requests/monitoring/delete_agent_token.rb +17 -0
  162. data/lib/fog/rackspace/requests/monitoring/delete_alarm.rb +18 -0
  163. data/lib/fog/rackspace/requests/monitoring/delete_check.rb +17 -0
  164. data/lib/fog/rackspace/requests/monitoring/delete_entity.rb +17 -0
  165. data/lib/fog/rackspace/requests/monitoring/evaluate_alarm_example.rb +21 -0
  166. data/lib/fog/rackspace/requests/monitoring/get_agent_token.rb +19 -0
  167. data/lib/fog/rackspace/requests/monitoring/get_alarm.rb +19 -0
  168. data/lib/fog/rackspace/requests/monitoring/get_alarm_example.rb +19 -0
  169. data/lib/fog/rackspace/requests/monitoring/get_check.rb +19 -0
  170. data/lib/fog/rackspace/requests/monitoring/get_entity.rb +19 -0
  171. data/lib/fog/rackspace/requests/monitoring/list_agent_tokens.rb +19 -0
  172. data/lib/fog/rackspace/requests/monitoring/list_alarm_examples.rb +18 -0
  173. data/lib/fog/rackspace/requests/monitoring/list_alarms.rb +18 -0
  174. data/lib/fog/rackspace/requests/monitoring/list_check_types.rb +17 -0
  175. data/lib/fog/rackspace/requests/monitoring/list_checks.rb +18 -0
  176. data/lib/fog/rackspace/requests/monitoring/list_data_points.rb +18 -0
  177. data/lib/fog/rackspace/requests/monitoring/list_entities.rb +19 -0
  178. data/lib/fog/rackspace/requests/monitoring/list_metrics.rb +18 -0
  179. data/lib/fog/rackspace/requests/monitoring/list_notification_plans.rb +18 -0
  180. data/lib/fog/rackspace/requests/monitoring/list_overview.rb +19 -0
  181. data/lib/fog/rackspace/requests/monitoring/update_alarm.rb +18 -0
  182. data/lib/fog/rackspace/requests/monitoring/update_check.rb +18 -0
  183. data/lib/fog/rackspace/requests/monitoring/update_entity.rb +18 -0
  184. data/lib/fog/rackspace/requests/storage/put_object.rb +1 -1
  185. data/lib/fog/rackspace/storage.rb +8 -4
  186. data/lib/fog/vcloud/compute.rb +1 -1
  187. data/lib/fog/vcloud/examples/README.md +54 -0
  188. data/lib/fog/vcloud/examples/creating_a_connection.md +20 -0
  189. data/lib/fog/vcloud/examples/creating_a_vapp.md +17 -0
  190. data/lib/fog/vcloud/examples/get_network_information.md +10 -0
  191. data/lib/fog/vcloud/examples/get_vapp_information.md +10 -0
  192. data/lib/fog/vcloud/examples/more_on_vapps.md +23 -0
  193. data/lib/fog/vcloud/requests/compute/configure_vm.rb +2 -2
  194. data/lib/fog/version.rb +1 -1
  195. data/lib/fog/vsphere/compute.rb +131 -0
  196. data/lib/fog/vsphere/models/compute/server.rb +5 -1
  197. data/lib/fog/vsphere/requests/compute/get_datacenter.rb +3 -1
  198. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +21 -37
  199. data/lib/fog/vsphere/requests/compute/list_datacenters.rb +1 -0
  200. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +8 -114
  201. data/lib/fog/vsphere/requests/compute/vm_clone.rb +18 -9
  202. data/lib/fog/vsphere/requests/compute/vm_power_off.rb +2 -0
  203. data/lib/fog/xenserver/compute.rb +14 -12
  204. data/lib/fog/xenserver/models/compute/console.rb +27 -0
  205. data/lib/fog/xenserver/models/compute/consoles.rb +25 -0
  206. data/lib/fog/xenserver/models/compute/server.rb +6 -2
  207. data/lib/fog/xenserver/models/compute/servers.rb +5 -0
  208. data/lib/fog/xenserver/requests/compute/create_server.rb +4 -0
  209. data/lib/fog/xml/sax_parser_connection.rb +3 -0
  210. data/lib/tasks/changelog_task.rb +1 -0
  211. data/tests/aws/models/compute/volume_tests.rb +1 -1
  212. data/tests/aws/models/elb/model_tests.rb +33 -1
  213. data/tests/aws/models/rds/instance_option_tests.rb +14 -0
  214. data/tests/aws/parsers/elb/describe_load_balancers.rb +65 -0
  215. data/tests/aws/requests/compute/client_tests.rb +25 -0
  216. data/tests/aws/requests/elb/helper.rb +2 -1
  217. data/tests/aws/requests/elb/listener_tests.rb +1 -1
  218. data/tests/aws/requests/elb/load_balancer_tests.rb +5 -1
  219. data/tests/aws/requests/elb/policy_tests.rb +85 -6
  220. data/tests/aws/requests/iam/helper.rb +4 -1
  221. data/tests/aws/requests/iam/server_certificate_tests.rb +2 -2
  222. data/tests/aws/requests/rds/helper.rb +22 -0
  223. data/tests/aws/requests/rds/instance_option_tests.rb +21 -0
  224. data/tests/core/credential_tests.rb +21 -0
  225. data/tests/core/mocking_tests.rb +15 -0
  226. data/tests/core/service_tests.rb +26 -0
  227. data/tests/digitalocean/helper.rb +23 -16
  228. data/tests/digitalocean/models/compute/flavor_tests.rb +2 -2
  229. data/tests/digitalocean/models/compute/image_tests.rb +2 -2
  230. data/tests/digitalocean/models/compute/region_tests.rb +2 -2
  231. data/tests/digitalocean/models/compute/server_tests.rb +11 -3
  232. data/tests/digitalocean/models/compute/servers_tests.rb +14 -28
  233. data/tests/digitalocean/models/compute/ssh_key_tests.rb +7 -3
  234. data/tests/digitalocean/models/compute/ssh_keys_tests.rb +5 -1
  235. data/tests/digitalocean/requests/compute/create_server_tests.rb +3 -6
  236. data/tests/digitalocean/requests/compute/destroy_server_tests.rb +1 -2
  237. data/tests/digitalocean/requests/compute/get_server_details_tests.rb +1 -1
  238. data/tests/digitalocean/requests/compute/get_ssh_key_tests.rb +4 -1
  239. data/tests/digitalocean/requests/compute/list_ssh_keys_tests.rb +5 -2
  240. data/tests/dnsimple/requests/dns/dns_tests.rb +30 -26
  241. data/tests/helper.rb +2 -2
  242. data/tests/helpers/collection_helper.rb +4 -4
  243. data/tests/helpers/mock_helper.rb +2 -0
  244. data/tests/openstack/authenticate_tests.rb +22 -0
  245. data/tests/openstack/requests/compute/flavor_tests.rb +27 -12
  246. data/tests/openstack/requests/compute/volume_tests.rb +10 -12
  247. data/tests/openstack/requests/image/image_tests.rb +30 -15
  248. data/tests/openstack/requests/network/quota_tests.rb +65 -0
  249. data/tests/openstack/requests/storage/object_tests.rb +27 -2
  250. data/tests/rackspace/block_storage_tests.rb +2 -1
  251. data/tests/rackspace/cdn_tests.rb +9 -0
  252. data/tests/rackspace/compute_v2_tests.rb +16 -15
  253. data/tests/rackspace/databases_tests.rb +1 -1
  254. data/tests/rackspace/load_balancer_tests.rb +1 -1
  255. data/tests/rackspace/models/compute_v2/keypairs_tests.rb +47 -0
  256. data/tests/rackspace/models/identity/service_catalog_tests.rb +54 -29
  257. data/tests/rackspace/models/monitoring/agent_token_tests.rb +9 -0
  258. data/tests/rackspace/models/monitoring/agent_tokens_tests.rb +9 -0
  259. data/tests/rackspace/models/monitoring/alarm_example_tests.rb +18 -0
  260. data/tests/rackspace/models/monitoring/alarm_examples_tests.rb +19 -0
  261. data/tests/rackspace/models/monitoring/alarm_tests.rb +56 -0
  262. data/tests/rackspace/models/monitoring/alarms_tests.rb +25 -0
  263. data/tests/rackspace/models/monitoring/check_tests.rb +50 -0
  264. data/tests/rackspace/models/monitoring/check_types_tests.rb +14 -0
  265. data/tests/rackspace/models/monitoring/checks_tests.rb +16 -0
  266. data/tests/rackspace/models/monitoring/data_points_tests.rb +19 -0
  267. data/tests/rackspace/models/monitoring/entities_tests.rb +14 -0
  268. data/tests/rackspace/models/monitoring/entity_tests.rb +26 -0
  269. data/tests/rackspace/models/monitoring/metric_tests.rb +19 -0
  270. data/tests/rackspace/models/monitoring/metrics_tests.rb +17 -0
  271. data/tests/rackspace/monitoring_tests.rb +72 -0
  272. data/tests/rackspace/requests/compute_v2/keypair_tests.rb +55 -0
  273. data/tests/rackspace/requests/monitoring/agent_tests.rb +34 -0
  274. data/tests/rackspace/requests/monitoring/alarm_example_tests.rb +30 -0
  275. data/tests/rackspace/requests/monitoring/alarm_tests.rb +55 -0
  276. data/tests/rackspace/requests/monitoring/check_tests.rb +40 -0
  277. data/tests/rackspace/requests/monitoring/entity_tests.rb +37 -0
  278. data/tests/rackspace/requests/monitoring/helper.rb +78 -0
  279. data/tests/rackspace/requests/monitoring/list_tests.rb +60 -0
  280. data/tests/vsphere/models/compute/server_tests.rb +1 -1
  281. data/tests/vsphere/requests/compute/list_virtual_machines_tests.rb +2 -2
  282. data/tests/vsphere/requests/compute/vm_clone_tests.rb +14 -8
  283. data/tests/xenserver/compute_tests.rb +5 -5
  284. data/tests/xenserver/models/compute/console_test.rb +35 -0
  285. data/tests/xenserver/models/compute/consoles_test.rb +19 -0
  286. data/tests/xenserver/models/compute/server_tests.rb +25 -18
  287. data/tests/xenserver/models/compute/servers_tests.rb +1 -0
  288. metadata +154 -3
@@ -71,7 +71,7 @@ module Fog
71
71
  end
72
72
 
73
73
  if self.data[:server_certificates][name]
74
- raise Fog::AWS::IAM::EntityAlreadyExists.new
74
+ raise Fog::AWS::IAM::EntityAlreadyExists.new("The Server Certificate with name #{name} already exists.")
75
75
  else
76
76
  response.status = 200
77
77
  path = options['Path'] || "/"
@@ -0,0 +1,76 @@
1
+ module Fog
2
+ module AWS
3
+ class RDS
4
+ class Real
5
+
6
+ require 'fog/aws/parsers/rds/describe_orderable_db_instance_options'
7
+
8
+ # Describe all or specified load db instances
9
+ # http://docs.amazonwebservices.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html
10
+ # ==== Parameters
11
+ # * Engine <~String> - The name of the engine to retrieve DB Instance options for. Required.
12
+ # * Options <~Hash> - Hash of options. Optional. The following keys are used:
13
+ # * :db_instance_class <~String> - Filter available offerings matching the specified DB Instance class. Optional.
14
+ # * :engine_version <~String> - Filters available offerings matching the specified engine version. Optional.
15
+ # * :license_model <~String> - Filters available offerings matching the specified license model. Optional.
16
+ # * :marker <~String> - The pagination token provided in the previous request. If this parameter is specified the response includes only records beyond the marker, up to MaxRecords. Optional.
17
+ # * :max_records <~Integer> - The maximum number of records to include in the response. If more records exist, a pagination token is included in the response. Optional.
18
+ # * :vpc <~Boolean> - Filter to show only the available VPC or non-VPC offerings. Optional.
19
+ # ==== Returns
20
+ # * response<~Excon::Response>:
21
+ # * body<~Hash>:
22
+ def describe_orderable_db_instance_options(engine=nil, opts={})
23
+ params = {}
24
+ params['Engine'] = engine if engine
25
+ params['DBInstanceClass'] = opts[:db_instance_class] if opts[:db_instance_class]
26
+ params['EngineVersion'] = opts[:engine_version] if opts[:engine_version]
27
+ params['LicenseModel'] = opts[:license_model] if opts[:license_model]
28
+ params['Marker'] = opts[:marker] if opts[:marker]
29
+ params['MaxRecords'] = opts[:max_records] if opts[:max_records]
30
+ params['Vpc'] = opts[:vpc] if opts[:vpc]
31
+
32
+ request({
33
+ 'Action' => 'DescribeOrderableDBInstanceOptions',
34
+ :parser => Fog::Parsers::AWS::RDS::DescribeOrderableDBInstanceOptions.new
35
+ }.merge(params))
36
+ end
37
+
38
+ end
39
+
40
+ class Mock
41
+
42
+ def describe_orderable_db_instance_options(engine=nil, opts={})
43
+ instance_options = []
44
+ response = Excon::Response.new
45
+ if engine
46
+ (opts[:db_instance_class] || %w(db.m2.xlarge db.m1.large)).each do |size|
47
+ instance_options << {'MultiAZCapable' => true,
48
+ 'Engine' => engine,
49
+ 'LicenseModel' => opts[:license_model] || 'general-public-license',
50
+ 'ReadReplicaCapable' => true,
51
+ 'EngineVersion' => opts[:engine_version] || '5.6.12',
52
+ 'AvailabilityZones' => [
53
+ {'Name' => 'us-east-1b', 'ProvisionedIopsCapable' => true},
54
+ {'Name' => 'us-east-1c', 'ProvisionedIopsCapable' => true},
55
+ {'Name' => 'us-east-1d', 'ProvisionedIopsCapable' => false},
56
+ {'Name' => 'us-east-1e', 'ProvisionedIopsCapable' => true}],
57
+ 'DBInstanceClass' => size,
58
+ 'Vpc' => opts[:vpc].nil? ? true : opts[:vpc]}
59
+
60
+ end
61
+ else
62
+ raise Fog::AWS::RDS::NotFound.new('An engine must be specified to retrieve orderable instance options')
63
+ end
64
+
65
+ response.status = 200
66
+ response.body = {
67
+ 'ResponseMetadata' => { 'RequestId' => Fog::AWS::Mock.request_id },
68
+ 'DescribeOrderableDBInstanceOptionsResult' => { 'OrderableDBInstanceOptions' => instance_options }
69
+ }
70
+ response
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+ end
@@ -16,7 +16,7 @@ module Fog
16
16
  # * 'ResponseMetadata'<~Hash>:
17
17
  # * 'VerificationToken'<~String> - Verification token
18
18
  # * 'RequestId'<~String> - Id of request
19
- def verify_domain(domain)
19
+ def verify_domain_identity(domain)
20
20
  request({
21
21
  'Action' => 'VerifyDomainIdentity',
22
22
  'Domain' => domain,
@@ -21,6 +21,8 @@ class Rackspace < Fog::Bin
21
21
  Fog::Rackspace::Identity
22
22
  when :databases
23
23
  Fog::Rackspace::Databases
24
+ when :monitoring
25
+ Fog::Rackspace::Monitoring
24
26
  else
25
27
  raise ArgumentError, "Unrecognized service: #{key}"
26
28
  end
@@ -52,6 +54,8 @@ class Rackspace < Fog::Bin
52
54
  Fog::Rackspace::Databases.new
53
55
  when :block_storage
54
56
  Fog::Rackspace::BlockStorage.new
57
+ when :monitoring
58
+ Fog::Rackspace::Monitoring.new
55
59
  else
56
60
  raise ArgumentError, "Unrecognized service: #{key.inspect}"
57
61
  end
@@ -25,14 +25,22 @@ module Fog
25
25
  :email => email
26
26
  }.delete_if { |k, v| v.nil? || v == "" }
27
27
 
28
- data = connection.create_collaboration(options)
28
+ data = service.create_collaboration(options)
29
+ merge_attributes(data)
30
+ true
31
+ end
32
+
33
+ def resend
34
+ requires :identity
35
+ data = service.resend_collaboration(identity)
29
36
  merge_attributes(data)
30
37
  true
31
38
  end
32
39
 
33
40
  def destroy
34
41
  requires :identity
35
- connection.destroy_collaboration(identity)
42
+ data = service.destroy_collaboration(identity)
43
+ merge_attributes(data)
36
44
  true
37
45
  end
38
46
 
@@ -8,13 +8,37 @@ module Fog
8
8
  model Fog::Compute::Brightbox::Collaboration
9
9
 
10
10
  def all
11
- data = connection.list_collaborations
11
+ data = service.list_collaborations
12
12
  load(data)
13
13
  end
14
14
 
15
+ def get(identifier)
16
+ return nil if identifier.nil? || identifier == ""
17
+ data = service.get_collaboration(identifier)
18
+ new(data)
19
+ rescue Excon::Errors::NotFound
20
+ nil
21
+ end
22
+
23
+ # Invites a user (via an email) to collaborate on the currently scoped
24
+ # account at the +role+ level.
25
+ #
26
+ # @param [String] email The email address to use for the invitation
27
+ # @param [String] role The role being granted. Only (+admin+ is
28
+ # currently supported
29
+ # @return [Fog::Compute::Brightbox::Collaboration]
30
+ #
31
+ def invite(email, role)
32
+ return nil if email.nil? || email == ""
33
+ return nil if role.nil? || role == ""
34
+ options = {:email => email, :role => role}
35
+ data = service.create_collaboration(options)
36
+ new(data)
37
+ end
38
+
15
39
  def destroy
16
40
  requires :identity
17
- connection.destroy_collaboration(identity)
41
+ service.destroy_collaboration(identity)
18
42
  true
19
43
  end
20
44
  end
@@ -17,9 +17,24 @@ module Fog
17
17
  account['id'] || account[:id]
18
18
  end
19
19
 
20
+ def accept
21
+ requires :identity
22
+ data = service.accept_user_collaboration(identity)
23
+ merge_attributes(data)
24
+ true
25
+ end
26
+
27
+ def reject
28
+ requires :identity
29
+ data = service.reject_user_collaboration(identity)
30
+ merge_attributes(data)
31
+ true
32
+ end
33
+
20
34
  def destroy
21
35
  requires :identity
22
- connection.destroy_user_collaboration(identity)
36
+ data = service.destroy_user_collaboration(identity)
37
+ merge_attributes(data)
23
38
  true
24
39
  end
25
40
 
@@ -8,13 +8,21 @@ module Fog
8
8
  model Fog::Compute::Brightbox::UserCollaboration
9
9
 
10
10
  def all
11
- data = connection.list_user_collaborations
11
+ data = service.list_user_collaborations
12
12
  load(data)
13
13
  end
14
14
 
15
+ def get(identifier)
16
+ return nil if identifier.nil? || identifier == ""
17
+ data = service.get_user_collaboration(identifier)
18
+ new(data)
19
+ rescue Excon::Errors::NotFound
20
+ nil
21
+ end
22
+
15
23
  def destroy
16
24
  requires :identity
17
- connection.destroy_user_collaboration(identity)
25
+ service.destroy_user_collaboration(identity)
18
26
  true
19
27
  end
20
28
  end
@@ -34,6 +34,8 @@ module Fog
34
34
  attribute :root_device_id, :aliases => 'rootdeviceid'
35
35
  attribute :root_device_type, :aliases => 'rootdevicetype'
36
36
  attribute :group
37
+ attribute :key_name, :aliases => 'keypair'
38
+ attribute :user_data, :aliases => 'userdata'
37
39
  attribute :security_group_list, :type => :array, :aliases => 'securitygroup'
38
40
  attribute :nics, :type => :array, :aliases => 'nic'
39
41
 
@@ -92,6 +94,8 @@ module Fog
92
94
  'ipaddress' => ip_address,
93
95
  'iptonetworklist' => ip_to_network_list,
94
96
  'projectid' => project_id,
97
+ 'keypair' => key_name,
98
+ 'userdata' => user_data,
95
99
  }
96
100
 
97
101
  options.merge!('networkids' => network_ids) if network_ids
@@ -23,7 +23,7 @@ module Fog
23
23
 
24
24
  def get(server_id)
25
25
  servers = service.list_virtual_machines('id' => server_id)["listvirtualmachinesresponse"]["virtualmachine"]
26
- unless servers.empty? || servers.nil?
26
+ unless servers.nil? || servers.empty?
27
27
  new(servers.first)
28
28
  end
29
29
  rescue Fog::Compute::Cloudstack::BadRequest
@@ -4,7 +4,7 @@ module Fog
4
4
  module Compute
5
5
  class Server < Fog::Model
6
6
 
7
- attr_writer :username, :private_key, :private_key_path, :public_key, :public_key_path, :ssh_port
7
+ attr_writer :username, :private_key, :private_key_path, :public_key, :public_key_path, :ssh_port, :ssh_options
8
8
 
9
9
  def username
10
10
  @username ||= 'root'
@@ -32,13 +32,21 @@ module Fog
32
32
  @ssh_port ||= 22
33
33
  end
34
34
 
35
+ def ssh_options
36
+ @ssh_options ||= {}
37
+ ssh_options = @ssh_options.merge({:port => ssh_port})
38
+ if private_key
39
+ ssh_options[:key_data] = [private_key]
40
+ ssh_options[:auth_methods] = ["publickey"]
41
+ end
42
+ ssh_options
43
+ end
44
+
35
45
  def scp(local_path, remote_path, upload_options = {})
36
46
  require 'net/scp'
37
47
  requires :public_ip_address, :username
38
48
 
39
- scp_options = {:port => ssh_port}
40
- scp_options[:key_data] = [private_key] if private_key
41
- Fog::SCP.new(public_ip_address, username, scp_options).upload(local_path, remote_path, upload_options)
49
+ Fog::SCP.new(public_ip_address, username, ssh_options).upload(local_path, remote_path, upload_options)
42
50
  end
43
51
 
44
52
  alias_method :scp_upload, :scp
@@ -47,23 +55,21 @@ module Fog
47
55
  require 'net/scp'
48
56
  requires :public_ip_address, :username
49
57
 
50
- scp_options = {:port => ssh_port}
51
- scp_options[:key_data] = [private_key] if private_key
52
- Fog::SCP.new(public_ip_address, username, scp_options).download(remote_path, local_path, download_options)
58
+ Fog::SCP.new(public_ip_address, username, ssh_options).download(remote_path, local_path, download_options)
53
59
  end
54
60
 
55
61
  def ssh(commands, options={}, &blk)
56
62
  require 'net/ssh'
57
63
  requires :public_ip_address, :username
58
64
 
59
- options[:key_data] = [private_key] if private_key
60
- options[:port] ||= ssh_port
65
+ options = ssh_options.merge(options)
66
+
61
67
  Fog::SSH.new(public_ip_address, username, options).run(commands, &blk)
62
68
  end
63
69
 
64
70
  def sshable?(options={})
65
71
  ready? && !public_ip_address.nil? && !!Timeout::timeout(8) { ssh('pwd', options) }
66
- rescue SystemCallError, Net::SSH::AuthenticationFailed, Timeout::Error
72
+ rescue SystemCallError, Net::SSH::AuthenticationFailed, Net::SSH::Disconnect, Timeout::Error
67
73
  false
68
74
  end
69
75
 
@@ -8,6 +8,7 @@ require 'formatador'
8
8
  require 'openssl'
9
9
  require 'time'
10
10
  require 'timeout'
11
+ require 'ipaddr'
11
12
 
12
13
  # internal core dependencies
13
14
  require "fog/version"
@@ -142,4 +142,22 @@ module Fog
142
142
  end
143
143
 
144
144
  end
145
+
146
+ # Base class for collection classes whose 'all' method returns only a single page of results and passes the
147
+ # 'Marker' option along as self.filters[:marker]
148
+ class PagedCollection < Collection
149
+
150
+ def each(filters=filters)
151
+ if block_given?
152
+ begin
153
+ page = self.all(filters)
154
+ # We need to explicitly use the base 'each' method here on the page, otherwise we get infinite recursion
155
+ base_each = Fog::Collection.instance_method(:each)
156
+ base_each.bind(page).call { |item| yield item }
157
+ end while self.filters[:marker]
158
+ end
159
+ self
160
+ end
161
+
162
+ end
145
163
  end
@@ -50,11 +50,16 @@ module Fog
50
50
  @credentials = new_credentials
51
51
  end
52
52
 
53
+ def self.symbolize_credential?(key)
54
+ ![:headers].include?(key)
55
+ end
56
+
53
57
  def self.symbolize_credentials(args)
54
58
  if args.is_a? Hash
55
59
  copy = Array.new
56
60
  args.each do |key, value|
57
- copy.push(key.to_sym, self.symbolize_credentials(value))
61
+ obj = symbolize_credential?(key) ? self.symbolize_credentials(value) : value
62
+ copy.push(key.to_sym, obj)
58
63
  end
59
64
  Hash[*copy]
60
65
  else
@@ -34,6 +34,22 @@ module Fog
34
34
  raise Fog::Errors::MockNotImplemented.new("Contributions welcome!")
35
35
  end
36
36
 
37
+ def self.random_ip(opts = {:version => :v4})
38
+ version = opts[:version]
39
+ if version == :v6
40
+ bit_length = 128
41
+ family = Socket::AF_INET6
42
+ elsif version == :v4
43
+ bit_length = 32
44
+ family = Socket::AF_INET
45
+ else
46
+ raise ArgumentError, "Unknown IP version: #{version}"
47
+ end
48
+
49
+ seed = 1 + rand((2**bit_length)-1)
50
+ IPAddr.new(seed, family).to_s
51
+ end
52
+
37
53
  def self.random_base64(length)
38
54
  random_selection(
39
55
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
@@ -90,17 +90,46 @@ module Fog
90
90
  params[:query].merge!(:api_key => @digitalocean_api_key)
91
91
  params[:query].merge!(:client_id => @digitalocean_client_id)
92
92
 
93
- response = @connection.request(params)
93
+ response = retry_event_lock { parse @connection.request(params) }
94
94
 
95
95
  unless response.body.empty?
96
- response.body = Fog::JSON.decode(response.body)
97
96
  if response.body['status'] != 'OK'
98
- raise Fog::Errors::Error.new response.body.to_s
97
+ case response.body['error_message']
98
+ when /No Droplets Found/
99
+ raise Fog::Errors::NotFound.new
100
+ else
101
+ raise Fog::Errors::Error.new response.body.to_s
102
+ end
99
103
  end
100
104
  end
101
105
  response
102
106
  end
103
107
 
108
+ private
109
+
110
+ def parse(response)
111
+ return response if response.body.empty?
112
+ response.body = Fog::JSON.decode(response.body)
113
+ response
114
+ end
115
+
116
+ def retry_event_lock
117
+ count = 0
118
+ reponse = nil
119
+ while count < 5
120
+ response = yield
121
+
122
+ if response.body && response.body['error_message'] =~ /There is already a pending event for the droplet/
123
+ count += 1
124
+ sleep count ** 3
125
+ else
126
+ break
127
+ end
128
+ end
129
+
130
+ response
131
+ end
132
+
104
133
  end
105
134
  end
106
135
  end