knife-vsphere 1.2.10 → 1.2.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8744f4dced691474dbef64dc35252b1170b23b71
4
- data.tar.gz: 803b33b46cb2777d17fab8aed5839b977354be73
3
+ metadata.gz: 041173b0bb8d4791d22c9834ff1759992ef9143f
4
+ data.tar.gz: 2ab04c24568487e1a624bbed1338faef8f5b219b
5
5
  SHA512:
6
- metadata.gz: 2bef8808a65ca410c3b2ad8ffebce83dc68005d3981c7e5941d0e23365cff68368ea90f570066e0904aba06d769cf49f161afbbbafaf6f2def1a5db6e17c8ad9
7
- data.tar.gz: a562ecacc7097eca37b7000f2b4e0709fcfbf43ce9de233f78e071eb69d28874a7e4fa13511151218a82f419abe39f6d60813b9ca6a13f99d2c7bbbc3cb71bcd
6
+ metadata.gz: c08fffec7d372bc2f5011d1d9aef0e4cf83d01a9976eae560fc8b196430379e75f7c765047127fb325dcd54b30738aeb5dcbb4a1d6cf8513f50792a35e458adf
7
+ data.tar.gz: 7f8323b13c044d45b9ad926fa1626d2f12efcc1f48a3aaa7e31a612b98049942115a03c41ba507dbbec9557fc752148ea1e520f1f7eb5a54a82daba67f59273b
@@ -3,6 +3,7 @@
3
3
  # Contributor:: Jesse Campbell (<hikeit@gmail.com>)
4
4
  # Contributor:: Bethany Erskine (<bethany@paperlesspost.com>)
5
5
  # Contributor:: Adrian Stanila (https://github.com/sacx)
6
+ # Contributor:: Ryan Hass (rhass@chef.io)
6
7
  # License:: Apache License, Version 2.0
7
8
  #
8
9
 
@@ -13,6 +14,7 @@ require 'netaddr'
13
14
  require 'securerandom'
14
15
  require 'chef/knife/winrm_base'
15
16
  require 'chef/knife/customization_helper'
17
+ require 'ipaddr'
16
18
 
17
19
  # Clone an existing template into a new VM, optionally applying a customization specification.
18
20
  # usage:
@@ -282,6 +284,16 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
282
284
  description: 'Wait TIMEOUT seconds for sysprep event before continuing with bootstrap',
283
285
  default: 600
284
286
 
287
+ option :bootstrap_nic,
288
+ long: '--bootstrap-nic INTEGER',
289
+ description: 'Network interface to use when multiple NICs are defined on a template.',
290
+ default: 0
291
+
292
+ option :bootstrap_ipv4,
293
+ long: '--bootstrap-ipv4',
294
+ description: 'Force using an IPv4 address when a NIC has both IPv4 and IPv6 addresses.',
295
+ default: false
296
+
285
297
  def run
286
298
  $stdout.sync = true
287
299
 
@@ -332,9 +344,8 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
332
344
  end
333
345
 
334
346
  return unless get_config(:bootstrap)
335
- sleep 2 until vm.guest.ipAddress
336
347
 
337
- connect_host = config[:fqdn] = config[:fqdn] ? get_config(:fqdn) : vm.guest.ipAddress
348
+ connect_host = guest_address(vm)
338
349
  Chef::Log.debug("Connect Host for Bootstrap: #{connect_host}")
339
350
  connect_port = get_config(:ssh_port)
340
351
  protocol = get_config(:bootstrap_protocol)
@@ -347,8 +358,6 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
347
358
  puts 'Waiting for customization to complete...'
348
359
  CustomizationHelper.wait_for_sysprep(vm, vim, Integer(get_config(:sysprep_timeout)), 10)
349
360
  puts 'Customization Complete'
350
- sleep 2 until vm.guest.ipAddress
351
- connect_host = config[:fqdn] = config[:fqdn] ? get_config(:fqdn) : vm.guest.ipAddress
352
361
  end
353
362
  wait_for_access(connect_host, connect_port, protocol)
354
363
  ssh_override_winrm
@@ -361,6 +370,33 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
361
370
  end
362
371
  end
363
372
 
373
+ def ipv4_address(vm)
374
+ puts 'Waiting for a valid IPv4 address...'
375
+ # Multiple reboots occur during guest customization in which a link-local
376
+ # address is assigned. As such, we need to wait until a routable IP address
377
+ # becomes available. This is most commonly an issue with Windows instances.
378
+ sleep 2 while vm.guest.net[config[:bootstrap_nic]].ipConfig.ipAddress.detect { |addr| IPAddr.new(addr.ipAddress).ipv4? }.origin == 'linklayer'
379
+ vm.guest.net[config[:bootstrap_nic]].ipAddress.detect { |addr| IPAddr.new(addr).ipv4? }
380
+ end
381
+
382
+ def guest_address(vm)
383
+ puts 'Waiting for network interfaces to become available...'
384
+ sleep 2 while vm.guest.net.empty? && !vm.guest.ipAddress
385
+ guest_address ||=
386
+ config[:fqdn] = if config[:bootstrap_ipv4]
387
+ ipv4_address(vm)
388
+ elsif config[:fqdn]
389
+ get_config(:fqdn)
390
+ else
391
+ # Use the first IP which is not a link-local address.
392
+ # This is the closest thing to vm.guest.ipAddress but
393
+ # allows specifying a NIC.
394
+ vm.guest.net[config[:bootstrap_nic]].ipConfig.ipAddress.detect do |addr|
395
+ addr.origin != 'linklayer'
396
+ end.ipAddress
397
+ end
398
+ end
399
+
364
400
  def wait_for_access(connect_host, connect_port, protocol)
365
401
  if protocol == 'winrm'
366
402
  load_winrm_deps
@@ -1,3 +1,3 @@
1
1
  module KnifeVsphere
2
- VERSION = '1.2.10'
2
+ VERSION = '1.2.11'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.10
4
+ version: 1.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Pagel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-26 00:00:00.000000000 Z
11
+ date: 2016-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: filesize