fog 1.7.0 → 1.8.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 (219) hide show
  1. data/.gitignore +2 -2
  2. data/README.md +9 -10
  3. data/Rakefile +15 -299
  4. data/changelog.txt +153 -0
  5. data/docs/about/contributing.markdown +1 -0
  6. data/docs/dns/index.markdown +1 -1
  7. data/docs/index.markdown +8 -3
  8. data/fog.gemspec +3 -3
  9. data/lib/fog.rb +0 -5
  10. data/lib/fog/aws/auto_scaling.rb +1 -1
  11. data/lib/fog/aws/cloud_watch.rb +1 -1
  12. data/lib/fog/aws/compute.rb +2 -1
  13. data/lib/fog/aws/dynamodb.rb +30 -64
  14. data/lib/fog/aws/elb.rb +1 -1
  15. data/lib/fog/aws/glacier.rb +1 -1
  16. data/lib/fog/aws/iam.rb +1 -0
  17. data/lib/fog/aws/models/auto_scaling/group.rb +1 -1
  18. data/lib/fog/aws/models/compute/server.rb +2 -0
  19. data/lib/fog/aws/models/compute/volume.rb +0 -1
  20. data/lib/fog/aws/models/iam/user.rb +1 -1
  21. data/lib/fog/aws/parsers/compute/describe_instances.rb +3 -1
  22. data/lib/fog/aws/parsers/compute/describe_reserved_instances_offerings.rb +1 -1
  23. data/lib/fog/aws/parsers/storage/delete_multiple_objects.rb +50 -0
  24. data/lib/fog/aws/rds.rb +2 -2
  25. data/lib/fog/aws/requests/compute/describe_availability_zones.rb +3 -0
  26. data/lib/fog/aws/requests/compute/describe_reserved_instances_offerings.rb +11 -8
  27. data/lib/fog/aws/requests/compute/modify_volume_attribute.rb +51 -0
  28. data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +1 -0
  29. data/lib/fog/aws/requests/storage/delete_multiple_objects.rb +172 -0
  30. data/lib/fog/aws/signaturev4.rb +1 -1
  31. data/lib/fog/aws/sqs.rb +1 -1
  32. data/lib/fog/aws/storage.rb +2 -0
  33. data/lib/fog/bluebox/requests/compute/create_block.rb +1 -3
  34. data/lib/fog/brightbox/compute.rb +239 -84
  35. data/lib/fog/brightbox/models/compute/account.rb +9 -3
  36. data/lib/fog/brightbox/models/compute/server.rb +2 -1
  37. data/lib/fog/brightbox/models/compute/servers.rb +33 -1
  38. data/lib/fog/brightbox/oauth2.rb +164 -0
  39. data/lib/fog/brightbox/requests/compute/activate_console_server.rb +9 -2
  40. data/lib/fog/brightbox/requests/compute/add_listeners_load_balancer.rb +11 -2
  41. data/lib/fog/brightbox/requests/compute/add_nodes_load_balancer.rb +11 -2
  42. data/lib/fog/brightbox/requests/compute/add_servers_server_group.rb +9 -11
  43. data/lib/fog/brightbox/requests/compute/apply_to_firewall_policy.rb +11 -2
  44. data/lib/fog/brightbox/requests/compute/create_api_client.rb +11 -2
  45. data/lib/fog/brightbox/requests/compute/create_application.rb +11 -2
  46. data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +11 -1
  47. data/lib/fog/brightbox/requests/compute/create_firewall_policy.rb +13 -2
  48. data/lib/fog/brightbox/requests/compute/create_firewall_rule.rb +17 -2
  49. data/lib/fog/brightbox/requests/compute/create_image.rb +18 -2
  50. data/lib/fog/brightbox/requests/compute/create_load_balancer.rb +14 -2
  51. data/lib/fog/brightbox/requests/compute/create_server.rb +17 -2
  52. data/lib/fog/brightbox/requests/compute/create_server_group.rb +11 -2
  53. data/lib/fog/brightbox/requests/compute/destroy_api_client.rb +9 -2
  54. data/lib/fog/brightbox/requests/compute/destroy_application.rb +9 -2
  55. data/lib/fog/brightbox/requests/compute/destroy_cloud_ip.rb +9 -2
  56. data/lib/fog/brightbox/requests/compute/destroy_firewall_policy.rb +9 -2
  57. data/lib/fog/brightbox/requests/compute/destroy_firewall_rule.rb +9 -2
  58. data/lib/fog/brightbox/requests/compute/destroy_image.rb +9 -2
  59. data/lib/fog/brightbox/requests/compute/destroy_load_balancer.rb +9 -2
  60. data/lib/fog/brightbox/requests/compute/destroy_server.rb +9 -2
  61. data/lib/fog/brightbox/requests/compute/destroy_server_group.rb +9 -2
  62. data/lib/fog/brightbox/requests/compute/get_account.rb +7 -15
  63. data/lib/fog/brightbox/requests/compute/get_api_client.rb +9 -2
  64. data/lib/fog/brightbox/requests/compute/get_application.rb +9 -2
  65. data/lib/fog/brightbox/requests/compute/get_authenticated_user.rb +1 -3
  66. data/lib/fog/brightbox/requests/compute/get_cloud_ip.rb +9 -2
  67. data/lib/fog/brightbox/requests/compute/get_firewall_policy.rb +9 -2
  68. data/lib/fog/brightbox/requests/compute/get_firewall_rule.rb +9 -2
  69. data/lib/fog/brightbox/requests/compute/get_image.rb +9 -2
  70. data/lib/fog/brightbox/requests/compute/get_interface.rb +9 -2
  71. data/lib/fog/brightbox/requests/compute/get_load_balancer.rb +9 -2
  72. data/lib/fog/brightbox/requests/compute/get_scoped_account.rb +1 -5
  73. data/lib/fog/brightbox/requests/compute/get_server.rb +9 -2
  74. data/lib/fog/brightbox/requests/compute/get_server_group.rb +9 -2
  75. data/lib/fog/brightbox/requests/compute/get_server_type.rb +9 -2
  76. data/lib/fog/brightbox/requests/compute/get_user.rb +7 -15
  77. data/lib/fog/brightbox/requests/compute/get_zone.rb +9 -2
  78. data/lib/fog/brightbox/requests/compute/list_accounts.rb +6 -2
  79. data/lib/fog/brightbox/requests/compute/list_api_clients.rb +8 -2
  80. data/lib/fog/brightbox/requests/compute/list_applications.rb +8 -2
  81. data/lib/fog/brightbox/requests/compute/list_cloud_ips.rb +8 -2
  82. data/lib/fog/brightbox/requests/compute/list_firewall_policies.rb +8 -2
  83. data/lib/fog/brightbox/requests/compute/list_images.rb +8 -2
  84. data/lib/fog/brightbox/requests/compute/list_load_balancers.rb +8 -2
  85. data/lib/fog/brightbox/requests/compute/list_server_groups.rb +8 -2
  86. data/lib/fog/brightbox/requests/compute/list_server_types.rb +8 -2
  87. data/lib/fog/brightbox/requests/compute/list_servers.rb +8 -2
  88. data/lib/fog/brightbox/requests/compute/list_users.rb +8 -2
  89. data/lib/fog/brightbox/requests/compute/list_zones.rb +8 -2
  90. data/lib/fog/brightbox/requests/compute/map_cloud_ip.rb +11 -2
  91. data/lib/fog/brightbox/requests/compute/move_servers_server_group.rb +10 -12
  92. data/lib/fog/brightbox/requests/compute/remove_firewall_policy.rb +11 -2
  93. data/lib/fog/brightbox/requests/compute/remove_listeners_load_balancer.rb +11 -2
  94. data/lib/fog/brightbox/requests/compute/remove_nodes_load_balancer.rb +11 -2
  95. data/lib/fog/brightbox/requests/compute/remove_servers_server_group.rb +9 -10
  96. data/lib/fog/brightbox/requests/compute/reset_ftp_password_account.rb +22 -3
  97. data/lib/fog/brightbox/requests/compute/reset_ftp_password_scoped_account.rb +18 -0
  98. data/lib/fog/brightbox/requests/compute/reset_secret_api_client.rb +13 -1
  99. data/lib/fog/brightbox/requests/compute/reset_secret_application.rb +9 -2
  100. data/lib/fog/brightbox/requests/compute/shutdown_server.rb +9 -2
  101. data/lib/fog/brightbox/requests/compute/snapshot_server.rb +9 -2
  102. data/lib/fog/brightbox/requests/compute/start_server.rb +9 -2
  103. data/lib/fog/brightbox/requests/compute/stop_server.rb +9 -2
  104. data/lib/fog/brightbox/requests/compute/unmap_cloud_ip.rb +9 -2
  105. data/lib/fog/brightbox/requests/compute/update_account.rb +32 -34
  106. data/lib/fog/brightbox/requests/compute/update_api_client.rb +12 -2
  107. data/lib/fog/brightbox/requests/compute/update_application.rb +12 -2
  108. data/lib/fog/brightbox/requests/compute/update_cloud_ip.rb +13 -2
  109. data/lib/fog/brightbox/requests/compute/update_firewall_rule.rb +16 -1
  110. data/lib/fog/brightbox/requests/compute/update_image.rb +17 -2
  111. data/lib/fog/brightbox/requests/compute/update_load_balancer.rb +15 -2
  112. data/lib/fog/brightbox/requests/compute/update_scoped_account.rb +12 -19
  113. data/lib/fog/brightbox/requests/compute/update_server.rb +12 -2
  114. data/lib/fog/brightbox/requests/compute/update_server_group.rb +12 -2
  115. data/lib/fog/brightbox/requests/compute/update_user.rb +15 -2
  116. data/lib/fog/cloudstack/models/compute/server.rb +3 -1
  117. data/lib/fog/core.rb +1 -0
  118. data/lib/fog/core/connection.rb +1 -0
  119. data/lib/fog/google/storage.rb +13 -2
  120. data/lib/fog/libvirt/models/compute/server.rb +1 -0
  121. data/lib/fog/libvirt/requests/compute/list_domains.rb +2 -2
  122. data/lib/fog/openstack.rb +57 -58
  123. data/lib/fog/openstack/compute.rb +15 -14
  124. data/lib/fog/openstack/identity.rb +10 -2
  125. data/lib/fog/openstack/image.rb +1 -1
  126. data/lib/fog/openstack/models/compute/flavor.rb +5 -1
  127. data/lib/fog/openstack/models/compute/security_group.rb +1 -1
  128. data/lib/fog/openstack/models/compute/server.rb +5 -0
  129. data/lib/fog/openstack/models/identity/users.rb +1 -2
  130. data/lib/fog/openstack/requests/compute/create_flavor.rb +4 -1
  131. data/lib/fog/openstack/requests/compute/create_security_group.rb +1 -1
  132. data/lib/fog/openstack/requests/compute/get_limits.rb +93 -0
  133. data/lib/fog/openstack/requests/compute/list_tenants.rb +1 -0
  134. data/lib/fog/openstack/requests/compute/release_address.rb +13 -1
  135. data/lib/fog/openstack/requests/compute/reset_server_state.rb +24 -0
  136. data/lib/fog/openstack/requests/identity/create_role.rb +1 -1
  137. data/lib/fog/openstack/requests/identity/set_tenant.rb +21 -0
  138. data/lib/fog/openstack/volume.rb +2 -1
  139. data/lib/fog/rackspace/models/compute_v2/server.rb +27 -0
  140. data/lib/fog/rackspace/models/compute_v2/servers.rb +8 -0
  141. data/lib/fog/rackspace/models/dns/record.rb +14 -1
  142. data/lib/fog/rackspace/models/storage/file.rb +68 -2
  143. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +3 -0
  144. data/lib/fog/version.rb +5 -0
  145. data/lib/fog/vsphere/compute.rb +74 -8
  146. data/lib/fog/vsphere/models/compute/cluster.rb +31 -0
  147. data/lib/fog/vsphere/models/compute/clusters.rb +26 -0
  148. data/lib/fog/vsphere/models/compute/datacenter.rb +35 -0
  149. data/lib/fog/vsphere/models/compute/datacenters.rb +23 -0
  150. data/lib/fog/vsphere/models/compute/datastore.rb +24 -0
  151. data/lib/fog/vsphere/models/compute/datastores.rb +25 -0
  152. data/lib/fog/vsphere/models/compute/folder.rb +28 -0
  153. data/lib/fog/vsphere/models/compute/folders.rb +27 -0
  154. data/lib/fog/vsphere/models/compute/interface.rb +39 -0
  155. data/lib/fog/vsphere/models/compute/interfaces.rb +33 -0
  156. data/lib/fog/vsphere/models/compute/network.rb +21 -0
  157. data/lib/fog/vsphere/models/compute/networks.rb +25 -0
  158. data/lib/fog/vsphere/models/compute/resource_pool.rb +23 -0
  159. data/lib/fog/vsphere/models/compute/resource_pools.rb +26 -0
  160. data/lib/fog/vsphere/models/compute/server.rb +78 -12
  161. data/lib/fog/vsphere/models/compute/servers.rb +16 -20
  162. data/lib/fog/vsphere/models/compute/template.rb +13 -0
  163. data/lib/fog/vsphere/models/compute/templates.rb +23 -0
  164. data/lib/fog/vsphere/models/compute/volume.rb +45 -0
  165. data/lib/fog/vsphere/models/compute/volumes.rb +33 -0
  166. data/lib/fog/vsphere/requests/compute/create_vm.rb +114 -0
  167. data/lib/fog/vsphere/requests/compute/get_cluster.rb +25 -0
  168. data/lib/fog/vsphere/requests/compute/get_datacenter.rb +29 -0
  169. data/lib/fog/vsphere/requests/compute/get_datastore.rb +25 -0
  170. data/lib/fog/vsphere/requests/compute/get_folder.rb +73 -0
  171. data/lib/fog/vsphere/requests/compute/get_network.rb +25 -0
  172. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +26 -0
  173. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +62 -0
  174. data/lib/fog/vsphere/requests/compute/list_clusters.rb +37 -0
  175. data/lib/fog/vsphere/requests/compute/list_datacenters.rb +34 -0
  176. data/lib/fog/vsphere/requests/compute/list_datastores.rb +40 -0
  177. data/lib/fog/vsphere/requests/compute/list_folders.rb +45 -0
  178. data/lib/fog/vsphere/requests/compute/list_networks.rb +38 -0
  179. data/lib/fog/vsphere/requests/compute/list_resource_pools.rb +39 -0
  180. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +132 -166
  181. data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +52 -0
  182. data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +51 -0
  183. data/lib/fog/vsphere/requests/compute/vm_clone.rb +6 -8
  184. data/lib/fog/vsphere/requests/compute/vm_destroy.rb +1 -8
  185. data/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb +1 -2
  186. data/lib/tasks/changelog_task.rb +98 -0
  187. data/lib/tasks/documentation_task.rb +155 -0
  188. data/lib/tasks/test_task.rb +46 -0
  189. data/tests/aws/models/iam/users_tests.rb +16 -2
  190. data/tests/aws/requests/auto_scaling/notification_configuration_tests.rb +1 -0
  191. data/tests/aws/requests/auto_scaling/tag_tests.rb +1 -0
  192. data/tests/aws/requests/compute/instance_tests.rb +2 -0
  193. data/tests/aws/requests/compute/volume_tests.rb +8 -0
  194. data/tests/aws/requests/storage/object_tests.rb +18 -1
  195. data/tests/aws/requests/storage/versioning_tests.rb +70 -0
  196. data/tests/brightbox/compute_tests.rb +96 -4
  197. data/tests/brightbox/models/compute/account_tests.rb +15 -0
  198. data/tests/brightbox/oauth2_tests.rb +103 -0
  199. data/tests/brightbox/requests/compute/account_tests.rb +9 -2
  200. data/tests/brightbox/requests/compute/interface_tests.rb +18 -4
  201. data/tests/dns/models/record_tests.rb +17 -3
  202. data/tests/openstack/requests/compute/address_tests.rb +22 -19
  203. data/tests/openstack/requests/compute/flavor_tests.rb +4 -2
  204. data/tests/openstack/requests/compute/limit_tests.rb +60 -0
  205. data/tests/openstack/requests/compute/quota_tests.rb +16 -3
  206. data/tests/openstack/requests/compute/security_group_tests.rb +1 -1
  207. data/tests/rackspace/models/compute_v2/servers_tests.rb +6 -0
  208. data/tests/rackspace/models/storage/file_tests.rb +172 -0
  209. data/tests/rackspace/requests/dns/helper.rb +12 -26
  210. data/tests/vsphere/compute_tests.rb +3 -3
  211. data/tests/vsphere/models/compute/server_tests.rb +1 -2
  212. data/tests/vsphere/requests/compute/list_virtual_machines_tests.rb +5 -13
  213. data/tests/vsphere/requests/compute/vm_clone_tests.rb +2 -2
  214. metadata +59 -11
  215. data/lib/fog/vsphere/requests/compute/datacenters.rb +0 -34
  216. data/lib/fog/vsphere/requests/compute/find_vm_by_ref.rb +0 -41
  217. data/lib/fog/vsphere/requests/compute/vm_create.rb +0 -97
  218. data/tests/vsphere/requests/compute/find_vm_by_ref_tests.rb +0 -26
  219. data/tests/vsphere/requests/compute/vm_create_tests.rb +0 -20
