cucumber-chef 2.1.0.rc.11 → 2.1.0.rc.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,7 +25,7 @@ module Cucumber
25
25
  class TestLabError < Error; end
26
26
 
27
27
  class TestLab
28
- attr_accessor :provider
28
+ attr_accessor :provider, :containers
29
29
 
30
30
  ################################################################################
31
31
 
@@ -33,31 +33,28 @@ module Cucumber
33
33
  @ui = ui
34
34
 
35
35
  @provider = Cucumber::Chef::Provider.new(@ui)
36
+ @containers = Cucumber::Chef::Containers.new(@ui, self)
36
37
  end
37
38
 
38
39
  ################################################################################
39
40
 
40
- def bootstrap_ssh
41
- dead? and raise TestLabError, "The test lab must be running in order to start a bootstrap SSH session!"
41
+ def bootstrap_ssh(options={})
42
+ if (!defined?(@bootstrap_ssh) || @bootstrap_ssh.nil?)
43
+ @bootstrap_ssh ||= ZTK::SSH.new({:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout}.merge(options))
42
44
 
43
- if (!defined?(@ssh) || @ssh.nil?)
44
- @ssh ||= ZTK::SSH.new(:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout)
45
-
46
- @ssh.config.host_name = self.ip
47
- @ssh.config.port = self.port
48
- @ssh.config.user = Cucumber::Chef.bootstrap_user
49
- @ssh.config.keys = Cucumber::Chef.bootstrap_identity
45
+ @bootstrap_ssh.config.host_name = self.ip
46
+ @bootstrap_ssh.config.port = self.port
47
+ @bootstrap_ssh.config.user = Cucumber::Chef.bootstrap_user
48
+ @bootstrap_ssh.config.keys = Cucumber::Chef.bootstrap_identity
50
49
  end
51
- @ssh
50
+ @bootstrap_ssh
52
51
  end
53
52
 
54
53
  ################################################################################
55
54
 
56
- def ssh
57
- dead? and raise TestLabError, "The test lab must be running in order to start an SSH session!"
58
-
55
+ def ssh(options={})
59
56
  if (!defined?(@ssh) || @ssh.nil?)
60
- @ssh ||= ZTK::SSH.new(:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout)
57
+ @ssh ||= ZTK::SSH.new({:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout}.merge(options))
61
58
 
62
59
  @ssh.config.host_name = self.ip
63
60
  @ssh.config.port = self.port
@@ -69,13 +66,11 @@ module Cucumber
69
66
 
70
67
  ################################################################################
71
68
 
72
- def proxy_ssh(container)
73
- dead? and raise TestLabError, "The test lab must be running in order to start a proxy SSH session!"
74
-
69
+ def proxy_ssh(container, options={})
75
70
  container = container.to_sym
76
71
  @proxy_ssh ||= Hash.new
77
72
  if (!defined?(@proxy_ssh[container]) || @proxy_ssh[container].nil?)
78
- @proxy_ssh[container] ||= ZTK::SSH.new(:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout)
73
+ @proxy_ssh[container] ||= ZTK::SSH.new({:ui => @ui, :timeout => Cucumber::Chef::Config.command_timeout}.merge(options))
79
74
 
80
75
  @proxy_ssh[container].config.proxy_host_name = self.ip
81
76
  @proxy_ssh[container].config.proxy_port = self.port
@@ -89,38 +84,18 @@ module Cucumber
89
84
  @proxy_ssh[container]
90
85
  end
91
86
 
92
- ################################################################################
93
-
94
- def cc_client
95
- dead? and raise TestLabError, "The test lab must be running in order to start the cc-server/client session!"
96
-
97
- @cc_client ||= Cucumber::Chef::Client.new(self, @ui)
98
- @cc_client
99
- end
100
-
101
- ################################################################################
102
-
103
- def drb
104
- dead? and raise TestLabError, "The test lab must be running in order to start a Drb session!"
105
-
106
- self.cc_client.drb
107
- end
108
-
109
87
  ################################################################################
110
88
 
111
89
  def knife_cli(args, options={})
112
90
  options = {:silence => true}.merge(options)
113
91
 
114
- extracted_options = options.select{ |k,v| [:silence, :expected_exit_code].include?(k) }
115
- options.reject!{ |k,v| [:silence, :expected_exit_code].include?(k) }
116
-
117
92
  arguments = Array.new
