test-kitchen 1.18.0 → 1.19.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -0
  3. data/ECOSYSTEM.md +6 -5
  4. data/lib/kitchen/cli.rb +24 -53
  5. data/lib/kitchen/command/doctor.rb +40 -0
  6. data/lib/kitchen/config.rb +6 -0
  7. data/lib/kitchen/configurable.rb +1 -1
  8. data/lib/kitchen/data_munger.rb +2 -0
  9. data/lib/kitchen/driver/base.rb +26 -1
  10. data/lib/kitchen/driver/dummy.rb +1 -0
  11. data/lib/kitchen/driver/exec.rb +71 -0
  12. data/lib/kitchen/driver/proxy.rb +2 -1
  13. data/lib/kitchen/instance.rb +13 -4
  14. data/lib/kitchen/provisioner/base.rb +8 -0
  15. data/lib/kitchen/provisioner/chef_base.rb +3 -1
  16. data/lib/kitchen/provisioner/shell.rb +21 -23
  17. data/lib/kitchen/transport/base.rb +8 -0
  18. data/lib/kitchen/transport/exec.rb +59 -0
  19. data/lib/kitchen/verifier/base.rb +8 -0
  20. data/lib/kitchen/version.rb +1 -1
  21. data/spec/kitchen/config_spec.rb +13 -0
  22. data/spec/kitchen/driver/base_spec.rb +18 -0
  23. data/spec/kitchen/driver/exec_spec.rb +75 -0
  24. data/spec/kitchen/provisioner/chef_base_spec.rb +9 -0
  25. data/spec/kitchen/provisioner/chef_solo_spec.rb +1 -1
  26. data/spec/kitchen/provisioner/chef_zero_spec.rb +1 -1
  27. data/spec/kitchen/provisioner/shell_spec.rb +22 -20
  28. data/spec/kitchen/ssh_spec.rb +0 -29
  29. data/spec/kitchen/transport/exec_spec.rb +79 -0
  30. data/spec/kitchen/transport/ssh_spec.rb +0 -29
  31. data/spec/spec_helper.rb +26 -0
  32. data/support/busser_install_command.sh +10 -3
  33. metadata +9 -8
  34. data/features/kitchen_driver_create_command.feature +0 -64
  35. data/features/kitchen_driver_discover_command.feature +0 -25
  36. data/lib/kitchen/command/driver_discover.rb +0 -102
  37. data/lib/kitchen/generator/driver_create.rb +0 -174
@@ -22,35 +22,6 @@ require "kitchen/ssh"
22
22
  require "tmpdir"
23
23
  require "net/ssh/test"
24
24
 
25
- # Hack to sort results in `Dir.entries` only within the yielded block, to limit
26
- # the "behavior pollution" to other code. This was needed for Net::SCP, as
27
- # recursive directory upload doesn't sort the file and directory upload
28
- # candidates which leads to different results based on the underlying
29
- # filesystem (i.e. lexically sorted, inode insertion, mtime/atime, total
30
- # randomness, etc.)
31
- #
32
- # See: https://github.com/net-ssh/net-scp/blob/a24948/lib/net/scp/upload.rb#L52
33
-
34
- def with_sorted_dir_entries
35
- Dir.class_exec do
36
- class << self
37
- alias_method :__entries__, :entries unless method_defined?(:__entries__)
38
-
39
- def entries(*args) # rubocop:disable Lint/NestedMethodDefinition
40
- send(:__entries__, *args).sort
41
- end
42
- end
43
- end
44
-
45
- yield
46
-
47
- Dir.class_exec do
48
- class << self
49
- alias_method :entries, :__entries__
50
- end
51
- end
52
- end
53
-
54
25
  describe Kitchen::SSH do
55
26
  include Net::SSH::Test
56
27
 
@@ -0,0 +1,79 @@
1
+ #
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ #
14
+
15
+ require_relative "../../spec_helper"
16
+
17
+ require "kitchen/transport/exec"
18
+
19
+ describe Kitchen::Transport::Ssh do
20
+ let(:logged_output) { StringIO.new }
21
+ let(:logger) { Logger.new(logged_output) }
22
+ let(:config) { Hash.new }
23
+ let(:state) { Hash.new }
24
+
25
+ let(:instance) do
26
+ stub(name: "coolbeans", logger: logger, to_str: "instance")
27
+ end
28
+
29
+ let(:transport) do
30
+ Kitchen::Transport::Exec.new(config).finalize_config!(instance)
31
+ end
32
+
33
+ it "provisioner api_version is 1" do
34
+ transport.diagnose_plugin[:api_version].must_equal 1
35
+ end
36
+
37
+ it "plugin_version is set to Kitchen::VERSION" do
38
+ transport.diagnose_plugin[:version].must_equal Kitchen::VERSION
39
+ end
40
+
41
+ describe "#connection" do
42
+ it "returns a Kitchen::Transport::Exec::Connection object" do
43
+ transport.connection(state).must_be_kind_of Kitchen::Transport::Exec::Connection
44
+ end
45
+ end
46
+ end
47
+
48
+ describe Kitchen::Transport::Exec::Connection do
49
+ let(:logged_output) { StringIO.new }
50
+ let(:logger) { Logger.new(logged_output) }
51
+
52
+ let(:options) do
53
+ { logger: logger }
54
+ end
55
+
56
+ let(:connection) do
57
+ Kitchen::Transport::Exec::Connection.new(options)
58
+ end
59
+
60
+ describe "#execute" do
61
+ it "runs the command" do
62
+ connection.expects(:run_command).with("do the thing")
63
+ connection.execute("do the thing")
64
+ end
65
+
66
+ it "ignores nil" do
67
+ connection.expects(:run_command).never
68
+ connection.execute(nil)
69
+ end
70
+ end
71
+
72
+ describe "#upload" do
73
+ it "copies files" do
74
+ FileUtils.expects(:mkdir_p).with("/tmp/kitchen")
75
+ FileUtils.expects(:cp_r).with("/tmp/sandbox/cookbooks", "/tmp/kitchen")
76
+ connection.upload(%w{/tmp/sandbox/cookbooks}, "/tmp/kitchen")
77
+ end
78
+ end
79
+ end
@@ -21,35 +21,6 @@ require_relative "../../spec_helper"
21
21
  require "kitchen/transport/ssh"
22
22
  require "net/ssh/test"
23
23
 
24
- # Hack to sort results in `Dir.entries` only within the yielded block, to limit
25
- # the "behavior pollution" to other code. This was needed for Net::SCP, as
26
- # recursive directory upload doesn't sort the file and directory upload
27
- # candidates which leads to different results based on the underlying
28
- # filesystem (i.e. lexically sorted, inode insertion, mtime/atime, total
29
- # randomness, etc.)
30
- #
31
- # See: https://github.com/net-ssh/net-scp/blob/a24948/lib/net/scp/upload.rb#L52
32
-
33
- def with_sorted_dir_entries
34
- Dir.class_exec do
35
- class << self
36
- alias_method :__entries__, :entries unless method_defined?(:__entries__)
37
-
38
- def entries(*args) # rubocop:disable Lint/NestedMethodDefinition
39
- send(:__entries__, *args).sort
40
- end
41
- end
42
- end
43
-
44
- yield
45
-
46
- Dir.class_exec do
47
- class << self
48
- alias_method :entries, :__entries__
49
- end
50
- end
51
- end
52
-
53
24
  describe Kitchen::Transport::Ssh do
54
25
  let(:logged_output) { StringIO.new }
55
26
  let(:logger) { Logger.new(logged_output) }
@@ -59,6 +59,32 @@ class IO
59
59
  end
60
60
  end
61
61
 
62
+ # Hack to sort results in `Dir.entries` only within the yielded block, to limit
63
+ # the "behavior pollution" to other code. This was needed for Net::SCP, as
64
+ # recursive directory upload doesn't sort the file and directory upload
65
+ # candidates which leads to different results based on the underlying
66
+ # filesystem (i.e. lexically sorted, inode insertion, mtime/atime, total
67
+ # randomness, etc.)
68
+ #
69
+ # See: https://github.com/net-ssh/net-scp/blob/a24948/lib/net/scp/upload.rb#L52
70
+
71
+ $_sort_dir_entries = false
72
+ Dir.singleton_class.prepend(Module.new do
73
+ def entries(*args)
74
+ super.tap do |rv|
75
+ rv.sort! if $_sort_dir_entries
76
+ end
77
+ end
78
+ end)
79
+
80
+ def with_sorted_dir_entries(&block)
81
+ old_sort_dir_entries = $_sort_dir_entries
82
+ $_sort_dir_entries = true
83
+ yield
84
+ ensure
85
+ $_sort_dir_entries = old_sort_dir_entries
86
+ end
87
+
62
88
  def with_fake_fs
