cucumber-chef 2.1.0.rc.1 → 2.1.0.rc.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,133 @@
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
+ module Cucumber
22
+ module Chef
23
+
24
+ class ServerError < Error; end
25
+
26
+ class Server
27
+ attr_accessor :test_lab, :stdout, :stderr, :stdin, :logger
28
+
29
+ ################################################################################
30
+
31
+ def initialize(test_lab, stdout=STDOUT, stderr=STDERR, stdin=STDIN, logger=$logger)
32
+ @stdout, @stderr, @stdin, @logger = stdout, stderr, stdin, logger
33
+ @stdout.sync = true if @stdout.respond_to?(:sync=)
34
+
35
+ @test_lab = test_lab
36
+ end
37
+
38
+ ################################################################################
39
+
40
+ def up
41
+ user = Cucumber::Chef.lab_user
42
+ home_dir = Cucumber::Chef.lab_user_home_dir
43
+ provider = Cucumber::Chef::Config[:provider].to_s
44
+ @test_lab.ssh.exec("sudo mkdir -p #{File.join(home_dir, ".cucumber-chef", provider)}")
45
+ @test_lab.ssh.exec("sudo cp -f #{File.join(home_dir, ".chef", "knife.rb")} #{File.join(home_dir, ".cucumber-chef", provider, "knife.rb")}")
46
+ @test_lab.ssh.exec("sudo chown -R #{user}:#{user} #{File.join(home_dir, ".cucumber-chef")}")
47
+
48
+ local_file = Cucumber::Chef.config_rb
49
+ remote_file = File.join(home_dir, ".cucumber-chef", "config.rb")
50
+ @test_lab.ssh.upload(local_file, remote_file)
51
+
52
+ @server_thread = Thread.new do
53
+ @test_lab.ssh.exec("sudo pkill -9 -f cc-server")
54
+
55
+ destroy = (ENV['DESTROY'] == '1' ? "DESTROY='1'" : nil)
56
+ verbose = (ENV['VERBOSE'] == '1' ? "VERBOSE='1'" : nil)
57
+ log_level = ((!ENV['LOG_LEVEL'].nil? && !ENV['LOG_LEVEL'].empty?) ? "LOG_LEVEL=#{ENV['LOG_LEVEL'].inspect}" : nil)
58
+ command = ["sudo", destroy, verbose, log_level, "cc-server", Cucumber::Chef.external_ip].compact.join(" ")
59
+ @test_lab.ssh.exec(command, :silence => false)
60
+
61
+ Kernel.at_exit do
62
+ @test_lab.ssh.close
63
+ end
64
+ end
65
+
66
+ sleep(3)
67
+ ZTK::TCPSocketCheck.new(:host => @test_lab.ip, :port => 8787, :data => "\n\n").wait
68
+
69
+ artifacts = File.join(Cucumber::Chef.home_dir, "artifacts")
70
+ File.exists?(artifacts) && FileUtils.rm_rf(artifacts)
71
+
72
+ @server_thread
73
+ end
74
+
75
+ ################################################################################
76
+
77
+ def down
78
+ end
79
+
80
+ ################################################################################
81
+
82
+ def before(scenario)
83
+ # store the current scenario here; espcially since I don't know a better way to get at this information
84
+ # we use various aspects of the scenario to name our artifacts
85
+ $scenario = scenario
86
+
87
+ # cleanup previous lxc containers if asked
88
+ if ENV['DESTROY']
89
+ Cucumber::Chef.logger.info("'containers' are being destroyed")
90
+ @test_lab.drb.servers.each do |name, value|
91
+ @test_lab.drb.server_destroy(name)
92
+ end
93
+ File.exists?(Cucumber::Chef.servers_bin) && File.delete(Cucumber::Chef.servers_bin)
94
+ else
95
+ Cucumber::Chef.logger.info("'containers' are being persisted")
96
+ end
97
+
98
+ if File.exists?(Cucumber::Chef.servers_bin)
99
+ @test_lab.drb.servers = (Marshal.load(IO.read(Cucumber::Chef.servers_bin)) rescue Hash.new(nil))
100
+ end
101
+
102
+ @test_lab.drb.chef_set_client_config(:chef_server_url => "http://192.168.255.254:4000",
103
+ :validation_client_name => "chef-validator")
104
+ end
105
+
106
+ ################################################################################
107
+
108
+ def after(scenario)
109
+ File.open(Cucumber::Chef.servers_bin, 'w') do |f|
110
+ f.puts(Marshal.dump(@test_lab.drb.servers))
111
+ end
112
+
113
+ # cleanup non-persistent lxc containers between tests
114
+ @test_lab.drb.servers.select{ |name, attributes| !attributes[:persist] }.each do |name, attributes|
115
+ @test_lab.drb.server_destroy(name)
116
+ end
117
+ end
118
+
119
+ ################################################################################
120
+
121
+ def at_exit
122
+ @test_lab.drb.shutdown
123
+ @server_thread.kill
124
+ end
125
+
126
+ ################################################################################
127
+
128
+ end
129
+
130
+ end
131
+ end
132
+
133
+ ################################################################################
@@ -11,9 +11,9 @@ When /^I have the following SSH sessions:$/ do |table|
11
11
  @ssh_sessions[id] and !@ssh_sessions[id].closed? and @ssh_sessions[id].close