@@ -33,6 +33,7 @@ module Fog
33
33
  attribute :tenant_id
34
34
  attribute :links
35
35
  attribute :metadata
36
+ attribute :personality
36
37
  attribute :ipv4_address, :aliases => 'accessIPv4'
37
38
  attribute :ipv6_address, :aliases => 'accessIPv6'
38
39
  attribute :disk_config, :aliases => 'OS-DCF:diskConfig'
@@ -54,8 +55,12 @@ module Fog
54
55
 
55
56
  def create
56
57
  requires :name, :image_id, :flavor_id
58
+
57
59
  options = {}
58
60
  options[:disk_config] = disk_config unless disk_config.nil?
61
+ options[:metadata] = metadata unless metadata.nil?
62
+ options[:personality] = personality unless personality.nil?
63
+
59
64
  data = connection.create_server(name, image_id, flavor_id, 1, 1, options)
60
65
  merge_attributes(data.body['server'])
61
66
  true
@@ -92,6 +97,14 @@ module Fog
92
97
  })
93
98
  end
94
99
  end
100
+
101
+ def private_ip_address
102
+ addresses['private'].select{|a| a["version"] == 4}[0]["addr"]
103
+ end
104
+
105
+ def public_ip_address
106
+ ipv4_address
107
+ end
95
108
 
