fog 1.4.0 → 1.5.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 (236) hide show
  1. data/.document +1 -1
  2. data/.irbrc +5 -10
  3. data/{README.rdoc → README.md} +66 -61
  4. data/Rakefile +4 -6
  5. data/changelog.txt +491 -0
  6. data/docs/about/users.markdown +1 -0
  7. data/fog.gemspec +4 -4
  8. data/lib/fog.rb +1 -1
  9. data/lib/fog/aws.rb +4 -0
  10. data/lib/fog/aws/auto_scaling.rb +3 -0
  11. data/lib/fog/aws/cloud_watch.rb +28 -0
  12. data/lib/fog/aws/compute.rb +7 -1
  13. data/lib/fog/aws/elasticache.rb +64 -6
  14. data/lib/fog/aws/models/auto_scaling/configuration.rb +3 -1
  15. data/lib/fog/aws/models/auto_scaling/group.rb +10 -9
  16. data/lib/fog/aws/models/auto_scaling/policies.rb +33 -0
  17. data/lib/fog/aws/models/auto_scaling/policy.rb +46 -0
  18. data/lib/fog/aws/models/cloud_watch/alarm.rb +50 -2
  19. data/lib/fog/aws/models/cloud_watch/alarms.rb +18 -1
  20. data/lib/fog/aws/models/compute/address.rb +2 -2
  21. data/lib/fog/aws/models/dns/records.rb +5 -0
  22. data/lib/fog/aws/models/elasticache/cluster.rb +1 -1
  23. data/lib/fog/aws/models/iam/users.rb +26 -4
  24. data/lib/fog/aws/parsers/auto_scaling/describe_policies.rb +7 -5
  25. data/lib/fog/aws/parsers/elb/describe_load_balancers.rb +1 -1
  26. data/lib/fog/aws/rds.rb +1 -1
  27. data/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +8 -0
  28. data/lib/fog/aws/requests/auto_scaling/create_launch_configuration.rb +1 -2
  29. data/lib/fog/aws/requests/auto_scaling/delete_auto_scaling_group.rb +10 -2
  30. data/lib/fog/aws/requests/auto_scaling/delete_launch_configuration.rb +1 -1
  31. data/lib/fog/aws/requests/auto_scaling/delete_policy.rb +10 -1
  32. data/lib/fog/aws/requests/auto_scaling/describe_auto_scaling_instances.rb +0 -1
  33. data/lib/fog/aws/requests/auto_scaling/describe_policies.rb +13 -1
  34. data/lib/fog/aws/requests/auto_scaling/put_scaling_policy.rb +20 -1
  35. data/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb +1 -1
  36. data/lib/fog/aws/requests/cloud_watch/delete_alarms.rb +19 -1
  37. data/lib/fog/aws/requests/cloud_watch/describe_alarms.rb +20 -2
  38. data/lib/fog/aws/requests/cloud_watch/put_metric_alarm.rb +9 -0
  39. data/lib/fog/aws/requests/compute/allocate_address.rb +4 -5
  40. data/lib/fog/aws/requests/compute/create_dhcp_options.rb +6 -5
  41. data/lib/fog/aws/requests/compute/create_internet_gateway.rb +7 -6
  42. data/lib/fog/aws/requests/compute/create_subnet.rb +11 -10
  43. data/lib/fog/aws/requests/compute/create_vpc.rb +8 -7
  44. data/lib/fog/aws/requests/compute/delete_dhcp_options.rb +1 -0
  45. data/lib/fog/aws/requests/compute/delete_internet_gateway.rb +1 -0
  46. data/lib/fog/aws/requests/compute/delete_subnet.rb +1 -0
  47. data/lib/fog/aws/requests/compute/delete_vpc.rb +2 -1
  48. data/lib/fog/aws/requests/compute/describe_availability_zones.rb +1 -0
  49. data/lib/fog/aws/requests/compute/describe_dhcp_options.rb +1 -8
  50. data/lib/fog/aws/requests/compute/describe_instances.rb +3 -1
  51. data/lib/fog/aws/requests/compute/describe_internet_gateways.rb +1 -8
  52. data/lib/fog/aws/requests/compute/describe_subnets.rb +1 -9
  53. data/lib/fog/aws/requests/compute/describe_vpcs.rb +1 -8
  54. data/lib/fog/aws/requests/compute/release_address.rb +12 -4
  55. data/lib/fog/aws/requests/compute/start_instances.rb +1 -0
  56. data/lib/fog/aws/requests/compute/stop_instances.rb +1 -0
  57. data/lib/fog/aws/requests/elasticache/create_cache_cluster.rb +26 -2
  58. data/lib/fog/aws/requests/elasticache/delete_cache_cluster.rb +10 -1
  59. data/lib/fog/aws/requests/elasticache/describe_cache_clusters.rb +16 -1
  60. data/lib/fog/aws/requests/elasticache/modify_cache_cluster.rb +35 -3
  61. data/lib/fog/aws/requests/elasticache/reboot_cache_cluster.rb +10 -2
  62. data/lib/fog/aws/requests/elb/create_load_balancer.rb +1 -1
  63. data/lib/fog/aws/requests/rds/describe_db_instances.rb +3 -3
  64. data/lib/fog/aws/sqs.rb +1 -1
  65. data/lib/fog/aws/storage.rb +1 -1
  66. data/lib/fog/bin/rackspace.rb +4 -0
  67. data/lib/fog/cloudstack/compute.rb +25 -18
  68. data/lib/fog/cloudstack/models/compute/image.rb +34 -34
  69. data/lib/fog/cloudstack/models/compute/job.rb +14 -1
  70. data/lib/fog/cloudstack/models/compute/jobs.rb +1 -1
  71. data/lib/fog/cloudstack/models/compute/security_group.rb +50 -0
  72. data/lib/fog/cloudstack/models/compute/security_group_rule.rb +62 -0
  73. data/lib/fog/cloudstack/models/compute/security_group_rules.rb +37 -0
  74. data/lib/fog/cloudstack/models/compute/security_groups.rb +27 -0
  75. data/lib/fog/cloudstack/models/compute/server.rb +63 -39
  76. data/lib/fog/cloudstack/models/compute/volume.rb +3 -7
  77. data/lib/fog/cloudstack/models/compute/zone.rb +1 -2
  78. data/lib/fog/cloudstack/requests/compute/assign_virtual_machine.rb +18 -0
  79. data/lib/fog/cloudstack/requests/compute/authorize_security_group_egress.rb +68 -0
  80. data/lib/fog/cloudstack/requests/compute/authorize_security_group_ingress.rb +55 -4
  81. data/lib/fog/cloudstack/requests/compute/create_security_group.rb +12 -4
  82. data/lib/fog/cloudstack/requests/compute/create_zone.rb +20 -0
  83. data/lib/fog/cloudstack/requests/compute/delete_security_group.rb +17 -0
  84. data/lib/fog/cloudstack/requests/compute/destroy_virtual_machine.rb +23 -1
  85. data/lib/fog/cloudstack/requests/compute/list_firewall_rules.rb +15 -0
  86. data/lib/fog/cloudstack/requests/compute/list_security_groups.rb +22 -4
  87. data/lib/fog/cloudstack/requests/compute/query_async_job_result.rb +15 -3
  88. data/lib/fog/cloudstack/requests/compute/revoke_security_group_egress.rb +42 -0
  89. data/lib/fog/cloudstack/requests/compute/revoke_security_group_ingress.rb +29 -3
  90. data/lib/fog/core.rb +1 -0
  91. data/lib/fog/core/attributes.rb +1 -1
  92. data/lib/fog/core/current_machine.rb +2 -2
  93. data/lib/fog/core/scp.rb +8 -0
  94. data/lib/fog/core/ssh.rb +8 -0
  95. data/lib/fog/dynect/dns.rb +14 -5
  96. data/lib/fog/ibm/requests/compute/create_instance.rb +1 -1
  97. data/lib/fog/libvirt/requests/compute/create_volume.rb +1 -1
  98. data/lib/fog/libvirt/requests/compute/list_volumes.rb +1 -1
  99. data/lib/fog/local/models/storage/file.rb +12 -1
  100. data/lib/fog/local/storage.rb +25 -1
  101. data/lib/fog/ninefold/compute.rb +1 -0
  102. data/lib/fog/openstack.rb +3 -1
  103. data/lib/fog/openstack/compute.rb +13 -2
  104. data/lib/fog/openstack/models/compute/servers.rb +10 -2
  105. data/lib/fog/openstack/requests/compute/create_flavor.rb +2 -2
  106. data/lib/fog/openstack/requests/compute/create_security_group.rb +1 -1
  107. data/lib/fog/openstack/requests/compute/create_server.rb +1 -1
  108. data/lib/fog/openstack/requests/compute/create_volume.rb +1 -1
  109. data/lib/fog/openstack/requests/compute/get_flavor_details.rb +7 -7
  110. data/lib/fog/openstack/requests/compute/get_quota.rb +1 -12
  111. data/lib/fog/openstack/requests/compute/get_quota_defaults.rb +1 -12
  112. data/lib/fog/openstack/requests/compute/get_volume_details.rb +1 -1
  113. data/lib/fog/openstack/requests/compute/list_flavors.rb +7 -7
  114. data/lib/fog/openstack/requests/compute/list_flavors_detail.rb +7 -7
  115. data/lib/fog/openstack/requests/compute/list_security_groups.rb +7 -7
  116. data/lib/fog/openstack/requests/compute/list_servers_detail.rb +4 -3
  117. data/lib/fog/openstack/requests/compute/list_volumes.rb +6 -8
  118. data/lib/fog/openstack/requests/compute/update_quota.rb +2 -15
  119. data/lib/fog/openstack/requests/identity/delete_role.rb +1 -1
  120. data/lib/fog/openstack/requests/identity/list_roles.rb +1 -1
  121. data/lib/fog/openstack/requests/image/create_image.rb +3 -1
  122. data/lib/fog/openstack/requests/image/list_public_images.rb +19 -1
  123. data/lib/fog/openstack/requests/image/list_public_images_detailed.rb +20 -2
  124. data/lib/fog/openstack/requests/image/update_image.rb +1 -1
  125. data/lib/fog/rackspace.rb +2 -0
  126. data/lib/fog/rackspace/databases.rb +121 -0
  127. data/lib/fog/rackspace/identity.rb +83 -0
  128. data/lib/fog/rackspace/load_balancers.rb +3 -0
  129. data/lib/fog/rackspace/models/databases/database.rb +32 -0
  130. data/lib/fog/rackspace/models/databases/databases.rb +31 -0
  131. data/lib/fog/rackspace/models/databases/flavor.rb +15 -0
  132. data/lib/fog/rackspace/models/databases/flavors.rb +25 -0
  133. data/lib/fog/rackspace/models/databases/instance.rb +104 -0
  134. data/lib/fog/rackspace/models/databases/instances.rb +25 -0
  135. data/lib/fog/rackspace/models/databases/user.rb +32 -0
  136. data/lib/fog/rackspace/models/databases/users.rb +31 -0
  137. data/lib/fog/rackspace/models/identity/credential.rb +13 -0
  138. data/lib/fog/rackspace/models/identity/credentials.rb +32 -0
  139. data/lib/fog/rackspace/models/identity/role.rb +14 -0
  140. data/lib/fog/rackspace/models/identity/roles.rb +32 -0
  141. data/lib/fog/rackspace/models/identity/tenant.rb +15 -0
  142. data/lib/fog/rackspace/models/identity/tenants.rb +28 -0
  143. data/lib/fog/rackspace/models/identity/user.rb +53 -0
  144. data/lib/fog/rackspace/models/identity/users.rb +36 -0
  145. data/lib/fog/rackspace/models/load_balancers/load_balancer.rb +17 -0
  146. data/lib/fog/rackspace/requests/databases/check_root_user.rb +15 -0
  147. data/lib/fog/rackspace/requests/databases/create_database.rb +24 -0
  148. data/lib/fog/rackspace/requests/databases/create_instance.rb +26 -0
  149. data/lib/fog/rackspace/requests/databases/create_user.rb +24 -0
  150. data/lib/fog/rackspace/requests/databases/delete_database.rb +15 -0
  151. data/lib/fog/rackspace/requests/databases/delete_instance.rb +15 -0
  152. data/lib/fog/rackspace/requests/databases/delete_user.rb +15 -0
  153. data/lib/fog/rackspace/requests/databases/enable_root_user.rb +15 -0
  154. data/lib/fog/rackspace/requests/databases/get_flavor.rb +15 -0
  155. data/lib/fog/rackspace/requests/databases/get_instance.rb +15 -0
  156. data/lib/fog/rackspace/requests/databases/list_databases.rb +15 -0
  157. data/lib/fog/rackspace/requests/databases/list_flavors.rb +15 -0
  158. data/lib/fog/rackspace/requests/databases/list_instances.rb +15 -0
  159. data/lib/fog/rackspace/requests/databases/list_users.rb +15 -0
  160. data/lib/fog/rackspace/requests/databases/resize_instance.rb +22 -0
  161. data/lib/fog/rackspace/requests/databases/resize_instance_volume.rb +24 -0
  162. data/lib/fog/rackspace/requests/databases/restart_instance.rb +20 -0
  163. data/lib/fog/rackspace/requests/identity/create_token.rb +25 -0
  164. data/lib/fog/rackspace/requests/identity/create_user.rb +25 -0
  165. data/lib/fog/rackspace/requests/identity/delete_user.rb +15 -0
  166. data/lib/fog/rackspace/requests/identity/get_credentials.rb +15 -0
  167. data/lib/fog/rackspace/requests/identity/get_user_by_id.rb +15 -0
  168. data/lib/fog/rackspace/requests/identity/get_user_by_name.rb +15 -0
  169. data/lib/fog/rackspace/requests/identity/list_credentials.rb +22 -0
  170. data/lib/fog/rackspace/requests/identity/list_tenants.rb +22 -0
  171. data/lib/fog/rackspace/requests/identity/list_user_roles.rb +22 -0
  172. data/lib/fog/rackspace/requests/identity/list_users.rb +22 -0
  173. data/lib/fog/rackspace/requests/identity/update_user.rb +24 -0
  174. data/lib/fog/rackspace/requests/load_balancers/get_ssl_termination.rb +15 -0
  175. data/lib/fog/rackspace/requests/load_balancers/remove_ssl_termination.rb +15 -0
  176. data/lib/fog/rackspace/requests/load_balancers/set_ssl_termination.rb +31 -0
  177. data/lib/fog/rackspace/storage.rb +1 -1
  178. data/lib/fog/vsphere/models/compute/server.rb +1 -0
  179. data/lib/fog/vsphere/requests/compute/vm_clone.rb +2 -2
  180. data/tests/aws/models/compute/address_tests.rb +2 -1
  181. data/tests/aws/models/compute/volume_tests.rb +1 -1
  182. data/tests/aws/models/dns/records_tests.rb +19 -1
  183. data/tests/aws/models/storage/directory_tests.rb +1 -1
  184. data/tests/aws/models/storage/url_tests.rb +7 -1
  185. data/tests/aws/requests/auto_scaling/auto_scaling_tests.rb +4 -2
  186. data/tests/aws/requests/compute/address_tests.rb +19 -1
  187. data/tests/aws/requests/elasticache/cache_cluster_tests.rb +4 -4
  188. data/tests/aws/requests/elb/helper.rb +13 -2
  189. data/tests/aws/requests/iam/access_key_tests.rb +1 -3
  190. data/tests/cloudstack/compute/models/security_group_rule_tests.rb +29 -0
  191. data/tests/cloudstack/compute/models/security_group_tests.rb +16 -0
  192. data/tests/cloudstack/compute/models/security_groups_tests.rb +19 -0
  193. data/tests/cloudstack/compute/models/server_tests.rb +18 -0
  194. data/tests/cloudstack/compute/models/volume_tests.rb +34 -0
  195. data/tests/cloudstack/compute/models/volumes_tests.rb +17 -0
  196. data/tests/compute/helper.rb +10 -3
  197. data/tests/core/current_machine_tests.rb +32 -0
  198. data/tests/helper.rb +1 -1
  199. data/tests/helpers/mock_helper.rb +3 -0
  200. data/tests/hp/requests/compute/address_tests.rb +2 -1
  201. data/tests/joyent/requests/compute/datasets_tests.rb +12 -3
  202. data/tests/local/models/file_tests.rb +43 -0
  203. data/tests/local/storage_tests.rb +40 -0
  204. data/tests/openstack/requests/compute/flavor_tests.rb +1 -1
  205. data/tests/openstack/requests/compute/server_tests.rb +3 -3
  206. data/tests/openstack/requests/compute/volume_tests.rb +1 -1
  207. data/tests/openstack/requests/identity/role_tests.rb +1 -1
  208. data/tests/rackspace/databases_tests.rb +26 -0
  209. data/tests/rackspace/models/databases/database_tests.rb +17 -0
  210. data/tests/rackspace/models/databases/databases_tests.rb +17 -0
  211. data/tests/rackspace/models/databases/flavors_tests.rb +20 -0
  212. data/tests/rackspace/models/databases/instance_tests.rb +43 -0
  213. data/tests/rackspace/models/databases/instances_tests.rb +14 -0
  214. data/tests/rackspace/models/databases/user_tests.rb +21 -0
  215. data/tests/rackspace/models/databases/users_tests.rb +21 -0
  216. data/tests/rackspace/models/identity/credentials_tests.rb +16 -0
  217. data/tests/rackspace/models/identity/roles_tests.rb +16 -0
  218. data/tests/rackspace/models/identity/tenants_tests.rb +21 -0
  219. data/tests/rackspace/models/identity/user_tests.rb +17 -0
  220. data/tests/rackspace/models/identity/users_tests.rb +17 -0
  221. data/tests/rackspace/models/load_balancers/load_balancer_tests.rb +20 -0
  222. data/tests/rackspace/requests/databases/database_tests.rb +36 -0
  223. data/tests/rackspace/requests/databases/flavor_tests.rb +16 -0
  224. data/tests/rackspace/requests/databases/helper.rb +84 -0
  225. data/tests/rackspace/requests/databases/instance_tests.rb +77 -0
  226. data/tests/rackspace/requests/databases/user_tests.rb +37 -0
  227. data/tests/rackspace/requests/identity/tenants_tests.rb +21 -0
  228. data/tests/rackspace/requests/identity/token_tests.rb +63 -0
  229. data/tests/rackspace/requests/identity/user_tests.rb +107 -0
  230. data/tests/rackspace/requests/load_balancers/helper.rb +70 -1
  231. data/tests/rackspace/requests/load_balancers/ssl_termination_tests.rb +38 -0
  232. data/tests/storage/models/file_tests.rb +1 -1
  233. metadata +129 -13
  234. data/spec/core/current_machine_spec.rb +0 -32
  235. data/spec/lib/fog/aws/parsers/sqs/receive_message_spec.rb +0 -58
  236. data/spec/spec_helper.rb +0 -8