118
93
  arguments << "--user #{Cucumber::Chef::Config.user}"
119
94
  arguments << "--server-url #{self.chef_server_api}"
120
95
  arguments << "--config #{Cucumber::Chef.knife_rb}" if File.exists?(Cucumber::Chef.knife_rb)
121
96
 
122
97
  command = Cucumber::Chef.build_command("knife", args, arguments)
123
- ZTK::Command.new(options).exec(command, extracted_options)
98
+ ZTK::Command.new.exec(command, options)
124
99
  end
125
100
 
126
101
  ################################################################################
@@ -24,7 +24,7 @@ module Cucumber
24
24
 
25
25
  ################################################################################
26
26
 
27
- VERSION = "2.1.0.rc.11" unless const_defined?(:VERSION)
27
+ VERSION = "2.1.0.rc.12" unless const_defined?(:VERSION)
28
28
 
29
29
  ################################################################################
30
30
 
data/lib/cucumber/chef.rb CHANGED
@@ -19,10 +19,6 @@
19
19
  #
20
20
  ################################################################################
21
21
 
22
- require 'drb'
23
- require 'readline'
24
- require 'socket'
25
- require 'stringio'
26
22
  require 'benchmark'
27
23
 
28
24
  ################################################################################
@@ -48,6 +44,7 @@ module Cucumber
48
44
 
49
45
  autoload :Client, 'cucumber/chef/client'
50
46
  autoload :Config, 'cucumber/chef/config'
47
+ autoload :Containers, 'cucumber/chef/containers'
51
48
  autoload :Provider, 'cucumber/chef/provider'
52
49
  autoload :Provisioner, 'cucumber/chef/provisioner'
53
50
  autoload :TestLab, 'cucumber/chef/test_lab'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber-chef
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0.rc.11
4
+ version: 2.1.0.rc.12
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -147,7 +147,7 @@ dependencies:
147
147
  requirements:
148
148
  - - ! '>='
149
149
  - !ruby/object:Gem::Version
150
- version: 1.0.0
150
+ version: 1.0.1
151
151
  type: :runtime
152
152
  prerelease: false
153
153
  version_requirements: !ruby/object:Gem::Requirement
@@ -155,7 +155,7 @@ dependencies:
155
155
  requirements:
156
156
  - - ! '>='
157
157
  - !ruby/object:Gem::Version
158
- version: 1.0.0
158
+ version: 1.0.1
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: simplecov
161
161
  requirement: !ruby/object:Gem::Requirement
@@ -227,8 +227,6 @@ email:
227
227
  executables:
228
228
  - cc-console
229
229
  - cc-knife
230
- - cc-push
231
- - cc-server
232
230
  - cucumber-chef
233
231
  extensions: []
234
232
  extra_rdoc_files: []
@@ -245,8 +243,6 @@ files:
245
243
  - TODO.md
246
244
  - bin/cc-console
247
245
  - bin/cc-knife
248
- - bin/cc-push
249
- - bin/cc-server
250
246
  - bin/cucumber-chef
251
247
  - chef_repo/cookbooks/cucumber-chef/LICENSE
252
248
  - chef_repo/cookbooks/cucumber-chef/README.md
@@ -258,7 +254,6 @@ files:
258
254
  - chef_repo/cookbooks/cucumber-chef/templates/default/db-168-192.erb
259
255
  - chef_repo/cookbooks/cucumber-chef/templates/default/db-test-lab.erb
260
256
  - chef_repo/cookbooks/cucumber-chef/templates/default/dhcpd-conf.erb
261
- - chef_repo/cookbooks/cucumber-chef/templates/default/gemrc.erb
262
257
  - chef_repo/cookbooks/cucumber-chef/templates/default/lxc-initializer-config.erb
263
258
  - chef_repo/cookbooks/cucumber-chef/templates/default/lxc-install-chef.erb
264
259
  - chef_repo/cookbooks/cucumber-chef/templates/default/motd.erb
@@ -284,15 +279,7 @@ files:
284
279
  - lib/cucumber/chef.rb
285
280
  - lib/cucumber/chef/client.rb
286
281
  - lib/cucumber/chef/config.rb
