fog 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +3 -3
  3. data/changelog.txt +213 -0
  4. data/docs/compute/index.markdown +15 -1
  5. data/fog.gemspec +3 -3
  6. data/lib/fog.rb +1 -1
  7. data/lib/fog/aws.rb +9 -0
  8. data/lib/fog/aws/auto_scaling.rb +3 -1
  9. data/lib/fog/aws/cloud_formation.rb +2 -0
  10. data/lib/fog/aws/cloud_watch.rb +2 -0
  11. data/lib/fog/aws/compute.rb +9 -3
  12. data/lib/fog/aws/elasticache.rb +8 -1
  13. data/lib/fog/aws/elb.rb +2 -0
  14. data/lib/fog/aws/models/cloud_watch/metric_statistic.rb +1 -2
  15. data/lib/fog/aws/models/compute/security_group.rb +1 -1
  16. data/lib/fog/aws/models/compute/server.rb +3 -1
  17. data/lib/fog/aws/models/dns/records.rb +3 -3
  18. data/lib/fog/aws/models/elb/load_balancer.rb +6 -0
  19. data/lib/fog/aws/models/storage/file.rb +2 -2
  20. data/lib/fog/aws/models/storage/files.rb +4 -4
  21. data/lib/fog/aws/parsers/compute/describe_instance_status.rb +64 -0
  22. data/lib/fog/aws/parsers/compute/describe_security_groups.rb +1 -1
  23. data/lib/fog/aws/parsers/sqs/receive_message.rb +1 -1
  24. data/lib/fog/aws/parsers/sts/get_session_token.rb +31 -0
  25. data/lib/fog/aws/rds.rb +36 -1
  26. data/lib/fog/aws/requests/compute/describe_availability_zones.rb +3 -0
  27. data/lib/fog/aws/requests/compute/describe_instance_status.rb +36 -0
  28. data/lib/fog/aws/requests/compute/describe_security_groups.rb +2 -0
  29. data/lib/fog/aws/requests/elb/set_load_balancer_listener_ssl_certificate.rb +27 -0
  30. data/lib/fog/aws/requests/rds/create_db_instance.rb +64 -1
  31. data/lib/fog/aws/requests/rds/delete_db_instance.rb +19 -3
  32. data/lib/fog/aws/requests/rds/describe_db_instances.rb +40 -1
  33. data/lib/fog/aws/requests/rds/describe_db_reserved_instances.rb +1 -1
  34. data/lib/fog/aws/requests/rds/modify_db_instance.rb +24 -1
  35. data/lib/fog/aws/requests/rds/reboot_db_instance.rb +17 -1
  36. data/lib/fog/aws/requests/storage/{hash_to_acl.rb → acl_utils.rb} +8 -0
  37. data/lib/fog/aws/requests/storage/copy_object.rb +8 -0
  38. data/lib/fog/aws/requests/storage/get_bucket_acl.rb +7 -1
  39. data/lib/fog/aws/requests/storage/get_object_acl.rb +7 -1
  40. data/lib/fog/aws/requests/storage/get_object_http_url.rb +4 -3
  41. data/lib/fog/aws/requests/storage/get_object_https_url.rb +4 -3
  42. data/lib/fog/aws/requests/storage/put_bucket_acl.rb +2 -2
  43. data/lib/fog/aws/requests/storage/put_object_acl.rb +1 -1
  44. data/lib/fog/aws/requests/sts/get_federation_token.rb +20 -0
  45. data/lib/fog/aws/requests/sts/get_session_token.rb +18 -0
  46. data/lib/fog/aws/simpledb.rb +5 -1
  47. data/lib/fog/aws/sns.rb +2 -0
  48. data/lib/fog/aws/sqs.rb +5 -1
  49. data/lib/fog/aws/storage.rb +6 -0
  50. data/lib/fog/aws/sts.rb +137 -0
  51. data/lib/fog/bin.rb +1 -0
  52. data/lib/fog/bin/aws.rb +2 -0
  53. data/lib/fog/bin/clodo.rb +31 -0
  54. data/lib/fog/brightbox/compute.rb +7 -0
  55. data/lib/fog/brightbox/models/compute/cloud_ip.rb +10 -2
  56. data/lib/fog/brightbox/models/compute/firewall_policies.rb +29 -0
  57. data/lib/fog/brightbox/models/compute/firewall_policy.rb +65 -0
  58. data/lib/fog/brightbox/models/compute/firewall_rule.rb +54 -0
  59. data/lib/fog/brightbox/models/compute/firewall_rules.rb +24 -0
  60. data/lib/fog/brightbox/models/compute/image.rb +2 -0
  61. data/lib/fog/brightbox/models/compute/server.rb +41 -6
  62. data/lib/fog/brightbox/models/compute/server_group.rb +56 -17
  63. data/lib/fog/brightbox/requests/compute/remove_firewall_policy.rb +14 -0
  64. data/lib/fog/clodo.rb +34 -0
  65. data/lib/fog/clodo/compute.rb +152 -0
  66. data/lib/fog/clodo/models/compute/image.rb +31 -0
  67. data/lib/fog/clodo/models/compute/images.rb +28 -0
  68. data/lib/fog/clodo/models/compute/server.rb +163 -0
  69. data/lib/fog/clodo/models/compute/servers.rb +36 -0
  70. data/lib/fog/clodo/requests/compute/add_ip_address.rb +49 -0
  71. data/lib/fog/clodo/requests/compute/create_server.rb +112 -0
  72. data/lib/fog/clodo/requests/compute/delete_ip_address.rb +47 -0
  73. data/lib/fog/clodo/requests/compute/delete_server.rb +44 -0
  74. data/lib/fog/clodo/requests/compute/get_image_details.rb +20 -0
  75. data/lib/fog/clodo/requests/compute/get_server_details.rb +49 -0
  76. data/lib/fog/clodo/requests/compute/list_images.rb +48 -0
  77. data/lib/fog/clodo/requests/compute/list_images_detail.rb +61 -0
  78. data/lib/fog/clodo/requests/compute/list_servers.rb +50 -0
  79. data/lib/fog/clodo/requests/compute/list_servers_detail.rb +51 -0
  80. data/lib/fog/clodo/requests/compute/move_ip_address.rb +34 -0
  81. data/lib/fog/clodo/requests/compute/reboot_server.rb +19 -0
  82. data/lib/fog/clodo/requests/compute/rebuild_server.rb +21 -0
  83. data/lib/fog/clodo/requests/compute/server_action.rb +25 -0
  84. data/lib/fog/clodo/requests/compute/start_server.rb +19 -0
  85. data/lib/fog/clodo/requests/compute/stop_server.rb +19 -0
  86. data/lib/fog/compute.rb +3 -0
  87. data/lib/fog/core/credentials.rb +3 -3
  88. data/lib/fog/core/errors.rb +2 -0
  89. data/lib/fog/core/wait_for.rb +1 -1
  90. data/lib/fog/dnsmadeeasy/dns.rb +1 -1
  91. data/lib/fog/libvirt/compute.rb +2 -0
  92. data/lib/fog/libvirt/models/compute/nodes.rb +1 -3
  93. data/lib/fog/libvirt/models/compute/server.rb +8 -1
  94. data/lib/fog/providers.rb +1 -0
  95. data/lib/fog/rackspace/dns.rb +10 -2
  96. data/lib/fog/rackspace/load_balancers.rb +3 -0
  97. data/lib/fog/rackspace/models/compute/server.rb +2 -2
  98. data/lib/fog/rackspace/models/dns/callback.rb +3 -1
  99. data/lib/fog/rackspace/models/dns/record.rb +4 -0
  100. data/lib/fog/rackspace/models/load_balancers/load_balancer.rb +18 -8
  101. data/lib/fog/rackspace/requests/load_balancers/delete_nodes.rb +1 -2
  102. data/lib/fog/rackspace/requests/load_balancers/get_error_page.rb +15 -0
  103. data/lib/fog/rackspace/requests/load_balancers/list_load_balancers.rb +8 -2
  104. data/lib/fog/rackspace/requests/load_balancers/remove_error_page.rb +15 -0
  105. data/lib/fog/rackspace/requests/load_balancers/set_error_page.rb +21 -0
  106. data/lib/fog/vcloud/compute.rb +7 -1
  107. data/lib/fog/vcloud/models/compute/catalogs.rb +4 -5
  108. data/lib/fog/vcloud/models/compute/helpers/status.rb +37 -0
  109. data/lib/fog/vcloud/models/compute/network.rb +13 -49
  110. data/lib/fog/vcloud/models/compute/networks.rb +12 -3
  111. data/lib/fog/vcloud/models/compute/organization.rb +44 -0
  112. data/lib/fog/vcloud/models/compute/organizations.rb +29 -0
  113. data/lib/fog/vcloud/models/compute/server.rb +35 -56
  114. data/lib/fog/vcloud/models/compute/servers.rb +11 -13
  115. data/lib/fog/vcloud/models/compute/vapp.rb +41 -0
  116. data/lib/fog/vcloud/models/compute/vapps.rb +32 -0
  117. data/lib/fog/vcloud/models/compute/vdc.rb +11 -26
  118. data/lib/fog/vcloud/models/compute/vdcs.rb +6 -8
  119. data/lib/fog/vcloud/requests/compute/get_server.rb +10 -0
  120. data/lib/fog/vsphere/compute.rb +1 -0
  121. data/lib/fog/vsphere/models/compute/server.rb +18 -0
  122. data/lib/fog/vsphere/models/compute/servers.rb +8 -2
  123. data/lib/fog/vsphere/requests/compute/datacenters.rb +34 -0
  124. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +132 -91
  125. data/lib/fog/vsphere/requests/compute/vm_clone.rb +76 -37
  126. data/spec/lib/fog/aws/parsers/sqs/receive_message_spec.rb +58 -0
  127. data/tests/aws/models/elb/model_tests.rb +5 -0
  128. data/tests/aws/requests/compute/instance_tests.rb +23 -0
  129. data/tests/aws/requests/compute/security_group_tests.rb +1 -0
  130. data/tests/aws/requests/elb/listener_tests.rb +4 -0
  131. data/tests/aws/requests/storage/{hash_to_acl_tests.rb → acl_utils_tests.rb} +38 -2
  132. data/tests/aws/requests/storage/bucket_tests.rb +0 -3
  133. data/tests/aws/requests/storage/object_tests.rb +2 -4
  134. data/tests/aws/requests/sts/get_federation_token_tests.rb +21 -0
  135. data/tests/aws/requests/sts/session_token_tests.rb +16 -0
  136. data/tests/brightbox/requests/compute/account_tests.rb +11 -6
  137. data/tests/brightbox/requests/compute/api_client_tests.rb +23 -12
  138. data/tests/brightbox/requests/compute/cloud_ip_tests.rb +32 -17
  139. data/tests/brightbox/requests/compute/helper.rb +29 -3
  140. data/tests/brightbox/requests/compute/image_tests.rb +17 -14
  141. data/tests/brightbox/requests/compute/interface_tests.rb +3 -2
  142. data/tests/brightbox/requests/compute/load_balancer_tests.rb +57 -11
  143. data/tests/brightbox/requests/compute/server_group_tests.rb +29 -22
  144. data/tests/brightbox/requests/compute/server_tests.rb +41 -22
  145. data/tests/brightbox/requests/compute/server_type_tests.rb +7 -6
  146. data/tests/brightbox/requests/compute/user_tests.rb +11 -16
  147. data/tests/brightbox/requests/compute/zone_tests.rb +7 -6
  148. data/tests/clodo/requests/compute/image_tests.rb +36 -0
  149. data/tests/clodo/requests/compute/server_tests.rb +152 -0
  150. data/tests/compute/helper.rb +1 -1
  151. data/tests/core/credential_tests.rb +2 -2
  152. data/tests/glesys/requests/compute/helper.rb +91 -66
  153. data/tests/glesys/requests/compute/ip_tests.rb +1 -1
  154. data/tests/glesys/requests/compute/server_tests.rb +5 -5
  155. data/tests/helpers/mock_helper.rb +2 -0
  156. data/tests/rackspace/models/dns/zone_tests.rb +14 -0
  157. data/tests/rackspace/models/{access_list_tests.rb → load_balancers/access_list_tests.rb} +0 -0
  158. data/tests/rackspace/models/{access_lists_tests.rb → load_balancers/access_lists_tests.rb} +0 -0
  159. data/tests/rackspace/models/{load_balancer_tests.rb → load_balancers/load_balancer_tests.rb} +25 -0
  160. data/tests/rackspace/models/{load_balancers_tests.rb → load_balancers/load_balancers_tests.rb} +0 -0
  161. data/tests/rackspace/models/{node_tests.rb → load_balancers/node_tests.rb} +0 -0
  162. data/tests/rackspace/models/{nodes_tests.rb → load_balancers/nodes_tests.rb} +0 -0
  163. data/tests/rackspace/models/{virtual_ip_tests.rb → load_balancers/virtual_ip_tests.rb} +0 -0
  164. data/tests/rackspace/models/{virtual_ips_tests.rb → load_balancers/virtual_ips_tests.rb} +0 -0
  165. data/tests/rackspace/requests/dns/dns_tests.rb +4 -2
  166. data/tests/rackspace/requests/load_balancers/error_page_tests.rb +31 -0
  167. data/tests/rackspace/requests/load_balancers/helper.rb +27 -11
  168. data/tests/rackspace/requests/load_balancers/load_balancer_tests.rb +4 -1
  169. data/tests/rackspace/requests/load_balancers/node_tests.rb +24 -25
  170. data/tests/slicehost/requests/compute/slice_tests.rb +2 -2
  171. data/tests/storm_on_demand/requests/compute/server_tests.rb +3 -3
  172. data/tests/vcloud/data/api_+_v1.0_+_admin_+_network_+_2 +110 -0
  173. data/tests/vcloud/data/api_+_v1.0_+_login +5 -0
  174. data/tests/vcloud/data/api_+_v1.0_+_network_+_1 +44 -0
  175. data/tests/vcloud/data/api_+_v1.0_+_network_+_2 +31 -0
  176. data/tests/vcloud/data/api_+_v1.0_+_org_+_1 +17 -0
  177. data/tests/vcloud/data/api_+_v1.0_+_vApp_+_vapp-1 +369 -0
  178. data/tests/vcloud/data/api_+_v1.0_+_vApp_+_vm-1 +139 -0
  179. data/tests/vcloud/data/api_+_v1.0_+_vApp_+_vm-2 +155 -0
  180. data/tests/vcloud/data/api_+_v1.0_+_vdc_+_1 +61 -0
  181. data/tests/vcloud/models/compute/conn_helper.rb +20 -0
  182. data/tests/vcloud/models/compute/network_tests.rb +65 -0
  183. data/tests/vcloud/models/compute/networks_tests.rb +42 -0
  184. data/tests/vcloud/models/compute/organization_tests.rb +13 -0
  185. data/tests/vcloud/models/compute/organizations_tests.rb +14 -0
  186. data/tests/vcloud/models/compute/server_tests.rb +136 -0
  187. data/tests/vcloud/models/compute/servers_tests.rb +10 -89
  188. data/tests/vcloud/models/compute/vapp_tests.rb +27 -0
  189. data/tests/vcloud/models/compute/vapps_tests.rb +17 -0
  190. data/tests/vcloud/models/compute/vdc_tests.rb +42 -0
  191. data/tests/vcloud/models/compute/vdcs_tests.rb +17 -0
  192. data/tests/vsphere/requests/compute/vm_clone_tests.rb +2 -6
  193. metadata +151 -55