96
109
  def ready?
97
110
  state == ACTIVE
@@ -137,6 +150,20 @@ module Fog
137
150
  @password = password
138
151
  true
139
152
  end
153
+
154
+ def setup(credentials = {})
155
+ requires :public_ip_address, :identity, :public_key, :username
156
+ Fog::SSH.new(public_ip_address, username, credentials).run([
157
+ %{mkdir .ssh},
158
+ %{echo "#{public_key}" >> ~/.ssh/authorized_keys},
159
+ %{passwd -l #{username}},
160
+ %{echo "#{Fog::JSON.encode(attributes)}" >> ~/attributes.json},
161
+ %{echo "#{Fog::JSON.encode(metadata)}" >> ~/metadata.json}
162
+ ])
163
+ rescue Errno::ECONNREFUSED
164
+ sleep(1)
165
+ retry
166
+ end
140
167
 
141
168
  private
142
169
 
@@ -4,6 +4,7 @@ require 'fog/rackspace/models/compute_v2/server'
4
4
  module Fog
5
5
  module Compute
6
6
  class RackspaceV2
7
+
7
8
  class Servers < Fog::Collection
8
9
 
9
10
  model Fog::Compute::RackspaceV2::Server
@@ -13,6 +14,13 @@ module Fog
13
14
  load(data)
14
15
  end
15
16
 
17
+ def bootstrap(new_attributes = {})
18
+ server = create(new_attributes)
19
+ server.wait_for { ready? }
20
+ server.setup(:password => server.password)
21
+ server
22
+ end
23
+
16
24
  def get(server_id)
17
25
  data = connection.get_server(server_id).body['server']
18
26
  new(data)
@@ -1,5 +1,6 @@
1
1
  require 'fog/core/model'
2
2
  require 'fog/rackspace/models/dns/callback'
3
+ require 'ipaddr'
3
4
 
4
5
  module Fog
5
6
  module DNS
@@ -55,7 +56,19 @@ module Fog
55
56
  end
56
57
 
57
58
  response = wait_for_job connection.add_records(@zone.identity, [options]).body['jobId']
58
- merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && record['data'] == self.value}.first)
59
+
60
+ matching_record = response.body['response']['records'].find do |record|
61
+ if ['A', 'AAAA'].include?(self.type.upcase)
62
+ # If this is an A or AAAA record, match by normalized IP address value.
63
+ (record['name'] == self.name) && (record['type'] == self.type) && (IPAddr.new(record['data']) == IPAddr.new(self.value))
64
+ else
65
+ # Other record types are matched by the raw value.
66
+ (record['name'] == self.name) && (record['type'] == self.type) && (record['data'] == self.value)
67
+ end
68
+ end
69
+
70
+ merge_attributes(matching_record)
71
+
59
72
  true
60
73
  end
61
74
 
@@ -12,6 +12,8 @@ module Fog
12
12
  attribute :content_type, :aliases => ['content_type', 'Content-Type']
13
13
  attribute :etag, :aliases => ['hash', 'Etag']
14
14
  attribute :last_modified, :aliases => ['last_modified', 'Last-Modified'], :type => :time
15
+ attribute :access_control_allow_origin, :aliases => ['Access-Control-Allow-Origin']
16
+ attribute :origin, :aliases => ['Origin']
15
17
 
16
18
  def body
17
19
  attributes[:body] ||= if last_modified
@@ -32,6 +34,8 @@ module Fog
32
34
  def copy(target_directory_key, target_file_key, options={})
33
35
  requires :directory, :key
34
36
  options['Content-Type'] ||= content_type if content_type
37
+ options['Access-Control-Allow-Origin'] ||= access_control_allow_origin if access_control_allow_origin
38
+ options['Origin'] ||= origin if origin
35
39
  connection.copy_object(directory.key, key, target_directory_key, target_file_key, options)
36
40
  target_directory = connection.directories.new(:key => target_directory_key)
37
41
  target_directory.files.get(target_file_key)
@@ -43,6 +47,10 @@ module Fog
43
47
  true
44
48
  end
45
49
 
