vmpooler-provider-vsphere 3.3.4 → 3.4.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
  SHA256:
3
- metadata.gz: 89055d5655c089933c5e57db2fc1208fe6e52c0ab6b7a28001056fabac1d6be0
4
- data.tar.gz: f319d467743e1ff8a570f07d6f019542bdc9b860c515728ffb3935fbcfd7a67c
3
+ metadata.gz: 70ae81e3cc10136212e98b959de197cd6fd9f77aad9a52374e4b0716020c52f8
4
+ data.tar.gz: beca8a851c0df498f726e7441bf3bc9cafc01cc703004832212af3eeadab2e14
5
5
  SHA512:
6
- metadata.gz: 3ab52b86c880df03c88934336d99a6ab0314eb758fe6e623cd88269e61a1214e64db692c60d72adfa4b9b8230caa02aecb025d527127792f8efcde3708a73ea3
7
- data.tar.gz: 50205ce2612b97551072c2fbdc6383e0e49e27f12ae8c6264a80b7b69a5b3a7a8d32d2c53382ce12d0a70bcdaf8dda00adbfc7ea3e5f3524de4e5ccec2d366aa
6
+ metadata.gz: c6844c6c213111ba9c4a5b7f29c4fc5805e0cc9bc5e0da5201c7e4b0a54813d738542ad2ba4704c705e6f471aa20dbeffd9d4faf8d5d111477a22bdd052c8bf3
7
+ data.tar.gz: 2bb2b9d136a389e528eaa0f6af3160d269462a676a0431f78f7e066862c053e83c7cf2a5828dd6605ca3a7add47e113fae1a9b1e0bf84876d2e417bcd45f3f83
@@ -3,6 +3,7 @@
3
3
  require 'bigdecimal'
4
4
  require 'bigdecimal/util'
5
5
  require 'rbvmomi'
6
+ require 'timeout'
6
7
  require 'vmpooler/providers/base'
7
8
 
8
9
  module Vmpooler
@@ -74,7 +75,7 @@ module Vmpooler
74
75
  transaction.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now.to_s)
75
76
 
76
77
  # Auto-expire metadata key
77
- transaction.expire("vmpooler__vm__#{vm_name}", (data_ttl * 60 * 60))
78
+ transaction.expire("vmpooler__vm__#{vm_name}", data_ttl * 60 * 60)
78
79
  end
79
80
  end
80
81
 
@@ -186,14 +187,18 @@ module Vmpooler
186
187
 
187
188
  def vms_in_pool(pool_name)
188
189
  vms = []
189
- @connection_pool.with_metrics do |pool_object|
190
- connection = ensured_vsphere_connection(pool_object)
191
- folder_object = find_vm_folder(pool_name, connection)
190
+ with_circuit_breaker do
191
+ Timeout.timeout(vsphere_connection_timeout) do
192
+ @connection_pool.with_metrics do |pool_object|
193
+ connection = ensured_vsphere_connection(pool_object)
194
+ folder_object = find_vm_folder(pool_name, connection)
192
195
 
193
- return vms if folder_object.nil?
196
+ next if folder_object.nil?
194
197
 
195
- folder_object.childEntity.each do |vm|
196
- vms << { 'name' => vm.name } if vm.is_a? RbVmomi::VIM::VirtualMachine
198
+ folder_object.childEntity.each do |vm|
199
+ vms << { 'name' => vm.name } if vm.is_a? RbVmomi::VIM::VirtualMachine
200
+ end
201
+ end
197
202
  end
198
203
  end
199
204
  vms
@@ -305,12 +310,16 @@ module Vmpooler
305
310
 
306
311
  def get_vm(pool_name, vm_name)
307
312
  vm_hash = nil
