1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[vsphere|compute] Added the ability to create and destroy new volumes.

This commit is contained in:
Kevin Menard 2013-10-28 17:57:55 -04:00
parent 2c4497cd88
commit 020436595a
7 changed files with 99 additions and 17 deletions

View file

@ -64,6 +64,7 @@ module Fog
request :create_vm
request :list_vm_interfaces
request :modify_vm_interface
request :modify_vm_volume
request :list_vm_volumes
request :get_virtual_machine
request :vm_reconfig_hardware

View file

@ -201,9 +201,9 @@ module Fog
end
def volumes
attributes[:volumes] ||= id.nil? ? [] : service.volumes( :vm => self )
attributes[:volumes] ||= id.nil? ? [] : service.volumes(:server => self)
end
def customvalues
attributes[:customvalues] ||= id.nil? ? [] : service.customvalues( :vm => self )
end

View file

@ -10,11 +10,18 @@ module Fog
attribute :mode
attribute :size
attribute :thin
attribute :eager_zero
attribute :name
attribute :filename
attribute :size_gb
attribute :key
attribute :unit_number
attribute :server_id
def initialize(attributes={} )
# Assign server first to prevent race condition with persisted?
self.server_id = attributes.delete(:server_id)
super defaults.merge(attributes)
end
@ -30,13 +37,38 @@ module Fog
name
end
private
def destroy
requires :server_id, :key, :unit_number
service.destroy_vm_volume(self)
true
end
def save
raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
requires :server_id, :size, :datastore
if unit_number.nil?
self.unit_number = server.volumes.size
end
service.add_vm_volume(self)
true
end
def server
requires :server_id
service.servers.get(server_id)
end
private
def defaults
{
:thin=>true,
:name=>"Hard disk",
:mode=>"persistent"
:thin => true,
:name => "Hard disk",
:mode => "persistent"
}
end
end

View file

@ -7,26 +7,41 @@ module Fog
class Volumes < Fog::Collection
attribute :server
model Fog::Compute::Vsphere::Volume
attr_accessor :vm
def all(filters = {})
requires :vm
case vm
requires :server
case server
when Fog::Compute::Vsphere::Server
load service.list_vm_volumes(vm.id)
load service.list_vm_volumes(server.id)
when Fog::Compute::Vsphere::Template
load service.list_template_volumes(vm.id)
load service.list_template_volumes(server.id)
else
raise 'volumes should have vm or template'
end
end
self.each { |volume| volume.server_id = server.id }
self
end
def get(id)
new service.get_volume(id)
end
def new(attributes = {})
if server
# Default to the root volume datastore if one is not configured.
datastore = ! attributes.has_key?(:datastore) && self.any? ? self.first.datastore : nil
super({ :server_id => server.id, :datastore => datastore }.merge!(attributes))
else
super
end
end
end
end
end

View file

@ -92,11 +92,11 @@ module Fog
end
def create_disk disk, index = 0, operation = :add, controller_key = 1000
{
payload = {
:operation => operation,
:fileOperation => :create,
:fileOperation => operation == :add ? :create : :destroy,
:device => RbVmomi::VIM.VirtualDisk(
:key => index,
:key => disk.key || index,
:backing => RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo(
:fileName => "[#{disk.datastore}]",
:diskMode => disk.mode.to_sym,
@ -107,6 +107,12 @@ module Fog
:capacityInKB => disk.size
)
}
if operation == :add && disk.thin == false && disk.eager_zero
payload[:device][:backing][:eagerlyScrub] = disk.eager_zero
end
payload
end
def extra_config attributes

View file

@ -36,7 +36,9 @@ module Fog
:filename => vol.backing.fileName,
:datastore => (vol.backing.datastore.name rescue(nil)),
:size => vol.capacityInKB,
:name => vol.deviceInfo.label
:name => vol.deviceInfo.label,
:key => vol.key,
:unit_number => vol.unitNumber
}
end
end

View file

@ -0,0 +1,26 @@
module Fog
module Compute
class Vsphere
class Real
def add_vm_volume(volume)
vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {'deviceChange'=>[create_disk(volume, volume.unit_number, :add)]})
end
def destroy_vm_volume(volume)
vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {'deviceChange'=>[create_disk(volume, volume.unit_number, :remove)]})
end
end
class Mock
def add_vm_volume(volume)
true
end
def destroy_vm_volume(volume)
true
end
end
end
end
end