Skip to content

Instantly share code, notes, and snippets.

@ohadlevy
Created October 30, 2012 07:15
Show Gist options
  • Save ohadlevy/3978752 to your computer and use it in GitHub Desktop.
Save ohadlevy/3978752 to your computer and use it in GitHub Desktop.
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