cucumber-chef 3.0.0.rc.0 → 3.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -3
- data/WIKI.2.x.md +826 -0
- data/WIKI.md +287 -755
- data/bin/cucumber-chef +16 -19
- data/cucumber-chef.gemspec +1 -1
- data/lib/cucumber/chef/client.rb +86 -63
- data/lib/cucumber/chef/containers.rb +70 -64
- data/lib/cucumber/chef/helpers/chef.rb +5 -5
- data/lib/cucumber/chef/provider.rb +1 -1
- data/lib/cucumber/chef/providers/aws.rb +1 -1
- data/lib/cucumber/chef/providers/vagrant.rb +1 -1
- data/lib/cucumber/chef/provisioner.rb +3 -2
- data/lib/cucumber/chef/steps/chef_steps.rb +4 -4
- data/lib/cucumber/chef/steps/minitest_steps.rb +2 -2
- data/lib/cucumber/chef/steps/ssh_steps.rb +3 -3
- data/lib/cucumber/chef/templates/bootstrap/ubuntu-precise-test-lab.erb +14 -14
- data/lib/cucumber/chef/templates/cucumber/cc-hooks.rb +10 -63
- data/lib/cucumber/chef/version.rb +1 -1
- data/lib/cucumber-chef/rake/task.rb +11 -11
- metadata +5 -4
data/bin/cucumber-chef
CHANGED
@@ -128,7 +128,7 @@ class CucumberChef < Thor
|
|
128
128
|
# SETUP
|
129
129
|
################################################################################
|
130
130
|
|
131
|
-
desc "setup", "Setup cucumber-chef test lab
|
131
|
+
desc "setup", "Setup the cucumber-chef test lab"
|
132
132
|
method_option :test, :type => :boolean, :desc => "INTERNAL USE ONLY"
|
133
133
|
def setup
|
134
134
|
boot
|
@@ -166,7 +166,7 @@ class CucumberChef < Thor
|
|
166
166
|
# DESTROY
|
167
167
|
################################################################################
|
168
168
|
|
169
|
-
desc "destroy [container]", "Destroy the cucumber-chef test lab
|
169
|
+
desc "destroy [container] [...]", "Destroy the cucumber-chef test lab or a single or multiple containers if specified"
|
170
170
|
method_option :test, :type => :boolean, :desc => "INTERNAL USE ONLY"
|
171
171
|
def destroy(*args)
|
172
172
|
boot
|
@@ -207,9 +207,7 @@ class CucumberChef < Thor
|
|
207
207
|
|
208
208
|
args.each do |container|
|
209
209
|
ZTK::Benchmark.bench(:message => "Destroy container '#{container}'", :mark => "completed in %0.4f seconds.") do
|
210
|
-
test_lab.containers.load
|
211
210
|
test_lab.containers.destroy(container)
|
212
|
-
test_lab.containers.save
|
213
211
|
end
|
214
212
|
end
|
215
213
|
|
@@ -234,7 +232,7 @@ class CucumberChef < Thor
|
|
234
232
|
# UP
|
235
233
|
################################################################################
|
236
234
|
|
237
|
-
desc "up", "
|
235
|
+
desc "up", "Power up the cucumber-chef test lab"
|
238
236
|
def up
|
239
237
|
boot
|
240
238
|
|
@@ -253,16 +251,16 @@ class CucumberChef < Thor
|
|
253
251
|
end
|
254
252
|
|
255
253
|
################################################################################
|
256
|
-
#
|
254
|
+
# DOWN
|
257
255
|
################################################################################
|
258
256
|
|
259
|
-
desc "
|
260
|
-
def
|
257
|
+
desc "down", "Power off the cucumber-chef test lab"
|
258
|
+
def down
|
261
259
|
boot
|
262
260
|
|
263
261
|
if (test_lab = Cucumber::Chef::TestLab.new) && test_lab.alive?
|
264
|
-
ZTK::Benchmark.bench(:message => "
|
265
|
-
test_lab.
|
262
|
+
ZTK::Benchmark.bench(:message => "Downing #{Cucumber::Chef::Config.provider.upcase} instance '#{test_lab.id}'", :mark => "completed in %0.4f seconds.") do
|
263
|
+
test_lab.down
|
266
264
|
end
|
267
265
|
else
|
268
266
|
raise Cucumber::Chef::Error, "We could not find a running test lab."
|
@@ -296,14 +294,14 @@ class CucumberChef < Thor
|
|
296
294
|
fatal(e)
|
297
295
|
end
|
298
296
|
|
299
|
-
desc "genmac", "Generate
|
297
|
+
desc "genmac", "Generate an RFC compliant private MAC address"
|
300
298
|
def genmac
|
301
299
|
boot
|
302
300
|
|
303
301
|
puts Cucumber::Chef::Containers.generate_mac
|
304
302
|
end
|
305
303
|
|
306
|
-
desc "genip", "Generate
|
304
|
+
desc "genip", "Generate an RFC compliant private IP address"
|
307
305
|
def genip
|
308
306
|
boot
|
309
307
|
|
@@ -329,13 +327,13 @@ class CucumberChef < Thor
|
|
329
327
|
headers = [:name, :alive, :distro, :ip, :mac, :"chef version", :persist]
|
330
328
|
results = ZTK::Report.new.spreadsheet(Cucumber::Chef::Container.all, headers) do |container|
|
331
329
|
chef_version = "N/A"
|
332
|
-
alive = (test_lab.bootstrap_ssh(:ignore_exit_status => true).exec(%
|
330
|
+
alive = (test_lab.bootstrap_ssh(:ignore_exit_status => true).exec(%(ping -n -c 1 -W 1 #{container.ip}), :silence => true).exit_code == 0)
|
333
331
|
if alive
|
334
|
-
chef_version = test_lab.proxy_ssh(container.
|
332
|
+
chef_version = test_lab.proxy_ssh(container.id, :ignore_exit_status => true).exec(%(/usr/bin/env chef-client -v), :silence => true).output.chomp
|
335
333
|
end
|
336
334
|
|
337
335
|
OpenStruct.new(
|
338
|
-
:name => container.
|
336
|
+
:name => container.id,
|
339
337
|
:ip => container.ip,
|
340
338
|
:mac => container.mac,
|
341
339
|
:distro => container.distro,
|
@@ -378,8 +376,8 @@ class CucumberChef < Thor
|
|
378
376
|
# SSH
|
379
377
|
################################################################################
|
380
378
|
|
381
|
-
desc "ssh [container]", "SSH to cucumber-chef test lab or [container] if specified
|
382
|
-
method_option :bootstrap, :type => :boolean, :desc => "Use the bootstrap settings
|
379
|
+
desc "ssh [container]", "SSH to cucumber-chef test lab or [container] if specified"
|
380
|
+
method_option :bootstrap, :type => :boolean, :desc => "Use the bootstrap settings", :default => false
|
383
381
|
def ssh(*args)
|
384
382
|
boot
|
385
383
|
|
@@ -571,8 +569,7 @@ class CucumberChef < Thor
|
|
571
569
|
depreciated_tasks = {
|
572
570
|
"teardown" => "You should execute the 'destroy' task instead.",
|
573
571
|
"info" => "You should execute the 'status' task instead.",
|
574
|
-
"test" => "You should execute 'cucumber' or 'rspec' directly."
|
575
|
-
"down" => "You should execute the 'halt' task instead."
|
572
|
+
"test" => "You should execute 'cucumber' or 'rspec' directly."
|
576
573
|
}
|
577
574
|
|
578
575
|
depreciated_tasks.each do |old_task, message|
|
data/cucumber-chef.gemspec
CHANGED
@@ -46,7 +46,7 @@ Gem::Specification.new do |s|
|
|
46
46
|
s.add_dependency("rake", ">= 0.9.2")
|
47
47
|
s.add_dependency("thor", ">= 0.15.2")
|
48
48
|
s.add_dependency("ubuntu_ami", ">= 0.4.0")
|
49
|
-
s.add_dependency("ztk", ">= 1.0.
|
49
|
+
s.add_dependency("ztk", ">= 1.0.8")
|
50
50
|
|
51
51
|
s.add_development_dependency("simplecov", ">= 0.6.4")
|
52
52
|
s.add_development_dependency("pry", ">= 0")
|
data/lib/cucumber/chef/client.rb
CHANGED
@@ -28,78 +28,94 @@ module Cucumber
|
|
28
28
|
|
29
29
|
################################################################################
|
30
30
|
|
31
|
-
def initialize
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
def initialize
|
32
|
+
tag = Cucumber::Chef.tag("cucumber-chef")
|
33
|
+
puts(">>> #{tag}")
|
34
|
+
Cucumber::Chef.boot(tag)
|
35
35
|
|
36
|
-
|
36
|
+
@ui = ZTK::UI.new(:logger => Cucumber::Chef.logger)
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# @test_lab.ssh.exec("sudo cp -f #{File.join(home_dir, ".chef", "knife.rb")} #{File.join(home_dir, ".cucumber-chef", provider, "knife.rb")}")
|
44
|
-
# @test_lab.ssh.exec("sudo chown -R #{user}:#{user} #{File.join(home_dir, ".cucumber-chef")}")
|
45
|
-
|
46
|
-
# local_file = Cucumber::Chef.config_rb
|
47
|
-
# remote_file = File.join(home_dir, ".cucumber-chef", "config.rb")
|
48
|
-
# @test_lab.ssh.upload(local_file, remote_file)
|
49
|
-
|
50
|
-
# begin
|
51
|
-
# self.ping
|
52
|
-
# rescue
|
53
|
-
# @background = ZTK::Background.new
|
54
|
-
# @background.process do
|
55
|
-
# self.down
|
56
|
-
|
57
|
-
# environment = Array.new
|
58
|
-
# %w(PURGE VERBOSE LOG_LEVEL).each do |env_var|
|
59
|
-
# environment << "#{env_var}=#{ENV[env_var].inspect}" if (!ENV[env_var].nil? && !ENV[env_var].empty?)
|
60
|
-
# end
|
61
|
-
# environment = environment.join(" ")
|
62
|
-
# external_ip = Cucumber::Chef.external_ip
|
63
|
-
|
64
|
-
# command = %Q{nohup sudo #{environment} /usr/bin/env cc-server #{external_ip} &}
|
65
|
-
|
66
|
-
# @test_lab.ssh.exec(command, options)
|
67
|
-
# end
|
68
|
-
|
69
|
-
# Kernel.at_exit do
|
70
|
-
# self.at_exit
|
71
|
-
# end
|
72
|
-
# end
|
73
|
-
|
74
|
-
# ZTK::RescueRetry.try(:tries => 30) do
|
75
|
-
# self.drb.ping
|
76
|
-
# end
|
38
|
+
if !((@test_lab = Cucumber::Chef::TestLab.new(@ui)) && @test_lab.alive?)
|
39
|
+
message = "No running cucumber-chef test labs to connect to!"
|
40
|
+
@ui.logger.fatal { message }
|
41
|
+
raise message
|
42
|
+
end
|
77
43
|
|
78
|
-
true
|
79
44
|
end
|
80
45
|
|
81
46
|
################################################################################
|
82
47
|
|
83
|
-
def
|
84
|
-
# (@test_lab.drb.shutdown rescue nil)
|
85
|
-
end
|
48
|
+
def up(options={})
|
86
49
|
|
87
|
-
|
50
|
+
# PUSH CHEF-REPO
|
51
|
+
#################
|
52
|
+
if environment_variable_set?("PUSH")
|
53
|
+
# Upload all of the chef-repo environments
|
54
|
+
ZTK::Benchmark.bench(:message => ">>> Pushing chef-repo environments to the test lab", :mark => "completed in %0.4f seconds.") do
|
55
|
+
@test_lab.knife_cli(%(environment from file ./environments/*.rb), :silence => true)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Upload all of the chef-repo cookbooks
|
59
|
+
ZTK::Benchmark.bench(:message => ">>> Pushing chef-repo cookbooks to the test lab", :mark => "completed in %0.4f seconds.") do
|
60
|
+
cookbook_paths = ["./cookbooks"]
|
61
|
+
cookbook_paths << "./site-cookbooks" if Cucumber::Chef::Config.librarian_chef
|
62
|
+
@test_lab.knife_cli(%(cookbook upload --all --cookbook-path #{cookbook_paths.join(':')} --force), :silence => true)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Upload all of the chef-repo roles
|
66
|
+
ZTK::Benchmark.bench(:message => ">>> Pushing chef-repo roles to the test lab", :mark => "completed in %0.4f seconds.") do
|
67
|
+
@test_lab.knife_cli(%(role from file ./roles/*.rb), :silence => true)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Upload all of our chef-repo data bags
|
71
|
+
Dir.glob("./data_bags/*").each do |data_bag_path|
|
72
|
+
next if !File.directory?(data_bag_path)
|
73
|
+
ZTK::Benchmark.bench(:message => ">>> Pushing chef-repo data bag '#{File.basename(data_bag_path)}' to the test lab", :mark => "completed in %0.4f seconds.") do
|
74
|
+
data_bag = File.basename(data_bag_path)
|
75
|
+
@test_lab.knife_cli(%(data bag create "#{data_bag}"), :silence => true)
|
76
|
+
@test_lab.knife_cli(%(data bag from file "#{data_bag}" "#{data_bag_path}"), :silence => true)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# PURGE CONTAINERS
|
82
|
+
###################
|
83
|
+
if environment_variable_set?("PURGE")
|
84
|
+
@ui.logger.warn { "PURGING CONTAINERS! Container attributes will be reset!" }
|
85
|
+
@test_lab.containers.list.each do |name|
|
86
|
+
ZTK::Benchmark.bench(:message => ">>> Destroying container '#{name}'", :mark => "completed in %0.4f seconds.") do
|
87
|
+
@test_lab.containers.destroy(name)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
else
|
91
|
+
@ui.logger.info { "Allowing existing containers to persist." }
|
92
|
+
end
|
93
|
+
|
94
|
+
# CREATE CONTAINERS
|
95
|
+
####################
|
96
|
+
Cucumber::Chef::Container.all.each do |container|
|
97
|
+
ZTK::Benchmark.bench(:message => ">>> Creating container '#{container.id}'", :mark => "completed in %0.4f seconds.") do
|
98
|
+
@test_lab.containers.create(container)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# PROVISION CONTAINERS
|
103
|
+
#######################
|
104
|
+
@test_lab.containers.chef_set_client_config(:chef_server_url => "http://192.168.255.254:4000",
|
105
|
+
:validation_client_name => "chef-validator")
|
106
|
+
Cucumber::Chef::Container.all.each do |container|
|
107
|
+
ZTK::Benchmark.bench(:message => ">>> Provisioning container '#{container.id}'", :mark => "completed in %0.4f seconds.") do
|
108
|
+
@test_lab.containers.provision(container)
|
109
|
+
end
|
110
|
+
end
|
88
111
|
|
89
|
-
|
90
|
-
|
91
|
-
# @drb = DRbObject.new_with_uri("druby://#{@test_lab.ip}:8787")
|
92
|
-
# @drb and DRb.start_service
|
93
|
-
# @drb
|
94
|
-
# end
|
112
|
+
true
|
113
|
+
end
|
95
114
|
|
96
115
|
################################################################################
|
97
116
|
|
98
117
|
def before(scenario)
|
99
|
-
# store the current scenario here; espcially since I don't know a better way to get at this information
|
100
|
-
# we use various aspects of the scenario to name our artifacts
|
101
118
|
$scenario = scenario
|
102
|
-
|
103
119
|
end
|
104
120
|
|
105
121
|
################################################################################
|
@@ -109,13 +125,20 @@ module Cucumber
|
|
109
125
|
|
110
126
|
################################################################################
|
111
127
|
|
112
|
-
|
113
|
-
|
114
|
-
# self.down
|
115
|
-
# @background.wait
|
116
|
-
# end
|
128
|
+
def at_exit
|
129
|
+
end
|
117
130
|
|
118
131
|
################################################################################
|
132
|
+
private
|
133
|
+
################################################################################
|
134
|
+
|
135
|
+
def environment_variable_set?(variable_name)
|
136
|
+
raise "You must supply an environment variable name!" if variable_name.nil?
|
137
|
+
|
138
|
+
variable_name = variable_name.strip.upcase
|
139
|
+
|
140
|
+
(!ENV[variable_name].nil? && ((ENV[variable_name] == '1') || (ENV[variable_name].strip.upcase == 'YES')))
|
141
|
+
end
|
119
142
|
|
120
143
|
end
|
121
144
|
|
@@ -43,7 +43,7 @@ module Cucumber
|
|
43
43
|
|
44
44
|
def create(container)
|
45
45
|
# if this is a new or non-persistent container destroy it
|
46
|
-
destroy(container.
|
46
|
+
destroy(container.id) if !container.persist
|
47
47
|
|
48
48
|
container.ip ||= self.generate_ip
|
49
49
|
container.mac ||= self.generate_mac
|
@@ -52,26 +52,26 @@ module Cucumber
|
|
52
52
|
container.release ||= "lucid"
|
53
53
|
container.arch = detect_arch(container.distro || "ubuntu")
|
54
54
|
|
55
|
-
if running?(container.
|
56
|
-
@ui.logger.info { "Container '#{container.
|
55
|
+
if running?(container.id)
|
56
|
+
@ui.logger.info { "Container '#{container.id}' is already running." }
|
57
57
|
else
|
58
58
|
@ui.logger.info { "Please wait, creating container #{container.inspect}." }
|
59
59
|
bm = ::Benchmark.realtime do
|
60
60
|
test_lab_config_dhcpd
|
61
61
|
config_network(container)
|
62
|
-
_create(container.
|
62
|
+
_create(container.id, container.distro, container.release, container.arch)
|
63
63
|
end
|
64
|
-
@ui.logger.info { "Container '#{container.
|
64
|
+
@ui.logger.info { "Container '#{container.id}' creation took %0.4f seconds." % bm }
|
65
65
|
|
66
66
|
bm = ::Benchmark.realtime do
|
67
67
|
ZTK::RescueRetry.try(:tries => 32) do
|
68
|
-
@test_lab.ssh.exec("host #{container.
|
68
|
+
@test_lab.ssh.exec("host #{container.id}", :silence => true)
|
69
69
|
end
|
70
70
|
ZTK::RescueRetry.try(:tries => 32) do
|
71
|
-
@test_lab.proxy_ssh(container.
|
71
|
+
@test_lab.proxy_ssh(container.id).exec("uptime", :silence => true)
|
72
72
|
end
|
73
73
|
end
|
74
|
-
@ui.logger.info { "Container '#{container.
|
74
|
+
@ui.logger.info { "Container '#{container.id}' SSHD responded after %0.4f seconds." % bm }
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
@@ -89,11 +89,17 @@ module Cucumber
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
################################################################################
|
93
|
+
|
94
|
+
def provision(container, *args)
|
95
|
+
@test_lab.containers.chef_run_client(container, *args)
|
96
|
+
end
|
97
|
+
|
92
98
|
################################################################################
|
93
99
|
|
94
100
|
def chef_set_client_config(config={})
|
95
101
|
@chef_client_config = (@chef_client_config || {
|
96
|
-
:log_level => :
|
102
|
+
:log_level => :debug,
|
97
103
|
:log_location => "/var/log/chef/client.log",
|
98
104
|
:chef_server_url => "https://api.opscode.com/organizations/#{config[:orgname]}",
|
99
105
|
:validation_client_name => "#{config[:orgname]}-validator",
|
@@ -112,12 +118,12 @@ module Cucumber
|
|
112
118
|
chef_config_client(container)
|
113
119
|
|
114
120
|
@ui.logger.info { "Removing artifacts #{Cucumber::Chef::Config[:artifacts].values.collect{|z| "'#{z}'" }.join(' ')}." }
|
115
|
-
(@test_lab.proxy_ssh(container.
|
121
|
+
(@test_lab.proxy_ssh(container.id).exec("/bin/rm -fv #{Cucumber::Chef::Config[:artifacts].values.join(' ')}", :silence => true) rescue nil)
|
116
122
|
|
117
|
-
@ui.logger.info { "Running chef client on container '#{container.
|
123
|
+
@ui.logger.info { "Running chef client on container '#{container.id}'." }
|
118
124
|
|
119
125
|
arguments = {
|
120
|
-
"--node-name" => container.
|
126
|
+
"--node-name" => container.id,
|
121
127
|
"--json-attributes" => File.join("/etc", "chef", "attributes.json").to_s,
|
122
128
|
"--log_level" => @chef_client_config[:log_level],
|
123
129
|
"--logfile" => @chef_client_config[:log_location],
|
@@ -127,9 +133,9 @@ module Cucumber
|
|
127
133
|
|
128
134
|
output = nil
|
129
135
|
bm = ::Benchmark.realtime do
|
130
|
-
output = @test_lab.proxy_ssh(container.
|
136
|
+
output = @test_lab.proxy_ssh(container.id).exec(["/usr/bin/chef-client", arguments, args, "--once"].flatten.join(" "), :silence => true, :ignore_exit_status => true)
|
131
137
|
end
|
132
|
-
@ui.logger.info { "Chef client run on container '#{container.
|
138
|
+
@ui.logger.info { "Chef client run on container '#{container.id}' took %0.4f seconds." % bm }
|
133
139
|
|
134
140
|
chef_client_artifacts(container)
|
135
141
|
|
@@ -190,7 +196,7 @@ module Cucumber
|
|
190
196
|
################################################################################
|
191
197
|
|
192
198
|
def list
|
193
|
-
@test_lab.bootstrap_ssh.exec("sudo lxc-ls 2>&1", :silence => true).output.split("
|
199
|
+
@test_lab.bootstrap_ssh.exec("sudo lxc-ls 2>&1", :silence => true).output.strip.split(" ").uniq
|
194
200
|
end
|
195
201
|
|
196
202
|
################################################################################
|
@@ -213,37 +219,37 @@ module Cucumber
|
|
213
219
|
omnibus_chef_client = File.join("/", "opt", "chef", "bin", "chef-client")
|
214
220
|
omnibus_cache = File.join(cache_rootfs, omnibus_chef_client)
|
215
221
|
@ui.logger.info { "looking for omnibus cache in #{omnibus_cache}" }
|
216
|
-
if @test_lab.bootstrap_ssh.exec(%
|
222
|
+
if @test_lab.bootstrap_ssh.exec(%(sudo /bin/bash -c '[[ -f #{omnibus_cache} ]]'), :silence => true, :ignore_exit_status => true).exit_code == 1
|
217
223
|
case distro.downcase
|
218
224
|
when "ubuntu" then
|
219
|
-
@test_lab.bootstrap_ssh.exec(%
|
225
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes install wget'), :silence => true)
|
220
226
|
when "fedora" then
|
221
|
-
@test_lab.bootstrap_ssh.exec(%
|
227
|
+
@test_lab.bootstrap_ssh.exec(%(sudo yum --nogpgcheck --installroot=#{cache_rootfs} -y install wget openssh-server), :silence => true)
|
222
228
|
end
|
223
|
-
@test_lab.bootstrap_ssh.exec(%
|
224
|
-
@test_lab.bootstrap_ssh.exec(%
|
225
|
-
@test_lab.bootstrap_ssh.exec(%
|
226
|
-
@test_lab.bootstrap_ssh.exec(%
|
229
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'locale-gen'), :silence => true)
|
230
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'locale-gen en_US'), :silence => true)
|
231
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'wget http://www.opscode.com/chef/install.sh'), :silence => true)
|
232
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'bash install.sh -v #{Cucumber::Chef::Config.chef[:version]}'), :silence => true)
|
227
233
|
if distro.downcase == "fedora"
|
228
|
-
@test_lab.bootstrap_ssh.exec(%
|
234
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chroot #{cache_rootfs} /bin/bash -c 'rpm -Uvh --nodeps /tmp/*rpm'), :silence => true)
|
229
235
|
end
|
230
|
-
@test_lab.bootstrap_ssh.exec(%
|
231
|
-
@test_lab.bootstrap_ssh.exec(%
|
236
|
+
@test_lab.bootstrap_ssh.exec(%(sudo lxc-destroy -n #{name}), :silence => true)
|
237
|
+
@test_lab.bootstrap_ssh.exec(%(sudo #{create_command(name, distro, release, arch)}), :silence => true)
|
232
238
|
end
|
233
239
|
|
234
240
|
lab_ssh_path = File.join(Cucumber::Chef.lab_user_home_dir, ".ssh")
|
235
241
|
ssh_path = File.join(root(name), Cucumber::Chef.lxc_user_home_dir, ".ssh")
|
236
242
|
motd_path = File.join(root(name), "etc", "motd")
|
237
243
|
|
238
|
-
@test_lab.bootstrap_ssh.exec(%
|
239
|
-
@test_lab.bootstrap_ssh.exec(%
|
240
|
-
@test_lab.bootstrap_ssh.exec(%
|
244
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mkdir -vp #{ssh_path}), :silence => true)
|
245
|
+
@test_lab.bootstrap_ssh.exec(%(sudo chmod 0700 #{ssh_path}), :silence => true)
|
246
|
+
@test_lab.bootstrap_ssh.exec(%(sudo cat #{File.join(lab_ssh_path, "id_rsa.pub")} | sudo tee -a #{File.join(ssh_path, "authorized_keys")}), :silence => true)
|
241
247
|
|
242
|
-
@test_lab.bootstrap_ssh.exec(%
|
243
|
-
@test_lab.bootstrap_ssh.exec(%
|
244
|
-
@test_lab.bootstrap_ssh.exec(%
|
245
|
-
@test_lab.bootstrap_ssh.exec(%
|
246
|
-
@test_lab.bootstrap_ssh.exec(%
|
248
|
+
@test_lab.bootstrap_ssh.exec(%(sudo rm -vf #{motd_path}), :silence => true)
|
249
|
+
@test_lab.bootstrap_ssh.exec(%(sudo cp -v /etc/motd #{motd_path}), :silence => true)
|
250
|
+
@test_lab.bootstrap_ssh.exec(%(echo " You are now logged in to the "#{name}" container!\n" | sudo tee -a #{motd_path}), :silence => true)
|
251
|
+
@test_lab.bootstrap_ssh.exec(%(echo "127.0.0.1 #{name}.#{Cucumber::Chef::Config.test_lab[:tld]} #{name}" | sudo tee -a #{File.join(root(name), "etc", "hosts")}), :silence => true)
|
252
|
+
@test_lab.bootstrap_ssh.exec(%(echo "#{name}.test-lab" | sudo tee #{File.join(root(name), "etc", "hostname")}), :silence => true)
|
247
253
|
end
|
248
254
|
start(name)
|
249
255
|
end
|
@@ -251,26 +257,26 @@ module Cucumber
|
|
251
257
|
################################################################################
|
252
258
|
|
253
259
|
def start(name)
|
254
|
-
status = @test_lab.bootstrap_ssh.exec(
|
260
|
+
status = @test_lab.bootstrap_ssh.exec(%(sudo lxc-info -n #{name}), :silence => true).output
|
255
261
|
if status.include?("STOPPED")
|
256
|
-
@test_lab.bootstrap_ssh.exec(
|
262
|
+
@test_lab.bootstrap_ssh.exec(%(sudo lxc-start -d -n #{name}), :silence => true)
|
257
263
|
end
|
258
264
|
end
|
259
265
|
|
260
266
|
def stop(name)
|
261
|
-
status = @test_lab.bootstrap_ssh.exec(
|
267
|
+
status = @test_lab.bootstrap_ssh.exec(%(sudo lxc-info -n #{name}), :silence => true).output
|
262
268
|
if status.include?("RUNNING")
|
263
|
-
@test_lab.bootstrap_ssh.exec(
|
269
|
+
@test_lab.bootstrap_ssh.exec(%(sudo lxc-stop -n #{name}), :silence => true)
|
264
270
|
end
|
265
271
|
end
|
266
272
|
|
267
273
|
################################################################################
|
268
274
|
|
269
275
|
def chef_config_client(container)
|
270
|
-
tempfile = Tempfile.new(container.
|
271
|
-
client_rb = File.join("/", root(container.
|
276
|
+
tempfile = Tempfile.new(container.id)
|
277
|
+
client_rb = File.join("/", root(container.id), "etc/chef/client.rb")
|
272
278
|
|
273
|
-
@test_lab.bootstrap_ssh.exec(%
|
279
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mkdir -pv #{File.dirname(client_rb)}), :silence => true)
|
274
280
|
|
275
281
|
if Cucumber::Chef::Config.chef[:render_client_rb]
|
276
282
|
max_key_size = @chef_client_config.keys.collect{ |z| z.to_s.size }.max
|
@@ -278,7 +284,7 @@ module Cucumber
|
|
278
284
|
File.open(tempfile, 'w') do |f|
|
279
285
|
f.puts(Cucumber::Chef.generate_do_not_edit_warning("Chef Client Configuration"))
|
280
286
|
f.puts
|
281
|
-
@chef_client_config.merge(:node_name => container.
|
287
|
+
@chef_client_config.merge(:node_name => container.id).each do |(key,value)|
|
282
288
|
next if value.nil?
|
283
289
|
f.puts("%-#{max_key_size}s %s" % [key, value.inspect])
|
284
290
|
end
|
@@ -286,25 +292,25 @@ module Cucumber
|
|
286
292
|
f.puts("Mixlib::Log::Formatter.show_time = true")
|
287
293
|
end
|
288
294
|
@test_lab.bootstrap_ssh.upload(tempfile.path, File.basename(tempfile.path))
|
289
|
-
@test_lab.bootstrap_ssh.exec(%
|
295
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mv -v #{File.basename(tempfile.path)} #{client_rb}), :silence => true)
|
290
296
|
else
|
291
|
-
@test_lab.bootstrap_ssh.exec(%
|
297
|
+
@test_lab.bootstrap_ssh.exec(%(sudo /bin/bash -c '[[ -f #{client_rb} ]] && rm -fv #{client_rb}'), :silence => true, :ignore_exit_status => true)
|
292
298
|
end
|
293
299
|
|
294
|
-
tempfile = Tempfile.new(container.
|
295
|
-
attributes_json = File.join("/", root(container.
|
296
|
-
@test_lab.bootstrap_ssh.exec(%
|
300
|
+
tempfile = Tempfile.new(container.id)
|
301
|
+
attributes_json = File.join("/", root(container.id), "etc", "chef", "attributes.json")
|
302
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mkdir -pv #{File.dirname(attributes_json)}), :silence => true)
|
297
303
|
File.open(tempfile, 'w') do |f|
|
298
304
|
f.puts((container.chef_client || {}).to_json)
|
299
305
|
end
|
300
306
|
@test_lab.bootstrap_ssh.upload(tempfile.path, File.basename(tempfile.path))
|
301
|
-
@test_lab.bootstrap_ssh.exec(%
|
307
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mv -v #{File.basename(tempfile.path)} #{attributes_json}), :silence => true)
|
302
308
|
|
303
309
|
# make sure our log location is there
|
304
|
-
log_location = File.join("/", root(container.
|
305
|
-
@test_lab.bootstrap_ssh.exec(%
|
310
|
+
log_location = File.join("/", root(container.id), @chef_client_config[:log_location])
|
311
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mkdir -pv #{File.dirname(log_location)}), :silence => true)
|
306
312
|
|
307
|
-
@test_lab.bootstrap_ssh.exec(%
|
313
|
+
@test_lab.bootstrap_ssh.exec(%(sudo cp /etc/chef/validation.pem #{root(container.id)}/etc/chef/), :silence => true)
|
308
314
|
|
309
315
|
true
|
310
316
|
end
|
@@ -312,14 +318,14 @@ module Cucumber
|
|
312
318
|
################################################################################
|
313
319
|
|
314
320
|
def chef_client_artifacts(container)
|
315
|
-
ssh = @test_lab.proxy_ssh(container.
|
321
|
+
ssh = @test_lab.proxy_ssh(container.id)
|
316
322
|
|
317
323
|
Cucumber::Chef::Config[:artifacts].each do |label, remote_path|
|
318
|
-
result = ssh.exec(
|
324
|
+
result = ssh.exec(%(sudo /bin/bash -c '[[ -f #{remote_path} ]] ; echo $? ; true'), :silence => true)
|
319
325
|
if (result.output =~ /0/)
|
320
|
-
@ui.logger.info { "Retrieving artifact '#{remote_path}' from container '#{container.
|
326
|
+
@ui.logger.info { "Retrieving artifact '#{remote_path}' from container '#{container.id}'." }
|
321
327
|
|
322
|
-
local_path = File.join(Cucumber::Chef.artifacts_dir, "#{container.
|
328
|
+
local_path = File.join(Cucumber::Chef.artifacts_dir, "#{container.id}-#{File.basename(remote_path)}")
|
323
329
|
tmp_path = File.join("/tmp", label)
|
324
330
|
|
325
331
|
FileUtils.mkdir_p(File.dirname(local_path))
|
@@ -339,8 +345,8 @@ module Cucumber
|
|
339
345
|
################################################################################
|
340
346
|
|
341
347
|
def config_network(container)
|
342
|
-
tempfile = Tempfile.new(container.
|
343
|
-
lxc_network_config = File.join("/etc/lxc", container.
|
348
|
+
tempfile = Tempfile.new(container.id)
|
349
|
+
lxc_network_config = File.join("/etc/lxc", container.id)
|
344
350
|
File.open(tempfile, 'w') do |f|
|
345
351
|
f.puts(Cucumber::Chef.generate_do_not_edit_warning("LXC Container Configuration"))
|
346
352
|
f.puts("")
|
@@ -352,7 +358,7 @@ module Cucumber
|
|
352
358
|
f.puts("lxc.network.ipv4 = 0.0.0.0")
|
353
359
|
end
|
354
360
|
@test_lab.bootstrap_ssh.upload(tempfile.path, File.basename(tempfile.path))
|
355
|
-
@test_lab.bootstrap_ssh.exec(%
|
361
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mv -v #{File.basename(tempfile.path)} #{lxc_network_config}), :silence => true)
|
356
362
|
end
|
357
363
|
|
358
364
|
################################################################################
|
@@ -366,17 +372,17 @@ module Cucumber
|
|
366
372
|
next if [container.mac, container.ip].any?{ |z| z.nil? }
|
367
373
|
|
368
374
|
f.puts
|
369
|
-
f.puts("host #{container.
|
375
|
+
f.puts("host #{container.id} {")
|
370
376
|
f.puts(" hardware ethernet #{container.mac};")
|
371
377
|
f.puts(" fixed-address #{container.ip};")
|
372
|
-
f.puts(" ddns-hostname \"#{container.
|
378
|
+
f.puts(" ddns-hostname \"#{container.id}\";")
|
373
379
|
f.puts("}")
|
374
380
|
end
|
375
381
|
f.flush
|
376
382
|
f.close
|
377
383
|
end
|
378
384
|
@test_lab.bootstrap_ssh.upload(tempfile.path, File.basename(tempfile.path))
|
379
|
-
@test_lab.bootstrap_ssh.exec(%
|
385
|
+
@test_lab.bootstrap_ssh.exec(%(sudo mv -v #{File.basename(tempfile.path)} #{dhcpd_config}), :silence => true)
|
380
386
|
|
381
387
|
@test_lab.bootstrap_ssh.exec("sudo service isc-dhcp-server restart", :silence => true)
|
382
388
|
@test_lab.bootstrap_ssh.exec("sudo service bind9 restart", :silence => true)
|
@@ -397,14 +403,14 @@ module Cucumber
|
|
397
403
|
################################################################################
|
398
404
|
|
399
405
|
def running?(name)
|
400
|
-
status = @test_lab.bootstrap_ssh.exec(
|
406
|
+
status = @test_lab.bootstrap_ssh.exec(%(sudo lxc-info -n #{name}), :silence => true).output.chomp
|
401
407
|
status.include?("RUNNING")
|
402
408
|
end
|
403
409
|
|
404
410
|
################################################################################
|
405
411
|
|
406
412
|
def exists?(name)
|
407
|
-
(@test_lab.bootstrap_ssh.exec(
|
413
|
+
(@test_lab.bootstrap_ssh.exec(%(sudo /bin/bash -c '[[ -d #{root(name)} ]] ; echo $? ; true'), :silence => true).output.chomp =~ /0/)
|
408
414
|
end
|
409
415
|
|
410
416
|
################################################################################
|
@@ -429,9 +435,9 @@ module Cucumber
|
|
429
435
|
def create_command(name, distro, release, arch)
|
430
436
|
case distro.downcase
|
431
437
|
when "ubuntu" then
|
432
|
-
|
438
|
+
%(sudo DEBIAN_FRONTEND=noninteractive lxc-create -n #{name} -f /etc/lxc/#{name} -t #{distro} -- --release #{release} --arch #{arch})
|
433
439
|
when "fedora" then
|
434
|
-
|
440
|
+
%(sudo lxc-create -n #{name} -f /etc/lxc/#{name} -t #{distro} -- --release #{release})
|
435
441
|
end
|
436
442
|
end
|
437
443
|
|