kitchen-hyperv 0.5.5 → 0.7.1
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 +4 -4
- data/Gemfile +0 -4
- data/Rakefile +1 -3
- data/kitchen-hyperv.gemspec +7 -5
- data/lib/kitchen/driver/hyperv.rb +66 -8
- data/lib/kitchen/driver/hyperv_version.rb +1 -1
- data/lib/kitchen/driver/powershell.rb +16 -9
- data/support/hyperv.ps1 +5 -5
- metadata +39 -25
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2081b5e1d3d52389d2136e68798b265bdbfef2fe0a3bea713e9eca1f595dfffb
|
|
4
|
+
data.tar.gz: b39c49767592691ef4783c5e4492c865d55712b5c0a6a7e7c0dc501010fac6d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a017678ac18c138fc504b8169a9e662000280fe1a2a0c7dbe092b45c98e4beab978504b831b5f6e3afc4f15b46733ef58bde12a5f23b76cdb06f32cca658c3b4
|
|
7
|
+
data.tar.gz: 0eb92487319eef5e8f35ae3a4ff9826aae8dd463087091fd93f59efdc9365524352f6996e9bcba40c4b55831f91f3a7e59c4d2a90a2fd7af21330eee167ca735
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
require "bundler/gem_tasks"
|
|
4
2
|
require "kitchen/driver/hyperv_version"
|
|
5
3
|
|
|
@@ -27,7 +25,7 @@ desc "Run all quality tasks"
|
|
|
27
25
|
task quality: :style
|
|
28
26
|
|
|
29
27
|
begin
|
|
30
|
-
require "yard"
|
|
28
|
+
require "yard" unless defined?(YARD)
|
|
31
29
|
YARD::Rake::YardocTask.new
|
|
32
30
|
rescue LoadError
|
|
33
31
|
puts "yard is not available. (sudo) gem install yard to generate yard documentation."
|
data/kitchen-hyperv.gemspec
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
3
|
|
|
5
4
|
require "kitchen/driver/hyperv_version"
|
|
@@ -17,11 +16,14 @@ Gem::Specification.new do |spec|
|
|
|
17
16
|
spec.files = %w{LICENSE kitchen-hyperv.gemspec Gemfile Rakefile support/hyperv.ps1} + Dir.glob("lib/**/*")
|
|
18
17
|
spec.require_paths = ["lib"]
|
|
19
18
|
|
|
20
|
-
spec.
|
|
19
|
+
spec.required_ruby_version = ">= 2.6"
|
|
20
|
+
|
|
21
21
|
spec.add_development_dependency "rake"
|
|
22
|
-
spec.add_development_dependency "minitest", "~> 5.3", "< 5.
|
|
22
|
+
spec.add_development_dependency "minitest", "~> 5.3", "< 5.16"
|
|
23
23
|
spec.add_development_dependency "minitest-stub-const"
|
|
24
24
|
spec.add_development_dependency "mocha", "~> 1.1"
|
|
25
25
|
|
|
26
|
-
spec.add_dependency "test-kitchen", ">= 1.4", "<
|
|
26
|
+
spec.add_dependency "test-kitchen", ">= 1.4", "< 4"
|
|
27
|
+
spec.add_dependency "train", "~> 3.5"
|
|
28
|
+
spec.add_dependency "train-winrm", "~> 0.2"
|
|
27
29
|
end
|
|
@@ -20,9 +20,11 @@ require "kitchen"
|
|
|
20
20
|
require "kitchen/driver"
|
|
21
21
|
require_relative "hyperv_version"
|
|
22
22
|
require_relative "powershell"
|
|
23
|
-
require "mixlib/shellout"
|
|
24
|
-
require "fileutils"
|
|
25
|
-
require "json"
|
|
23
|
+
require "mixlib/shellout" unless defined?(Mixlib::ShellOut)
|
|
24
|
+
require "fileutils" unless defined?(FileUtils)
|
|
25
|
+
require "json" unless defined?(JSON)
|
|
26
|
+
require "train" unless defined?(Train)
|
|
27
|
+
require "train-winrm" unless defined?(TrainPlugins::WinRM)
|
|
26
28
|
|
|
27
29
|
module Kitchen
|
|
28
30
|
|
|
@@ -34,8 +36,9 @@ module Kitchen
|
|
|
34
36
|
kitchen_driver_api_version 2
|
|
35
37
|
plugin_version Kitchen::Driver::HYPERV_VERSION
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
required_config :parent_vhd_folder
|
|
40
|
+
required_config :parent_vhd_name
|
|
41
|
+
|
|
39
42
|
default_config :memory_startup_bytes, 536_870_912
|
|
40
43
|
default_config :dynamic_memory_min_bytes, 536_870_912
|
|
41
44
|
default_config :dynamic_memory_max_bytes, 2_147_483_648
|
|
@@ -60,6 +63,13 @@ module Kitchen
|
|
|
60
63
|
File.extname(driver[:parent_vhd_name])
|
|
61
64
|
end
|
|
62
65
|
|
|
66
|
+
default_config :hyperv_server, nil
|
|
67
|
+
default_config :hyperv_username, nil
|
|
68
|
+
default_config :hyperv_password, nil
|
|
69
|
+
default_config :hyperv_ssl, false
|
|
70
|
+
default_config :hyperv_insecure, true
|
|
71
|
+
default_config :remote_vm_path, 'C:\Users\Public\Documents\Hyper-V'
|
|
72
|
+
|
|
63
73
|
include Kitchen::Driver::PowerShellScripts
|
|
64
74
|
|
|
65
75
|
def create(state)
|
|
@@ -94,8 +104,8 @@ module Kitchen
|
|
|
94
104
|
private
|
|
95
105
|
|
|
96
106
|
def validate_vm_settings
|
|
97
|
-
raise "Missing parent_vhd_folder" unless vhd_folder?
|
|
98
|
-
raise "Missing parent_vhd_name" unless vhd?
|
|
107
|
+
raise "Missing parent_vhd_folder" unless vhd_folder? || remote_hyperv
|
|
108
|
+
raise "Missing parent_vhd_name" unless vhd? || remote_hyperv
|
|
99
109
|
|
|
100
110
|
if config[:dynamic_memory]
|
|
101
111
|
startup_bytes = config[:memory_startup_bytes]
|
|
@@ -160,6 +170,8 @@ module Kitchen
|
|
|
160
170
|
|
|
161
171
|
info("Creating virtual machine for #{instance.name}.")
|
|
162
172
|
new_vm_object = run_ps new_vm_ps
|
|
173
|
+
raise "Unable to create virtual machine for #{instance.name}." if new_vm_object.nil?
|
|
174
|
+
|
|
163
175
|
@state[:id] = new_vm_object["Id"]
|
|
164
176
|
info("Created virtual machine for #{instance.name}.")
|
|
165
177
|
end
|
|
@@ -244,6 +256,8 @@ module Kitchen
|
|
|
244
256
|
end
|
|
245
257
|
|
|
246
258
|
def remove_differencing_disk
|
|
259
|
+
return unless differencing_disk_exists
|
|
260
|
+
|
|
247
261
|
info("Removing the differencing disk for #{instance.name}.")
|
|
248
262
|
FileUtils.rm(differencing_disk_path)
|
|
249
263
|
info("Removed the differencing disk for #{instance.name}.")
|
|
@@ -269,12 +283,18 @@ module Kitchen
|
|
|
269
283
|
@kitchen_vm_path ||= File.join(config[:kitchen_root], ".kitchen/#{instance.name}")
|
|
270
284
|
end
|
|
271
285
|
|
|
286
|
+
def remote_kitchen_vm_path
|
|
287
|
+
config[:remote_vm_path]
|
|
288
|
+
end
|
|
289
|
+
|
|
272
290
|
def boot_iso_path
|
|
273
291
|
@boot_iso_path ||= config[:boot_iso_path]
|
|
274
292
|
end
|
|
275
293
|
|
|
276
294
|
def differencing_disk_path
|
|
277
|
-
|
|
295
|
+
kitchen_vm_base = remote_hyperv ? remote_kitchen_vm_path : kitchen_vm_path
|
|
296
|
+
|
|
297
|
+
@differencing_disk_path ||= File.join(kitchen_vm_base, "diff" + "#{config[:disk_type]}")
|
|
278
298
|
end
|
|
279
299
|
|
|
280
300
|
def additional_disk_path(disk_name, disk_type)
|
|
@@ -292,6 +312,44 @@ module Kitchen
|
|
|
292
312
|
def vhd?
|
|
293
313
|
config[:parent_vhd_name] && File.exist?(parent_vhd_path)
|
|
294
314
|
end
|
|
315
|
+
|
|
316
|
+
def remote_hyperv
|
|
317
|
+
!!config[:hyperv_server]
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def connection
|
|
321
|
+
return @connection if @connection
|
|
322
|
+
|
|
323
|
+
backend = remote_hyperv ? "winrm" : "local"
|
|
324
|
+
|
|
325
|
+
train = Train.create(backend, {
|
|
326
|
+
host: config[:hyperv_server],
|
|
327
|
+
user: config[:hyperv_username],
|
|
328
|
+
password: config[:hyperv_password],
|
|
329
|
+
ssl: config[:hyperv_ssl],
|
|
330
|
+
self_signed: config[:hyperv_insecure],
|
|
331
|
+
})
|
|
332
|
+
@connection = train.connection
|
|
333
|
+
|
|
334
|
+
# Copy support PS1
|
|
335
|
+
@connection.upload(local_script_path, remote_script_path)
|
|
336
|
+
|
|
337
|
+
@connection
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def base_script_path
|
|
341
|
+
return remote_script_path if remote_hyperv
|
|
342
|
+
|
|
343
|
+
local_script_path
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def local_script_path
|
|
347
|
+
File.join(File.dirname(__FILE__), "/../../../support/hyperv.ps1")
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def remote_script_path
|
|
351
|
+
File.join(config[:kitchen_root], "kitchen-hyperv", "hyperv.ps1")
|
|
352
|
+
end
|
|
295
353
|
end
|
|
296
354
|
end
|
|
297
355
|
end
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
# See the License for the specific language governing permissions and
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
|
|
18
|
-
require "mixlib/shellout"
|
|
19
|
-
require "
|
|
20
|
-
require "
|
|
18
|
+
require "mixlib/shellout" unless defined?(Mixlib::ShellOut)
|
|
19
|
+
require "benchmark" unless defined?(Benchmark)
|
|
20
|
+
require "fileutils" unless defined?(FileUtils)
|
|
21
|
+
require "json" unless defined?(JSON)
|
|
21
22
|
|
|
22
23
|
module Kitchen
|
|
23
24
|
module Driver
|
|
@@ -28,6 +29,8 @@ module Kitchen
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def is_64bit?
|
|
32
|
+
return true if remote_hyperv
|
|
33
|
+
|
|
31
34
|
os_arch = ENV["PROCESSOR_ARCHITEW6432"] || ENV["PROCESSOR_ARCHITECTURE"]
|
|
32
35
|
ruby_arch = ["foo"].pack("p").size == 4 ? 32 : 64
|
|
33
36
|
os_arch == "AMD64" && ruby_arch == 64
|
|
@@ -48,7 +51,6 @@ module Kitchen
|
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
def wrap_command(script)
|
|
51
|
-
base_script_path = File.join(File.dirname(__FILE__), "/../../../support/hyperv.ps1")
|
|
52
54
|
debug("Loading functions from #{base_script_path}")
|
|
53
55
|
new_script = [ ". #{base_script_path}", "#{script}" ].join(";\n")
|
|
54
56
|
debug("Wrapped script: #{new_script}")
|
|
@@ -71,11 +73,15 @@ module Kitchen
|
|
|
71
73
|
end
|
|
72
74
|
|
|
73
75
|
def execute_command(cmd, options = {})
|
|
74
|
-
debug("#
|
|
75
|
-
|
|
76
|
-
sh
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
debug("#Command BEGIN (#{cmd})")
|
|
77
|
+
|
|
78
|
+
sh = nil
|
|
79
|
+
bm = Benchmark.measure do
|
|
80
|
+
sh = connection.run_command(cmd, options)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
debug("Command END #{Util.duration(bm.total)}")
|
|
84
|
+
raise "Failed: #{sh.stderr}" if sh.exit_status != 0
|
|
79
85
|
|
|
80
86
|
stdout = sanitize_stdout(sh.stdout)
|
|
81
87
|
JSON.parse(stdout) if stdout.length > 2
|
|
@@ -139,6 +145,7 @@ module Kitchen
|
|
|
139
145
|
EOH
|
|
140
146
|
end
|
|
141
147
|
|
|
148
|
+
# TODO: Report if VM has no IP address instead of silently waiting forever
|
|
142
149
|
def vm_details_ps
|
|
143
150
|
<<-DETAILS
|
|
144
151
|
|
data/support/hyperv.ps1
CHANGED
|
@@ -18,8 +18,8 @@ function New-DifferencingDisk {
|
|
|
18
18
|
[parameter(Mandatory)]
|
|
19
19
|
[ValidateNotNullOrEmpty()]
|
|
20
20
|
[string[]]$Path,
|
|
21
|
-
[parameter(Mandatory)]
|
|
22
|
-
[ValidateNotNullOrEmpty()]
|
|
21
|
+
[parameter(Mandatory)]
|
|
22
|
+
[ValidateNotNullOrEmpty()]
|
|
23
23
|
[string]$ParentPath
|
|
24
24
|
)
|
|
25
25
|
if (-not (Test-Path $Path)) {
|
|
@@ -73,9 +73,9 @@ function New-KitchenVM {
|
|
|
73
73
|
$EnableGuestServices,
|
|
74
74
|
$AdditionalDisks
|
|
75
75
|
)
|
|
76
|
-
$null = $psboundparameters.remove('DisableSecureBoot')
|
|
76
|
+
$null = $psboundparameters.remove('DisableSecureBoot')
|
|
77
77
|
$null = $psboundparameters.remove('ProcessorCount')
|
|
78
|
-
$null = $psboundparameters.remove('StaticMacAddress')
|
|
78
|
+
$null = $psboundparameters.remove('StaticMacAddress')
|
|
79
79
|
$null = $psboundparameters.remove('UseDynamicMemory')
|
|
80
80
|
$null = $psboundparameters.remove('DynamicMemoryMinBytes')
|
|
81
81
|
$null = $psboundparameters.remove('DynamicMemoryMaxBytes')
|
|
@@ -99,7 +99,7 @@ function New-KitchenVM {
|
|
|
99
99
|
if (-not [string]::IsNullOrEmpty($boot_iso_path)) {
|
|
100
100
|
Mount-VMISO -Id $vm.Id -Path $boot_iso_path
|
|
101
101
|
}
|
|
102
|
-
if (
|
|
102
|
+
if (-not [string]::IsNullOrEmpty($StaticMacAddress)) {
|
|
103
103
|
Set-VMNetworkAdapter -VMName $vm.VMName -StaticMacAddress $StaticMacAddress
|
|
104
104
|
}
|
|
105
105
|
if ($EnableGuestServices -and (Get-command Enable-VMIntegrationService -ErrorAction SilentlyContinue)) {
|
metadata
CHANGED
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kitchen-hyperv
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Steven Murawski
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-04-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: bundler
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :development
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: rake
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -47,7 +33,7 @@ dependencies:
|
|
|
47
33
|
version: '5.3'
|
|
48
34
|
- - "<"
|
|
49
35
|
- !ruby/object:Gem::Version
|
|
50
|
-
version: '5.
|
|
36
|
+
version: '5.16'
|
|
51
37
|
type: :development
|
|
52
38
|
prerelease: false
|
|
53
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -57,7 +43,7 @@ dependencies:
|
|
|
57
43
|
version: '5.3'
|
|
58
44
|
- - "<"
|
|
59
45
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '5.
|
|
46
|
+
version: '5.16'
|
|
61
47
|
- !ruby/object:Gem::Dependency
|
|
62
48
|
name: minitest-stub-const
|
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -95,7 +81,7 @@ dependencies:
|
|
|
95
81
|
version: '1.4'
|
|
96
82
|
- - "<"
|
|
97
83
|
- !ruby/object:Gem::Version
|
|
98
|
-
version: '
|
|
84
|
+
version: '4'
|
|
99
85
|
type: :runtime
|
|
100
86
|
prerelease: false
|
|
101
87
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -105,7 +91,35 @@ dependencies:
|
|
|
105
91
|
version: '1.4'
|
|
106
92
|
- - "<"
|
|
107
93
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: '
|
|
94
|
+
version: '4'
|
|
95
|
+
- !ruby/object:Gem::Dependency
|
|
96
|
+
name: train
|
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - "~>"
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '3.5'
|
|
102
|
+
type: :runtime
|
|
103
|
+
prerelease: false
|
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - "~>"
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '3.5'
|
|
109
|
+
- !ruby/object:Gem::Dependency
|
|
110
|
+
name: train-winrm
|
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - "~>"
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '0.2'
|
|
116
|
+
type: :runtime
|
|
117
|
+
prerelease: false
|
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - "~>"
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '0.2'
|
|
109
123
|
description: Hyper-V Driver for Test-Kitchen
|
|
110
124
|
email:
|
|
111
125
|
- steven.murawski@gmail.com
|
|
@@ -125,7 +139,7 @@ homepage: https://github.com/test-kitchen/kitchen-hyperv
|
|
|
125
139
|
licenses:
|
|
126
140
|
- Apache-2.0
|
|
127
141
|
metadata: {}
|
|
128
|
-
post_install_message:
|
|
142
|
+
post_install_message:
|
|
129
143
|
rdoc_options: []
|
|
130
144
|
require_paths:
|
|
131
145
|
- lib
|
|
@@ -133,15 +147,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
133
147
|
requirements:
|
|
134
148
|
- - ">="
|
|
135
149
|
- !ruby/object:Gem::Version
|
|
136
|
-
version: '
|
|
150
|
+
version: '2.6'
|
|
137
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
152
|
requirements:
|
|
139
153
|
- - ">="
|
|
140
154
|
- !ruby/object:Gem::Version
|
|
141
155
|
version: '0'
|
|
142
156
|
requirements: []
|
|
143
|
-
rubygems_version: 3.
|
|
144
|
-
signing_key:
|
|
157
|
+
rubygems_version: 3.3.7
|
|
158
|
+
signing_key:
|
|
145
159
|
specification_version: 4
|
|
146
160
|
summary: Hyper-V Driver for Test-Kitchen
|
|
147
161
|
test_files: []
|