12
12
  @ssh_sessions[id] = ZTK::SSH.new
13
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}")
14
+ @ssh_sessions[id].config.proxy_host_name = $test_lab.ip
15
+ @ssh_sessions[id].config.proxy_user = Cucumber::Chef.lab_user
16
+ @ssh_sessions[id].config.proxy_keys = Cucumber::Chef.lab_identity
17
17
 
18
18
  hash['hostname'] and (@ssh_sessions[id].config.host_name = hash['hostname'])
19
19
  hash['username'] and (@ssh_sessions[id].config.user = hash['username'])
@@ -32,14 +32,29 @@ When /^I ssh to "([^\"]*)" with the following credentials:$/ do |hostname, table
32
32
  @connection and !@connection.ssh.closed? and @connection.ssh.close
33
33
  @connection = ZTK::SSH.new
34
34
 
35
- @connection.config.proxy_host_name = $test_lab.labs_running.first.public_ip_address
36
- @connection.config.proxy_user = "ubuntu"
37
- @connection.config.proxy_keys = Cucumber::Chef.locate(:file, ".cucumber-chef", "id_rsa-#{@connection.config.proxy_user}")
35
+ @connection.config.proxy_host_name = $test_lab.ip
36
+ @connection.config.proxy_port = $test_lab.port
37
+ @connection.config.proxy_user = Cucumber::Chef.lab_user
38
+ @connection.config.proxy_keys = Cucumber::Chef.lab_identity
38
39
 
39
40
  hostname and (@connection.config.host_name = hostname)
40
- session["username"] and (@connection.config.user = session["username"])
41
41
  session["password"] and (@connection.config.password = session["password"])
42
- session["keyfile"] and (@connection.config.keys = session["keyfile"])
42
+
43
+ if username = session["username"]
44
+ if username == "$lxc$"
45
+ @connection.config.user = Cucumber::Chef.lxc_user
46
+ else
47
+ @connection.config.user = username
48
+ end
49
+ end
50
+
51
+ if keyfile = session["keyfile"]
52
+ if keyfile == "$lxc$"
53
+ @connection.config.keys = Cucumber::Chef.lxc_identity
54
+ else
55
+ @connection.config.keys = keyfile
56
+ end
57
+ end
43
58
 
44
59
  }.should_not raise_error
45
60
  end
@@ -4,7 +4,7 @@ CUCUMBER_CHEF_BOOTSTRAP_DONE="/.cucumber-chef-bootstrap-finished"
4
4
 