@@ -27,6 +27,10 @@ module Fog
27
27
  collection :servers
28
28
  model :image
29
29
  collection :images
30
+ model :security_group
31
+ collection :security_groups
32
+ model :security_group_rule
33
+ collection :security_group_rules
30
34
  model :volume
31
35
  collection :volumes
32
36
  model :zone
@@ -34,7 +38,9 @@ module Fog
34
38
 
35
39
  request :acquire_ip_address
36
40
  request :assign_to_load_balancer_rule
41
+ request :assign_virtual_machine
37
42
  request :attach_volume
43
+ request :authorize_security_group_egress
38
44
  request :authorize_security_group_ingress
39
45
  request :change_service_for_virtual_machine
40
46
  request :create_account
@@ -48,6 +54,7 @@ module Fog
48
54
  request :create_snapshot_policy
49
55
  request :create_user
50
56
  request :create_volume
57
+ request :create_zone
51
58
  request :delete_account
52
59
  request :delete_domain
53
60
  request :delete_load_balancer_rule
@@ -80,6 +87,7 @@ module Fog
80
87
  request :list_events
81
88
  request :list_external_firewalls
82
89
  request :list_external_load_balancers
90
+ request :list_firewall_rules
83
91
  request :list_hosts
84
92
  request :list_hypervisors