63
89
  FakeFS.activate!
64
90
  FileUtils.mkdir_p("/tmp")
@@ -1,4 +1,4 @@
1
- $gem list busser -i 2>&1 >/dev/null
1
+ $gem list --no-versions | grep "^busser" 2>&1 >/dev/null
2
2
  if test $? -ne 0; then
3
3
  echo "-----> Installing Busser ($version)"
4
4
  $gem install $gem_install_args
@@ -10,5 +10,12 @@ if test ! -f "$BUSSER_ROOT/bin/busser"; then
10
10
  $busser setup
11
11
  fi
12
12
 
13
- echo " Installing Busser plugins: $plugins"
14
- $busser plugin install $plugins
13
+ for plugin in $plugins; do
14
+ $gem list --no-versions | grep "^$plugin$" 2>&1 >/dev/null
15
+ if test $? -ne 0; then
16
+ echo "-----> Installing Busser plugin: $plugin"
17
+ $busser plugin install $plugin
18
+ else
19
+ echo "-----> Busser plugin detected: $plugin"
20
+ fi
21
+ done
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.18.0
4
+ version: 1.19.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: 2017-09-28 00:00:00.000000000 Z
11
+ date: 2017-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -358,8 +358,6 @@ files:
358
358
  - features/kitchen_console_command.feature
359
359
  - features/kitchen_defaults.feature
360
360
  - features/kitchen_diagnose_command.feature
361
- - features/kitchen_driver_create_command.feature
362
- - features/kitchen_driver_discover_command.feature
363
361
  - features/kitchen_help_command.feature
364
362
  - features/kitchen_init_command.feature
365
363
  - features/kitchen_list_command.feature
@@ -379,7 +377,7 @@ files:
379
377
  - lib/kitchen/command/action.rb
380
378
  - lib/kitchen/command/console.rb
381
379
  - lib/kitchen/command/diagnose.rb
382
- - lib/kitchen/command/driver_discover.rb
380
+ - lib/kitchen/command/doctor.rb
383
381
  - lib/kitchen/command/exec.rb
384
382
  - lib/kitchen/command/list.rb
385
383
  - lib/kitchen/command/login.rb
@@ -393,10 +391,10 @@ files:
393
391
  - lib/kitchen/driver.rb
394
392
  - lib/kitchen/driver/base.rb
395
393
  - lib/kitchen/driver/dummy.rb
394
+ - lib/kitchen/driver/exec.rb
396
395
  - lib/kitchen/driver/proxy.rb
397
396
  - lib/kitchen/driver/ssh_base.rb
398
397
  - lib/kitchen/errors.rb
399
- - lib/kitchen/generator/driver_create.rb
400
398
  - lib/kitchen/generator/init.rb
401
399
  - lib/kitchen/instance.rb
402
400
  - lib/kitchen/lazy_hash.rb
@@ -427,6 +425,7 @@ files:
427
425
  - lib/kitchen/transport.rb
428
426
  - lib/kitchen/transport/base.rb
429
427
  - lib/kitchen/transport/dummy.rb
428
+ - lib/kitchen/transport/exec.rb
430
429
  - lib/kitchen/transport/ssh.rb
431
430
  - lib/kitchen/transport/winrm.rb
432
431
  - lib/kitchen/util.rb
@@ -447,6 +446,7 @@ files:
447
446
  - spec/kitchen/diagnostic_spec.rb
448
447
  - spec/kitchen/driver/base_spec.rb
449
448
  - spec/kitchen/driver/dummy_spec.rb
449
+ - spec/kitchen/driver/exec_spec.rb
450
450
  - spec/kitchen/driver/proxy_spec.rb
451
451
  - spec/kitchen/driver/ssh_base_spec.rb
452
452
  - spec/kitchen/driver_spec.rb
@@ -473,6 +473,7 @@ files:
473
473
  - spec/kitchen/state_file_spec.rb
474
474
  - spec/kitchen/suite_spec.rb
475
475
  - spec/kitchen/transport/base_spec.rb
476
+ - spec/kitchen/transport/exec_spec.rb
476
477
  - spec/kitchen/transport/ssh_spec.rb
