Created
October 30, 2012 07:18
-
-
Save ohadlevy/3978759 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/fog/vsphere/compute.rb b/lib/fog/vsphere/compute.rb | |
index 6c9fc1e..ed1ca99 100644 | |
--- a/lib/fog/vsphere/compute.rb | |
+++ b/lib/fog/vsphere/compute.rb | |
@@ -11,6 +11,16 @@ module Fog | |
model_path 'fog/vsphere/models/compute' | |
model :server | |
collection :servers | |
+ model :datacenter | |
+ collection :datacenters | |
+ model :interface | |
+ collection :interfaces | |
+ model :volume | |
+ collection :volumes | |
+ model :template | |
+ collection :templates | |
+ model :cluster | |
+ collection :clusters | |
request_path 'fog/vsphere/requests/compute' | |
request :current_time | |
@@ -23,7 +33,14 @@ module Fog | |
request :vm_create | |
request :vm_destroy | |
request :vm_migrate | |
- request :datacenters | |
+ request :list_datacenters | |
+ request :get_datacenter | |
+ request :list_clusters | |
+ request :get_cluster | |
+ request :create_vm | |
+ request :list_vm_interfaces | |
+ request :list_vm_volumes | |
+ request :get_virtual_machine | |
request :vm_reconfig_hardware | |
request :vm_reconfig_memory | |
request :vm_reconfig_cpus | |
diff --git a/lib/fog/vsphere/models/compute/cluster.rb b/lib/fog/vsphere/models/compute/cluster.rb | |
new file mode 100644 | |
index 0000000..ff93471 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/cluster.rb | |
@@ -0,0 +1,23 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Cluster < Fog::Model | |
+ | |
+ identity :id | |
+ | |
+ attribute :name | |
+ | |
+ def networks | |
+ connection.list_networks(id) | |
+ end | |
+ | |
+ def to_s | |
+ name | |
+ end | |
+ | |
+ end | |
+ | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/clusters.rb b/lib/fog/vsphere/models/compute/clusters.rb | |
new file mode 100644 | |
index 0000000..e1ea916 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/clusters.rb | |
@@ -0,0 +1,23 @@ | |
+require 'fog/core/collection' | |
+require 'fog/vsphere/models/compute/cluster' | |
+ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Clusters < Fog::Collection | |
+ | |
+ model Fog::Compute::Vsphere::Cluster | |
+ | |
+ def all(filters = {}) | |
+ load connection.list_clusters(filters) | |
+ end | |
+ | |
+ def get(id) | |
+ new connection.get_cluster(id) | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/datacenter.rb b/lib/fog/vsphere/models/compute/datacenter.rb | |
new file mode 100644 | |
index 0000000..8b9cac9 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/datacenter.rb | |
@@ -0,0 +1,22 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Datacenter < Fog::Model | |
+ | |
+ identity :name | |
+ attribute :status | |
+ | |
+ def networks | |
+ connection.list_networks(id) | |
+ end | |
+ | |
+ def to_s | |
+ name | |
+ end | |
+ | |
+ end | |
+ | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/datacenters.rb b/lib/fog/vsphere/models/compute/datacenters.rb | |
new file mode 100644 | |
index 0000000..dc46108 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/datacenters.rb | |
@@ -0,0 +1,23 @@ | |
+require 'fog/core/collection' | |
+require 'fog/vsphere/models/compute/datacenter' | |
+ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Datacenters < Fog::Collection | |
+ | |
+ model Fog::Compute::Vsphere::Datacenter | |
+ | |
+ def all(filters = {}) | |
+ load connection.list_datacenters(filters) | |
+ end | |
+ | |
+ def get(name) | |
+ new connection.get_datacenter(name) | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
\ No newline at end of file | |
diff --git a/lib/fog/vsphere/models/compute/interface.rb b/lib/fog/vsphere/models/compute/interface.rb | |
new file mode 100644 | |
index 0000000..99ebb68 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/interface.rb | |
@@ -0,0 +1,22 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Interface < Fog::Model | |
+ identity :mac | |
+ | |
+ attribute :network | |
+ attribute :name | |
+ attribute :status | |
+ attribute :summary | |
+ attribute :type | |
+ | |
+ def to_s | |
+ name | |
+ end | |
+ | |
+ end | |
+ | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/interfaces.rb b/lib/fog/vsphere/models/compute/interfaces.rb | |
new file mode 100644 | |
index 0000000..d3a0f97 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/interfaces.rb | |
@@ -0,0 +1,33 @@ | |
+require 'fog/core/collection' | |
+require 'fog/vsphere/models/compute/interface' | |
+ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Interfaces < Fog::Collection | |
+ | |
+ model Fog::Compute::Vsphere::Interface | |
+ | |
+ attr_accessor :vm | |
+ | |
+ def all(filters = {}) | |
+ requires :vm | |
+ case vm | |
+ when Fog::Compute::Vsphere::Server | |
+ load connection.list_vm_interfaces(vm.id) | |
+ when Fog::Compute::Vsphere::Template | |
+ load connection.list_template_interfaces(vm.id) | |
+ else | |
+ raise 'interfaces should have vm or template' | |
+ end | |
+ end | |
+ | |
+ def get(id) | |
+ new connection.get_interface(id) | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/server.rb b/lib/fog/vsphere/models/compute/server.rb | |
index cbe84ab..08180c4 100644 | |
--- a/lib/fog/vsphere/models/compute/server.rb | |
+++ b/lib/fog/vsphere/models/compute/server.rb | |
@@ -36,6 +36,8 @@ module Fog | |
attribute :path | |
attribute :memory_mb | |
attribute :cpus | |
+ attribute :interfaces | |
+ attribute :volumes | |
def vm_reconfig_memory(options = {}) | |
requires :instance_uuid, :memory | |
@@ -81,14 +83,6 @@ module Fog | |
connection.vm_migrate('instance_uuid' => instance_uuid, 'priority' => options[:priority]) | |
end | |
- def create(options ={}) | |
- requires :name, :path | |
- new_vm = self.class.new(create_results['vm_attributes']) | |
- new_vm.collection = self.collection | |
- new_vm.connection = self.connection | |
- new_vm | |
- end | |
- | |
def clone(options = {}) | |
requires :name, :path | |
# Convert symbols to strings | |
@@ -131,6 +125,33 @@ module Fog | |
memory_mb * 1024 * 1024 | |
end | |
+ def mac | |
+ interfaces.first.mac unless interfaces.empty? | |
+ end | |
+ | |
+ def interfaces | |
+ self.attributes[:interfaces] ||= id.nil? ? [] : Fog::Compute::Vsphere::Interfaces.new( | |
+ :connection => connection, | |
+ :vm => self | |
+ ) | |
+ end | |
+ | |
+ def volumes | |
+ self.attributes[:volumes] ||= id.nil? ? [] : Fog::Compute::Vsphere::Volumes.new( | |
+ :connection => connection, | |
+ :vm => self | |
+ ) | |
+ end | |
+ | |
+ def save | |
+ if identity | |
+ # connection.update_vm(attributes) | |
+ else | |
+ self.id = connection.create_vm(attributes).id | |
+ end | |
+ reload | |
+ end | |
+ | |
end | |
end | |
diff --git a/lib/fog/vsphere/models/compute/servers.rb b/lib/fog/vsphere/models/compute/servers.rb | |
index b57783b..47d12c5 100644 | |
--- a/lib/fog/vsphere/models/compute/servers.rb | |
+++ b/lib/fog/vsphere/models/compute/servers.rb | |
@@ -21,17 +21,7 @@ module Fog | |
end | |
def get(id) | |
- # Is the id a managed_object_reference? This may be the case if we're reloading | |
- # a model of a VM in the process of being cloned, since it | |
- # will not have a instance_uuid yet. | |
- if id =~ /^vm-/ | |
- response = connection.find_vm_by_ref('vm_ref' => id) | |
- server_attributes = response['virtual_machine'] | |
- else | |
- response = connection.list_virtual_machines('instance_uuid' => id) | |
- server_attributes = response['virtual_machines'].first | |
- end | |
- new(server_attributes) | |
+ new connection.get_virtual_machine id | |
rescue Fog::Compute::Vsphere::NotFound | |
nil | |
end | |
diff --git a/lib/fog/vsphere/models/compute/template.rb b/lib/fog/vsphere/models/compute/template.rb | |
new file mode 100644 | |
index 0000000..2c68265 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/template.rb | |
@@ -0,0 +1,13 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Template < Fog::Model | |
+ | |
+ identity :id | |
+ | |
+ end | |
+ | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/templates.rb b/lib/fog/vsphere/models/compute/templates.rb | |
new file mode 100644 | |
index 0000000..92cc777 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/templates.rb | |
@@ -0,0 +1,23 @@ | |
+require 'fog/core/collection' | |
+require 'fog/vsphere/models/compute/template' | |
+ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Templates < Fog::Collection | |
+ | |
+ model Fog::Compute::Vsphere::Template | |
+ | |
+ def all(filters = {}) | |
+ load connection.list_templates(filters) | |
+ end | |
+ | |
+ def get(id) | |
+ new connection.get_template(id) | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/volume.rb b/lib/fog/vsphere/models/compute/volume.rb | |
new file mode 100644 | |
index 0000000..ec92dab | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/volume.rb | |
@@ -0,0 +1,31 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Volume < Fog::Model | |
+ DISK_SIZE_TO_GB = 1048576 | |
+ identity :id | |
+ | |
+ attribute :datastore | |
+ attribute :mode | |
+ attribute :size | |
+ attribute :thin | |
+ attribute :name | |
+ attribute :filename | |
+ attribute :size_gb | |
+ | |
+ def size_gb | |
+ attributes[:size_gb] ||= attributes[:size].to_i / DISK_SIZE_TO_GB if attributes[:size] | |
+ end | |
+ | |
+ def size_gb= s | |
+ attributes[:size] = s.to_i * DISK_SIZE_TO_GB if s | |
+ end | |
+ | |
+ def to_s | |
+ id | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/models/compute/volumes.rb b/lib/fog/vsphere/models/compute/volumes.rb | |
new file mode 100644 | |
index 0000000..6d36afb | |
--- /dev/null | |
+++ b/lib/fog/vsphere/models/compute/volumes.rb | |
@@ -0,0 +1,33 @@ | |
+require 'fog/core/collection' | |
+require 'fog/vsphere/models/compute/volume' | |
+ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ | |
+ class Volumes < Fog::Collection | |
+ | |
+ model Fog::Compute::Vsphere::Volume | |
+ | |
+ attr_accessor :vm | |
+ | |
+ def all(filters = {}) | |
+ requires :vm | |
+ case vm | |
+ when Fog::Compute::Vsphere::Server | |
+ load connection.list_vm_volumes(vm.id) | |
+ when Fog::Compute::Vsphere::Template | |
+ load connection.list_template_volumes(vm.id) | |
+ else | |
+ raise 'volumes should have vm or template' | |
+ end | |
+ end | |
+ | |
+ def get(id) | |
+ new connection.get_volume(id) | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/create_vm.rb b/lib/fog/vsphere/requests/compute/create_vm.rb | |
new file mode 100644 | |
index 0000000..53e1ae2 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/create_vm.rb | |
@@ -0,0 +1,94 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ def create_vm attributes = { } | |
+ # build up vm configuration | |
+ | |
+ vm_cfg = { | |
+ :name => attributes[:name], | |
+ :guestId => attributes[:guestId] || 'otherGuest', | |
+ :files => { :vmPathName => '[datastore1]' }, | |
+ :numCPUs => attributes[:cpus] || 1, | |
+ :memoryMB => attributes[:memory_mb] || 512, | |
+ :deviceChange => device_change(attributes), | |
+ :extraConfig => extra_config(attributes), | |
+ } | |
+ end | |
+ | |
+ private | |
+ | |
+ def device_change attributes | |
+ devices = [] | |
+ if (nics = attributes[:interfaces]) | |
+ devices << nics.map { |nic| create_interface(nic, nics.index(nic)) } | |
+ end | |
+ | |
+ if (disks = attributes[:volumes]) | |
+ devices << create_controller | |
+ devices << disks.map { |disk| create_disk(disk, disks.index(disk)) } | |
+ end | |
+ devices.flatten | |
+ end | |
+ | |
+ def create_interface nic, index = 0, operation = :add | |
+ { | |
+ :operation => operation, | |
+ :device => nic.type.new( | |
+ :key => index, | |
+ :deviceInfo => | |
+ { | |
+ :label => nic.name, | |
+ :summary => nic.summary, | |
+ }, | |
+ :backing => RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(:deviceName => nic.network), | |
+ :addressType => 'generated') | |
+ } | |
+ end | |
+ | |
+ def create_controller operation = :add | |
+ { | |
+ :operation => operation, | |
+ :device => RbVmomi::VIM.VirtualLsiLogicController( | |
+ # not sure what exactly should we customize here | |
+ :key => 1000, | |
+ :busNumber => 0, | |
+ :sharedBus => :noSharing | |
+ ) | |
+ } | |
+ end | |
+ | |
+ def create_disk disk, index = 0, operation = :add | |
+ { | |
+ :operation => operation, | |
+ :fileOperation => :create, | |
+ :device => RbVmomi::VIM.VirtualDisk( | |
+ :key => index, | |
+ :backing => RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo( | |
+ :fileName => "[#{disk.datastore}]", | |
+ :diskMode => disk.mode.to_sym, | |
+ :thinProvisioned => disk.thin | |
+ ), | |
+ :capacityInKB => disk.size | |
+ ) | |
+ } | |
+ end | |
+ | |
+ def extra_config attributes | |
+ [ | |
+ { | |
+ :key => 'bios.bootOrder', | |
+ :value => 'ethernet0' | |
+ } | |
+ ] | |
+ end | |
+ end | |
+ | |
+ class Mock | |
+ def create_vm attributes = { } | |
+ end | |
+ | |
+ end | |
+ end | |
+ end | |
+end | |
\ No newline at end of file | |
diff --git a/lib/fog/vsphere/requests/compute/datacenters.rb b/lib/fog/vsphere/requests/compute/datacenters.rb | |
deleted file mode 100644 | |
index 6b76614..0000000 | |
--- a/lib/fog/vsphere/requests/compute/datacenters.rb | |
+++ /dev/null | |
@@ -1,34 +0,0 @@ | |
-module Fog | |
- module Compute | |
- class Vsphere | |
- class Real | |
- def datacenters | |
- @datacenters ||= datacenters_reload | |
- # Hide the values which are the RbVmomi instances | |
- @datacenters.keys | |
- end | |
- | |
- private | |
- | |
- def datacenters_reload | |
- @rootfolder ||= @connection.rootFolder | |
- inventory = @rootfolder.inventory(:Datacenter => [ 'name' ])[@rootfolder] | |
- # Convert the inventory into a Hash of the form: We remove the | |
- # property selectors. { "<dc_name>" => #<RbVmomi::VIM::Datacenter> } | |
- # The Datacenter instance itself is at index 0 and the properties we | |
- # collected are at index 1. | |
- inventory.inject({}) do |memo, (name,dc_ary)| | |
- memo[name] = dc_ary[0] | |
- memo | |
- end | |
- end | |
- end | |
- | |
- class Mock | |
- def datacenters | |
- [ "Solutions", "Solutions2", "Solutions3" ] | |
- end | |
- end | |
- end | |
- end | |
-end | |
diff --git a/lib/fog/vsphere/requests/compute/get_cluster.rb b/lib/fog/vsphere/requests/compute/get_cluster.rb | |
new file mode 100644 | |
index 0000000..e394bfb | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/get_cluster.rb | |
@@ -0,0 +1,15 @@ | |
+module Fog | |
+ module Compute | |
+ class Ovirt | |
+ class Vsphere | |
+ def get_cluster(id) | |
+ end | |
+ | |
+ end | |
+ class Mock | |
+ def get_cluster(id) | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/get_datacenter.rb b/lib/fog/vsphere/requests/compute/get_datacenter.rb | |
new file mode 100644 | |
index 0000000..434b102 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/get_datacenter.rb | |
@@ -0,0 +1,22 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ def get_datacenter name | |
+ dc = @raw_datacenters.nil? ? get_raw_datacenter(name) : raw_datacenters.find {|d| d.name == name} | |
+ {:name => dc.name, :status => dc.overallStatus} | |
+ end | |
+ | |
+ def get_raw_datacenter name | |
+ @connection.serviceInstance.find_datacenter(name) | |
+ end | |
+ end | |
+ | |
+ class Mock | |
+ def get_datacenter name | |
+ {:name => "Solutions", :status => "grey"} | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/get_virtual_machine.rb b/lib/fog/vsphere/requests/compute/get_virtual_machine.rb | |
new file mode 100644 | |
index 0000000..c9e46e2 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/get_virtual_machine.rb | |
@@ -0,0 +1,34 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ def get_virtual_machine(id, dc = nil) | |
+ convert_vm_mob_ref_to_attr_hash(get_vm_ref(id, dc)) | |
+ end | |
+ | |
+ protected | |
+ | |
+ def get_vm_ref(id, dc = nil) | |
+ vm = case id | |
+ # UUID based | |
+ when /[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/ | |
+ @connection.searchIndex.FindByUuid :uuid => id, :vmSearch => true, :instanceUuid => true, :datacenter => dc | |
+ else | |
+ # try to find based on VM name | |
+ if dc | |
+ get_datacenter(dc).find_vm(id) | |
+ else | |
+ raw_datacenters.map { |d| d.find_vm(id) }.compact.first | |
+ end | |
+ end | |
+ vm ? vm :raise(Fog::Compute::Vsphere::NotFound) | |
+ end | |
+ end | |
+ | |
+ class Mock | |
+ def get_virtual_machine(id, dc = nil) | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/list_clusters.rb b/lib/fog/vsphere/requests/compute/list_clusters.rb | |
new file mode 100644 | |
index 0000000..3c9f463 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/list_clusters.rb | |
@@ -0,0 +1,33 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ def list_clusters(filters = { }) | |
+ datacenters = if filters[:datacenter] | |
+ [get_raw_datacenter(filters[:datacenter])] | |
+ else | |
+ raw_datacenters | |
+ end | |
+ clusters = [] | |
+ datacenters.each do |dc| | |
+ dc.hostFolder.children.each do |cluster| | |
+ clusters << { | |
+ :id => "#{dc.name}/#{cluster.name}", | |
+ :name => cluster.name, | |
+ :numHost => cluster.summary.numHosts, | |
+ :numCpuCores => cluster.summary.numCpuCores, | |
+ :overallStatus => cluster.summary.overallStatus | |
+ } | |
+ end | |
+ end | |
+ clusters | |
+ end | |
+ | |
+ end | |
+ class Mock | |
+ def list_clusters(filters = { }) | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/list_datacenters.rb b/lib/fog/vsphere/requests/compute/list_datacenters.rb | |
new file mode 100644 | |
index 0000000..60f2016 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/list_datacenters.rb | |
@@ -0,0 +1,27 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ | |
+ def list_datacenters filters = {} | |
+ raw_datacenters.map do |dc| | |
+ {:name => dc.name, :status => dc.overallStatus} | |
+ end | |
+ end | |
+ | |
+ protected | |
+ | |
+ def raw_datacenters | |
+ @raw_datacenters ||= @connection.rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter) | |
+ end | |
+ | |
+ end | |
+ | |
+ class Mock | |
+ def list_datacenters | |
+ [ {:name => "Solutions", :status => "grey"}, {:name => "Solutions2", :status => "green" }] | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb b/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb | |
new file mode 100644 | |
index 0000000..e823b01 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb | |
@@ -0,0 +1,52 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ # => VirtualE1000( | |
+ #addressType: "assigned", | |
+ #backing: VirtualEthernetCardNetworkBackingInfo( | |
+ # deviceName: "VM Network", | |
+ # dynamicProperty: [], | |
+ # network: Network("network-163"), | |
+ # useAutoDetect: false | |
+ #), | |
+ #connectable: VirtualDeviceConnectInfo( | |
+ # allowGuestControl: true, | |
+ # connected: true, | |
+ # dynamicProperty: [], | |
+ # startConnected: true, | |
+ # status: "ok" | |
+ #), | |
+ #controllerKey: 100, | |
+ #deviceInfo: Description( | |
+ # dynamicProperty: [], | |
+ # label: "Network adapter 1", | |
+ # summary: "VM Network" | |
+ #), | |
+ #dynamicProperty: [], | |
+ #key: 4000, | |
+ #macAddress: "00:50:56:a9:00:28", | |
+ #unitNumber: 7, | |
+ # | |
+ def list_vm_interfaces(vm_id) | |
+ get_vm_ref(vm_id).config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard).map do |nic| | |
+ { | |
+ :name => nic.deviceInfo.label, | |
+ :mac => nic.macAddress, | |
+ :network => nic.backing.network.name, | |
+ :status => nic.connectable.status, | |
+ :summary => nic.deviceInfo.summary, | |
+ :type => nic.class, | |
+ } | |
+ end | |
+ | |
+ end | |
+ | |
+ end | |
+ class Mock | |
+ def list_vm_interfaces(vm_id) | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/list_vm_volumes.rb b/lib/fog/vsphere/requests/compute/list_vm_volumes.rb | |
new file mode 100644 | |
index 0000000..4d7d264 | |
--- /dev/null | |
+++ b/lib/fog/vsphere/requests/compute/list_vm_volumes.rb | |
@@ -0,0 +1,51 @@ | |
+module Fog | |
+ module Compute | |
+ class Vsphere | |
+ class Real | |
+ # [VirtualDisk( | |
+ # backing: VirtualDiskFlatVer2BackingInfo( | |
+ # contentId: "a172d19487e878e17d6b16ff2505d7eb", | |
+ # datastore: Datastore("datastore-162"), | |
+ # diskMode: "persistent", | |
+ # dynamicProperty: [], | |
+ # fileName: "[Storage1] rhel6-mfojtik/rhel6-mfojtik.vmdk", | |
+ # split: false, | |
+ # thinProvisioned: true, | |
+ # uuid: "6000C29c-a47d-4cd9-5249-c371de775f06", | |
+ # writeThrough: false | |
+ # ), | |
+ # capacityInKB: 8388608, | |
+ # controllerKey: 1000, | |
+ # deviceInfo: Description( | |
+ # dynamicProperty: [], | |
+ # label: "Hard disk 1", | |
+ # summary: "8,388,608 KB" | |
+ # ), | |
+ # dynamicProperty: [], | |
+ # key: 2001, | |
+ # shares: SharesInfo( dynamicProperty: [], level: "normal", shares: 1000 ), | |
+ # unitNumber: 1 | |
+ #)] | |
+ | |
+ def list_vm_volumes(vm_id) | |
+ get_vm_ref(vm_id).disks.map do |vol| | |
+ { | |
+ :id => vol.backing.uuid, | |
+ :thin => vol.backing.thinProvisioned, | |
+ :mode => vol.backing.diskMode, | |
+ :filename => vol.backing.fileName, | |
+ :datastore => vol.backing.datastore.name, | |
+ :size => vol.capacityInKB, | |
+ :name => vol.deviceInfo.label | |
+ } | |
+ end | |
+ end | |
+ | |
+ end | |
+ class Mock | |
+ def list_vm_volumes(vm_id) | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff --git a/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb b/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb | |
index 3324e65..9b4dfc9 100644 | |
--- a/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb | |
+++ b/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb | |
@@ -5,8 +5,7 @@ module Fog | |
def vm_reconfig_hardware(options = {}) | |
raise ArgumentError, "hardware_spec is a required parameter" unless options.has_key? 'hardware_spec' | |
raise ArgumentError, "instance_uuid is a required parameter" unless options.has_key? 'instance_uuid' | |
- search_filter = { :uuid => options['instance_uuid'], 'vmSearch' => true, 'instanceUuid' => true } | |
- vm_mob_ref = @connection.searchIndex.FindAllByUuid(search_filter).first | |
+ vm_mob_ref = get_vm_by_ref(options['instance_uuid']) | |
task = vm_mob_ref.ReconfigVM_Task(:spec => RbVmomi::VIM.VirtualMachineConfigSpec(options['hardware_spec'])) | |
task.wait_for_completion | |
{ 'task_state' => task.info.state } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment