chef-provisioning-vsphere 2.1.0 → 2.2.0

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: 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