477
478
  - spec/kitchen/transport/winrm_spec.rb
478
479
  - spec/kitchen/transport_spec.rb
@@ -549,8 +550,6 @@ test_files:
549
550
  - features/kitchen_console_command.feature
550
551
  - features/kitchen_defaults.feature
551
552
  - features/kitchen_diagnose_command.feature
552
- - features/kitchen_driver_create_command.feature
553
- - features/kitchen_driver_discover_command.feature
554
553
  - features/kitchen_help_command.feature
555
554
  - features/kitchen_init_command.feature
556
555
  - features/kitchen_list_command.feature
@@ -571,6 +570,7 @@ test_files:
571
570
  - spec/kitchen/diagnostic_spec.rb
572
571
  - spec/kitchen/driver/base_spec.rb
573
572
  - spec/kitchen/driver/dummy_spec.rb
573
+ - spec/kitchen/driver/exec_spec.rb
574
574
  - spec/kitchen/driver/proxy_spec.rb
575
575
  - spec/kitchen/driver/ssh_base_spec.rb
576
576
  - spec/kitchen/driver_spec.rb
@@ -597,6 +597,7 @@ test_files:
597
597
  - spec/kitchen/state_file_spec.rb
598
598
  - spec/kitchen/suite_spec.rb
599
599
  - spec/kitchen/transport/base_spec.rb
600
+ - spec/kitchen/transport/exec_spec.rb
600
601
  - spec/kitchen/transport/ssh_spec.rb
601
602
  - spec/kitchen/transport/winrm_spec.rb
602
603
  - spec/kitchen/transport_spec.rb