@@ -13,8 +13,9 @@ module Fog
13
13
  attribute :href, :aliases => :Href
14
14
 
15
15
  def all
16
- check_href!(:parent => "Vdc")
17
- load(_vapps)
16
+ check_href!("Vapp")
17
+ vapp.load_unless_loaded!
18
+ load(vapp.children||[])
18
19
  end
19
20
 
20
21
  def get(uri)
@@ -37,19 +38,16 @@ module Fog
37
38
 
38
39
  private
39
40
 
40
- def _resource_entities
41
- if Hash === resource_entities = connection.get_vdc(href).body[:ResourceEntities]
42
- resource_entities[:ResourceEntity]
43
- end
41
+ def vapp
42
+ @vapp ||= (attributes[:vapp] || init_vapp)
44
43
  end
45
44
 
46
- def _vapps
47
- resource_entities = _resource_entities
48
- if resource_entities.nil?
49
- []
50
- else
51
- resource_entities.select {|re| re[:type] == 'application/vnd.vmware.vcloud.vApp+xml' }
52
- end
45
+ def init_vapp
46
+ Fog::Vcloud::Compute::Vapp.new(
47
+ :connection => connection,
48
+ :href => self.href,
49
+ :collection => Fog::Vcloud::Compute::Vapps.new(:connection => connection)
50
+ )
53
51
  end
