chef-provisioning-vsphere 2.1.0 → 2.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1250ea80100fd698d506ffd6f006dc479c66d1e1
4
- data.tar.gz: a5fcb5cea33734d3ade4eff3ed7cd0fe4baa80af
3
+ metadata.gz: 2b059db41619a80c83fc1e3a397054aa706a40f9
4
+ data.tar.gz: f5231f61cf89c339da4140b10641bcb02c79c538
5
5
  SHA512:
6
- metadata.gz: cbee2f3e9c9bf33d412b7fc247ee1c08d755570f6f07bbbdf10dd0cd34dd720f126eef620a2366bb0964e04e4d67e42d27106fb721757012177fbe5db3ac026e
7
- data.tar.gz: a41a2f406b599ccd0500b69ade08d223e329007722e583ad95842704a06ae63b872ed8f7e1ec323921816f2095981879ad2824f603df00f642505835e07ce8e7
6
+ metadata.gz: 66bcd56de9e4a17cd2de6431b982228c19d6dea451b1d915f36d98f2dc7fa0dfa9d43d87e9893e4b945b629683b3d13ab60690fe063d08c3ced7db4f8a2d3e95
7
+ data.tar.gz: a261f68210ebfed783e07d82085e0d7b86cc4633f83ebe15566db79cab5d2b3c635d93f3bce36b5c5e5cf5f71242cac94dd7caa7968035d085002b1f68e44bbc
@@ -1,7 +1,16 @@
1
1
  # Change Log
2
2
 
3
- ## [v2.1.0](https://github.com/chef-partners/chef-provisioning-vsphere/tree/v2.1.0)
3
+ ## [v2.2.0](https://github.com/chef-partners/chef-provisioning-vsphere/tree/v2.2.0)
4
4
 