5
5
  export DEBIAN_FRONTEND=noninteractive
6
6
 
7
- sed -i "s/127.0.0.1 localhost/127.0.0.1 <%= @hostname %> <%= @hostname.split(".")[0] %> localhost/" /etc/hosts
7
+ echo "127.0.0.1 <%= @hostname %>" | tee -a /etc/hosts
8
8
  echo "<%= @hostname %>" | tee /etc/hostname
9
9
  hostname <%= @hostname %>
10
10
 
@@ -1,7 +1,7 @@
1
1
  ################################################################################
2
2
  #
3
3
  # Author: Zachary Patten <zachary@jovelabs.com>
4
- # Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
4
+ # Copyright: Copyright (c) 2011-2012 Atalanta Systems Ltd
5
5
  # License: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,33 +20,11 @@
20
20
 
21
21
  tag = Cucumber::Chef.tag("cucumber-chef")
22
22
  puts(" * #{tag}")
23
- Cucumber::Chef.load_config(tag)
23
+ Cucumber::Chef.boot(tag)
24
24
 
25
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"))
26
+ $cc_server = Cucumber::Chef::Server.new($test_lab)
27
+ $cc_server.up
50
28
  else
51
29
  message = "No running cucumber-chef test labs to connect to!"
52
30
  Cucumber::Chef.logger.fatal { message }
@@ -55,57 +33,19 @@ end
55
33
 
56
34
 
57
35
  ################################################################################
58
- # BEFORE HOOK
36
+ # HOOKS
59
37
  ################################################################################
60
38
 
61
39
  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")
40
+ $cc_server.before(scenario)
83
41
  end
84
42
 
85
-
86
- ################################################################################
87
- # AFTER HOOK
88
- ################################################################################
89
-
90
43
  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
44
+ $cc_server.after(scenario)
99
45
  end
100
46
 
101
-
102
- ################################################################################
103
- # EXIT HOOK
104
- ################################################################################
105
-
106
47
  Kernel.at_exit do
107
- $test_lab.drb.shutdown
108
- $cc_server_thread.kill
48
+ $cc_server.at_exit
109
49
  end
110
50
 
111
51
  ################################################################################
@@ -25,40 +25,27 @@ module Cucumber
25
25
  class TestLabError < Error; end
26
26
 
27
27
  class TestLab
28
- attr_reader :connection, :server
29
- attr_accessor :stdout, :stderr, :stdin
30
-
31
- INVALID_STATES = %w( terminated pending )
32
- RUNNING_STATES = %w( running starting-up )
33
- SHUTDOWN_STATES = %w( shutdown stopping stopped shutting-down )
34
- VALID_STATES = RUNNING_STATES+SHUTDOWN_STATES
28
+ attr_accessor :provider, :stdout, :stderr, :stdin, :logger
35
29
 
36
30
  ################################################################################
37
31
 
38
- def initialize(stdout=STDOUT, stderr=STDERR, stdin=STDIN)
39
- @stdout, @stderr, @stdin = stdout, stderr, stdin
32
+ def initialize(stdout=STDOUT, stderr=STDERR, stdin=STDIN, logger=$logger)
33
+ @stdout, @stderr, @stdin, @logger = stdout, stderr, stdin, logger
40
34
  @stdout.sync = true if @stdout.respond_to?(:sync=)
41
35
 
42
- @connection = Fog::Compute.new(
43
- :provider => 'AWS',
44
- :aws_access_key_id => Cucumber::Chef::Config[:aws][:aws_access_key_id],
45
- :aws_secret_access_key => Cucumber::Chef::Config[:aws][:aws_secret_access_key],
46
- :region => Cucumber::Chef::Config[:aws][:region]
47
- )
48
- ensure_security_group
36
+ @provider = Cucumber::Chef::Provider.new(@stdout, @stderr, @stdin, @logger)
49
37
  end