54
52
 
55
53
  end
@@ -0,0 +1,41 @@
1
+ require 'fog/vcloud/models/compute/helpers/status'
2
+ module Fog
3
+ module Vcloud
4
+ class Compute
5
+ class Vapp < Fog::Vcloud::Model
6
+
7
+ include Fog::Vcloud::Compute::Helpers::Status
8
+
9
+ identity :href
10
+
11
+ ignore_attributes :xmlns, :xmlns_xsi, :xmlns_xsd
12
+
13
+ attribute :name
14
+ attribute :type
15
+ attribute :status
16
+ attribute :description, :aliases => :Description
17
+ attribute :deployed, :type => :boolean
18
+
19
+ attribute :children, :aliases => :Children, :squash => :Vm
20
+ attribute :lease_settings, :aliases => :LeaseSettingsSection
21
+
22
+ attribute :other_links, :aliases => :Link
23
+
24
+ def servers
25
+ @servers ||= Fog::Vcloud::Compute::Servers.
26
+ new( :connection => connection,
27
+ :href => href,
28
+ :vapp => self
29
+ )
30
+ end
31
+
32
+ def networks
33
+ @networks ||= Fog::Vcloud::Compute::Networks.
34
+ new( :connection => connection,
35
+ :href => href
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,32 @@
1
+ require 'fog/vcloud/models/compute/vapp'
2
+
3
+ module Fog
4
+ module Vcloud
5
+ class Compute
6
+
7
+ class Vapps < Collection
8
+
9
+ model Fog::Vcloud::Compute::Vapp
10
+
11
+ undef_method :create
12
+
13
+ attribute :href
14
+
15
+ def all
16
+ resource_entities = (re=connection.get_vdc(self.href).body[:ResourceEntities][:ResourceEntity]).is_a?(Array) ? re : [re].compact
17
+ data = resource_entities.select { |re| re[:type] == "application/vnd.vmware.vcloud.vApp+xml" }
18
+ load(data)
19
+ end
20
+
21
+ def get(uri)
22
+ if data = connection.get_vapp(uri)
23
+ new(data.body)
24
+ end
25
+ rescue Fog::Errors::NotFound
26
+ nil
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -10,13 +10,17 @@ module Fog
10
10
  attribute :name
11
11
  attribute :type
12
12
  attribute :description, :aliases => :Description
13
- attribute :other_links, :aliases => :Link
13
+ attribute :network_quota, :aliases => :NetworkQuota, :type => :integer
14
+ attribute :nic_quota, :aliases => :NicQuota, :type => :integer
15
+ attribute :vm_quota, :aliases => :VmQuota, :type => :integer
16
+ attribute :is_enabled, :aliases => :IsEnabled, :type => :boolean
14
17
  attribute :compute_capacity, :aliases => :ComputeCapacity
15
18
  attribute :storage_capacity, :aliases => :StorageCapacity
16
19
  attribute :available_networks, :aliases => :AvailableNetworks, :squash => :Network
20
+
21
+ attribute :other_links, :aliases => :Link
22
+
17
23
  attribute :resource_entities, :aliases => :ResourceEntities, :squash => :ResourceEntity
18
- attribute :deployed_vm_quota
19
- attribute :instantiated_vm_quota
20
24
 
21
25
  def networks
22
26
  @networks ||= Fog::Vcloud::Compute::Networks.
@@ -24,32 +28,13 @@ module Fog
24
28
  :href => href )
