test-kitchen 1.0.0.alpha.0 → 1.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +9 -0
- data/CHANGELOG.md +35 -0
- data/Rakefile +11 -8
- data/features/kitchen_command.feature +15 -0
- data/features/kitchen_driver_discover_command.feature +19 -0
- data/features/kitchen_init_command.feature +110 -0
- data/features/step_definitions/gem_steps.rb +26 -0
- data/features/support/env.rb +26 -1
- data/lib/kitchen/cli.rb +88 -313
- data/lib/kitchen/driver.rb +4 -2
- data/lib/kitchen/driver/base.rb +33 -9
- data/lib/kitchen/driver/ssh_base.rb +3 -3
- data/lib/kitchen/generator/init.rb +196 -0
- data/lib/kitchen/generator/new_plugin.rb +190 -0
- data/lib/kitchen/instance.rb +6 -3
- data/lib/kitchen/loader/yaml.rb +1 -1
- data/lib/kitchen/shell_out.rb +38 -8
- data/lib/kitchen/state_file.rb +1 -1
- data/lib/kitchen/version.rb +1 -1
- data/spec/kitchen/config_spec.rb +2 -1
- data/spec/kitchen/state_file_spec.rb +1 -1
- metadata +13 -6
- data/features/cli.feature +0 -17
- data/features/cli_init.feature +0 -156
data/lib/kitchen/instance.rb
CHANGED
@@ -184,12 +184,15 @@ module Kitchen
|
|
184
184
|
#
|
185
185
|
# **Note** This method calls exec and will not return.
|
186
186
|
#
|
187
|
+
# @see Driver::LoginCommand
|
187
188
|
# @see Driver::Base#login_command
|
188
189
|
def login
|
189
|
-
|
190
|
+
login_command = driver.login_command(state_file.read)
|
191
|
+
command, *args = login_command.cmd_array
|
192
|
+
options = login_command.options
|
190
193
|
|
191
|
-
debug("Login command: #{command} #{args.join(' ')}")
|
192
|
-
Kernel.exec(command, *args)
|
194
|
+
debug("Login command: #{command} #{args.join(' ')} (Options: #{options})")
|
195
|
+
Kernel.exec(command, *args, options)
|
193
196
|
end
|
194
197
|
|
195
198
|
def last_action
|
data/lib/kitchen/loader/yaml.rb
CHANGED
data/lib/kitchen/shell_out.rb
CHANGED
@@ -32,20 +32,43 @@ module Kitchen
|
|
32
32
|
# Executes a command in a subshell on the local running system.
|
33
33
|
#
|
34
34
|
# @param cmd [String] command to be executed locally
|
35
|
-
# @param
|
36
|
-
# @
|
37
|
-
#
|
35
|
+
# @param options [Hash] additional configuration of command
|
36
|
+
# @option options [TrueClass, FalseClass] :use_sudo whether or not to use
|
37
|
+
# sudo
|
38
|
+
# @option options [String] :log_subject used in the output or log header
|
39
|
+
# for clarity and context. Default is "local".
|
40
|
+
# @option options [TrueClass, FalseClass] :quiet whether or not to echo
|
41
|
+
# logging commands. Default is false.
|
42
|
+
# @option options [String] :cwd the directory to chdir to before running
|
43
|
+
# the command
|
44
|
+
# @option options [Hash] :environment a Hash of environment variables to
|
45
|
+
# set before the command is run. By default, the environment will
|
46
|
+
# *always* be set to 'LC_ALL' => 'C' to prevent issues with multibyte
|
47
|
+
# characters in Ruby 1.8. To avoid this, use :environment => nil for
|
48
|
+
# *no* extra environment settings, or
|
49
|
+
# :environment => {'LC_ALL'=>nil, ...} to set other environment settings
|
50
|
+
# without changing the locale.
|
51
|
+
# @option options [Integer] :timeout Numeric value for the number of
|
52
|
+
# seconds to wait on the child process before raising an Exception.
|
53
|
+
# This is calculated as the total amount of time that ShellOut waited on
|
54
|
+
# the child process without receiving any output (i.e., IO.select
|
55
|
+
# returned nil). Default is 60000 seconds. Note: the stdlib Timeout
|
56
|
+
# library is not used.
|
57
|
+
# @return [String] the standard output of the command as a String
|
38
58
|
# @raise [ShellCommandFailed] if the command fails
|
39
59
|
# @raise [Error] for all other unexpected exceptions
|
40
|
-
def run_command(cmd,
|
60
|
+
def run_command(cmd, options = {})
|
61
|
+
use_sudo = options[:use_sudo].nil? ? false : options[:use_sudo]
|
62
|
+
quiet = options[:quiet]
|
41
63
|
cmd = "sudo #{cmd}" if use_sudo
|
42
|
-
subject = "[#{log_subject} command]"
|
64
|
+
subject = "[#{options[:log_subject] || "local"} command]"
|
43
65
|
|
44
|
-
info("#{subject} BEGIN (#{display_cmd(cmd)})")
|
45
|
-
sh = Mixlib::ShellOut.new(cmd,
|
66
|
+
info("#{subject} BEGIN (#{display_cmd(cmd)})") unless quiet
|
67
|
+
sh = Mixlib::ShellOut.new(cmd, shell_opts(options))
|
46
68
|
sh.run_command
|
47
|
-
info("#{subject} END #{Util.duration(sh.execution_time)}")
|
69
|
+
info("#{subject} END #{Util.duration(sh.execution_time)}") unless quiet
|
48
70
|
sh.error!
|
71
|
+
sh.stdout
|
49
72
|
rescue Mixlib::ShellOut::ShellCommandFailed => ex
|
50
73
|
raise ShellCommandFailed, ex.message
|
51
74
|
rescue Exception => error
|
@@ -61,5 +84,12 @@ module Kitchen
|
|
61
84
|
|
62
85
|
newline == "\n" ? "#{first_line}\\n...#{last_char}" : cmd
|
63
86
|
end
|
87
|
+
|
88
|
+
def shell_opts(options)
|
89
|
+
filtered_opts = options.reject do |key, value|
|
90
|
+
[:use_sudo, :log_subject, :quiet].include?(key)
|
91
|
+
end
|
92
|
+
{ :live_stream => logger, :timeout => 60000 }.merge(filtered_opts)
|
93
|
+
end
|
64
94
|
end
|
65
95
|
end
|
data/lib/kitchen/state_file.rb
CHANGED
data/lib/kitchen/version.rb
CHANGED
data/spec/kitchen/config_spec.rb
CHANGED
@@ -148,7 +148,8 @@ describe Kitchen::Config do
|
|
148
148
|
]
|
149
149
|
})
|
150
150
|
config.instances.size.must_equal 5
|
151
|
-
config.instances.map { |i| i.name }
|
151
|
+
instance_names = config.instances.map { |i| i.name }
|
152
|
+
instance_names.must_equal %w{s1-p1 s1-p2 s2-p1 s2-p2 s3-p2}
|
152
153
|
end
|
153
154
|
|
154
155
|
it "returns an instance containing a driver instance" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-kitchen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.alpha.
|
4
|
+
version: 1.0.0.alpha.1
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: celluloid
|
@@ -326,14 +326,17 @@ files:
|
|
326
326
|
- .gitignore
|
327
327
|
- .travis.yml
|
328
328
|
- .yardopts
|
329
|
+
- CHANGELOG.md
|
329
330
|
- Gemfile
|
330
331
|
- Guardfile
|
331
332
|
- LICENSE
|
332
333
|
- README.md
|
333
334
|
- Rakefile
|
334
335
|
- bin/kitchen
|
335
|
-
- features/
|
336
|
-
- features/
|
336
|
+
- features/kitchen_command.feature
|
337
|
+
- features/kitchen_driver_discover_command.feature
|
338
|
+
- features/kitchen_init_command.feature
|
339
|
+
- features/step_definitions/gem_steps.rb
|
337
340
|
- features/support/env.rb
|
338
341
|
- lib/kitchen.rb
|
339
342
|
- lib/kitchen/busser.rb
|
@@ -347,6 +350,8 @@ files:
|
|
347
350
|
- lib/kitchen/driver/dummy.rb
|
348
351
|
- lib/kitchen/driver/ssh_base.rb
|
349
352
|
- lib/kitchen/errors.rb
|
353
|
+
- lib/kitchen/generator/init.rb
|
354
|
+
- lib/kitchen/generator/new_plugin.rb
|
350
355
|
- lib/kitchen/instance.rb
|
351
356
|
- lib/kitchen/instance_actor.rb
|
352
357
|
- lib/kitchen/loader/yaml.rb
|
@@ -407,8 +412,10 @@ signing_key:
|
|
407
412
|
specification_version: 3
|
408
413
|
summary: A Chef convergence integration test harness
|
409
414
|
test_files:
|
410
|
-
- features/
|
411
|
-
- features/
|
415
|
+
- features/kitchen_command.feature
|
416
|
+
- features/kitchen_driver_discover_command.feature
|
417
|
+
- features/kitchen_init_command.feature
|
418
|
+
- features/step_definitions/gem_steps.rb
|
412
419
|
- features/support/env.rb
|
413
420
|
- spec/kitchen/collection_spec.rb
|
414
421
|
- spec/kitchen/color_spec.rb
|
data/features/cli.feature
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
Feature: Ensure that the Command Line Interface works as designed
|
2
|
-
In order to test code via CLI
|
3
|
-
As an Operator
|
4
|
-
I want to run the CLI with different arguments
|
5
|
-
|
6
|
-
Scenario: Running the help command exits cleanly
|
7
|
-
When I successfully run `kitchen help`
|
8
|
-
Then the exit status should be 0
|
9
|
-
And the output should contain "kitchen console"
|
10
|
-
And a file named ".kitchen/logs/kitchen.log" should exist
|
11
|
-
|
12
|
-
Scenario: Show the version number
|
13
|
-
When I successfully run `kitchen version`
|
14
|
-
Then the exit status should be 0
|
15
|
-
|
16
|
-
|
17
|
-
|
data/features/cli_init.feature
DELETED
@@ -1,156 +0,0 @@
|
|
1
|
-
Feature: Ensure that the Command Line Interface init creates the correct files
|
2
|
-
In order to initialize an un-Kitchenified cookbook
|
3
|
-
As an Operator
|
4
|
-
I want to initialize a cookbook
|
5
|
-
|
6
|
-
|
7
|
-
@ok
|
8
|
-
Scenario: Basic init with no extras succeeds
|
9
|
-
When I run `kitchen init` interactively
|
10
|
-
And I type "n"
|
11
|
-
Then the exit status should be 0
|
12
|
-
And a directory named ".kitchen" should exist
|
13
|
-
And a directory named "test/integration/default" should exist
|
14
|
-
And the file ".gitignore" should contain:
|
15
|
-
"""
|
16
|
-
.kitchen/
|
17
|
-
.kitchen.local.yml
|
18
|
-
"""
|
19
|
-
And the file ".kitchen.yml" should contain:
|
20
|
-
"""
|
21
|
-
---
|
22
|
-
driver_plugin: vagrant
|
23
|
-
platforms:
|
24
|
-
- name: ubuntu-12.04
|
25
|
-
driver_config:
|
26
|
-
box: opscode-ubuntu-12.04
|
27
|
-
box_url: https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-ubuntu-12.04.box
|
28
|
-
run_list:
|
29
|
-
- recipe[apt]
|
30
|
-
- name: ubuntu-10.04
|
31
|
-
driver_config:
|
32
|
-
box: opscode-ubuntu-10.04
|
33
|
-
box_url: https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-ubuntu-10.04.box
|
34
|
-
run_list:
|
35
|
-
- recipe[apt]
|
36
|
-
- name: centos-6.3
|
37
|
-
driver_config:
|
38
|
-
box: opscode-centos-6.3
|
39
|
-
box_url: https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-centos-6.3.box
|
40
|
-
run_list:
|
41
|
-
- recipe[yum::epel]
|
42
|
-
- name: centos-5.8
|
43
|
-
driver_config:
|
44
|
-
box: opscode-centos-5.8
|
45
|
-
box_url: https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-centos-5.8.box
|
46
|
-
run_list:
|
47
|
-
- recipe[yum::epel]
|
48
|
-
suites:
|
49
|
-
- name: default
|
50
|
-
run_list: []
|
51
|
-
attributes: {}
|
52
|
-
"""
|
53
|
-
And a file named "Gemfile" should not exist
|
54
|
-
And a file named "Rakefile" should not exist
|
55
|
-
And a file named "Thorfile" should not exist
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
@ok
|
60
|
-
Scenario: Running with a Rakefile file appends Kitchen tasks
|
61
|
-
Given an empty file named "Rakefile"
|
62
|
-
When I run `kitchen init` interactively
|
63
|
-
And I type "n"
|
64
|
-
Then the exit status should be 0
|
65
|
-
And the file "Rakefile" should contain exactly:
|
66
|
-
"""
|
67
|
-
|
68
|
-
begin
|
69
|
-
require 'kitchen/rake_tasks'
|
70
|
-
Kitchen::RakeTasks.new
|
71
|
-
rescue LoadError
|
72
|
-
puts ">>>>> Kitchen gem not loaded, omitting tasks" unless ENV['CI']
|
73
|
-
end
|
74
|
-
|
75
|
-
"""
|
76
|
-
|
77
|
-
|
78
|
-
@ok
|
79
|
-
Scenario: Running with a Thorfile file appends Kitchen tasks
|
80
|
-
Given an empty file named "Thorfile"
|
81
|
-
When I run `kitchen init` interactively
|
82
|
-
And I type "n"
|
83
|
-
Then the exit status should be 0
|
84
|
-
And the file "Thorfile" should contain exactly:
|
85
|
-
"""
|
86
|
-
|
87
|
-
begin
|
88
|
-
require 'kitchen/thor_tasks'
|
89
|
-
Kitchen::ThorTasks.new
|
90
|
-
rescue LoadError
|
91
|
-
puts ">>>>> Kitchen gem not loaded, omitting tasks" unless ENV['CI']
|
92
|
-
end
|
93
|
-
|
94
|
-
"""
|
95
|
-
|
96
|
-
|
97
|
-
@ok
|
98
|
-
Scenario: Listing the drivers provides correct output, does not write Gemfile
|
99
|
-
When I run `kitchen init` interactively
|
100
|
-
And I type "y"
|
101
|
-
And I type "list"
|
102
|
-
And I type "skip"
|
103
|
-
Then the exit status should be 0
|
104
|
-
And a file named ".kitchen.yml" should exist
|
105
|
-
And a directory named ".kitchen" should exist
|
106
|
-
And a file named "Gemfile" should not exist
|
107
|
-
|
108
|
-
|
109
|
-
@ok
|
110
|
-
Scenario: Running the init command without a Gemfile provides warning and fails
|
111
|
-
When I run `kitchen init` interactively
|
112
|
-
And I type "y"
|
113
|
-
And I type "kitchen-vagrant"
|
114
|
-
And the output should contain "You do not have an existing Gemfile"
|
115
|
-
Then the exit status should be 1
|
116
|
-
|
117
|
-
|
118
|
-
@ok
|
119
|
-
Scenario: Running the init command succeeds
|
120
|
-
Given an empty file named "Gemfile"
|
121
|
-
When I run `kitchen init` interactively
|
122
|
-
And I type "y"
|
123
|
-
And I type "kitchen-vagrant"
|
124
|
-
Then the exit status should be 0
|
125
|
-
And the output should contain "You must run `bundle install' to fetch any new gems."
|
126
|
-
And a file named ".kitchen.yml" should exist
|
127
|
-
And a file named ".gitignore" should exist
|
128
|
-
And the file "Gemfile" should contain "gem 'kitchen-vagrant', :group => :integration"
|
129
|
-
|
130
|
-
|
131
|
-
@ok
|
132
|
-
Scenario: Running init with a correct metadata.rb works
|
133
|
-
Given a file named "metadata.rb" with:
|
134
|
-
"""
|
135
|
-
name "ntp"
|
136
|
-
license "Apache 2.0"
|
137
|
-
description "Installs and configures ntp as a client or server"
|
138
|
-
version "0.1.0"
|
139
|
-
recipe "ntp", "Installs and configures ntp either as a server or client"
|
140
|
-
|
141
|
-
%w{ ubuntu debian redhat centos fedora scientific amazon oracle freebsd }.each do |os|
|
142
|
-
supports os
|
143
|
-
end
|
144
|
-
"""
|
145
|
-
When I run `kitchen init` interactively
|
146
|
-
And I type "n"
|
147
|
-
Then the exit status should be 0
|
148
|
-
And the file ".kitchen.yml" should contain:
|
149
|
-
"""
|
150
|
-
suites:
|
151
|
-
- name: default
|
152
|
-
run_list:
|
153
|
-
- recipe[ntp]
|
154
|
-
attributes: {}
|
155
|
-
"""
|
156
|
-
|