5
+ [Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v2.1.0...v2.2.0)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Save VM properties to kitchen state file after cloning [\#83](https://github.com/chef-partners/chef-provisioning-vsphere/pull/83) ([josh-barker](https://github.com/josh-barker))
10
+ - allow chef14 [\#82](https://github.com/chef-partners/chef-provisioning-vsphere/pull/82) ([jjlimepoint](https://github.com/jjlimepoint))
11
+ - Main disk size and rework of ip\_to\_bootstrap\(\) [\#72](https://github.com/chef-partners/chef-provisioning-vsphere/pull/72) ([algaut](https://github.com/algaut))
12
+
13
+ ## [v2.1.0](https://github.com/chef-partners/chef-provisioning-vsphere/tree/v2.1.0) (2018-03-02)
5
14
  [Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v2.0.10...v2.1.0)
6
15
 
7
16
  **Closed issues:**
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  This is a [chef-provisioning](https://github.com/chef/chef-provisioning) provisioner for [VMware vSphere](http://www.vmware.com/products/vsphere).
9
9
 
10
- chef-provisioning-vsphere supports provisioning Unix/ssh and Windows/WinRMrm guest VMs.
10
+ chef-provisioning-vsphere supports provisioning Unix/ssh and Windows/WinRM guest VMs.
11
11
 
12
12
  ## Prerequisites
13
13
 
@@ -87,12 +87,14 @@ This will use chef-zero and needs no chef server (only works for ssh). Note that
87
87
  - `[:network_name]` - array of network names to use. A NIC will be added for each
88
88
  - `[:memory_mb]` - number of megabytes to allocate for machine
89
89
  - `[:host]` - `{cluster}`/`{host}` to use during provisioning
90
- - `[:resource_pool]` - `{cluster}`/`{resource pool}` to use during provisioning
90
+ - `[:resource_pool]` - `{cluster}`/`{resource pool}` to use during provisioning
91
91
  (for single-host setups, use `{vsphere_ip / vsphere_hostname}`/`{resource pool}`)
92
92
  - `[:additional_disk_size_gb]` - an array of numbers, each signifying the number of gigabytes to assign to an additional disk (*this requires a datastore to be specified*)
93
+ - `[:main_disk_size_gb]` - the desired size of the VM's main virtual disk in gigabytes. (*Will be ignored if lower than the template's main disk size*)
93
94
  - `[:initial_iso_file]` - an iso file to mount at boot. This is useful for custom OS installations. In the format of `[datastore] filename.iso`
94
95
  - `[:bootstrap_ipv4]` - `true` / `false`, set to `true` to wait for an IPv4 address to become available before bootstrapping.
95
96
  - `[:ipv4_timeout]` - use with `[:bootstrap_ipv4]`, set the time in seconds to wait before an IPv4 address is received (defaults to 30)
97
+ - `[:ip_ready_timeout]` - set the time in seconds to wait before the machine IP is ready and connectable (defaults to 300)
96
98
  - `[:ssh][:user]` user to use for ssh/winrm (defaults to root on linux/administrator on windows)
97
99
  - `[:ssh][:password]` - password to use for ssh/winrm
98
100
  - `[:ssh][:paranoid]` - specifies the strictness of the host key verification checking
@@ -21,9 +21,9 @@ Gem::Specification.new do |s|
21
21
  s.files = `git ls-files -z`.split("\x0")
22
22
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
23
23
 
24
- s.add_dependency 'chef', '>= 12.0', '< 14.0'
24
+ s.add_dependency 'chef', '>= 12.0'
25
25
  s.add_dependency 'chef-provisioning', '~> 2.0'
26
- s.add_dependency 'cheffish', '>= 4.0', '< 14.0'
26
+ s.add_dependency 'cheffish', '>= 4.0'
27
27
  s.add_dependency 'rbvmomi', '~> 1.10'
28
28
 
29
29
  s.add_development_dependency 'chefstyle'
@@ -224,7 +224,7 @@ module ChefProvisioningVsphere
224
224
  vm = clone_vm(
225
225
  action_handler,
226
226
  bootstrap_options,
227
- machine_spec.name
227
+ machine_spec
228
228
  )
229
229
  end
230
230
  vm
@@ -587,7 +587,7 @@ module ChefProvisioningVsphere
587
587
 
588
588
  # Ubuntu requires some...hacking to get DNS to work.
589
589
  #
590
- # @param [Object] bootstrap_options The bootstarp options required to start the VM.
590
+ # @param [Object] bootstrap_options The bootstrap options required to start the VM.
591
591
  # @param [Object] _machine_spec The machine spec required to start the VM.
592
592
  # @param [Object] machine Machine object to connect to.
593
593
  def setup_ubuntu_dns(machine, bootstrap_options, _machine_spec)
@@ -616,7 +616,7 @@ module ChefProvisioningVsphere
616
616
 
617
617
  # Verify static IP.
618
618
  #
619
- # @param [Object] bootstrap_options The bootstarp options required to start the VM.
619
+ # @param [Object] bootstrap_options The bootstrap options required to start the VM.
620
620
  def has_static_ip(bootstrap_options)
621
621
  if bootstrap_options.key?(:customization_spec)
622
622
  bootstrap_options = bootstrap_options[:customization_spec]
@@ -662,7 +662,8 @@ module ChefProvisioningVsphere
662
662
  end
663
663
  end
664
664
 
665
- def clone_vm(action_handler, bootstrap_options, machine_name)
665
+ def clone_vm(action_handler, bootstrap_options, machine_spec)
666
+ machine_name = machine_spec.name
666
667
  vm_template = vm_template_for(bootstrap_options)
667
668
 
668
669
  spec_builder = CloneSpecBuilder.new(vsphere_helper, action_handler)
@@ -684,18 +685,20 @@ module ChefProvisioningVsphere
684
685
  print "\n#{machine_name} done!"
685
686
 
686
687
  vm = vsphere_helper.find_vm(vm_folder, machine_name)
688
+ add_machine_spec_location(vm, machine_spec)
689
+
690
+ additional_disk_size_gb = Array(bootstrap_options[:additional_disk_size_gb])
687
691
 
688
- additional_disk_size_gb = bootstrap_options[:additional_disk_size_gb]
689
- unless additional_disk_size_gb.is_a?(Array)
690
- additional_disk_size_gb = [additional_disk_size_gb]
692
+
693
+ vsphere_helper.update_main_disk_size_for(vm, bootstrap_options[:main_disk_size_gb])
694
+ vsphere_helper.set_additional_disks_for(vm, bootstrap_options[:datastore], bootstrap_options[:additional_disk_size_gb])
695
+ if !additional_disk_size_gb.empty? && bootstrap_options[:datastore].to_s.empty?
696
+ raise ':datastore must be specified when adding a disk to a cloned vm'
691
697
  end
692
698
 
693
699
  additional_disk_size_gb.each do |size|
694
700
  size = size.to_i
695
701
  next if size == 0
696
- if bootstrap_options[:datastore].to_s.empty?
697
- raise ':datastore must be specified when adding a disk to a cloned vm'
698
- end
699
702
  task = vm.ReconfigVM_Task(
700
703
  spec: RbVmomi::VIM.VirtualMachineConfigSpec(
701
704
  deviceChange: [
@@ -710,6 +713,7 @@ module ChefProvisioningVsphere
710
713
  task.wait_for_completion
711
714
  end
712
715
 
716
+
713
717
  if bootstrap_options[:initial_iso_image]
714
718
  d_obj = vm.config.hardware.device.select {|hw| hw.class == RbVmomi::VIM::VirtualCdrom}.first
715
719
  backing = RbVmomi::VIM::VirtualCdromIsoBackingInfo(fileName: bootstrap_options[:initial_iso_image])
@@ -724,12 +728,15 @@ module ChefProvisioningVsphere
724
728
  connectable: RbVmomi::VIM::VirtualDeviceConnectInfo(
725
729
  startConnected: true,
726
730
  connected: true,
727
- allowGuestControl: true)
731
+
732
+ allowGuestControl: true
728
733
  )
729
- ]
730
- )
734
+
735
+ )
736
+ ]
731
737
  )
