testlab 0.6.9 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -18,20 +18,25 @@ The TestLab command-line program `tl` follows in the style of git (using the GLI
18
18
 
19
19
  $ tl help
20
20
  NAME
21
- tl - A framework for building lightweight virtual infrastructure using LXC
21
+ tl - TestLab - A toolkit for building virtual computer labs
22
22
 
23
23
  SYNOPSIS
24
24
  tl [global options] command [command options] [arguments...]
25
25
 
26
26
  VERSION
27
- 0.6.5
27
+ 0.6.9
28
28
 
29
29
  GLOBAL OPTIONS
30
- --version -
31
- --help - Show this message
30
+ --version -
31
+ -v, --[no-]verbose - Show verbose output
32
+ -q, --[no-]quiet - Quiet mode
33
+ --help - Show this message
32
34
 
33
35
  COMMANDS
34
36
  help - Shows a list of commands or help for one command
37
+ container - Manage containers
38
+ network - Manage networks
39
+ node - Manage nodes
35
40
  create - Create the test lab
36
41
  destroy - Destroy the test lab
37
42
  up - Online the test lab
@@ -40,9 +45,6 @@ The TestLab command-line program `tl` follows in the style of git (using the GLI
40
45
  teardown - Teardown the test lab infrastructure
41
46
  build - Build the test lab infrastructure
42
47
  status - Display information on the status of the test lab
43
- node - Manage nodes
44
- network - Manage networks
45
- container - Manage containers
46
48
 
47
49
  You stand up your lab with the following command:
48
50
 
@@ -17,9 +17,12 @@ class TestLab
17
17
  ZTK::RescueRetry.try(:tries => 3, :on => ContainerError) do
18
18
  tempfile = Tempfile.new("bootstrap")
19
19
  remote_tempfile = File.join("/tmp", File.basename(tempfile.path))
20
- self.node.ssh.file(:target => File.join(self.lxc.fs_root, remote_tempfile), :chmod => '0777', :chown => 'root:root') do |file|
20
+ target_file = File.join(self.fs_root, remote_tempfile)
21
+
22
+ self.node.ssh.file(:target => target_file, :chmod => '0777', :chown => 'root:root') do |file|
21
23
  file.puts(content)
22
24
  end
25
+
23
26
  output = self.lxc.attach(%(--), %(/bin/bash), remote_tempfile)
24
27
  if output =~ /No such file or directory/
25
28
  raise ContainerError, "We could not find the bootstrap file!"
@@ -105,6 +108,13 @@ class TestLab
105
108
  self.lxc.exists?
106
109
  end
107
110
 
111
+ # Container root filesystem path
112
+ #
113
+ # @return [String] The path to the containers root filesystem.
114
+ def fs_root
115
+ self.lxc.fs_root(self.lxc_clone.exists?)
116
+ end
117
+
108
118
  # Returns arguments for lxc-create based on our distro
109
119
  #
110
120
  # @return [Array<String>] An array of arguments for lxc-create
@@ -138,9 +148,11 @@ class TestLab
138
148
  # @return [Boolean] True if successful.
139
149
  def build_lxc_config(lxc_config)
140
150
  lxc_config.clear
151
+
141
152
  lxc_config['lxc.utsname'] = self.fqdn
142
- lxc_config['lxc.arch'] = self.arch
143
- lxc_config.networks = build_lxc_network_conf(self.interfaces)
153
+ lxc_config['lxc.arch'] = self.arch
154
+ lxc_config.networks = build_lxc_network_conf(self.interfaces)
155
+
144
156
  lxc_config.save
145
157
 
146
158
  true
@@ -158,12 +170,12 @@ class TestLab
158
170
 
159
171
  interfaces.each do |interface|
160
172
  networks << Hash[
161
- 'lxc.network.type' => :veth,
162
- 'lxc.network.flags' => :up,
163
- 'lxc.network.link' => interface.network.bridge,
164
- 'lxc.network.name' => interface.name,
165
- 'lxc.network.hwaddr' => interface.mac,
166
- 'lxc.network.ipv4' => "#{interface.ip}/#{interface.cidr} #{interface.netmask}"
173
+ 'lxc.network.type' => :veth,
174
+ 'lxc.network.flags' => :up,
175
+ 'lxc.network.link' => interface.network.bridge,
176
+ 'lxc.network.name' => interface.name,
177
+ 'lxc.network.hwaddr' => interface.mac,
178
+ 'lxc.network.ipv4' => "#{interface.ip}/#{interface.cidr} #{interface.netmask}"
167
179
  ]
168
180
  if (interface.primary == true) || (interfaces.count == 1)
169
181
  networks.last.merge!('lxc.network.ipv4.gateway' => :auto)
@@ -60,7 +60,7 @@ class TestLab
60
60
 
61
61
  # Ensure the container APT calls use apt-cacher-ng on the node
62
62
  gateway_ip = container.primary_interface.network.ip
63
- apt_conf_d_proxy_file = File.join(container.lxc.fs_root, "etc", "apt", "apt.conf.d", "00proxy")
63
+ apt_conf_d_proxy_file = File.join(container.fs_root, "etc", "apt", "apt.conf.d", "00proxy")
64
64
 
65
65
  @config[:apt][:cacher_ng] = { :proxy_url => "http://#{gateway_ip}:3142" }.merge(@config[:apt][:cacher_ng])
66
66
 
@@ -69,7 +69,7 @@ class TestLab
69
69
  end
70
70
 
71
71
  # Fix the APT sources since LXC mudges them when using apt-cacher-ng
72
- apt_conf_sources_file = File.join(container.lxc.fs_root, "etc", "apt", "sources.list")
72
+ apt_conf_sources_file = File.join(container.fs_root, "etc", "apt", "sources.list")
73
73
  container.node.ssh.exec(%(sudo sed -i 's/127.0.0.1:3142\\///g' #{apt_conf_sources_file}))
74
74
  end
75
75
 
@@ -13,12 +13,12 @@ class TestLab
13
13
  node_authkeys = File.join(node_home_dir, ".ssh", "authorized_keys")
14
14
 
15
15
  # ensure the container user exists
16
- container_passwd_file = File.join(self.container.lxc.fs_root, "etc", "passwd")
16
+ container_passwd_file = File.join(self.container.fs_root, "etc", "passwd")
17
17
  if self.container.node.ssh.exec(%(sudo grep "#{self.id}" #{container_passwd_file}), :ignore_exit_status => true).exit_code != 0
18
18
 
19
19
  if !self.gid.nil?
20
20
  groupadd_command = %(groupadd --gid #{self.gid} #{self.id})
21
- self.container.node.ssh.exec(%(sudo chroot #{self.container.lxc.fs_root} /bin/bash -c '#{groupadd_command}'))
21
+ self.container.node.ssh.exec(%(sudo chroot #{self.container.fs_root} /bin/bash -c '#{groupadd_command}'))
22
22
  end
23
23
 
24
24
  useradd_command = %W(useradd --create-home --shell /bin/bash --groups sudo --password #{self.password})
@@ -27,11 +27,11 @@ class TestLab
27
27
  useradd_command << self.id
28
28
  useradd_command = useradd_command.flatten.compact.join(' ')
29
29
 
30
- self.container.node.ssh.exec(%(sudo chroot #{self.container.lxc.fs_root} /bin/bash -c '#{useradd_command}'))
30
+ self.container.node.ssh.exec(%(sudo chroot #{self.container.fs_root} /bin/bash -c '#{useradd_command}'))
31
31
  end
32
32
 
33
33
  # ensure the user user gets our node user key
34
- user_home_dir = File.join(self.container.lxc.fs_root, ((self.id == "root") ? %(/root) : %(/home/#{self.id})))
34
+ user_home_dir = File.join(self.container.fs_root, ((self.id == "root") ? %(/root) : %(/home/#{self.id})))
35
35
  user_authkeys = File.join(user_home_dir, ".ssh", "authorized_keys")
36
36
  user_authkeys2 = File.join(user_home_dir, ".ssh", "authorized_keys2")
37
37
 
@@ -57,6 +57,20 @@ class TestLab
57
57
  true
58
58
  end
59
59
 
60
+ # User Home Directory
61
+ #
62
+ # Returns the path to the users home directory.
63
+ #
64
+ # @return [String] The users home directory.
65
+ def home_dir(name=nil)
66
+ username = (name || self.id)
67
+ if (username == "root")
68
+ "/root"
69
+ else
70
+ "/home/#{username}"
71
+ end
72
+ end
73
+
60
74
  end
61
75
 
62
76
  end
@@ -1,6 +1,6 @@
1
1
  class TestLab
2
2
  unless const_defined?(:VERSION)
3
3
  # TestLab Gem Version
4
- VERSION = "0.6.9"
4
+ VERSION = "0.6.10"
5
5
  end
6
6
  end
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.9
4
+ version: 0.6.10
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: 805915972640888804
303
+ hash: 3377457757681379174
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: 805915972640888804
312
+ hash: 3377457757681379174
313
313
  requirements: []
314
314
  rubyforge_project:
315
315
  rubygems_version: 1.8.25