vagrant-vsphere 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.bumpversion.cfg +1 -1
- data/README.md +5 -2
- data/lib/vSphere/action/clone.rb +43 -9
- data/lib/vSphere/util/vim_helpers.rb +48 -6
- data/lib/vSphere/version.rb +1 -1
- data/locales/en.yml +7 -0
- data/spec/spec_helper.rb +7 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0b7b0145083bd30757aeba7829a8b75620300dd
|
4
|
+
data.tar.gz: d66b51f6e4a73bd1cf9d2373616c07cead5b6aaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98453cec388971d2f0d5b8f1b5e3b50f7aa86203aa9c3ade98f4c7f76c863ccf25ab4af07fff3d0e7c8df59da9f9295a1e09311226432465fbde48d5774908eb
|
7
|
+
data.tar.gz: 029f6cb25ec23bd2219b2cc060f021c93a9343cc037b993ee228c7ae665a04587dc5412ae04cad26eb54151b42faa8904390f81318959d175f8b9920cb7cce41
|
data/.bumpversion.cfg
CHANGED
data/README.md
CHANGED
@@ -14,9 +14,9 @@ This provider is built on top of the [RbVmomi](https://github.com/vmware/rbvmomi
|
|
14
14
|
* libxml2, libxml2-dev, libxslt, libxslt-dev
|
15
15
|
|
16
16
|
## Current Version
|
17
|
-
**version: 0.
|
17
|
+
**version: 0.19.0**
|
18
18
|
|
19
|
-
vagrant-vsphere (**version: 0.
|
19
|
+
vagrant-vsphere (**version: 0.19.0**) is available from [RubyGems.org](https://rubygems.org/gems/vagrant-vsphere)
|
20
20
|
|
21
21
|
## Installation
|
22
22
|
|
@@ -297,6 +297,9 @@ vagrant destroy
|
|
297
297
|
[#104 clintoncwolfe:shutdown-guest-on-halt](https://github.com/nsidc/vagrant-vsphere/pull/104).
|
298
298
|
* Add configuration option `mac` to specify a MAC address for the VM
|
299
299
|
[#108 dataplayer:master](https://github.com/nsidc/vagrant-vsphere/pull/108).
|
300
|
+
* 0.19.0
|
301
|
+
* Add support for ClusterComputeResource and DatastoreCluster
|
302
|
+
[#101 GregDomjan:StorageSDRS](https://github.com/nsidc/vagrant-vsphere/pull/101).
|
300
303
|
|
301
304
|
## Versioning
|
302
305
|
|
data/lib/vSphere/action/clone.rb
CHANGED
@@ -26,7 +26,11 @@ module VagrantPlugins
|
|
26
26
|
raise Errors::VSphereError, :'invalid_base_path' if vm_base_folder.nil?
|
27
27
|
|
28
28
|
begin
|
29
|
-
|
29
|
+
# Storage DRS does not support vSphere linked clones. http://www.vmware.com/files/pdf/techpaper/vsphere-storage-drs-interoperability.pdf
|
30
|
+
ds = get_datastore dc, machine
|
31
|
+
raise Errors::VSphereError, :'invalid_configuration_linked_clone_with_sdrs' if config.linked_clone and datastore.is_a? RbVmomi::VIM::StoragePod
|
32
|
+
|
33
|
+
location = get_location ds, dc, machine, template
|
30
34
|
spec = RbVmomi::VIM.VirtualMachineCloneSpec :location => location, :powerOn => true, :template => false
|
31
35
|
spec[:config] = RbVmomi::VIM.VirtualMachineConfigSpec
|
32
36
|
customization_info = get_customization_spec_info_by_name connection, machine
|
@@ -37,11 +41,40 @@ module VagrantPlugins
|
|
37
41
|
add_custom_memory(spec, config.memory_mb) unless config.memory_mb.nil?
|
38
42
|
add_custom_cpu(spec, config.cpu_count) unless config.cpu_count.nil?
|
39
43
|
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
if !config.clone_from_vm and ds.is_a? RbVmomi::VIM::StoragePod
|
45
|
+
|
46
|
+
storageMgr = connection.serviceContent.storageResourceManager
|
47
|
+
podSpec = RbVmomi::VIM.StorageDrsPodSelectionSpec(:storagePod => ds)
|
48
|
+
# TODO: May want to add option on type?
|
49
|
+
storageSpec = RbVmomi::VIM.StoragePlacementSpec(:type => 'clone', :cloneName => name, :folder => vm_base_folder, :podSelectionSpec => podSpec, :vm => template, :cloneSpec => spec)
|
50
|
+
|
51
|
+
env[:ui].info I18n.t('vsphere.requesting_sdrs_recommendation')
|
52
|
+
env[:ui].info " -- DatastoreCluster: #{ds.name}"
|
53
|
+
env[:ui].info " -- Template VM: #{template.pretty_path}"
|
54
|
+
env[:ui].info " -- Target VM: #{vm_base_folder.pretty_path}/#{name}"
|
55
|
+
|
56
|
+
result = storageMgr.RecommendDatastores(:storageSpec => storageSpec)
|
57
|
+
|
58
|
+
recommendation = result.recommendations[0]
|
59
|
+
key = recommendation.key ||= ''
|
60
|
+
if key == ''
|
61
|
+
raise Errors::VSphereError, :missing_datastore_recommendation
|
62
|
+
end
|
63
|
+
|
64
|
+
env[:ui].info I18n.t('vsphere.creating_cloned_vm_sdrs')
|
65
|
+
env[:ui].info " -- Storage DRS recommendation: #{recommendation.target.name} #{recommendation.reasonText}"
|
43
66
|
|
44
|
-
|
67
|
+
applySRresult = storageMgr.ApplyStorageDrsRecommendation_Task(:key => [key]).wait_for_completion
|
68
|
+
new_vm = applySRresult.vm
|
69
|
+
|
70
|
+
else
|
71
|
+
|
72
|
+
env[:ui].info I18n.t('vsphere.creating_cloned_vm')
|
73
|
+
env[:ui].info " -- #{config.clone_from_vm ? "Source" : "Template"} VM: #{template.pretty_path}"
|
74
|
+
env[:ui].info " -- Target VM: #{vm_base_folder.pretty_path}/#{name}"
|
75
|
+
|
76
|
+
new_vm = template.CloneVM_Task(:folder => vm_base_folder, :name => name, :spec => spec).wait_for_completion
|
77
|
+
end
|
45
78
|
rescue Errors::VSphereError => e
|
46
79
|
raise
|
47
80
|
rescue Exception => e
|
@@ -80,8 +113,8 @@ module VagrantPlugins
|
|
80
113
|
customization_spec
|
81
114
|
end
|
82
115
|
|
83
|
-
def get_location(
|
84
|
-
if
|
116
|
+
def get_location(datastore, dc, machine, template)
|
117
|
+
if machine.provider_config.linked_clone
|
85
118
|
# The API for linked clones is quite strange. We can't create a linked
|
86
119
|
# straight from any VM. The disks of the VM for which we can create a
|
87
120
|
# linked clone need to be read-only and thus VC demands that the VM we
|
@@ -113,13 +146,14 @@ module VagrantPlugins
|
|
113
146
|
end
|
114
147
|
|
115
148
|
location = RbVmomi::VIM.VirtualMachineRelocateSpec(:diskMoveType => :moveChildMostDiskBacking)
|
149
|
+
elsif datastore.is_a? RbVmomi::VIM::StoragePod
|
150
|
+
location = RbVmomi::VIM.VirtualMachineRelocateSpec
|
116
151
|
else
|
117
152
|
location = RbVmomi::VIM.VirtualMachineRelocateSpec
|
118
153
|
|
119
|
-
datastore = get_datastore connection, machine
|
120
154
|
location[:datastore] = datastore unless datastore.nil?
|
121
155
|
end
|
122
|
-
location[:pool] = get_resource_pool(
|
156
|
+
location[:pool] = get_resource_pool(dc, machine) unless machine.provider_config.clone_from_vm
|
123
157
|
location
|
124
158
|
end
|
125
159
|
|
@@ -12,15 +12,56 @@ module VagrantPlugins
|
|
12
12
|
get_datacenter(connection, machine).vmFolder.findByUuid machine.id
|
13
13
|
end
|
14
14
|
|
15
|
-
def get_resource_pool(
|
16
|
-
|
17
|
-
rp =
|
15
|
+
def get_resource_pool(datacenter, machine)
|
16
|
+
computeResource = get_compute_resource(datacenter, machine)
|
17
|
+
rp = computeResource.resourcePool
|
18
18
|
if !(machine.provider_config.resource_pool_name.nil?)
|
19
|
-
rp =
|
19
|
+
rp = computeResource.resourcePool.find(machine.provider_config.resource_pool_name) or fail Errors::VSphereError, :missing_resource_pool
|
20
20
|
end
|
21
21
|
rp
|
22
22
|
end
|
23
23
|
|
24
|
+
def get_compute_resource(datacenter, machine)
|
25
|
+
cr = find_clustercompute_or_compute_resource(datacenter, machine.provider_config.compute_resource_name) or fail Errors::VSphereError, :missing_compute_resource
|
26
|
+
cr
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_clustercompute_or_compute_resource(datacenter, path)
|
30
|
+
if path.is_a? String
|
31
|
+
es = path.split('/').reject(&:empty?)
|
32
|
+
elsif path.is_a? Enumerable
|
33
|
+
es = path
|
34
|
+
else
|
35
|
+
fail "unexpected path class #{path.class}"
|
36
|
+
end
|
37
|
+
return datacenter.hostFolder if es.empty?
|
38
|
+
final = es.pop
|
39
|
+
|
40
|
+
p = es.inject(datacenter.hostFolder) do |f,e|
|
41
|
+
f.find(e, RbVmomi::VIM::Folder) || return
|
42
|
+
end
|
43
|
+
|
44
|
+
begin
|
45
|
+
if x = p.find(final, RbVmomi::VIM::ComputeResource)
|
46
|
+
x
|
47
|
+
elsif x = p.find(final, RbVmomi::VIM::ClusterComputeResource)
|
48
|
+
x
|
49
|
+
else
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
rescue Exception => e
|
53
|
+
# When looking for the ClusterComputeResource there seems to be some parser error in RbVmomi Folder.find, try this instead
|
54
|
+
x = p.childEntity.find { |x| x.name == final }
|
55
|
+
if x.is_a? RbVmomi::VIM::ClusterComputeResource or x.is_a? RbVmomi::VIM::ComputeResource
|
56
|
+
x
|
57
|
+
else
|
58
|
+
puts "ex unknown type " + x.to_json
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
24
65
|
def get_customization_spec_info_by_name(connection, machine)
|
25
66
|
name = machine.provider_config.customization_spec_name
|
26
67
|
return if name.nil? || name.empty?
|
@@ -29,11 +70,12 @@ module VagrantPlugins
|
|
29
70
|
spec = manager.GetCustomizationSpec(:name => name) or fail Errors::VSphereError, :missing_configuration_spec if spec.nil?
|
30
71
|
end
|
31
72
|
|
32
|
-
def get_datastore(
|
73
|
+
def get_datastore(datacenter, machine)
|
33
74
|
name = machine.provider_config.data_store_name
|
34
75
|
return if name.nil? || name.empty?
|
35
76
|
|
36
|
-
|
77
|
+
# find_datastore uses folder datastore that only lists Datastore and not StoragePod, if not found also try datastoreFolder which contains StoragePod(s)
|
78
|
+
datacenter.find_datastore name or datacenter.datastoreFolder.traverse name or fail Errors::VSphereError, :missing_datastore
|
37
79
|
end
|
38
80
|
|
39
81
|
def get_network_by_name(dc, name)
|
data/lib/vSphere/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -2,6 +2,10 @@ en:
|
|
2
2
|
vsphere:
|
3
3
|
creating_cloned_vm: |-
|
4
4
|
Calling vSphere CloneVM with the following settings:
|
5
|
+
creating_cloned_vm_sdrs: |-
|
6
|
+
Calling vSphere ApplyStorageDrsRecommendation with the following settings:
|
7
|
+
requesting_sdrs_recommendation: |-
|
8
|
+
Calling vSphere RecommendDatastores with StoragePlacementSpec of the following settings:
|
5
9
|
vm_clone_success: |-
|
6
10
|
New virtual machine successfully cloned and started
|
7
11
|
destroy_vm: |-
|
@@ -44,6 +48,9 @@ en:
|
|
44
48
|
Configured vlan not found
|
45
49
|
missing_network_card: |-
|
46
50
|
Cannot find network card to customize
|
51
|
+
invalid_configuration_linked_clone_with_sdrs: |-
|
52
|
+
Cannot use Linked Clone with Storage DRS
|
53
|
+
|
47
54
|
config:
|
48
55
|
host: |-
|
49
56
|
Configuration must specify a vSphere host
|
data/spec/spec_helper.rb
CHANGED
@@ -102,10 +102,16 @@ RSpec.configure do |config|
|
|
102
102
|
@child_resource_pool = double('testresourcepool')
|
103
103
|
@root_resource_pool = double('pools', :find => @child_resource_pool)
|
104
104
|
|
105
|
+
@compute_resource = RbVmomi::VIM::ComputeResource.new(nil, nil)
|
106
|
+
@compute_resource.stub(:resourcePool).and_return(@root_resource_pool)
|
107
|
+
|
108
|
+
@host_folder = double('hostFolder', :childEntity => double('childEntity', :find => @compute_resource))
|
109
|
+
|
105
110
|
@data_center = double('data_center',
|
106
111
|
:vmFolder => vm_folder,
|
107
112
|
:pretty_path => "data_center/#{vm_folder}",
|
108
|
-
:find_compute_resource =>
|
113
|
+
:find_compute_resource => @compute_resource,
|
114
|
+
:hostFolder => @host_folder)
|
109
115
|
|
110
116
|
@device = RbVmomi::VIM::VirtualEthernetCard.new
|
111
117
|
@device.stub(:backing).and_return(RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo.new)
|