chef-provisioning-vsphere 2.2.2 → 2.3.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/.travis.yml +4 -2
- data/CHANGELOG.md +10 -1
- data/Gemfile +1 -1
- data/Rakefile +53 -19
- data/chef-provisioning-vsphere.gemspec +26 -26
- data/examples/ubuntu-provision.rb +21 -20
- data/examples/win-provision.rb +25 -26
- data/lib/chef/provisioning/driver_init/vsphere.rb +2 -2
- data/lib/chef/provisioning/vsphere_driver.rb +2 -2
- data/lib/chef/provisioning/vsphere_driver/clone_spec_builder.rb +12 -12
- data/lib/chef/provisioning/vsphere_driver/driver.rb +89 -88
- data/lib/chef/provisioning/vsphere_driver/version.rb +1 -1
- data/lib/chef/provisioning/vsphere_driver/vm_helper.rb +4 -4
- data/lib/chef/provisioning/vsphere_driver/vsphere_helpers.rb +37 -37
- data/lib/chef/provisioning/vsphere_driver/vsphere_url.rb +13 -13
- data/lib/kitchen/driver/vsphere.rb +13 -13
- data/spec/integration_tests/vsphere_driver_spec.rb +46 -46
- data/spec/spec_helper.rb +3 -2
- data/spec/unit_tests/VsphereDriver_spec.rb +98 -60
- data/spec/unit_tests/VsphereUrl_spec.rb +24 -24
- data/spec/unit_tests/clone_spec_builder_spec.rb +48 -48
- data/spec/unit_tests/support/vsphere_helper_stub.rb +4 -4
- data/spec/unit_tests/vsphere_helpers_spec.rb +46 -46
- metadata +2 -5
- data/.rubocop.yml +0 -10
- data/.rubocop_todo.yml +0 -135
- data/Jenkinsfile +0 -82
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
3
|
+
require "chef"
|
4
|
+
require "cheffish/merged_config"
|
5
|
+
require "chef/provisioning/driver"
|
6
|
+
require "chef/provisioning/machine/windows_machine"
|
7
|
+
require "chef/provisioning/machine/unix_machine"
|
8
|
+
require "chef/provisioning/vsphere_driver/clone_spec_builder"
|
9
|
+
require "chef/provisioning/vsphere_driver/version"
|
10
|
+
require "chef/provisioning/vsphere_driver/vsphere_helpers"
|
11
|
+
require "chef/provisioning/vsphere_driver/vsphere_url"
|
12
|
+
require "chef/provisioning/vsphere_driver/vm_helper"
|
13
13
|
|
14
14
|
# Provisions machines in vSphere.
|
15
15
|
module ChefProvisioningVsphere
|
@@ -44,10 +44,10 @@ module ChefProvisioningVsphere
|
|
44
44
|
#
|
45
45
|
# @param [Object] h converts to key:value
|
46
46
|
def self.symbolize_keys(h)
|
47
|
-
Hash === h ?
|
47
|
+
Hash === h ? # rubocop:disable Style/MultilineTernaryOperator
|
48
48
|
Hash[
|
49
49
|
h.map do |k, v|
|
50
|
-
[k.respond_to?(:to_sym) ? k.to_sym : k, symbolize_keys(v)]
|
50
|
+
[k.respond_to?(:to_sym) ? k.to_sym : k, symbolize_keys(v)] # rubocop:disable Style/NestedTernaryOperator
|
51
51
|
end
|
52
52
|
] : h
|
53
53
|
end
|
@@ -56,7 +56,8 @@ module ChefProvisioningVsphere
|
|
56
56
|
#
|
57
57
|
# @param [Object] hash_like converts to key:value
|
58
58
|
def deep_symbolize(hash_like)
|
59
|
-
return {} if hash_like.nil?
|
59
|
+
return {} if hash_like.nil?
|
60
|
+
|
60
61
|
r = {}
|
61
62
|
hash_like.each do |key, value|
|
62
63
|
value = deep_symbolize(value) if value.respond_to?(:values)
|
@@ -74,12 +75,12 @@ module ChefProvisioningVsphere
|
|
74
75
|
|
75
76
|
uri = URI(driver_url)
|
76
77
|
@connect_options = {
|
77
|
-
provider:
|
78
|
+
provider: "vsphere",
|
78
79
|
host: uri.host,
|
79
80
|
port: uri.port,
|
80
81
|
use_ssl: uri.use_ssl,
|
81
82
|
insecure: uri.insecure,
|
82
|
-
path: uri.path
|
83
|
+
path: uri.path,
|
83
84
|
}
|
84
85
|
|
85
86
|
if driver_options
|
@@ -150,13 +151,13 @@ module ChefProvisioningVsphere
|
|
150
151
|
)
|
151
152
|
vm = vm_for(machine_spec)
|
152
153
|
if vm
|
153
|
-
Chef::Log.warn
|
154
|
+
Chef::Log.warn "returning existing machine"
|
154
155
|
return vm
|
155
156
|
else
|
156
157
|
Chef::Log.warn machine_msg(
|
157
158
|
machine_spec.name,
|
158
|
-
machine_spec.location[
|
159
|
-
|
159
|
+
machine_spec.location["server_id"],
|
160
|
+
"no longer exists. Recreating ..."
|
160
161
|
)
|
161
162
|
end
|
162
163
|
end
|
@@ -173,7 +174,7 @@ module ChefProvisioningVsphere
|
|
173
174
|
action_handler.performed_action(machine_msg(
|
174
175
|
machine_spec.name,
|
175
176
|
vm.config.instanceUuid,
|
176
|
-
|
177
|
+
"created"
|
177
178
|
))
|
178
179
|
vm
|
179
180
|
end
|
@@ -195,12 +196,12 @@ module ChefProvisioningVsphere
|
|
195
196
|
# @param [Object] vm taken from Chef provisioning for all the vm state.
|
196
197
|
def add_machine_spec_location(vm, machine_spec)
|
197
198
|
machine_spec.location = {
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
199
|
+
"driver_url" => driver_url,
|
200
|
+
"driver_version" => VERSION,
|
201
|
+
"server_id" => vm.config.instanceUuid,
|
202
|
+
"is_windows" => is_windows?(vm),
|
203
|
+
"allocated_at" => Time.now.utc.to_s,
|
204
|
+
"ipaddress" => vm.guest.ipAddress,
|
204
205
|
}
|
205
206
|
end
|
206
207
|
|
@@ -218,7 +219,7 @@ module ChefProvisioningVsphere
|
|
218
219
|
Chef::Log.info machine_msg(
|
219
220
|
machine_spec.name,
|
220
221
|
vm.config.instanceUuid,
|
221
|
-
|
222
|
+
"already created"
|
222
223
|
)
|
223
224
|
else
|
224
225
|
vm = clone_vm(
|
@@ -239,14 +240,14 @@ module ChefProvisioningVsphere
|
|
239
240
|
bootstrap_options.to_hash.each_pair do |key, value|
|
240
241
|
if value.is_a?(Hash)
|
241
242
|
temp_value = value.clone
|
242
|
-
temp_value[:password] =
|
243
|
+
temp_value[:password] = "*********" if value.key?(:password)
|
243
244
|
else
|
244
245
|
temp_value = value
|
245
246
|
end
|
246
247
|
description << " #{key}: #{temp_value.inspect}"
|
247
248
|
end
|
248
249
|
description
|
249
|
-
|
250
|
+
end
|
250
251
|
|
251
252
|
# Creates a string of specific Machine information
|
252
253
|
#
|
@@ -270,7 +271,7 @@ module ChefProvisioningVsphere
|
|
270
271
|
vm = start_machine(action_handler, machine_spec, machine_options)
|
271
272
|
if vm.nil?
|
272
273
|
raise "Machine #{machine_spec.name} does not have a server "\
|
273
|
-
|
274
|
+
"associated with it, or server does not exist."
|
274
275
|
end
|
275
276
|
|
276
277
|
bootstrap_options = machine_options[:bootstrap_options]
|
@@ -291,7 +292,7 @@ module ChefProvisioningVsphere
|
|
291
292
|
end
|
292
293
|
|
293
294
|
## Check if true available after added nic
|
294
|
-
vm_helper.open_port?(machine_spec.location[
|
295
|
+
vm_helper.open_port?(machine_spec.location["ipaddress"], vm_helper.port) unless machine_spec.location["ipaddress"].nil?
|
295
296
|
machine
|
296
297
|
end
|
297
298
|
|
@@ -312,7 +313,7 @@ module ChefProvisioningVsphere
|
|
312
313
|
bootstrap_options,
|
313
314
|
vm
|
314
315
|
)
|
315
|
-
if is_windows?(vm) && !new_nics.nil? && vm_helper.open_port?(machine_spec.location[
|
316
|
+
if is_windows?(vm) && !new_nics.nil? && vm_helper.open_port?(machine_spec.location["ipaddress"], vm_helper.port)
|
316
317
|
new_nics.each do |nic|
|
317
318
|
nic_label = nic.device.deviceInfo.label
|
318
319
|
machine.execute_always(
|
@@ -341,13 +342,13 @@ module ChefProvisioningVsphere
|
|
341
342
|
# Customization below may change this to a valid ip
|
342
343
|
wait_until_ready(action_handler, machine_spec, machine_options, vm)
|
343
344
|
|
344
|
-
if !machine_spec.location[
|
345
|
+
if !machine_spec.location["ipaddress"] || !has_ip?(machine_spec.location["ipaddress"], vm)
|
345
346
|
# find the ip we actually want
|
346
347
|
# this will be the static ip to assign
|
347
348
|
# or the ip reported back by the vm if using dhcp
|
348
349
|
# it *may* be nil if just cloned
|
349
350
|
vm_ip = ip_to_bootstrap(bootstrap_options, vm) || vm.guest.ipAddress
|
350
|
-
machine_spec.location[
|
351
|
+
machine_spec.location["ipaddress"] = vm_ip
|
351
352
|
transport = nil
|
352
353
|
unless vm_ip.nil?
|
353
354
|
transport = transport_for(machine_spec, bootstrap_options[:ssh], vm_ip)
|
@@ -356,7 +357,7 @@ module ChefProvisioningVsphere
|
|
356
357
|
unless !transport.nil? && transport.available? && has_ip?(vm_ip, vm)
|
357
358
|
attempt_ip(machine_options, action_handler, vm, machine_spec)
|
358
359
|
end
|
359
|
-
machine_spec.location[
|
360
|
+
machine_spec.location["ipaddress"] = vm_ip # vm.guest.ipAddress vmWare ip_address here can be 0.0.0.0
|
360
361
|
action_handler.report_progress(
|
361
362
|
"IP address obtained: #{machine_spec.location['ipaddress']}"
|
362
363
|
)
|
@@ -368,14 +369,14 @@ module ChefProvisioningVsphere
|
|
368
369
|
wait_for_transport(action_handler, machine_spec, machine_options, vm)
|
369
370
|
rescue Timeout::Error
|
370
371
|
# Only ever reboot once, and only if it's been less than 10 minutes since we stopped waiting
|
371
|
-
if machine_spec.location[
|
372
|
-
|
372
|
+
if machine_spec.location["started_at"] ||
|
373
|
+
remaining_wait_time(machine_spec, machine_options) < -(10 * 60)
|
373
374
|
raise
|
374
375
|
else
|
375
376
|
Chef::Log.warn(machine_msg(
|
376
377
|
machine_spec.name,
|
377
378
|
vm.config.instanceUuid,
|
378
|
-
|
379
|
+
"started but SSH did not come up. Rebooting..."
|
379
380
|
))
|
380
381
|
restart_server(action_handler, machine_spec, machine_options)
|
381
382
|
wait_until_ready(action_handler, machine_spec, machine_options, vm)
|
@@ -392,18 +393,18 @@ module ChefProvisioningVsphere
|
|
392
393
|
# @param [Object] machine_spec The spec required to talk to the VM.
|
393
394
|
def attempt_ip(machine_options, action_handler, vm, machine_spec)
|
394
395
|
vm_ip = ip_to_bootstrap(machine_options[:bootstrap_options], vm)
|
395
|
-
machine_spec.location[
|
396
|
+
machine_spec.location["ipaddress"] = vm_ip
|
396
397
|
|
397
398
|
wait_for_ip(vm, machine_options, machine_spec, action_handler)
|
398
399
|
|
399
400
|
unless has_ip?(vm_ip, vm)
|
400
|
-
action_handler.report_progress
|
401
|
-
if vm.guest.toolsRunningStatus !=
|
402
|
-
msg =
|
401
|
+
action_handler.report_progress "rebooting..."
|
402
|
+
if vm.guest.toolsRunningStatus != "guestToolsRunning"
|
403
|
+
msg = "tools have stopped. current power state is "
|
403
404
|
msg << vm.runtime.powerState
|
404
|
-
msg <<
|
405
|
+
msg << " and tools state is "
|
405
406
|
msg << vm.guest.toolsRunningStatus
|
406
|
-
msg <<
|
407
|
+
msg << ". powering up server..."
|
407
408
|
action_handler.report_progress(msg)
|
408
409
|
vsphere_helper.start_vm(vm)
|
409
410
|
else
|
@@ -430,11 +431,11 @@ module ChefProvisioningVsphere
|
|
430
431
|
spec.identity.domain
|
431
432
|
else
|
432
433
|
bootstrap_options[:customization_spec][:domain]
|
433
|
-
|
434
|
+
end
|
434
435
|
|
435
436
|
return unless domain
|
436
437
|
|
437
|
-
if is_windows?(vm) && domain !=
|
438
|
+
if is_windows?(vm) && domain != "local"
|
438
439
|
start = Time.now.utc
|
439
440
|
trimmed_name = machine_spec.name.byteslice(0, 15)
|
440
441
|
expected_name = "#{trimmed_name}.#{domain}"
|
@@ -442,8 +443,8 @@ module ChefProvisioningVsphere
|
|
442
443
|
"waiting to domain join and be named #{expected_name}"
|
443
444
|
)
|
444
445
|
until (Time.now.utc - start) > 30 ||
|
445
|
-
|
446
|
-
print
|
446
|
+
(vm.guest.hostName == expected_name)
|
447
|
+
print "."
|
447
448
|
sleep 5
|
448
449
|
end
|
449
450
|
end
|
@@ -460,12 +461,12 @@ module ChefProvisioningVsphere
|
|
460
461
|
ip_to_bootstrap(bootstrap_options, vm)
|
461
462
|
ready_timeout = machine_options[:ready_timeout] || 300
|
462
463
|
msg1 = "waiting up to #{ready_timeout} seconds for customization"
|
463
|
-
msg2 = " and find #{machine_spec.location['ipaddress']}" unless machine_spec.location[
|
464
|
+
msg2 = " and find #{machine_spec.location['ipaddress']}" unless machine_spec.location["ipaddress"].nil? # unless vm_ip == vm.guest.ipAddress # RuntimeError: can't modify frozen String
|
464
465
|
msg = [msg1, msg2].join
|
465
466
|
action_handler.report_progress msg
|
466
467
|
|
467
468
|
vm_ip = ip_to_bootstrap(bootstrap_options, vm) || vm.guest.ipAddress
|
468
|
-
machine_spec.location[
|
469
|
+
machine_spec.location["ipaddress"] = vm_ip
|
469
470
|
until transport_for(
|
470
471
|
machine_spec,
|
471
472
|
machine_options[:bootstrap_options][:ssh],
|
@@ -475,7 +476,7 @@ module ChefProvisioningVsphere
|
|
475
476
|
"IP addresses found: #{all_ips_for(vm)}"
|
476
477
|
)
|
477
478
|
vm_ip = ip_to_bootstrap(bootstrap_options, vm) || vm.guest.ipAddress
|
478
|
-
machine_spec.location[
|
479
|
+
machine_spec.location["ipaddress"] = vm_ip
|
479
480
|
if has_ip?(vm_ip, vm)
|
480
481
|
transport_for(
|
481
482
|
machine_spec,
|
@@ -527,7 +528,7 @@ module ChefProvisioningVsphere
|
|
527
528
|
vsphere_helper.stop_vm(vm, machine_options[:stop_timeout])
|
528
529
|
vm.Destroy_Task.wait_for_completion
|
529
530
|
rescue RbVmomi::Fault => fault
|
530
|
-
raise fault unless fault.fault.class.wsdl_name ==
|
531
|
+
raise fault unless fault.fault.class.wsdl_name == "ManagedObjectNotFound"
|
531
532
|
ensure
|
532
533
|
machine_spec.location = nil
|
533
534
|
end
|
@@ -579,7 +580,7 @@ module ChefProvisioningVsphere
|
|
579
580
|
action_handler.perform_action "restart machine #{machine_spec.name} (#{driver_url})" do
|
580
581
|
stop_machine(action_handler, machine_spec, machine_options)
|
581
582
|
start_machine(action_handler, machine_spec, machine_options)
|
582
|
-
machine_spec.location[
|
583
|
+
machine_spec.location["started_at"] = Time.now.utc.to_s
|
583
584
|
end
|
584
585
|
end
|
585
586
|
|
@@ -591,24 +592,24 @@ module ChefProvisioningVsphere
|
|
591
592
|
# @param [Object] _machine_spec The machine spec required to start the VM.
|
592
593
|
# @param [Object] machine Machine object to connect to.
|
593
594
|
def setup_ubuntu_dns(machine, bootstrap_options, _machine_spec)
|
594
|
-
host_lookup = machine.execute_always(
|
595
|
+
host_lookup = machine.execute_always("host google.com")
|
595
596
|
if host_lookup.exitstatus != 0
|
596
|
-
if host_lookup.stdout.include?(
|
597
|
-
machine.execute_always(
|
597
|
+
if host_lookup.stdout.include?("setlocale: LC_ALL")
|
598
|
+
machine.execute_always("locale-gen en_US && update-locale LANG=en_US")
|
598
599
|
end
|
599
600
|
distro = machine.execute_always("lsb_release -i | sed -e 's/Distributor ID://g'").stdout.strip
|
600
601
|
Chef::Log.info "Found distro:#{distro}"
|
601
|
-
if distro ==
|
602
|
-
distro_version = machine.execute_always(
|
602
|
+
if distro == "Ubuntu"
|
603
|
+
distro_version = machine.execute_always("lsb_release -r | sed -e s/[^0-9.]//g").stdout.strip.to_f
|
603
604
|
Chef::Log.info "Found distro version:#{distro_version}"
|
604
605
|
if distro_version >= 12.04
|
605
|
-
Chef::Log.info
|
606
|
-
interfaces_file =
|
607
|
-
nameservers = bootstrap_options[:customization_spec][:ipsettings][:dnsServerList].join(
|
606
|
+
Chef::Log.info "Ubuntu version 12.04 or greater. Need to patch DNS."
|
607
|
+
interfaces_file = "/etc/network/interfaces"
|
608
|
+
nameservers = bootstrap_options[:customization_spec][:ipsettings][:dnsServerList].join(" ")
|
608
609
|
machine.execute_always("if ! cat #{interfaces_file} | grep -q dns-search ; then echo 'dns-search #{bootstrap_options[:customization_spec][:domain]}' >> #{interfaces_file} ; fi")
|
609
610
|
machine.execute_always("if ! cat #{interfaces_file} | grep -q dns-nameservers ; then echo 'dns-nameservers #{nameservers}' >> #{interfaces_file} ; fi")
|
610
|
-
machine.execute_always(
|
611
|
-
machine.execute_always(
|
611
|
+
machine.execute_always("/etc/init.d/networking restart")
|
612
|
+
machine.execute_always("apt-get -qq update")
|
612
613
|
end
|
613
614
|
end
|
614
615
|
end
|
@@ -633,22 +634,22 @@ module ChefProvisioningVsphere
|
|
633
634
|
end
|
634
635
|
|
635
636
|
def remaining_wait_time(machine_spec, machine_options)
|
636
|
-
if machine_spec.location[
|
637
|
+
if machine_spec.location["started_at"]
|
637
638
|
(machine_options[:start_timeout] || 600) -
|
638
|
-
(Time.now.utc - Time.parse(machine_spec.location[
|
639
|
+
(Time.now.utc - Time.parse(machine_spec.location["started_at"]))
|
639
640
|
else
|
640
641
|
(machine_options[:create_timeout] || 600) -
|
641
|
-
(Time.now.utc - Time.parse(machine_spec.location[
|
642
|
+
(Time.now.utc - Time.parse(machine_spec.location["allocated_at"]))
|
642
643
|
end
|
643
644
|
end
|
644
645
|
|
645
646
|
def wait_until_ready(action_handler, machine_spec, machine_options, vm)
|
646
|
-
if vm.guest.toolsRunningStatus !=
|
647
|
+
if vm.guest.toolsRunningStatus != "guestToolsRunning"
|
647
648
|
if action_handler.should_perform_actions
|
648
649
|
action_handler.report_progress "waiting for #{machine_spec.name} (#{vm.config.instanceUuid} on #{driver_url}) to be ready ..."
|
649
650
|
until remaining_wait_time(machine_spec, machine_options) < 0 ||
|
650
|
-
|
651
|
-
print
|
651
|
+
(vm.guest.toolsRunningStatus == "guestToolsRunning" && vm.guest.ipAddress && !vm.guest.ipAddress.empty?)
|
652
|
+
print "."
|
652
653
|
sleep 5
|
653
654
|
end
|
654
655
|
action_handler.report_progress "#{machine_spec.name} is now ready"
|
@@ -658,7 +659,7 @@ module ChefProvisioningVsphere
|
|
658
659
|
|
659
660
|
def vm_for(machine_spec)
|
660
661
|
if machine_spec.location
|
661
|
-
vsphere_helper.find_vm_by_id(machine_spec.location[
|
662
|
+
vsphere_helper.find_vm_by_id(machine_spec.location["server_id"])
|
662
663
|
end
|
663
664
|
end
|
664
665
|
|
@@ -719,7 +720,7 @@ module ChefProvisioningVsphere
|
|
719
720
|
)
|
720
721
|
strategy = convergence_strategy_for(machine_spec, machine_options)
|
721
722
|
|
722
|
-
if machine_spec.location[
|
723
|
+
if machine_spec.location["is_windows"]
|
723
724
|
Chef::Provisioning::Machine::WindowsMachine.new(
|
724
725
|
machine_spec, transport, strategy
|
725
726
|
)
|
@@ -732,13 +733,13 @@ module ChefProvisioningVsphere
|
|
732
733
|
|
733
734
|
def is_windows?(vm)
|
734
735
|
return false if vm.nil?
|
735
|
-
vm.config.guestId.start_with?(
|
736
|
+
vm.config.guestId.start_with?("win")
|
736
737
|
end
|
737
738
|
|
738
739
|
def convergence_strategy_for(machine_spec, machine_options)
|
739
|
-
require
|
740
|
-
require
|
741
|
-
require
|
740
|
+
require "chef/provisioning/convergence_strategy/install_msi"
|
741
|
+
require "chef/provisioning/convergence_strategy/install_cached"
|
742
|
+
require "chef/provisioning/convergence_strategy/no_converge"
|
742
743
|
|
743
744
|
mopts = machine_options[:convergence_options].to_hash.dup
|
744
745
|
if mopts[:chef_server]
|
@@ -752,7 +753,7 @@ module ChefProvisioningVsphere
|
|
752
753
|
)
|
753
754
|
end
|
754
755
|
|
755
|
-
if machine_spec.location[
|
756
|
+
if machine_spec.location["is_windows"]
|
756
757
|
Chef::Provisioning::ConvergenceStrategy::InstallMsi.new(
|
757
758
|
mopts, config
|
758
759
|
)
|
@@ -780,7 +781,7 @@ module ChefProvisioningVsphere
|
|
780
781
|
action_handler.report_progress "waiting for #{machine_spec.name} (#{vm.config.instanceUuid} on #{driver_url}) to be connectable (transport up and running) ..."
|
781
782
|
|
782
783
|
until remaining_wait_time(machine_spec, machine_options) < 0 || transport.available?
|
783
|
-
print
|
784
|
+
print "."
|
784
785
|
sleep 5
|
785
786
|
end
|
786
787
|
|
@@ -797,9 +798,9 @@ module ChefProvisioningVsphere
|
|
797
798
|
def transport_for(
|
798
799
|
machine_spec,
|
799
800
|
remoting_options,
|
800
|
-
ip = machine_spec.location[
|
801
|
+
ip = machine_spec.location["ipaddress"]
|
801
802
|
)
|
802
|
-
if machine_spec.location[
|
803
|
+
if machine_spec.location["is_windows"]
|
803
804
|
create_winrm_transport(ip, remoting_options)
|
804
805
|
else
|
805
806
|
create_ssh_transport(ip, remoting_options)
|
@@ -811,7 +812,7 @@ module ChefProvisioningVsphere
|
|
811
812
|
# @param [String] host The host the VM is connecting to
|
812
813
|
# @param [Object] options Options that are required to connect to the host from Chef-Provisioning
|
813
814
|
def create_winrm_transport(host, options)
|
814
|
-
require
|
815
|
+
require "chef/provisioning/transport/winrm"
|
815
816
|
winrm_transport = if options[:port] == 5986
|
816
817
|
:ssl
|
817
818
|
else
|
@@ -820,7 +821,7 @@ module ChefProvisioningVsphere
|
|
820
821
|
port = options[:port] || vm_helper.port
|
821
822
|
winrm_options = {
|
822
823
|
user: (options[:user]).to_s,
|
823
|
-
pass: options[:password]
|
824
|
+
pass: options[:password],
|
824
825
|
}
|
825
826
|
if options[:winrm_opts].nil?
|
826
827
|
opt = options[:user].include?('\\') ? :disable_sspi : :basic_auth_only
|
@@ -828,12 +829,12 @@ module ChefProvisioningVsphere
|
|
828
829
|
else
|
829
830
|
winrm_options.merge!(options[:winrm_opts])
|
830
831
|
end
|
831
|
-
scheme = winrm_transport == :ssl ?
|
832
|
+
scheme = winrm_transport == :ssl ? "https" : "http"
|
832
833
|
endpoint = URI::Generic.build(
|
833
834
|
scheme: scheme,
|
834
835
|
host: host,
|
835
836
|
port: port,
|
836
|
-
path:
|
837
|
+
path: "/wsman"
|
837
838
|
).to_s
|
838
839
|
|
839
840
|
Chef::Provisioning::Transport::WinRM.new(
|
@@ -849,14 +850,14 @@ module ChefProvisioningVsphere
|
|
849
850
|
# @param [String] host The host the VM is connecting to
|
850
851
|
# @param [Object] options Options that are required to connect to the host from Chef-Provisioning
|
851
852
|
def create_ssh_transport(host, options)
|
852
|
-
require
|
853
|
+
require "chef/provisioning/transport/ssh"
|
853
854
|
ssh_user = options[:user]
|
854
855
|
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v; }
|
855
856
|
Chef::Provisioning::Transport::SSH.new(
|
856
857
|
host,
|
857
858
|
ssh_user,
|
858
859
|
options.to_hash,
|
859
|
-
@config[:machine_options][:sudo] ? { prefix:
|
860
|
+
@config[:machine_options][:sudo] ? { prefix: "sudo " } : {},
|
860
861
|
config
|
861
862
|
)
|
862
863
|
end
|
@@ -883,7 +884,7 @@ module ChefProvisioningVsphere
|
|
883
884
|
vm_ip = wait_for_ipv4(bootstrap_ipv4_timeout(bootstrap_options), vm)
|
884
885
|
else
|
885
886
|
until vm_guest_ip?(vm) || Time.now.utc - start_time > timeout
|
886
|
-
print
|
887
|
+
print "."
|
887
888
|
sleep 1
|
888
889
|
end
|
889
890
|
vm_ip = vm.guest.ipAddress
|
@@ -891,7 +892,7 @@ module ChefProvisioningVsphere
|
|
891
892
|
|
892
893
|
# Then check that it is reachable
|
893
894
|
until Time.now.utc - start_time > timeout
|
894
|
-
print
|
895
|
+
print "."
|
895
896
|
return vm_ip.to_s if vm_helper.open_port?(vm_ip, vm_helper.port, 1)
|
896
897
|
sleep 1
|
897
898
|
end
|
@@ -940,14 +941,14 @@ module ChefProvisioningVsphere
|
|
940
941
|
end
|
941
942
|
end
|
942
943
|
end
|
943
|
-
raise
|
944
|
+
raise "Timed out waiting for ipv4 address!"
|
944
945
|
end
|
945
946
|
|
946
947
|
# What is the VM guest IP
|
947
948
|
#
|
948
949
|
# @param [Object] vm The VM object from Chef-Provisioning
|
949
950
|
def vm_guest_ip?(vm)
|
950
|
-
vm.guest.guestState ==
|
951
|
+
vm.guest.guestState == "running" && vm.guest.toolsRunningStatus == "guestToolsRunning" && !vm.guest.ipAddress.nil?
|
951
952
|
end
|
952
953
|
end
|
953
954
|
end
|