kitchen-vcenter 2.11.8 → 2.11.13

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
  SHA256:
3
- metadata.gz: 50205f05bf2e5fca3977374cccbd79fa2c703dea89fee58336aeb4d4286a9c1b
4
- data.tar.gz: 5ce2309de70acd22033ea4871903371c1948f4433d85650aebe15bc629a5897d
3
+ metadata.gz: '0942877c46827be0844a6e167180e1f34f97112da87a8d5789d3adc16dc95f28'
4
+ data.tar.gz: f87d1169572ae5b43f70d9d1e324034a982158fd18a1f6910e2baf538927f461
5
5
  SHA512:
6
- metadata.gz: 4a5103e264c87f170405022b9b2fd0e9873365a7707ab023822276c6d312072ccd7ddb4d3de9ac3fef45f99c0c9c530a94e4627e367c8c5b7dfc2f92929ddcc0
7
- data.tar.gz: fcf0c459ebd8805fafe813d5d34e9bc085936c2df84e3679a3564ae27e464757564ae23579c01e18358aa394c2fd013330132ee934d59bc41d668a31cfab109b
6
+ metadata.gz: ad70d62b377f2afe4938d11ab896b77bb281cdb02e10a602e0d3530d959f874fdc00297d44fd90b8159598515a2b768a346973284bbfb7b1c08e882710fbcfbf
7
+ data.tar.gz: 55d2274fcff17c6c677401b602ada26deafa6c16faffa388ea21cc1712706f591cd4ee79e66560756902666dd32fb049b896b24677d008c3aedc833e9730f5f1
@@ -56,6 +56,7 @@ module Kitchen
56
56
  default_config :clone_type, :full
57
57
  default_config :cluster, nil
58
58
  default_config :network_name, nil
59
+ default_config :networks, []
59
60
  default_config :tags, nil
60
61
  default_config :vm_wait_timeout, 90
61
62
  default_config :vm_wait_interval, 2.0
@@ -94,6 +95,11 @@ module Kitchen
94
95
  The `customize` setting was renamed to `vm_customization` and will
95
96
  be removed in future versions.
96
97
  MSG
98
+ deprecate_config_for :network_name, Util.outdent!(<<-MSG)
99
+ The `network_name` setting is deprecated and will be removed in the
100
+ future version. Please use the new settings `networks` and refer
101
+ documentation for the usage.
102
+ MSG
97
103
 
98
104
  # The main create method
99
105
  #
@@ -145,7 +151,7 @@ module Kitchen
145
151
  config[:targethost] = get_host(config[:targethost], datacenter, cluster_id)
146
152
 
147
153
  # Check if network exists, if to be changed
148
- network_exists?(config[:network_name]) unless config[:network_name].nil?
154
+ config[:networks].each { |network| network_exists?(network[:name]) }
149
155
 
150
156
  # Same thing needs to happen with the folder name if it has been set
151
157
  unless config[:folder].nil?
@@ -172,7 +178,7 @@ module Kitchen
172
178
  folder: config[:folder],
173
179
  resource_pool: config[:resource_pool],
174
180
  clone_type: config[:clone_type].to_sym,
175
- network_name: config[:network_name],
181
+ networks: config[:networks],
176
182
  interface: config[:interface],
177
183
  wait_timeout: config[:vm_wait_timeout],
178
184
  wait_interval: config[:vm_wait_interval],
@@ -286,6 +292,13 @@ module Kitchen
286
292
  config[:vm_username] = config[:aggressive_username] unless config[:aggressive_username].nil?
287
293
  config[:vm_password] = config[:aggressive_password] unless config[:aggressive_password].nil?
288
294
  config[:vm_customization] = config[:customize] unless config[:customize].nil?
295
+ validate_network_parameters
296
+ end
297
+
298
+ def validate_network_parameters
299
+ return if config[:network_name].nil?
300
+
301
+ config[:networks] = [{ name: config[:network_name], operation: "edit" }]
289
302
  end
290
303
 
291
304
  # A helper method to validate the state
@@ -20,5 +20,5 @@
20
20
  # The main kitchen-vcenter module
21
21
  module KitchenVcenter
22
22
  # The version of this version of test-kitchen we assume enterprises want.
23
- VERSION = "2.11.8"
23
+ VERSION = "2.11.13"
24
24
  end
