testlab 0.6.4 → 0.6.5
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 +20 -15
- data/bin/tl +75 -75
- data/lib/testlab/container/actions.rb +4 -2
- data/lib/testlab/version.rb +1 -1
- data/spec/container_spec.rb +1 -0
- metadata +3 -3
data/README.md
CHANGED
@@ -81,9 +81,14 @@ You can also destroy it (only works for VM backed providers; this would be a NO-
|
|
81
81
|
|
82
82
|
# Interacting with Containers
|
83
83
|
|
84
|
+
Most commands dealing will containers will take this argument:
|
85
|
+
|
86
|
+
COMMAND OPTIONS
|
87
|
+
-n, --name=container - Container ID or Name (default: none)
|
88
|
+
|
84
89
|
You can interact with containers via SSH:
|
85
90
|
|
86
|
-
tl container ssh -
|
91
|
+
tl container ssh -n <container ID>
|
87
92
|
|
88
93
|
You can pass an optional alternate username and/or identity to use. By default TestLab will attempt to SSH as the user defined in the `Labfile` for that container, otherwise the default user for the containers distro is used.
|
89
94
|
|
@@ -96,18 +101,18 @@ You can pass an optional alternate username and/or identity to use. By default
|
|
96
101
|
|
97
102
|
COMMAND OPTIONS
|
98
103
|
-u, --user=username - Specify an SSH Username to use (default: none)
|
99
|
-
-
|
104
|
+
-i, --identity=key - Specify an SSH Identity Key to use (default: none)
|
100
105
|
|
101
106
|
You can individually online, offline, create or destroy containers:
|
102
107
|
|
103
|
-
tl container down -
|
104
|
-
tl container up -
|
105
|
-
tl container setup -
|
106
|
-
tl container teardown -
|
108
|
+
tl container down -n server-www-1
|
109
|
+
tl container up -n server-www-1
|
110
|
+
tl container setup -n server-www-1
|
111
|
+
tl container teardown -n server-www-1
|
107
112
|
|
108
113
|
You can recycle a container, effectively destroying then creating it again, provisioning it back to a "pristine" condition.
|
109
114
|
|
110
|
-
tl container recycle -
|
115
|
+
tl container recycle -n server-www-1
|
111
116
|
|
112
117
|
# Ephemeral Container Cloning
|
113
118
|
|
@@ -115,22 +120,22 @@ As it stands attempting to iterate infrastructure while developing with Vagrant
|
|
115
120
|
|
116
121
|
Here we are cloning the container for the first time. It takes a bit longer than normal because TestLab is actually shutting down the container so it can be retained as the "pristine" copy of it, and starting up a ephemeral container in its place. Subsequent calls to clone are very fast.
|
117
122
|
|
118
|
-
$ tl container clone -
|
123
|
+
$ tl container clone -n server-www-1
|
119
124
|
[TL] TestLab v0.6.1 Loaded
|
120
125
|
[TL] container server-www-1 clone # Completed in 13.0116 seconds!
|
121
|
-
$ tl container clone -
|
126
|
+
$ tl container clone -n server-www-1
|
122
127
|
[TL] TestLab v0.6.1 Loaded
|
123
128
|
[TL] container server-www-1 clone # Completed in 0.9169 seconds!
|
124
|
-
$ tl container clone -
|
129
|
+
$ tl container clone -n server-www-1
|
125
130
|
[TL] TestLab v0.6.1 Loaded
|
126
131
|
[TL] container server-www-1 clone # Completed in 1.0794 seconds!
|
127
|
-
$ tl container clone -
|
132
|
+
$ tl container clone -n server-www-1
|
128
133
|
[TL] TestLab v0.6.1 Loaded
|
129
134
|
[TL] container server-www-1 clone # Completed in 1.0281 seconds!
|
130
135
|
|
131
136
|
We can also see the containers status reflects that it is a clone currently:
|
132
137
|
|
133
|
-
$ tl container status -
|
138
|
+
$ tl container status -n server-www-1
|
134
139
|
[TL] TestLab v0.6.1 Loaded
|
135
140
|
+----------------------------------------------+
|
136
141
|
| NODE_ID: vagrant |
|
@@ -146,17 +151,17 @@ We can also see the containers status reflects that it is a clone currently:
|
|
146
151
|
|
147
152
|
We can easily revert it back to a full container if we want to make changes to it:
|
148
153
|
|
149
|
-
$ tl container up -
|
154
|
+
$ tl container up -n server-www-1
|
150
155
|
|
151
156
|
We can even recycle it while it is in a cloned state:
|
152
157
|
|
153
|
-
$ tl container recycle -
|
158
|
+
$ tl container recycle -n server-www-1
|
154
159
|
|
155
160
|
# Network Routes
|
156
161
|
|
157
162
|
TestLab will add network routes for any networks defined in the `Labfile` with the route flag set to true. This will allow you to directly interact with containers. Here is an example of the routes added with the multi-network `Labfile`.
|
158
163
|
|
159
|
-
$ tl network route show -
|
164
|
+
$ tl network route show -n labnet
|
160
165
|
[TL] TestLab v0.6.1 Loaded
|
161
166
|
TestLab routes:
|
162
167
|
10.10.0.0 192.168.33.239 255.255.0.0 UG 0 0 0 vboxnet0
|
data/bin/tl
CHANGED
@@ -110,16 +110,16 @@ command :node do |c|
|
|
110
110
|
|
111
111
|
c.desc 'Node ID or Name'
|
112
112
|
c.arg_name 'node'
|
113
|
-
c.flag [:
|
113
|
+
c.flag [:n, :name]
|
114
114
|
|
115
115
|
# NODE SSH
|
116
116
|
###########
|
117
117
|
c.desc 'Open an SSH console to a node'
|
118
118
|
c.command :ssh do |ssh|
|
119
119
|
ssh.action do |global_options,options,args|
|
120
|
-
help_now!('
|
120
|
+
help_now!('name is required') if options[:name].nil?
|
121
121
|
|
122
|
-
node = @testlab.nodes.select{ |n| n.id.to_sym == options[:
|
122
|
+
node = @testlab.nodes.select{ |n| n.id.to_sym == options[:name].to_sym }.first
|
123
123
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
124
124
|
|
125
125
|
node.ssh.console
|
@@ -132,14 +132,14 @@ command :node do |c|
|
|
132
132
|
c.long_desc 'Displays the status of all nodes or a single node if supplied via the ID parameter.'
|
133
133
|
c.command :status do |status|
|
134
134
|
status.action do |global_options, options, args|
|
135
|
-
if options[:
|
135
|
+
if options[:name].nil?
|
136
136
|
# No ID supplied; show everything
|
137
137
|
ZTK::Report.new(:ui => @testlab.ui).spreadsheet(@testlab.nodes, TestLab::Node::STATUS_KEYS) do |node|
|
138
138
|
OpenStruct.new(node.status)
|
139
139
|
end
|
140
140
|
else
|
141
141
|
# ID supplied; show just that item
|
142
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
142
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
143
143
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
144
144
|
|
145
145
|
ZTK::Report.new(:ui => @testlab.ui).list(node, TestLab::Node::STATUS_KEYS) do |node|
|
@@ -157,10 +157,10 @@ Up a node. The node is started and brought online.
|
|
157
157
|
EOF
|
158
158
|
c.command :up do |up|
|
159
159
|
up.action do |global_options, options, args|
|
160
|
-
if options[:
|
161
|
-
help_now!('
|
160
|
+
if options[:name].nil?
|
161
|
+
help_now!('name is required') if options[:name].nil?
|
162
162
|
else
|
163
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
163
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
164
164
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
165
165
|
|
166
166
|
node.up
|
@@ -176,10 +176,10 @@ Down a node. The node is stopped taking it offline.
|
|
176
176
|
EOF
|
177
177
|
c.command :down do |down|
|
178
178
|
down.action do |global_options, options, args|
|
179
|
-
if options[:
|
180
|
-
help_now!('
|
179
|
+
if options[:name].nil?
|
180
|
+
help_now!('name is required') if options[:name].nil?
|
181
181
|
else
|
182
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
182
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
183
183
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
184
184
|
|
185
185
|
node.down
|
@@ -195,10 +195,10 @@ Create a node. The node is created.
|
|
195
195
|
EOF
|
196
196
|
c.command :create do |create|
|
197
197
|
create.action do |global_options, options, args|
|
198
|
-
if options[:
|
199
|
-
help_now!('
|
198
|
+
if options[:name].nil?
|
199
|
+
help_now!('name is required') if options[:name].nil?
|
200
200
|
else
|
201
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
201
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
202
202
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you screateplied!"
|
203
203
|
|
204
204
|
node.create
|
@@ -214,10 +214,10 @@ Destroy a node. The node is stopped and destroyed.
|
|
214
214
|
EOF
|
215
215
|
c.command :destroy do |destroy|
|
216
216
|
destroy.action do |global_options, options, args|
|
217
|
-
if options[:
|
218
|
-
help_now!('
|
217
|
+
if options[:name].nil?
|
218
|
+
help_now!('name is required') if options[:name].nil?
|
219
219
|
else
|
220
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
220
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
221
221
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
222
222
|
|
223
223
|
node.destroy
|
@@ -233,10 +233,10 @@ Setup a node. The node is created, started and provisioned.
|
|
233
233
|
EOF
|
234
234
|
c.command :setup do |setup|
|
235
235
|
setup.action do |global_options, options, args|
|
236
|
-
if options[:
|
237
|
-
help_now!('
|
236
|
+
if options[:name].nil?
|
237
|
+
help_now!('name is required') if options[:name].nil?
|
238
238
|
else
|
239
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
239
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
240
240
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
241
241
|
|
242
242
|
node.setup
|
@@ -252,10 +252,10 @@ Teardown a node. The node is offlined and destroyed.
|
|
252
252
|
EOF
|
253
253
|
c.command :teardown do |teardown|
|
254
254
|
teardown.action do |global_options, options, args|
|
255
|
-
if options[:
|
256
|
-
help_now!('
|
255
|
+
if options[:name].nil?
|
256
|
+
help_now!('name is required') if options[:name].nil?
|
257
257
|
else
|
258
|
-
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:
|
258
|
+
node = @testlab.nodes.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
259
259
|
node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!"
|
260
260
|
|
261
261
|
node.teardown
|
@@ -273,7 +273,7 @@ command :network do |c|
|
|
273
273
|
|
274
274
|
c.desc 'Network ID or Name'
|
275
275
|
c.arg_name 'network'
|
276
|
-
c.flag [:
|
276
|
+
c.flag [:n, :name]
|
277
277
|
|
278
278
|
|
279
279
|
# ROUTES
|
@@ -286,9 +286,9 @@ command :network do |c|
|
|
286
286
|
route.desc 'Add routes to lab networks'
|
287
287
|
route.command :add do |add|
|
288
288
|
add.action do |global_options,options,args|
|
289
|
-
help_now!('
|
289
|
+
help_now!('name is required') if options[:name].nil?
|
290
290
|
|
291
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
291
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
292
292
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
293
293
|
|
294
294
|
network.manage_route(:add)
|
@@ -302,9 +302,9 @@ command :network do |c|
|
|
302
302
|
route.desc 'Delete routes to lab networks'
|
303
303
|
route.command :del do |del|
|
304
304
|
del.action do |global_options,options,args|
|
305
|
-
help_now!('
|
305
|
+
help_now!('name is required') if options[:name].nil?
|
306
306
|
|
307
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
307
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
308
308
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
309
309
|
|
310
310
|
network.manage_route(:del)
|
@@ -318,9 +318,9 @@ command :network do |c|
|
|
318
318
|
route.desc 'Show routes to lab networks'
|
319
319
|
route.command :show do |show|
|
320
320
|
show.action do |global_options,options,args|
|
321
|
-
help_now!('
|
321
|
+
help_now!('name is required') if options[:name].nil?
|
322
322
|
|
323
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
323
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
324
324
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
325
325
|
|
326
326
|
@testlab.ui.stdout.puts("TestLab routes:".green.bold)
|
@@ -340,7 +340,7 @@ command :network do |c|
|
|
340
340
|
c.long_desc 'Displays the status of all networks or a single network if supplied via the ID parameter.'
|
341
341
|
c.command :status do |status|
|
342
342
|
status.action do |global_options, options, args|
|
343
|
-
if options[:
|
343
|
+
if options[:name].nil?
|
344
344
|
# No ID supplied; show everything
|
345
345
|
networks = @testlab.networks.delete_if{|n| n.node.dead? }
|
346
346
|
if networks.count == 0
|
@@ -352,7 +352,7 @@ command :network do |c|
|
|
352
352
|
end
|
353
353
|
else
|
354
354
|
# ID supplied; show just that item
|
355
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
355
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
356
356
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
357
357
|
|
358
358
|
ZTK::Report.new(:ui => @testlab.ui).list(network, TestLab::Network::STATUS_KEYS) do |network|
|
@@ -370,10 +370,10 @@ Up a network. The network is started and brought online.
|
|
370
370
|
EOF
|
371
371
|
c.command :up do |up|
|
372
372
|
up.action do |global_options, options, args|
|
373
|
-
if options[:
|
374
|
-
help_now!('
|
373
|
+
if options[:name].nil?
|
374
|
+
help_now!('name is required') if options[:name].nil?
|
375
375
|
else
|
376
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
376
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
377
377
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
378
378
|
|
379
379
|
network.up
|
@@ -389,10 +389,10 @@ Down a network. The network is stopped taking it offline.
|
|
389
389
|
EOF
|
390
390
|
c.command :down do |down|
|
391
391
|
down.action do |global_options, options, args|
|
392
|
-
if options[:
|
393
|
-
help_now!('
|
392
|
+
if options[:name].nil?
|
393
|
+
help_now!('name is required') if options[:name].nil?
|
394
394
|
else
|
395
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
395
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
396
396
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
397
397
|
|
398
398
|
network.down
|
@@ -408,10 +408,10 @@ Setup a network. The network is created, started and provisioned.
|
|
408
408
|
EOF
|
409
409
|
c.command :setup do |setup|
|
410
410
|
setup.action do |global_options, options, args|
|
411
|
-
if options[:
|
412
|
-
help_now!('
|
411
|
+
if options[:name].nil?
|
412
|
+
help_now!('name is required') if options[:name].nil?
|
413
413
|
else
|
414
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
414
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
415
415
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
416
416
|
|
417
417
|
network.setup
|
@@ -427,10 +427,10 @@ Teardown a network. The network is offlined and destroyed.
|
|
427
427
|
EOF
|
428
428
|
c.command :teardown do |teardown|
|
429
429
|
teardown.action do |global_options, options, args|
|
430
|
-
if options[:
|
431
|
-
help_now!('
|
430
|
+
if options[:name].nil?
|
431
|
+
help_now!('name is required') if options[:name].nil?
|
432
432
|
else
|
433
|
-
network = @testlab.networks.select{ |c| c.id.to_sym == options[:
|
433
|
+
network = @testlab.networks.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
434
434
|
network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!"
|
435
435
|
|
436
436
|
network.teardown
|
@@ -448,7 +448,7 @@ command :container do |c|
|
|
448
448
|
|
449
449
|
c.desc 'Container ID or Name'
|
450
450
|
c.arg_name 'container'
|
451
|
-
c.flag [:
|
451
|
+
c.flag [:n, :name]
|
452
452
|
|
453
453
|
# CONTAINER SSH
|
454
454
|
################
|
@@ -461,17 +461,17 @@ command :container do |c|
|
|
461
461
|
|
462
462
|
ssh.desc 'Specify an SSH Identity Key to use'
|
463
463
|
ssh.arg_name 'key'
|
464
|
-
ssh.flag [:
|
464
|
+
ssh.flag [:i, :identity]
|
465
465
|
|
466
466
|
ssh.action do |global_options, options, args|
|
467
|
-
help_now!('
|
467
|
+
help_now!('name is required') if options[:name].nil?
|
468
468
|
|
469
|
-
container = @testlab.containers.select{ |n| n.id.to_sym == options[:
|
469
|
+
container = @testlab.containers.select{ |n| n.id.to_sym == options[:name].to_sym }.first
|
470
470
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
471
471
|
|
472
472
|
ssh_options = Hash.new
|
473
473
|
ssh_options[:user] = options[:user]
|
474
|
-
ssh_options[:keys] = options[:
|
474
|
+
ssh_options[:keys] = options[:identity]
|
475
475
|
|
476
476
|
container.ssh(ssh_options).console
|
477
477
|
end
|
@@ -485,7 +485,7 @@ Displays the status of all containers or a single container if supplied via the
|
|
485
485
|
EOF
|
486
486
|
c.command :status do |status|
|
487
487
|
status.action do |global_options, options, args|
|
488
|
-
if options[:
|
488
|
+
if options[:name].nil?
|
489
489
|
# No ID supplied; show everything
|
490
490
|
containers = @testlab.containers.delete_if{ |c| c.node.dead? }
|
491
491
|
if containers.count == 0
|
@@ -499,7 +499,7 @@ EOF
|
|
499
499
|
end
|
500
500
|
else
|
501
501
|
# ID supplied; show just that item
|
502
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
502
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
503
503
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
504
504
|
|
505
505
|
ZTK::Report.new(:ui => @testlab.ui).list(container, TestLab::Container::STATUS_KEYS) do |container|
|
@@ -521,10 +521,10 @@ Down -> Destroy -> Create -> Up
|
|
521
521
|
EOF
|
522
522
|
c.command :recycle do |recycle|
|
523
523
|
recycle.action do |global_options, options, args|
|
524
|
-
if options[:
|
525
|
-
help_now!('
|
524
|
+
if options[:name].nil?
|
525
|
+
help_now!('name is required') if options[:name].nil?
|
526
526
|
else
|
527
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
527
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
528
528
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
529
529
|
|
530
530
|
container.teardown
|
@@ -541,10 +541,10 @@ Up a container. The container is started and brought online.
|
|
541
541
|
EOF
|
542
542
|
c.command :up do |up|
|
543
543
|
up.action do |global_options, options, args|
|
544
|
-
if options[:
|
545
|
-
help_now!('
|
544
|
+
if options[:name].nil?
|
545
|
+
help_now!('name is required') if options[:name].nil?
|
546
546
|
else
|
547
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
547
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
548
548
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
549
549
|
|
550
550
|
container.up
|
@@ -560,10 +560,10 @@ Down a container. The container is stopped taking it offline.
|
|
560
560
|
EOF
|
561
561
|
c.command :down do |down|
|
562
562
|
down.action do |global_options, options, args|
|
563
|
-
if options[:
|
564
|
-
help_now!('
|
563
|
+
if options[:name].nil?
|
564
|
+
help_now!('name is required') if options[:name].nil?
|
565
565
|
else
|
566
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
566
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
567
567
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
568
568
|
|
569
569
|
container.down
|
@@ -579,10 +579,10 @@ Create a container. The container is created.
|
|
579
579
|
EOF
|
580
580
|
c.command :create do |create|
|
581
581
|
create.action do |global_options, options, args|
|
582
|
-
if options[:
|
583
|
-
help_now!('
|
582
|
+
if options[:name].nil?
|
583
|
+
help_now!('name is required') if options[:name].nil?
|
584
584
|
else
|
585
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
585
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
586
586
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you screateplied!"
|
587
587
|
|
588
588
|
container.create
|
@@ -598,10 +598,10 @@ Destroy a container. The container is stopped and destroyed.
|
|
598
598
|
EOF
|
599
599
|
c.command :destroy do |destroy|
|
600
600
|
destroy.action do |global_options, options, args|
|
601
|
-
if options[:
|
602
|
-
help_now!('
|
601
|
+
if options[:name].nil?
|
602
|
+
help_now!('name is required') if options[:name].nil?
|
603
603
|
else
|
604
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
604
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
605
605
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
606
606
|
|
607
607
|
container.destroy
|
@@ -617,10 +617,10 @@ Setup a container. The container is created, started and provisioned.
|
|
617
617
|
EOF
|
618
618
|
c.command :setup do |setup|
|
619
619
|
setup.action do |global_options, options, args|
|
620
|
-
if options[:
|
621
|
-
help_now!('
|
620
|
+
if options[:name].nil?
|
621
|
+
help_now!('name is required') if options[:name].nil?
|
622
622
|
else
|
623
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
623
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
624
624
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
625
625
|
|
626
626
|
container.setup
|
@@ -636,10 +636,10 @@ Teardown a container. The container is offlined and destroyed.
|
|
636
636
|
EOF
|
637
637
|
c.command :teardown do |teardown|
|
638
638
|
teardown.action do |global_options, options, args|
|
639
|
-
if options[:
|
640
|
-
help_now!('
|
639
|
+
if options[:name].nil?
|
640
|
+
help_now!('name is required') if options[:name].nil?
|
641
641
|
else
|
642
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
642
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
643
643
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
644
644
|
|
645
645
|
container.teardown
|
@@ -655,10 +655,10 @@ Clone a container. The container is offlined and an ephemeral copy of it is sta
|
|
655
655
|
EOF
|
656
656
|
c.command :clone do |clone|
|
657
657
|
clone.action do |global_options, options, args|
|
658
|
-
if options[:
|
659
|
-
help_now!('
|
658
|
+
if options[:name].nil?
|
659
|
+
help_now!('name is required') if options[:name].nil?
|
660
660
|
else
|
661
|
-
container = @testlab.containers.select{ |c| c.id.to_sym == options[:
|
661
|
+
container = @testlab.containers.select{ |c| c.id.to_sym == options[:name].to_sym }.first
|
662
662
|
container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!"
|
663
663
|
|
664
664
|
container.clone
|
@@ -12,6 +12,8 @@ class TestLab
|
|
12
12
|
def create
|
13
13
|
@ui.logger.debug { "Container Create: #{self.id} " }
|
14
14
|
|
15
|
+
(self.lxc.state != :not_created) and return false
|
16
|
+
|
15
17
|
please_wait(:ui => @ui, :message => format_object_action(self, 'Create', :green)) do
|
16
18
|
self.domain ||= self.node.labfile.config[:domain]
|
17
19
|
self.arch ||= detect_arch
|
@@ -48,7 +50,7 @@ class TestLab
|
|
48
50
|
def up
|
49
51
|
@ui.logger.debug { "Container Up: #{self.id} " }
|
50
52
|
|
51
|
-
(self.lxc.state == :
|
53
|
+
(self.lxc.state == :running) and return false
|
52
54
|
|
53
55
|
please_wait(:ui => @ui, :message => format_object_action(self, 'Up', :green)) do
|
54
56
|
|
@@ -77,7 +79,7 @@ class TestLab
|
|
77
79
|
def down
|
78
80
|
@ui.logger.debug { "Container Down: #{self.id} " }
|
79
81
|
|
80
|
-
(self.lxc.state == :not_created) and return false
|
82
|
+
(self.lxc.state == :not_created) and return false
|
81
83
|
|
82
84
|
please_wait(:ui => @ui, :message => format_object_action(self, 'Down', :red)) do
|
83
85
|
self.lxc.stop
|
data/lib/testlab/version.rb
CHANGED
data/spec/container_spec.rb
CHANGED
@@ -148,6 +148,7 @@ describe TestLab::Container do
|
|
148
148
|
subject.lxc.config.stub(:save) { true }
|
149
149
|
subject.stub(:detect_arch) { "amd64" }
|
150
150
|
subject.lxc.stub(:create) { true }
|
151
|
+
subject.lxc.stub(:state) { :not_created }
|
151
152
|
subject.node.ssh.stub(:exec)
|
152
153
|
subject.create
|
153
154
|
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.
|
4
|
+
version: 0.6.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -293,7 +293,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
293
293
|
version: '0'
|
294
294
|
segments:
|
295
295
|
- 0
|
296
|
-
hash: -
|
296
|
+
hash: -1637961077093843979
|
297
297
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
298
298
|
none: false
|
299
299
|
requirements:
|
@@ -302,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
302
302
|
version: '0'
|
303
303
|
segments:
|
304
304
|
- 0
|
305
|
-
hash: -
|
305
|
+
hash: -1637961077093843979
|
306
306
|
requirements: []
|
307
307
|
rubyforge_project:
|
308
308
|
rubygems_version: 1.8.25
|