308
- @connection_pool.with_metrics do |pool_object|
309
- connection = ensured_vsphere_connection(pool_object)
310
- vm_object = find_vm(pool_name, vm_name, connection)
311
- return vm_hash if vm_object.nil?
312
-
313
- vm_hash = generate_vm_hash(vm_object, pool_name)
313
+ with_circuit_breaker do
314
+ Timeout.timeout(vsphere_connection_timeout) do
315
+ @connection_pool.with_metrics do |pool_object|
316
+ connection = ensured_vsphere_connection(pool_object)
317
+ vm_object = find_vm(pool_name, vm_name, connection)
318
+ next if vm_object.nil?
319
+
320
+ vm_hash = generate_vm_hash(vm_object, pool_name)
321
+ end
322
+ end
314
323
  end
315
324
  vm_hash
316
325
  end
@@ -320,86 +329,94 @@ module Vmpooler
320
329
  raise("Pool #{pool_name} does not exist for the provider #{name}") if pool.nil?
321
330
 
322
331
  vm_hash = nil
323
- @connection_pool.with_metrics do |pool_object|
324
- connection = ensured_vsphere_connection(pool_object)
325
- # Assume all pool config is valid i.e. not missing
326
- template_path = pool['template']
327
- target_folder_path = pool['folder']
328
- target_datastore = pool['datastore']
329
- target_datacenter_name = get_target_datacenter_from_config(pool_name)
330
-
331
- # Get the template VM object
332
- raise("Pool #{pool_name} did not specify a full path for the template for the provider #{name}") unless valid_template_path? template_path
333
-
334
- template_vm_object = find_template_vm(pool, connection)
335
-
336
- extra_config = [
337
- { key: 'guestinfo.hostname', value: new_vmname }
338
- ]
339
-
340
- if pool.key?('snapshot_mainMem_ioBlockPages')
341
- ioblockpages = pool['snapshot_mainMem_ioBlockPages']
342
- extra_config.push(
343
- { key: 'mainMem.ioBlockPages', value: ioblockpages }
344
- )
345
- end
346
- if pool.key?('snapshot_mainMem_iowait')
347
- iowait = pool['snapshot_mainMem_iowait']
348
- extra_config.push(
349
- { key: 'mainMem.iowait', value: iowait }
350
- )
351
- end
332
+ with_circuit_breaker do
333
+ @connection_pool.with_metrics do |pool_object|
334
+ connection = ensured_vsphere_connection(pool_object)
335
+ # Assume all pool config is valid i.e. not missing
336
+ template_path = pool['template']
337
+ target_folder_path = pool['folder']
338
+ target_datastore = pool['datastore']
339
+ target_datacenter_name = get_target_datacenter_from_config(pool_name)
340
+
341
+ # Get the template VM object
342
+ raise("Pool #{pool_name} did not specify a full path for the template for the provider #{name}") unless valid_template_path? template_path
343
+
344
+ template_vm_object = find_template_vm(pool, connection)
345
+
346
+ extra_config = [
347
+ { key: 'guestinfo.hostname', value: new_vmname }
348
+ ]
349
+
350
+ if pool.key?('snapshot_mainMem_ioBlockPages')
351
+ ioblockpages = pool['snapshot_mainMem_ioBlockPages']
352
+ extra_config.push(
353
+ { key: 'mainMem.ioBlockPages', value: ioblockpages }
354
+ )
355
+ end
356
+ if pool.key?('snapshot_mainMem_iowait')
357
+ iowait = pool['snapshot_mainMem_iowait']
358
+ extra_config.push(
359
+ { key: 'mainMem.iowait', value: iowait }
360
+ )
361
+ end
352
362
 
353
- # Annotate with creation time, origin template, etc.
354
- # Add extraconfig options that can be queried by vmtools
355
- config_spec = create_config_spec(new_vmname, template_path, extra_config)
363
+ # Annotate with creation time, origin template, etc.
364
+ # Add extraconfig options that can be queried by vmtools
365
+ config_spec = create_config_spec(new_vmname, template_path, extra_config)
356
366
 