50
38
 
51
39
  ################################################################################
52
40
 
53
41
  def ssh
54
42
  if (!defined?(@ssh) || @ssh.nil?)
55
- ssh_private_key_file = Cucumber::Chef.locate(:file, ".cucumber-chef", "id_rsa-#{Cucumber::Chef::Config[:lab_user]}")
56
- File.chmod(0400, ssh_private_key_file)
57
43
  @ssh ||= ZTK::SSH.new
58
44
 
59
- @ssh.config.host_name = self.labs_running.first.public_ip_address
60
- @ssh.config.user = Cucumber::Chef::Config[:lab_user]
61
- @ssh.config.keys = ssh_private_key_file
45
+ @ssh.config.host_name = self.ip
46
+ @ssh.config.port = self.port
47
+ @ssh.config.user = Cucumber::Chef.lab_user
48
+ @ssh.config.keys = Cucumber::Chef.lab_identity
62
49
  end
63
50
  @ssh
64
51
  end
@@ -69,17 +56,16 @@ module Cucumber
69
56
  container = container.to_sym
70
57
  @proxy_ssh ||= Hash.new
71
58
  if (!defined?(@proxy_ssh[container]) || @proxy_ssh[container].nil?)
72
- ssh_private_key_file = Cucumber::Chef.locate(:file, ".cucumber-chef", "id_rsa-#{Cucumber::Chef::Config[:lab_user]}")
73
- File.chmod(0400, ssh_private_key_file)
74
59
  @proxy_ssh[container] ||= ZTK::SSH.new
75
60
 
76
- @proxy_ssh[container].config.proxy_host_name = self.labs_running.first.public_ip_address
77
- @proxy_ssh[container].config.proxy_user = Cucumber::Chef::Config[:lab_user]
78
- @proxy_ssh[container].config.proxy_keys = ssh_private_key_file
61
+ @proxy_ssh[container].config.proxy_host_name = self.ip
62
+ @proxy_ssh[container].config.proxy_port = self.port
63
+ @proxy_ssh[container].config.proxy_user = Cucumber::Chef.lab_user
64
+ @proxy_ssh[container].config.proxy_keys = Cucumber::Chef.lab_identity
79
65
 
80
66
  @proxy_ssh[container].config.host_name = container
81
- @proxy_ssh[container].config.user = Cucumber::Chef::Config[:lxc_user]
82
- @proxy_ssh[container].config.keys = ssh_private_key_file
67
+ @proxy_ssh[container].config.user = Cucumber::Chef.lxc_user
68
+ @proxy_ssh[container].config.keys = Cucumber::Chef.lxc_identity
83
69
  end
84
70
  @proxy_ssh[container]
85
71
  end
@@ -88,7 +74,7 @@ module Cucumber
88
74
 
89
75
  def drb
90
76
  if (!defined?(@drb) || @drb.nil?)
91
- @drb ||= DRbObject.new_with_uri("druby://#{self.labs_running.first.public_ip_address}:8787")
77
+ @drb ||= DRbObject.new_with_uri("druby://#{self.ip}:8787")
92
78
  @drb and DRb.start_service
93
79
  @drb.servers = Hash.new(nil)
94
80
  end
@@ -97,287 +83,12 @@ module Cucumber
97
83
 
98
84
  ################################################################################
99
85
 