85
93
  request :list_instance_groups
@@ -115,6 +123,7 @@ module Fog
115
123
  request :remove_from_load_balancer_rule
116
124
  request :reset_password_for_virtual_machine
117
125
  request :revoke_security_group_ingress
126
+ request :revoke_security_group_egress
118
127
  request :start_virtual_machine
119
128
  request :stop_virtual_machine
120
129
  request :update_account
@@ -247,23 +256,20 @@ module Fog
247
256
 
248
257
  def self.data
249
258
  @data ||= begin
250
- rc_options = Fog.credentials[:cloudstack] || {}
251
- zone_id = rc_options[:zone_id] ||"c554c592-e09c-9df5-7688-4a32754a4305"
252
- image_id = rc_options[:image_id] || "8a31cf9c-f248-0588-256e-9dbf58785216"
253
- flavor_id = rc_options[:flavor_id] || "4437ac6c-9fe3-477a-57ec-60a5a45896a4"
254
- account_id = "8bec6f15-e2b8-44fc-a8f3-a022b2873440"
255
- user_id = Fog::Cloudstack.uuid
256
- domain_id = Fog::Cloudstack.uuid
257
- network_id = (Array(rc_options[:network_ids]) || [Fog::Cloudstack.uuid]).first
259
+ zone_id = Fog.credentials[:cloudstack_zone_id] || Fog::Cloudstack.uuid
260
+ image_id = Fog.credentials[:cloudstack_template_id] || Fog::Cloudstack.uuid
261
+ flavor_id = Fog.credentials[:cloudstack_service_offering_id] || Fog::Cloudstack.uuid
262
+ network_id = (Array(Fog.credentials[:cloudstack_network_ids]) || [Fog::Cloudstack.uuid]).first
258
263
  domain_name = "exampleorg"