50
+ def metadata
51
+ @metadata ||= headers_to_metadata
52
+ end
53
+
46
54
  def owner=(new_owner)
47
55
  if new_owner
48
56
  attributes[:owner] = {
@@ -64,8 +72,14 @@ module Fog
64
72
  def save(options = {})
65
73
  requires :body, :directory, :key
66
74
  options['Content-Type'] = content_type if content_type
67
- data = connection.put_object(directory.key, key, body, options)
68
- merge_attributes(data.headers.reject {|key, value| ['Content-Length', 'Content-Type'].include?(key)})
75
+ options['Access-Control-Allow-Origin'] = access_control_allow_origin if access_control_allow_origin
76
+ options['Origin'] = origin if origin
77
+ options.merge!(metadata_to_headers)
78
+
79
+ data = connection.put_object(directory.key, key, body, options)
80
+ update_attributes_from(data)
81
+ refresh_metadata
82
+
69
83
  self.content_length = Fog::Storage.get_body_size(body)
70
84
  self.content_type ||= Fog::Storage.get_content_type(body)
71
85
  true
@@ -77,6 +91,58 @@ module Fog
77
91
  @directory = new_directory
78
92
  end
79
93
 
94
+ def refresh_metadata
95
+ metadata.reject! {|k, v| v.nil? }
96
+ end
97
+
98
+ def headers_to_metadata
99
+ key_map = key_mapping
100
+ Hash[metadata_attributes.map {|k, v| [key_map[k], v] }]
101
+ end
102
+
103
+ def key_mapping
104
+ key_map = metadata_attributes
105
+ key_map.each_pair {|k, v| key_map[k] = header_to_key(k)}
106
+ end
107
+
108
+ def header_to_key(opt)
109
+ opt.gsub(metadata_prefix, '').split('-').map {|k| k[0, 1].downcase + k[1..-1]}.join('_').to_sym
110
+ end
111
+
112
+ def metadata_to_headers
113
+ header_map = header_mapping
114
+ Hash[metadata.map {|k, v| [header_map[k], v] }]
115
+ end
116
+
117
+ def header_mapping
118
+ header_map = metadata.dup
119
+ header_map.each_pair {|k, v| header_map[k] = key_to_header(k)}
120
+ end
121
+
122
+ def key_to_header(key)
123
+ metadata_prefix + key.to_s.split(/[-_]/).map(&:capitalize).join('-')
124
+ end
125
+
126
+ def metadata_attributes
127
+ if etag
128
+ headers = connection.head_object(directory.key, self.key).headers
129
+ headers.reject! {|k, v| !metadata_attribute?(k)}
130
+ else
131
+ {}
132
+ end
133
+ end
134
+
135
+ def metadata_attribute?(key)
136
+ key.to_s =~ /^#{metadata_prefix}/
137
+ end
138
+
139
+ def metadata_prefix
140
+ "X-Object-Meta-"
141
+ end
142
+
143
+ def update_attributes_from(data)
144
+ merge_attributes(data.headers.reject {|key, value| ['Content-Length', 'Content-Type'].include?(key)})
145
+ end
80
146
  end
81
147
 
82
148
  end
@@ -13,7 +13,10 @@ module Fog
13
13
  }