357
- # Check if alternate network configuration is specified and add configuration
358
- if pool.key?('network')
359
- template_vm_network_device = template_vm_object.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard).first
360
- network_name = pool['network']
361
- network_device = set_network_device(target_datacenter_name, template_vm_network_device, network_name, connection)
362
- config_spec.deviceChange = [{ operation: 'edit', device: network_device }]
363
- end
367
+ # Check if alternate network configuration is specified and add configuration
368
+ if pool.key?('network')
369
+ template_vm_network_device = template_vm_object.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard).first
370
+ network_name = pool['network']
371
+ network_device = set_network_device(target_datacenter_name, template_vm_network_device, network_name, connection)
372
+ config_spec.deviceChange = [{ operation: 'edit', device: network_device }]
373
+ end
364
374
 
365
- # Put the VM in the specified folder and resource pool
366
- relocate_spec = create_relocate_spec(target_datastore, target_datacenter_name, pool_name, connection)
375
+ # Put the VM in the specified folder and resource pool
376
+ relocate_spec = create_relocate_spec(target_datastore, target_datacenter_name, pool_name, connection)
367
377
 
368
- # Create a clone spec
369
- clone_spec = create_clone_spec(relocate_spec, config_spec)
378
+ # Create a clone spec
379
+ clone_spec = create_clone_spec(relocate_spec, config_spec)
370
380
 
371
- begin
372
- vm_target_folder = find_vm_folder(pool_name, connection)
373
- vm_target_folder ||= create_folder(connection, target_folder_path, target_datacenter_name) if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
374
- rescue StandardError
375
- if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
376
- vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name)
377
- else
378
- raise
381
+ begin
382
+ vm_target_folder = find_vm_folder(pool_name, connection)
383
+ vm_target_folder ||= create_folder(connection, target_folder_path, target_datacenter_name) if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
384
+ rescue StandardError
385
+ if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
386
+ vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name)
387
+ else
388
+ raise
389
+ end
379
390
  end
380
- end
381
- raise ArgumentError, "Cannot find the configured folder for #{pool_name} #{target_folder_path}" unless vm_target_folder
391
+ raise ArgumentError, "Cannot find the configured folder for #{pool_name} #{target_folder_path}" unless vm_target_folder
382
392
 
383
- # Create the new VM
384
- new_vm_object = template_vm_object.CloneVM_Task(
385
- folder: vm_target_folder,
386
- name: new_vmname,
387
- spec: clone_spec
388
- ).wait_for_completion
393
+ # Create the new VM
394
+ new_vm_object = template_vm_object.CloneVM_Task(
395
+ folder: vm_target_folder,
396
+ name: new_vmname,
397
+ spec: clone_spec
398
+ ).wait_for_completion
389
399
 
390
- vm_hash = generate_vm_hash(new_vm_object, pool_name)
400
+ vm_hash = generate_vm_hash(new_vm_object, pool_name)
401
+ end
391
402
  end
392
403
  vm_hash
393
404
  end
394
405
 
395
406
  # The inner method requires vmware tools running in the guest os
396
407
  def get_vm_ip_address(vm_name, pool_name)
397
- @connection_pool.with_metrics do |pool_object|
398
- connection = ensured_vsphere_connection(pool_object)
399
- vm_object = find_vm(pool_name, vm_name, connection)
400
- vm_hash = generate_vm_hash(vm_object, pool_name)
401
- return vm_hash['ip']
408
+ ip = nil
409
+ with_circuit_breaker do
410
+ Timeout.timeout(vsphere_connection_timeout) do
411
+ @connection_pool.with_metrics do |pool_object|
412
+ connection = ensured_vsphere_connection(pool_object)
413
+ vm_object = find_vm(pool_name, vm_name, connection)
414
+ vm_hash = generate_vm_hash(vm_object, pool_name)
415
+ ip = vm_hash['ip']
416
+ end
417
+ end
402
418
  end
419
+ ip
403
420
  end
404
421
 
405
422
  def create_config_spec(vm_name, template_name, extra_config)
