chef-provisioning-vsphere 1.1.2 → 2.0.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/.rubocop_todo.yml +1 -1
- data/CHANGELOG.md +12 -2
- data/Rakefile +1 -1
- data/chef-provisioning-vsphere.gemspec +2 -2
- data/lib/chef/provisioning/vsphere_driver/clone_spec_builder.rb +1 -1
- data/lib/chef/provisioning/vsphere_driver/driver.rb +46 -21
- data/lib/chef/provisioning/vsphere_driver/version.rb +1 -1
- data/lib/chef/provisioning/vsphere_driver/vm_helper.rb +48 -0
- data/lib/chef/provisioning/vsphere_driver/vsphere_helpers.rb +14 -5
- data/lib/chef/provisioning/vsphere_driver/vsphere_url.rb +1 -1
- data/spec/integration_tests/vsphere_driver_spec.rb +41 -26
- metadata +26 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21e02f6746bff52619d863fa3c127884d5ffa0ea
|
4
|
+
data.tar.gz: a3b5e5c8640d74ab193b784a5c5ab263dbf19daa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b2a9949cc6fd0d1d4f9e9b8868f063e6fd5e126f3338a425e0bd26a672cbf0d6d8bf21fdf5dc1a73344ded8413f6f92936e422c06ebc2fd9fcc27c7be75293a
|
7
|
+
data.tar.gz: a7377e8a83760434aa64b7211da8c8fac87c0f070ec60085c9a868a0b639d16796d9435dcd78ff9cb6cfaf01680385dd4f5c590cd277e67b9b5c71c2d336857f
|
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,20 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
4
|
-
[Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v1.1.
|
3
|
+
## [2.0.0](https://github.com/chef-partners/chef-provisioning-vsphere/tree/2.0.0) (2017-05-12)
|
4
|
+
[Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v1.1.2...2.0.0)
|
5
5
|
|
6
6
|
**Merged pull requests:**
|
7
7
|
|
8
|
+
- Traverse folders for dc \(issue \#23\) [\#24](https://github.com/chef-partners/chef-provisioning-vsphere/pull/24) ([danhiris](https://github.com/danhiris))
|
9
|
+
- allow chef13, since it works now [\#22](https://github.com/chef-partners/chef-provisioning-vsphere/pull/22) ([jjlimepoint](https://github.com/jjlimepoint))
|
10
|
+
- Wait for ipv4 enhancement v2 [\#21](https://github.com/chef-partners/chef-provisioning-vsphere/pull/21) ([jcalonsoh](https://github.com/jcalonsoh))
|
11
|
+
|
12
|
+
## [v1.1.2](https://github.com/chef-partners/chef-provisioning-vsphere/tree/v1.1.2) (2017-05-08)
|
13
|
+
[Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v1.1.1...v1.1.2)
|
14
|
+
|
15
|
+
**Merged pull requests:**
|
16
|
+
|
17
|
+
- 1.1.2 release [\#20](https://github.com/chef-partners/chef-provisioning-vsphere/pull/20) ([jjasghar](https://github.com/jjasghar))
|
8
18
|
- corrected winrm port assignment so it does not always equal 5986 [\#19](https://github.com/chef-partners/chef-provisioning-vsphere/pull/19) ([tuccimon](https://github.com/tuccimon))
|
9
19
|
- Update README to cover multi-nodes in kitchen.yml [\#18](https://github.com/chef-partners/chef-provisioning-vsphere/pull/18) ([michaeltlombardi](https://github.com/michaeltlombardi))
|
10
20
|
- Revert "Wait for ipv4 enhancement" [\#16](https://github.com/chef-partners/chef-provisioning-vsphere/pull/16) ([jjasghar](https://github.com/jjasghar))
|
data/Rakefile
CHANGED
@@ -24,8 +24,8 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency 'rbvmomi', '~> 1.10'
|
25
25
|
s.add_dependency 'chef-provisioning', '~> 2.0'
|
26
26
|
s.add_dependency 'github_changelog_generator'
|
27
|
-
s.add_dependency '
|
28
|
-
s.add_dependency '
|
27
|
+
s.add_dependency 'cheffish', '>= 4.0', '< 14.0'
|
28
|
+
s.add_dependency 'chef', '>= 12.0', '< 14.0'
|
29
29
|
|
30
30
|
s.add_development_dependency 'rspec'
|
31
31
|
s.add_development_dependency 'rake'
|
@@ -157,7 +157,7 @@ module ChefProvisioningVsphere
|
|
157
157
|
def hostname_from(options, vm_name)
|
158
158
|
hostname = options[:hostname] || vm_name
|
159
159
|
test = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])$/
|
160
|
-
unless hostname
|
160
|
+
unless hostname.match?(test)
|
161
161
|
raise 'Only letters, numbers or hyphens in hostnames allowed'
|
162
162
|
end
|
163
163
|
RbVmomi::VIM::CustomizationFixedName.new(name: hostname)
|
@@ -8,6 +8,7 @@ require 'chef/provisioning/vsphere_driver/clone_spec_builder'
|
|
8
8
|
require 'chef/provisioning/vsphere_driver/version'
|
9
9
|
require 'chef/provisioning/vsphere_driver/vsphere_helpers'
|
10
10
|
require 'chef/provisioning/vsphere_driver/vsphere_url'
|
11
|
+
require 'chef/provisioning/vsphere_driver/vm_helper'
|
11
12
|
|
12
13
|
module ChefProvisioningVsphere
|
13
14
|
# Provisions machines in vSphere.
|
@@ -19,7 +20,6 @@ module ChefProvisioningVsphere
|
|
19
20
|
end
|
20
21
|
|
21
22
|
# Create a new Vsphere provisioner.
|
22
|
-
#
|
23
23
|
# ## Parameters
|
24
24
|
# connect_options - hash of options to be passed to RbVmomi::VIM.connect
|
25
25
|
# :host - required - hostname of the vSphere API server
|
@@ -72,7 +72,11 @@ module ChefProvisioningVsphere
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
attr_reader :connect_options
|
75
|
+
attr_reader :connect_options, :vm_helper
|
76
|
+
|
77
|
+
def vm_helper
|
78
|
+
@vm_helper ||= ChefProvisioningVsphere::VmHelper.new
|
79
|
+
end
|
76
80
|
|
77
81
|
# Acquire a machine, generally by provisioning it. Returns a Machine
|
78
82
|
# object pointing at the machine, allowing useful actions like setup,
|
@@ -92,7 +96,6 @@ module ChefProvisioningVsphere
|
|
92
96
|
# fail if different?
|
93
97
|
# node will have node['normal']['provisioner_options'] in it with any options.
|
94
98
|
# It is a hash with this format:
|
95
|
-
#
|
96
99
|
# -- provisioner_url: vsphere://host:port?ssl=[true|false]&insecure=[true|false]
|
97
100
|
# -- bootstrap_options: hash of options to pass to RbVmomi::VIM::VirtualMachine::CloneTask()
|
98
101
|
# :datacenter
|
@@ -116,7 +119,6 @@ module ChefProvisioningVsphere
|
|
116
119
|
# node['normal']['provisioner_output'] will be populated with information
|
117
120
|
# about the created machine. For vSphere, it is a hash with this
|
118
121
|
# format:
|
119
|
-
#
|
120
122
|
# -- provisioner_url: vsphere:host:port?ssl=[true|false]&insecure=[true|false]
|
121
123
|
# -- vm_folder: name of the vSphere folder containing the VM
|
122
124
|
#
|
@@ -243,6 +245,8 @@ module ChefProvisioningVsphere
|
|
243
245
|
setup_ubuntu_dns(machine, bootstrap_options, machine_spec)
|
244
246
|
end
|
245
247
|
|
248
|
+
## Check if true available after added nic
|
249
|
+
@vm_helper.open_port?(@vm_helper.ip, @vm_helper.port) unless @vm_helper.ip.nil?
|
246
250
|
machine
|
247
251
|
end
|
248
252
|
|
@@ -257,7 +261,7 @@ module ChefProvisioningVsphere
|
|
257
261
|
bootstrap_options,
|
258
262
|
vm
|
259
263
|
)
|
260
|
-
if is_windows?(vm) && !new_nics.nil?
|
264
|
+
if is_windows?(vm) && !new_nics.nil? && @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port)
|
261
265
|
new_nics.each do |nic|
|
262
266
|
nic_label = nic.device.deviceInfo.label
|
263
267
|
machine.execute_always(
|
@@ -305,8 +309,7 @@ module ChefProvisioningVsphere
|
|
305
309
|
begin
|
306
310
|
wait_for_transport(action_handler, machine_spec, machine_options, vm)
|
307
311
|
rescue Timeout::Error
|
308
|
-
# Only ever reboot once, and only if it's been less than 10 minutes
|
309
|
-
# since we stopped waiting
|
312
|
+
# Only ever reboot once, and only if it's been less than 10 minutes since we stopped waiting
|
310
313
|
if machine_spec.location['started_at'] ||
|
311
314
|
remaining_wait_time(machine_spec, machine_options) < -(10 * 60)
|
312
315
|
raise
|
@@ -377,21 +380,25 @@ module ChefProvisioningVsphere
|
|
377
380
|
|
378
381
|
def wait_for_ip(vm, machine_options, machine_spec, action_handler)
|
379
382
|
bootstrap_options = machine_options[:bootstrap_options]
|
380
|
-
|
383
|
+
ip_to_bootstrap(bootstrap_options, vm)
|
381
384
|
ready_timeout = machine_options[:ready_timeout] || 300
|
382
|
-
|
383
|
-
|
385
|
+
msg1 = "waiting up to #{ready_timeout} seconds for customization"
|
386
|
+
msg2 = " and find #{@vm_helper.ip}" if @vm_helper.ip? # unless vm_ip == vm.guest.ipAddress # RuntimeError: can't modify frozen String
|
387
|
+
msg = [msg1, msg2].join
|
384
388
|
action_handler.report_progress msg
|
385
389
|
|
386
|
-
|
387
|
-
|
388
|
-
|
390
|
+
vm_ip ||= ip_to_bootstrap(bootstrap_options, vm)
|
391
|
+
until transport_for(
|
392
|
+
machine_spec,
|
393
|
+
machine_options[:bootstrap_options][:ssh],
|
394
|
+
vm_ip
|
395
|
+
).available? || remaining_wait_time(machine_spec, machine_options) < 0
|
389
396
|
action_handler.report_progress(
|
390
397
|
"IP addresses found: #{all_ips_for(vm)}"
|
391
398
|
)
|
392
399
|
vm_ip ||= ip_to_bootstrap(bootstrap_options, vm)
|
393
400
|
if has_ip?(vm_ip, vm)
|
394
|
-
|
401
|
+
transport_for(
|
395
402
|
machine_spec,
|
396
403
|
machine_options[:bootstrap_options][:ssh],
|
397
404
|
vm_ip
|
@@ -652,6 +659,7 @@ module ChefProvisioningVsphere
|
|
652
659
|
end
|
653
660
|
|
654
661
|
def wait_for_transport(action_handler, machine_spec, machine_options, vm)
|
662
|
+
@vm_helper.find_port?(vm, machine_options[:bootstrap_options]) if vm_helper.port.nil?
|
655
663
|
transport = transport_for(
|
656
664
|
machine_spec,
|
657
665
|
machine_options[:bootstrap_options][:ssh]
|
@@ -684,9 +692,12 @@ module ChefProvisioningVsphere
|
|
684
692
|
|
685
693
|
def create_winrm_transport(host, options)
|
686
694
|
require 'chef/provisioning/transport/winrm'
|
687
|
-
winrm_transport =
|
688
|
-
|
689
|
-
|
695
|
+
winrm_transport = if options[:port] == 5986
|
696
|
+
:ssl
|
697
|
+
else
|
698
|
+
options[:winrm_transport].nil? ? :negotiate : options[:winrm_transport].to_sym
|
699
|
+
end
|
700
|
+
port = options[:port] || @vm_helper.port # winrm_transport == :ssl ? '5986' : '5985'
|
690
701
|
winrm_options = {
|
691
702
|
user: (options[:user]).to_s,
|
692
703
|
pass: options[:password]
|
@@ -722,18 +733,25 @@ module ChefProvisioningVsphere
|
|
722
733
|
end
|
723
734
|
|
724
735
|
def ip_to_bootstrap(bootstrap_options, vm)
|
736
|
+
@vm_helper.find_port?(vm, bootstrap_options) unless vm_helper.port?
|
725
737
|
if has_static_ip(bootstrap_options)
|
726
738
|
if bootstrap_options[:customization_spec].is_a?(String)
|
727
739
|
spec = vsphere_helper.find_customization_spec(bootstrap_options[:customization_spec])
|
728
740
|
spec.nicSettingMap[0].adapter.ip.ipAddress
|
729
741
|
else
|
730
|
-
|
742
|
+
## Check if true available
|
743
|
+
@vm_helper.ip = bootstrap_options[:customization_spec][:ipsettings][:ip] unless vm_helper.ip?
|
744
|
+
print '.' until @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
|
745
|
+
@vm_helper.ip.to_s
|
731
746
|
end
|
732
747
|
else
|
733
748
|
if use_ipv4_during_bootstrap?(bootstrap_options)
|
734
|
-
|
749
|
+
until @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
|
750
|
+
wait_for_ipv4(bootstrap_ip_timeout(bootstrap_options), vm)
|
751
|
+
end
|
735
752
|
end
|
736
|
-
vm.guest.ipAddress
|
753
|
+
@vm_helper.ip = vm.guest.ipAddress until vm_guest_ip?(vm) && @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1) # Don't set empty ip
|
754
|
+
@vm_helper.ip
|
737
755
|
end
|
738
756
|
end
|
739
757
|
|
@@ -755,14 +773,21 @@ module ChefProvisioningVsphere
|
|
755
773
|
sleep_time = 5
|
756
774
|
print 'Waiting for ipv4 address.'
|
757
775
|
tries = 0
|
776
|
+
start_search_ip = true
|
758
777
|
max_tries = timeout > sleep_time ? timeout / sleep_time : 1
|
759
|
-
while
|
778
|
+
while start_search_ip && (tries += 1) <= max_tries
|
760
779
|
print '.'
|
761
780
|
sleep sleep_time
|
781
|
+
@vm_helper.ip = vm.guest.ipAddress if vm_guest_ip?(vm)
|
782
|
+
start_search_ip = false if @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
|
762
783
|
end
|
763
784
|
raise 'Timed out waiting for ipv4 address!' if tries > max_tries && !IPAddr.new(vm.guest.ipAddress).ipv4?
|
764
785
|
puts 'Found ipv4 address!'
|
765
786
|
true
|
766
787
|
end
|
788
|
+
|
789
|
+
def vm_guest_ip?(vm)
|
790
|
+
vm.guest.guestState == 'running' && vm.guest.toolsRunningStatus == 'guestToolsRunning' && !vm.guest.ipAddress.nil? && IPAddr.new(vm.guest.ipAddress).ipv4?
|
791
|
+
end
|
767
792
|
end
|
768
793
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'chef/provisioning/driver'
|
3
|
+
|
4
|
+
module ChefProvisioningVsphere
|
5
|
+
# Helps save data in provisioning a machine
|
6
|
+
class VmHelper
|
7
|
+
attr_accessor :ip, :port
|
8
|
+
|
9
|
+
RESCUE_EXCEPTIONS_ON_ESTABLISH = [
|
10
|
+
Errno::EACCES, Errno::EADDRINUSE, Errno::ECONNREFUSED, Errno::ETIMEDOUT,
|
11
|
+
Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH, Errno::EPIPE,
|
12
|
+
Errno::EPERM, Errno::EFAULT, Errno::EIO, Errno::EHOSTDOWN,
|
13
|
+
Net::SSH::Disconnect, Net::SSH::AuthenticationFailed, Net::SSH::ConnectionTimeout,
|
14
|
+
Timeout::Error, IPAddr::AddressFamilyError
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
def ip?
|
18
|
+
@ip
|
19
|
+
end
|
20
|
+
|
21
|
+
def port?
|
22
|
+
@port
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_port?(vm, options)
|
26
|
+
@port = options[:ssh][:port]
|
27
|
+
customization_spec = options[:customization_spec]
|
28
|
+
if vm.config.guestId.start_with?('win')
|
29
|
+
unless customization_spec.nil? && customization_spec.is_a?(Hash)
|
30
|
+
winrm_transport =
|
31
|
+
customization_spec[:winrm_transport].nil? ? :negotiate : customization_spec[:winrm_transport].to_sym
|
32
|
+
end
|
33
|
+
winrm_transport ||= :negotiate
|
34
|
+
default_win_port = winrm_transport == :ssl ? '5986' : '5985'
|
35
|
+
@port = default_win_port if @port.nil?
|
36
|
+
elsif port.nil?
|
37
|
+
@port = '22'
|
38
|
+
end
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
def open_port?(host, port, timeout = 5)
|
43
|
+
true if ::Socket.tcp(host, port, connect_timeout: timeout)
|
44
|
+
rescue *RESCUE_EXCEPTIONS_ON_ESTABLISH
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -84,15 +84,24 @@ module ChefProvisioningVsphere
|
|
84
84
|
base
|
85
85
|
end
|
86
86
|
|
87
|
+
def traverse_folders_for_dc(folder, dcname)
|
88
|
+
children = folder.children.find_all
|
89
|
+
children.each do |child|
|
90
|
+
if child.class == RbVmomi::VIM::Datacenter && child.name == dcname
|
91
|
+
return child
|
92
|
+
elsif child.class == RbVmomi::VIM::Folder
|
93
|
+
dc = traverse_folders_for_dc(child, dcname)
|
94
|
+
return dc if dc
|
95
|
+
end
|
96
|
+
end
|
97
|
+
false
|
98
|
+
end
|
99
|
+
|
87
100
|
def datacenter
|
88
101
|
vim # ensure connection is valid
|
89
102
|
@datacenter ||= begin
|
90
103
|
rootFolder = vim.serviceInstance.content.rootFolder
|
91
|
-
dc = rootFolder
|
92
|
-
x.name == datacenter_name
|
93
|
-
end
|
94
|
-
raise("vSphere Datacenter not found [#{datacenter_name}]") if dc.nil?
|
95
|
-
dc
|
104
|
+
dc = traverse_folders_for_dc(vim.rootFolder, datacenter_name) || abort('vSphere Datacenter not found [#{datacenter_name}]')
|
96
105
|
end
|
97
106
|
end
|
98
107
|
|
@@ -65,14 +65,41 @@ describe 'vsphere_driver' do
|
|
65
65
|
expect(@vm.config.instanceUuid).to eq(@machine_spec.location['server_id'])
|
66
66
|
end
|
67
67
|
it 'has the correct name' do
|
68
|
+
custom_name = @metal_config[:machine_options][:bootstrap_options][:customization_spec][:hostname]
|
68
69
|
now = Time.now.utc
|
69
|
-
trimmed_name =
|
70
|
+
trimmed_name = if custom_name
|
71
|
+
@vm.config.guestId.start_with?('win') ? custom_name.to_s.byteslice(0, 15) : custom_name
|
72
|
+
else
|
73
|
+
@vm.config.guestId.start_with?('win') ? @vm_name.byteslice(0, 15) : @vm_name
|
74
|
+
end
|
70
75
|
expected_name = "#{trimmed_name}.#{@metal_config[:machine_options][:bootstrap_options][:customization_spec][:domain]}"
|
71
|
-
|
72
|
-
|
73
|
-
|
76
|
+
if @vm.config.guestId.start_with?('win')
|
77
|
+
until (Time.now.utc - now) > 30 || expected_name.to_s.include?(@vm.guest.hostName)
|
78
|
+
print '.'
|
79
|
+
sleep 5
|
80
|
+
end
|
81
|
+
expect(expected_name).to include(@vm.guest.hostName)
|
82
|
+
else
|
83
|
+
until (Time.now.utc - now) > 30 || (@vm.guest.hostName == expected_name)
|
84
|
+
print '.'
|
85
|
+
sleep 5
|
86
|
+
end
|
87
|
+
expect(@vm.guest.hostName).to eq(expected_name) # For linux Systems
|
74
88
|
end
|
75
|
-
|
89
|
+
end
|
90
|
+
it 'is on the correct networks' do
|
91
|
+
expect(@vm.network.map(&:name)).to include(@metal_config[:machine_options][:bootstrap_options][:network_name][0]) unless @vm.config.guestId.start_with?('win')
|
92
|
+
expect(@vm.network.map(&:name)).to include(@metal_config[:machine_options][:bootstrap_options][:network_name][1]) unless @vm.config.guestId.start_with?('win')
|
93
|
+
end
|
94
|
+
it 'is on the correct datastore' do
|
95
|
+
expect(@vm.datastore[0].name).to eq(@metal_config[:machine_options][:bootstrap_options][:datastore]) unless @vm.config.guestId.start_with?('win')
|
96
|
+
end
|
97
|
+
it 'is in the correct datacenter' do
|
98
|
+
expect(@vsphere_helper.vim.serviceInstance.find_datacenter(@metal_config[:machine_options][:bootstrap_options][:datacenter]).find_vm("#{@vm.parent.name}/#{@vm_name}")).not_to eq(nil) unless @vm.config.guestId.start_with?('win')
|
99
|
+
end
|
100
|
+
it 'has an added disk of the correct size' do
|
101
|
+
disk_count = @vm.disks.count
|
102
|
+
expect(@vm.disks[disk_count - 1].capacityInKB).to eq(@metal_config[:machine_options][:bootstrap_options][:additional_disk_size_gb][1] * 1024 * 1024) unless @vm.config.guestId.start_with?('win')
|
76
103
|
end
|
77
104
|
it 'has the correct number of CPUs' do
|
78
105
|
expect(@vm.config.hardware.numCPU).to eq(@metal_config[:machine_options][:bootstrap_options][:num_cpus])
|
@@ -80,13 +107,6 @@ describe 'vsphere_driver' do
|
|
80
107
|
it 'has the correct amount of memory' do
|
81
108
|
expect(@vm.config.hardware.memoryMB).to eq(@metal_config[:machine_options][:bootstrap_options][:memory_mb])
|
82
109
|
end
|
83
|
-
it 'is on the correct networks' do
|
84
|
-
expect(@vm.network.map(&:name)).to include(@metal_config[:machine_options][:bootstrap_options][:network_name][0])
|
85
|
-
expect(@vm.network.map(&:name)).to include(@metal_config[:machine_options][:bootstrap_options][:network_name][1])
|
86
|
-
end
|
87
|
-
it 'is on the correct datastore' do
|
88
|
-
expect(@vm.datastore[0].name).to eq(@metal_config[:machine_options][:bootstrap_options][:datastore])
|
89
|
-
end
|
90
110
|
it 'is in the correct resource pool' do
|
91
111
|
if @metal_config[:machine_options][:bootstrap_options].key?(:resource_pool)
|
92
112
|
expect(@vm.resourcePool.name).to eq(@metal_config[:machine_options][:bootstrap_options][:resource_pool].split('/')[1])
|
@@ -102,15 +122,8 @@ describe 'vsphere_driver' do
|
|
102
122
|
expect(@vm.resourcePool.owner.name).to eq(@metal_config[:machine_options][:bootstrap_options][:resource_pool].split('/')[0])
|
103
123
|
end
|
104
124
|
end
|
105
|
-
it 'is in the correct datacenter' do
|
106
|
-
expect(@vsphere_helper.vim.serviceInstance.find_datacenter(@metal_config[:machine_options][:bootstrap_options][:datacenter]).find_vm("#{@vm.parent.name}/#{@vm_name}")).not_to eq(nil)
|
107
|
-
end
|
108
|
-
it 'has an added disk of the correct size' do
|
109
|
-
disk_count = @vm.disks.count
|
110
|
-
expect(@vm.disks[disk_count - 1].capacityInKB).to eq(@metal_config[:machine_options][:bootstrap_options][:additional_disk_size_gb][1] * 1024 * 1024)
|
111
|
-
end
|
112
125
|
it 'has the correct number of disks' do
|
113
|
-
expect(@vm.disks.count).to eq(3)
|
126
|
+
expect(@vm.disks.count).to eq(3) unless @vm.config.guestId.start_with?('win')
|
114
127
|
end
|
115
128
|
it 'has hot add cpu enabled' do
|
116
129
|
expect(@vm.config.cpuHotAddEnabled).to eq(true)
|
@@ -121,13 +134,15 @@ describe 'vsphere_driver' do
|
|
121
134
|
it 'has hot add memory enabled' do
|
122
135
|
expect(@vm.config.memoryHotAddEnabled).to eq(true)
|
123
136
|
end
|
124
|
-
it 'has the correct IP address' do
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
137
|
+
it 'has the correct static IP address' do
|
138
|
+
if @metal_config[:machine_options][:bootstrap_options][:customization_spec][:ipsettings][:ip]
|
139
|
+
now = Time.now.utc
|
140
|
+
until (Time.now.utc - now) > 30 || (@vm.guest.toolsRunningStatus == 'guestToolsRunning' && @vm.guest.net.count == 2 && @vm.guest.net[1].ipAddress[1] == @metal_config[:machine_options][:bootstrap_options][:customization_spec][:ipsettings][:ip])
|
141
|
+
print '.'
|
142
|
+
sleep 5
|
143
|
+
end
|
144
|
+
expect(@vm.guest.net.map(&:ipAddress).flatten).to include(@metal_config[:machine_options][:bootstrap_options][:customization_spec][:ipsettings][:ip])
|
129
145
|
end
|
130
|
-
expect(@vm.guest.net.map(&:ipAddress).flatten).to include(@metal_config[:machine_options][:bootstrap_options][:customization_spec][:ipsettings][:ip])
|
131
146
|
end
|
132
147
|
end
|
133
148
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-vsphere
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CenturyLink Cloud
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-05-
|
12
|
+
date: 2017-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rbvmomi
|
@@ -54,33 +54,45 @@ dependencies:
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: cheffish
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '4.0'
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '14.0'
|
63
66
|
type: :runtime
|
64
67
|
prerelease: false
|
65
68
|
version_requirements: !ruby/object:Gem::Requirement
|
66
69
|
requirements:
|
67
|
-
- - "
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '4.0'
|
73
|
+
- - "<"
|
68
74
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
75
|
+
version: '14.0'
|
70
76
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
77
|
+
name: chef
|
72
78
|
requirement: !ruby/object:Gem::Requirement
|
73
79
|
requirements:
|
74
|
-
- - "
|
80
|
+
- - ">="
|
75
81
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
82
|
+
version: '12.0'
|
83
|
+
- - "<"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '14.0'
|
77
86
|
type: :runtime
|
78
87
|
prerelease: false
|
79
88
|
version_requirements: !ruby/object:Gem::Requirement
|
80
89
|
requirements:
|
81
|
-
- - "
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '12.0'
|
93
|
+
- - "<"
|
82
94
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
95
|
+
version: '14.0'
|
84
96
|
- !ruby/object:Gem::Dependency
|
85
97
|
name: rspec
|
86
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,6 +215,7 @@ files:
|
|
203
215
|
- lib/chef/provisioning/vsphere_driver/clone_spec_builder.rb
|
204
216
|
- lib/chef/provisioning/vsphere_driver/driver.rb
|
205
217
|
- lib/chef/provisioning/vsphere_driver/version.rb
|
218
|
+
- lib/chef/provisioning/vsphere_driver/vm_helper.rb
|
206
219
|
- lib/chef/provisioning/vsphere_driver/vsphere_helpers.rb
|
207
220
|
- lib/chef/provisioning/vsphere_driver/vsphere_url.rb
|
208
221
|
- lib/kitchen/driver/vsphere.rb
|
@@ -233,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
246
|
version: '0'
|
234
247
|
requirements: []
|
235
248
|
rubyforge_project:
|
236
|
-
rubygems_version: 2.
|
249
|
+
rubygems_version: 2.6.11
|
237
250
|
signing_key:
|
238
251
|
specification_version: 4
|
239
252
|
summary: Provisioner for creating vSphere VM instances in Chef Provisioning.
|