testlab 1.5.1 → 1.6.0
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/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=
|