@@ -540,17 +557,19 @@ module Vmpooler
540
557
  end
541
558
 
542
559
  def destroy_vm(pool_name, vm_name)
543
- @connection_pool.with_metrics do |pool_object|
544
- connection = ensured_vsphere_connection(pool_object)
545
- vm_object = find_vm(pool_name, vm_name, connection)
546
- # If a VM doesn't exist then it is effectively deleted
547
- return true if vm_object.nil?
560
+ with_circuit_breaker do
561
+ @connection_pool.with_metrics do |pool_object|
562
+ connection = ensured_vsphere_connection(pool_object)
563
+ vm_object = find_vm(pool_name, vm_name, connection)
564
+ # If a VM doesn't exist then it is effectively deleted
565
+ next if vm_object.nil?
548
566
 
549
- # Poweroff the VM if it's running
550
- vm_object.PowerOffVM_Task.wait_for_completion if vm_object.runtime&.powerState && vm_object.runtime.powerState == 'poweredOn'
567
+ # Poweroff the VM if it's running
568
+ vm_object.PowerOffVM_Task.wait_for_completion if vm_object.runtime&.powerState && vm_object.runtime.powerState == 'poweredOn'
551
569
 
552
- # Kill it with fire
553
- vm_object.Destroy_Task.wait_for_completion
570
+ # Kill it with fire
571
+ vm_object.Destroy_Task.wait_for_completion
572
+ end
554
573
  end
555
574
  true
556
575
  end
@@ -595,7 +614,7 @@ module Vmpooler
595
614
  pool_configuration = pool_config(pool_name)
596
615
  return nil if pool_configuration.nil?
597
616
 
598
- hostname = vm_object.summary.guest.hostName if vm_object.summary&.guest && vm_object.summary.guest.hostName
617
+ hostname = vm_object.summary.guest.hostName if vm_object.summary&.guest&.hostName
599
618
  boottime = vm_object.runtime.bootTime if vm_object.runtime&.bootTime
600
619
  powerstate = vm_object.runtime.powerState if vm_object.runtime&.powerState
601
620
 
@@ -631,6 +650,14 @@ module Vmpooler
631
650
  DISK_TYPE = 'thin'
632
651
  DISK_MODE = 'persistent'
633
652
 
653
+ def with_circuit_breaker(&block)
654
+ if circuit_breaker
655
+ circuit_breaker.call(&block)
656
+ else
657
+ yield
658
+ end
659
+ end
660
+
634
661
  def ensured_vsphere_connection(connection_pool_object)
635
662
  connection_pool_object[:connection] = connect_to_vsphere unless vsphere_connection_ok?(connection_pool_object[:connection])
636
663
  connection_pool_object[:connection]
@@ -651,7 +678,9 @@ module Vmpooler
651
678
  connection = RbVmomi::VIM.connect host: provider_config['server'],
652
679
  user: provider_config['username'],
653
680
  password: provider_config['password'],
654
- insecure: provider_config['insecure'] || false
681
+ insecure: provider_config['insecure'] || false,
682
+ read_timeout: vsphere_connection_timeout,
683
+ open_timeout: vsphere_connection_timeout
655
684
  metrics.increment('connect.open')
656
685
  connection
657
686
  rescue StandardError => e
@@ -664,6 +693,12 @@ module Vmpooler
664
693
  end
665
694
  end
666
695
 
696
+ def vsphere_connection_timeout
697
+ timeout = provider_config['vsphere_timeout'] ||
698
+ global_config&.dig(:config, 'vsphere_timeout') || 60
699
+ timeout.to_i
700
+ end
701
+
667
702
  # This should supercede the open_socket method in the Pool Manager
668
703
  def open_socket(host, domain = nil, timeout = 5, port = 22, &_block)
669
704
  target_host = host
@@ -697,7 +732,7 @@ module Vmpooler
697
732
 
698
733
  # Reverse the array back to normal and
699
734
  # then convert the array of paths into a '/' seperated string
