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:
parent
2c4497cd88
commit
020436595a
7 changed files with 99 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
26
lib/fog/vsphere/requests/compute/modify_vm_volume.rb
Normal file
26
lib/fog/vsphere/requests/compute/modify_vm_volume.rb
Normal 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
|
Loading…
Add table
Reference in a new issue