kitchen-hyperv 0.5.0 → 0.5.1

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: f38aa0c96d1a11f6550fca5b6d5495208eda6ddd
4
- data.tar.gz: 90d19dc17e48f18e170355f17b9db13055add317
3
+ metadata.gz: 8d3ff9e9f8b99293939c7c141455c2ec41abd93d
4
+ data.tar.gz: 0c2f6720c12e51087617bc30f26118ed8d5a94b7
5
5
  SHA512:
6
- metadata.gz: b9338c50b2927f9604bdacbdf2567d9924c8988e05af5f72548b8747b9c10b8b77304aa13a3a94b2a934acf52cb0171972a809b6f98588eaf8701b2a12fbf406
7
- data.tar.gz: 1b2169fa0f88fea07cd9e8ace57de159a2e31f15585cfc49024eabe5966ddcf27625b275789cc2f42b9ea366642ceb4ee912332e99c62c10e1c08fb561d55407
6
+ metadata.gz: d0c19962957e55d526736b5e8dc9ee0a94939c7e46192077ff13b29717294d68ded617672260025a8b8f3470737c798bca125560f53bbe77d262d0891897d566
7
+ data.tar.gz: 6d95718a8bd947220c7d6a12c82539ec03befc7509d8281e0e152b49c996cecd3b90bc7ceffdf6f4e38c5749798d0e9c4cde16c4c0af760e6cdad2b84f85ded9
@@ -1,10 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.5.1](https://github.com/test-kitchen/kitchen-hyperv/tree/v0.5.1) (2017-09-08)
4
+ [Full Changelog](https://github.com/test-kitchen/kitchen-hyperv/compare/v0.5.0...v0.5.1)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Change resize\_vhd parameter to -SizeBytes [\#58](https://github.com/test-kitchen/kitchen-hyperv/pull/58) ([jdoores](https://github.com/jdoores))
9
+
3
10
  ## [v0.5.0](https://github.com/test-kitchen/kitchen-hyperv/tree/v0.5.0) (2017-07-05)
4
11
  [Full Changelog](https://github.com/test-kitchen/kitchen-hyperv/compare/v0.4.1...v0.5.0)
5
12
 
6
13
  **Merged pull requests:**
7
14
 
15
+ - version bump and changelog for v0.5.0 [\#55](https://github.com/test-kitchen/kitchen-hyperv/pull/55) ([smurawski](https://github.com/smurawski))
8
16
  - Fixed issue with existing stale diff disk [\#53](https://github.com/test-kitchen/kitchen-hyperv/pull/53) ([jdoores](https://github.com/jdoores))
9
17
  - Added static\_mac\_address feature [\#52](https://github.com/test-kitchen/kitchen-hyperv/pull/52) ([jdoores](https://github.com/jdoores))
10
18
 
data/Rakefile CHANGED
@@ -13,13 +13,6 @@ end
13
13
  desc "Run all test suites"
14
14
  task :test => [:unit]
15
15
 
16
- desc "Display LOC stats"
17
- task :stats do
18
- puts "\n## Production Code Stats"
19
- sh "countloc -r lib"
20
- puts "\n## Test Code Stats"
21
- sh "countloc -r spec"
22
- end
23
16
 
24
17
  task :default => [:test]
25
18
 
@@ -17,6 +17,6 @@
17
17
 
18
18
  module Kitchen
19
19
  module Driver
20
- HYPERV_VERSION = '0.5.0'.freeze
20
+ HYPERV_VERSION = '0.5.1'.freeze
21
21
  end
22
22
  end
@@ -1,236 +1,236 @@
1
- #
2
- # Author:: Steven Murawski <smurawski@chef.io>
3
- # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'mixlib/shellout'
19
- require 'fileutils'
20
- require 'JSON'
21
-
22
- module Kitchen
23
- module Driver
24
- module PowerShellScripts
25
- def encode_command(script)
26
- encoded_script = script.encode('UTF-16LE', 'UTF-8')
27
- Base64.strict_encode64(encoded_script)
28
- end
29
-
30
- def is_64bit?
31
- os_arch = ENV['PROCESSOR_ARCHITEW6432'] || ENV['PROCESSOR_ARCHITECTURE']
32
- ruby_arch = ['foo'].pack('p').size == 4 ? 32 : 64
33
- os_arch == 'AMD64' && ruby_arch == 64
34
- end
35
-
36
- def is_32bit?
37
- os_arch = ENV['PROCESSOR_ARCHITEW6432'] || ENV['PROCESSOR_ARCHITECTURE']
38
- ruby_arch = ['foo'].pack('p').size == 4 ? 32 : 64
39
- os_arch != 'AMD64' && ruby_arch == 32
40
- end
41
-
42
- def powershell_64_bit
43
- if is_64bit? || is_32bit?
44
- 'c:\windows\system32\windowspowershell\v1.0\powershell.exe'
45
- else
46
- 'c:\windows\sysnative\windowspowershell\v1.0\powershell.exe'
47
- end
48
- end
49
-
50
- def wrap_command(script)
51
- base_script_path = File.join(File.dirname(__FILE__), '/../../../support/hyperv.ps1')
52
- debug("Loading functions from #{base_script_path}")
53
- new_script = [ ". #{base_script_path}", "#{script}" ].join(";\n")
54
- debug("Wrapped script: #{new_script}")
55
- "#{powershell_64_bit} -noprofile -executionpolicy bypass" \
56
- " -encodedcommand #{encode_command new_script} -outputformat Text"
57
- end
58
-
59
- # Convenience method to run a powershell command locally.
60
- #
61
- # @param cmd [String] command to run locally
62
- # @param options [Hash] options hash
63
- # @see Kitchen::ShellOut.run_command
64
- # @api private
65
- def run_ps(cmd, options = {})
66
- cmd = "echo #{cmd}" if config[:dry_run]
67
- debug('Preparing to run: ')
68
- debug(" #{cmd}")
69
- wrapped_command = wrap_command cmd
70
- execute_command wrapped_command, options
71
- end
72
-
73
- def execute_command(cmd, options = {})
74
- debug("#Local Command BEGIN (#{cmd})")
75
- sh = Mixlib::ShellOut.new(cmd, options)
76
- sh.run_command
77
- debug("Local Command END #{Util.duration(sh.execution_time)}")
78
- raise "Failed: #{sh.stderr}" if sh.error?
79
- stdout = sanitize_stdout(sh.stdout)
80
- JSON.parse(stdout) if stdout.length > 2
81
- end
82
-
83
- def sanitize_stdout(stdout)
84
- stdout.split("\n").select { |s| !s.start_with?("PS") }.join("\n")
85
- end
86
-
87
- def new_differencing_disk_ps
88
- <<-DIFF
89
-
90
- New-DifferencingDisk -Path "#{differencing_disk_path}" -ParentPath "#{parent_vhd_path}"
91
- DIFF
92
- end
93
-
94
- def new_additional_disk_ps(disk_path, disk_size)
95
- <<-ADDDISK
96
-
97
- New-VHD -Path "#{disk_path}" -SizeBytes #{disk_size}GB | Out-Null
98
- ADDDISK
99
- end
100
-
101
- def ensure_vm_running_ps
102
- <<-RUNNING
103
-
104
- Assert-VmRunning -ID "#{@state[:id]}" | ConvertTo-Json
105
- RUNNING
106
- end
107
-
108
- def new_vm_ps
109
- <<-NEWVM
110
-
111
- $NewVMParams = @{
112
- Generation = #{config[:vm_generation]}
113
- DisableSecureBoot = "#{config[:disable_secureboot]}"
114
- MemoryStartupBytes = #{config[:memory_startup_bytes]}
115
- StaticMacAddress = "#{config[:static_mac_address]}"
116
- Name = "#{instance.name}"
117
- Path = "#{kitchen_vm_path}"
118
- VHDPath = "#{differencing_disk_path}"
119
- SwitchName = "#{config[:vm_switch]}"
120
- VlanId = #{config[:vm_vlan_id] || '$null'}
121
- ProcessorCount = #{config[:processor_count]}
122
- UseDynamicMemory = "#{config[:dynamic_memory]}"
123
- DynamicMemoryMinBytes = #{config[:dynamic_memory_min_bytes]}
124
- DynamicMemoryMaxBytes = #{config[:dynamic_memory_max_bytes]}
125
- boot_iso_path = "#{boot_iso_path}"
126
- EnableGuestServices = "#{config[:enable_guest_services]}"
127
- #{additional_disks}
128
- }
129
- New-KitchenVM @NewVMParams | ConvertTo-Json
130
- NEWVM
131
- end
132
-
133
- def additional_disks
134
- return if config[:additional_disks].nil?
135
- <<-EOH
136
- AdditionalDisks = @("#{@additional_disk_objects.join('","')}")
137
- EOH
138
- end
139
-
140
- def vm_details_ps
141
- <<-DETAILS
142
-
143
- Get-VmDetail -id "#{@state[:id]}" | ConvertTo-Json
144
- DETAILS
145
- end
146
-
147
- def delete_vm_ps
148
- <<-REMOVE
149
-
150
- $null = Get-VM -ID "#{@state[:id]}" |
151
- Stop-VM -Force -TurnOff -PassThru |
152
- Remove-VM -Force
153
- REMOVE
154
- end
155
-
156
- def set_vm_ipaddress_ps
157
- <<-VMIP
158
-
159
- (Get-VM -id "#{@state[:id]}").NetworkAdapters |
160
- Set-VMNetworkConfiguration -ipaddress "#{config[:ip_address]}" `
161
- -subnet "#{config[:subnet]}" `
162
- -gateway "#{config[:gateway]}" `
163
- -dnsservers #{ruby_array_to_ps_array(config[:dns_servers])} |
164
- ConvertTo-Json
165
- VMIP
166
- end
167
-
168
- def vm_default_switch_ps
169
- <<-VMSWITCH
170
- Get-DefaultVMSwitch #{config[:vm_switch]} | ConvertTo-Json
171
- VMSWITCH
172
- end
173
-
174
- def mount_vm_iso
175
- <<-MOUNTISO
176
- mount-vmiso -id "#{@state[:id]}" -Path #{config[:iso_path]}
177
- MOUNTISO
178
- end
179
-
180
- def resize_vhd
181
- <<-VMNOTE
182
- Resize-VHD -Path "#{parent_vhd_path}" -Size #{config[:resize_vhd]}
183
- VMNOTE
184
- end
185
-
186
- def set_vm_note
187
- <<-VMNOTE
188
- Set-VM -Name (Get-VM | Where-Object{ $_.ID -eq "#{@state[:id]}"}).Name -Note "#{config[:vm_note]}"
189
- VMNOTE
190
- end
191
-
192
- def copy_vm_file_ps(source, dest)
193
- <<-FILECOPY
194
- Function CopyFile ($VM, [string]$SourcePath, [string]$DestPath) {
195
- $p = @{ CreateFullPath = $true ; FileSource = 'Host'; Force = $true }
196
- $VM |
197
- Copy-VMFile -SourcePath $SourcePath -DestinationPath $DestPath @p
198
- }
199
-
200
- $sourceLocation = '#{source}'
201
- $destinationLocation = '#{dest}'
202
- $vmId = '#{@state[:id]}'
203
- If (Test-Path $sourceLocation) {
204
- $vm = Get-VM -ID $vmId
205
- $service = 'Guest Service Interface'
206
-
207
- If ((Get-VMIntegrationService -Name $service -VM $vm).Enabled -ne $true) {
208
- Enable-VMIntegrationService -Name $service -VM $vm
209
- Start-Sleep -Seconds 3
210
- }
211
-
212
- If ((Get-Item $sourceLocation) -is [System.IO.DirectoryInfo]) {
213
- ForEach ($item in (Get-ChildItem -Path $sourceLocation -File)) {
214
- $destFullPath = (Join-Path $destinationLocation $item.Name)
215
- CopyFile $vm $item.FullName $destFullPath
216
- }
217
- }
218
- Else {
219
- CopyFile $vm $sourceLocation $destinationLocation
220
- }
221
- }
222
- else {
223
- Write-Error "Source file path does not exist: $sourceLocation"
224
- }
225
- FILECOPY
226
- end
227
-
228
- private
229
-
230
- def ruby_array_to_ps_array(list)
231
- return "@()" if list.nil? || list.empty?
232
- list.to_s.tr('[]','()').prepend('@')
233
- end
234
- end
235
- end
236
- end
1
+ #
2
+ # Author:: Steven Murawski <smurawski@chef.io>
3
+ # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'mixlib/shellout'
19
+ require 'fileutils'
20
+ require 'JSON'
21
+
22
+ module Kitchen
23
+ module Driver
24
+ module PowerShellScripts
25
+ def encode_command(script)
26
+ encoded_script = script.encode('UTF-16LE', 'UTF-8')
27
+ Base64.strict_encode64(encoded_script)
28
+ end
29
+
30
+ def is_64bit?
31
+ os_arch = ENV['PROCESSOR_ARCHITEW6432'] || ENV['PROCESSOR_ARCHITECTURE']
32
+ ruby_arch = ['foo'].pack('p').size == 4 ? 32 : 64
33
+ os_arch == 'AMD64' && ruby_arch == 64
34
+ end
35
+
36
+ def is_32bit?
37
+ os_arch = ENV['PROCESSOR_ARCHITEW6432'] || ENV['PROCESSOR_ARCHITECTURE']
38
+ ruby_arch = ['foo'].pack('p').size == 4 ? 32 : 64
39
+ os_arch != 'AMD64' && ruby_arch == 32
40
+ end
41
+
42
+ def powershell_64_bit
43
+ if is_64bit? || is_32bit?
44
+ 'c:\windows\system32\windowspowershell\v1.0\powershell.exe'
45
+ else
46
+ 'c:\windows\sysnative\windowspowershell\v1.0\powershell.exe'
47
+ end
48
+ end
49
+
50
+ def wrap_command(script)
51
+ base_script_path = File.join(File.dirname(__FILE__), '/../../../support/hyperv.ps1')
52
+ debug("Loading functions from #{base_script_path}")
53
+ new_script = [ ". #{base_script_path}", "#{script}" ].join(";\n")
54
+ debug("Wrapped script: #{new_script}")
55
+ "#{powershell_64_bit} -noprofile -executionpolicy bypass" \
56
+ " -encodedcommand #{encode_command new_script} -outputformat Text"
57
+ end
58
+
59
+ # Convenience method to run a powershell command locally.
60
+ #
61
+ # @param cmd [String] command to run locally
62
+ # @param options [Hash] options hash
63
+ # @see Kitchen::ShellOut.run_command
64
+ # @api private
65
+ def run_ps(cmd, options = {})
66
+ cmd = "echo #{cmd}" if config[:dry_run]
67
+ debug('Preparing to run: ')
68
+ debug(" #{cmd}")
69
+ wrapped_command = wrap_command cmd
70
+ execute_command wrapped_command, options
71
+ end
72
+
73
+ def execute_command(cmd, options = {})
74
+ debug("#Local Command BEGIN (#{cmd})")
75
+ sh = Mixlib::ShellOut.new(cmd, options)
76
+ sh.run_command
77
+ debug("Local Command END #{Util.duration(sh.execution_time)}")
78
+ raise "Failed: #{sh.stderr}" if sh.error?
79
+ stdout = sanitize_stdout(sh.stdout)
80
+ JSON.parse(stdout) if stdout.length > 2
81
+ end
82
+
83
+ def sanitize_stdout(stdout)
84
+ stdout.split("\n").select { |s| !s.start_with?("PS") }.join("\n")
85
+ end
86
+
87
+ def new_differencing_disk_ps
88
+ <<-DIFF
89
+
90
+ New-DifferencingDisk -Path "#{differencing_disk_path}" -ParentPath "#{parent_vhd_path}"
91
+ DIFF
92
+ end
93
+
94
+ def new_additional_disk_ps(disk_path, disk_size)
95
+ <<-ADDDISK
96
+
97
+ New-VHD -Path "#{disk_path}" -SizeBytes #{disk_size}GB | Out-Null
98
+ ADDDISK
99
+ end
100
+
101
+ def ensure_vm_running_ps
102
+ <<-RUNNING
103
+
104
+ Assert-VmRunning -ID "#{@state[:id]}" | ConvertTo-Json
105
+ RUNNING
106
+ end
107
+
108
+ def new_vm_ps
109
+ <<-NEWVM
110
+
111
+ $NewVMParams = @{
112
+ Generation = #{config[:vm_generation]}
113
+ DisableSecureBoot = "#{config[:disable_secureboot]}"
114
+ MemoryStartupBytes = #{config[:memory_startup_bytes]}
115
+ StaticMacAddress = "#{config[:static_mac_address]}"
116
+ Name = "#{instance.name}"
117
+ Path = "#{kitchen_vm_path}"
118
+ VHDPath = "#{differencing_disk_path}"
119
+ SwitchName = "#{config[:vm_switch]}"
120
+ VlanId = #{config[:vm_vlan_id] || '$null'}
121
+ ProcessorCount = #{config[:processor_count]}
122
+ UseDynamicMemory = "#{config[:dynamic_memory]}"
123
+ DynamicMemoryMinBytes = #{config[:dynamic_memory_min_bytes]}
124
+ DynamicMemoryMaxBytes = #{config[:dynamic_memory_max_bytes]}
125
+ boot_iso_path = "#{boot_iso_path}"
126
+ EnableGuestServices = "#{config[:enable_guest_services]}"
127
+ #{additional_disks}
128
+ }
129
+ New-KitchenVM @NewVMParams | ConvertTo-Json
130
+ NEWVM
131
+ end
132
+
133
+ def additional_disks
134
+ return if config[:additional_disks].nil?
135
+ <<-EOH
136
+ AdditionalDisks = @("#{@additional_disk_objects.join('","')}")
137
+ EOH
138
+ end
139
+
140
+ def vm_details_ps
141
+ <<-DETAILS
142
+
143
+ Get-VmDetail -id "#{@state[:id]}" | ConvertTo-Json
144
+ DETAILS
145
+ end
146
+
147
+ def delete_vm_ps
148
+ <<-REMOVE
149
+
150
+ $null = Get-VM -ID "#{@state[:id]}" |
151
+ Stop-VM -Force -TurnOff -PassThru |
152
+ Remove-VM -Force
153
+ REMOVE
154
+ end
155
+
156
+ def set_vm_ipaddress_ps
157
+ <<-VMIP
158
+
159
+ (Get-VM -id "#{@state[:id]}").NetworkAdapters |
160
+ Set-VMNetworkConfiguration -ipaddress "#{config[:ip_address]}" `
161
+ -subnet "#{config[:subnet]}" `
162
+ -gateway "#{config[:gateway]}" `
163
+ -dnsservers #{ruby_array_to_ps_array(config[:dns_servers])} |
164
+ ConvertTo-Json
165
+ VMIP
166
+ end
167
+
168
+ def vm_default_switch_ps
169
+ <<-VMSWITCH
170
+ Get-DefaultVMSwitch #{config[:vm_switch]} | ConvertTo-Json
171
+ VMSWITCH
172
+ end
173
+
174
+ def mount_vm_iso
175
+ <<-MOUNTISO
176
+ mount-vmiso -id "#{@state[:id]}" -Path #{config[:iso_path]}
177
+ MOUNTISO
178
+ end
179
+
180
+ def resize_vhd
181
+ <<-VMNOTE
182
+ Resize-VHD -Path "#{parent_vhd_path}" -SizeBytes #{config[:resize_vhd]}
183
+ VMNOTE
184
+ end
185
+
186
+ def set_vm_note
187
+ <<-VMNOTE
188
+ Set-VM -Name (Get-VM | Where-Object{ $_.ID -eq "#{@state[:id]}"}).Name -Note "#{config[:vm_note]}"
189
+ VMNOTE
190
+ end
191
+
192
+ def copy_vm_file_ps(source, dest)
193
+ <<-FILECOPY
194
+ Function CopyFile ($VM, [string]$SourcePath, [string]$DestPath) {
195
+ $p = @{ CreateFullPath = $true ; FileSource = 'Host'; Force = $true }
196
+ $VM |
197
+ Copy-VMFile -SourcePath $SourcePath -DestinationPath $DestPath @p
198
+ }
199
+
200
+ $sourceLocation = '#{source}'
201
+ $destinationLocation = '#{dest}'
202
+ $vmId = '#{@state[:id]}'
203
+ If (Test-Path $sourceLocation) {
204
+ $vm = Get-VM -ID $vmId
205
+ $service = 'Guest Service Interface'
206
+
207
+ If ((Get-VMIntegrationService -Name $service -VM $vm).Enabled -ne $true) {
208
+ Enable-VMIntegrationService -Name $service -VM $vm
209
+ Start-Sleep -Seconds 3
210
+ }
211
+
212
+ If ((Get-Item $sourceLocation) -is [System.IO.DirectoryInfo]) {
213
+ ForEach ($item in (Get-ChildItem -Path $sourceLocation -File)) {
214
+ $destFullPath = (Join-Path $destinationLocation $item.Name)
215
+ CopyFile $vm $item.FullName $destFullPath
216
+ }
217
+ }
218
+ Else {
219
+ CopyFile $vm $sourceLocation $destinationLocation
220
+ }
221
+ }
222
+ else {
223
+ Write-Error "Source file path does not exist: $sourceLocation"
224
+ }
225
+ FILECOPY
226
+ end
227
+
228
+ private
229
+
230
+ def ruby_array_to_ps_array(list)
231
+ return "@()" if list.nil? || list.empty?
232
+ list.to_s.tr('[]','()').prepend('@')
233
+ end
234
+ end
235
+ end
236
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-hyperv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Murawski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-05 00:00:00.000000000 Z
11
+ date: 2017-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler