test-kitchen 1.11.1 → 1.12.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
  SHA1:
3
- metadata.gz: 22f760d057e0cf90d483e03c622c08ea54a17064
4
- data.tar.gz: b2a22c93d0be6c6cb8c623ae61fdf395a48b83a1
3
+ metadata.gz: 81b8adb0709ab4a153dcc6a0eba1c51e871d7dde
4
+ data.tar.gz: 97fbf58b65c2696f67dfae8c70ba089f14ef0ba9
5
5
  SHA512:
6
- metadata.gz: f323c65e242a8de0fdeef2626ed5a6b397f116fed2587e35f7add1902c7c1a9ca601a2b781b0abe55e4bc69c0f452c158976c9d025db5320425d76478e87cbc5
7
- data.tar.gz: 279c722139b269f198c2a4abd6e17520ec342809d2c1300e9fb787700f0e2b04adfb2c912733b0a4733ac76dd416503fc6d1915956df6ea254b971e1c86caaee
6
+ metadata.gz: 1d21fba7803bdf1592b7d1554cf4897f98817470d7559422f72f6fb8fbba38257484acf12dc89ee4f20cf7a0146053016a5f7c7b517ef7d8bf2591366e268a31
7
+ data.tar.gz: 32d72aac0d92f2c8dc12e0d1a4e66589d126c90f3c6f937230d28ef591a33e4e722a91613c6b316183360634457858f9f4e0c7bdc76f1afc88e024b49514600d
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.2.4
5
- - 2.1.8
4
+ - 2.1.9
5
+ - 2.2.5
6
+ - 2.3.1
6
7
  - ruby-head
7
8
 
8
9
  env:
@@ -32,7 +33,7 @@ branches:
32
33
 
33
34
  matrix:
34
35
  include:
35
- - rvm: 2.2.4
36
+ - rvm: 2.2.5
36
37
  # To run the proxy tests we need additional gems than what Test Kitchen normally uses
37
38
  # for testing
