testlab 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/features/support/Labfile.local +2 -0
- data/features/support/Labfile.vagrant +2 -0
- data/lib/testlab.rb +2 -0
- data/lib/testlab/container.rb +38 -3
- data/lib/testlab/container/class_methods.rb +1 -1
- data/lib/testlab/container/status.rb +2 -1
- data/lib/testlab/dependency.rb +23 -0
- data/lib/testlab/interface.rb +2 -2
- data/lib/testlab/labfile.rb +27 -5
- data/lib/testlab/network.rb +2 -2
- data/lib/testlab/node.rb +2 -2
- data/lib/testlab/provisioners/bind.rb +2 -2
- data/lib/testlab/source.rb +23 -0
- data/lib/testlab/user.rb +2 -2
- data/lib/testlab/user/lifecycle.rb +20 -1
- data/lib/testlab/utility/gli.rb +2 -2
- data/lib/testlab/version.rb +1 -1
- data/spec/support/Labfile +2 -0
- metadata +33 -5
- checksums.yaml +0 -15
data/lib/testlab.rb
CHANGED
@@ -121,12 +121,14 @@ class TestLab
|
|
121
121
|
|
122
122
|
# Main Classes
|
123
123
|
autoload :Container, 'testlab/container'
|
124
|
+
autoload :Dependency, 'testlab/dependency'
|
124
125
|
autoload :Interface, 'testlab/interface'
|
125
126
|
autoload :Labfile, 'testlab/labfile'
|
126
127
|
autoload :Network, 'testlab/network'
|
127
128
|
autoload :Node, 'testlab/node'
|
128
129
|
autoload :Provider, 'testlab/provider'
|
129
130
|
autoload :Provisioner, 'testlab/provisioner'
|
131
|
+
autoload :Source, 'testlab/source'
|
130
132
|
autoload :Support, 'testlab/support'
|
131
133
|
autoload :User, 'testlab/user'
|
132
134
|
autoload :Utility, 'testlab/utility'
|
data/lib/testlab/container.rb
CHANGED
@@ -72,7 +72,7 @@ class TestLab
|
|
72
72
|
# An array of symbols of the various keys in our status hash.
|
73
73
|
#
|
74
74
|
# @see TestLab::Container::Status
|
75
|
-
STATUS_KEYS = %w(id node_id mode fqdn state distro release interfaces provisioners).map(&:to_sym)
|
75
|
+
STATUS_KEYS = %w(id node_id mode fqdn state distro release interfaces provisioners inherited).map(&:to_sym)
|
76
76
|
|
77
77
|
# Sub-Modules
|
78
78
|
autoload :Actions, 'testlab/container/actions'
|
@@ -125,18 +125,53 @@ class TestLab
|
|
125
125
|
attribute :release, :default => 'precise'
|
126
126
|
attribute :arch
|
127
127
|
|
128
|
+
attribute :tags, :default => Array.new
|
129
|
+
|
128
130
|
# Instructs ephemeral containers to persist; otherwise tmpfs will be used
|
129
131
|
# as the backend store for ephemeral containers.
|
130
132
|
# NOTE: tmpfs is very memory intensive and is disabled by default.
|
131
133
|
attribute :persist, :default => true
|
132
134
|
|
135
|
+
# Is this a template? Never build it if so.
|
136
|
+
attribute :template, :default => false
|
137
|
+
|
138
|
+
# Should we inherit a container?
|
139
|
+
attribute :inherit
|
140
|
+
|
133
141
|
|
134
142
|
def initialize(*args)
|
135
143
|
@ui = TestLab.ui
|
136
144
|
|
137
|
-
@ui.logger.
|
145
|
+
@ui.logger.debug { "Loading Container" }
|
138
146
|
super(*args)
|
139
|
-
@ui.logger.
|
147
|
+
@ui.logger.debug { "Container '#{self.id}' Loaded" }
|
148
|
+
|
149
|
+
self.tags ||= [ self.id ]
|
150
|
+
|
151
|
+
if !self.inherit.nil?
|
152
|
+
@ui.logger.debug { "INHERIT: #{self.inherit}" }
|
153
|
+
|
154
|
+
parent = TestLab::Container.first(self.inherit)
|
155
|
+
if parent.nil?
|
156
|
+
raise ContainerError, "Could not find the container you specified to inherit attributes from!"
|
157
|
+
end
|
158
|
+
|
159
|
+
# Inherit the containers attributes
|
160
|
+
parent.attributes.reject{ |k,v| [:id, :node_id, :inherit, :template].include?(k) }.each do |key, value|
|
161
|
+
self.send("#{key}=", (value.dup rescue value))
|
162
|
+
end
|
163
|
+
|
164
|
+
# Inherit the containers users
|
165
|
+
parent.users.each do |user|
|
166
|
+
inherited_user = TestLab::User.new
|
167
|
+
inherited_user.container_id = self.id
|
168
|
+
|
169
|
+
user.attributes.reject{ |k,v| [:id, :container_id].include?(k) }.each do |key, value|
|
170
|
+
inherited_user.send("#{key}=", (value.dup rescue value))
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
140
175
|
end
|
141
176
|
|
142
177
|
def config_dir
|
@@ -10,7 +10,7 @@ class TestLab
|
|
10
10
|
#
|
11
11
|
# @return [Array<String>] A unique array of all defined domain names.
|
12
12
|
def domains
|
13
|
-
self.all.map do |container|
|
13
|
+
self.all.select{ |container| (!container.template rescue true) }.map do |container|
|
14
14
|
container.domain ||= container.node.domain
|
15
15
|
container.domain
|
16
16
|
end.compact.uniq
|
@@ -60,7 +60,8 @@ class TestLab
|
|
60
60
|
:release => self.release,
|
61
61
|
:interfaces => interfaces,
|
62
62
|
:provisioners => self.provisioners.map(&:to_s).collect{ |p| p.split('::').last }.join(','),
|
63
|
-
:node_id => self.node.id
|
63
|
+
:node_id => self.node.id,
|
64
|
+
:inherited => (self.inherit.nil? ? 'none' : self.inherit)
|
64
65
|
}
|
65
66
|
end
|
66
67
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class TestLab
|
2
|
+
|
3
|
+
# Dependency Error Class
|
4
|
+
class DependencyError < TestLabError; end
|
5
|
+
|
6
|
+
# Dependency Class
|
7
|
+
#
|
8
|
+
# @author Zachary Patten <zachary AT jovelabs DOT com>
|
9
|
+
class Dependency < ZTK::DSL::Base
|
10
|
+
# Associations and Attributes
|
11
|
+
belongs_to :labfile, :class_name => 'TestLab::Labfile'
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
@ui = TestLab.ui
|
15
|
+
|
16
|
+
@ui.logger.info { "Loading Dependency '#{self.id}'" }
|
17
|
+
super(*args)
|
18
|
+
@ui.logger.info { "Dependency '#{self.id}' Loaded" }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/testlab/interface.rb
CHANGED
@@ -21,9 +21,9 @@ class TestLab
|
|
21
21
|
def initialize(*args)
|
22
22
|
@ui = TestLab.ui
|
23
23
|
|
24
|
-
@ui.logger.
|
24
|
+
@ui.logger.debug { "Loading Interface" }
|
25
25
|
super(*args)
|
26
|
-
@ui.logger.
|
26
|
+
@ui.logger.debug { "Interface '#{self.id}' Loaded" }
|
27
27
|
end
|
28
28
|
|
29
29
|
def ip
|
data/lib/testlab/labfile.rb
CHANGED
@@ -7,18 +7,40 @@ class TestLab
|
|
7
7
|
#
|
8
8
|
# @author Zachary Patten <zachary AT jovelabs DOT com>
|
9
9
|
class Labfile < ZTK::DSL::Base
|
10
|
-
has_many :
|
10
|
+
has_many :dependencies, :class_name => 'TestLab::Dependency'
|
11
|
+
has_many :sources, :class_name => 'TestLab::Source'
|
12
|
+
has_many :nodes, :class_name => 'TestLab::Node'
|
11
13
|
|
12
14
|
attribute :testlab
|
13
|
-
attribute :config,
|
14
|
-
attribute :version
|
15
|
+
attribute :config, :default => Hash.new
|
16
|
+
attribute :version
|
15
17
|
|
16
18
|
def initialize(*args)
|
17
19
|
@ui = TestLab.ui
|
18
20
|
|
19
|
-
@ui.logger.
|
21
|
+
@ui.logger.debug { "Loading Labfile" }
|
20
22
|
super(*args)
|
21
|
-
@ui.logger.
|
23
|
+
@ui.logger.debug { "Labfile '#{self.id}' Loaded" }
|
24
|
+
|
25
|
+
if version.nil?
|
26
|
+
raise LabfileError, 'You must version the Labfile!'
|
27
|
+
else
|
28
|
+
@ui.logger.debug { "Labfile Version: #{version}" }
|
29
|
+
version_arguments = version.split
|
30
|
+
@ui.logger.debug { version_arguments.inspect }
|
31
|
+
|
32
|
+
if version_arguments.count == 1
|
33
|
+
if (TestLab::VERSION != version_arguments.first)
|
34
|
+
raise LabfileError, "This Labfile is not compatible with this version of TestLab! (#{version})"
|
35
|
+
end
|
36
|
+
elsif version_arguments.count == 2
|
37
|
+
if !TestLab::VERSION.send(version_arguments.first, version_arguments.last)
|
38
|
+
raise LabfileError, "This Labfile is not compatible with this version of TestLab! (#{version})"
|
39
|
+
end
|
40
|
+
else
|
41
|
+
raise LabfileError, 'Invalid version!'
|
42
|
+
end
|
43
|
+
end
|
22
44
|
end
|
23
45
|
|
24
46
|
def config_dir
|
data/lib/testlab/network.rb
CHANGED
@@ -41,9 +41,9 @@ class TestLab
|
|
41
41
|
def initialize(*args)
|
42
42
|
@ui = TestLab.ui
|
43
43
|
|
44
|
-
@ui.logger.
|
44
|
+
@ui.logger.debug { "Loading Network" }
|
45
45
|
super(*args)
|
46
|
-
@ui.logger.
|
46
|
+
@ui.logger.debug { "Network '#{self.id}' Loaded" }
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
data/lib/testlab/node.rb
CHANGED
@@ -46,7 +46,7 @@ class TestLab
|
|
46
46
|
def initialize(*args)
|
47
47
|
@ui = TestLab.ui
|
48
48
|
|
49
|
-
@ui.logger.
|
49
|
+
@ui.logger.debug { "Loading Node" }
|
50
50
|
|
51
51
|
super(*args)
|
52
52
|
|
@@ -54,7 +54,7 @@ class TestLab
|
|
54
54
|
|
55
55
|
raise NodeError, "You must specify a provider class!" if self.provider.nil?
|
56
56
|
|
57
|
-
@ui.logger.
|
57
|
+
@ui.logger.debug { "Node '#{self.id}' Loaded" }
|
58
58
|
end
|
59
59
|
|
60
60
|
def config_dir
|
@@ -41,7 +41,7 @@ class TestLab
|
|
41
41
|
def on_container_provision(container)
|
42
42
|
@ui.logger.debug { "BIND Provisioner: Container #{container.id}" }
|
43
43
|
|
44
|
-
|
44
|
+
bind_reload(container.node)
|
45
45
|
|
46
46
|
true
|
47
47
|
end
|
@@ -54,7 +54,7 @@ class TestLab
|
|
54
54
|
def on_network_provision(network)
|
55
55
|
@ui.logger.debug { "BIND Provisioner: Network #{network.id}" }
|
56
56
|
|
57
|
-
|
57
|
+
bind_reload(network.node)
|
58
58
|
|
59
59
|
true
|
60
60
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class TestLab
|
2
|
+
|
3
|
+
# Source Error Class
|
4
|
+
class SourceError < TestLabError; end
|
5
|
+
|
6
|
+
# Source Class
|
7
|
+
#
|
8
|
+
# @author Zachary Patten <zachary AT jovelabs DOT com>
|
9
|
+
class Source < ZTK::DSL::Base
|
10
|
+
# Associations and Attributes
|
11
|
+
belongs_to :labfile, :class_name => 'TestLab::Labfile'
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
@ui = TestLab.ui
|
15
|
+
|
16
|
+
@ui.logger.info { "Loading Source '#{self.id}'" }
|
17
|
+
super(*args)
|
18
|
+
@ui.logger.info { "Source '#{self.id}' Loaded" }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/testlab/user.rb
CHANGED
@@ -30,9 +30,9 @@ class TestLab
|
|
30
30
|
def initialize(*args)
|
31
31
|
@ui = TestLab.ui
|
32
32
|
|
33
|
-
@ui.logger.
|
33
|
+
@ui.logger.debug { "Loading User" }
|
34
34
|
super(*args)
|
35
|
-
@ui.logger.
|
35
|
+
@ui.logger.debug { "User '#{self.id}' Loaded" }
|
36
36
|
end
|
37
37
|
|
38
38
|
end
|
@@ -9,7 +9,7 @@ class TestLab
|
|
9
9
|
def provision
|
10
10
|
@ui.logger.debug { "User Create: #{self.username} " }
|
11
11
|
|
12
|
-
node_home_dir = (
|
12
|
+
node_home_dir = home_dir(self.container.node.user)
|
13
13
|
node_authkeys = File.join(node_home_dir, ".ssh", "authorized_keys")
|
14
14
|
|
15
15
|
# ensure the container user exists
|
@@ -48,6 +48,12 @@ class TestLab
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
if (public_identities.count > 0)
|
52
|
+
id_rsa_pub = File.join(user_home_dir, ".ssh", "id_rsa.pub")
|
53
|
+
self.container.node.exec(%(sudo grep -e "#{public_identities.first}" #{id_rsa_pub} || echo "#{public_identities.first}" | sudo tee #{id_rsa_pub}), :ignore_exit_status => true)
|
54
|
+
self.container.node.exec(%(sudo chmod -v 644 #{id_rsa_pub}), :ignore_exit_status => true)
|
55
|
+
end
|
56
|
+
|
51
57
|
authkeys.each do |destination, source|
|
52
58
|
@ui.logger.info { "SOURCE: #{source} >>> #{destination}" }
|
53
59
|
self.container.node.exec(%(sudo mkdir -pv #{File.dirname(destination)}))
|
@@ -61,6 +67,19 @@ class TestLab
|
|
61
67
|
self.container.node.exec(%(sudo chmod -v 644 #{destination}))
|
62
68
|
end
|
63
69
|
|
70
|
+
identities = Array.new
|
71
|
+
!self.identity.nil? and [self.identity].flatten.compact.each do |i|
|
72
|
+
if File.exists?(i)
|
73
|
+
identities << ::IO.read(i).strip
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
if (identities.count > 0)
|
78
|
+
id_rsa = File.join(user_home_dir, ".ssh", "id_rsa")
|
79
|
+
self.container.node.exec(%(sudo grep -e "#{identities.first}" #{id_rsa} || echo "#{identities.first}" | sudo tee #{id_rsa}), :ignore_exit_status => true)
|
80
|
+
self.container.node.exec(%(sudo chmod -v 400 #{id_rsa}), :ignore_exit_status => true)
|
81
|
+
end
|
82
|
+
|
64
83
|
# ensure the container user home directory is owned by them
|
65
84
|
home_dir = self.container.lxc.attach(%(-- /bin/bash -c 'grep #{self.username} /etc/passwd | cut -d ":" -f6')).strip
|
66
85
|
self.container.lxc.attach(%(-- /bin/bash -c 'sudo chown -Rv $(id -u #{self.username}):$(id -g #{self.username}) #{home_dir}'))
|
data/lib/testlab/utility/gli.rb
CHANGED
@@ -76,10 +76,10 @@ class TestLab
|
|
76
76
|
klass_name = klass.to_s.split('::').last.downcase
|
77
77
|
|
78
78
|
if name.nil?
|
79
|
-
objects = klass.all
|
79
|
+
objects = klass.all.select{ |object| (!object.template rescue true) }
|
80
80
|
else
|
81
81
|
names = name.split(',')
|
82
|
-
objects = klass.find(names)
|
82
|
+
objects = klass.find(names).select{ |object| (!object.template rescue true) }
|
83
83
|
end
|
84
84
|
|
85
85
|
(objects.nil? || (objects.count == 0)) and raise TestLab::TestLabError, "We could not find any of the #{klass_name}s you supplied!"
|
data/lib/testlab/version.rb
CHANGED
data/spec/support/Labfile
CHANGED
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testlab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Zachary Patten
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-22 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: gli
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: lxc
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: ztk
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: activesupport
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: bundler
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,6 +86,7 @@ dependencies:
|
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
@@ -83,6 +94,7 @@ dependencies:
|
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: pry
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
99
|
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
@@ -90,6 +102,7 @@ dependencies:
|
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
107
|
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
@@ -97,6 +110,7 @@ dependencies:
|
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: rake
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
115
|
- - ! '>='
|
102
116
|
- !ruby/object:Gem::Version
|
@@ -104,6 +118,7 @@ dependencies:
|
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
123
|
- - ! '>='
|
109
124
|
- !ruby/object:Gem::Version
|
@@ -111,6 +126,7 @@ dependencies:
|
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: redcarpet
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
131
|
- - ! '>='
|
116
132
|
- !ruby/object:Gem::Version
|
@@ -118,6 +134,7 @@ dependencies:
|
|
118
134
|
type: :development
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
139
|
- - ! '>='
|
123
140
|
- !ruby/object:Gem::Version
|
@@ -125,6 +142,7 @@ dependencies:
|
|
125
142
|
- !ruby/object:Gem::Dependency
|
126
143
|
name: aruba
|
127
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
128
146
|
requirements:
|
129
147
|
- - ! '>='
|
130
148
|
- !ruby/object:Gem::Version
|
@@ -132,6 +150,7 @@ dependencies:
|
|
132
150
|
type: :development
|
133
151
|
prerelease: false
|
134
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
135
154
|
requirements:
|
136
155
|
- - ! '>='
|
137
156
|
- !ruby/object:Gem::Version
|
@@ -139,6 +158,7 @@ dependencies:
|
|
139
158
|
- !ruby/object:Gem::Dependency
|
140
159
|
name: rspec
|
141
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
142
162
|
requirements:
|
143
163
|
- - ! '>='
|
144
164
|
- !ruby/object:Gem::Version
|
@@ -146,6 +166,7 @@ dependencies:
|
|
146
166
|
type: :development
|
147
167
|
prerelease: false
|
148
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
149
170
|
requirements:
|
150
171
|
- - ! '>='
|
151
172
|
- !ruby/object:Gem::Version
|
@@ -153,6 +174,7 @@ dependencies:
|
|
153
174
|
- !ruby/object:Gem::Dependency
|
154
175
|
name: yard
|
155
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
156
178
|
requirements:
|
157
179
|
- - ! '>='
|
158
180
|
- !ruby/object:Gem::Version
|
@@ -160,6 +182,7 @@ dependencies:
|
|
160
182
|
type: :development
|
161
183
|
prerelease: false
|
162
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
163
186
|
requirements:
|
164
187
|
- - ! '>='
|
165
188
|
- !ruby/object:Gem::Version
|
@@ -167,6 +190,7 @@ dependencies:
|
|
167
190
|
- !ruby/object:Gem::Dependency
|
168
191
|
name: coveralls
|
169
192
|
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
170
194
|
requirements:
|
171
195
|
- - ! '>='
|
172
196
|
- !ruby/object:Gem::Version
|
@@ -174,6 +198,7 @@ dependencies:
|
|
174
198
|
type: :development
|
175
199
|
prerelease: false
|
176
200
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
177
202
|
requirements:
|
178
203
|
- - ! '>='
|
179
204
|
- !ruby/object:Gem::Version
|
@@ -229,6 +254,7 @@ files:
|
|
229
254
|
- lib/testlab/container/status.rb
|
230
255
|
- lib/testlab/container/support.rb
|
231
256
|
- lib/testlab/container/user.rb
|
257
|
+
- lib/testlab/dependency.rb
|
232
258
|
- lib/testlab/interface.rb
|
233
259
|
- lib/testlab/labfile.rb
|
234
260
|
- lib/testlab/monkeys.rb
|
@@ -277,6 +303,7 @@ files:
|
|
277
303
|
- lib/testlab/provisioners/templates/chef/ruby_gem_server.erb
|
278
304
|
- lib/testlab/provisioners/templates/raring/provision.erb
|
279
305
|
- lib/testlab/provisioners/templates/resolv/provision.erb
|
306
|
+
- lib/testlab/source.rb
|
280
307
|
- lib/testlab/support.rb
|
281
308
|
- lib/testlab/support/execution.rb
|
282
309
|
- lib/testlab/support/lifecycle.rb
|
@@ -303,26 +330,27 @@ files:
|
|
303
330
|
homepage: http://hackers.lookout.com/testlab/
|
304
331
|
licenses:
|
305
332
|
- Apache 2.0
|
306
|
-
metadata: {}
|
307
333
|
post_install_message:
|
308
334
|
rdoc_options: []
|
309
335
|
require_paths:
|
310
336
|
- lib
|
311
337
|
required_ruby_version: !ruby/object:Gem::Requirement
|
338
|
+
none: false
|
312
339
|
requirements:
|
313
340
|
- - ! '>='
|
314
341
|
- !ruby/object:Gem::Version
|
315
342
|
version: '0'
|
316
343
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
344
|
+
none: false
|
317
345
|
requirements:
|
318
346
|
- - ! '>='
|
319
347
|
- !ruby/object:Gem::Version
|
320
348
|
version: '0'
|
321
349
|
requirements: []
|
322
350
|
rubyforge_project:
|
323
|
-
rubygems_version:
|
351
|
+
rubygems_version: 1.8.25
|
324
352
|
signing_key:
|
325
|
-
specification_version:
|
353
|
+
specification_version: 3
|
326
354
|
summary: A toolkit for building virtual computer labs
|
327
355
|
test_files:
|
328
356
|
- features/step_definitions/container_steps.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
NjVlY2RkMzUzYzVhZjA4NTBlM2FjMDQxZjJiMzY0ZTEwOTgwMTExYw==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MzQwNzNmZDcxYmUzZjBhNjEwYTAzZWMxYjA1YTgyNDU3MzViMmFhYw==
|
7
|
-
!binary "U0hBNTEy":
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
N2VmM2YwZDg1YmUzNTliNGQ3ODhlNGYyY2YyYzU2YzliZmY3NTM3MmMxNDI0
|
10
|
-
Zjc1YjJlODYxYWIyNzJiYjZkMWQzNGU3MTM1ODc4MTdlYTM1OWRlNDVlNGU5
|
11
|
-
ZjRmMzIwODA1NThjZTUzYWEwMzQxZjJiYTJkYmYzMmYzY2Q5ZTI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2UwN2Q2ZjE5YWMzNTUxZTkzNWU1NDM4MjMwM2NkN2EyYjQwNDhhMWViZGY2
|
14
|
-
MTg1NmIwNzZjNDdjNjRkY2JlYjNjY2FmZDMwNTY0NTU5YmYxYzRhMTFjMWJj
|
15
|
-
ZDJiNDQ5OTA0YjI4N2I2MDlkYTkxYTY2MWU5NjBhMjNjZTAxMzM=
|