@@ -1,64 +0,0 @@
1
- Feature: Create a new Test Kitchen Driver project
2
- In order to make plugin development a snap
3
- As a user of Test Kitchen
4
- I want a command to run that will give me a driver gem project scaffold
5
-
6
- @spawn
7
- Scenario: Displaying help
8
- When I run `kitchen help driver create`
9
- Then the output should contain:
10
- """
11
- Usage:
12
- kitchen driver create [NAME]
13
- """
14
- And the exit status should be 0
15
-
16
- Scenario: Running with default values
17
- When I run `kitchen driver create qemu`
18
- Then a directory named "kitchen-qemu" should exist
19
- And the file "kitchen-qemu/CHANGELOG.md" should contain:
20
- """
21
- ## 0.1.0 / Unreleased
22
- """
23
- And the file "kitchen-qemu/Gemfile" should contain "gemspec"
24
- And the file "kitchen-qemu/Rakefile" should contain "task :stats"
25
- And the file "kitchen-qemu/README.md" should contain:
26
- """
27
- Kitchen::Qemu
28
- """
29
- And the file "kitchen-qemu/kitchen-qemu.gemspec" should contain:
30
- """
31
- require 'kitchen/driver/qemu_version'
32
- """
33
- And the file "kitchen-qemu/LICENSE" should contain:
34
- """
35
- Licensed under the Apache License, Version 2.0
36
- """
37
- And the file "kitchen-qemu/.gitignore" should contain:
38
- """
39
- Gemfile.lock
40
- """
41
- And the file "kitchen-qemu/.tailor" should contain:
42
- """
43
- config.file_set 'lib/**/*.rb'
44
- """
45
- And the file "kitchen-qemu/.travis.yml" should contain:
46
- """
47
- language: ruby
48
- """
49
- And a file named "kitchen-qemu/.cane" should exist
50
- And the file "kitchen-qemu/lib/kitchen/driver/qemu_version.rb" should contain:
51
- """
52
- QEMU_VERSION = "0.1.0.dev"
53
- """
54
- And the file "kitchen-qemu/lib/kitchen/driver/qemu.rb" should contain:
55
- """
56
- class Qemu < Kitchen::Driver::SSHBase
57
- """
58
-
59
- Scenario: Running with an alternate license
60
- When I successfully run `kitchen driver create foo --license=reserved`
61
- Then the file "kitchen-foo/LICENSE" should contain:
62
- """
63
- All rights reserved - Do Not Redistribute
64
- """
@@ -1,25 +0,0 @@
1
- Feature: Search RubyGems to discover new Test Kitchen Driver gems
2
- In order to periodically check for new/updated Kitchen drivers
3
- As a Test Kitchen user
4
- I want to run a command which returns candidate Kitchen drivers
5
-
6
- @spawn
7
- Scenario: Displaying help
8
- When I run `kitchen help driver discover`
9
- Then the output should contain:
10
- """
11
- Usage:
12
- kitchen driver discover
13
- """
14
- And the exit status should be 0
15
-
16
- Scenario: Running driver discover returns live results
17
- When I run `kitchen driver discover`
18
- Then the exit status should be 0
19
- And the output should contain "kitchen-bluebox"
20
-
21
- Scenario: Running driver discover with the --chef-config-path parameter loads the chef config
22
- Given an empty file named "kitchen_client.rb"
23
- When I run `kitchen driver discover --chef-config-path=kitchen_client.rb`
24
- Then the exit status should be 0
25
- And the output should contain "kitchen-bluebox"
@@ -1,102 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
- #
5
- # Copyright (C) 2013, 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 "kitchen/command"
20
-
21
- require "rubygems/spec_fetcher"
22
- begin
23
- require "chef-config/config"
24
- require "chef-config/workstation_config_loader"
25
- rescue LoadError # rubocop:disable Lint/HandleExceptions
26
- # This space left intentionally blank.
27
- end
28
-
29
- module Kitchen
30
- module Command
31
- # Command to discover drivers published on RubyGems.
32
- #
33
- # @author Fletcher Nichol <fnichol@nichol.ca>
34
- class DriverDiscover < Kitchen::Command::Base
35
- # Invoke the command.
36
- def call
37
- # We are introducing the idea of using the Chef configuration as a
38
- # unified config for all the ChefDK tools. The first practical
39
- # implementation of this is 1 location to setup proxy configurations.
40
- if defined?(ChefConfig::WorkstationConfigLoader)
41
- ChefConfig::WorkstationConfigLoader.new(options[:chef_config_path]).load
42
- end
43
- ChefConfig::Config.export_proxies if defined?(ChefConfig::Config.export_proxies)
44
-
45
- specs = fetch_gem_specs.sort_by { |spec| spec[0] }
46
- specs = specs[0, 49].push(["...", "..."]) if specs.size > 49
47
- specs = specs.unshift(["Gem Name", "Latest Stable Release"])
48
- print_table(specs, indent: 4)
49
- end
50
-
51
- private
52
-
53
- # Fetches Kitchen-related RubyGems and returns an array of name/version
54
- # tuples.
55
- #
56
- # @return [Array<Array>] an array of name/version tuples
57
- # @api private
58
- def fetch_gem_specs
59
- req = Gem::Requirement.default
60
- dep = Gem::Deprecate.skip_during do
61
- Gem::Dependency.new(/kitchen-/i, req)
62
- end
63
- fetcher = Gem::SpecFetcher.fetcher
64
-
65
- if fetcher.respond_to?(:find_matching)
66
- fetch_gem_specs_pre_rubygems_2(fetcher, dep)
67
- else
68
- fetch_gem_specs_post_rubygems_2(fetcher, dep)
69
- end
70
- end
71
-
72
- # Fetches gem specs for RubyGems 2 and later.
73
- #
74
- # @param fetcher [Gem::SpecFetcher] a gemspec fetcher
75
- # @param dep [Gem::Dependency] a gem dependency object
76
- # @return [Array<Array>] an array of name/version tuples
77
- # @api private
78
- def fetch_gem_specs_post_rubygems_2(fetcher, dep)
79
- specs = fetcher.spec_for_dependency(dep, false)
80
- specs.first.map { |t| [t.first.name, t.first.version] }
81
- end
82
-
83
- # Fetches gem specs for pre-RubyGems 2.
84
- #
85
- # @param fetcher [Gem::SpecFetcher] a gemspec fetcher
86
- # @param dep [Gem::Dependency] a gem dependency object
87
- # @return [Array<Array>] an array of name/version tuples
88
- # @api private
89
- def fetch_gem_specs_pre_rubygems_2(fetcher, dep)
90
- specs = fetcher.find_matching(dep, false, false, false)
91
- specs.map(&:first).map { |t| t[0, 2] }
92
- end
93
-
94
- # Print out a display table.
95
- #
96
- # @api private
97
- def print_table(*args)
98
- shell.print_table(*args)
99
- end
100
- end
101
- end
102
- end