test-kitchen 0.7.0 → 1.0.0.alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +20 -0
- data/.travis.yml +11 -0
- data/.yardopts +3 -0
- data/Gemfile +13 -0
- data/Guardfile +11 -0
- data/LICENSE +15 -0
- data/README.md +131 -0
- data/Rakefile +69 -0
- data/bin/kitchen +9 -4
- data/features/cli.feature +17 -0
- data/features/cli_init.feature +156 -0
- data/features/support/env.rb +14 -0
- data/lib/kitchen/busser.rb +166 -0
- data/lib/kitchen/chef_data_uploader.rb +156 -0
- data/lib/kitchen/cli.rb +540 -0
- data/lib/kitchen/collection.rb +55 -0
- data/lib/kitchen/color.rb +46 -0
- data/lib/kitchen/config.rb +223 -0
- data/lib/kitchen/driver/base.rb +180 -0
- data/lib/kitchen/driver/dummy.rb +81 -0
- data/lib/kitchen/driver/ssh_base.rb +192 -0
- data/lib/kitchen/driver.rb +42 -0
- data/lib/kitchen/errors.rb +52 -0
- data/lib/kitchen/instance.rb +327 -0
- data/lib/kitchen/instance_actor.rb +42 -0
- data/lib/kitchen/loader/yaml.rb +105 -0
- data/lib/kitchen/logger.rb +145 -0
- data/{cookbooks/test-kitchen/libraries/helpers.rb → lib/kitchen/logging.rb} +13 -9
- data/lib/kitchen/manager.rb +45 -0
- data/lib/kitchen/metadata_chopper.rb +52 -0
- data/lib/kitchen/platform.rb +61 -0
- data/lib/kitchen/rake_tasks.rb +59 -0
- data/lib/kitchen/shell_out.rb +65 -0
- data/lib/kitchen/state_file.rb +88 -0
- data/lib/kitchen/suite.rb +76 -0
- data/lib/kitchen/thor_tasks.rb +62 -0
- data/lib/kitchen/util.rb +79 -0
- data/{cookbooks/test-kitchen/recipes/erlang.rb → lib/kitchen/version.rb} +9 -6
- data/lib/kitchen.rb +98 -0
- data/lib/vendor/hash_recursive_merge.rb +74 -0
- data/spec/kitchen/collection_spec.rb +80 -0
- data/spec/kitchen/color_spec.rb +54 -0
- data/spec/kitchen/config_spec.rb +201 -0
- data/spec/kitchen/driver/dummy_spec.rb +191 -0
- data/spec/kitchen/instance_spec.rb +162 -0
- data/spec/kitchen/loader/yaml_spec.rb +243 -0
- data/spec/kitchen/platform_spec.rb +48 -0
- data/spec/kitchen/state_file_spec.rb +122 -0
- data/spec/kitchen/suite_spec.rb +64 -0
- data/spec/spec_helper.rb +47 -0
- data/templates/plugin/driver.rb.erb +23 -0
- data/templates/plugin/license_apachev2.erb +15 -0
- data/templates/plugin/license_gplv2.erb +18 -0
- data/templates/plugin/license_gplv3.erb +16 -0
- data/templates/plugin/license_mit.erb +22 -0
- data/templates/plugin/license_reserved.erb +5 -0
- data/templates/plugin/version.rb.erb +12 -0
- data/test-kitchen.gemspec +44 -0
- metadata +290 -82
- data/config/Cheffile +0 -47
- data/config/Kitchenfile +0 -39
- data/config/Vagrantfile +0 -114
- data/cookbooks/test-kitchen/attributes/default.rb +0 -25
- data/cookbooks/test-kitchen/metadata.rb +0 -27
- data/cookbooks/test-kitchen/recipes/chef.rb +0 -19
- data/cookbooks/test-kitchen/recipes/compat.rb +0 -39
- data/cookbooks/test-kitchen/recipes/default.rb +0 -51
- data/cookbooks/test-kitchen/recipes/ruby.rb +0 -29
- data/lib/test-kitchen/cli/destroy.rb +0 -36
- data/lib/test-kitchen/cli/init.rb +0 -37
- data/lib/test-kitchen/cli/platform_list.rb +0 -37
- data/lib/test-kitchen/cli/project_info.rb +0 -44
- data/lib/test-kitchen/cli/ssh.rb +0 -36
- data/lib/test-kitchen/cli/status.rb +0 -36
- data/lib/test-kitchen/cli/test.rb +0 -68
- data/lib/test-kitchen/cli.rb +0 -282
- data/lib/test-kitchen/dsl.rb +0 -63
- data/lib/test-kitchen/environment.rb +0 -166
- data/lib/test-kitchen/platform.rb +0 -79
- data/lib/test-kitchen/project/base.rb +0 -159
- data/lib/test-kitchen/project/cookbook.rb +0 -97
- data/lib/test-kitchen/project/cookbook_copy.rb +0 -58
- data/lib/test-kitchen/project/ruby.rb +0 -37
- data/lib/test-kitchen/project/supported_platforms.rb +0 -75
- data/lib/test-kitchen/project.rb +0 -23
- data/lib/test-kitchen/runner/base.rb +0 -154
- data/lib/test-kitchen/runner/openstack/dsl.rb +0 -39
- data/lib/test-kitchen/runner/openstack/environment.rb +0 -141
- data/lib/test-kitchen/runner/openstack.rb +0 -147
- data/lib/test-kitchen/runner/vagrant.rb +0 -95
- data/lib/test-kitchen/runner.rb +0 -21
- data/lib/test-kitchen/scaffold.rb +0 -88
- data/lib/test-kitchen/ui.rb +0 -73
- data/lib/test-kitchen/version.rb +0 -21
- data/lib/test-kitchen.rb +0 -34
@@ -1,159 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
require 'chef/mixin/params_validate'
|
20
|
-
|
21
|
-
module TestKitchen
|
22
|
-
module Project
|
23
|
-
class Base
|
24
|
-
include Chef::Mixin::ParamsValidate
|
25
|
-
|
26
|
-
PROJECT_ROOT_INDICATORS = ["Gemfile", "metadata.rb"]
|
27
|
-
|
28
|
-
attr_reader :name, :guest_source_root, :guest_test_root, :exclusions
|
29
|
-
attr_writer :language, :runtimes, :install, :script, :configurations, :root_path, :memory
|
30
|
-
attr_accessor :vm
|
31
|
-
|
32
|
-
def initialize(name, parent=nil, &block)
|
33
|
-
raise ArgumentError, "Project name must be specified" if name.nil? || name.empty?
|
34
|
-
@name = name
|
35
|
-
@parent = parent
|
36
|
-
@runtimes = parent.runtimes if parent
|
37
|
-
@configurations = {}
|
38
|
-
@exclusions = []
|
39
|
-
@guest_source_root = '/test-kitchen/source'
|
40
|
-
@guest_test_root = '/test-kitchen/test'
|
41
|
-
instance_eval(&block) if block_given?
|
42
|
-
end
|
43
|
-
|
44
|
-
def each_build(platforms, active_config=nil)
|
45
|
-
raise ArgumentError if platforms.nil? || ! block_given?
|
46
|
-
c = Array(active_config ?
|
47
|
-
configurations[active_config] : configurations.values)
|
48
|
-
platforms.to_a.product(c).each do |platform,configuration|
|
49
|
-
yield [platform, configuration] unless exclusions.any? do |e|
|
50
|
-
e[:platform] == platform.split('-').first &&
|
51
|
-
((! e[:configuration]) || e[:configuration] == configuration.name)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def configuration(name, &block)
|
57
|
-
@configurations[name] = self.class.new(name, self, &block)
|
58
|
-
end
|
59
|
-
|
60
|
-
def configurations
|
61
|
-
@configurations.empty? ? {:default => self} : @configurations
|
62
|
-
end
|
63
|
-
|
64
|
-
def tests_tag
|
65
|
-
@parent.nil? ? 'default' : name
|
66
|
-
end
|
67
|
-
|
68
|
-
def exclude(exclusion)
|
69
|
-
@exclusions << exclusion
|
70
|
-
end
|
71
|
-
|
72
|
-
def run_list
|
73
|
-
['test-kitchen::default'] + run_list_extras
|
74
|
-
end
|
75
|
-
|
76
|
-
def run_list_extras(arg=nil)
|
77
|
-
set_or_return(:run_list_extras, arg, :default => [])
|
78
|
-
end
|
79
|
-
|
80
|
-
def runner(arg=nil)
|
81
|
-
set_or_return(:runner, arg, nil)
|
82
|
-
end
|
83
|
-
|
84
|
-
def language(arg=nil)
|
85
|
-
set_or_return(:language, arg, :default => 'ruby')
|
86
|
-
end
|
87
|
-
|
88
|
-
def runtimes(arg=nil)
|
89
|
-
set_or_return(:runtimes, arg, :default => [])
|
90
|
-
end
|
91
|
-
|
92
|
-
def install(arg=nil)
|
93
|
-
set_or_return(:install, arg,
|
94
|
-
:default => language == 'ruby' ? 'bundle install' : '')
|
95
|
-
end
|
96
|
-
|
97
|
-
def script(arg=nil)
|
98
|
-
set_or_return(:script, arg, :default => 'rspec spec')
|
99
|
-
end
|
100
|
-
|
101
|
-
def memory(arg=nil)
|
102
|
-
set_or_return(:memory, arg, {})
|
103
|
-
end
|
104
|
-
|
105
|
-
def specs(arg=nil)
|
106
|
-
set_or_return(:specs, arg, {:default => true})
|
107
|
-
end
|
108
|
-
|
109
|
-
def features(arg=nil)
|
110
|
-
set_or_return(:features, arg, {:default => true})
|
111
|
-
end
|
112
|
-
|
113
|
-
def root_path
|
114
|
-
return @root_path if defined?(@root_path)
|
115
|
-
|
116
|
-
root_finder = lambda do |path|
|
117
|
-
found = PROJECT_ROOT_INDICATORS.find do |rootfile|
|
118
|
-
File.exist?(File.join(path.to_s, rootfile))
|
119
|
-
end
|
120
|
-
|
121
|
-
return path if found
|
122
|
-
return nil if path.root? || !File.exist?(path)
|
123
|
-
root_finder.call(path.parent)
|
124
|
-
end
|
125
|
-
|
126
|
-
@root_path = root_finder.call(Pathname.new(Dir.pwd))
|
127
|
-
end
|
128
|
-
|
129
|
-
def update_code_command
|
130
|
-
"rsync -aHv --update --progress --checksum #{guest_source_root}/ #{guest_test_root}"
|
131
|
-
end
|
132
|
-
|
133
|
-
def preflight_command
|
134
|
-
nil
|
135
|
-
end
|
136
|
-
|
137
|
-
def data_bags_path
|
138
|
-
nil
|
139
|
-
end
|
140
|
-
|
141
|
-
def install_command(runtime=nil)
|
142
|
-
raise NotImplementedError
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_command(runtime=nil)
|
146
|
-
raise NotImplementedError
|
147
|
-
end
|
148
|
-
|
149
|
-
def to_hash
|
150
|
-
self.runtimes # hack
|
151
|
-
hash = {}
|
152
|
-
self.instance_variables.each do |var|
|
153
|
-
hash[var[1..-1].to_sym] = self.instance_variable_get(var)
|
154
|
-
end
|
155
|
-
hash
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
module TestKitchen
|
20
|
-
module Project
|
21
|
-
class Cookbook < Ruby
|
22
|
-
|
23
|
-
include CookbookCopy
|
24
|
-
include SupportedPlatforms
|
25
|
-
|
26
|
-
attr_writer :lint
|
27
|
-
attr_writer :supported_platforms
|
28
|
-
attr_writer :data_bags_path
|
29
|
-
|
30
|
-
def lint(arg=nil)
|
31
|
-
set_or_return(:lint, arg, {:default => true})
|
32
|
-
end
|
33
|
-
|
34
|
-
def run_list
|
35
|
-
super + ['recipe[minitest-handler]']
|
36
|
-
end
|
37
|
-
|
38
|
-
def preflight_command(cmd = nil)
|
39
|
-
return nil unless lint
|
40
|
-
parent_dir = File.join(root_path, '..')
|
41
|
-
ignore_tags = ''
|
42
|
-
if lint.respond_to?(:has_key?) && lint[:ignore].respond_to?(:join)
|
43
|
-
ignore_tags = " -t ~#{lint[:ignore].join(' -t ~')}"
|
44
|
-
end
|
45
|
-
set_or_return(:preflight_command, cmd, :default =>
|
46
|
-
"knife cookbook test -o #{parent_dir} #{name}" +
|
47
|
-
" && foodcritic -f ~FC007 -f correctness#{ignore_tags} #{root_path}")
|
48
|
-
end
|
49
|
-
|
50
|
-
def data_bags_path(path = nil)
|
51
|
-
set_or_return(:data_bags_path, path,
|
52
|
-
{ :default => root_path.join('test/kitchen/data_bags').to_s })
|
53
|
-
end
|
54
|
-
|
55
|
-
def script(arg=nil)
|
56
|
-
set_or_return(:script, arg, :default =>
|
57
|
-
%Q{if [ -d "features" ]; then bundle exec cucumber -t @#{tests_tag} features; fi})
|
58
|
-
end
|
59
|
-
|
60
|
-
def install_command(runtime=nil)
|
61
|
-
super(runtime, File.join(guest_test_root, 'test'))
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_command(runtime=nil)
|
65
|
-
super(runtime, File.join(guest_test_root, 'test'))
|
66
|
-
end
|
67
|
-
|
68
|
-
def supported_platforms
|
69
|
-
@supported_platforms ||= extract_supported_platforms(
|
70
|
-
File.read(File.join(root_path, 'metadata.rb')))
|
71
|
-
end
|
72
|
-
|
73
|
-
def non_buildable_platforms(platform_names)
|
74
|
-
supported_platforms.sort - platform_names.map do |platform|
|
75
|
-
platform.split('-').first
|
76
|
-
end.sort.uniq
|
77
|
-
end
|
78
|
-
|
79
|
-
def each_build(platforms, active_config=nil, &block)
|
80
|
-
if supported_platforms.empty?
|
81
|
-
super(platforms, active_config, &block)
|
82
|
-
else
|
83
|
-
super(platforms.select do |platform|
|
84
|
-
supported_platforms.any? do |supported|
|
85
|
-
platform.start_with?("#{supported}-")
|
86
|
-
end
|
87
|
-
end, active_config, &block)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def cookbook_path(root_path, tmp_path)
|
92
|
-
@cookbook_path ||= copy_cookbook_under_test(root_path, tmp_path)
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Andrew Crump (<andrew@kotirisoftware.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
module TestKitchen
|
20
|
-
module Project
|
21
|
-
module CookbookCopy
|
22
|
-
|
23
|
-
# This is a workaround to allow the top-level containing cookbook
|
24
|
-
# to be copied to the kitchen tmp subdirectory.
|
25
|
-
def copy_cookbook_under_test(root_path, tmp_path)
|
26
|
-
cookbook_path = root_path.parent.parent
|
27
|
-
source_paths = source_paths_excluding_test_dir(cookbook_path)
|
28
|
-
dest_path = File.join(tmp_path, 'cookbook_under_test')
|
29
|
-
copy_paths(source_paths, dest_path,
|
30
|
-
destination_paths(cookbook_path, source_paths, dest_path))
|
31
|
-
dest_path
|
32
|
-
end
|
33
|
-
|
34
|
-
def source_paths_excluding_test_dir(cookbook_path)
|
35
|
-
paths_from = Find.find(cookbook_path).reject do |path|
|
36
|
-
Find.prune if ['.git', 'test'].map do |dir|
|
37
|
-
File.join(cookbook_path, dir)
|
38
|
-
end.include?(path)
|
39
|
-
end.drop(1)
|
40
|
-
end
|
41
|
-
|
42
|
-
def destination_paths(cookbook_path, paths_from, dest_path)
|
43
|
-
paths_from.map do |file|
|
44
|
-
File.join(dest_path,
|
45
|
-
file.to_s.sub(%r{^#{Regexp.escape(cookbook_path.to_s)}/}, ''))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def copy_paths(source_paths, dest_path, dest_paths)
|
50
|
-
FileUtils.mkdir_p(dest_path)
|
51
|
-
source_paths.each_with_index do |from_path, index|
|
52
|
-
FileUtils.cp_r(from_path, dest_paths[index])
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
module TestKitchen
|
20
|
-
module Project
|
21
|
-
class Ruby < Base
|
22
|
-
|
23
|
-
def install_command(runtime=nil, test_path=guest_test_root)
|
24
|
-
cmd = "cd #{test_path}"
|
25
|
-
cmd << " && rvm use #{runtime}" if runtime && ! runtime.empty?
|
26
|
-
cmd << " && gem install bundler"
|
27
|
-
cmd << " && #{install}"
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_command(runtime=nil, test_path=guest_test_root)
|
31
|
-
cmd = "cd #{test_path}"
|
32
|
-
cmd << " && rvm use #{runtime}" if runtime && ! runtime.empty?
|
33
|
-
cmd << " && #{script}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Andrew Crump (<andrew@kotirisoftware.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
module TestKitchen
|
20
|
-
module Project
|
21
|
-
module SupportedPlatforms
|
22
|
-
|
23
|
-
def extract_supported_platforms(metadata)
|
24
|
-
raise ArgumentError, "Metadata must be provided" unless metadata
|
25
|
-
ast = parse_ruby(metadata)
|
26
|
-
supports = find_nodes(ast, [:command]).reject do |command|
|
27
|
-
find_nodes(command, [:@ident, 'supports']).empty?
|
28
|
-
end
|
29
|
-
string_literals(supports) + word_list(ast, supports)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def parse_ruby(ruby_str)
|
35
|
-
Ripper::SexpBuilder.new(ruby_str).parse
|
36
|
-
end
|
37
|
-
|
38
|
-
def word_list(ast, nodes)
|
39
|
-
nodes.map do |node|
|
40
|
-
var_name = find_nodes(find_nodes(node, [:var_ref]), [:@ident]).flatten
|
41
|
-
if var_name.length > 1
|
42
|
-
add_block = find_nodes(ast, [:method_add_block]).reject do |n|
|
43
|
-
find_nodes(n, [:@ident, "supports"]).empty?
|
44
|
-
end
|
45
|
-
unless find_nodes(find_nodes(add_block, [:do_block]),
|
46
|
-
[:@ident, var_name[1]]).flatten.empty?
|
47
|
-
|
48
|
-
find_nodes(find_nodes(add_block,
|
49
|
-
[:qwords_add]), [:@tstring_content]).uniq.map do |str|
|
50
|
-
str[1] if str.length > 1
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end.flatten.compact
|
56
|
-
end
|
57
|
-
|
58
|
-
def string_literals(nodes)
|
59
|
-
nodes.map do |node|
|
60
|
-
tstring = find_nodes(node, [:@tstring_content]).find{|n| ! n.empty?}
|
61
|
-
tstring && tstring.length > 1 ? tstring[1] : nil
|
62
|
-
end.compact.flatten
|
63
|
-
end
|
64
|
-
|
65
|
-
def find_nodes(ast, node, result=[])
|
66
|
-
if ast.respond_to?(:each)
|
67
|
-
result << ast if ast.size > 1 and ast[0..(node.size - 1)] == node
|
68
|
-
ast.each { |child| find_nodes(child, node, result) }
|
69
|
-
end
|
70
|
-
result
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/lib/test-kitchen/project.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
require 'test-kitchen/project/base'
|
20
|
-
require 'test-kitchen/project/ruby'
|
21
|
-
require 'test-kitchen/project/supported_platforms'
|
22
|
-
require 'test-kitchen/project/cookbook_copy'
|
23
|
-
require 'test-kitchen/project/cookbook'
|
@@ -1,154 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2012 Opscode, 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
|
-
|
19
|
-
require 'librarian/chef/cli'
|
20
|
-
|
21
|
-
module TestKitchen
|
22
|
-
module Runner
|
23
|
-
class TestFailureError < StandardError; end
|
24
|
-
class Base
|
25
|
-
|
26
|
-
attr_accessor :platform
|
27
|
-
attr_accessor :configuration
|
28
|
-
attr_accessor :env
|
29
|
-
|
30
|
-
def initialize(env, options={})
|
31
|
-
raise ArgumentError, "Environment cannot be nil" if env.nil?
|
32
|
-
@env = env
|
33
|
-
@platform = options[:platform]
|
34
|
-
@configuration = options[:configuration]
|
35
|
-
end
|
36
|
-
|
37
|
-
def prepare
|
38
|
-
assemble_cookbooks!
|
39
|
-
end
|
40
|
-
|
41
|
-
def create
|
42
|
-
raise NotImplementedError
|
43
|
-
end
|
44
|
-
|
45
|
-
def converge
|
46
|
-
raise NotImplementedError
|
47
|
-
end
|
48
|
-
|
49
|
-
def run_list
|
50
|
-
['test-kitchen::default']
|
51
|
-
end
|
52
|
-
|
53
|
-
def preflight_check
|
54
|
-
if env.project.preflight_command
|
55
|
-
system(env.project.preflight_command)
|
56
|
-
unless $?.success?
|
57
|
-
env.ui.info('Your cookbook had lint failures.', :red)
|
58
|
-
exit $?.exitstatus
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def test
|
64
|
-
runtimes = configuration.runtimes
|
65
|
-
runtimes.each do |runtime|
|
66
|
-
message = "Synchronizing latest code from source root => test root."
|
67
|
-
execute_remote_command(platform, configuration.update_code_command, message)
|
68
|
-
|
69
|
-
message = "Updating dependencies for [#{configuration.name}]"
|
70
|
-
message << " under [#{runtime}]" if runtime
|
71
|
-
execute_remote_command(platform, configuration.install_command(runtime), message)
|
72
|
-
|
73
|
-
message = "Running tests for [#{configuration.name}]"
|
74
|
-
message << " under [#{runtime}]" if runtime
|
75
|
-
exit_code = execute_remote_command(platform, configuration.test_command(runtime), message)
|
76
|
-
raise TestFailureError unless exit_code == 0
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def status
|
81
|
-
raise NotImplementedError
|
82
|
-
end
|
83
|
-
|
84
|
-
def destroy
|
85
|
-
raise NotImplementedError
|
86
|
-
end
|
87
|
-
|
88
|
-
def ssh
|
89
|
-
raise NotImplementedError
|
90
|
-
end
|
91
|
-
|
92
|
-
def execute_remote_command(platform, command, mesage=nil)
|
93
|
-
raise NotImplementedError
|
94
|
-
end
|
95
|
-
|
96
|
-
def self.inherited(subclass)
|
97
|
-
key = subclass.to_s.split('::').last.downcase
|
98
|
-
Runner.targets[key] = subclass
|
99
|
-
end
|
100
|
-
|
101
|
-
protected
|
102
|
-
|
103
|
-
def assemble_cookbooks!
|
104
|
-
# dump out a meta Cheffile
|
105
|
-
env.create_tmp_file('Cheffile',
|
106
|
-
IO.read(TestKitchen.source_root.join('config', 'Cheffile')))
|
107
|
-
|
108
|
-
env.ui.info("Assembling required cookbooks at [#{env.tmp_path.join('cookbooks')}].", :yellow)
|
109
|
-
|
110
|
-
# The following is a programatic version of `librarian-chef install`
|
111
|
-
Librarian::Action::Clean.new(librarian_env).run
|
112
|
-
Librarian::Action::Resolve.new(librarian_env).run
|
113
|
-
Librarian::Action::Install.new(librarian_env).run
|
114
|
-
end
|
115
|
-
|
116
|
-
def librarian_env
|
117
|
-
@librarian_env ||= Librarian::Chef::Environment.new(:project_path => env.tmp_path)
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_recipe_name
|
121
|
-
["#{env.project.name}_test", env.project.name].map do |cookbook_name|
|
122
|
-
if cookbook_exists?(cookbook_name)
|
123
|
-
cookbook_name + '::' + (if ! configuration || env.project.name == configuration.name
|
124
|
-
'default'
|
125
|
-
else
|
126
|
-
configuration.name
|
127
|
-
end)
|
128
|
-
end
|
129
|
-
end.compact.first
|
130
|
-
end
|
131
|
-
|
132
|
-
def cookbook_exists?(name)
|
133
|
-
env.cookbook_paths.any?{|path| Dir.exists?(File.join(path, name)) }
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
def self.targets
|
139
|
-
@@targets ||= {}
|
140
|
-
end
|
141
|
-
|
142
|
-
def self.for_platform(env, options)
|
143
|
-
desired_platform = env.all_platforms[options[:platform]]
|
144
|
-
if desired_platform.box_url
|
145
|
-
TestKitchen::Runner.targets['vagrant'].new(env, options)
|
146
|
-
elsif desired_platform.image_id
|
147
|
-
TestKitchen::Runner.targets['openstack'].new(env, options)
|
148
|
-
else
|
149
|
-
raise ArgumentError,
|
150
|
-
"No runner available for platform: #{desired_platform.name}"
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'test-kitchen/runner/openstack/environment'
|
2
|
-
|
3
|
-
module TestKitchen
|
4
|
-
class Openstack
|
5
|
-
include Chef::Mixin::ParamsValidate
|
6
|
-
|
7
|
-
attr_writer :username, :password, :tenant, :auth_url
|
8
|
-
|
9
|
-
def initialize(&block)
|
10
|
-
instance_eval(&block) if block_given?
|
11
|
-
end
|
12
|
-
|
13
|
-
def username(arg=nil)
|
14
|
-
set_or_return(:username, arg, {})
|
15
|
-
end
|
16
|
-
|
17
|
-
def password(arg=nil)
|
18
|
-
set_or_return(:password, arg, {})
|
19
|
-
end
|
20
|
-
|
21
|
-
def tenant(arg=nil)
|
22
|
-
set_or_return(:tenant, arg, {})
|
23
|
-
end
|
24
|
-
|
25
|
-
def auth_url(arg=nil)
|
26
|
-
set_or_return(:auth_url, arg, {})
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module TestKitchen
|
32
|
-
module DSL
|
33
|
-
module BasicDSL
|
34
|
-
def openstack(&block)
|
35
|
-
TestKitchen::Environment::Openstack.config = TestKitchen::Openstack.new(&block)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|