14
14
  }
15
15
 
16
+ data['server']['metadata'] = options[:metadata] unless options[:metadata].nil?
16
17
  data['server']['OS-DCF:diskConfig'] = options[:disk_config] unless options[:disk_config].nil?
18
+ data['server']['metadata'] = options[:metadata] unless options[:metadata].nil?
19
+ data['server']['personality'] = options[:personality] unless options[:personality].nil?
17
20
 
18
21
  request(
19
22
  :body => Fog::JSON.encode(data),
@@ -0,0 +1,5 @@
1
+ module Fog
2
+ unless const_defined?(:VERSION)
3
+ VERSION = '1.8.0'
4
+ end
5
+ end
@@ -11,19 +11,50 @@ module Fog
11
11
  model_path 'fog/vsphere/models/compute'
12
12
  model :server
13
13
  collection :servers
14
+ model :datacenter
15
+ collection :datacenters
16
+ model :interface
17
+ collection :interfaces
18
+ model :volume
19
+ collection :volumes
20
+ model :template
21
+ collection :templates
22
+ model :cluster
23
+ collection :clusters
24
+ model :resource_pool
25
+ collection :resource_pools
26
+ model :network
27
+ collection :networks
28
+ model :datastore
29
+ collection :datastores
30
+ model :folder
31
+ collection :folders
14
32
 
15
33
  request_path 'fog/vsphere/requests/compute'
16
34
  request :current_time
17
- request :find_vm_by_ref
18
35
  request :list_virtual_machines
19
36
  request :vm_power_off
20
37
  request :vm_power_on
21
38
  request :vm_reboot
22
39
  request :vm_clone
23
- request :vm_create
24
40
  request :vm_destroy
25
41
  request :vm_migrate
26
- request :datacenters
42
+ request :list_datacenters
43
+ request :get_datacenter
44
+ request :list_clusters
45
+ request :get_cluster
46
+ request :list_resource_pools
47
+ request :get_resource_pool
48
+ request :list_networks
49
+ request :get_network
50
+ request :list_datastores
51
+ request :get_datastore
52
+ request :get_folder
53
+ request :list_folders
54
+ request :create_vm
55
+ request :list_vm_interfaces
56
+ request :list_vm_volumes
57
+ request :get_virtual_machine
27
58
  request :vm_reconfig_hardware
28
59
  request :vm_reconfig_memory
29
60
  request :vm_reconfig_cpus
@@ -36,11 +67,12 @@ module Fog
36
67
  attr_reader :vsphere_server
37
68
  attr_reader :vsphere_username
38
69
 
70
+ protected
71
+
39
72
  ATTR_TO_PROP = {
40
73
  :id => 'config.instanceUuid',
41
74
  :name => 'name',
42
75
  :uuid => 'config.uuid',
43
- :instance_uuid => 'config.instanceUuid',
44
76
  :hostname => 'summary.guest.hostName',
45
77
  :operatingsystem => 'summary.guest.guestFullName',
46
78
  :ipaddress => 'guest.ipAddress',
@@ -49,9 +81,10 @@ module Fog
49
81
  :hypervisor => 'runtime.host',
50
82
  :tools_state => 'guest.toolsStatus',
51
83
  :tools_version => 'guest.toolsVersionStatus',
52
- :is_a_template => 'config.template',
53
84
  :memory_mb => 'config.hardware.memoryMB',
54
85
  :cpus => 'config.hardware.numCPU',
86
+ :overall_status => 'overallStatus',
87
+ :guest_id => 'summary.guest.guestId',
55
88
  }
56
89
 
57
90
  # Utility method to convert a VMware managed object into an attribute hash.
@@ -75,9 +108,17 @@ module Fog
75
108
  attrs['mo_ref'] = vm_mob_ref._ref
76
109
  # The name method "magically" appears after a VM is ready and
77
110
  # finished cloning.
78
- if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem) then
79
- # If it's not ready, set the hypervisor to nil
80
- attrs['hypervisor'] = attrs['hypervisor'].name rescue nil
111
+ if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem)
112
+ begin
113
+ host = attrs['hypervisor']
114
+ attrs['datacenter'] = parent_attribute(host.path, :datacenter)[1]
115
+ attrs['cluster'] = parent_attribute(host.path, :cluster)[1]
116
+ attrs['hypervisor'] = host.name
117
+ attrs['resource_pool'] = (vm_mob_ref.resourcePool || host.resourcePool).name rescue nil
118
+ rescue
119
+ # If it's not ready, set the hypervisor to nil
120
+ attrs['hypervisor'] = nil
121
+ end
81
122
  end