264
+ account_id, user_id, domain_id = Fog::Cloudstack.uuid, Fog::Cloudstack.uuid, Fog::Cloudstack.uuid
259
265
  domain = {
260
- "id" => domain_id,
261
- "name" => domain_name,
262
- "level" => 1,
263
- "parentdomainid" => Fog::Cloudstack.uuid,
266
+ "id" => domain_id,
267
+ "name" => domain_name,
268
+ "level" => 1,
269
+ "parentdomainid" => Fog::Cloudstack.uuid,
264
270
  "parentdomainname" => "ROOT",
265
- "haschild" => false,
266
- "path" => "ROOT/accountname"
271
+ "haschild" => false,
272
+ "path" => "ROOT/accountname"
267
273
  }
268
274
  user = {
269
275
  "id" => user_id,
@@ -406,10 +412,11 @@ module Fog
406
412
  "state" => "enabled",
407
413
  "user" => [user]}
408
414
  },
409
- :domains => { domain_id => domain },
410
- :servers => {},
411
- :jobs => {},
412
- :volumes => {}
415
+ :domains => {domain_id => domain},
416
+ :servers => {},
417
+ :jobs => {},
418
+ :volumes => {},
419
+ :security_groups => {},
413
420
  }
414
421
  end
415
422
  end