25
29
  end
26
30
 
27
- def servers
28
- @servers ||= Fog::Vcloud::Compute::Servers.
31
+ def vapps
32
+ @vapps ||= Fog::Vcloud::Compute::Vapps.
29
33
  new( :connection => connection,
30
- :href => href )
34
+ :href => href
35
+ )
31
36
  end
32
37
 
33
- def tasks
34
- @tasks ||= Fog::Vcloud::Compute::Tasks.
35
- new( :connection => connection,
36
- :href => href + "/tasksList" )
37
- end
38
-
39
- private
40
-
41
- def collection_based_on_type(type, klass = nil)
42
- load_unless_loaded!
43
- test_links = other_links.kind_of?(Array) ? other_links : [other_links]
44
- if link = test_links.detect { |link| link[:type] == type }
45
- case type
46
- when "application/vnd.vmware.vcloud.catalog+xml"
47
- Fog::Vcloud::Compute::Catalog
48
- end.new( :connection => connection, :href => link[:href] )
49
- else
50
- [ ]
51
- end
52
- end
53
38
  end
54
39
  end
55
40
  end
@@ -10,8 +10,11 @@ module Fog
10
10
 
11
11
  undef_method :create
12
12
 
13
+ attribute :href
14
+
13
15
  def all
14
- data = connection.get_organization(organization_uri).body[:Link].select { |link| link[:type] == "application/vnd.vmware.vcloud.vdc+xml" }
16
+ links = (l=connection.get_organization(org_uri).body[:Link]).is_a?(Array) ? l : [l].compact
17
+ data = links.select { |link| link[:type] == "application/vnd.vmware.vcloud.vdc+xml" }
15
18
  data.each { |link| link.delete_if { |key, value| [:rel].include?(key) } }
