cucumber-chef 2.0.7 → 2.1.0.rc.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.
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/bin/cc-knife +2 -5
- data/bin/cc-push +50 -26
- data/bin/cc-server +9 -10
- data/bin/cucumber-chef +65 -71
- data/chef_repo/cookbooks/cucumber-chef/attributes/default.rb +1 -1
- data/chef_repo/cookbooks/cucumber-chef/recipes/default.rb +1 -1
- data/chef_repo/cookbooks/cucumber-chef/recipes/lxc.rb +34 -36
- data/chef_repo/cookbooks/cucumber-chef/recipes/test_lab.rb +64 -47
- data/chef_repo/cookbooks/cucumber-chef/templates/default/solrconfig.erb +650 -0
- data/cucumber-chef.gemspec +5 -5
- data/lib/cucumber/chef/bootstrap.rb +10 -10
- data/lib/cucumber/chef/config.rb +15 -15
- data/lib/cucumber/chef/helpers/chef_client.rb +88 -14
- data/lib/cucumber/chef/helpers/chef_server.rb +39 -16
- data/lib/cucumber/chef/helpers/command.rb +28 -12
- data/lib/cucumber/chef/helpers/container.rb +29 -26
- data/lib/cucumber/chef/helpers/minitest.rb +1 -1
- data/lib/cucumber/chef/helpers/server.rb +37 -18
- data/lib/cucumber/chef/helpers/test_lab.rb +1 -1
- data/lib/cucumber/chef/helpers/utility.rb +23 -3
- data/lib/cucumber/chef/helpers.rb +10 -8
- data/lib/cucumber/chef/provisioner.rb +22 -21
- data/lib/cucumber/chef/steps/chef_steps.rb +1 -1
- data/lib/cucumber/chef/steps/minitest_steps.rb +3 -3
- data/lib/cucumber/chef/steps/provision_steps.rb +7 -6
- data/lib/cucumber/chef/steps/ssh_steps.rb +31 -2
- data/lib/cucumber/chef/steps.rb +1 -1
- data/lib/cucumber/chef/templates/cucumber/cc-hooks.rb +111 -0
- data/lib/cucumber/chef/templates/cucumber/env.rb +0 -87
- data/lib/cucumber/chef/templates/cucumber/readme-environments.erb +1 -0
- data/lib/cucumber/chef/templates/cucumber/readme-roles.erb +1 -1
- data/lib/cucumber/chef/templates/cucumber-chef/config-rb.erb +5 -0
- data/lib/cucumber/chef/test_lab.rb +70 -23
- data/lib/cucumber/chef/utility.rb +121 -31
- data/lib/cucumber/chef/version.rb +2 -2
- data/lib/cucumber/chef.rb +1 -1
- data/lib/cucumber-chef.rb +1 -1
- data/spec/cucumber/chef/config_spec.rb +1 -1
- data/spec/cucumber/chef/provisioner_spec.rb +1 -1
- data/spec/cucumber/chef/test_lab_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +8 -5
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -23,20 +23,14 @@ module Cucumber::Chef::Helpers::Server
|
|
23
23
|
|
24
24
|
################################################################################
|
25
25
|
|
26
|
-
def detect_arch(distro)
|
27
|
-
case distro.downcase
|
28
|
-
when "ubuntu" then
|
29
|
-
((RUBY_PLATFORM =~ /x86_64/) ? "amd64" : "i386")
|
30
|
-
when "fedora" then
|
31
|
-
((RUBY_PLATFORM =~ /x86_64/) ? "amd64" : "i686")
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
26
|
def server_create(name, attributes={})
|
36
27
|
if ((attributes[:persist] && @servers[name]) || (@servers[name] && @servers[name][:persist]))
|
37
28
|
attributes = @servers[name]
|
29
|
+
log("using existing attributes for container $#{name} #{server_tag(name)}$")
|
38
30
|
else
|
39
|
-
|
31
|
+
if (container_exists?(name) && (ENV['DESTROY'] == "1"))
|
32
|
+
server_destroy(name)
|
33
|
+
end
|
40
34
|
attributes = { :ip => generate_ip,
|
41
35
|
:mac => generate_mac,
|
42
36
|
:persist => true,
|
@@ -47,18 +41,26 @@ module Cucumber::Chef::Helpers::Server
|
|
47
41
|
@servers = (@servers || Hash.new(nil)).merge(name => attributes)
|
48
42
|
$current_server = @servers[name][:ip]
|
49
43
|
if !server_running?(name)
|
50
|
-
log(
|
44
|
+
log("please wait, creating container $#{name} #{server_tag(name)}$")
|
45
|
+
bm = ::Benchmark.realtime do
|
46
|
+
test_lab_config_dhcpd
|
47
|
+
container_config_network(name)
|
48
|
+
container_create(name, @servers[name][:distro], @servers[name][:release], @servers[name][:arch])
|
49
|
+
end
|
50
|
+
log("container $#{name}$ creation took %0.4f seconds" % bm)
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
bm = ::Benchmark.realtime do
|
53
|
+
ZTK::TCPSocketCheck.new(:host => @servers[name][:ip], :port => 22).wait
|
54
|
+
end
|
55
|
+
log("container $#{name}$ SSHD responded after %0.4f seconds" % bm)
|
56
|
+
else
|
57
|
+
log("container $#{name}$ is already running")
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
59
|
-
|
60
|
-
log(name, "is being destroyed") if @servers[name]
|
61
|
+
################################################################################
|
61
62
|
|
63
|
+
def server_destroy(name)
|
62
64
|
container_destroy(name)
|
63
65
|
end
|
64
66
|
|
@@ -74,6 +76,23 @@ module Cucumber::Chef::Helpers::Server
|
|
74
76
|
containers
|
75
77
|
end
|
76
78
|
|
79
|
+
################################################################################
|
80
|
+
|
81
|
+
def server_tag(name)
|
82
|
+
@servers[name].inspect.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
################################################################################
|
86
|
+
|
87
|
+
def detect_arch(distro)
|
88
|
+
case distro.downcase
|
89
|
+
when "ubuntu" then
|
90
|
+
((RUBY_PLATFORM =~ /x86_64/) ? "amd64" : "i386")
|
91
|
+
when "fedora" then
|
92
|
+
((RUBY_PLATFORM =~ /x86_64/) ? "amd64" : "i686")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
77
96
|
################################################################################
|
78
97
|
|
79
98
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -23,9 +23,29 @@ module Cucumber::Chef::Helpers::Utility
|
|
23
23
|
|
24
24
|
################################################################################
|
25
25
|
|
26
|
-
def log(
|
27
|
-
|
26
|
+
def log(message)
|
27
|
+
Cucumber::Chef.logger.info { message.gsub("$", "'") }
|
28
|
+
return if !(ENV['VERBOSE'] == "1")
|
29
|
+
|
30
|
+
pattern = [ "\033[0m\033[36m", "\033[1m" ]
|
31
|
+
|
32
|
+
result = [ " \033[0m\033[34m[\033[1mCC\033[0m\033[34m] \033[36m" ]
|
33
|
+
result << pattern.first
|
34
|
+
|
35
|
+
sanity = message.split('').count{ |z| (z == "$") }
|
36
|
+
raise "You have a log message with an odd number of highlight markup characters! '#{message}' -> (sanity=#{sanity.inspect}) " if (sanity.modulo(2) != 0)
|
37
|
+
|
38
|
+
chunks = message.split("$")
|
39
|
+
chunks.each_with_index do |chunk, index|
|
40
|
+
result << pattern[index.modulo(pattern.length)]
|
41
|
+
result << chunk
|
42
|
+
end
|
43
|
+
result << "\033[0m"
|
44
|
+
|
45
|
+
STDOUT.puts(result.join)
|
28
46
|
STDOUT.flush if STDOUT.respond_to?(:flush)
|
47
|
+
|
48
|
+
true
|
29
49
|
end
|
30
50
|
|
31
51
|
################################################################################
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -26,6 +26,8 @@ module Cucumber
|
|
26
26
|
# definitions.
|
27
27
|
module Helpers
|
28
28
|
|
29
|
+
require 'benchmark'
|
30
|
+
|
29
31
|
require 'cucumber/chef/helpers/chef_client'
|
30
32
|
require 'cucumber/chef/helpers/chef_server'
|
31
33
|
require 'cucumber/chef/helpers/command'
|
@@ -35,13 +37,13 @@ module Cucumber
|
|
35
37
|
require 'cucumber/chef/helpers/utility'
|
36
38
|
|
37
39
|
def self.included(base)
|
38
|
-
base.send(:include, Cucumber::Chef::Helpers::ChefClient)
|
39
|
-
base.send(:include, Cucumber::Chef::Helpers::ChefServer)
|
40
|
-
base.send(:include, Cucumber::Chef::Helpers::Command)
|
41
|
-
base.send(:include, Cucumber::Chef::Helpers::Container)
|
42
|
-
base.send(:include, Cucumber::Chef::Helpers::Server)
|
43
|
-
base.send(:include, Cucumber::Chef::Helpers::TestLab)
|
44
|
-
base.send(:include, Cucumber::Chef::Helpers::Utility)
|
40
|
+
base.send(:include, ::Cucumber::Chef::Helpers::ChefClient)
|
41
|
+
base.send(:include, ::Cucumber::Chef::Helpers::ChefServer)
|
42
|
+
base.send(:include, ::Cucumber::Chef::Helpers::Command)
|
43
|
+
base.send(:include, ::Cucumber::Chef::Helpers::Container)
|
44
|
+
base.send(:include, ::Cucumber::Chef::Helpers::Server)
|
45
|
+
base.send(:include, ::Cucumber::Chef::Helpers::TestLab)
|
46
|
+
base.send(:include, ::Cucumber::Chef::Helpers::Utility)
|
45
47
|
end
|
46
48
|
|
47
49
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -39,7 +39,7 @@ module Cucumber
|
|
39
39
|
|
40
40
|
@ssh = ZTK::SSH.new(:stdout => @stdout, :stderr => @stderr, :stdin => @stdin)
|
41
41
|
@ssh.config.host_name = @server.public_ip_address
|
42
|
-
@ssh.config.user =
|
42
|
+
@ssh.config.user = Cucumber::Chef::Config[:lab_user]
|
43
43
|
@ssh.config.keys = Cucumber::Chef::Config[:aws][:identity_file]
|
44
44
|
|
45
45
|
# @command = Cucumber::Chef::Command.new(@stdout, @stderr, @stdin)
|
@@ -91,7 +91,7 @@ module Cucumber
|
|
91
91
|
|
92
92
|
bootstrap = Cucumber::Chef::Bootstrap.new(@stdout, @stderr, @stdin)
|
93
93
|
bootstrap.config[:host] = @server.public_ip_address
|
94
|
-
bootstrap.config[:ssh_user] =
|
94
|
+
bootstrap.config[:ssh_user] = Cucumber::Chef::Config[:lab_user]
|
95
95
|
bootstrap.config[:use_sudo] = true
|
96
96
|
bootstrap.config[:identity_file] = Cucumber::Chef::Config[:aws][:identity_file]
|
97
97
|
bootstrap.config[:template_file] = template_file
|
@@ -130,9 +130,10 @@ module Cucumber
|
|
130
130
|
local_path = Cucumber::Chef.locate(:directory, ".cucumber-chef")
|
131
131
|
remote_path = File.join("/", "home", @ssh.config.user, ".ssh")
|
132
132
|
|
133
|
-
files = { "id_rsa" => "id_rsa
|
133
|
+
files = { "id_rsa" => "id_rsa-#{Cucumber::Chef::Config[:lab_user]}" }
|
134
134
|
files.each do |remote_file, local_file|
|
135
135
|
local = File.join(local_path, local_file)
|
136
|
+
File.exists?(local) and File.delete(local)
|
136
137
|
@ssh.download(File.join(remote_path, remote_file), local)
|
137
138
|
File.chmod(0600, local)
|
138
139
|
end
|
@@ -164,32 +165,32 @@ module Cucumber
|
|
164
165
|
################################################################################
|
165
166
|
|
166
167
|
def upload_cookbook
|
167
|
-
|
168
|
+
Cucumber::Chef.logger.debug { "Uploading cucumber-chef cookbooks..." }
|
168
169
|
@stdout.print("Uploading cucumber-chef cookbooks...")
|
169
170
|
|
170
171
|
Cucumber::Chef.spinner do
|
171
|
-
Cucumber::Chef.
|
172
|
+
Cucumber::Chef.load_knife
|
172
173
|
cookbook_repo = ::Chef::CookbookLoader.new(@cookbooks_path)
|
173
174
|
cookbook_repo.each do |name, cookbook|
|
174
|
-
|
175
|
+
Cucumber::Chef.logger.debug { "::Chef::CookbookUploader(#{name}) ATTEMPT" }
|
175
176
|
::Chef::CookbookUploader.new(cookbook, @cookbooks_path, :force => true).upload_cookbooks
|
176
|
-
|
177
|
+
Cucumber::Chef.logger.debug { "::Chef::CookbookUploader(#{name}) UPLOADED" }
|
177
178
|
end
|
178
179
|
#@command.knife([ "cookbook upload cucumber-chef", "-o", @cookbooks_path ], :silence => true)
|
179
180
|
end
|
180
181
|
|
181
182
|
@stdout.print("done.\n")
|
182
|
-
|
183
|
+
Cucumber::Chef.logger.debug { "Successfully uploaded cucumber-chef test lab cookbooks." }
|
183
184
|
end
|
184
185
|
|
185
186
|
################################################################################
|
186
187
|
|
187
188
|
def upload_role
|
188
|
-
|
189
|
+
Cucumber::Chef.logger.debug { "Uploading cucumber-chef test lab role..." }
|
189
190
|
@stdout.print("Uploading cucumber-chef test lab role...")
|
190
191
|
|
191
192
|
Cucumber::Chef.spinner do
|
192
|
-
Cucumber::Chef.
|
193
|
+
Cucumber::Chef.load_knife
|
193
194
|
::Chef::Config[:role_path] = @roles_path
|
194
195
|
[ "test_lab" ].each do |name|
|
195
196
|
role = ::Chef::Role.from_disk(name)
|
@@ -199,17 +200,17 @@ module Cucumber
|
|
199
200
|
end
|
200
201
|
|
201
202
|
@stdout.print("done.\n")
|
202
|
-
|
203
|
+
Cucumber::Chef.logger.debug { "Successfully uploaded cucumber-chef test lab roles."}
|
203
204
|
end
|
204
205
|
|
205
206
|
################################################################################
|
206
207
|
|
207
208
|
def tag_node
|
208
|
-
|
209
|
+
Cucumber::Chef.logger.debug { "Tagging cucumber-chef test lab node..." }
|
209
210
|
@stdout.print("Tagging cucumber-chef test lab node...")
|
210
211
|
|
211
212
|
Cucumber::Chef.spinner do
|
212
|
-
Cucumber::Chef.
|
213
|
+
Cucumber::Chef.load_knife
|
213
214
|
node = ::Chef::Node.load(HOSTNAME)
|
214
215
|
[ Cucumber::Chef::Config[:mode].to_s, Cucumber::Chef::Config[:user].to_s ].each do |tag|
|
215
216
|
node.tags << tag
|
@@ -219,17 +220,17 @@ module Cucumber
|
|
219
220
|
end
|
220
221
|
|
221
222
|
@stdout.print("done.\n")
|
222
|
-
|
223
|
+
Cucumber::Chef.logger.debug { "Successfully tagged cucumber-chef test lab node."}
|
223
224
|
end
|
224
225
|
|
225
226
|
################################################################################
|
226
227
|
|
227
228
|
def add_node_role
|
228
|
-
|
229
|
+
Cucumber::Chef.logger.debug { "Setting up cucumber-chef test lab run list..." }
|
229
230
|
@stdout.print("Setting up cucumber-chef test lab run list...")
|
230
231
|
|
231
232
|
Cucumber::Chef.spinner do
|
232
|
-
Cucumber::Chef.
|
233
|
+
Cucumber::Chef.load_knife
|
233
234
|
node = ::Chef::Node.load(HOSTNAME)
|
234
235
|
[ "role[test_lab]" ].each do |entry|
|
235
236
|
node.run_list << entry
|
@@ -238,7 +239,7 @@ module Cucumber
|
|
238
239
|
#@command.knife([ "node run_list add", HOSTNAME, "\"role[test_lab]\"" ], :silence => true)
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
+
Cucumber::Chef.logger.debug { "Successfully added roles to cucumber-chef test lab."}
|
242
243
|
@stdout.print("done.\n")
|
243
244
|
end
|
244
245
|
|
@@ -259,13 +260,13 @@ module Cucumber
|
|
259
260
|
def wait_for_chef_server
|
260
261
|
@stdout.print("Waiting for Chef-Server...")
|
261
262
|
Cucumber::Chef.spinner do
|
262
|
-
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 4000, :data => "GET").wait
|
263
|
+
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 4000, :data => "GET", :wait => 120).wait
|
263
264
|
end
|
264
265
|
@stdout.puts("done.\n")
|
265
266
|
|
266
267
|
@stdout.print("Waiting for Chef-WebUI...")
|
267
268
|
Cucumber::Chef.spinner do
|
268
|
-
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 4040, :data => "GET").wait
|
269
|
+
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 4040, :data => "GET", :wait => 120).wait
|
269
270
|
end
|
270
271
|
@stdout.puts("done.\n")
|
271
272
|
end
|
@@ -283,7 +284,7 @@ module Cucumber
|
|
283
284
|
|
284
285
|
@stdout.print("Waiting for SSHD...")
|
285
286
|
Cucumber::Chef.spinner do
|
286
|
-
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 22).wait
|
287
|
+
ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 22, :wait => 120).wait
|
287
288
|
end
|
288
289
|
@stdout.puts("done.\n")
|
289
290
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -20,10 +20,10 @@
|
|
20
20
|
################################################################################
|
21
21
|
|
22
22
|
When /^I enable the running of MiniTest suites for "(.*?)"$/ do |name|
|
23
|
-
$
|
23
|
+
$test_lab.drb.enable_minitest(name)
|
24
24
|
end
|
25
25
|
|
26
26
|
Then /^the tests should run and pass on "(.*?)"$/ do |name|
|
27
|
-
results = $
|
27
|
+
results = $test_lab.drb.run_minitests(name)
|
28
28
|
results.last.scan(/assertions.*(\d).*failures.*(\d).*errors.*(\d).*skips/).flatten.map { |v| v.to_i }.should == [0,0,0]
|
29
29
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -44,21 +44,22 @@ And /^"([^\"]*)" has a MAC address of "([^\"]*)"$/ do |name, mac|
|
|
44
44
|
end
|
45
45
|
|
46
46
|
And /^"([^\"]*)" has been provisioned$/ do |name|
|
47
|
-
$
|
47
|
+
$test_lab.drb.server_create(name, @servers[name])
|
48
48
|
end
|
49
49
|
|
50
50
|
And /^the "([^\"]*)" role has been added to the "([^\"]*)" run list$/ do |role, name|
|
51
|
-
$
|
51
|
+
$test_lab.drb.chef_set_client_attributes(name, :run_list => ["role[#{role}]"])
|
52
52
|
end
|
53
53
|
|
54
54
|
And /^the "([^\"]*)" recipe has been added to the "([^\"]*)" run list$/ do |recipe, name|
|
55
|
-
$
|
55
|
+
$test_lab.drb.chef_set_client_attributes(name, :run_list => ["recipe[#{recipe}]"])
|
56
56
|
end
|
57
57
|
|
58
58
|
And /^"([^\"]*)" is in the "([^\"]*)" environment$/ do |name, environment|
|
59
|
-
$
|
59
|
+
$test_lab.drb.chef_set_client_config(:environment => environment)
|
60
60
|
end
|
61
61
|
|
62
62
|
And /^the chef-client has been run on "([^\"]*)"$/ do |name|
|
63
|
-
$
|
63
|
+
$test_lab.drb.chef_run_client(name)
|
64
|
+
chef_client_artifacts(name)
|
64
65
|
end
|
@@ -1,7 +1,35 @@
|
|
1
|
+
################################################################################
|
2
|
+
|
3
|
+
# | id | hostname | username | keyfile |
|
4
|
+
# | root | chef-client | root | keyfile |
|
5
|
+
|
6
|
+
When /^I have the following SSH sessions:$/ do |table|
|
7
|
+
lambda {
|
8
|
+
@ssh_sessions ||= Hash.new
|
9
|
+
table.hashes.each do |hash|
|
10
|
+
id = hash["id"]
|
11
|
+
@ssh_sessions[id] and !@ssh_sessions[id].closed? and @ssh_sessions[id].close
|
12
|
+
@ssh_sessions[id] = ZTK::SSH.new
|
13
|
+
|
14
|
+
@ssh_sessions[id].config.proxy_host_name = $test_lab.labs_running.first.public_ip_address
|
15
|
+
@ssh_sessions[id].config.proxy_user = "ubuntu"
|
16
|
+
@ssh_sessions[id].config.proxy_keys = Cucumber::Chef.locate(:file, ".cucumber-chef", "id_rsa-#{@ssh_sessions[id].config.proxy_user}")
|
17
|
+
|
18
|
+
hash['hostname'] and (@ssh_sessions[id].config.host_name = hash['hostname'])
|
19
|
+
hash['username'] and (@ssh_sessions[id].config.user = hash['username'])
|
20
|
+
hash['password'] and (@ssh_sessions[id].config.password = hash['password'])
|
21
|
+
hash['keyfile'] and (@ssh_sessions[id].config.keys = hash['keyfile'])
|
22
|
+
end
|
23
|
+
}.should_not raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
################################################################################
|
27
|
+
|
1
28
|
When /^I ssh to "([^\"]*)" with the following credentials:$/ do |hostname, table|
|
2
29
|
session = table.hashes.first
|
3
30
|
lambda {
|
4
31
|
|
32
|
+
@connection and !@connection.ssh.closed? and @connection.ssh.close
|
5
33
|
@connection = ZTK::SSH.new
|
6
34
|
|
7
35
|
@connection.config.proxy_host_name = $test_lab.labs_running.first.public_ip_address
|
@@ -18,6 +46,7 @@ end
|
|
18
46
|
|
19
47
|
And /^I run "([^\"]*)"$/ do |command|
|
20
48
|
@output = @connection.exec(command, :silence => true).output
|
49
|
+
Cucumber::Chef.logger.info { @output.chomp }
|
21
50
|
end
|
22
51
|
|
23
52
|
Then /^I should( not)? see "([^\"]*)" in the output$/ do |boolean, string|
|
@@ -30,9 +59,9 @@ end
|
|
30
59
|
|
31
60
|
Then /^I should( not)? see the "([^\"]*)" of "([^\"]*)" in the output$/ do |boolean, key, name|
|
32
61
|
if (!boolean)
|
33
|
-
@output.should =~ /#{$
|
62
|
+
@output.should =~ /#{$test_lab.drb.servers[name][key.downcase.to_sym]}/i
|
34
63
|
else
|
35
|
-
@output.should_not =~ /#{$
|
64
|
+
@output.should_not =~ /#{$test_lab.drb.servers[name][key.downcase.to_sym]}/i
|
36
65
|
end
|
37
66
|
end
|
38
67
|
|
data/lib/cucumber/chef/steps.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
|
4
4
|
# Author: Zachary Patten <zachary@jovelabs.com>
|
5
|
-
# Copyright: Copyright (c) 2011-
|
5
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
6
6
|
# License: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -0,0 +1,111 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.com>
|
4
|
+
# Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
|
5
|
+
# License: Apache License, Version 2.0
|
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
|
+
################################################################################
|
20
|
+
|
21
|
+
tag = Cucumber::Chef.tag("cucumber-chef")
|
22
|
+
puts(" * #{tag}")
|
23
|
+
Cucumber::Chef.load_config(tag)
|
24
|
+
|
25
|
+
if ($test_lab = Cucumber::Chef::TestLab.new) && ($test_lab.labs_running.count > 0)
|
26
|
+
$test_lab.ssh.exec("sudo mkdir -p /home/#{$test_lab.ssh.config.user}/.cucumber-chef")
|
27
|
+
$test_lab.ssh.exec("sudo cp -f /home/#{$test_lab.ssh.config.user}/.chef/knife.rb /home/#{$test_lab.ssh.config.user}/.cucumber-chef/knife.rb")
|
28
|
+
$test_lab.ssh.exec("sudo chown -R #{$test_lab.ssh.config.user}:#{$test_lab.ssh.config.user} /home/#{$test_lab.ssh.config.user}/.cucumber-chef")
|
29
|
+
|
30
|
+
local_file = Cucumber::Chef.config_rb
|
31
|
+
remote_file = File.join("/", "home", $test_lab.ssh.config.user, ".cucumber-chef", "config.rb")
|
32
|
+
$test_lab.ssh.upload(local_file, remote_file)
|
33
|
+
|
34
|
+
$cc_server_thread = Thread.new do
|
35
|
+
$test_lab.ssh.exec("sudo pkill -9 -f cc-server")
|
36
|
+
|
37
|
+
destroy = (ENV['DESTROY'] == '1' ? 'DESTROY="1"' : nil)
|
38
|
+
verbose = (ENV['VERBOSE'] == '1' ? 'VERBOSE="1"' : nil)
|
39
|
+
command = ["sudo", destroy, verbose, "cc-server", Cucumber::Chef.external_ip].compact.join(" ")
|
40
|
+
$test_lab.ssh.exec(command, :silence => false)
|
41
|
+
|
42
|
+
Kernel.at_exit do
|
43
|
+
$test_lab.ssh.close
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
ZTK::TCPSocketCheck.new(:host => $test_lab.labs_running.first.public_ip_address, :port => 8787, :data => "\n\n").wait
|
48
|
+
|
49
|
+
FileUtils.rm_rf(File.join(Cucumber::Chef.locate(:directory, ".cucumber-chef"), "artifacts"))
|
50
|
+
else
|
51
|
+
message = "No running cucumber-chef test labs to connect to!"
|
52
|
+
Cucumber::Chef.logger.fatal { message }
|
53
|
+
raise message
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
################################################################################
|
58
|
+
# BEFORE HOOK
|
59
|
+
################################################################################
|
60
|
+
|
61
|
+
Before do |scenario|
|
62
|
+
# store the current scenario here; espcially since I don't know a better way to get at this information
|
63
|
+
# we use various aspects of the scenario to name our artifacts
|
64
|
+
$scenario = scenario
|
65
|
+
|
66
|
+
# cleanup previous lxc containers if asked
|
67
|
+
if ENV['DESTROY']
|
68
|
+
log("$containers$ are being destroyed")
|
69
|
+
$test_lab.drb.servers.each do |name, value|
|
70
|
+
$test_lab.drb.server_destroy(name)
|
71
|
+
end
|
72
|
+
File.exists?(Cucumber::Chef.servers_bin) && File.delete(Cucumber::Chef.servers_bin)
|
73
|
+
else
|
74
|
+
log("$containers$ are being persisted")
|
75
|
+
end
|
76
|
+
|
77
|
+
if File.exists?(Cucumber::Chef.servers_bin)
|
78
|
+
$test_lab.drb.servers = (Marshal.load(IO.read(Cucumber::Chef.servers_bin)) rescue Hash.new(nil))
|
79
|
+
end
|
80
|
+
|
81
|
+
$test_lab.drb.chef_set_client_config(:chef_server_url => "http://192.168.255.254:4000",
|
82
|
+
:validation_client_name => "chef-validator")
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
################################################################################
|
87
|
+
# AFTER HOOK
|
88
|
+
################################################################################
|
89
|
+
|
90
|
+
After do |scenario|
|
91
|
+
File.open(Cucumber::Chef.servers_bin, 'w') do |f|
|
92
|
+
f.puts(Marshal.dump($test_lab.drb.servers))
|
93
|
+
end
|
94
|
+
|
95
|
+
# cleanup non-persistent lxc containers between tests
|
96
|
+
$test_lab.drb.servers.select{ |name, attributes| !attributes[:persist] }.each do |name, attributes|
|
97
|
+
$test_lab.drb.server_destroy(name)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
################################################################################
|
103
|
+
# EXIT HOOK
|
104
|
+
################################################################################
|
105
|
+
|
106
|
+
Kernel.at_exit do
|
107
|
+
$test_lab.drb.shutdown
|
108
|
+
$cc_server_thread.kill
|
109
|
+
end
|
110
|
+
|
111
|
+
################################################################################
|
@@ -11,90 +11,3 @@ end
|
|
11
11
|
World do
|
12
12
|
CustomWorld.new
|
13
13
|
end
|
14
|
-
|
15
|
-
################################################################################
|
16
|
-
|
17
|
-
$logger = ZTK::Logger.new(Cucumber::Chef.log_file)
|
18
|
-
Cucumber::Chef.is_rc? and ($logger.level = ZTK::Logger::DEBUG)
|
19
|
-
|
20
|
-
message = "cucumber-chef v#{Cucumber::Chef::VERSION}"
|
21
|
-
print(" * #{message}")
|
22
|
-
$logger.info { message }
|
23
|
-
|
24
|
-
Cucumber::Chef::Config.load
|
25
|
-
if ($test_lab = Cucumber::Chef::TestLab.new) && ($test_lab.labs_running.count > 0)
|
26
|
-
|
27
|
-
# fire up our drb server
|
28
|
-
ssh = ZTK::SSH.new
|
29
|
-
ssh.config.host_name = $test_lab.labs_running.first.public_ip_address
|
30
|
-
ssh.config.user = "ubuntu"
|
31
|
-
ssh.config.keys = Cucumber::Chef.locate(:file, ".cucumber-chef", "id_rsa-#{ssh.config.user}")
|
32
|
-
ssh.exec("nohup sudo pkill -9 -f cc-server")
|
33
|
-
ssh.exec("nohup sudo BACKGROUND=yes cc-server #{Cucumber::Chef.external_ip}")
|
34
|
-
Cucumber::Chef.spinner do
|
35
|
-
ZTK::TCPSocketCheck.new(:host => $test_lab.labs_running.first.public_ip_address, :port => 8787, :data => "\n\n").wait
|
36
|
-
end
|
37
|
-
|
38
|
-
# load our test lab knife config
|
39
|
-
knife_rb = Cucumber::Chef.locate(:file, ".cucumber-chef", "knife.rb")
|
40
|
-
Chef::Config.from_file(knife_rb)
|
41
|
-
|
42
|
-
# initialize our drb object
|
43
|
-
$drb_test_lab ||= DRbObject.new_with_uri("druby://#{$test_lab.labs_running.first.public_ip_address}:8787")
|
44
|
-
$drb_test_lab and DRb.start_service
|
45
|
-
$drb_test_lab.servers = Hash.new(nil)
|
46
|
-
|
47
|
-
else
|
48
|
-
puts("No running cucumber-chef test labs to connect to!")
|
49
|
-
exit(1)
|
50
|
-
end
|
51
|
-
|
52
|
-
puts(" - connected to test lab")
|
53
|
-
|
54
|
-
################################################################################
|
55
|
-
|
56
|
-
Before do
|
57
|
-
$servers_bin ||= (File.join(Cucumber::Chef.locate(:directory, ".cucumber-chef"), "servers.bin") rescue File.expand_path(File.join(ENV['HOME'], "servers.bin")))
|
58
|
-
|
59
|
-
# cleanup previous lxc containers if asked
|
60
|
-
if ENV['DESTROY']
|
61
|
-
log("servers", "are being destroyed")
|
62
|
-
$drb_test_lab.servers.each do |name|
|
63
|
-
$drb_test_lab.server_destroy(name)
|
64
|
-
end
|
65
|
-
File.exists?($servers_bin) && File.delete($servers_bin)
|
66
|
-
else
|
67
|
-
log("servers", "are being preserved")
|
68
|
-
end
|
69
|
-
|
70
|
-
if File.exists?($servers_bin)
|
71
|
-
$drb_test_lab.servers = (Marshal.load(IO.read($servers_bin)) rescue Hash.new(nil))
|
72
|
-
end
|
73
|
-
|
74
|
-
$drb_test_lab.chef_set_client_config(:chef_server_url => "http://192.168.255.254:4000",
|
75
|
-
:validation_client_name => "chef-validator")
|
76
|
-
end
|
77
|
-
|
78
|
-
################################################################################
|
79
|
-
|
80
|
-
After do |scenario|
|
81
|
-
File.open($servers_bin, 'w') do |f|
|
82
|
-
f.puts(Marshal.dump($drb_test_lab.servers))
|
83
|
-
end
|
84
|
-
|
85
|
-
Kernel.exit if scenario.failed?
|
86
|
-
|
87
|
-
# cleanup non-persistent lxc containers between tests
|
88
|
-
$drb_test_lab.servers.select{ |name, attributes| !attributes[:persist] }.each do |name, attributes|
|
89
|
-
$drb_test_lab.server_destroy(name)
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
################################################################################
|
95
|
-
|
96
|
-
Kernel.at_exit do
|
97
|
-
$drb_test_lab.shutdown
|
98
|
-
end
|
99
|
-
|
100
|
-
################################################################################
|