@@ -2,60 +2,60 @@ module Fog
2
2
  module Compute
3
3
  class Cloudstack
4
4
  class Image < Fog::Model
5
- identity :id, :aliases => 'id'
5
+ identity :id, :aliases => 'id'
6
6
  attribute :account
7
- attribute :account_id, :aliases => 'accountid'
7
+ attribute :account_id, :aliases => 'accountid'
8
8
  attribute :bootable
9
9
  attribute :checksum
10
10
  attribute :created
11
- attribute :cross_zones, :aliases => 'crossZones'
11
+ attribute :cross_zones, :aliases => 'crossZones'
12
12
  attribute :details
13
- attribute :display_text, :aliases => 'displaytext'
13
+ attribute :display_text, :aliases => 'displaytext'
14
14
  attribute :domain
15
- attribute :domain_id, :aliases => 'domainid'
15
+ attribute :domain_id, :aliases => 'domainid'
16
16
  attribute :format
17
- attribute :host_id, :aliases => 'hostid'
18
- attribute :host_name, :aliases => 'hostname'
17
+ attribute :host_id, :aliases => 'hostid'
18
+ attribute :host_name, :aliases => 'hostname'
19
19
  attribute :hypervisor
20
- attribute :job_id, :aliases => 'jobid'
21
- attribute :job_status, :aliases => 'jobstatus'
22
- attribute :is_extractable, :aliases => 'isextractable'
23
- attribute :is_featured, :aliases => 'isfeatured'
24
- attribute :is_public, :aliases => 'ispublic'
25
- attribute :is_ready, :aliases => 'isready'
20
+ attribute :job_id, :aliases => 'jobid'
21
+ attribute :job_status, :aliases => 'jobstatus'
22
+ attribute :is_extractable, :aliases => 'isextractable'
23
+ attribute :is_featured, :aliases => 'isfeatured'
24
+ attribute :is_public, :aliases => 'ispublic'
25
+ attribute :is_ready, :aliases => 'isready'
26
26
  attribute :name
27
- attribute :os_type_id, :aliases => 'ostypeid'
28
- attribute :os_type_name, :aliases => 'ostypename'
29
- attribute :password_enabled, :aliases => 'ostypename'
27
+ attribute :os_type_id, :aliases => 'ostypeid'
28
+ attribute :os_type_name, :aliases => 'ostypename'
29
+ attribute :password_enabled, :aliases => 'ostypename'
30
30
  attribute :project
31
- attribute :project_id, :aliases => 'projectid'
31
+ attribute :project_id, :aliases => 'projectid'
32
32
  attribute :removed
33
33
  attribute :size
34
34
  attribute :source_template_id, :aliases => 'sourcetemplateid'
35
35
  attribute :status