16
19
  load(data)
17
20
  end
@@ -24,16 +27,11 @@ module Fog
24
27
  nil
25
28
  end
26
29
 
27
- def organization_uri
28
- @organization_uri ||= connection.default_organization_uri
29
- end
30
-
31
30
  private
32
31
 
33
- def organization_uri=(new_organization_uri)
34
- @organization_uri = new_organization_uri
32
+ def org_uri
33
+ self.href ||= connection.default_organization_uri
35
34
  end
36
-
37
35
  end
38
36
  end
39
37
  end
@@ -0,0 +1,10 @@
1
+ module Fog
2
+ module Vcloud
3
+ class Compute
4
+
5
+ class Real
6
+ basic_request :get_server
7
+ end
8
+ end
9
+ end
10
+ end
@@ -21,6 +21,7 @@ module Fog
21
21
  request :vm_reboot
22
22
  request :vm_clone
23
23
  request :vm_destroy
24
+ request :datacenters
24
25
 
25
26
  module Shared
26
27
 
@@ -57,6 +57,24 @@ module Fog
57
57
  connection.vm_destroy('instance_uuid' => instance_uuid)
58
58
  end
59
59
 
60
+ def clone(options = {})
61
+ requires :name, :path
62
+ # Convert symbols to strings
63
+ req_options = options.inject({}) { |hsh, (k,v)| hsh[k.to_s] = v; hsh }
64
+ # Give our path to the request
65
+ req_options['path'] ="#{path}/#{name}"
66
+ # Perform the actual clone
67
+ clone_results = connection.vm_clone(req_options)
68
+ # Create the new VM model.
69
+ new_vm = self.class.new(clone_results['vm_attributes'])
70
+ # We need to assign the collection and the connection otherwise we
71
+ # cannot reload the model.
72
+ new_vm.collection = self.collection
73
+ new_vm.connection = self.connection
74
+ # Return the new VM model.
75
+ new_vm
76
+ end
77
+
60
78
  end