@@ -173,6 +173,39 @@ class Support
173
173
  options[:vm_os].downcase.to_sym == :linux
174
174
  end
175
175
 
176
+ # Network configured to update the existing one in the template
177
+ #
178
+ def networks_to_update
179
+ options[:networks].select { |n| n[:operation] == "edit" }
180
+ end
181
+
182
+ # New networks that needs to be attached to newly created vm
183
+ #
184
+ def networks_to_add
185
+ options[:networks].select { |n| [nil, "add"].include?(n[:operation]) }
186
+ end
187
+
188
+ # A network should update if there is a network_device available in the template
189
+ # and the user configured a new network with edit operation.
190
+ #
191
+ def update_network?(network_device)
192
+ networks_to_update.any? && network_device
193
+ end
194
+
195
+ # Checks whether any networks configured for addition
196
+ def add_network?
197
+ networks_to_add.any?
198
+ end
199
+
200
+ # TODO: Remove this method and its invocations after the deprecation of `network_name` config
201
+ # For backward compatibility
202
+ # If the template doesn't have any NIC and the user use the old
203
+ # configuration(network_name), then that network should be attached to the vm.
204
+ #
205
+ def attach_new_network?(network_device)
206
+ network_device.nil? && networks_to_update.any?
207
+ end
208
+
176
209
  def network_device(vm)
177
210
  all_network_devices = vm.config.hardware.device.select do |device|
178
211
  device.is_a?(RbVmomi::VIM::VirtualEthernetCard)
@@ -463,6 +496,85 @@ class Support
463
496
  ))
464
497
  end
465
498
 
499
+ # This method will fetch the network which is configured in the kitchen.yml file with
500
+ # network_name configuration.
501
+ # If there are multiple networks with the same name, first one will be used.
502
+ #
503
+ # @return Network object
504
+ #
505
+ def fetch_network(datacenter, network_name)
506
+ networks = datacenter.network.select { |n| n.name == network_name }
507
+ raise Support::CloneError, format("Could not find network named %s", network_name) if networks.empty?
508
+
509
+ if networks.count > 1
510
+ Kitchen.logger.warn(
511
+ format("Found %d networks named %s, picking first one", networks.count, network_name)
512
+ )
513
+ end
514
+ networks.first
515
+ end
516
+
517
+ # This is a helper method that can be used to create the deviceChange spec which can be used
518
+ # to add a new network device or update the existing network device
519
+ #
520
+ # The network_obj will be used as a backing for the network_device.
521
+ def network_change_spec(network_device, network_obj, network_name, operation: :edit)
522
+ if network_obj.is_a? RbVmomi::VIM::DistributedVirtualPortgroup
523
+ Kitchen.logger.info format("Assigning network %s...", network_obj.pretty_path)
524
+
525
+ vds_obj = network_obj.config.distributedVirtualSwitch
526
+ Kitchen.logger.info format("Using vDS '%s' for network connectivity...", vds_obj.name)
527
+
528
+ network_device.backing = RbVmomi::VIM.VirtualEthernetCardDistributedVirtualPortBackingInfo(
529
+ port: RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
530
+ portgroupKey: network_obj.key,
531
+ switchUuid: vds_obj.uuid
532
+ )
533
+ )
534
+ elsif network_obj.is_a? RbVmomi::VIM::Network
535
+ Kitchen.logger.info format("Assigning network %s...", network_name)
536
+
537
+ network_device.backing = RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(
538
+ deviceName: network_name
539
+ )
540
+ else
541
+ raise Support::CloneError, format("Unknown network type %s for network name %s", network_obj.class.to_s, network_name)
542
+ end
543
+
544
+ RbVmomi::VIM.VirtualDeviceConfigSpec(
545
+ operation: RbVmomi::VIM::VirtualDeviceConfigSpecOperation(operation),
546
+ device: network_device
547
+ )
548
+ end
549
+
550
+ # This method can be used to add new network device to the target vm
551
+ # This fill find the network which defined in kitchen.yml in network_name configuration
552
+ # and attach that to the target vm.
553
+ def add_new_network_device(datacenter, networks)
554
+ device_change = []
555
+ networks.each do |network|
556
+ network_obj = fetch_network(datacenter, network[:name])
557
+ network_device = RbVmomi::VIM.VirtualVmxnet3(
558
+ key: 0,
559
+ deviceInfo: {
560
+ label: network[:name],
561
+ summary: network[:name],
562
+ }
563
+ )
564
+
565
+ device_change << network_change_spec(network_device, network_obj, network[:name], operation: :add)
566
+ end
567
+
568
+ config_spec = RbVmomi::VIM.VirtualMachineConfigSpec(
569
+ {
570
+ deviceChange: device_change,
571
+ }
572
+ )
573
+
574
+ task = vm.ReconfigVM_Task(spec: config_spec)
575
+ task.wait_for_completion
576
+ end
577
+
466
578
  def clone
