testlab 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/tl +7 -3
- data/lib/commands/network.rb +4 -2
- data/lib/testlab/container/io.rb +9 -8
- data/lib/testlab/container/ssh.rb +25 -0
- data/lib/testlab/network/lifecycle.rb +2 -2
- data/lib/testlab/node/ssh.rb +1 -1
- data/lib/testlab/utility/logger.rb +7 -3
- data/lib/testlab/version.rb +1 -1
- data/lib/testlab.rb +5 -2
- metadata +3 -3
data/bin/tl
CHANGED
@@ -18,12 +18,16 @@
|
|
18
18
|
# limitations under the License.
|
19
19
|
#
|
20
20
|
################################################################################
|
21
|
+
require 'socket'
|
22
|
+
|
21
23
|
require 'gli'
|
22
24
|
require 'testlab'
|
23
25
|
|
24
26
|
include GLI::App
|
25
27
|
include TestLab::Utility::Misc
|
26
28
|
|
29
|
+
HOSTNAME = Socket.gethostname.split('.').first.strip
|
30
|
+
|
27
31
|
version TestLab::VERSION
|
28
32
|
|
29
33
|
program_desc %(TestLab - A toolkit for building virtual computer labs)
|
@@ -41,11 +45,9 @@ switch [:v, :verbose]
|
|
41
45
|
pre do |global,command,options,args|
|
42
46
|
global[:v].nil? or (global[:v] == true) and ENV['LOG_LEVEL'] = 'DEBUG'
|
43
47
|
|
44
|
-
log_file = File.join(Dir.pwd, "testlab.log")
|
48
|
+
log_file = File.join(Dir.pwd, "testlab-#{HOSTNAME}.log")
|
45
49
|
@logger = ZTK::Logger.new(log_file)
|
46
50
|
|
47
|
-
TestLab::Utility.log_header.each { |line| @logger.info { line } }
|
48
|
-
|
49
51
|
@logger.debug { "global(#{global.inspect})" }
|
50
52
|
@logger.debug { "options(#{options.inspect})" }
|
51
53
|
@logger.debug { "args(#{args.inspect})" }
|
@@ -53,6 +55,8 @@ pre do |global,command,options,args|
|
|
53
55
|
@ui = ZTK::UI.new(:logger => @logger)
|
54
56
|
@testlab = TestLab.new(:ui => @ui)
|
55
57
|
|
58
|
+
TestLab::Utility.log_header(@testlab).each { |line| @logger.info { line } }
|
59
|
+
|
56
60
|
message = format_message("TestLab v#{TestLab::VERSION} Loaded".black.bold)
|
57
61
|
@testlab.ui.stdout.puts(message)
|
58
62
|
|
data/lib/commands/network.rb
CHANGED
@@ -187,7 +187,8 @@ EOF
|
|
187
187
|
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
188
188
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
189
189
|
|
190
|
-
|
190
|
+
p = TestLab::Provisioner::Route.new({}, @ui)
|
191
|
+
p.on_network_setup(network)
|
191
192
|
@testlab.ui.stdout.puts("Added routes successfully!".green.bold)
|
192
193
|
@testlab.ui.stdout.puts %x(netstat -nr | grep '#{network.node.ip}').strip
|
193
194
|
end
|
@@ -203,7 +204,8 @@ EOF
|
|
203
204
|
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
204
205
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
205
206
|
|
206
|
-
|
207
|
+
p = TestLab::Provisioner::Route.new({}, @ui)
|
208
|
+
p.on_network_teardown(network)
|
207
209
|
@testlab.ui.stdout.puts("Deleted routes successfully!".red.bold)
|
208
210
|
@testlab.ui.stdout.puts %x(netstat -nr | grep '#{network.node.ip}').strip
|
209
211
|
end
|
data/lib/testlab/container/io.rb
CHANGED
@@ -16,16 +16,17 @@ class TestLab
|
|
16
16
|
sc_file = File.join("/", "tmp", "#{self.id}.sc")
|
17
17
|
local_file = File.join(Dir.pwd, File.basename(sc_file))
|
18
18
|
|
19
|
-
please_wait(:ui => @ui, :message => format_object_action(self, 'Compress', :
|
20
|
-
|
19
|
+
please_wait(:ui => @ui, :message => format_object_action(self, 'Compress', :cyan)) do
|
20
|
+
self.node.ssh.bootstrap(<<-EOF)
|
21
21
|
set -x
|
22
|
+
set -e
|
22
23
|
find #{self.lxc.container_root} -print0 -depth | cpio -o0 | pbzip2 -#{compression} -vfcz > #{sc_file}
|
23
24
|
chown ${SUDO_USER}:${SUDO_USER} #{sc_file}
|
24
25
|
EOF
|
25
|
-
self.node.ssh.bootstrap(script)
|
26
26
|
end
|
27
27
|
|
28
|
-
please_wait(:ui => @ui, :message => format_object_action(self, 'Export', :
|
28
|
+
please_wait(:ui => @ui, :message => format_object_action(self, 'Export', :cyan)) do
|
29
|
+
File.exists?(local_file) and FileUtils.rm_f(local_file)
|
29
30
|
self.node.ssh.download(sc_file, local_file)
|
30
31
|
end
|
31
32
|
|
@@ -45,17 +46,17 @@ EOF
|
|
45
46
|
|
46
47
|
sc_file = File.join("/", "tmp", "#{self.id}.sc")
|
47
48
|
|
48
|
-
please_wait(:ui => @ui, :message => format_object_action(self, 'Import', :
|
49
|
+
please_wait(:ui => @ui, :message => format_object_action(self, 'Import', :cyan)) do
|
49
50
|
self.node.ssh.exec(%(sudo rm -fv #{sc_file}), :silence => true, :ignore_exit_status => true)
|
50
51
|
self.node.ssh.upload(local_file, sc_file)
|
51
52
|
end
|
52
53
|
|
53
|
-
please_wait(:ui => @ui, :message => format_object_action(self, 'Expand', :
|
54
|
-
|
54
|
+
please_wait(:ui => @ui, :message => format_object_action(self, 'Expand', :cyan)) do
|
55
|
+
self.node.ssh.bootstrap(<<-EOF)
|
55
56
|
set -x
|
57
|
+
set -e
|
56
58
|
pbzip2 -vdc #{sc_file} | cpio -uid && rm -fv #{sc_file}
|
57
59
|
EOF
|
58
|
-
self.node.ssh.bootstrap(script)
|
59
60
|
end
|
60
61
|
|
61
62
|
puts("Your shipping container is now imported and available for use!")
|
@@ -13,6 +13,31 @@ class TestLab
|
|
13
13
|
self.node.container_ssh(self, options)
|
14
14
|
end
|
15
15
|
|
16
|
+
# Returns text suitable for use in an SSH configuration file
|
17
|
+
#
|
18
|
+
# @return [String] SSH configuration text blob.
|
19
|
+
def ssh_config
|
20
|
+
identities = [self.users.map(&:identity), self.node.identity].flatten.compact.uniq
|
21
|
+
|
22
|
+
output = <<-EOF
|
23
|
+
#{ZTK::Template.do_not_edit_notice(:message => %(TestLab "#{self.fqdn}" SSH Configuration))}
|
24
|
+
Host #{self.id}
|
25
|
+
HostName #{self.ip}
|
26
|
+
Port 22
|
27
|
+
UserKnownHostsFile /dev/null
|
28
|
+
StrictHostKeyChecking no
|
29
|
+
PasswordAuthentication no
|
30
|
+
ForwardAgent no
|
31
|
+
IdentitiesOnly yes
|
32
|
+
EOF
|
33
|
+
|
34
|
+
identities.each do |identity|
|
35
|
+
output += " IdentityFile #{identity}\n"
|
36
|
+
end
|
37
|
+
|
38
|
+
output
|
39
|
+
end
|
40
|
+
|
16
41
|
end
|
17
42
|
|
18
43
|
end
|
@@ -12,7 +12,7 @@ class TestLab
|
|
12
12
|
self.provisioners.each do |provisioner|
|
13
13
|
@ui.logger.info { ">>>>> NETWORK PROVISIONER SETUP: #{provisioner} <<<<<" }
|
14
14
|
p = provisioner.new(self.config, @ui)
|
15
|
-
p.respond_to?(:
|
15
|
+
p.respond_to?(:on_network_setup) and p.on_network_setup(self)
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
@@ -29,7 +29,7 @@ class TestLab
|
|
29
29
|
self.provisioners.each do |provisioner|
|
30
30
|
@ui.logger.info { ">>>>> NETWORK PROVISIONER TEARDOWN: #{provisioner} <<<<<" }
|
31
31
|
p = provisioner.new(self.config, @ui)
|
32
|
-
p.respond_to?(:
|
32
|
+
p.respond_to?(:on_network_teardown) and p.on_network_teardown(self)
|
33
33
|
end
|
34
34
|
|
35
35
|
end
|
data/lib/testlab/node/ssh.rb
CHANGED
@@ -33,7 +33,7 @@ class TestLab
|
|
33
33
|
|
34
34
|
c.user = (options[:user] || container.primary_user.id)
|
35
35
|
c.password = (options[:passwd] || container.primary_user.password)
|
36
|
-
c.keys = (options[:keys] || container.primary_user.identity
|
36
|
+
c.keys = (options[:keys] || [container.primary_user.identity, @provider.identity])
|
37
37
|
end
|
38
38
|
end
|
39
39
|
@container_ssh[name]
|
@@ -8,6 +8,7 @@ class TestLab
|
|
8
8
|
#
|
9
9
|
# @author Zachary Patten <zachary AT jovelabs DOT com>
|
10
10
|
module Logger
|
11
|
+
require 'socket'
|
11
12
|
require 'active_support/version'
|
12
13
|
|
13
14
|
def log_key_value(key, value, max_key_length)
|
@@ -18,10 +19,13 @@ class TestLab
|
|
18
19
|
(char * max_key_length)
|
19
20
|
end
|
20
21
|
|
21
|
-
def log_details
|
22
|
+
def log_details(testlab)
|
22
23
|
@command = ZTK::Command.new(:silence => true, :ignore_exit_status => true)
|
23
24
|
{
|
25
|
+
"hostname" => Socket.gethostname.inspect,
|
24
26
|
"program" => $0.to_s.inspect,
|
27
|
+
"config_dir" => testlab.config_dir.inspect,
|
28
|
+
"logdev" => testlab.ui.logger.logdev.inspect,
|
25
29
|
"vagrant_version" => @command.exec(%(/usr/bin/env vagrant --version)).output.strip.inspect,
|
26
30
|
"virtualbox_version" => @command.exec(%(/usr/bin/env vboxmanage --version)).output.strip.inspect
|
27
31
|
}
|
@@ -48,10 +52,10 @@ class TestLab
|
|
48
52
|
}
|
49
53
|
end
|
50
54
|
|
51
|
-
def log_header
|
55
|
+
def log_header(testlab)
|
52
56
|
log_lines = Array.new
|
53
57
|
|
54
|
-
details_hash = log_details
|
58
|
+
details_hash = log_details(testlab)
|
55
59
|
ruby_hash = log_ruby
|
56
60
|
dependencies_hash = log_dependencies
|
57
61
|
|
data/lib/testlab/version.rb
CHANGED
data/lib/testlab.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
1
3
|
require 'ztk'
|
2
4
|
require 'active_support/inflector'
|
3
5
|
|
@@ -101,7 +103,7 @@ class TestLab
|
|
101
103
|
def initialize(options={})
|
102
104
|
self.ui = (options[:ui] || ZTK::UI.new)
|
103
105
|
|
104
|
-
labfile = (options[:labfile] || 'Labfile')
|
106
|
+
labfile = (options[:labfile] || File.join(Dir.pwd, 'Labfile'))
|
105
107
|
labfile_path = ZTK::Locator.find(labfile)
|
106
108
|
@labfile = TestLab::Labfile.load(labfile_path)
|
107
109
|
@labfile.config.merge!(:testlab => self)
|
@@ -295,7 +297,8 @@ class TestLab
|
|
295
297
|
#
|
296
298
|
# @return [String] The path to the TestLab configuration directory.
|
297
299
|
def config_dir
|
298
|
-
|
300
|
+
@hostname ||= Socket.gethostname.split('.').first.strip
|
301
|
+
directory = File.join(self.config[:repo], ".testlab-#{@hostname}")
|
299
302
|
File.expand_path(directory, File.dirname(__FILE__))
|
300
303
|
end
|
301
304
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testlab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -300,7 +300,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
300
300
|
version: '0'
|
301
301
|
segments:
|
302
302
|
- 0
|
303
|
-
hash:
|
303
|
+
hash: 1748419604064060777
|
304
304
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
305
305
|
none: false
|
306
306
|
requirements:
|
@@ -309,7 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
309
309
|
version: '0'
|
310
310
|
segments:
|
311
311
|
- 0
|
312
|
-
hash:
|
312
|
+
hash: 1748419604064060777
|
313
313
|
requirements: []
|
314
314
|
rubyforge_project:
|
315
315
|
rubygems_version: 1.8.25
|