testlab 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  #^syntax detection
3
3
 
4
+ version ">= 1.5.1"
5
+
4
6
  node 'vagrant' do
5
7
 
6
8
  provider TestLab::Provider::Local
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  #^syntax detection
3
3
 
4
+ version ">= 1.5.1"
5
+
4
6
  node 'vagrant' do
5
7
 
6
8
  provider TestLab::Provider::Vagrant
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'
@@ -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.info { "Loading Container '#{self.id}'" }
145
+ @ui.logger.debug { "Loading Container" }
138
146
  super(*args)
139
- @ui.logger.info { "Container '#{self.id}' Loaded" }
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
@@ -21,9 +21,9 @@ class TestLab
21
21
  def initialize(*args)
22
22
  @ui = TestLab.ui
23
23
 
24
- @ui.logger.info { "Loading Interface '#{self.id}'" }
24
+ @ui.logger.debug { "Loading Interface" }
25
25
  super(*args)
26
- @ui.logger.info { "Interface '#{self.id}' Loaded" }
26
+ @ui.logger.debug { "Interface '#{self.id}' Loaded" }
27
27
  end
28
28
 
29
29
  def ip
@@ -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 :nodes, :class_name => 'TestLab::Node'
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, :default => Hash.new
14
- attribute :version, :default => TestLab::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.info { "Loading Labfile '#{self.id}'" }
21
+ @ui.logger.debug { "Loading Labfile" }
20
22
  super(*args)
21
- @ui.logger.info { "Labfile '#{self.id}' Loaded" }
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
@@ -41,9 +41,9 @@ class TestLab
41
41
  def initialize(*args)
42
42
  @ui = TestLab.ui
43
43
 
44
- @ui.logger.info { "Loading Network '#{self.id}'" }
44
+ @ui.logger.debug { "Loading Network" }
45
45
  super(*args)
46
- @ui.logger.info { "Network '#{self.id}' Loaded" }
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.info { "Loading Node '#{self.id}'" }
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.info { "Node '#{self.id}' Loaded" }
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
- bind_provision(container.node)
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
- bind_provision(network.node)
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.info { "Loading User '#{self.id}'" }
33
+ @ui.logger.debug { "Loading User" }
34
34
  super(*args)
35
- @ui.logger.info { "User '#{self.id}' Loaded" }
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 = ((self.container.node.user == "root") ? %(/root) : %(/home/#{self.container.node.user}))
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}'))
@@ -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!"
@@ -1,6 +1,6 @@
1
1
  class TestLab
2
2
  unless const_defined?(:VERSION)
3
3
  # TestLab Gem Version
4
- VERSION = "1.5.1"
4
+ VERSION = "1.6.0"
5
5
  end
6
6
  end
data/spec/support/Labfile CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  #^syntax detection
3
3
 
4
+ version ">= 1.5.1"
5
+
4
6
  shell_provision_script = <<-EOF
5
7
  set -x
6
8
  apt-get -y update
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.5.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-14 00:00:00.000000000 Z
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: 2.0.6
351
+ rubygems_version: 1.8.25
324
352
  signing_key:
325
- specification_version: 4
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=