kitchen-hyperv 0.1.10 → 0.1.20

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: e34b84dd7e2463baa68a448fcad48faf91d99c55
4
- data.tar.gz: 507d81b5c1fb7ea6faafa1c189121854b1870eb8
3
+ metadata.gz: c1d4f93b043b3ffd049677de50956792b767beef
4
+ data.tar.gz: 16273be77c92281545407b43f51d8e47c5de8155
5
5
  SHA512:
6
- metadata.gz: 54b782a1a66f60716d700733144c016619cc5c027e807b1ca813325a1e2d7419226d4f4e8796f2ba61b08e4ee6a04cb0008491d1d8f34c7341e2649cac8e6c55
7
- data.tar.gz: da830ca060e563b1c80fdba8d15ce29eb004a6bc8ac12cbd672344c0b81711185def65532bbff84fe345d3c5f2d836fae1fe675e279445b438b764b9e44206e0
6
+ metadata.gz: feb8ed661a0989544fe2a1e1fc5030e0fb24f614da9a19ac85812c8aa5013f5aef5eb240b4a483155088eca8bb529ec523a56773d70318941b42e350ae41d700
7
+ data.tar.gz: 7d01d62bb019ba9b44d830742e8809857e89b8030503e71745e875fa5526df78a00e1f5339a8ce610c373c78b9c3cbc97bfecc3ae73556e8617ab34d0a054a7f
data/.cane CHANGED
@@ -1,2 +1,2 @@
1
- --no-doc
1
+ --no-doc
2
2
  --style-measure 100