700
- (full_path.reverse.map { |p| p[1] }).join('/')
735
+ full_path.reverse.map { |p| p[1] }.join('/')
701
736
  end
702
737
 
703
738
  def add_disk(vm, size, datastore, connection, datacentername)
@@ -1078,7 +1113,7 @@ module Vmpooler
1078
1113
  vm_object = find_vm(pool_name, vm_name, connection)
1079
1114
  return nil if vm_object.nil?
1080
1115
 
1081
- parent_host_object = vm_object.summary.runtime.host if vm_object.summary&.runtime && vm_object.summary.runtime.host
1116
+ parent_host_object = vm_object.summary.runtime.host if vm_object.summary&.runtime&.host
1082
1117
  raise('Unable to determine which host the VM is running on') if parent_host_object.nil?
1083
1118
 
1084
1119
  parent_host = parent_host_object.name
@@ -1103,6 +1138,9 @@ module Vmpooler
1103
1138
  begin
1104
1139
  connection = ensured_vsphere_connection(pool_object)
1105
1140
  vm_hash = get_vm_details(pool_name, vm_name, connection)
1141
+
1142
+ raise StandardError, 'failed to get vm details. vm is unreachable or no longer exists' if vm_hash.nil?
1143
+
1106
1144
  @redis.with_metrics do |redis|
1107
1145
  redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
1108
1146
  migration_count = redis.scard('vmpooler__migration')
@@ -1220,7 +1258,8 @@ module Vmpooler
1220
1258
  def linked_clone?(pool)
1221
1259
  return if pool['create_linked_clone'] == false
1222
1260
  return true if pool['create_linked_clone']
1223
- return true if @config[:config]['create_linked_clones']
1261
+
1262
+ true if @config[:config]['create_linked_clones']
1224
1263
  end
1225
1264
  end
1226
1265
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VmpoolerProviderVsphere
4
- VERSION = '3.3.4'
4
+ VERSION = '3.4.0'
5
5
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler-provider-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.4
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-08-30 00:00:00.000000000 Z
10
+ date: 2026-03-17 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
13
+ name: rbvmomi2
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -19,9 +19,8 @@ dependencies:
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: '4.0'
22
- name: rbvmomi2
23
- prerelease: false
24
22
  type: :runtime
23
+ prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ">="
@@ -31,118 +30,119 @@ dependencies:
31
30
  - !ruby/object:Gem::Version
32
31
  version: '4.0'
33
32
  - !ruby/object:Gem::Dependency
33
+ name: vmpooler
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
38
  version: '3.0'
39
- name: vmpooler
40
- prerelease: false
41
39
  type: :runtime
40
+ prerelease: false
42
41
  version_requirements: !ruby/object:Gem::Requirement
43
42
  requirements:
44
43
  - - "~>"
45
44
  - !ruby/object:Gem::Version
46
45
  version: '3.0'
47
46
  - !ruby/object:Gem::Dependency
47
+ name: climate_control
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
52
  version: 0.2.0
53
- name: climate_control
54
- prerelease: false
55
53
  type: :development
54
+ prerelease: false
56
55
  version_requirements: !ruby/object:Gem::Requirement
57
56
  requirements:
58
57
  - - ">="
59
58
  - !ruby/object:Gem::Version
60
59
  version: 0.2.0
61
60
  - !ruby/object:Gem::Dependency
61
+ name: mock_redis
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: 0.17.0
67
- name: mock_redis
68
- prerelease: false
69
67
  type: :development
68
+ prerelease: false
70
69
  version_requirements: !ruby/object:Gem::Requirement
71
70
  requirements:
72
71
  - - ">="
73
72
  - !ruby/object:Gem::Version
74
73
  version: 0.17.0
75
74
  - !ruby/object:Gem::Dependency
75
+ name: pry
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: '0'
81
- name: pry
82
- prerelease: false
83
81
  type: :development
82
+ prerelease: false
84
83
  version_requirements: !ruby/object:Gem::Requirement
85
84
  requirements:
86
85
  - - ">="
87
86
  - !ruby/object:Gem::Version
88
87
  version: '0'
89
88
  - !ruby/object:Gem::Dependency
89
+ name: rack-test
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0.6'
95
- name: rack-test
96
- prerelease: false
97
95
  type: :development
96
+ prerelease: false
98
97
  version_requirements: !ruby/object:Gem::Requirement
99
98
  requirements:
100
99
  - - ">="
101
100
  - !ruby/object:Gem::Version
102
101
  version: '0.6'
103
102
  - !ruby/object:Gem::Dependency
103
+ name: rspec
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: '3.2'
109
- name: rspec
110
- prerelease: false
111
109
  type: :development
110
+ prerelease: false
112
111
  version_requirements: !ruby/object:Gem::Requirement
113
112
  requirements:
114
113
  - - ">="
115
114
  - !ruby/object:Gem::Version
116
115
  version: '3.2'
117
116
  - !ruby/object:Gem::Dependency
117
+ name: rubocop
118
118
  requirement: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
122
  version: 1.28.2
123
- name: rubocop
124
- prerelease: false
125
123
  type: :development
124
+ prerelease: false
126
125
  version_requirements: !ruby/object:Gem::Requirement
127
126
  requirements:
128
127
  - - "~>"
129
128
  - !ruby/object:Gem::Version
130
129
  version: 1.28.2
131
130
  - !ruby/object:Gem::Dependency
131
+ name: simplecov
132
132
  requirement: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - ">="
135
135
  - !ruby/object:Gem::Version
136
136
  version: 0.11.2
137
- name: simplecov
138
- prerelease: false
139
137
  type: :development
138
+ prerelease: false
140
139
  version_requirements: !ruby/object:Gem::Requirement
141
140
  requirements:
142
141
  - - ">="
143
142
  - !ruby/object:Gem::Version
144
143
  version: 0.11.2
145
144
  - !ruby/object:Gem::Dependency
145
+ name: thor
146
146
  requirement: !ruby/object:Gem::Requirement
147
147
  requirements:
148
148
  - - "~>"
@@ -151,9 +151,8 @@ dependencies:
151
151
  - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: 1.0.1
154
- name: thor
155
- prerelease: false
156
154
  type: :development
155
+ prerelease: false
157
156
  version_requirements: !ruby/object:Gem::Requirement
158
157
  requirements:
159
158
  - - "~>"
@@ -163,20 +162,19 @@ dependencies:
163
162
  - !ruby/object:Gem::Version
164
163
  version: 1.0.1
165
164
  - !ruby/object:Gem::Dependency
165
+ name: yarjuf
166
166
  requirement: !ruby/object:Gem::Requirement
167
167
  requirements:
168
168
  - - ">="
169
169
  - !ruby/object:Gem::Version
170
170
  version: '2.0'
171
- name: yarjuf
172
- prerelease: false
173
171
  type: :development
172
+ prerelease: false
174
173
  version_requirements: !ruby/object:Gem::Requirement
175
174
  requirements:
176
175
  - - ">="
177
176
  - !ruby/object:Gem::Version
178
177
  version: '2.0'
179
- description:
180
178
  email:
181
179
  - support@puppet.com
182
180
  executables: []
@@ -189,7 +187,6 @@ homepage: https://github.com/puppetlabs/vmpooler-provider-vsphere
189
187
  licenses:
190
188
  - Apache-2.0
191
189
  metadata: {}
192
- post_install_message:
193
190
  rdoc_options: []
194
191
  require_paths:
195
192
  - lib
@@ -204,8 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
201
  - !ruby/object:Gem::Version
205
202
  version: '0'
206
203
  requirements: []
207
- rubygems_version: 3.3.26
208
- signing_key:
204
+ rubygems_version: 3.6.3
209
205
  specification_version: 4
210
206
  summary: VMware provider for VMPooler
211
207
  test_files: []