chef-provisioning-vsphere 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|