287
- - lib/cucumber/chef/helpers.rb
288
- - lib/cucumber/chef/helpers/chef_client.rb
289
- - lib/cucumber/chef/helpers/chef_server.rb
290
- - lib/cucumber/chef/helpers/command.rb
291
- - lib/cucumber/chef/helpers/container.rb
292
- - lib/cucumber/chef/helpers/minitest.rb
293
- - lib/cucumber/chef/helpers/server.rb
294
- - lib/cucumber/chef/helpers/test_lab.rb
295
- - lib/cucumber/chef/helpers/utility.rb
282
+ - lib/cucumber/chef/containers.rb
296
283
  - lib/cucumber/chef/provider.rb
297
284
  - lib/cucumber/chef/providers/aws.rb
298
285
  - lib/cucumber/chef/providers/vagrant.rb
data/bin/cc-push DELETED
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'cucumber-chef'
3
-
4
- tag = Cucumber::Chef.tag("cc-push")
5
- puts(tag)
6
- Cucumber::Chef.boot(tag)
7
-
8
- ui = ZTK::UI.new(:logger => Cucumber::Chef.logger)
9
- if (test_lab = Cucumber::Chef::TestLab.new(ui)) && test_lab.alive?
10
- gem_name = "cucumber-chef-#{Cucumber::Chef::VERSION}.gem"
11
- gem_path = File.join(Cucumber::Chef.root_dir, gem_name)
12
-
13
- ui.logger.info { "gem_name == '#{gem_name}'" }
14
- ui.logger.info { "gem_path == '#{gem_path}'" }
15
-
16
- if !File.exists?(gem_path)
17
- puts
18
- puts("To build cucumber-chef and install the gem in to the test lab, execute:")
19
- puts
20
- puts [ "cd #{Cucumber::Chef.root_dir}", "gem build cucumber-chef.gemspec", "cd #{Dir.pwd}", "bundle exec cc-push" ].join(" ; ")
21
- puts
22
- else
23
- local_file = File.join(Cucumber::Chef.root_dir, gem_name)
24
- remote_file = File.join("/", "home", test_lab.bootstrap_ssh.config.user, gem_name)
25
- ui.logger.info { "#{local_file} -> #{test_lab.bootstrap_ssh.config.user}@#{test_lab.ip}:#{remote_file}" }
26
-
27
- test_lab.bootstrap_ssh.upload(local_file, remote_file)
28
- FileUtils.rm_f(File.join(Cucumber::Chef.root_dir, "*.gem"))
29
-
30
- test_lab.bootstrap_ssh.exec(<<-EOH
31
- sudo /bin/bash -c '
32
- pkill -9 cc-server
33
- cd #{File.dirname(remote_file)}
34
- ls -la | grep 'cucumber-chef-'
35
- gem uninstall cucumber-chef ztk --all --ignore-dependencies --executables --backtrace
36
- rm -fv /usr/lib/ruby/gems/1.8/cache/#{gem_name}
37
- gem cleanup cucumber-chef --backtrace
38
- gem install #{remote_file} --backtrace
39
- rm -fv /home/#{test_lab.bootstrap_ssh.config.user}/*.gem
40
- exit 0'
41
- EOH
42
- )
43
- File.exists?(gem_path) and File.delete(gem_path)
44
- end
45
-
46
- else
47
- puts("No running cucumber-chef test labs to connect to!")
48
- exit(1)
49
- end
data/bin/cc-server DELETED
@@ -1,84 +0,0 @@
1
- #!/usr/bin/env ruby
2
- if !ENV['BACKGROUND'].nil?
3
- if RUBY_VERSION < "1.9"
4
- exit if fork
5
- Process.setsid
6
- exit if fork
7
- Dir.chdir "/"
8
- STDIN.reopen "/dev/null"
9
- STDOUT.reopen "/dev/null", "a"
10
- STDERR.reopen "/dev/null", "a"
11
- else
12
- Process.daemon
13
- end
14
- end
15
-
16
- require 'drb/drb'
17
- require 'drb/acl'
18
- require 'cucumber-chef'
19
- require 'cucumber/chef/helpers'
20
-
21
- tag = Cucumber::Chef.tag("cc-server")
22
- puts(" * #{tag}")
23
- Cucumber::Chef.boot(tag)
24
- $logger = Cucumber::Chef.logger
25
- Dir.chdir(File.join("/home", Cucumber::Chef.lab_user))
26
-
27
- class FrontObject
28
- attr_accessor :containers
29
-
30
- include Cucumber::Chef
31
- include Cucumber::Chef::Helpers
32
-
33
- ################################################################################
34
-
35
- def initialize
36
- logger.info { "DRB=#{DRb.config.inspect}" }
37
-
38
- if ENV['PURGE'] == 'YES'
39
- Cucumber::Chef.logger.warn { "PURGING CONTAINERS! Container attributes will be reset!" }
40
- load_containers
41
- containers.each do |name, value|
42
- server_destroy(name)
43
- end
44
-
45
- File.exists?(Cucumber::Chef.containers_bin) && File.delete(Cucumber::Chef.containers_bin)
46
- load_containers
47
- else
48
- Cucumber::Chef.logger.info { "Allowing existing containers to persist." }
49
- end
50
- end
51
-
52
- ################################################################################
53
-
54
- def shutdown
55
- logger.fatal { "Shutting down." }
56
- DRb.stop_service
57
- exit(0)
58
- end
59
-
60
- ################################################################################
61
-
62
- def logger
63
- $logger
64
- end
65
-
66
- ################################################################################
67
-
68
- def ping
69
- "pong"
70
- end
71
-
72
- ################################################################################
73
-
74
- end
75
-
76
- list = %w(deny all)
77
- ARGV[0] and (list += [ 'allow', ARGV[0] ])
78
- acl = ACL.new(list)
79
-
80
- # This will break everything:
81
- # $SAFE = 1
82
-
83
- DRb.start_service("druby://:8787", FrontObject.new)
84
- DRb.thread.join
@@ -1,10 +0,0 @@
1
- ---
2
- :bulk_threshold: 1000
3
- :update_sources: true
4
- :sources:
5
- - http://rubygems.org
6
- - http://gems.github.com
7
- :backtrace: true
8
- :verbose: true
9
- :benchmark: false
10
- gem: --no-ri --no-rdoc --conservative
@@ -1,167 +0,0 @@
1
- ################################################################################
2
- #
3
- # Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
4
- # Author: Zachary Patten <zachary@jovelabs.com>
5
- # Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
6
- # License: Apache License, Version 2.0
7
- #
8
- # Licensed under the Apache License, Version 2.0 (the "License");
9
- # you may not use this file except in compliance with the License.
10
- # You may obtain a copy of the License at
11
- #
12
- # http://www.apache.org/licenses/LICENSE-2.0
13
- #
14
- # Unless required by applicable law or agreed to in writing, software
15
- # distributed under the License is distributed on an "AS IS" BASIS,
16
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
- ################################################################################
21
-
22
- module Cucumber::Chef::Helpers::ChefClient
23
-
24
- ################################################################################
25
-
26
- # call this in a Before hook
27
- def chef_set_client_config(config={})
28
- @chef_client_config = (@chef_client_config || {
29
- :log_level => :info,
30
- :log_location => "/var/log/chef/client.log",
31
- :chef_server_url => "https://api.opscode.com/organizations/#{config[:orgname]}",
32
- :validation_client_name => "#{config[:orgname]}-validator",
33
- :ssl_verify_mode => :verify_none,
34
- :environment => nil # use default; i.e. set no value
35
- }).merge(config)
36
- logger.info { "Setting chef client config '#{@chef_client_config.inspect}'." }
37
-
38
- true
39
- end
40
-
41
- ################################################################################
42
-
43
- # call this before chef_run_client
44
- def chef_set_client_attributes(name, attributes={})
45
- @containers[name] ||= Hash.new
46
- @containers[name][:chef_client] = (@containers[name][:chef_client] || {}).merge(attributes) { |k,o,n| (k = (o + n).uniq) }
47
- logger.info { "Setting chef client attributes to '#{@containers[name][:chef_client].inspect}' for container '#{name}'." }
48
-
49
- true
50
- end
51
-
52
- ################################################################################
53
-
54
- def chef_run_client(name, *args)
55
- chef_config_client(name)
56
-
57
- logger.info { "Removing artifacts #{Cucumber::Chef::Config[:artifacts].values.collect{|z| "'#{z}'" }.join(' ')}." }
58
- (command_run_remote(name, "/bin/rm -fv #{Cucumber::Chef::Config[:artifacts].values.join(' ')}") rescue nil)
59
-
60
- logger.info { "Running chef client on container '#{name}'." }
61
-
62
- arguments = {
63
- "--node-name" => name,
64
- "--json-attributes" => File.join("/etc", "chef", "attributes.json").to_s,
65
- "--log_level" => @chef_client_config[:log_level],
66
- "--logfile" => @chef_client_config[:log_location],
67
- "--server" => @chef_client_config[:chef_server_url],
68
- "--environment" => @chef_client_config[:environment]
69
- }.reject{ |k,v| v.nil? }.sort
70
-
71
- output = nil
72
- bm = ::Benchmark.realtime do
73
- output = command_run_remote(name, ["/usr/bin/chef-client", arguments, args, "--once"].flatten.join(" "))
74
- end
75
- logger.info { "Chef client run on container '#{name}' took %0.4f seconds." % bm }
76
-
77
- output
78
- end
79
-
80
- ################################################################################
81
-
82
- def chef_config_client(name)
83
- # make sure our configuration location is there
84
- client_rb = File.join("/", container_root(name), "etc/chef/client.rb")
85
- FileUtils.mkdir_p(File.dirname(client_rb))
86
-
87
- # render the chef-client client.rb if we are configured to
88
- if Cucumber::Chef::Config.chef[:render_client_rb]
89
- File.exists?(client_rb) && File.delete(client_rb)
90
-
91
- max_key_size = @chef_client_config.keys.collect{ |z| z.to_s.size }.max
92
-
93
- File.open(client_rb, 'w') do |f|
94
- f.puts(Cucumber::Chef.generate_do_not_edit_warning("Chef Client Configuration"))
95
- f.puts
96
- @chef_client_config.merge(:node_name => name).each do |(key,value)|
97
- next if value.nil?
98
- f.puts("%-#{max_key_size}s %s" % [key, value.inspect])
99
- end
100
- f.puts
101
- f.puts("Mixlib::Log::Formatter.show_time = true")
102
- end
103
- end
104
-
105
- attributes_json = File.join("/", container_root(name), "etc", "chef", "attributes.json")
106
- FileUtils.mkdir_p(File.dirname(attributes_json))
107
- File.open(attributes_json, 'w') do |f|
108
- f.puts((@containers[name][:chef_client] || {}).to_json)
109
- end
110
-
111
- # make sure our log location is there
112
- log_location = File.join("/", container_root(name), @chef_client_config[:log_location])
113
- FileUtils.mkdir_p(File.dirname(log_location))
114
-
115
- command_run_local("cp /etc/chef/validation.pem #{container_root(name)}/etc/chef/ 2>&1")
116
-
117
- true
118
- end
119
-
120
- ################################################################################
121
-
122
- def chef_client_artifacts(name)
123
- # this is messy and needs to be refactored into a more configurable
124
- # solution; but for now this should do the trick
125
-
126
- ssh = $test_lab.proxy_ssh(name)
127
-
128
- feature_file = $scenario.file_colon_line.split(":").first
129
- feature_line = $scenario.file_colon_line.split(":").last
130
- scenario_tag = $scenario.name.gsub(" ", "_")
131
-
132
- feature_name = File.basename(feature_file, ".feature")
133
- feature_dir = feature_file.split("/")[-2]
134
-
135
- Cucumber::Chef::Config[:artifacts].each do |label, remote_path|
136
- result = ssh.exec("/bin/bash -c '[[ -f #{remote_path} ]] ; echo $?'", :silence => true)
137
- if (result.output =~ /0/)
138
- logger.info { "Retrieving artifact '#{remote_path}' from container '#{name}'." }
139
-
140
- local_path = File.join(Cucumber::Chef.artifacts_dir, feature_dir, "#{feature_name}.txt")
141
- tmp_path = File.join("/tmp", label)
142
-
143
- FileUtils.mkdir_p(File.dirname(local_path))
144
- ssh.download(remote_path, tmp_path)
145
- data = IO.read(tmp_path).chomp
146
-
147
- message = "#{$scenario.name} (#{File.basename(feature_file)}:#{feature_line}:#{label})"
148
- header = ("-" * message.length)
149
-
150
- f = File.open(local_path, "a")
151
- f.write("#{header}\n")
152
- f.write("#{message}\n")
153
- f.write("#{header}\n")
154
- f.write("#{data}\n")
155
-
156
- File.chmod(0644, local_path)
157
- end
158
- end
159
-
160
- true
161
- end
162
-
163
- ################################################################################
164
-
165
- end
166
-
167
- ################################################################################
@@ -1,42 +0,0 @@
1
- ################################################################################
2
- #
3
- # Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
4
- # Author: Zachary Patten <zachary@jovelabs.com>
5
- # Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
6
- # License: Apache License, Version 2.0
7
- #
8
- # Licensed under the Apache License, Version 2.0 (the "License");
9
- # you may not use this file except in compliance with the License.
10
- # You may obtain a copy of the License at
11
- #
12
- # http://www.apache.org/licenses/LICENSE-2.0
13
- #
14
- # Unless required by applicable law or agreed to in writing, software
15
- # distributed under the License is distributed on an "AS IS" BASIS,
16
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
- ################################################################################
21
-
22
- module Cucumber::Chef::Helpers::ChefServer
23
-
24
- ################################################################################
25
-
26
- def chef_server_node_destroy(name)
27
- (::Chef::Node.load(name).destroy rescue nil)
28
- logger.info { "Destroyed chef node '#{name}'." }
29
- end
30
-
31
- ################################################################################
32
-
33
- def chef_server_client_destroy(name)
34
- (::Chef::ApiClient.load(name).destroy rescue nil)
35
- logger.info { "Destroyed chef client '#{name}'." }
36
- end
37
-
38
- ################################################################################
39
-
40
- end
41
-
42
- ################################################################################
@@ -1,60 +0,0 @@
1
- ################################################################################
2
- #
3
- # Author: Stephen Nelson-Smith <stephen@atalanta-systems.com>
4
- # Author: Zachary Patten <zachary@jovelabs.com>
5
- # Copyright: Copyright (c) 2011-2013 Atalanta Systems Ltd
6
- # License: Apache License, Version 2.0
7
- #
8
- # Licensed under the Apache License, Version 2.0 (the "License");
9
- # you may not use this file except in compliance with the License.
10
- # You may obtain a copy of the License at
11
- #
12
- # http://www.apache.org/licenses/LICENSE-2.0
13
- #
14
- # Unless required by applicable law or agreed to in writing, software
15
- # distributed under the License is distributed on an "AS IS" BASIS,
16
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
- ################################################################################
21
-
22
- module Cucumber::Chef::Helpers::Command
23
-
24
- ################################################################################
25
-
26
- def command_run_remote(name, command, options={})
27
- expected_exit_code = (options[:expected_exit_code] || 0)
28
- options.reject!{ |k,v| k == :expected_exit_code }
29
-
30
- identity_file = File.join(Cucumber::Chef.lab_user_home_dir, ".ssh", "id_rsa")
31
-
32
- command = %W(/usr/bin/ssh #{ENV['LOG_LEVEL'] == 'DEBUG' ? "-v" : nil} -i #{identity_file} #{name} #{command})
33
- ::ZTK::Command.new({:timeout => Cucumber::Chef::Config.command_timeout}.merge(options)).exec(command.compact.join(" "), :silence => true, :exit_code => expected_exit_code)
34
- end
35
-
36
- ################################################################################
37
-
38
- def command_run_chroot(name, command, options={})
39
- expected_exit_code = (options[:expected_exit_code] || 0)
40
- options.reject!{ |k,v| k == :expected_exit_code }
41
-
42
- command = %Q(/usr/sbin/chroot #{container_root(name)} /bin/bash -c '#{command.gsub("'", '"')}')
43
- ::ZTK::Command.new({:timeout => Cucumber::Chef::Config.command_timeout}.merge(options)).exec(command, :silence => true, :exit_code => expected_exit_code)
44
- end
45
-
46
- ################################################################################
47
-
48
- def command_run_local(command, options={})
49
- expected_exit_code = (options[:expected_exit_code] || 0)
50
- options.reject!{ |k,v| k == :expected_exit_code }
51
-
52
- command = %Q(/bin/bash -c '#{command.gsub("'", '"')}')
53
- ::ZTK::Command.new({:timeout => Cucumber::Chef::Config.command_timeout}.merge(options)).exec(command, :silence => true, :exit_code => expected_exit_code)
54
- end
55
-
56
- ################################################################################
57
-
58
- end
59
-
60
- ################################################################################