100
- def create
101
- if (lab_exists? && (@server = labs_running.first))
102
- @stdout.puts("A test lab already exists using the AWS credentials you have supplied; attempting to reprovision it.")
103
- else
104
- server_definition = {
105
- :image_id => Cucumber::Chef::Config.aws_image_id,
106
- :groups => Cucumber::Chef::Config[:aws][:aws_security_group],
107
- :flavor_id => Cucumber::Chef::Config[:aws][:aws_instance_type],
108
- :key_name => Cucumber::Chef::Config[:aws][:aws_ssh_key_id],
109
- :availability_zone => Cucumber::Chef::Config[:aws][:availability_zone],
110
- :tags => { "purpose" => "cucumber-chef", "cucumber-chef-mode" => Cucumber::Chef::Config[:mode] },
111
- :identity_file => Cucumber::Chef::Config[:aws][:identity_file]
112
- }
113
- if (@server = @connection.servers.create(server_definition))
114
- @stdout.puts("Provisioning cucumber-chef test lab platform.")
115
-
116
- @stdout.print("Waiting for instance...")
117
- Cucumber::Chef.spinner do
118
- @server.wait_for { ready? }
119
- end
120
- @stdout.puts("done.\n")
121
-
122
- tag_server
123
-
124
- @stdout.print("Waiting for 20 seconds...")
125
- Cucumber::Chef.spinner do
126
- sleep(20)
127
- end
128
- @stdout.print("done.\n")
129
- end
130
- end
131
-
132
- if @server
133
- @stdout.print("Waiting for SSHD...")
134
- Cucumber::Chef.spinner do
135
- ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 22, :wait => 120).wait
136
- end
137
- @stdout.puts("done.\n")
138
- end
139
-
140
- @server
141
-
142
- rescue Exception => e
143
- Cucumber::Chef.logger.fatal { e.message }
144
- Cucumber::Chef.logger.fatal { "Backtrace:\n#{e.backtrace.join("\n")}" }
145
- raise TestLabError, e.message
146
- end
147
-
148
- ################################################################################
149
-
150
- def destroy
151
- if ((l = labs).count > 0)
152
- @stdout.puts("Destroying Servers:")
153
- l.each do |server|
154
- @stdout.puts(" * #{server.public_ip_address}")
155
- server.destroy
156
- end
157
- else
158
- @stdout.puts("There are no cucumber-chef test labs to destroy!")
159
- end
160
-
161
- rescue Exception => e
162
- Cucumber::Chef.logger.fatal { e.message }
163
- Cucumber::Chef.logger.fatal { e.backtrace.join("\n") }
164
- raise TestLabError, e.message
165
- end
166
-
167
- ################################################################################
168
-
169
- def start
170
- if (lab_exists? && (@server = labs_shutdown.first))
171
- if @server.start
172
-
173
- @stdout.print("Waiting for instance...")
174
- Cucumber::Chef.spinner do
175
- @server.wait_for { ready? }
176
- end
177
- @stdout.puts("done.\n")
178
-
179
- @stdout.print("Waiting for SSHD...")
180
- Cucumber::Chef.spinner do
181
- ZTK::TCPSocketCheck.new(:host => @server.public_ip_address, :port => 22, :wait => 120).wait
182
- end
183
- @stdout.puts("done.\n")
184
-
185
- @stdout.puts("Successfully started up cucumber-chef test lab!")
186
-
187
- info
188
- else
189
- @stdout.puts("Failed to start up cucumber-chef test lab!")
190
- end
191
- else
192
- @stdout.puts("There are no available cucumber-chef test labs to start up!")
193
- end
194
-
195
- rescue Exception => e
196
- Cucumber::Chef.logger.fatal { e.message }
197
- Cucumber::Chef.logger.fatal { e.backtrace.join("\n") }
198
- raise TestLabError, e.message
199
- end
200
-
201
-
202
- def stop
203
- if (lab_exists? && (@server = labs_running.first))
204
- if @server.stop
205
- @stdout.puts("Successfully shutdown cucumber-chef test lab!")
206
- else
207
- @stdout.puts("Failed to shutdown cucumber-chef test lab!")
208
- end
209
- else
210
- @stdout.puts("There are no available cucumber-chef test labs top shutdown!")
211
- end
212
-
213
- rescue Exception => e
214
- Cucumber::Chef.logger.fatal { e.message }
215
- Cucumber::Chef.logger.fatal { e.backtrace.join("\n") }
216
- raise TestLabError, e.message
217
- end
218
-
219
- ################################################################################
220
-
221
- def info
222
- if lab_exists?
223
- labs.each do |lab|
224
- @stdout.puts("Instance ID: #{lab.id}")
225
- @stdout.puts("State: #{lab.state}")
226
- @stdout.puts("Username: #{lab.username}") if lab.username
227
- if (lab.public_ip_address || lab.private_ip_address)
228
- @stdout.puts
229
- @stdout.puts("IP Address:")
230
- @stdout.puts(" Public...: #{lab.public_ip_address}") if lab.public_ip_address
231
- @stdout.puts(" Private..: #{lab.private_ip_address}") if lab.private_ip_address
232
- end
233
- if (lab.dns_name || lab.private_dns_name)
234
- @stdout.puts
235
- @stdout.puts("DNS:")
236
- @stdout.puts(" Public...: #{lab.dns_name}") if lab.dns_name
237
- @stdout.puts(" Private..: #{lab.private_dns_name}") if lab.private_dns_name
238
- end
239
- if (lab.tags.count > 0)
240
- @stdout.puts
241
- @stdout.puts("Tags:")
242
- lab.tags.to_hash.each do |k,v|
243
- @stdout.puts(" #{k}: #{v}")
244
- end
245
- end
246
- if lab.public_ip_address
247
- @stdout.puts
248
- @stdout.puts("Chef-Server WebUI:")
249
- @stdout.puts(" http://#{lab.public_ip_address}:4040/")
250
- end
251
- @stdout.puts
252
- if (labs_running.include?(lab) && (n = nodes))
253
- @stdout.puts
254
- @stdout.puts("Nodes:")
255
- n.each do |node|
256
- @stdout.puts(" * #{node.name} (#{node.cloud.public_ipv4})")
257
- end
258
- end
259
- if (labs_running.include?(lab) && (c = clients))
260
- @stdout.puts
261
- @stdout.puts("Clients:")
262
- c.each do |client|
263
- @stdout.puts(" * #{client.name}")
264
- end
265
- end
266
- end
267
- else
268
- @stdout.puts("There are no cucumber-chef test labs to display information for!")
269
- end
270
-
271
- rescue Exception => e
272
- Cucumber::Chef.logger.fatal { e.message }
273
- Cucumber::Chef.logger.fatal { e.backtrace.join("\n") }
274
- raise TestLabError, e.message
275
- end
276
-
277
- ################################################################################
278
-
279
- def lab_exists?
280
- (labs.size > 0)
281
- end
282
-
283
- ################################################################################
284
-
285
- def labs
286
- results = @connection.servers.select do |server|
287
- Cucumber::Chef.logger.debug("candidate") { "ID=#{server.id}, state='#{server.state}'" }
288
- ( server.tags['cucumber-chef-mode'] == Cucumber::Chef::Config[:mode].to_s &&
289
- server.tags['cucumber-chef-user'] == Cucumber::Chef::Config[:user].to_s &&
290
- VALID_STATES.any?{ |state| state == server.state } )
291
- end
292
- results.each do |server|
293
- Cucumber::Chef.logger.debug("results") { "ID=#{server.id}, state='#{server.state}'" }
294
- end
295
- results
296
- end
297
-
298
- ################################################################################
299
-
300
- def labs_running
301
- results = @connection.servers.select do |server|
302
- Cucumber::Chef.logger.debug("candidate") { "ID=#{server.id}, state='#{server.state}'" }
303
- ( server.tags['cucumber-chef-mode'] == Cucumber::Chef::Config[:mode].to_s &&
304
- server.tags['cucumber-chef-user'] == Cucumber::Chef::Config[:user].to_s &&
305
- RUNNING_STATES.any?{ |state| state == server.state } )
306
- end
307
- results.each do |server|
308
- Cucumber::Chef.logger.debug("results") { "ID=#{server.id}, state='#{server.state}'" }
309
- end
310
- results
311
- end
312
-
313
- ################################################################################
314
-
315
- def labs_shutdown
316
- results = @connection.servers.select do |server|
317
- Cucumber::Chef.logger.debug("candidate") { "ID=#{server.id}, state='#{server.state}'" }
318
- ( server.tags['cucumber-chef-mode'] == Cucumber::Chef::Config[:mode].to_s &&
319
- server.tags['cucumber-chef-user'] == Cucumber::Chef::Config[:user].to_s &&
320
- SHUTDOWN_STATES.any?{ |state| state == server.state } )
321
- end
322
- results.each do |server|
323
- Cucumber::Chef.logger.debug("results") { "ID=#{server.id}, state='#{server.state}'" }
324
- end
325
- results
326
- end
327
-
328
- ################################################################################
329
-
330
- def nodes
331
- Cucumber::Chef.load_knife
332
- query = "tags:#{Cucumber::Chef::Config[:mode]} AND tags:#{Cucumber::Chef::Config[:user]}"
333
- Cucumber::Chef.logger.debug { "query(#{query})" }
334
- nodes, offset, total = ::Chef::Search::Query.new.search("node", URI.escape(query))
335
- nodes.compact
336
- end
337
-
338
- def clients
339
- Cucumber::Chef.load_knife
340
- query = "tags:#{Cucumber::Chef::Config[:mode]} AND tags:#{Cucumber::Chef::Config[:user]}"
341
- Cucumber::Chef.logger.debug { "query(#{query})" }
342
- clients, offset, total = ::Chef::Search::Query.new.search("client", URI.escape(query))
343
- clients.compact
344
- end
345
-
346
-
347
- ################################################################################
348
- private
349
- ################################################################################
350
-
351
- def tag_server
352
- {
353
- "cucumber-chef-mode" => Cucumber::Chef::Config[:mode],
354
- "cucumber-chef-user" => Cucumber::Chef::Config[:user],
355
- "purpose" => "cucumber-chef"
356
- }.each do |k, v|
357
- tag = @connection.tags.new
358
- tag.resource_id = @server.id
359
- tag.key, tag.value = k, v
360
- tag.save
361
- end
362
- end
363
-
364
- ################################################################################
365
-
366
- def ensure_security_group
367
- security_group_name = Cucumber::Chef::Config[:aws][:aws_security_group]
368
- if (security_group = @connection.security_groups.get(security_group_name))
369
- port_ranges = security_group.ip_permissions.collect{ |entry| entry["fromPort"]..entry["toPort"] }
370
- security_group.authorize_port_range(22..22) if port_ranges.none?{ |port_range| port_range === 22 }
371
- security_group.authorize_port_range(4000..4000) if port_ranges.none?{ |port_range| port_range === 4000 }
372
- security_group.authorize_port_range(4040..4040) if port_ranges.none?{ |port_range| port_range === 4040 }
373
- security_group.authorize_port_range(8787..8787) if port_ranges.none?{ |port_range| port_range === 8787 }
374
- elsif (security_group = @connection.security_groups.new(:name => security_group_name, :description => "cucumber-chef test lab")).save
375
- security_group.authorize_port_range(22..22)
376
- security_group.authorize_port_range(4000..4000)
377
- security_group.authorize_port_range(4040..4040)
378
- security_group.authorize_port_range(8787..8787)
86
+ def method_missing(method_name, *method_args)
87
+ if Cucumber::Chef::Provider::PROXY_METHODS.include?(method_name.to_s)
88
+ Cucumber::Chef.logger.debug { "test_lab: #{method_name} #{method_args.inspect}" }
89
+ @provider.send(method_name.to_sym, *method_args)
379
90
  else
380
- raise TestLabError, "Could not find an existing or create a new AWS security group."
91
+ super(method_name, *method_args)
381
92
  end
382
93
  end
383
94