36
- attribute :template_tag, :aliases => 'templatetag'
37
- attribute :template_type, :aliases => 'templatetype'
38
- attribute :zone_id, :aliases => 'zoneid'
39
- attribute :zone_name, :aliases => 'zonename'
36
+ attribute :template_tag, :aliases => 'templatetag'
37
+ attribute :template_type, :aliases => 'templatetype'
38
+ attribute :zone_id, :aliases => 'zoneid'
39
+ attribute :zone_name, :aliases => 'zonename'
40
40
 
41
41
  attr_accessor :bits, :requires_hvm, :snapshot_id, :url, :virtual_machine_id, :volume_id
42
42
 
43
43
  def save
44
44
  options = {
45
- 'displaytext' => display_text,
46
- 'name' => name,
47
- 'ostypeid' => os_type_id,
48
- 'bits' => bits,
49
- 'details' => details,
50
- 'isfeatured' => is_featured,
51
- 'ispublic' => is_public,
52
- 'passwordenabled' => password_enabled,
53
- 'requireshvm' => requires_hvm,
54
- 'snapshotid' => snapshot_id,
55
- 'templatetag' => template_tag,
56
- 'url' => url,
45
+ 'displaytext' => display_text,
46
+ 'name' => name,
47
+ 'ostypeid' => os_type_id,
48
+ 'bits' => bits,
49
+ 'details' => details,
50
+ 'isfeatured' => is_featured,
51
+ 'ispublic' => is_public,
52
+ 'passwordenabled' => password_enabled,
53
+ 'requireshvm' => requires_hvm,
54
+ 'snapshotid' => snapshot_id,
55
+ 'templatetag' => template_tag,
56
+ 'url' => url,
57
57
  'virtualmachineid' => virtual_machine_id,
58
- 'volumeid' => volume_id
58
+ 'volumeid' => volume_id
59
59
  }
60
60
  data = connection.create_template(options)
61
61
  merge_attributes(data['createtemplateresponse'])
@@ -20,9 +20,22 @@ module Fog
20
20
  merge_attributes(connection.query_async_job_result('jobid' => self.id)['queryasyncjobresultresponse'])
21
21
  end
22
22
 
23
- def finished?
23
+ def ready?
24
24
  self.job_status != 0
25
25
  end
26
+
27
+ def successful?
28
+ self.job_result_code == 0
29
+ end
30
+
31
+ # so dirty
32
+ def result
33
+ if successful? && model = Fog::Compute::Cloudstack.constants.find{|c| c.to_s.downcase == self.job_result.keys.first.to_s}.to_s
34
+ collection = model.gsub(/.[A-Z]/){|w| "#{w[0]}_#{w[1].downcase}"}.downcase + "s" # cheap underscorize, assume simple pluralization
35
+ connection.send(collection).new(self.job_result.values.first)
36
+ else self.job_result
37
+ end
38
+ end
26
39
  end # Job
27
40
  end # Cloudstack
28
41
  end # Compute
@@ -15,7 +15,7 @@ module Fog
15
15
  end
16
16
 
17
17
  def get(job_id)
18
- if job = connection.query_async_job_result('jobid' => job_id)["listasyncjobsresponse"]["asyncjobs"].first
18
+ if job = connection.query_async_job_result('jobid' => job_id)["queryasyncjobresultresponse"]
19
19
  new(job)
20
20
  end
21
21
  rescue Fog::Compute::Cloudstack::BadRequest