82
123
  # This inline rescue catches any standard error. While a VM is
83
124
  # cloning, a call to the macs method will throw and NoMethodError
@@ -86,6 +127,31 @@ module Fog
86
127
  end
87
128
  end
88
129
 
130
+ # returns the parent object based on a type
131
+ # provides both real RbVmomi object and its name.
132
+ # e.g.
133
+ #[Datacenter("datacenter-2"), "dc-name"]
134
+ def parent_attribute path, type
135
+ element = case type
136
+ when :datacenter
137
+ RbVmomi::VIM::Datacenter
138
+ when :cluster
139
+ RbVmomi::VIM::ClusterComputeResource
140
+ when :host
141
+ RbVmomi::VIM::HostSystem
142
+ else
143
+ raise "Unknown type"
144
+ end
145
+ path.select {|x| x[0].is_a? element}.flatten
146
+ rescue
147
+ nil
148
+ end
149
+
150
+ # returns vmware managed obj id string
151
+ def managed_obj_id obj
152
+ obj.to_s.match(/\("(\S+)"\)/)[1]
153
+ end
154
+
89
155
  end
90
156
 
91
157
  class Mock
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Compute
3
+ class Vsphere
4
+
5
+ class Cluster < Fog::Model
6
+
7
+ identity :id
8
+
9
+ attribute :name
10
+ attribute :datacenter
11
+ attribute :num_host
12
+ attribute :num_cpu_cores
13
+ attribute :overall_status
14
+
15
+ def resource_pools(filters = { })
16
+ self.attributes[:resource_pools] ||= id.nil? ? [] : connection.resource_pools({
17
+ :connection => connection,
18
+ :cluster => name,
19
+ :datacenter => datacenter
20
+ }.merge(filters))
21
+ end
22
+
23
+ def to_s
24
+ name
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/vsphere/models/compute/cluster'
3
+
4
+ module Fog
5
+ module Compute
6
+ class Vsphere
7
+
8
+ class Clusters < Fog::Collection
9
+
10
+ model Fog::Compute::Vsphere::Cluster
11
+ attr_accessor :datacenter
12
+
13
+ def all(filters = {})
14
+ requires :datacenter
15
+ load connection.list_clusters(filters.merge(:datacenter => datacenter))
16
+ end
17
+
18
+ def get(id)
19
+ requires :datacenter
20
+ new connection.get_cluster(id, datacenter)
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module Fog
2
+ module Compute
3
+ class Vsphere
4
+
5
+ class Datacenter < Fog::Model
6
+
7
+ identity :id
8
+ attribute :name
9
+ attribute :status
10
+
11
+ def clusters filters = { }
12
+ connection.clusters({ :datacenter => name }.merge(filters))
13
+ end
14
+
15
+ def networks filters = { }
16
+ connection.networks({ :datacenter => name }.merge(filters))
17
+ end
18
+
19
+ def datastores filters = { }
20
+ connection.datastores({ :datacenter => name }.merge(filters))
21
+ end
22
+
23
+ def vm_folders filters = { }
24
+ connection.folders({ :datacenter => name, :type => :vm }.merge(filters))
25
+ end
26
+
27
+ def to_s
28
+ name
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
35
+ end