38
39
  gemfile: Gemfile.proxy_tests
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ## [v1.12.0](https://github.com/test-kitchen/test-kitchen/tree/v1.12.0) (2016-09-02)
4
+ [Full Changelog](https://github.com/test-kitchen/test-kitchen/compare/v1.11.1...v1.12.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Use winrm v2 release gems [\#1061](https://github.com/test-kitchen/test-kitchen/pull/1061) ([mwrock](https://github.com/mwrock))
9
+ - Add a new config option always\_update\_cookbooks [\#1107](https://github.com/test-kitchen/test-kitchen/pull/1107) ([coderanger](https://github.com/coderanger))
10
+ - Always run `chef install` even if the lock file exists. [\#1103](https://github.com/test-kitchen/test-kitchen/pull/1103) ([coderanger](https://github.com/coderanger))
11
+ - support passing Kitchen::Config Hash keys to Kitchen::RakeTasks.new [\#1102](https://github.com/test-kitchen/test-kitchen/pull/1102) ([theckman](https://github.com/theckman))
12
+
3
13
  ## [v1.11.1](https://github.com/test-kitchen/test-kitchen/tree/v1.11.1) (2016-08-13)
4
14
  [Full Changelog](https://github.com/test-kitchen/test-kitchen/compare/v1.11.0...v1.11.1)
5
15
 
data/Gemfile CHANGED
@@ -3,9 +3,11 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
  gem "rack", "< 2.0"
5
5
 
6
+ gem "train", :github => "chef/train", :branch => "winrm-v2"
7
+
6
8
  group :integration do
7
9
  gem "berkshelf", "~> 4.3"
8
- gem "kitchen-inspec", "~> 0.12.5"
10
+ gem "kitchen-inspec", :git => "https://github.com/mwrock/kitchen-inspec", :branch => "winrm-v2"
9
11
  end
10
12
 
11
13
  group :test do
@@ -3,34 +3,34 @@
3
3
  require "tmpdir"
4
4
  require "pathname"
5
5
 
6
- Given(/^a sandboxed GEM_HOME directory named "(.*?)"$/) do |name|
7
- backup_envvar("GEM_HOME")
8
- backup_envvar("GEM_PATH")
6
+ # Given(/^a sandboxed GEM_HOME directory named "(.*?)"$/) do |name|
7
+ # backup_envvar("GEM_HOME")
8
+ # backup_envvar("GEM_PATH")
9
9
 
10
- @aruba_timeout_seconds = 30
10
+ # @aruba_timeout_seconds = 30
11
11
 
12
- gem_home = Pathname.new(Dir.mktmpdir(name))
13
- aruba.environment["GEM_HOME"] = gem_home.to_s
14
- aruba.environment["GEM_PATH"] = [gem_home.to_s, ENV["GEM_PATH"]].join(":")
15
- @cleanup_dirs << gem_home
16
- end
12
+ # gem_home = Pathname.new(Dir.mktmpdir(name))
13
+ # aruba.environment["GEM_HOME"] = gem_home.to_s
14
+ # aruba.environment["GEM_PATH"] = [gem_home.to_s, ENV["GEM_PATH"]].join(":")
15
+ # @cleanup_dirs << gem_home
16
+ # end
17
17
 
18
- Then(/^a gem named "(.*?)" is installed with version "(.*?)"$/) do |name, version|
19
- unbundlerize do
20
- run_simple(
21
- sanitize_text("gem list #{name} --version #{version} -i"),
22
- :fail_on_error => true,
23
- :exit_timeout => nil
24
- )
25
- end
26
- end
18
+ # Then(/^a gem named "(.*?)" is installed with version "(.*?)"$/) do |name, version|
19
+ # unbundlerize do
20
+ # run_simple(
21
+ # sanitize_text("gem list #{name} --version #{version} -i"),
22
+ # :fail_on_error => true,
23
+ # :exit_timeout => nil
24
+ # )
25
+ # end
26
+ # end
27
27
 
28
- Then(/^a gem named "(.*?)" is installed$/) do |name|
29
- unbundlerize do
30
- run_simple(
31
- sanitize_text("gem list #{name} -i"),
32
- :fail_on_error => true,
33
- :exit_timeout => nil
34
- )
35
- end
36
- end
28
+ # Then(/^a gem named "(.*?)" is installed$/) do |name|
29
+ # unbundlerize do
30
+ # run_simple(
31
+ # sanitize_text("gem list #{name} -i"),
32
+ # :fail_on_error => true,
33
+ # :exit_timeout => nil
34
+ # )
35
+ # end
36
+ # end
@@ -40,17 +40,18 @@ module Kitchen
40
40
  # cookbooks
41
41
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
42
42
  # to `Kitchen.logger`
43
- def initialize(berksfile, path, logger = Kitchen.logger)
43
+ def initialize(berksfile, path, logger: Kitchen.logger, always_update: false)
44
44
  @berksfile = berksfile
45
45
  @path = path
46
46
  @logger = logger
47
+ @always_update = always_update
47
48
  end
48
49
 
49
50
  # Loads the library code required to use the resolver.
50
51
  #
51
52
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
52
53
  # to `Kitchen.logger`
53
- def self.load!(logger = Kitchen.logger)
54
+ def self.load!(logger: Kitchen.logger)
54
55
  load_berkshelf!(logger)
55
56
  end
56
57
 
@@ -62,13 +63,11 @@ module Kitchen
62
63
  debug("Using Berksfile from #{berksfile}")
63
64
 
64
65
  ::Berkshelf.ui.mute do
65
- if ::Berkshelf::Berksfile.method_defined?(:vendor)
66
- # Berkshelf 3.0 requires the directory to not exist
67
- FileUtils.rm_rf(path)
68
- ::Berkshelf::Berksfile.from_file(berksfile).vendor(path)
69
- else
70
- ::Berkshelf::Berksfile.from_file(berksfile).install(:path => path)
71
- end
66
+ berksfile_obj = ::Berkshelf::Berksfile.from_file(berksfile)
67
+ berksfile_obj.update if always_update
68
+ # Berkshelf requires the directory to not exist
69
+ FileUtils.rm_rf(path)
70
+ berksfile_obj.vendor(path)
72
71
  end
73
72
  end
74
73
 
@@ -86,6 +85,10 @@ module Kitchen
86
85
  # @api private
87
86
  attr_reader :logger
88
87
 
88
+ # @return [Boolean] If true, always update cookbooks in Berkshelf.
89
+ # @api private
90
+ attr_reader :always_update
91
+
89
92
  # Load the Berkshelf-specific libary code.
90
93
  #
91
94
  # @param logger [Kitchen::Logger] the logger to use
@@ -301,13 +301,13 @@ module Kitchen
301
301
  "kitchen config. The run_list in your config will be ignored.")
302
302
  warn("Ignored run_list: #{config[:run_list].inspect}")
303
303
  end
304
- policylock = policyfile.gsub(/\.rb\Z/, ".lock.json")
305
- unless File.exist?(policylock)
306
- Kitchen.mutex.synchronize do
307
- Chef::Policyfile.new(policyfile, sandbox_path, logger).compile
308
- end
304
+ policy = Chef::Policyfile.new(policyfile, sandbox_path,
305
+ :logger => logger,
306
+ :always_update => config[:always_update_cookbooks])
307
+ Kitchen.mutex.synchronize do
308
+ policy.compile
309
309
  end
310
- policy_name = JSON.parse(IO.read(policylock))["name"]
310
+ policy_name = JSON.parse(IO.read(policy.lockfile))["name"]
311
311
  policy_group = "local"
312
312
  config[:attributes].merge(:policy_name => policy_name, :policy_group => policy_group)
313
313
  end
@@ -317,7 +317,9 @@ module Kitchen
317
317
  # @api private
318
318
  def resolve_with_policyfile
319
319
  Kitchen.mutex.synchronize do
320
- Chef::Policyfile.new(policyfile, sandbox_path, logger).resolve
320
+ Chef::Policyfile.new(policyfile, sandbox_path,
321
+ :logger => logger,
322
+ :always_update => config[:always_update_cookbooks]).resolve
321
323
  end
322
324
  end
323
325
 
@@ -326,7 +328,9 @@ module Kitchen
326
328
  # @api private
327
329
  def resolve_with_berkshelf
328
330
  Kitchen.mutex.synchronize do
329
- Chef::Berkshelf.new(berksfile, tmpbooks_dir, logger).resolve
331
+ Chef::Berkshelf.new(berksfile, tmpbooks_dir,
332
+ :logger => logger,
333
+ :always_update => config[:always_update_cookbooks]).resolve
330
334
  end
331
335
  end
332
336
 
@@ -335,7 +339,7 @@ module Kitchen
335
339
  # @api private
336
340
  def resolve_with_librarian
337
341
  Kitchen.mutex.synchronize do
338
- Chef::Librarian.new(cheffile, tmpbooks_dir, logger).resolve
342
+ Chef::Librarian.new(cheffile, tmpbooks_dir, :logger => logger).resolve
339
343
  end
340
344
  end
341
345
 
@@ -40,7 +40,7 @@ module Kitchen
40
40
  # cookbooks
41
41
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
42
42
  # to `Kitchen.logger`
43
- def initialize(cheffile, path, logger = Kitchen.logger)
43
+ def initialize(cheffile, path, logger: Kitchen.logger)
44
44
  @cheffile = cheffile
45
45
  @path = path
46
46
  @logger = logger
@@ -50,7 +50,7 @@ module Kitchen
50
50
  #
51
51
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
52
52
  # to `Kitchen.logger`
53
- def self.load!(logger = Kitchen.logger)
53
+ def self.load!(logger: Kitchen.logger)
54
54
  load_librarian!(logger)
55
55
  end
56
56
 
@@ -44,17 +44,18 @@ module Kitchen
44
44
  # cookbooks
45
45
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
46
46
  # to `Kitchen.logger`
47
- def initialize(policyfile, path, logger = Kitchen.logger)
47
+ def initialize(policyfile, path, logger: Kitchen.logger, always_update: false)
48
48
  @policyfile = policyfile
49
49
  @path = path
50
50
  @logger = logger
51
+ @always_update = always_update
51
52
  end
52
53
 
53
54
  # Loads the library code required to use the resolver.
54
55
  #
55
56
  # @param logger [Kitchen::Logger] a logger to use for output, defaults
56
57
  # to `Kitchen.logger`
57
- def self.load!(logger = Kitchen.logger)
58
+ def self.load!(logger: Kitchen.logger)
58
59
  detect_chef_command!(logger)
59
60
  end
60
61
 
@@ -68,11 +69,26 @@ module Kitchen
68
69
  # Runs `chef install` to determine the correct cookbook set and
69
70
  # generate the policyfile lock.
70
71
  def compile
71
- info("Policy lock file doesn't exist, running `chef install` for "\
72
- "Policyfile #{policyfile}...")
72
+ if always_update
73
+ info("Updating policy lock using `chef update`")
74
+ run_command("chef update #{escape_path(policyfile)}")
75
+ end
76
+ if File.exist?(lockfile)
77
+ info("Installing cookbooks for Policyfile #{policyfile} using `chef install`")
78
+ else
79
+ info("Policy lock file doesn't exist, running `chef install` for "\
80
+ "Policyfile #{policyfile}...")
81
+ end
73
82
  run_command("chef install #{escape_path(policyfile)}")
74
83
  end
75
84
 
85
+ # Return the path to the lockfile corresponding to this policyfile.
86
+ #
87
+ # @return [String]
88
+ def lockfile
89
+ policyfile.gsub(/\.rb\Z/, ".lock.json")
90
+ end
91
+
76
92
  private
77
93
 
78
94
  # @return [String] path to a Berksfile
@@ -87,6 +103,10 @@ module Kitchen
87
103
  # @api private
88
104
  attr_reader :logger
89
105
 
106
+ # @return [Boolean] If true, always update cookbooks in the policy.
107
+ # @api private
108
+ attr_reader :always_update
109
+
90
110
  # Ensure the `chef` command is in the path.
91
111
  #
92
112
  # @param logger [Kitchen::Logger] the logger to use
@@ -59,6 +59,9 @@ module Kitchen
59
59
  # Will try to autodetect by searching for `Policyfile.rb` if not set.
60
60
  # If set, will error if the file doesn't exist.
61
61
  default_config :policyfile_path, nil
62
+ # If set to true (which is the default from `chef generate`), try to update
63
+ # backend cookbook downloader on every kitchen run.
64
+ default_config :always_update_cookbooks, false
62
65
  default_config :cookbook_files_glob, %w[
63
66
  README.* metadata.{json,rb}
64
67
  attributes/**/* definitions/**/* files/**/* libraries/**/*
@@ -281,13 +284,13 @@ module Kitchen
281
284
  super
282
285
  if File.exist?(policyfile)
283
286
  debug("Policyfile found at #{policyfile}, using Policyfile to resolve dependencies")
284
- Chef::Policyfile.load!(logger)
287
+ Chef::Policyfile.load!(:logger => logger)
285
288
  elsif File.exist?(berksfile)
286
289
  debug("Berksfile found at #{berksfile}, loading Berkshelf")
287
- Chef::Berkshelf.load!(logger)
290
+ Chef::Berkshelf.load!(:logger => logger)
288
291
  elsif File.exist?(cheffile)
289
292
  debug("Cheffile found at #{cheffile}, loading Librarian-Chef")
290
- Chef::Librarian.load!(logger)
293
+ Chef::Librarian.load!(:logger => logger)
291
294
  end
292
295
  end
293
296
 
@@ -344,6 +347,11 @@ module Kitchen
344
347
  installer.install_command
345
348
  end
346
349
 
350
+ # Hook used in subclasses to indicate support for policyfiles.
351
+ #
352
+ # @abstract
353
+ # @return [Boolean]
354
+ # @api private
347
355
  def supports_policyfile?
348
356
  false
349
357
  end
@@ -30,14 +30,14 @@ module Kitchen
30
30
  # Creates Kitchen Rake tasks and allows the callee to configure it.
31
31
  #
32
32
  # @yield [self] gives itself to the block
33
- def initialize
33
+ def initialize(cfg = {})
34
34
  @loader = Kitchen::Loader::YAML.new(
35
35
  :project_config => ENV["KITCHEN_YAML"],
36
36
  :local_config => ENV["KITCHEN_LOCAL_YAML"],
37
37
  :global_config => ENV["KITCHEN_GLOBAL_YAML"]
38
38
  )
39
39
  @config = Kitchen::Config.new(
40
- :loader => @loader
40
+ { :loader => @loader }.merge(cfg)
41
41
  )
42
42
  Kitchen.logger = Kitchen.default_file_logger(nil, false)
43
43
  yield self if block_given?
@@ -84,13 +84,12 @@ module Kitchen
84
84
  class Connection < Kitchen::Transport::Base::Connection
85
85
  # (see Base::Connection#close)
86
86
  def close
87
- return if @session.nil?
88
-
89
- session.close
87
+ @unelevated_session.close if @unelevated_session
88
+ @elevated_session.close if @elevated_session
90
89
  ensure
90
+ @unelevated_session = nil
91
+ @elevated_session = nil
91
92
  @file_transporter = nil
92
- @session = nil
93
- @elevated_runner = nil
94
93
  end
95
94
 
96
95
  # (see Base::Connection#execute)
@@ -98,9 +97,6 @@ module Kitchen
98
97
  return if command.nil?
99
98
  logger.debug("[WinRM] #{self} (#{command})")
100
99
 
101
- if command.length > MAX_COMMAND_SIZE
102
- command = run_from_file_command(command)
103
- end
104
100
  exit_code, stderr = execute_with_exit_code(command)
105
101
 
106
102
  if logger.debug? && exit_code == 0
@@ -137,7 +133,7 @@ module Kitchen
137
133
  # (see Base::Connection#wait_until_ready)
138
134
  def wait_until_ready
139
135
  delay = 3
140
- session(
136
+ unelevated_session(
141
137
  :retry_limit => max_wait_until_ready / delay,
142
138
  :retry_delay => delay
143
139
  )
@@ -148,11 +144,6 @@ module Kitchen
148
144
 
149
145
  PING_COMMAND = "Write-Host '[WinRM] Established\n'".freeze
150
146
 
151
- # Maximum string to send to the transport to execute. WinRM has an 8000 character
152
- # command line limit. The original command string is coverted to a base 64 encoded
153
- # UTF-16 string which will double the string size.
154
- MAX_COMMAND_SIZE = 3000
155
-
156
147
  # @return [Integer] how many times to retry when failing to execute
157
148
  # a command or transfer files
158
149
  # @api private
@@ -163,10 +154,6 @@ module Kitchen
163
154
  # @api private
164
155
  attr_reader :connection_retry_sleep
165
156
 
166
- # @return [String] the endpoint URL of the remote WinRM host
167
- # @api private
168
- attr_reader :endpoint
169
-
170
157
  # @return [String] display name for the associated instance
171
158
  # @api private
172
159
  attr_reader :instance_name
@@ -185,11 +172,6 @@ module Kitchen
185
172
  # @api private
186
173
  attr_reader :rdp_port
187
174
 
188
- # @return [Symbol] the transport strategy to use when constructing a
189
- # `WinRM::WinRMWebService`
190
- # @api private
191
- attr_reader :winrm_transport
192
-
193
175
  # @return [Boolean] whether to use winrm-elevated for running commands
194
176
  # @api private
195
177
  attr_reader :elevated
@@ -202,7 +184,7 @@ module Kitchen
202
184
  # @api private
203
185
  def create_rdp_doc(opts = {})
204
186
  content = Util.outdent!(<<-RDP)
205
- full address:s:#{URI.parse(endpoint).host}:#{rdp_port}
187
+ full address:s:#{URI.parse(options[:endpoint]).host}:#{rdp_port}
206
188
  prompt for credentials:i:1
207
189
  username:s:#{options[:user]}
208
190
  RDP
@@ -227,33 +209,26 @@ module Kitchen
227
209
  # @api private
228
210
  def execute_with_exit_code(command)
229
211
  if elevated
230
- unless options[:elevated_username] == options[:user]
231
- command = "$env:temp='#{unelevated_temp_dir}';#{command}"
232
- end
233
- response = elevated_runner.powershell_elevated(
234
- command,
235
- options[:elevated_username],
236
- options[:elevated_password]
237
- ) do |stdout, _|
238
- logger << stdout if stdout
239
- end
212
+ session = elevated_session
213
+ command = "$env:temp='#{unelevated_temp_dir}';#{command}"
240
214
  else
241
- response = session.run_powershell_script(command) do |stdout, _|
242
- logger << stdout if stdout
243
- end
215
+ session = unelevated_session
244
216
  end
245
217
 
246
- [response[:exitcode], response.stderr]
218
+ response = session.run(command) do |stdout, _|
219
+ logger << stdout if stdout
220
+ end
221
+ [response.exitcode, response.stderr]
247
222
  end
248
223
 
249
224
  def unelevated_temp_dir
250
- @unelevated_temp_dir ||= session.run_powershell_script("$env:temp").stdout.chomp
225
+ @unelevated_temp_dir ||= unelevated_session.run("$env:temp").stdout.chomp
251
226
  end
252
227
 
253
228
  # @return [Winrm::FileTransporter] a file transporter
254
229
  # @api private
255
230
  def file_transporter
256
- @file_transporter ||= WinRM::FS::Core::FileTransporter.new(session)
231
+ @file_transporter ||= WinRM::FS::Core::FileTransporter.new(unelevated_session)
257
232
  end
258
233
 
259
234
  # (see Base#init_options)
@@ -261,9 +236,7 @@ module Kitchen
261
236
  super
262
237
  @instance_name = @options.delete(:instance_name)
263
238
  @kitchen_root = @options.delete(:kitchen_root)
264
- @endpoint = @options.delete(:endpoint)
265
239
  @rdp_port = @options.delete(:rdp_port)
266
- @winrm_transport = @options.delete(:winrm_transport)
267
240
  @connection_retries = @options.delete(:connection_retries)
268
241
  @connection_retry_sleep = @options.delete(:connection_retry_sleep)
269
242
  @max_wait_until_ready = @options.delete(:max_wait_until_ready)
@@ -297,8 +270,8 @@ module Kitchen
297
270
  # @api private
298
271
  def login_command_for_linux
299
272
  args = %W[-u #{options[:user]}]
300
- args += %W[-p #{options[:pass]}] if options.key?(:pass)
301
- args += %W[#{URI.parse(endpoint).host}:#{rdp_port}]
273
+ args += %W[-p #{options[:password]}] if options.key?(:password)
274
+ args += %W[#{URI.parse(options[:endpoint]).host}:#{rdp_port}]
302
275
 
303
276
  LoginCommand.new("rdesktop", args)
304
277
  end
@@ -333,36 +306,40 @@ module Kitchen
333
306
  # the first time.
334
307
  #
335
308
  # @param retry_options [Hash] retry options for the initial connection
336
- # @return [Winrm::CommandExecutor] the command executor session
309
+ # @return [Winrm::Shells::Powershell] the command shell session
337
310
  # @api private
338
- def session(retry_options = {})
339
- @session ||= service(retry_options).create_executor
311
+ def unelevated_session(retry_options = {})
312
+ @unelevated_session ||= connection(retry_options).shell(:powershell)
340
313
  end
341
314
 
342
- # Creates the elevated runner for running elevated commands
315
+ # Creates an elevated session for running commands via a scheduled task
343
316
  #
344
- # @return [Winrm::Elevated::Runner] the elevated runner
317
+ # @return [Winrm::Shells::Elevated] the elevated shell
345
318
  # @api private
346
- def elevated_runner
347
- @elevated_runner ||= WinRM::Elevated::Runner.new(session)
319
+ def elevated_session(retry_options = {})
320
+ @elevated_session ||= begin
321
+ connection(retry_options).shell(:elevated).tap do |shell|
322
+ shell.username = options[:elevated_username]
323
+ shell.password = options[:elevated_password]
324
+ end
325
+ end
348
326
  end
349
327
 
350
- # Creates a winrm web service instance
328
+ # Creates a winrm Connection instance
351
329
  #
352
330
  # @param retry_options [Hash] retry options for the initial connection
353
- # @return [Winrm::WinRMWebService] the winrm web service
331
+ # @return [Winrm::Connection] the winrm connection
354
332
  # @api private
355
- def service(retry_options = {})
356
- @service ||= begin
333
+ def connection(retry_options = {})
334
+ @connection ||= begin
357
335
  opts = {
358
336
  :retry_limit => connection_retries.to_i,
359
337
  :retry_delay => connection_retry_sleep.to_i
360
338
  }.merge(retry_options)
361
339
 
362
- service_args = [endpoint, winrm_transport, options.merge(opts)]
363
- svc = ::WinRM::WinRMWebService.new(*service_args)
364
- svc.logger = logger
365
- svc
340
+ ::WinRM::Connection.new(options.merge(opts)).tap do |conn|
341
+ conn.logger = logger
342
+ end
366
343
  end
367
344
  end
368
345
 
@@ -371,40 +348,15 @@ module Kitchen
371
348
  #
372
349
  # @api private
373
350
  def to_s
374
- "#{winrm_transport}::#{endpoint}<#{options.inspect}>"
375
- end
376
-
377
- # takes a long (greater than 3000 characters) command and saves it to a
378
- # file and uploads it to the test instance.
379
- #
380
- # @param command [String] a long command to be saved and uploaded
381
- # @return [String] a command that executes the uploaded script
382
- # @api private
383
- def run_from_file_command(command)
384
- temp_dir = Dir.mktmpdir("kitchen-long-script")
385
- begin
386
- script_name = "#{instance_name}-long_script.ps1"
387
- script_path = File.join(temp_dir, script_name)
388
-
389
- File.open(script_path, "wb") do |file|
390
- file.write(command)
391
- end
392
-
393
- target_path = File.join("$env:TEMP", script_name)
394
- upload(script_path, target_path)
395
-
396
- %{powershell -ExecutionPolicy Bypass -File "#{target_path}"}
397
- ensure
398
- FileUtils.rmtree(temp_dir)
399
- end
351
+ "<#{options.inspect}>"
400
352
  end
401
353
  end
402
354
 
403
355
  private
404
356
 
405
- WINRM_SPEC_VERSION = ["~> 1.6"].freeze
406
- WINRM_FS_SPEC_VERSION = ["~> 0.4.1"].freeze
407
- WINRM_ELEVATED_SPEC_VERSION = ["~> 0.4.0"].freeze
357
+ WINRM_SPEC_VERSION = ["~> 2.0"].freeze
358
+ WINRM_FS_SPEC_VERSION = ["~> 1.0"].freeze
359
+ WINRM_ELEVATED_SPEC_VERSION = ["~> 1.0"].freeze
408
360
 
409
361
  # Builds the hash of options needed by the Connection object on
410
362
  # construction.
@@ -422,17 +374,17 @@ module Kitchen
422
374
  :logger => logger,
423
375
  :endpoint => data[:endpoint_template] % data,
424
376
  :user => data[:username],
425
- :pass => data[:password],
377
+ :password => data[:password],
426
378
  :rdp_port => data[:rdp_port],
427
379
  :connection_retries => data[:connection_retries],
428
380
  :connection_retry_sleep => data[:connection_retry_sleep],
429
381
  :max_wait_until_ready => data[:max_wait_until_ready],
430
- :winrm_transport => data[:winrm_transport],
382
+ :transport => data[:winrm_transport],
431
383
  :elevated => data[:elevated],
432
384
  :elevated_username => data[:elevated_username] || data[:username],
433
385
  :elevated_password => elevated_password
434
386
  }
435
- opts.merge!(additional_transport_args(opts[:winrm_transport]))
387
+ opts.merge!(additional_transport_args(opts[:transport]))
436
388
  opts
437
389
  end
438
390
 
@@ -17,5 +17,5 @@
17
17
  # limitations under the License.
18
18
 
19
19
  module Kitchen
20
- VERSION = "1.11.1"
20
+ VERSION = "1.12.0"
21
21
  end
@@ -27,7 +27,7 @@ describe Kitchen::Provisioner::Chef::Policyfile do
27
27
  :debug => nil, :banner => nil)
28
28
  end
29
29
  let(:described_object) do
30
- Kitchen::Provisioner::Chef::Policyfile.new(policyfile, path, null_logger)
30
+ Kitchen::Provisioner::Chef::Policyfile.new(policyfile, path, :logger => null_logger)
31
31
  end
32
32
  let(:os) { "" }
33
33
  before do
@@ -895,7 +895,11 @@ describe Kitchen::Provisioner::ChefBase do
895
895
 
896
896
  describe "with a Policyfile under kitchen_root" do
897
897
 
898
- let(:resolver) { stub(:resolve => true) }
898
+ let(:policyfile_path) { "#{kitchen_root}/Policyfile.rb" }
899
+ let(:policyfile_lock_path) { "#{kitchen_root}/Policyfile.lock.json" }
900
+ let(:resolver) {
901
+ stub(:compile => true, :resolve => true, :lockfile => policyfile_lock_path)
902
+ }
899
903
 
900
904
  describe "with the default name `Policyfile.rb`" do
901
905
  before do
@@ -948,13 +952,14 @@ POLICYFILE
948
952
  end
949
953
 
950
954
  it "uses uses the policyfile to resolve dependencies" do
955
+ resolver.expects(:compile)
951
956
  resolver.expects(:resolve)
952
957
 
953
958
  provisioner.create_sandbox
954
959
  end
955
960
 
956
961
  it "uses Kitchen.mutex for resolving" do
957
- Kitchen.mutex.expects(:synchronize)
962
+ Kitchen.mutex.expects(:synchronize).twice
958
963
 
959
964
  provisioner.create_sandbox
960
965
  end
@@ -1014,6 +1019,7 @@ POLICYFILE
1014
1019
 
1015
1020
  it "uses uses the policyfile to resolve dependencies" do
1016
1021
  Kitchen::Provisioner::Chef::Policyfile.stubs(:load!)
1022
+ resolver.expects(:compile)
1017
1023
  resolver.expects(:resolve)
1018
1024
 
1019
1025
  provisioner.create_sandbox
@@ -1026,6 +1032,7 @@ POLICYFILE
1026
1032
  returns(resolver)
1027
1033
 
1028
1034
  Kitchen::Provisioner::Chef::Policyfile.stubs(:load!)
1035
+ resolver.expects(:compile)
1029
1036
  resolver.expects(:resolve)
1030
1037
 
1031
1038
  provisioner.create_sandbox
@@ -1095,6 +1102,7 @@ POLICYFILE
1095
1102
 
1096
1103
  it "uses uses the policyfile to resolve dependencies" do
1097
1104
  Kitchen::Provisioner::Chef::Policyfile.stubs(:load!)
1105
+ resolver.expects(:compile)
1098
1106
  resolver.expects(:resolve)
1099
1107
 
1100
1108
  provisioner.create_sandbox
@@ -1107,6 +1115,7 @@ POLICYFILE
1107
1115
  returns(resolver)
1108
1116
 
1109
1117
  Kitchen::Provisioner::Chef::Policyfile.stubs(:load!)
1118
+ resolver.expects(:compile)
1110
1119
  resolver.expects(:resolve)
1111
1120
 
1112
1121
  provisioner.create_sandbox
@@ -124,6 +124,7 @@ describe Kitchen::Transport::Winrm do
124
124
  before do
125
125
  config[:hostname] = "here"
126
126
  config[:kitchen_root] = "/i/am/root"
127
+ config[:password] = "password"
127
128
  end
128
129
 
129
130
  it "returns a Kitchen::Transport::Winrm::Connection object" do
@@ -155,7 +156,7 @@ describe Kitchen::Transport::Winrm do
155
156
 
156
157
  it "sets the :winrm_transport to :negotiate" do
157
158
  klass.expects(:new).with do |hash|
158
- hash[:winrm_transport] == :negotiate
159
+ hash[:transport] == :negotiate
159
160
  end
160
161
 
161
162
  make_connection
@@ -220,7 +221,7 @@ describe Kitchen::Transport::Winrm do
220
221
  config[:password] = "pass_from_config"
221
222
 
222
223
  klass.expects(:new).with do |hash|
223
- hash[:pass] == "pass_from_config"
224
+ hash[:password] == "pass_from_config"
224
225
  end
225
226
 
226
227
  make_connection
@@ -231,7 +232,7 @@ describe Kitchen::Transport::Winrm do
231
232
  config[:password] = "pass_from_config"
232
233
 
233
234
  klass.expects(:new).with do |hash|
234
- hash[:pass] == "pass_from_state"
235
+ hash[:password] == "pass_from_state"
235
236
  end
236
237
 
237
238
  make_connection
@@ -325,7 +326,7 @@ describe Kitchen::Transport::Winrm do
325
326
  config[:winrm_transport] = "ssl"
326
327
 
327
328
  klass.expects(:new).with do |hash|
328
- hash[:winrm_transport] == :ssl
329
+ hash[:transport] == :ssl
329
330
  end
330
331
 
331
332
  make_connection
@@ -392,7 +393,7 @@ describe Kitchen::Transport::Winrm do
392
393
  it "sets :winrm_transport to negotiate" do
393
394
 
394
395
  klass.expects(:new).with do |hash|
395
- hash[:winrm_transport] == :negotiate &&
396
+ hash[:transport] == :negotiate &&
396
397
  hash[:disable_sspi] == false &&
397
398
  hash[:basic_auth_only] == false
398
399
  end
@@ -629,26 +630,31 @@ describe Kitchen::Transport::Winrm::Connection do
629
630
  let(:logger) { Logger.new(logged_output) }
630
631
 
631
632
  let(:options) do
632
- { :logger => logger, :user => "me", :pass => "haha",
633
+ { :logger => logger, :user => "me", :password => "haha",
633
634
  :endpoint => "http://foo:5985/wsman", :winrm_transport => :plaintext,
634
635
  :kitchen_root => "/i/am/root", :instance_name => "coolbeans",
635
636
  :rdp_port => "rdpyeah" }
636
637
  end
637
638
 
638
639
  let(:info) do
639
- copts = { :user => "me", :pass => "haha" }
640
- "plaintext::http://foo:5985/wsman<#{copts}>"
640
+ copts = {
641
+ :user => "me",
642
+ :password => "haha",
643
+ :endpoint => "http://foo:5985/wsman",
644
+ :winrm_transport => :plaintext
645
+ }
646
+ "<#{copts}>"
641
647
  end
642
648
 
643
649
  let(:winrm_session) do
644
650
  s = mock("winrm_session")
645
- s.responds_like_instance_of(::WinRM::WinRMWebService)
651
+ s.responds_like_instance_of(::WinRM::Connection)
646
652
  s
647
653
  end
648
654
 
649
655
  let(:executor) do
650
656
  s = mock("command_executor")
651
- s.responds_like_instance_of(WinRM::CommandExecutor)
657
+ s.responds_like_instance_of(WinRM::Shells::Powershell)
652
658
  s
653
659
  end
654
660
 
@@ -660,7 +666,7 @@ describe Kitchen::Transport::Winrm::Connection do
660
666
 
661
667
  let(:elevated_runner) do
662
668
  r = mock("elevated_runner")
663
- r.responds_like_instance_of(WinRM::Elevated::Runner)
669
+ r.responds_like_instance_of(WinRM::Shells::Elevated)
664
670
  r
665
671
  end
666
672
 
@@ -669,7 +675,7 @@ describe Kitchen::Transport::Winrm::Connection do
669
675
  end
670
676
 
671
677
  before do
672
- WinRM::WinRMWebService.stubs(:new).returns(winrm_session)
678
+ WinRM::Connection.stubs(:new).returns(winrm_session)
673
679
  winrm_session.stubs(:logger=)
674
680
  logger.level = Logger::DEBUG
675
681
  end
@@ -678,18 +684,21 @@ describe Kitchen::Transport::Winrm::Connection do
678
684
 
679
685
  let(:response) do
680
686
  o = WinRM::Output.new
681
- o[:exitcode] = 0
682
- o[:data].concat([{ :stdout => "ok\r\n" }])
687
+ o.exitcode = 0
688
+ o << { :stdout => "ok\r\n" }
683
689
  o
684
690
  end
685
691
 
686
692
  before do
687
- winrm_session.stubs(:create_executor).returns(executor)
688
693
  transporter.stubs(:upload)
689
- elevated_runner.stubs(:powershell_elevated).returns(response)
694
+ elevated_runner.stubs(:run).returns(response)
695
+ winrm_session.stubs(:shell).with(:powershell).returns(executor)
690
696
  executor.stubs(:close)
691
- executor.stubs(:run_powershell_script).
697
+ elevated_runner.stubs(:close)
698
+ executor.stubs(:run).
692
699
  with("doit").yields("ok\n", nil).returns(response)
700
+ executor.stubs(:run).
701
+ with("$env:temp").yields("ok\n", nil).returns(response)
693
702
  end
694
703
 
695
704
  it "only closes the shell once for multiple calls" do
@@ -711,9 +720,10 @@ describe Kitchen::Transport::Winrm::Connection do
711
720
 
712
721
  it "clears the elevated_runner executor" do
713
722
  options[:elevated] = true
714
- options[:elevated_username] = options[:user]
715
- options[:elevated_password] = options[:pass]
716
- WinRM::Elevated::Runner.expects(:new).returns(elevated_runner).twice
723
+ elevated_runner.stubs(:username=)
724
+ elevated_runner.stubs(:password=)
725
+ elevated_runner.expects(:close).once
726
+ winrm_session.expects(:shell).with(:elevated).returns(elevated_runner).twice
717
727
 
718
728
  connection.execute("doit")
719
729
  connection.close
@@ -724,23 +734,21 @@ describe Kitchen::Transport::Winrm::Connection do
724
734
  describe "#execute" do
725
735
 
726
736
  before do
727
- winrm_session.stubs(:create_executor).returns(executor)
737
+ winrm_session.stubs(:shell).with(:powershell).returns(executor)
728
738
  end
729
739
 
730
740
  describe "for a successful command" do
731
741
 
732
742
  let(:response) do
733
743
  o = WinRM::Output.new
734
- o[:exitcode] = 0
735
- o[:data].concat([
736
- { :stdout => "ok\r\n" },
737
- { :stderr => "congrats\r\n" }
738
- ])
744
+ o.exitcode = 0
745
+ o << { :stdout => "ok\r\n" }
746
+ o << { :stderr => "congrats\r\n" }
739
747
  o
740
748
  end
741
749
 
742
750
  before do
743
- executor.expects(:run_powershell_script).
751
+ executor.expects(:run).
744
752
  with("doit").yields("ok\n", nil).returns(response)
745
753
  end
746
754
 
@@ -775,39 +783,40 @@ describe Kitchen::Transport::Winrm::Connection do
775
783
  describe "elevated command" do
776
784
  let(:response) do
777
785
  o = WinRM::Output.new
778
- o[:exitcode] = 0
779
- o[:data].concat([
780
- { :stdout => "ok\r\n" },
781
- { :stderr => "congrats\r\n" }
782
- ])
786
+ o.exitcode = 0
787
+ o << { :stdout => "ok\r\n" }
788
+ o << { :stderr => "congrats\r\n" }
783
789
  o
784
790
  end
785
791
  let(:env_temp_response) do
786
792
  o = WinRM::Output.new
787
- o[:exitcode] = 0
788
- o[:data].concat([
789
- { :stdout => "temp_dir" }
790
- ])
793
+ o.exitcode = 0
794
+ o << { :stdout => "temp_dir" }
791
795
  o
792
796
  end
797
+ let(:elevated_runner) do
798
+ r = mock("elevated_runner")
799
+ r.responds_like_instance_of(WinRM::Shells::Elevated)
800
+ r
801
+ end
793
802
 
794
803
  before do
795
804
  options[:elevated] = true
796
- WinRM::Elevated::Runner.stubs(:new).with(executor).returns(elevated_runner)
805
+ winrm_session.stubs(:shell).with(:elevated).returns(elevated_runner)
797
806
  end
798
807
 
799
808
  describe "elevated user is not login user" do
800
809
  before do
801
810
  options[:elevated_username] = "username"
802
811
  options[:elevated_password] = "password"
803
- executor.expects(:run_powershell_script).
812
+ executor.expects(:run).
804
813
  with("$env:temp").returns(env_temp_response)
805
- elevated_runner.expects(:powershell_elevated).
814
+ elevated_runner.expects(:run).
806
815
  with(
807
- "$env:temp='temp_dir';doit",
808
- options[:elevated_username],
809
- options[:elevated_password]
816
+ "$env:temp='temp_dir';doit"
810
817
  ).yields("ok\n", nil).returns(response)
818
+ elevated_runner.expects(:username=).with("username")
819
+ elevated_runner.expects(:password=).with("password")
811
820
  end
812
821
 
813
822
  it "logger captures stdout" do
@@ -817,16 +826,18 @@ describe Kitchen::Transport::Winrm::Connection do
817
826
  end
818
827
  end
819
828
 
820
- describe "elevator user is login user" do
829
+ describe "elevated user is login user" do
821
830
  before do
822
831
  options[:elevated_username] = options[:user]
823
- options[:elevated_password] = options[:pass]
824
- elevated_runner.expects(:powershell_elevated).
832
+ options[:elevated_password] = options[:password]
833
+ executor.expects(:run).
834
+ with("$env:temp").returns(env_temp_response)
835
+ elevated_runner.expects(:run).
825
836
  with(
826
- "doit",
827
- options[:elevated_username],
828
- options[:elevated_password]
837
+ "$env:temp='temp_dir';doit"
829
838
  ).yields("ok\n", nil).returns(response)
839
+ elevated_runner.expects(:username=).with(options[:user])
840
+ elevated_runner.expects(:password=).with(options[:password])
830
841
  end
831
842
 
832
843
  it "logger captures stdout" do
@@ -837,69 +848,35 @@ describe Kitchen::Transport::Winrm::Connection do
837
848
  end
838
849
  end
839
850
 
840
- describe "long command" do
841
- let(:command) { %{Write-Host "#{"a" * 4000}"} }
842
-
843
- let(:connection) do
844
- Kitchen::Transport::WinRMConnectionDummy.new(options)
845
- end
846
-
847
- let(:response) do
848
- o = WinRM::Output.new
849
- o[:exitcode] = 0
850
- o[:data].concat([
851
- { :stdout => "ok\r\n" },
852
- { :stderr => "congrats\r\n" }
853
- ])
854
- o
855
- end
856
-
857
- before do
858
- executor.expects(:run_powershell_script).with(
859
- %{powershell -ExecutionPolicy Bypass -File "$env:TEMP/coolbeans-long_script.ps1"}
860
- ).yields("ok\n", nil).returns(response)
861
- end
862
-
863
- it "uploads the long command" do
864
- with_fake_fs do
865
- connection.execute(command)
866
-
867
- connection.saved_command.must_equal command
868
- end
869
- end
870
- end
871
-
872
851
  describe "for a failed command" do
873
852
 
874
853
  let(:response) do
875
854
  o = WinRM::Output.new
876
- o[:exitcode] = 1
877
- o[:data].concat([
878
- { :stderr => "#< CLIXML\r\n" },
879
- { :stderr => "<Objs Version=\"1.1.0.1\" xmlns=\"http://schemas." },
880
- { :stderr => "microsoft.com/powershell/2004/04\"><S S=\"Error\">" },
881
- { :stderr => "doit : The term 'doit' is not recognized as the " },
882
- { :stderr => "name of a cmdlet, function, _x000D__x000A_</S>" },
883
- { :stderr => "<S S=\"Error\">script file, or operable program. " },
884
- { :stderr => "Check the spelling of" },
885
- { :stderr => "the name, or if a path _x000D__x000A_</S><S S=\"E" },
886
- { :stderr => "rror\">was included, verify that the path is corr" },
887
- { :stderr => "ect and try again._x000D__x000A_</S><S S=\"Error" },
888
- { :stderr => "\">At line:1 char:1_x000D__x000A_</S><S S=\"Error" },
889
- { :stderr => "\">+ doit_x000D__x000A_</S><S S=\"Error\">+ ~~~~_" },
890
- { :stderr => "x000D__x000A_</S><S S=\"Error\"> + CategoryInf" },
891
- { :stderr => "o : ObjectNotFound: (doit:String) [], Co" },
892
- { :stderr => "mmandNotFoun _x000D__x000A_</S><S S=\"Error\"> " },
893
- { :stderr => "dException_x000D__x000A_</S><S S=\"Error\"> + " },
894
- { :stderr => "FullyQualifiedErrorId : CommandNotFoundException_" },
895
- { :stderr => "x000D__x000A_</S><S S=\"Error\"> _x000D__x000A_</" },
896
- { :stderr => "S></Objs>" }
897
- ])
855
+ o.exitcode = 1
856
+ o << { :stderr => "#< CLIXML\r\n" }
857
+ o << { :stderr => "<Objs Version=\"1.1.0.1\" xmlns=\"http://schemas." }
858
+ o << { :stderr => "microsoft.com/powershell/2004/04\"><S S=\"Error\">" }
859
+ o << { :stderr => "doit : The term 'doit' is not recognized as the " }
860
+ o << { :stderr => "name of a cmdlet, function, _x000D__x000A_</S>" }
861
+ o << { :stderr => "<S S=\"Error\">script file, or operable program. " }
862
+ o << { :stderr => "Check the spelling of" }
863
+ o << { :stderr => "the name, or if a path _x000D__x000A_</S><S S=\"E" }
864
+ o << { :stderr => "rror\">was included, verify that the path is corr" }
865
+ o << { :stderr => "ect and try again._x000D__x000A_</S><S S=\"Error" }
866
+ o << { :stderr => "\">At line:1 char:1_x000D__x000A_</S><S S=\"Error" }
867
+ o << { :stderr => "\">+ doit_x000D__x000A_</S><S S=\"Error\">+ ~~~~_" }
868
+ o << { :stderr => "x000D__x000A_</S><S S=\"Error\"> + CategoryInf" }
869
+ o << { :stderr => "o : ObjectNotFound: (doit:String) [], Co" }
870
+ o << { :stderr => "mmandNotFoun _x000D__x000A_</S><S S=\"Error\"> " }
871
+ o << { :stderr => "dException_x000D__x000A_</S><S S=\"Error\"> + " }
872
+ o << { :stderr => "FullyQualifiedErrorId : CommandNotFoundException_" }
873
+ o << { :stderr => "x000D__x000A_</S><S S=\"Error\"> _x000D__x000A_</" }
874
+ o << { :stderr => "S></Objs>" }
898
875
  o
899
876
  end
900
877
 
901
878
  before do
902
- executor.expects(:run_powershell_script).
879
+ executor.expects(:run).
903
880
  with("doit").yields("nope\n", nil).returns(response)
904
881
  end
905
882
 
@@ -1002,7 +979,7 @@ MSG
1002
979
 
1003
980
  options[:connection_retries] = 3
1004
981
  options[:connection_retry_sleep] = 7
1005
- winrm_session.stubs(:create_executor).raises(k)
982
+ winrm_session.stubs(:shell).with(:powershell).raises(k)
1006
983
  end
1007
984
 
1008
985
  it "reraises the #{klass} exception" do
@@ -1160,7 +1137,7 @@ MSG
1160
1137
  end
1161
1138
 
1162
1139
  it "won't set the pass if not given" do
1163
- options.delete(:pass)
1140
+ options.delete(:password)
1164
1141
 
1165
1142
  args.wont_match regexify(" -p haha ")
1166
1143
  end
@@ -1183,7 +1160,7 @@ MSG
1183
1160
  describe "#upload" do
1184
1161
 
1185
1162
  before do
1186
- winrm_session.stubs(:create_executor).returns(executor)
1163
+ winrm_session.stubs(:shell).with(:powershell).returns(executor)
1187
1164
 
1188
1165
  WinRM::FS::Core::FileTransporter.stubs(:new).
1189
1166
  with(executor).returns(transporter)
@@ -1234,7 +1211,7 @@ MSG
1234
1211
  describe "#wait_until_ready" do
1235
1212
 
1236
1213
  before do
1237
- winrm_session.stubs(:create_executor).returns(executor)
1214
+ winrm_session.stubs(:shell).with(:powershell).returns(executor)
1238
1215
  options[:max_wait_until_ready] = 300
1239
1216
  end
1240
1217
 
@@ -1242,13 +1219,13 @@ MSG
1242
1219
 
1243
1220
  let(:response) do
1244
1221
  o = WinRM::Output.new
1245
- o[:exitcode] = 0
1246
- o[:data].concat([{ :stdout => "[WinRM] Established\r\n" }])
1222
+ o.exitcode = 0
1223
+ o << { :stdout => "[WinRM] Established\r\n" }
1247
1224
  o
1248
1225
  end
1249
1226
 
1250
1227
  before do
1251
- executor.expects(:run_powershell_script).
1228
+ executor.expects(:run).
1252
1229
  with("Write-Host '[WinRM] Established\n'").returns(response)
1253
1230
  end
1254
1231
 
@@ -1261,13 +1238,13 @@ MSG
1261
1238
 
1262
1239
  let(:response) do
1263
1240
  o = WinRM::Output.new
1264
- o[:exitcode] = 42
1265
- o[:data].concat([{ :stderr => "Ah crap.\r\n" }])
1241
+ o.exitcode = 42
1242
+ o << { :stderr => "Ah crap.\r\n" }
1266
1243
  o
1267
1244
  end
1268
1245
 
1269
1246
  before do
1270
- executor.expects(:run_powershell_script).
1247
+ executor.expects(:run).
1271
1248
  with("Write-Host '[WinRM] Established\n'").returns(response)
1272
1249
  end
1273
1250
 
data/test-kitchen.gemspec CHANGED
@@ -36,9 +36,9 @@ Gem::Specification.new do |gem|
36
36
  gem.add_development_dependency "pry-stack_explorer"
37
37
  gem.add_development_dependency "rb-readline"
38
38
  gem.add_development_dependency "overcommit", "= 0.33.0"
39
- gem.add_development_dependency "winrm", "~> 1.6"
40
- gem.add_development_dependency "winrm-elevated", "~> 0.4.0"
41
- gem.add_development_dependency "winrm-fs", "~> 0.4.1"
39
+ gem.add_development_dependency "winrm", "~> 2.0"
40
+ gem.add_development_dependency "winrm-elevated", "~> 1.0"
41
+ gem.add_development_dependency "winrm-fs", "~> 1.0"
42
42
 
43
43
  gem.add_development_dependency "bundler", "~> 1.3"
44
44
  gem.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-kitchen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.1
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fletcher Nichol
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-13 00:00:00.000000000 Z
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -202,42 +202,42 @@ dependencies:
202
202
  requirements:
203
203
  - - "~>"
204
204
  - !ruby/object:Gem::Version
205
- version: '1.6'
205
+ version: '2.0'
206
206
  type: :development
207
207
  prerelease: false
208
208
  version_requirements: !ruby/object:Gem::Requirement
209
209
  requirements:
210
210
  - - "~>"
211
211
  - !ruby/object:Gem::Version
212
- version: '1.6'
212
+ version: '2.0'
213
213
  - !ruby/object:Gem::Dependency
214
214
  name: winrm-elevated
215
215
  requirement: !ruby/object:Gem::Requirement
216
216
  requirements:
217
217
  - - "~>"
218
218
  - !ruby/object:Gem::Version
219
- version: 0.4.0
219
+ version: '1.0'
220
220
  type: :development
221
221
  prerelease: false
222
222
  version_requirements: !ruby/object:Gem::Requirement
223
223
  requirements:
224
224
  - - "~>"
225
225
  - !ruby/object:Gem::Version
226
- version: 0.4.0
226
+ version: '1.0'
227
227
  - !ruby/object:Gem::Dependency
228
228
  name: winrm-fs
229
229
  requirement: !ruby/object:Gem::Requirement
230
230
  requirements:
231
231
  - - "~>"
232
232
  - !ruby/object:Gem::Version
233
- version: 0.4.1
233
+ version: '1.0'
234
234
  type: :development
235
235
  prerelease: false
236
236
  version_requirements: !ruby/object:Gem::Requirement
237
237
  requirements:
238
238
  - - "~>"
239
239
  - !ruby/object:Gem::Version
240
- version: 0.4.1
240
+ version: '1.0'
241
241
  - !ruby/object:Gem::Dependency
242
242
  name: bundler
243
243
  requirement: !ruby/object:Gem::Requirement