@@ -0,0 +1,50 @@
1
+ module Fog
2
+ module Compute
3
+ class Cloudstack
4
+ class SecurityGroup < Fog::Model
5
+ identity :id, :aliases => 'id'
6
+ attribute :name, :type => :string
7
+ attribute :description, :type => :string
8
+ attribute :account, :type => :string
9
+ attribute :domain_id, :aliases => "domainid", :type => :string
10
+ attribute :domain_name, :aliases => "domain", :type => :string
11
+ attribute :project_id, :aliases => "projectid", :type => :string
12
+ attribute :project_name, :aliases => "project", :type => :string
13
+ attribute :ingress_rules, :aliases => "ingressrule", :type => :array
14
+ attribute :egress_rules, :aliases => "egressrule", :type => :array
15
+
16
+ def destroy
17
+ requires :id
18
+ connection.delete_security_group('id' => self.id)
19
+ true
20
+ end
21
+
22
+ def egress_rules
23
+ attributes[:egress_rules] || []
24
+ end
25
+
26
+ def ingress_rules
27
+ attributes[:ingress_rules] || []
28
+ end
29
+
30
+ def save
31
+ requires :name
32
+
33
+ options = {
34
+ 'name' => self.name,
35
+ 'account' => self.account,
36
+ 'description' => self.description,
37
+ 'projectid' => self.project_id,
38
+ 'domainid' => self.domain_id,
39
+ }
40
+ data = connection.create_security_group(options)
41
+ merge_attributes(data['createsecuritygroupresponse']['securitygroup'])
42
+ end
43
+
44
+ def rules
45
+ connection.security_group_rules.all("security_group_id" => self.id)
46
+ end
47
+ end # SecurityGroup
48
+ end # Cloudstack
49
+ end # Compute
50
+ end # Fog
@@ -0,0 +1,62 @@
1
+ module Fog
2
+ module Compute
3
+ class Cloudstack
4
+ class SecurityGroupRule < Fog::Model
5
+
6
+ identity :id, :aliases => 'ruleid'
7
+
8
+ attribute :security_group_id, :type => :string
9
+ attribute :protocol, :type => :string
10
+ attribute :start_port, :type => :integer, :aliases => 'startport'
11
+ attribute :end_port, :type => :integer, :aliases => 'endport'
12
+ attribute :cidr, :type => :string
13
+ attribute :direction, :type => :string
14
+
15
+ def destroy
16
+ data = connection.send("revoke_security_group_#{self.direction}", "id" => self.id)
17
+ job = connection.jobs.new(data["revokesecuritygroup#{self.direction}"])
18
+ job.wait_for { ready? }
19
+ job.successful?
20
+ end
21
+
22
+ def port_range
23
+ (self.start_port..self.end_port)
24
+ end
25
+
26
+ def save
27
+ requires :security_group_id, :cidr, :direction
28
+
29
+ data = connection.send("authorize_security_group_#{self.direction}".to_sym, params)
30
+ job = connection.jobs.new(data["authorizesecuritygroup#{self.direction}response"])
31
+ job.wait_for { ready? }
32
+ # durty
33
+ merge_attributes(job.result.send("#{self.direction}_rules").last)
34
+ self
35
+ end
36
+
37
+ def security_group
38
+ connection.security_groups.get(self.security_group_id)
39
+ end
40
+
41
+ def reload
42
+ requires :id, :security_group_id, :cidr
43
+
44
+ merge_attributes(security_group.rules.get(self.id))
45
+ end
46
+
47
+ private
48
+
49
+ def params
50
+ options = {
51
+ "securitygroupid" => self.security_group_id,
52
+ "protocol" => self.protocol,
53
+ "cidrlist" => self.cidr
54
+ }
55
+ options.merge!("startport" => self.start_port) unless self.start_port.nil?
56
+ options.merge("endport" => self.end_port) unless self.end_port.nil?
57
+ end
58
+
59
+ end # SecurityGroupRule
60
+ end # Cloudstack
61
+ end # Compute
62
+ end # Fog
@@ -0,0 +1,37 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/cloudstack/models/compute/security_group_rule'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Cloudstack
7
+
8
+ class SecurityGroupRules < Fog::Collection
9
+
10
+ model Fog::Compute::Cloudstack::SecurityGroupRule
11
+
12
+ attribute :security_group_id, :type => :string
13
+
14
+ def security_group
15
+ connection.security_groups.get(self.security_group_id)
16
+ end
17
+
18
+ def create(attributes)
19
+ model = self.new(attributes.merge(:security_group_id => self.security_group_id))
20
+ model.save
21
+ end
22
+
23
+ def all(options={})
24
+ merge_attributes(options)
25
+ security_group = self.security_group
26
+ rules = security_group.ingress_rules.map{|r| r.merge("direction" => "ingress", "security_group_id" => security_group_id)}
27
+ rules += security_group.egress_rules.map{|r| r.merge("direction" => "egress", "security_group_id" => security_group_id)}
28
+ load(rules)
29
+ end
30
+
31
+ def get(rule_id)
32
+ all.find{|r| r.id == rule_id}
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/cloudstack/models/compute/security_group'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Cloudstack
7
+ class SecurityGroups < Fog::Collection
8
+
9
+ model Fog::Compute::Cloudstack::SecurityGroup
10
+
11
+ def all(options={})
12
+ data = connection.list_security_groups(options)["listsecuritygroupsresponse"]["securitygroup"] || []
13
+ load(data)
14
+ end
15
+
16
+ def get(security_group_id)
17
+ if security_group = connection.list_security_groups('id' => security_group_id)["listsecuritygroupsresponse"]["securitygroup"].first
18
+ new(security_group)
19
+ end
20
+ rescue Fog::Compute::Cloudstack::BadRequest
21
+ nil
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -4,39 +4,54 @@ module Fog
4
4
  module Compute
5
5
  class Cloudstack
6
6
  class Server < Fog::Compute::Server
7
- identity :id, :aliases => 'id'
7
+ identity :id, :aliases => 'id'
8
8
  attribute :name
9
- attribute :account
10
- attribute :domain
9
+ attribute :account_name, :aliases => 'account'
10
+ attribute :domain_name, :aliases => 'domain'
11
11
  attribute :created
12
12
  attribute :state
13
13
  attribute :haenable
14
14
  attribute :memory