732
- task.wait_for_completion
738
+ )
739
+ task.wait_for_completion
733
740
  end
734
741
 
735
742
  vm
@@ -885,7 +892,7 @@ module ChefProvisioningVsphere
885
892
  )
886
893
  end
887
894
 
888
- # Find the IP to bootstrap against
895
+ # Return a SSH transport for the machine
889
896
  #
890
897
  # @param [String] host The host the VM is connecting to
891
898
  # @param [Object] options Options that are required to connect to the host from Chef-Provisioning
@@ -907,12 +914,14 @@ module ChefProvisioningVsphere
907
914
  # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
908
915
  # @param [Object] vm The VM object from Chef-Provisioning
909
916
  def ip_to_bootstrap(bootstrap_options, vm)
917
+ start_time = Time.now.utc
918
+ timeout = bootstrap_ip_ready_timeout(bootstrap_options)
910
919
  @vm_helper.find_port?(vm, bootstrap_options) unless vm_helper.port?
911
- vm_ip = nil
920
+ # First get the IP to be tested
912
921
  if has_static_ip(bootstrap_options)
913
922
  if bootstrap_options[:customization_spec].is_a?(String)
914
923
  spec = vsphere_helper.find_customization_spec(bootstrap_options[:customization_spec])
915
- vm_ip = spec.nicSettingMap[0].adapter.ip.ipAddress
924
+ vm_ip = spec.nicSettingMap[0].adapter.ip.ipAddress # Use a direct return here?
916
925
  else
917
926
  ## Check if true available
918
927
  vm_ip = bootstrap_options[:customization_spec][:ipsettings][:ip] unless vm_helper.ip?
@@ -922,63 +931,70 @@ module ChefProvisioningVsphere
922
931
  nb_attempts += 1
923
932
  end
924
933
  end
934
+ elsif use_ipv4_during_bootstrap?(bootstrap_options)
935
+ vm_ip = wait_for_ipv4(bootstrap_ipv4_timeout(bootstrap_options), vm)
925
936
  else