61
79
 
62
80
  end
@@ -9,8 +9,14 @@ module Fog
9
9
 
10
10
  model Fog::Compute::Vsphere::Server
11
11
 
12
- def all
13
- response = connection.list_virtual_machines
12
+ # 'path' => '/Datacenters/vm/Jeff/Templates' will be MUCH faster.
13
+ # than simply listing everything.
14
+ def all(filters = {})
15
+ # REVISIT: I'm not sure if this is the best way to implement search
16
+ # filters on a collection but it does work. I need to study the AWS
17
+ # code more to make sure this matches up.
18
+ filters['folder'] ||= attributes['folder']
19
+ response = connection.list_virtual_machines(filters)
14
20
  load(response['virtual_machines'])
15
21
  end
16
22
 
@@ -0,0 +1,34 @@
1
+ module Fog
2
+ module Compute
3
+ class Vsphere
4
+ class Real
5
+ def datacenters
6
+ @datacenters ||= datacenters_reload
7
+ # Hide the values which are the RbVmomi instances
8
+ @datacenters.keys
9
+ end
10
+
11
+ private
12
+
13
+ def datacenters_reload
14
+ @rootfolder ||= @connection.rootFolder
15
+ inventory = @rootfolder.inventory(:Datacenter => [ 'name' ])[@rootfolder]
16
+ # Convert the inventory into a Hash of the form: We remove the
17
+ # property selectors. { "<dc_name>" => #<RbVmomi::VIM::Datacenter> }
18
+ # The Datacenter instance itself is at index 0 and the properties we
19
+ # collected are at index 1.
20
+ inventory.inject({}) do |memo, (name,dc_ary)|
21
+ memo[name] = dc_ary[0]
22
+ memo
23
+ end
24
+ end
25
+ end
26
+
27
+ class Mock
28
+ def datacenters
29
+ [ "Solutions", "Solutions2", "Solutions3" ]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,13 +1,15 @@
1
1
  module Fog
2
2
  module Compute
3
3
  class Vsphere
4
-
5
4
  class Real
6
-
7
5
  def list_virtual_machines(options = {})
8
- # First, determine if there's a search filter
6
+ # Listing all VM's can be quite slow and expensive. Try and optimize
7
+ # based on the available options we have. These conditions are in
8
+ # ascending order of time to complete for large deployments.
9
9
  if options['instance_uuid'] then
10
10
  list_all_virtual_machines_by_instance_uuid(options)
11
+ elsif options['folder'] then
12
+ list_all_virtual_machines_in_folder(options)
11
13
  else
12
14
  list_all_virtual_machines
13
15
  end
@@ -15,6 +17,48 @@ module Fog
15
17
 
16
18
  private
17
19
 
20
+ def list_all_virtual_machines_in_folder(options = {})
21
+ # Tap gets rid of the leading empty string and "Datacenters" element
22
+ # and returns the array.
23
+ path_elements = options['folder'].split('/').tap { |ary| ary.shift 2 }
24
+ # The DC name itself.
25
+ dc_name = path_elements.shift
26
+ # If the first path element contains "vm" this denotes the vmFolder
27
+ # and needs to be shifted out since each DC contains only one
28
+ # vmFolder
29
+ path_elements.shift if path_elements[0] = 'vm'
30
+ # Make sure @datacenters is populated (the keys are DataCenter instances)
31
+ self.datacenters.include? dc_name or raise ArgumentError, "Could not find a Datacenter named #{dc_name}"
32
+ # Get the datacenter managed object
33
+ dc = @datacenters[dc_name]
34
+
35
+ # Get the VM Folder (Group) efficiently
36
+ vm_folder = dc.vmFolder
37
+
38
+ # Walk the tree resetting the folder pointer as we go
39
+ folder = path_elements.inject(vm_folder) do |current_folder, sub_folder_name|
40
+ # JJM VIM::Folder#find appears to be quite efficient as it uses the
41
+ # searchIndex It certainly appears to be faster than
42
+ # VIM::Folder#inventory since that returns _all_ managed objects of
43
+ # a certain type _and_ their properties.
44
+ sub_folder = current_folder.find(sub_folder_name, RbVmomi::VIM::Folder)
45
+ raise ArgumentError, "Could not descend into #{sub_folder_name}. Please check your path." unless sub_folder
46
+ sub_folder
47
+ end
48
+
49
+ # This should be efficient since we're not obtaining properties
50
+ virtual_machines = folder.children.inject([]) do |ary, child|
51
+ if child.is_a? RbVmomi::VIM::VirtualMachine then
52
+ ary << convert_vm_mob_ref_to_attr_hash(child)
53
+ end
54
+ ary
55
+ end
56
+
57
+ # Return the managed objects themselves as an array. These may be converted
58
+ # to an attribute has using convert_vm_mob_ref_to_attr_hash
59
+ { 'virtual_machines' => virtual_machines }
60
+ end
61
+
18
62
  def list_all_virtual_machines_by_instance_uuid(options = {})
