testlab 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +11 -5
- data/lib/testlab/container/actions.rb +47 -0
- data/lib/testlab/container/generators.rb +42 -0
- data/lib/testlab/container/lifecycle.rb +25 -0
- data/lib/testlab/container/lxc.rb +43 -0
- data/lib/testlab/container/network.rb +31 -0
- data/lib/testlab/container/status.rb +28 -0
- data/lib/testlab/container.rb +58 -150
- data/lib/testlab/network/actions.rb +37 -0
- data/lib/testlab/network/cidr.rb +102 -0
- data/lib/testlab/network/lifecycle.rb +25 -0
- data/lib/testlab/network/status.rb +30 -0
- data/lib/testlab/network.rb +11 -101
- data/lib/testlab/node/bind.rb +95 -0
- data/lib/testlab/node/lifecycle.rb +43 -0
- data/lib/testlab/node/lxc.rb +31 -0
- data/lib/testlab/node/resolv.rb +30 -0
- data/lib/testlab/node/ssh.rb +43 -0
- data/lib/testlab/node/status.rb +26 -0
- data/lib/testlab/node/templates/bind-db.erb +12 -0
- data/lib/testlab/node/templates/bind-setup.erb +6 -0
- data/lib/testlab/node/templates/bind-zone.erb +4 -0
- data/lib/testlab/node/templates/bind.erb +60 -0
- data/lib/testlab/node/templates/node-setup.erb +18 -0
- data/lib/testlab/node/templates/resolv.erb +4 -0
- data/lib/testlab/node.rb +36 -89
- data/lib/testlab/providers/vagrant.rb +9 -1
- data/lib/testlab/provisioner.rb +0 -1
- data/lib/testlab/router.rb +3 -8
- data/lib/testlab/version.rb +1 -1
- data/lib/testlab.rb +21 -7
- data/spec/spec_helper.rb +2 -0
- data/spec/testlab_spec.rb +1 -1
- data/testlab.gemspec +2 -2
- metadata +28 -6
data/lib/testlab/node.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'lxc'
|
2
|
-
|
3
1
|
class TestLab
|
4
2
|
|
5
3
|
# Node Error Class
|
@@ -19,111 +17,57 @@ class TestLab
|
|
19
17
|
|
20
18
|
attribute :provider
|
21
19
|
attribute :config
|
20
|
+
attribute :components
|
22
21
|
|
23
|
-
def initialize(*args)
|
24
|
-
super(*args)
|
25
|
-
|
26
|
-
@ui = TestLab.ui
|
27
|
-
@provider = self.provider.new(self.config)
|
28
|
-
end
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
:port => @provider.port,
|
37
|
-
:provider => @provider.class,
|
38
|
-
:con => self.containers.count,
|
39
|
-
:net => self.networks.count,
|
40
|
-
:rtr => self.routers.count
|
41
|
-
}
|
42
|
-
end
|
23
|
+
autoload :Bind, 'testlab/node/bind'
|
24
|
+
autoload :Lifecycle, 'testlab/node/lifecycle'
|
25
|
+
autoload :LXC, 'testlab/node/lxc'
|
26
|
+
autoload :Resolv, 'testlab/node/resolv'
|
27
|
+
autoload :SSH, 'testlab/node/ssh'
|
28
|
+
autoload :Status, 'testlab/node/status'
|
43
29
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
c.user = @provider.user
|
51
|
-
c.keys = @provider.identity
|
52
|
-
end
|
53
|
-
end
|
54
|
-
@ssh
|
55
|
-
end
|
30
|
+
include TestLab::Node::Bind
|
31
|
+
include TestLab::Node::Lifecycle
|
32
|
+
include TestLab::Node::LXC
|
33
|
+
include TestLab::Node::Resolv
|
34
|
+
include TestLab::Node::SSH
|
35
|
+
include TestLab::Node::Status
|
56
36
|
|
57
|
-
# SSH to a container running on the Node
|
58
|
-
def ssh_container(id, options={})
|
59
|
-
end
|
60
37
|
|
61
|
-
|
62
|
-
|
63
|
-
# This object is used to control containers on the node via it's provider
|
64
|
-
def lxc(options={})
|
65
|
-
if (!defined?(@lxc) || @lxc.nil?)
|
66
|
-
@lxc ||= LXC.new
|
67
|
-
@lxc.use_sudo = true
|
68
|
-
@lxc.use_ssh = self.ssh
|
69
|
-
end
|
70
|
-
@lxc
|
71
|
-
end
|
38
|
+
def initialize(*args)
|
39
|
+
super(*args)
|
72
40
|
|
73
|
-
|
74
|
-
@
|
41
|
+
@ui = TestLab.ui
|
42
|
+
@provider = self.provider.new(self.config)
|
75
43
|
end
|
76
44
|
|
77
45
|
################################################################################
|
78
46
|
|
79
|
-
#
|
80
|
-
#
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# Callback: After Up
|
87
|
-
def after_up
|
47
|
+
# Iterates an array of arrays calling the specified method on all the
|
48
|
+
# collections of objects
|
49
|
+
def call_collections(collections, method_name)
|
50
|
+
collections.each do |collection|
|
51
|
+
call_methods(collection, method_name)
|
52
|
+
end
|
88
53
|
end
|
89
54
|
|
90
|
-
|
91
|
-
|
92
|
-
# Provides a generic interface for triggering our callback framework
|
93
|
-
def proxy_callbacks(action, objects, method_name, *method_args)
|
94
|
-
callback_method = "#{action}_#{method_name}".to_sym
|
95
|
-
|
55
|
+
# Calls the specified method on all the objects supplied
|
56
|
+
def call_methods(objects, method_name)
|
96
57
|
objects.each do |object|
|
97
|
-
if object.respond_to?(
|
98
|
-
object.send(
|
58
|
+
if object.respond_to?(method_name)
|
59
|
+
object.send(method_name)
|
99
60
|
end
|
100
61
|
end
|
101
62
|
end
|
102
63
|
|
103
|
-
# Provides a generic interface for triggering our callback framework
|
104
|
-
def self_callbacks(action, method_name, *method_args)
|
105
|
-
callback_method = "#{action}_#{method_name}".to_sym
|
106
|
-
|
107
|
-
if self.respond_to?(callback_method)
|
108
|
-
self.send(callback_method, *method_args)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
64
|
# Method missing handler
|
113
65
|
def method_missing(method_name, *method_args)
|
114
66
|
@ui.logger.debug { "NODE METHOD MISSING: #{method_name.inspect}(#{method_args.inspect})" }
|
115
67
|
|
116
68
|
if TestLab::Provider::PROXY_METHODS.include?(method_name)
|
117
69
|
result = nil
|
118
|
-
object_collections = [self.containers, self.routers, self.networks]
|
119
70
|
|
120
|
-
self_callbacks(:before, method_name, *method_args)
|
121
|
-
|
122
|
-
object_collections.each do |object_collection|
|
123
|
-
proxy_callbacks(:before, object_collection, method_name, *method_args)
|
124
|
-
end
|
125
|
-
|
126
|
-
@ui.logger.debug { "method_name == #{method_name.inspect}" }
|
127
71
|
if @provider.respond_to?(method_name)
|
128
72
|
@ui.logger.debug { "@provider.send(#{method_name.inspect}, #{method_args.inspect})" }
|
129
73
|
result = @provider.send(method_name, *method_args)
|
@@ -131,18 +75,21 @@ class TestLab
|
|
131
75
|
raise TestLab::ProviderError, "Your provider does not respond to the method '#{method_name}'!"
|
132
76
|
end
|
133
77
|
|
134
|
-
self_callbacks(:after, method_name, *method_args)
|
135
|
-
|
136
|
-
object_collections.reverse.each do |object_collection|
|
137
|
-
proxy_callbacks(:after, object_collection, method_name, *method_args)
|
138
|
-
end
|
139
|
-
|
140
78
|
result
|
141
79
|
else
|
142
80
|
super(method_name, *method_args)
|
143
81
|
end
|
144
82
|
end
|
145
83
|
|
84
|
+
class << self
|
85
|
+
|
86
|
+
# Returns the path to the gems provider templates
|
87
|
+
def template_dir
|
88
|
+
File.join(TestLab.gem_dir, "lib", "testlab", "node", "templates")
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
146
93
|
end
|
147
94
|
|
148
95
|
end
|
@@ -192,7 +192,15 @@ class TestLab
|
|
192
192
|
|
193
193
|
vagrantfile_template = File.join(TestLab::Provider.template_dir, "vagrant", "Vagrantfile.erb")
|
194
194
|
vagrantfile = File.join(@config[:repo], "Vagrantfile")
|
195
|
-
|
195
|
+
|
196
|
+
# UGLY; but it makes it run under 1.9.2
|
197
|
+
if RUBY_VERSION < "1.9.3"
|
198
|
+
File.open(vagrantfile, 'w') do |file|
|
199
|
+
file.puts(ZTK::Template.render(vagrantfile_template, context))
|
200
|
+
end
|
201
|
+
else
|
202
|
+
IO.write(vagrantfile, ZTK::Template.render(vagrantfile_template, context))
|
203
|
+
end
|
196
204
|
end
|
197
205
|
|
198
206
|
################################################################################
|
data/lib/testlab/provisioner.rb
CHANGED
data/lib/testlab/router.rb
CHANGED
@@ -37,27 +37,22 @@ class TestLab
|
|
37
37
|
@ui.logger.debug { "Router Down: #{self.id} " }
|
38
38
|
end
|
39
39
|
|
40
|
-
# Reload the router
|
41
|
-
def reload
|
42
|
-
self.down
|
43
|
-
self.up
|
44
|
-
end
|
45
|
-
|
46
40
|
# State of the router
|
47
41
|
def state
|
48
42
|
end
|
49
43
|
|
50
44
|
# Router Callback: after_up
|
51
|
-
def
|
45
|
+
def setup
|
52
46
|
@ui.logger.debug { "Router Callback: After Up: #{self.id} " }
|
53
47
|
self.create
|
54
48
|
self.up
|
55
49
|
end
|
56
50
|
|
57
51
|
# Router Callback: before_down
|
58
|
-
def
|
52
|
+
def teardown
|
59
53
|
@ui.logger.debug { "Router Callback: Before Down: #{self.id} " }
|
60
54
|
self.down
|
55
|
+
self.destroy
|
61
56
|
end
|
62
57
|
|
63
58
|
# Method missing handler
|
data/lib/testlab/version.rb
CHANGED
data/lib/testlab.rb
CHANGED
@@ -22,11 +22,13 @@ class TestLab
|
|
22
22
|
|
23
23
|
@@ui ||= nil
|
24
24
|
|
25
|
-
def initialize(
|
26
|
-
labfile
|
25
|
+
def initialize(options={})
|
26
|
+
labfile = (options[:labfile] || 'Labfile')
|
27
|
+
labfile_path = ZTK::Locator.find(labfile)
|
27
28
|
|
28
|
-
@@ui
|
29
|
-
|
29
|
+
@@ui = (options[:ui] || ZTK::UI.new)
|
30
|
+
|
31
|
+
@labfile = TestLab::Labfile.load(labfile_path)
|
30
32
|
end
|
31
33
|
|
32
34
|
def nodes
|
@@ -82,8 +84,20 @@ class TestLab
|
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
87
|
+
def setup
|
88
|
+
self.dead? and raise TestLabError, "You must have a running node in order to setup your infrastructure!"
|
89
|
+
|
90
|
+
node_method_proxy(:setup)
|
91
|
+
end
|
92
|
+
|
93
|
+
def teardown
|
94
|
+
self.dead? and raise TestLabError, "You must have a running node in order to teardown your infrastructure!"
|
95
|
+
|
96
|
+
node_method_proxy(:teardown)
|
97
|
+
end
|
98
|
+
|
85
99
|
# Proxy various method calls to our subordinate classes
|
86
|
-
def
|
100
|
+
def node_method_proxy(method_name, *method_args)
|
87
101
|
@@ui.logger.debug { "TestLab.#{method_name}" }
|
88
102
|
TestLab::Node.all.map do |node|
|
89
103
|
node.send(method_name.to_sym, *method_args)
|
@@ -94,8 +108,8 @@ class TestLab
|
|
94
108
|
def method_missing(method_name, *method_args)
|
95
109
|
@@ui.logger.debug { "TESTLAB METHOD MISSING: #{method_name.inspect}(#{method_args.inspect})" }
|
96
110
|
|
97
|
-
if TestLab::Provider::PROXY_METHODS.include?(method_name)
|
98
|
-
|
111
|
+
if TestLab::Provider::PROXY_METHODS.include?(method_name) # || %w(setup teardown).map(&:to_sym).include?(method_name))
|
112
|
+
node_method_proxy(method_name, *method_args)
|
99
113
|
else
|
100
114
|
super(method_name, *method_args)
|
101
115
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/testlab_spec.rb
CHANGED
data/testlab.gemspec
CHANGED
@@ -26,8 +26,8 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.version = TestLab::VERSION
|
27
27
|
spec.authors = ["Zachary Patten"]
|
28
28
|
spec.email = ["zachary@jovelabs.com"]
|
29
|
-
spec.description = %q{A framework for building virtual
|
30
|
-
spec.summary = %q{A framework for building virtual
|
29
|
+
spec.description = %q{A framework for building lightweight virtual infrastructure using LXC}
|
30
|
+
spec.summary = %q{A framework for building lightweight virtual infrastructure using LXC}
|
31
31
|
spec.homepage = "https://github.com/zpatten/testlab"
|
32
32
|
spec.license = "Apache 2.0"
|
33
33
|
|
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.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: lxc
|
@@ -139,7 +139,7 @@ dependencies:
|
|
139
139
|
- - ! '>='
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
|
-
description: A framework for building virtual
|
142
|
+
description: A framework for building lightweight virtual infrastructure using LXC
|
143
143
|
email:
|
144
144
|
- zachary@jovelabs.com
|
145
145
|
executables:
|
@@ -160,9 +160,31 @@ files:
|
|
160
160
|
- bin/testlab-console
|
161
161
|
- lib/testlab.rb
|
162
162
|
- lib/testlab/container.rb
|
163
|
+
- lib/testlab/container/actions.rb
|
164
|
+
- lib/testlab/container/generators.rb
|
165
|
+
- lib/testlab/container/lifecycle.rb
|
166
|
+
- lib/testlab/container/lxc.rb
|
167
|
+
- lib/testlab/container/network.rb
|
168
|
+
- lib/testlab/container/status.rb
|
163
169
|
- lib/testlab/labfile.rb
|
164
170
|
- lib/testlab/network.rb
|
171
|
+
- lib/testlab/network/actions.rb
|
172
|
+
- lib/testlab/network/cidr.rb
|
173
|
+
- lib/testlab/network/lifecycle.rb
|
174
|
+
- lib/testlab/network/status.rb
|
165
175
|
- lib/testlab/node.rb
|
176
|
+
- lib/testlab/node/bind.rb
|
177
|
+
- lib/testlab/node/lifecycle.rb
|
178
|
+
- lib/testlab/node/lxc.rb
|
179
|
+
- lib/testlab/node/resolv.rb
|
180
|
+
- lib/testlab/node/ssh.rb
|
181
|
+
- lib/testlab/node/status.rb
|
182
|
+
- lib/testlab/node/templates/bind-db.erb
|
183
|
+
- lib/testlab/node/templates/bind-setup.erb
|
184
|
+
- lib/testlab/node/templates/bind-zone.erb
|
185
|
+
- lib/testlab/node/templates/bind.erb
|
186
|
+
- lib/testlab/node/templates/node-setup.erb
|
187
|
+
- lib/testlab/node/templates/resolv.erb
|
166
188
|
- lib/testlab/provider.rb
|
167
189
|
- lib/testlab/providers/aws.rb
|
168
190
|
- lib/testlab/providers/local.rb
|
@@ -195,7 +217,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
217
|
version: '0'
|
196
218
|
segments:
|
197
219
|
- 0
|
198
|
-
hash: -
|
220
|
+
hash: -3944268925164045043
|
199
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
222
|
none: false
|
201
223
|
requirements:
|
@@ -204,13 +226,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
226
|
version: '0'
|
205
227
|
segments:
|
206
228
|
- 0
|
207
|
-
hash: -
|
229
|
+
hash: -3944268925164045043
|
208
230
|
requirements: []
|
209
231
|
rubyforge_project:
|
210
232
|
rubygems_version: 1.8.25
|
211
233
|
signing_key:
|
212
234
|
specification_version: 3
|
213
|
-
summary: A framework for building virtual
|
235
|
+
summary: A framework for building lightweight virtual infrastructure using LXC
|
214
236
|
test_files:
|
215
237
|
- spec/provider_spec.rb
|
216
238
|
- spec/provisioner_spec.rb
|