926
- if use_ipv4_during_bootstrap?(bootstrap_options)
927
- until @vm_helper.open_port?(vm_ip, @vm_helper.port, 1)
928
- wait_for_ipv4(bootstrap_ip_timeout(bootstrap_options), vm)
929
- end
930
- end
931
- vm_ip = vm.guest.ipAddress until vm_guest_ip?(vm) && @vm_helper.open_port?(vm_ip, @vm_helper.port, 1) # Don't set empty ip
937
+ vm_ip = vm.guest.ipAddress until vm_guest_ip?(vm) || Time.now.utc - start_time > timeout
932
938
  end
933
- vm_ip.to_s
939
+ # Then check that it is reachable
940
+ until Time.now.utc - start_time > timeout
941
+ print '.'
942
+ return vm_ip.to_s if @vm_helper.open_port?(vm_ip, @vm_helper.port, 1)
943
+ sleep 1
944
+ end
945
+ raise "Timed out (#{timeout}s) waiting for ip #{vm_ip} to be connectable"
934
946
  end
935
947
 
936
948
  # Force IPv4 a bootstrap, default: false
937
949
  #
938
950
  # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
939
951
  def use_ipv4_during_bootstrap?(bootstrap_options)
940
- if bootstrap_options.key?(:bootstrap_ipv4)
941
- return bootstrap_options[:bootstrap_ipv4] == true
942
- end
943
- false
952
+ bootstrap_options.key?(:bootstrap_ipv4) && bootstrap_options[:bootstrap_ipv4] == true
944
953
  end
945
954
 
946
- # Setting a bootstrap ip timeout, default: 30
955
+ # Setting a bootstrap ipv4 timeout, default: 30
947
956
  #
948
957
  # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
949
- def bootstrap_ip_timeout(bootstrap_options)
950
- if bootstrap_options.key?(:ipv4_timeout)
951
- return bootstrap_options[:ipv4_timeout].to_i
952
- end
953
- 30
958
+ def bootstrap_ipv4_timeout(bootstrap_options)
959
+ bootstrap_options.key?(:ipv4_timeout) ? bootstrap_options[:ipv4_timeout].to_i : 30
960
+ end
961
+
962
+ # Setting a bootstrap ip timeout, default: 300
963
+ #
964
+ # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
965
+ def bootstrap_ip_ready_timeout(bootstrap_options)
966
+ bootstrap_options.key?(:ip_ready_timeout) ? bootstrap_options[:ip_ready_timeout].to_i : 300
954
967
  end
955
968
 
956
- # What for IPv4 address
969
+ # Wait for IPv4 address
957
970
  #
958
- # @param [String] timeout Declared a timeout
971
+ # @param [String] timeout_seconds A timeout in seconds, an error will be raised if it is reached
959
972
  # @param [Object] vm The VM object from Chef-Provisioning
960
- def wait_for_ipv4(timeout, vm)
961
- sleep_time = 5
962
- print 'Waiting for ipv4 address.'
963
- tries = 0
964
- start_search_ip = true
965
- max_tries = timeout > sleep_time ? timeout / sleep_time : 1
966
- while start_search_ip && (tries += 1) <= max_tries
967
- print '.'
968
- sleep sleep_time
969
- vm_ip = vm.guest.ipAddress if vm_guest_ip?(vm)
970
- start_search_ip = false if @vm_helper.open_port?(vm_ip, @vm_helper.port, 1)
973
+ def wait_for_ipv4(timeout_seconds, vm)
974
+ Chef::Log.info("Waiting #{timeout_seconds}s for ipv4 address.")
975
+
976
+ start_time = Time.now.utc
977
+ while (Time.now.utc - start_time) <= timeout_seconds
978
+ # print '.'
979
+ sleep 5
980
+ vm_ips = all_ips_for(vm)
981
+ Chef::Log.info("Found IP address(es): #{vm_ips}")
982
+ next unless vm_guest_ip?(vm)
983
+ vm_ips.each do |vm_ip|
984
+ if IPAddr.new(vm_ip).ipv4?
985
+ Chef::Log.info("Found ipv4 address: #{vm_ip}")
986
+ return vm_ip
987
+ end
988
+ end
971
989
  end