19
63
  uuid = options['instance_uuid']
20
64
  search_filter = { :uuid => uuid, 'vmSearch' => true, 'instanceUuid' => true }
@@ -94,102 +138,99 @@ module Fog
94
138
  case options['instance_uuid']
95
139
  when nil
96
140
  rval = YAML.load <<-'ENDvmLISTING'
97
- ---
98
- virtual_machines:
99
- - name: centos56gm
100
- hypervisor: gunab.puppetlabs.lan
101
- tools_version: guestToolsCurrent
102
- ipaddress:
103
- mo_ref: vm-698
104
- power_state: poweredOff
105
- uuid: 42322347-d791-cd34-80b9-e25fe28ad37c
106
- is_a_template: true
107
- id: 50323f93-6835-1178-8b8f-9e2109890e1a
108
- tools_state: toolsNotRunning
109
- connection_state: connected
110
- instance_uuid: 50323f93-6835-1178-8b8f-9e2109890e1a
111
- hostname:
112
- mac_addresses:
113
- Network adapter 1: 00:50:56:b2:00:a1
114
- operatingsystem:
115
- - name: centos56gm2
116
- hypervisor: gunab.puppetlabs.lan
117
- tools_version: guestToolsCurrent
118
- ipaddress:
119
- mo_ref: vm-640
120
- power_state: poweredOff
121
- uuid: 564ddcbe-853a-d29a-b329-a0a3693a004d
122
- is_a_template: true
123
- id: 5257dee8-050c-cbcd-ae25-db0e582ab530
124
- tools_state: toolsNotRunning
125
- connection_state: connected
126
- instance_uuid: 5257dee8-050c-cbcd-ae25-db0e582ab530
127
- hostname:
128
- mac_addresses:
129
- Network adapter 1: 00:0c:29:3a:00:4d
130
- operatingsystem:
131
- - name: dashboard_gm
132
- hypervisor: gunab.puppetlabs.lan
133
- tools_version: guestToolsCurrent
134
- ipaddress: 192.168.100.184
135
- mo_ref: vm-669
136
- power_state: poweredOn
137
- uuid: 564d3f91-3452-a509-a678-1246f7897979
138
- is_a_template: false
139
- id: 5032739c-c871-c0d2-034f-9700a0b5383e
140
- tools_state: toolsOk
141
- connection_state: connected
142
- instance_uuid: 5032739c-c871-c0d2-034f-9700a0b5383e
143
- hostname: compliance.puppetlabs.vm
144
- mac_addresses:
145
- Network adapter 1: 00:50:56:b2:00:96
146
- operatingsystem: Red Hat Enterprise Linux 6 (64-bit)
147
- - name: jefftest
148
- hypervisor: gunab.puppetlabs.lan
149
- tools_version: guestToolsCurrent
150
- ipaddress: 192.168.100.187
151
- mo_ref: vm-715
152
- power_state: poweredOn
153
- uuid: 42329da7-e8ab-29ec-1892-d6a4a964912a
154
- is_a_template: false
155
- id: 5032c8a5-9c5e-ba7a-3804-832a03e16381
156
- tools_state: toolsOk
157
- connection_state: connected
158
- instance_uuid: 5032c8a5-9c5e-ba7a-3804-832a03e16381
159
- hostname: centos56gm.localdomain
160
- mac_addresses:
161
- Network adapter 1: 00:50:56:b2:00:af
162
- operatingsystem: CentOS 4/5 (32-bit)
163
- ENDvmLISTING
141
+ ---
142
+ virtual_machines:
143
+ - name: centos56gm
144
+ hypervisor: gunab.puppetlabs.lan
145
+ tools_version: guestToolsCurrent
146
+ ipaddress:
147
+ mo_ref: vm-698
148
+ power_state: poweredOff
149
+ uuid: 42322347-d791-cd34-80b9-e25fe28ad37c
150
+ is_a_template: true
151
+ id: 50323f93-6835-1178-8b8f-9e2109890e1a
152
+ tools_state: toolsNotRunning
153
+ connection_state: connected
154
+ instance_uuid: 50323f93-6835-1178-8b8f-9e2109890e1a
155
+ hostname:
156
+ mac_addresses:
157
+ Network adapter 1: 00:50:56:b2:00:a1
158
+ operatingsystem:
159
+ - name: centos56gm2
160
+ hypervisor: gunab.puppetlabs.lan
161
+ tools_version: guestToolsCurrent
162
+ ipaddress:
163
+ mo_ref: vm-640
164
+ power_state: poweredOff
165
+ uuid: 564ddcbe-853a-d29a-b329-a0a3693a004d
166
+ is_a_template: true
167
+ id: 5257dee8-050c-cbcd-ae25-db0e582ab530
168
+ tools_state: toolsNotRunning
169
+ connection_state: connected
170
+ instance_uuid: 5257dee8-050c-cbcd-ae25-db0e582ab530
171
+ hostname:
172
+ mac_addresses:
173
+ Network adapter 1: 00:0c:29:3a:00:4d
174
+ operatingsystem:
175
+ - name: dashboard_gm
176
+ hypervisor: gunab.puppetlabs.lan
177
+ tools_version: guestToolsCurrent
178
+ ipaddress: 192.168.100.184
179
+ mo_ref: vm-669
180
+ power_state: poweredOn
181
+ uuid: 564d3f91-3452-a509-a678-1246f7897979
182
+ is_a_template: false
183
+ id: 5032739c-c871-c0d2-034f-9700a0b5383e
184
+ tools_state: toolsOk
185
+ connection_state: connected
186
+ instance_uuid: 5032739c-c871-c0d2-034f-9700a0b5383e
187
+ hostname: compliance.puppetlabs.vm
188
+ mac_addresses:
189
+ Network adapter 1: 00:50:56:b2:00:96
190
+ operatingsystem: Red Hat Enterprise Linux 6 (64-bit)
191
+ - name: jefftest
192
+ hypervisor: gunab.puppetlabs.lan
193
+ tools_version: guestToolsCurrent
194
+ ipaddress: 192.168.100.187
195
+ mo_ref: vm-715
196
+ power_state: poweredOn
197
+ uuid: 42329da7-e8ab-29ec-1892-d6a4a964912a
198
+ is_a_template: false
199
+ id: 5032c8a5-9c5e-ba7a-3804-832a03e16381
200
+ tools_state: toolsOk
201
+ connection_state: connected
202
+ instance_uuid: 5032c8a5-9c5e-ba7a-3804-832a03e16381
203
+ hostname: centos56gm.localdomain
204
+ mac_addresses:
205
+ Network adapter 1: 00:50:56:b2:00:af
206
+ operatingsystem: CentOS 4/5 (32-bit)
207
+ ENDvmLISTING
164
208
  when '5032c8a5-9c5e-ba7a-3804-832a03e16381'