data/.gitignore CHANGED
@@ -1,15 +1,15 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
15
- *.gem
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ *.gem
data/CHANGELOG.md CHANGED
@@ -1,21 +1,21 @@
1
- # 0.1.10 / 12-03-2015
2
-
3
- I really need to add some tests to this project. ;)
4
-
5
- * [PR #21](https://github.com/test-kitchen/kitchen-hyperv/pull/21) : Wrong module name
6
-
7
-
8
- # 0.1.9 / 12-03-2015
9
-
10
- Missed a merge conflict.
11
-
12
- # 0.1.8 / 12-03-2015
13
-
14
- * [PR #15](https://github.com/test-kitchen/kitchen-hyperv/pull/15) : Dynamic Memory support
15
- * [PR #17](https://github.com/test-kitchen/kitchen-hyperv/pull/17) : File copy support
16
- * [PR #19](https://github.com/test-kitchen/kitchen-hyperv/pull/19) : Explict import of hyper-v module and delay in getting ip (wait for DHCP)
17
- * [PR #20](https://github.com/test-kitchen/kitchen-hyperv/pull/20) : Doc the required WinRM Settings
18
-
19
- # 0.1.7 / 07-14-2015
20
-
21
- * [PR #8](https://github.com/test-kitchen/kitchen-hyperv/pull/8) : Add support for 64 bit ruby
1
+ # 0.1.10 / 12-03-2015
2
+
3
+ I really need to add some tests to this project. ;)
4
+
5
+ * [PR #21](https://github.com/test-kitchen/kitchen-hyperv/pull/21) : Wrong module name
6
+
7
+
8
+ # 0.1.9 / 12-03-2015
9
+
10
+ Missed a merge conflict.
11
+
12
+ # 0.1.8 / 12-03-2015
13
+
14
+ * [PR #15](https://github.com/test-kitchen/kitchen-hyperv/pull/15) : Dynamic Memory support
15
+ * [PR #17](https://github.com/test-kitchen/kitchen-hyperv/pull/17) : File copy support
16
+ * [PR #19](https://github.com/test-kitchen/kitchen-hyperv/pull/19) : Explict import of hyper-v module and delay in getting ip (wait for DHCP)
17
+ * [PR #20](https://github.com/test-kitchen/kitchen-hyperv/pull/20) : Doc the required WinRM Settings
18
+
19
+ # 0.1.7 / 07-14-2015
20
+
21
+ * [PR #8](https://github.com/test-kitchen/kitchen-hyperv/pull/8) : Add support for 64 bit ruby
data/Gemfile CHANGED
@@ -1,10 +1,10 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in kitchen-hyperv.gemspec
4
- gemspec
5
-
6
- gem 'win32-process'
7
- gem 'win32-api'
8
- gem 'windows-pr'
9
- gem 'windows-api'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kitchen-hyperv.gemspec
4
+ gemspec
5
+
6
+ gem 'win32-process'
7
+ gem 'win32-api'
8
+ gem 'windows-pr'
9
+ gem 'windows-api'
10
10
  gem 'ffi'
data/LICENSE.txt CHANGED
@@ -1,22 +1,22 @@
1
- Copyright (c) 2015 Steven Murawski
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2015 Steven Murawski
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -39,6 +39,12 @@ driver:
39
39
  * The minimum and maximum amount of memory Hyper-V will allocate to a virtual machine if dynamic_memory is enabled. Defaults to 536,870,912 and 2,147,483,648 (512MB-2GB)
40
40
  * ip_address
41
41
  * IP address for the virtual machine. If the VM is not on a network with DHCP, this can be used to assign an IP that can be reached from the host machine.
42
+ * subnet
43
+ * The subnet of the virtual machine. Defaults to `255.255.255.0`
44
+ * gateway
45
+ * The default gateway of the virtual machine.
46
+ * dns_servers
47
+ * A list of DNS Servers that can be reached on the virtual network.
42
48
  * vm_switch
43
49
  * The virtual switch to attach the guest VMs. Defaults to the first switch returned from Get-VMSwitch.
44
50
  * iso_path
data/Rakefile CHANGED
@@ -1,52 +1,52 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require "bundler/gem_tasks"
4
-
5
- require "rake/testtask"
6
- Rake::TestTask.new(:unit) do |t|
7
- t.libs.push "lib"
8
- t.test_files = FileList["spec/**/*_spec.rb"]
9
- t.verbose = true
10
- end
11
-
12
- desc "Run all test suites"
13
- task :test => [:unit]
14
-
15
- desc "Display LOC stats"
16
- task :stats do
17
- puts "\n## Production Code Stats"
18
- sh "countloc -r lib"
19
- puts "\n## Test Code Stats"
20
- sh "countloc -r spec"
21
- end
22
-
23
- require "finstyle"
24
- require "rubocop/rake_task"
25
- RuboCop::RakeTask.new(:style) do |task|
26
- task.options << "--display-cop-names"
27
- task.options << "--lint"
28
- task.options << '--config' << '.rubocop.yml'
29
- task.patterns = ['lib/**/*.rb']
30
- end
31
-
32
- require "cane/rake_task"
33
- desc "Run cane to check quality metrics"
34
- Cane::RakeTask.new do |cane|
35
- cane.canefile = "./.cane"
36
- end
37
-
38
- desc "Run all quality tasks"
39
- task :quality => [:cane, :style, :stats]
40
-
41
- require "yard"
42
- YARD::Rake::YardocTask.new
43
-
44
- desc "Generate gem dependency graph"
45
- task :viz do
46
- Bundler.with_clean_env do
47
- sh "bundle viz --without test development guard " \
48
- "--requirements --version"
49
- end
50
- end
51
-
52
- task :default => [:test, :quality]
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ require "rake/testtask"
6
+ Rake::TestTask.new(:unit) do |t|
7
+ t.libs.push "lib"
8
+ t.test_files = FileList["spec/**/*_spec.rb"]
9
+ t.verbose = true
10
+ end
11
+
12
+ desc "Run all test suites"
13
+ task :test => [:unit]
14
+
15
+ desc "Display LOC stats"
16
+ task :stats do
17
+ puts "\n## Production Code Stats"
18
+ sh "countloc -r lib"
19
+ puts "\n## Test Code Stats"
20
+ sh "countloc -r spec"
21
+ end
22
+
23
+ require "finstyle"
24
+ require "rubocop/rake_task"
25
+ RuboCop::RakeTask.new(:style) do |task|
26
+ task.options << "--display-cop-names"
27
+ task.options << "--lint"
28
+ task.options << '--config' << '.rubocop.yml'
29
+ task.patterns = ['lib/**/*.rb']
30
+ end
31
+
32
+ require "cane/rake_task"
33
+ desc "Run cane to check quality metrics"
34
+ Cane::RakeTask.new do |cane|
35
+ cane.canefile = "./.cane"
36
+ end
37
+
38
+ desc "Run all quality tasks"
39
+ task :quality => [:cane, :style, :stats]
40
+
41
+ require "yard"
42
+ YARD::Rake::YardocTask.new
43
+
44
+ desc "Generate gem dependency graph"
45
+ task :viz do
46
+ Bundler.with_clean_env do
47
+ sh "bundle viz --without test development guard " \
48
+ "--requirements --version"
49
+ end
50
+ end
51
+
52
+ task :default => [:test, :quality]
@@ -1,31 +1,31 @@
1
- # encoding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
-
5
- require 'kitchen/driver/hyperv_version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = "kitchen-hyperv"
9
- spec.version = Kitchen::Driver::HYPERV_VERSION
10
- spec.authors = ["Steven Murawski"]
11
- spec.email = ["steven.murawski@gmail.com"]
12
- spec.summary = 'Hyper-V Driver for Test-Kitchen'
13
- spec.description = 'Hyper-V Driver for Test-Kitchen'
14
- spec.homepage = "https://github.com/test-kitchen/kitchen-hyperv"
15
- spec.license = "Apache 2"
16
-
17
- spec.files = `git ls-files -z`.split("\x0")
18
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
- spec.require_paths = ["lib"]
21
-
22
- spec.add_development_dependency "bundler", "~> 1.7"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "pry", "~> 0.10"
25
- spec.add_development_dependency "cane"
26
- spec.add_development_dependency "finstyle"
27
- spec.add_development_dependency "rubocop"
28
- spec.add_development_dependency "yard"
29
-
30
- spec.add_dependency "test-kitchen", "~> 1.4"
31
- end
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'kitchen/driver/hyperv_version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "kitchen-hyperv"
9
+ spec.version = Kitchen::Driver::HYPERV_VERSION
10
+ spec.authors = ["Steven Murawski"]
11
+ spec.email = ["steven.murawski@gmail.com"]
12
+ spec.summary = 'Hyper-V Driver for Test-Kitchen'
13
+ spec.description = 'Hyper-V Driver for Test-Kitchen'
14
+ spec.homepage = "https://github.com/test-kitchen/kitchen-hyperv"
15
+ spec.license = "Apache 2"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "pry", "~> 0.10"
25
+ spec.add_development_dependency "cane"
26
+ spec.add_development_dependency "finstyle"
27
+ spec.add_development_dependency "rubocop"
28
+ spec.add_development_dependency "yard"
29
+
30
+ spec.add_dependency "test-kitchen", "~> 1.4"
31
+ end
@@ -42,6 +42,9 @@ module Kitchen
42
42
  default_config :dynamic_memory, false
43
43
  default_config :processor_count, 2
44
44
  default_config :ip_address
45
+ default_config :gateway
46
+ default_config :dns_servers
47
+ default_config :subnet, '255.255.255.0'
45
48
  default_config :vm_switch
46
49
  default_config :iso_path
47
50
  default_config :vm_generation, 1
@@ -1,22 +1,22 @@
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
- module Kitchen
19
- module Driver
20
- HYPERV_VERSION = '0.1.10'
21
- end
22
- 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
+ module Kitchen
19
+ module Driver
20
+ HYPERV_VERSION = '0.1.20'
21
+ end
22
+ end
@@ -1,184 +1,194 @@
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
- os_arch == 'AMD64'
33
- end
34
-
35
- def powershell_64_bit
36
- if is_64bit?
37
- 'c:\windows\system32\windowspowershell\v1.0\powershell.exe'
38
- else
39
- 'c:\windows\sysnative\windowspowershell\v1.0\powershell.exe'
40
- end
41
- end
42
-
43
- def wrap_command(script)
44
- base_script_path = File.join(File.dirname(__FILE__), '/../../../support/hyperv.ps1')
45
- debug("Loading functions from #{base_script_path}")
46
- new_script = ". #{base_script_path}; " << script
47
- debug("Wrapped script: #{new_script}")
48
- "#{powershell_64_bit} -encodedcommand #{encode_command new_script} -outputformat Text"
49
- end
50
-
51
- # Convenience method to run a powershell command locally.
52
- #
53
- # @param cmd [String] command to run locally
54
- # @param options [Hash] options hash
55
- # @see Kitchen::ShellOut.run_command
56
- # @api private
57
- def run_ps(cmd, options = {})
58
- cmd = "echo #{cmd}" if config[:dry_run]
59
- debug('Preparing to run: ')
60
- debug(" #{cmd}")
61
- wrapped_command = wrap_command cmd
62
- execute_command wrapped_command, options
63
- end
64
-
65
- # rubocop:disable Metrics/AbcSize
66
- def execute_command(cmd, options = {})
67
- debug("#Local Command BEGIN (#{cmd})")
68
- sh = Mixlib::ShellOut.new(cmd, options)
69
- sh.run_command
70
- debug("Local Command END #{Util.duration(sh.execution_time)}")
71
- fail "Failed: #{sh.stderr}" if sh.error?
72
- JSON.parse(sh.stdout) if sh.stdout.length > 2
73
- end
74
- # rubocop:enable Metrics/AbcSize
75
-
76
- def new_differencing_disk_ps
77
- <<-DIFF
78
-
79
- New-DifferencingDisk -Path "#{differencing_disk_path}" -ParentPath "#{parent_vhd_path}"
80
- DIFF
81
- end
82
-
83
- def ensure_vm_running_ps
84
- <<-RUNNING
85
-
86
- Assert-VmRunning -ID "#{@state[:id]}" | ConvertTo-Json
87
- RUNNING
88
- end
89
-
90
- # rubocop:disable Metrics/MethodLength
91
- def new_vm_ps
92
- <<-NEWVM
93
-
94
- $NewVMParams = @{
95
- Generation = #{config[:vm_generation]}
96
- MemoryStartupBytes = #{config[:memory_startup_bytes]}
97
- Name = "#{instance.name}"
98
- Path = "#{kitchen_vm_path}"
99
- VHDPath = "#{differencing_disk_path}"
100
- SwitchName = "#{config[:vm_switch]}"
101
- ProcessorCount = #{config[:processor_count]}
102
- UseDynamicMemory = "#{config[:dynamic_memory]}"
103
- DynamicMemoryMinBytes = #{config[:dynamic_memory_min_bytes]}
104
- DynamicMemoryMaxBytes = #{config[:dynamic_memory_max_bytes]}
105
- }
106
- New-KitchenVM @NewVMParams | ConvertTo-Json
107
- NEWVM
108
- end
109
- # rubocop:enable Metrics/MethodLength
110
-
111
- def vm_details_ps
112
- <<-DETAILS
113
-
114
- Get-VmDetail -id "#{@state[:id]}" | ConvertTo-Json
115
- DETAILS
116
- end
117
-
118
- def delete_vm_ps
119
- <<-REMOVE
120
-
121
- $null = Get-VM -ID "#{@state[:id]}" |
122
- Stop-VM -Force -TurnOff -PassThru |
123
- Remove-VM -Force
124
- REMOVE
125
- end
126
-
127
- def set_vm_ipaddress_ps
128
- <<-VMIP
129
-
130
- (Get-VM -id "#{@state[:id]}").NetworkAdapters |
131
- Set-VMNetworkConfiguration -ipaddress "#{config[:ip_address]}" -subnet 255.255.255.0 |
132
- ConvertTo-Json
133
- VMIP
134
- end
135
-
136
- def vm_default_switch_ps
137
- <<-VMSWITCH
138
- Get-DefaultVMSwitch | ConvertTo-Json
139
- VMSWITCH
140
- end
141
-
142
- def mount_vm_iso
143
- <<-MOUNTISO
144
- mount-vmiso -id "#{@state[:id]}" -Path #{config[:iso_path]}
145
- MOUNTISO
146
- end
147
-
148
- def copy_vm_file_ps(source, dest)
149
- <<-FILECOPY
150
- Function CopyFile ($VM, [string]$SourcePath, [string]$DestPath) {
151
- #Write-Host "Copying file to VM - Source: $SourcePath Destination $DestPath"
152
- $VM | Copy-VMFile -SourcePath $SourcePath -DestinationPath $DestPath -CreateFullPath -FileSource Host -Force
153
- }
154
-
155
- $sourceLocation = '#{source}'
156
- $destinationLocation = '#{dest}'
157
- $vmId = '#{@state[:id]}'
158
- If (Test-Path $sourceLocation) {
159
- $vm = Get-VM -ID $vmId
160
- $service = 'Guest Service Interface'
161
-
162
- If ((Get-VMIntegrationService -Name $service -VM $vm).Enabled -ne $true) {
163
- Enable-VMIntegrationService -Name $service -VM $vm
164
- Start-Sleep -Seconds 3
165
- }
166
-
167
- If ((Get-Item $sourceLocation) -is [System.IO.DirectoryInfo]) {
168
- ForEach ($item in (Get-ChildItem -Path $sourceLocation -File)) {
169
- $destFullPath = (Join-Path $destinationLocation $item.Name)
170
- CopyFile $vm $item.FullName $destFullPath
171
- }
172
- }
173
- Else {
174
- CopyFile $vm $sourceLocation $destinationLocation
175
- }
176
- }
177
- else {
178
- Write-Error "Source file path does not exist: $sourceLocation"
179
- }
180
- FILECOPY
181
- end
182
- end
183
- end
184
- 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
+ os_arch == 'AMD64'
33
+ end
34
+
35
+ def powershell_64_bit
36
+ if is_64bit?
37
+ 'c:\windows\system32\windowspowershell\v1.0\powershell.exe'
38
+ else
39
+ 'c:\windows\sysnative\windowspowershell\v1.0\powershell.exe'
40
+ end
41
+ end
42
+
43
+ def wrap_command(script)
44
+ base_script_path = File.join(File.dirname(__FILE__), '/../../../support/hyperv.ps1')
45
+ debug("Loading functions from #{base_script_path}")
46
+ new_script = ". #{base_script_path}; " << script
47
+ debug("Wrapped script: #{new_script}")
48
+ "#{powershell_64_bit} -noprofile -encodedcommand #{encode_command new_script} -outputformat Text"
49
+ end
50
+
51
+ # Convenience method to run a powershell command locally.
52
+ #
53
+ # @param cmd [String] command to run locally
54
+ # @param options [Hash] options hash
55
+ # @see Kitchen::ShellOut.run_command
56
+ # @api private
57
+ def run_ps(cmd, options = {})
58
+ cmd = "echo #{cmd}" if config[:dry_run]
59
+ debug('Preparing to run: ')
60
+ debug(" #{cmd}")
61
+ wrapped_command = wrap_command cmd
62
+ execute_command wrapped_command, options
63
+ end
64
+
65
+ # rubocop:disable Metrics/AbcSize
66
+ def execute_command(cmd, options = {})
67
+ debug("#Local Command BEGIN (#{cmd})")
68
+ sh = Mixlib::ShellOut.new(cmd, options)
69
+ sh.run_command
70
+ debug("Local Command END #{Util.duration(sh.execution_time)}")
71
+ fail "Failed: #{sh.stderr}" if sh.error?
72
+ JSON.parse(sh.stdout) if sh.stdout.length > 2
73
+ end
74
+ # rubocop:enable Metrics/AbcSize
75
+
76
+ def new_differencing_disk_ps
77
+ <<-DIFF
78
+
79
+ New-DifferencingDisk -Path "#{differencing_disk_path}" -ParentPath "#{parent_vhd_path}"
80
+ DIFF
81
+ end
82
+
83
+ def ensure_vm_running_ps
84
+ <<-RUNNING
85
+
86
+ Assert-VmRunning -ID "#{@state[:id]}" | ConvertTo-Json
87
+ RUNNING
88
+ end
89
+
90
+ # rubocop:disable Metrics/MethodLength
91
+ def new_vm_ps
92
+ <<-NEWVM
93
+
94
+ $NewVMParams = @{
95
+ Generation = #{config[:vm_generation]}
96
+ MemoryStartupBytes = #{config[:memory_startup_bytes]}
97
+ Name = "#{instance.name}"
98
+ Path = "#{kitchen_vm_path}"
99
+ VHDPath = "#{differencing_disk_path}"
100
+ SwitchName = "#{config[:vm_switch]}"
101
+ ProcessorCount = #{config[:processor_count]}
102
+ UseDynamicMemory = "#{config[:dynamic_memory]}"
103
+ DynamicMemoryMinBytes = #{config[:dynamic_memory_min_bytes]}
104
+ DynamicMemoryMaxBytes = #{config[:dynamic_memory_max_bytes]}
105
+ }
106
+ New-KitchenVM @NewVMParams | ConvertTo-Json
107
+ NEWVM
108
+ end
109
+ # rubocop:enable Metrics/MethodLength
110
+
111
+ def vm_details_ps
112
+ <<-DETAILS
113
+
114
+ Get-VmDetail -id "#{@state[:id]}" | ConvertTo-Json
115
+ DETAILS
116
+ end
117
+
118
+ def delete_vm_ps
119
+ <<-REMOVE
120
+
121
+ $null = Get-VM -ID "#{@state[:id]}" |
122
+ Stop-VM -Force -TurnOff -PassThru |
123
+ Remove-VM -Force
124
+ REMOVE
125
+ end
126
+
127
+ def set_vm_ipaddress_ps
128
+ <<-VMIP
129
+
130
+ (Get-VM -id "#{@state[:id]}").NetworkAdapters |
131
+ Set-VMNetworkConfiguration -ipaddress "#{config[:ip_address]}" `
132
+ -subnet "#{config[:subnet]}" `
133
+ -gateway "#{config[:gateway]}" `
134
+ -dnsservers #{ruby_array_to_ps_array(config[:dns_servers])} |
135
+ ConvertTo-Json
136
+ VMIP
137
+ end
138
+
139
+ def vm_default_switch_ps
140
+ <<-VMSWITCH
141
+ Get-DefaultVMSwitch | ConvertTo-Json
142
+ VMSWITCH
143
+ end
144
+
145
+ def mount_vm_iso
146
+ <<-MOUNTISO
147
+ mount-vmiso -id "#{@state[:id]}" -Path #{config[:iso_path]}
148
+ MOUNTISO
149
+ end
150
+
151
+ def copy_vm_file_ps(source, dest)
152
+ <<-FILECOPY
153
+ Function CopyFile ($VM, [string]$SourcePath, [string]$DestPath) {
154
+ #Write-Host "Copying file to VM - Source: $SourcePath Destination $DestPath"
155
+ $VM | Copy-VMFile -SourcePath $SourcePath -DestinationPath $DestPath -CreateFullPath -FileSource Host -Force
156
+ }
157
+
158
+ $sourceLocation = '#{source}'
159
+ $destinationLocation = '#{dest}'
160
+ $vmId = '#{@state[:id]}'
161
+ If (Test-Path $sourceLocation) {
162
+ $vm = Get-VM -ID $vmId
163
+ $service = 'Guest Service Interface'
164
+
165
+ If ((Get-VMIntegrationService -Name $service -VM $vm).Enabled -ne $true) {
166
+ Enable-VMIntegrationService -Name $service -VM $vm
167
+ Start-Sleep -Seconds 3
168
+ }
169
+
170
+ If ((Get-Item $sourceLocation) -is [System.IO.DirectoryInfo]) {
171
+ ForEach ($item in (Get-ChildItem -Path $sourceLocation -File)) {
172
+ $destFullPath = (Join-Path $destinationLocation $item.Name)
173
+ CopyFile $vm $item.FullName $destFullPath
174
+ }
175
+ }
176
+ Else {
177
+ CopyFile $vm $sourceLocation $destinationLocation
178
+ }
179
+ }
180
+ else {
181
+ Write-Error "Source file path does not exist: $sourceLocation"
182
+ }
183
+ FILECOPY
184
+ end
185
+
186
+ private
187
+
188
+ def ruby_array_to_ps_array(list)
189
+ return "@()" if list.nil? || list.empty?
190
+ list.to_s.tr('[]','()').prepend('@')
191
+ end
192
+ end
193
+ end
194
+ end
@@ -1,70 +1,70 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Fletcher (<fnichol@nichol.ca>)
4
- #
5
- # Copyright (C) 2015, Fletcher Nichol
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require_relative "../../spec_helper"
20
-
21
- require "logger"
22
- require "stringio"
23
- require "kitchen"
24
- require 'kitchen/driver/hyperv_version'
25
- require "kitchen/driver/hyperv"
26
- require "kitchen/provisioner/dummy"
27
- require "kitchen/transport/dummy"
28
- require "kitchen/verifier/dummy"
29
-
30
- describe Kitchen::Driver::Hyperv do
31
-
32
- let(:logged_output) { StringIO.new }
33
- let(:logger) { Logger.new(logged_output) }
34
- let(:config) { { :kitchen_root => "c:/test_root" } }
35
- let(:platform) { Kitchen::Platform.new(:name => "fooos-99") }
36
- let(:suite) { Kitchen::Suite.new(:name => "suitey") }
37
- let(:verifier) { Kitchen::Verifier::Dummy.new }
38
- let(:provisioner) { Kitchen::Provisioner::Dummy.new }
39
- let(:transport) { Kitchen::Transport::Dummy.new }
40
- let(:state_file) { stub("state_file") }
41
- let(:state) { Hash.new }
42
- let(:env) { Hash.new }
43
-
44
- let(:driver_object) { Kitchen::Driver::Hyperv.new(config) }
45
-
46
- let(:driver) do
47
- d = driver_object
48
- instance
49
- d
50
- end
51
-
52
- let(:instance) do
53
- Kitchen::Instance.new(
54
- :verifier => verifier,
55
- :driver => driver_object,
56
- :logger => logger,
57
- :suite => suite,
58
- :platform => platform,
59
- :provisioner => provisioner,
60
- :transport => transport,
61
- :state_file => state_file
62
- )
63
- end
64
-
65
- #before { stub_const("ENV", env) }
66
-
67
- it 'driver api_version is 2' do
68
- driver.diagnose_plugin[:api_version].must_equal(2)
69
- end
70
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2015, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative "../../spec_helper"
20
+
21
+ require "logger"
22
+ require "stringio"
23
+ require "kitchen"
24
+ require 'kitchen/driver/hyperv_version'
25
+ require "kitchen/driver/hyperv"
26
+ require "kitchen/provisioner/dummy"
27
+ require "kitchen/transport/dummy"
28
+ require "kitchen/verifier/dummy"
29
+
30
+ describe Kitchen::Driver::Hyperv do
31
+
32
+ let(:logged_output) { StringIO.new }
33
+ let(:logger) { Logger.new(logged_output) }
34
+ let(:config) { { :kitchen_root => "c:/test_root" } }
35
+ let(:platform) { Kitchen::Platform.new(:name => "fooos-99") }
36
+ let(:suite) { Kitchen::Suite.new(:name => "suitey") }
37
+ let(:verifier) { Kitchen::Verifier::Dummy.new }
38
+ let(:provisioner) { Kitchen::Provisioner::Dummy.new }
39
+ let(:transport) { Kitchen::Transport::Dummy.new }
40
+ let(:state_file) { stub("state_file") }
41
+ let(:state) { Hash.new }
42
+ let(:env) { Hash.new }
43
+
44
+ let(:driver_object) { Kitchen::Driver::Hyperv.new(config) }
45
+
46
+ let(:driver) do
47
+ d = driver_object
48
+ instance
49
+ d
50
+ end
51
+
52
+ let(:instance) do
53
+ Kitchen::Instance.new(
54
+ :verifier => verifier,
55
+ :driver => driver_object,
56
+ :logger => logger,
57
+ :suite => suite,
58
+ :platform => platform,
59
+ :provisioner => provisioner,
60
+ :transport => transport,
61
+ :state_file => state_file
62
+ )
63
+ end
64
+
65
+ #before { stub_const("ENV", env) }
66
+
67
+ it 'driver api_version is 2' do
68
+ driver.diagnose_plugin[:api_version].must_equal(2)
69
+ end
70
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,43 +1,43 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
- #
5
- # Copyright (C) 2012, Fletcher Nichol
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- gem "minitest"
20
- gem "minitest-stub-const"
21
-
22
- if ENV["CODECLIMATE_REPO_TOKEN"]
23
- require "codeclimate-test-reporter"
24
- CodeClimate::TestReporter.start
25
- elsif ENV["COVERAGE"]
26
- require "simplecov"
27
- SimpleCov.profiles.define "gem" do
28
- command_name "Specs"
29
-
30
- add_filter ".gem/"
31
- add_filter "/spec/"
32
- add_filter "/lib/vendor/"
33
-
34
- add_group "Libraries", "/lib/"
35
- end
36
- SimpleCov.start "gem"
37
- end
38
-
39
- require 'minitest'
40
- require 'minitest/stub_const'
41
- require "minitest/autorun"
42
- require "mocha/setup"
43
- require "tempfile"
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2012, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ gem "minitest"
20
+ gem "minitest-stub-const"
21
+
22
+ if ENV["CODECLIMATE_REPO_TOKEN"]
23
+ require "codeclimate-test-reporter"
24
+ CodeClimate::TestReporter.start
25
+ elsif ENV["COVERAGE"]
26
+ require "simplecov"
27
+ SimpleCov.profiles.define "gem" do
28
+ command_name "Specs"
29
+
30
+ add_filter ".gem/"
31
+ add_filter "/spec/"
32
+ add_filter "/lib/vendor/"
33
+
34
+ add_group "Libraries", "/lib/"
35
+ end
36
+ SimpleCov.start "gem"
37
+ end
38
+
39
+ require 'minitest'
40
+ require 'minitest/stub_const'
41
+ require "minitest/autorun"
42
+ require "mocha/setup"
43
+ require "tempfile"
@@ -1,2 +1,2 @@
1
- . $PSScriptRoot\..\..\support\hyperv.ps1
2
-
1
+ . $PSScriptRoot\..\..\support\hyperv.ps1
2
+
data/support/hyperv.ps1 CHANGED
@@ -113,6 +113,8 @@ Function Set-VMNetworkConfiguration
113
113
  [parameter(valuefrompipeline)]
114
114
  [object]$NetworkAdapter,
115
115
  [String[]]$IPAddress = @(),
116
+ [String[]]$Gateway = @(),
117
+ [String[]]$DNSServers = @(),
116
118
  [String[]]$Subnet = @()
117
119
  )
118
120
 
@@ -134,6 +136,8 @@ Function Set-VMNetworkConfiguration
134
136
  }
135
137
 
136
138
  $NetworkSettings[0].IPAddresses = $IPAddress
139
+ $NetworkSettings[0].DefaultGateways = $Gateway
140
+ $NetworkSettings[0].DNSServers = $DNSServers
137
141
  $NetworkSettings[0].Subnets = $Subnet
138
142
  $NetworkSettings[0].ProtocolIFType = 4096
139
143
  $NetworkSettings[0].DHCPEnabled = $false
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.1.10
4
+ version: 0.1.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Murawski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-03 00:00:00.000000000 Z
11
+ date: 2016-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  version: '0'
166
166
  requirements: []
167
167
  rubyforge_project:
168
- rubygems_version: 2.4.8
168
+ rubygems_version: 2.6.3
169
169
  signing_key:
170
170
  specification_version: 4
171
171
  summary: Hyper-V Driver for Test-Kitchen