Created
October 30, 2012 07:15
-
-
Save ohadlevy/3978752 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 | |
index 815a9ec..ff93471 100644 | |
--- a/lib/fog/vsphere/models/compute/cluster.rb | |
+++ b/lib/fog/vsphere/models/compute/cluster.rb | |
@@ -1,13 +1,12 @@ | |
module Fog | |
module Compute | |
- class Ovirt | |
+ class Vsphere | |
class Cluster < Fog::Model | |
identity :id | |
attribute :name | |
- attribute :raw | |
def networks | |
connection.list_networks(id) | |
diff --git a/lib/fog/vsphere/models/compute/clusters.rb b/lib/fog/vsphere/models/compute/clusters.rb | |
index 41fc5c6..e1ea916 100644 | |
--- a/lib/fog/vsphere/models/compute/clusters.rb | |
+++ b/lib/fog/vsphere/models/compute/clusters.rb | |
@@ -1,13 +1,13 @@ | |
require 'fog/core/collection' | |
-require 'fog/ovirt/models/compute/cluster' | |
+require 'fog/vsphere/models/compute/cluster' | |
module Fog | |
module Compute | |
- class Ovirt | |
+ class Vsphere | |
class Clusters < Fog::Collection | |
- model Fog::Compute::Ovirt::Cluster | |
+ model Fog::Compute::Vsphere::Cluster | |
def all(filters = {}) | |
load connection.list_clusters(filters) | |
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/requests/compute/create_vm.rb b/lib/fog/vsphere/requests/compute/create_vm.rb | |
index 0f9ccec..53e1ae2 100644 | |
--- a/lib/fog/vsphere/requests/compute/create_vm.rb | |
+++ b/lib/fog/vsphere/requests/compute/create_vm.rb | |
@@ -2,24 +2,90 @@ module Fog | |
module Compute | |
class Vsphere | |
class Real | |
- def create_vm attributes = {} | |
+ 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, | |
+ :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), | |
- } | |
+ :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_virtual_machine attributes = {} | |
+ def create_vm attributes = { } | |
end | |
end | |
diff --git a/lib/fog/vsphere/requests/compute/get_cluster.rb b/lib/fog/vsphere/requests/compute/get_cluster.rb | |
index 61d628d..e394bfb 100644 | |
--- a/lib/fog/vsphere/requests/compute/get_cluster.rb | |
+++ b/lib/fog/vsphere/requests/compute/get_cluster.rb | |
@@ -1,16 +1,13 @@ | |
module Fog | |
module Compute | |
class Ovirt | |
- class Real | |
+ class Vsphere | |
def get_cluster(id) | |
- ovirt_attrs client.cluster(id) | |
end | |
end | |
class Mock | |
def get_cluster(id) | |
- xml = read_xml('cluster.xml') | |
- ovirt_attrs OVIRT::Cluster::new(self, Nokogiri::XML(xml).root) | |
end | |
end | |
end | |
diff --git a/lib/fog/vsphere/requests/compute/get_datacenter.rb b/lib/fog/vsphere/requests/compute/get_datacenter.rb | |
index 9cbad9c..434b102 100644 | |
--- a/lib/fog/vsphere/requests/compute/get_datacenter.rb | |
+++ b/lib/fog/vsphere/requests/compute/get_datacenter.rb | |
@@ -2,16 +2,19 @@ module Fog | |
module Compute | |
class Vsphere | |
class Real | |
- def list_datacenters filters = {} | |
- @connection.rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).map do |dc| | |
- {:name => dc.name, :status => dc.overallStatus} | |
- end | |
+ 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 datacenters | |
- [ {:name => "Solutions", :status => "grey"}, {:name => "Solutions2", :status => "green" }] | |
+ def get_datacenter name | |
+ {:name => "Solutions", :status => "grey"} | |
end | |
end | |
end | |
diff --git a/lib/fog/vsphere/requests/compute/list_clusters.rb b/lib/fog/vsphere/requests/compute/list_clusters.rb | |
index 4fdf0b9..3c9f463 100644 | |
--- a/lib/fog/vsphere/requests/compute/list_clusters.rb | |
+++ b/lib/fog/vsphere/requests/compute/list_clusters.rb | |
@@ -1,18 +1,31 @@ | |
module Fog | |
module Compute | |
- class Ovirt | |
+ class Vsphere | |
class Real | |
- def list_clusters(filters = {}) | |
- client.clusters(filters).map {|ovirt_obj| ovirt_attrs ovirt_obj} | |
+ 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 = {}) | |
- xml = read_xml 'clusters.xml' | |
- Nokogiri::XML(xml).xpath('/clusters/cluster').collect do |cl| | |
- ovirt_attrs OVIRT::Cluster::new(self, cl) | |
- end | |
+ def list_clusters(filters = { }) | |
end | |
end | |
end | |
diff --git a/lib/fog/vsphere/requests/compute/list_datacenters.rb b/lib/fog/vsphere/requests/compute/list_datacenters.rb | |
index 4459b32..60f2016 100644 | |
--- a/lib/fog/vsphere/requests/compute/list_datacenters.rb | |
+++ b/lib/fog/vsphere/requests/compute/list_datacenters.rb | |
@@ -2,13 +2,24 @@ module Fog | |
module Compute | |
class Vsphere | |
class Real | |
- def get_datacenters | |
+ | |
+ 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 datacenters | |
- [ "Solutions", "Solutions2", "Solutions3" ] | |
+ def list_datacenters | |
+ [ {:name => "Solutions", :status => "grey"}, {:name => "Solutions2", :status => "green" }] | |
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 | |
index bfd7b5a..4d7d264 100644 | |
--- a/lib/fog/vsphere/requests/compute/list_vm_volumes.rb | |
+++ b/lib/fog/vsphere/requests/compute/list_vm_volumes.rb | |
@@ -1,18 +1,49 @@ | |
module Fog | |
module Compute | |
- class Ovirt | |
+ 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) | |
- client.vm_volumes(vm_id).map {|ovirt_obj| ovirt_attrs ovirt_obj} | |
+ 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) | |
- xml = read_xml 'volumes.xml' | |
- Nokogiri::XML(xml).xpath('/disks/disk').collect do |vol| | |
- ovirt_attrs OVIRT::Volume::new(self, vol) | |
- 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