165
209
  YAML.load <<-'5032c8a5-9c5e-ba7a-3804-832a03e16381'
166
- ---
167
- virtual_machines:
168
- - name: jefftest
169
- hypervisor: gunab.puppetlabs.lan
170
- tools_version: guestToolsCurrent
171
- ipaddress: 192.168.100.187
172
- mo_ref: vm-715
173
- power_state: poweredOn
174
- uuid: 42329da7-e8ab-29ec-1892-d6a4a964912a
175
- is_a_template: false
176
- id: 5032c8a5-9c5e-ba7a-3804-832a03e16381
177
- tools_state: toolsOk
178
- connection_state: connected
179
- instance_uuid: 5032c8a5-9c5e-ba7a-3804-832a03e16381
180
- hostname: centos56gm.localdomain
181
- mac_addresses:
182
- Network adapter 1: 00:50:56:b2:00:af
183
- operatingsystem: CentOS 4/5 (32-bit)
210
+ ---
211
+ virtual_machines:
212
+ - name: jefftest
213
+ hypervisor: gunab.puppetlabs.lan
214
+ tools_version: guestToolsCurrent
215
+ ipaddress: 192.168.100.187
216
+ mo_ref: vm-715
217
+ power_state: poweredOn
218
+ uuid: 42329da7-e8ab-29ec-1892-d6a4a964912a
219
+ is_a_template: false
220
+ id: 5032c8a5-9c5e-ba7a-3804-832a03e16381
221
+ tools_state: toolsOk
222
+ connection_state: connected
223
+ instance_uuid: 5032c8a5-9c5e-ba7a-3804-832a03e16381
224
+ hostname: centos56gm.localdomain
225
+ mac_addresses:
226
+ Network adapter 1: 00:50:56:b2:00:af
227
+ operatingsystem: CentOS 4/5 (32-bit)
184
228
  5032c8a5-9c5e-ba7a-3804-832a03e16381
185
229
  when 'does-not-exist-and-is-not-a-uuid', '50323f93-6835-1178-8b8f-9e2109890e1a'
186
230
  { 'virtual_machines' => [] }
187
231
  end
188
232
  end
189
-
190
233
  end
191
-
192
234
  end
193
235
  end
194
236
  end
195
-