972
- raise 'Timed out waiting for ipv4 address!' if tries > max_tries
973
- puts 'Found ipv4 address!'
974
- true
990
+ raise 'Timed out waiting for ipv4 address!'
975
991
  end
976
992
 
977
993
  # What is the VM guest IP
978
994
  #
979
995
  # @param [Object] vm The VM object from Chef-Provisioning
980
996
  def vm_guest_ip?(vm)
981
- vm.guest.guestState == 'running' && vm.guest.toolsRunningStatus == 'guestToolsRunning' && !vm.guest.ipAddress.nil? && IPAddr.new(vm.guest.ipAddress).ipv4?
997
+ vm.guest.guestState == 'running' && vm.guest.toolsRunningStatus == 'guestToolsRunning' && !vm.guest.ipAddress.nil?
982
998
  end
983
999
  end
984
1000
  end
@@ -3,5 +3,5 @@
3
3
  # Provisions machines in vSphere.
4
4
  module ChefProvisioningVsphere
5
5
  # The version of this awesome Gem. BOOM.
6
- VERSION = '2.1.0'.freeze
6
+ VERSION = '2.2.0'.freeze
7
7
  end
@@ -253,6 +253,62 @@ module ChefProvisioningVsphere
253
253
  )
254
254
  end
255
255
 
256
+ # Creates the additional virtual disk for the VM
257
+ #
258
+ # @param [Object] vm the VM object.
259
+ # @param [Subject] datastore the datastore the disk will be created on.
260
+ # @param [Subject] size_gb the size of the disk.
261
+ def set_additional_disks_for(vm, datastore, additional_disk_size_gb)
262
+ (additional_disk_size_gb.is_a?(Array) ? additional_disk_size_gb : [additional_disk_size_gb]).each do |size|
263
+ size = size.to_i
264
+ next if size.zero?
265
+ if datastore.to_s.empty?
266
+ raise ':datastore must be specified when adding a disk to a cloned vm'
267
+ end
268
+ task = vm.ReconfigVM_Task(
269
+ spec: RbVmomi::VIM.VirtualMachineConfigSpec(
270
+ deviceChange: [
271
+ virtual_disk_for(
272
+ vm,
273
+ datastore,
274
+ size
275
+ )
276
+ ]
277
+ )
278
+ )
279
+ task.wait_for_completion
280
+ end
281
+ end
282
+
283
+ # Updates the main virtual disk for the VM
284
+ # This can only add capacity to the main disk, it is not possible to reduce the capacity.
285
+ #
286
+ # @param [Object] vm the VM object.
287
+ # @param [Subject] size_gb the final size of the disk.
288
+ def update_main_disk_size_for(vm, size_gb)
289
+ disk = vm.disks.first
290
+ size_kb = size_gb.to_i * 1024 * 1024
291
+ if disk.capacityInKB > size_kb
292
+ if size_gb.to_i > 0
293
+ msg = "Specified disk size #{size_gb}GB is inferior to the template's disk size (#{disk.capacityInKB / 1024**2}GB)."
294
+ msg += "\nThe VM disk size will remain the same."
295
+ Chef::Log.warn(msg)
296
+ end
297
+ return false
298
+ end
299
+ disk.capacityInKB = size_kb
300
+ vm.ReconfigVM_Task(
301
+ spec: RbVmomi::VIM.VirtualMachineConfigSpec(
302
+ deviceChange: [
303
+ {
304
+ operation: :edit,
305
+ device: disk
306
+ }
307
+ ]
308
+ )
309
+ ).wait_for_completion
310
+ end
311
+
256
312
  # Add a new network card via the boot_options
257
313
  #
258
314
  # @param [Object] action_handler TODO
@@ -417,6 +473,7 @@ module ChefProvisioningVsphere
417
473
  res = traverse_folders_for_network(child, item)
418
474
  return res unless res.nil?
419
475
  end
476
+ nil
420
477
  when RbVmomi::VIM::VmwareDistributedVirtualSwitch
421
478
  idx = base.summary.portgroupName.find_index(item)
422
479
  idx.nil? ? nil : base.portgroup[idx]
@@ -23,12 +23,12 @@ module Kitchen
23
23
  ssh: {
24
24
  user: 'root',
25
25
  paranoid: false,
26
- port: 22
26
+ port: 22,
27
27
  },
28
28
  convergence_options: {},
29
29
  customization_spec: {
30
- domain: 'local'
31
- }
30
+ domain: 'local',
31
+ },
32
32
  }
33
33
 
34
34
  default_config(:vsphere_name) do |driver|
@@ -39,17 +39,26 @@ module Kitchen
39
39
  #
40
40
  # @param [Object] state Uses state of the machine from Chef provisioning.
41
41
  def create(state)
42
- state[:vsphere_name] = config[:vsphere_name]
42
+ state[:vsphere_name] ||= config[:vsphere_name]
43
43
  state[:username] = config[:machine_options][:bootstrap_options][:ssh][:user]
44
44
  state[:password] = config[:machine_options][:bootstrap_options][:ssh][:password]
45
45
  config[:server_name] = state[:vsphere_name]
46
46
 
47
- machine = with_provisioning_driver(state) do |action_handler, driver, machine_spec|
48
- driver.allocate_machine(action_handler, machine_spec, config[:machine_options])
49
- driver.ready_machine(action_handler, machine_spec, config[:machine_options])
50
- state[:server_id] = machine_spec.location['server_id']
51
- state[:hostname] = machine_spec.location['ipaddress']
52
- machine_spec.save(action_handler)
47
+ with_provisioning_driver(state) do |action_handler, driver, machine_spec|
48
+ begin
49
+ driver.allocate_machine(action_handler, machine_spec, config[:machine_options])
50
+ driver.ready_machine(action_handler, machine_spec, config[:machine_options])
51
+ rescue
52
+ raise
53
+ ensure
54
+ if machine_spec
55
+ if machine_spec.location
56
+ state[:server_id] = machine_spec.location['server_id']
57
+ state[:hostname] = machine_spec.location['ipaddress']
58
+ end
59
+ machine_spec.save(action_handler)
60
+ end
61
+ end
53
62
  end
54
63
  end
55
64
 
@@ -36,6 +36,8 @@ require 'chef/provisioning/machine_spec'
36
36
 
37
37
  describe 'vsphere_driver' do
38
38
  before :all do
39
+ skip("driver options do not exist") unless File.exist?(File.expand_path('../config.rb', __FILE__))
40
+
39
41
  @vm_name = "cmvd-test-#{SecureRandom.hex}"
40
42
  @metal_config = eval File.read(File.expand_path('../config.rb', __FILE__))
41
43
  Cheffish.honor_local_mode do
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: 2.1.0
4
+ version: 2.2.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: 2018-03-02 00:00:00.000000000 Z
12
+ date: 2018-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -18,9 +18,6 @@ dependencies:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '12.0'
21
- - - "<"
22
- - !ruby/object:Gem::Version
23
- version: '14.0'
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
@@ -28,9 +25,6 @@ dependencies:
28
25
  - - ">="
29
26
  - !ruby/object:Gem::Version
30
27
  version: '12.0'
31
- - - "<"
32
- - !ruby/object:Gem::Version
33
- version: '14.0'
34
28
  - !ruby/object:Gem::Dependency
35
29
  name: chef-provisioning
36
30
  requirement: !ruby/object:Gem::Requirement
@@ -52,9 +46,6 @@ dependencies:
52
46
  - - ">="
53
47
  - !ruby/object:Gem::Version
54
48
  version: '4.0'
55
- - - "<"
56
- - !ruby/object:Gem::Version
57
- version: '14.0'
58
49
  type: :runtime
59
50
  prerelease: false
60
51
  version_requirements: !ruby/object:Gem::Requirement
@@ -62,9 +53,6 @@ dependencies:
62
53
  - - ">="
63
54
  - !ruby/object:Gem::Version
64
55
  version: '4.0'
65
- - - "<"
66
- - !ruby/object:Gem::Version
67
- version: '14.0'
68
56
  - !ruby/object:Gem::Dependency
69
57
  name: rbvmomi
70
58
  requirement: !ruby/object:Gem::Requirement