467
579
  benchmark_start if benchmark?
468
580
 
@@ -507,47 +619,19 @@ class Support
507
619
  network_device = network_device(src_vm)
508
620
  Kitchen.logger.warn format("Source VM/template does not have any network device (use VMware IPPools and vsphere-gom transport or govc to access)") unless network_device
509
621
 
510
- unless network_device.nil? || options[:network_name].nil?
511
- networks = dc.network.select { |n| n.name == options[:network_name] }
512
- raise Support::CloneError.new(format("Could not find network named %s", options[:network_name])) if networks.empty?
513
-
514
- Kitchen.logger.warn format("Found %d networks named %s, picking first one", networks.count, options[:network_name]) if networks.count > 1
515
- network_obj = networks.first
516
-
517
- if network_obj.is_a? RbVmomi::VIM::DistributedVirtualPortgroup
518
- Kitchen.logger.info format("Assigning network %s...", network_obj.pretty_path)
519
-
520
- vds_obj = network_obj.config.distributedVirtualSwitch
521
- Kitchen.logger.info format("Using vDS '%s' for network connectivity...", vds_obj.name)
522
-
523
- network_device.backing = RbVmomi::VIM.VirtualEthernetCardDistributedVirtualPortBackingInfo(
524
- port: RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
525
- portgroupKey: network_obj.key,
526
- switchUuid: vds_obj.uuid
527
- )
528
- )
529
- elsif network_obj.is_a? RbVmomi::VIM::Network
530
- Kitchen.logger.info format("Assigning network %s...", options[:network_name])
531
-
532
- network_device.backing = RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(
533
- deviceName: options[:network_name]
534
- )
535
- else
536
- raise Support::CloneError.new(format("Unknown network type %s for network name %s", network_obj.class.to_s, options[:network_name]))
622
+ if update_network?(network_device)
623
+ network_spec = []
624
+ networks_to_update.each do |network|
625
+ network_obj = fetch_network(dc, network[:name])
626
+ network_spec << network_change_spec(network_device, network_obj, network[:name])
537
627
  end
538
-
539
- relocate_spec.deviceChange = [
540
- RbVmomi::VIM.VirtualDeviceConfigSpec(
541
- operation: RbVmomi::VIM::VirtualDeviceConfigSpecOperation("edit"),
542
- device: network_device
543
- ),
544
- ]
628
+ relocate_spec.deviceChange = network_spec
545
629
  end
546
630
 
547
631
  # Set the folder to use
548
632
  dest_folder = options[:folder].nil? ? dc.vmFolder : options[:folder][:id]
549
633
 
550
- Kitchen.logger.info format("Cloning '%s' to create the VM...", options[:template])
634
+ Kitchen.logger.info format("Cloning '%s' to create the %s VM...", options[:template], vm_name)
551
635
  if instant_clone?
552
636
  vcenter_data = vim.serviceInstance.content.about
553
637
  raise Support::CloneError.new("Instant clones only supported with vCenter 6.7 or higher") unless vcenter_data.version.to_f >= 6.7
@@ -626,6 +710,11 @@ class Support
626
710
 
627
711
  vm_customization if options[:vm_customization]
628
712
 
713
+ # TODO: Remove this line after the deprecation of `network_name` config
714
+ add_new_network_device(dc, networks_to_update) if attach_new_network?(network_device)
715
+
716
+ add_new_network_device(dc, networks_to_add) if add_network?
717
+
629
718
  # Start only if specified or customizations wanted; no need for instant clones as they start in running state
630
719
  if options[:poweron] && !options[:vm_customization].nil? && !instant_clone?
631
720
  task = vm.PowerOnVM_Task
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-vcenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.8
4
+ version: 2.11.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-28 00:00:00.000000000 Z
11
+ date: 2022-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-ping