15
- attribute :display_name, :aliases => 'displayname'
16
- attribute :domain_id, :aliases => 'domainid'
17
- attribute :host_id, :aliases => 'hostid'
18
- attribute :host_name, :aliases => 'hostname'
19
- attribute :project_id, :aliases => 'projectid'
20
- attribute :zone_id, :aliases => 'zoneid'
21
- attribute :zone_name, :aliases => 'zonename'
22
- attribute :image_id, :aliases => ['templateid', :template_id]
23
- attribute :image_name, :aliases => ['templatename', :template_name]
24
- attribute :templated_display_text, :aliases => 'templatedisplaytext'
25
- attribute :password_enabled, :aliases => 'passwordenabled'
26
- attribute :flavor_id, :aliases => ['serviceofferingid', :service_offering_id]
27
- attribute :flavor_name, :aliases => ['serviceofferingname', :service_offering_name]
28
- attribute :cpu_number, :aliases => 'cpunumber'
29
- attribute :cpu_speed, :aliases => 'cpuspeed'
30
- attribute :cpu_used, :aliases => 'cpuused'
31
- attribute :network_kbs_read, :aliases => 'networkkbsread'
32
- attribute :network_kbs_write, :aliases => 'networkkbswrite'
33
- attribute :guest_os_id, :aliases => 'guestosid'
34
- attribute :root_device_id, :aliases => 'rootdeviceid'
35
- attribute :root_device_type, :aliases => 'rootdevicetype'
36
- attribute :security_group, :aliases => 'securitygroup'
37
- attribute :nics, :aliases => 'nic'
15
+ attribute :display_name, :aliases => 'displayname'
16
+ attribute :domain_id, :aliases => 'domainid'
17
+ attribute :host_id, :aliases => 'hostid'
18
+ attribute :host_name, :aliases => 'hostname'
19
+ attribute :project_id, :aliases => 'projectid'
20
+ attribute :zone_id, :aliases => 'zoneid'
21
+ attribute :zone_name, :aliases => 'zonename'
22
+ attribute :image_id, :aliases => ['templateid', :template_id]
23
+ attribute :image_name, :aliases => ['templatename', :template_name]
24
+ attribute :templated_display_text, :aliases => 'templatedisplaytext'
25
+ attribute :password_enabled, :aliases => 'passwordenabled'
26
+ attribute :flavor_id, :aliases => ['serviceofferingid', :service_offering_id]
27
+ attribute :flavor_name, :aliases => ['serviceofferingname', :service_offering_name]
28
+ attribute :cpu_number, :aliases => 'cpunumber'
29
+ attribute :cpu_speed, :aliases => 'cpuspeed'
30
+ attribute :cpu_used, :aliases => 'cpuused'
31
+ attribute :network_kbs_read, :aliases => 'networkkbsread'
32
+ attribute :network_kbs_write, :aliases => 'networkkbswrite'
33
+ attribute :guest_os_id, :aliases => 'guestosid'
34
+ attribute :root_device_id, :aliases => 'rootdeviceid'
35
+ attribute :root_device_type, :aliases => 'rootdevicetype'
36
+ attribute :security_group_list, :type => :array, :aliases => 'securitygroup'
37
+ attribute :nics, :type => :array, :aliases => 'nic'
38
38
 
39
39
  attr_accessor :network_ids, :disk_offering_id, :ip_address, :ip_to_network_list
40
+ attr_writer :security_group_ids
41
+
42
+ def addresses
43
+ nics.map{|nic| Address.new(nic)}
44
+ end
45
+
46
+ def destroy
47
+ requires :id
48
+ data = connection.destroy_virtual_machine("id" => id)
49
+ connection.jobs.new(data["destroyvirtualmachineresponse"])
50
+ end
51
+
52
+ def flavor
53
+ connection.flavors.get(self.flavor_id)
54
+ end
40
55
 
41
56
  def ready?
42
57
  state == 'Running'
@@ -45,9 +60,19 @@ module Fog
45
60
  def reboot
46
61
  requires :id
47
62
  data = connection.reboot_virtual_machine('id' => self.id) # FIXME: does this ever fail?
48
- job = Job.new(data["rebootvirtualmachineresponse"])
49
- job.connection= self.connection
50
- job
63
+ connection.jobs.new(data["rebootvirtualmachineresponse"])
64
+ end
65
+
66
+ def security_groups=(security_groups)
67
+ self.security_group_ids= Array(security_groups).map(&:id)
68
+ end
69
+
70
+ def security_group_ids
71
+ @security_group_ids || (self.security_group_list || []).map{|sg| sg["id"]}
72
+ end
73
+
74
+ def security_groups
75
+ security_group_ids.map{|id| self.connection.security_groups.get(id)}
51
76
  end
52
77
 
53
78
  def save
@@ -64,27 +89,26 @@ module Fog
64
89
  'hostid' => host_id,
65
90
  'ipaddress' => ip_address,
66
91
  'iptonetworklist' => ip_to_network_list,
67
- 'projectid' => project_id
92
+ 'projectid' => project_id,
68
93
  }
69
94
 
70
95
  options.merge!('networkids' => network_ids) if network_ids
96
+ options.merge!('securitygroupids' => security_group_ids) if security_group_ids
71
97
 
72
98
  data = connection.deploy_virtual_machine(options)
73
99
  merge_attributes(data['deployvirtualmachineresponse'])
74
100
  end
75
101
 
76
- def addresses
77
- nics.map{|nic| Address.new(nic)}
78
- end
79
-
80
- def flavor
81
- connection.flavors.get(self.flavor_id)
102
+ def start
103
+ requires :id
104
+ data = connection.start_virtual_machine("id" => self.id)
105
+ connection.jobs.new(data["startvirtualmachineresponse"])
82
106
  end
83
107
 
84
- def destroy
108
+ def stop(force=false)
85
109
  requires :id
86
- connection.destroy_virtual_machine(:id => id)
87
- true
110
+ data = connection.stop_virtual_machine("id" => self.id, "force" => force)
111
+ connection.jobs.new(data["stopvirtualmachineresponse"])
88
112
  end
89
113
  end # Server
90
114
  end # Cloudstack