beaker 2.26.0 → 2.27.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.
- checksums.yaml +8 -8
- data/HISTORY.md +266 -2
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +3 -1
- data/lib/beaker/dsl/install_utils/foss_utils.rb +52 -0
- data/lib/beaker/dsl/patterns.rb +6 -3
- data/lib/beaker/host/unix/pkg.rb +3 -1
- data/lib/beaker/hypervisor/aws_sdk.rb +4 -0
- data/lib/beaker/hypervisor/docker.rb +79 -71
- data/lib/beaker/hypervisor/vagrant.rb +1 -1
- data/lib/beaker/hypervisor/vmpooler.rb +16 -9
- data/lib/beaker/logger.rb +39 -10
- data/lib/beaker/options/parser.rb +8 -8
- data/lib/beaker/options/presets.rb +1 -0
- data/lib/beaker/shared/host_manager.rb +12 -5
- data/lib/beaker/test_suite.rb +2 -2
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/puppet_helpers_spec.rb +9 -0
- data/spec/beaker/dsl/install_utils/foss_utils_spec.rb +57 -0
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +9 -0
- data/spec/beaker/hypervisor/docker_spec.rb +59 -15
- data/spec/beaker/hypervisor/vagrant_spec.rb +1 -1
- data/spec/beaker/hypervisor/vmpooler_spec.rb +18 -0
- data/spec/beaker/logger_spec.rb +83 -2
- data/spec/beaker/options/parser_spec.rb +1 -0
- data/spec/beaker/options/presets_spec.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
YjZlM2E1NDQzMTZiODJlYzcxZmFhZGZlZDUzOTA3NjNjMGZjY2MyZQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
NDJjYmUyODBjNGE4ZTUxMWIyODAzYjZkMjRlMDc4MjdhYWI0YjFhZg==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
NTVhZmMwYjVhNTExZjBiMWFkMTU0YzhlMGI1MzlmY2I1ZjBiMjIyNmNhZDIy
|
|
10
|
+
YzA4NDQ1NzY5MjZkOTg3ZDhjZjgyOWVmNjMwY2NiMzQ0MDU0YTJjMzdmMzQ1
|
|
11
|
+
YTczMTMzY2U2NjM4ODk2NjY4YzRmNGU5YzZmNDZhZWYwZTM1NGQ=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
MmM2Njk1MjNkNzg4YTQ2NDY4ODE4YjM4NTJlMjg1ZTk5MjljNzZlMzI0NGU0
|
|
14
|
+
OTYwZmFkNjk1MDZiMWFhN2ZlMmQ4Mjg2OGUzMDRkZGZiODkxNTM0NDU4YjU0
|
|
15
|
+
ZTE1MjNiYTEwZDhkYmQ4ODlkYjU1ZDY0YzRkNzY1YzIzYmY0NDA=
|
data/HISTORY.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# default - History
|
|
2
2
|
## Tags
|
|
3
|
-
* [LATEST -
|
|
3
|
+
* [LATEST - 21 Oct, 2015 (90fddaf4)](#LATEST)
|
|
4
|
+
* [2.26.0 - 13 Oct, 2015 (427a512b)](#2.26.0)
|
|
4
5
|
* [2.25.0 - 1 Oct, 2015 (51d4cb1a)](#2.25.0)
|
|
5
6
|
* [2.24.0 - 15 Sep, 2015 (c12e9054)](#2.24.0)
|
|
6
7
|
* [2.23.0 - 9 Sep, 2015 (2532324a)](#2.23.0)
|
|
@@ -98,7 +99,270 @@
|
|
|
98
99
|
* [pe1.2 - 6 Sep, 2011 (ba3dadd2)](#pe1.2)
|
|
99
100
|
|
|
100
101
|
## Details
|
|
101
|
-
### <a name = "LATEST">LATEST -
|
|
102
|
+
### <a name = "LATEST">LATEST - 21 Oct, 2015 (90fddaf4)
|
|
103
|
+
|
|
104
|
+
* (GEM) update beaker version to 2.27.0 (90fddaf4)
|
|
105
|
+
|
|
106
|
+
* Merge pull request #961 from GeoffWilliams/dockerfile_externalise (f4a90933)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
Merge pull request #961 from GeoffWilliams/dockerfile_externalise
|
|
111
|
+
|
|
112
|
+
(BKR-539) simplified Dockerfile support
|
|
113
|
+
```
|
|
114
|
+
* Merge pull request #987 from johnduarte/remove_puppet_patch (2cdcb71e)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
Merge pull request #987 from johnduarte/remove_puppet_patch
|
|
119
|
+
|
|
120
|
+
(BKR-573) Add publisher for solaris package removal
|
|
121
|
+
```
|
|
122
|
+
* Merge pull request #977 from colinPL/qeng2604_add_tags (e79b4b17)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
Merge pull request #977 from colinPL/qeng2604_add_tags
|
|
127
|
+
|
|
128
|
+
(QENG-2604) Add Host Tags
|
|
129
|
+
```
|
|
130
|
+
* Merge pull request #962 from pondohva/decrease_spamlog_level (a7630b05)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Merge pull request #962 from pondohva/decrease_spamlog_level
|
|
135
|
+
|
|
136
|
+
(BKR-542) remove hosts object from log about execution against empty …
|
|
137
|
+
```
|
|
138
|
+
* (QENG-2604) More vmpooler spec changes (dec9511c)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
(QENG-2604) More vmpooler spec changes
|
|
143
|
+
|
|
144
|
+
Remove some key:value checks from spec test. Override a used @option
|
|
145
|
+
value and ensure it passes through add_tags.
|
|
146
|
+
```
|
|
147
|
+
* (QENG-2604) Fix vmpooler specs (8d71a905)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
(QENG-2604) Fix vmpooler specs
|
|
152
|
+
|
|
153
|
+
Fix vmpooler spec tests for tags that were hard-coded but checking
|
|
154
|
+
against environment variables.
|
|
155
|
+
```
|
|
156
|
+
* (QENG-2604) Add More host_tag specs (f6fe7d5a)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
(QENG-2604) Add More host_tag specs
|
|
161
|
+
|
|
162
|
+
Add spec tests for aws_sdk and vmpooler hypervisors targetting
|
|
163
|
+
host_tags behavior.
|
|
164
|
+
```
|
|
165
|
+
* (QENG-2604) Break add_tags in vmpooler (93d44425)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
(QENG-2604) Break add_tags in vmpooler
|
|
170
|
+
|
|
171
|
+
Move the merging of host tags with pre-defined tags to its own method
|
|
172
|
+
to emulate how it behaves in aws_sdk.
|
|
173
|
+
```
|
|
174
|
+
* Merge pull request #988 from joshcooper/ticket/master/BKR-574-allow-no-restart (bfb6b356)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
Merge pull request #988 from joshcooper/ticket/master/BKR-574-allow-no-restart
|
|
179
|
+
|
|
180
|
+
(BKR-574) Allow global restart_when_done => false
|
|
181
|
+
```
|
|
182
|
+
* (BKR-574) Allow global restart_when_done => false (8d6742ef)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
(BKR-574) Allow global restart_when_done => false
|
|
187
|
+
|
|
188
|
+
Previously, setting `:restart_when_done` to false on the master host, or
|
|
189
|
+
globally in options, did not work, because the `with_puppet_running_on`
|
|
190
|
+
method was checking for a truthy value.
|
|
191
|
+
|
|
192
|
+
This commit checks if the key is in the hash instead. It also preserves
|
|
193
|
+
the behavior where the options passed in by the test case take
|
|
194
|
+
precedence over the host's value.
|
|
195
|
+
```
|
|
196
|
+
* (BKR-573) Add publisher for solaris package removal (e90918c9)
|
|
197
|
+
|
|
198
|
+
* Merge pull request #984 from ferventcoder/ticket/master/BKR-582 (45cca4e8)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
Merge pull request #984 from ferventcoder/ticket/master/BKR-582
|
|
203
|
+
|
|
204
|
+
(BKR-582) Colorization adjustments / CI Build / Allow overriding log colors
|
|
205
|
+
```
|
|
206
|
+
* Merge pull request #976 from johnduarte/remove_puppet_on (92a5309b)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
Merge pull request #976 from johnduarte/remove_puppet_on
|
|
211
|
+
|
|
212
|
+
(BKR-573) Add remove_puppet_on
|
|
213
|
+
```
|
|
214
|
+
* Merge pull request #982 from kevpl/bkr571_applymanifeston_docs (2a9b0a32)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Merge pull request #982 from kevpl/bkr571_applymanifeston_docs
|
|
219
|
+
|
|
220
|
+
(BKR-571) updated documentation on return types
|
|
221
|
+
```
|
|
222
|
+
* Merge pull request #972 from azhurbilo/patch-1 (26c8c8bb)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
Merge pull request #972 from azhurbilo/patch-1
|
|
227
|
+
|
|
228
|
+
(BKR-380) Fix '3389' (host port) is declared multiple times
|
|
229
|
+
```
|
|
230
|
+
* (BKR-582) Colorization adjustments / CI Build (c2dc9fd7)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
(BKR-582) Colorization adjustments / CI Build
|
|
235
|
+
|
|
236
|
+
When beaker detects it is being run by Jenkins, it should adjust output
|
|
237
|
+
colors so that they are better handled in console output. This is done
|
|
238
|
+
by detecting BUILD_NUMBER environment variable, a variable that is
|
|
239
|
+
known to be present on Jenkins build slaves.
|
|
240
|
+
|
|
241
|
+
Adjust colorization to colors that come out better during runs. The
|
|
242
|
+
colors that should come up to the front are shown better when running
|
|
243
|
+
in the console. Additionally make it easier to see logs coming back
|
|
244
|
+
from the SUT with an explicit color instead of NORMAL (which is the
|
|
245
|
+
same setting as the current GREY).
|
|
246
|
+
|
|
247
|
+
Allow overriding log colors by passing in log_colors in options.
|
|
248
|
+
If a user has overridden the default colors, don't override the
|
|
249
|
+
colors in CI.
|
|
250
|
+
```
|
|
251
|
+
* (BKR-582) Info on begin test file (239ab2d1)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
(BKR-582) Info on begin test file
|
|
256
|
+
|
|
257
|
+
When a test file is found, log it at the info level. This allows a bit
|
|
258
|
+
more trackability in finding the location of tests.
|
|
259
|
+
```
|
|
260
|
+
* (BKR-582) Warn on skipped tests (8745c061)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
(BKR-582) Warn on skipped tests
|
|
265
|
+
|
|
266
|
+
If a test is skipped, it should show up as a warning. Adjust beaker to
|
|
267
|
+
warn when tests are skipped.
|
|
268
|
+
```
|
|
269
|
+
* (BKR-571) updated documentation on return types (9d98dec1)
|
|
270
|
+
|
|
271
|
+
* (QENG-2604) Empty host_tags in Presets (df0abb97)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
(QENG-2604) Empty host_tags in Presets
|
|
276
|
+
|
|
277
|
+
The host_tags value in presets is now an empty hash and
|
|
278
|
+
department, project, and created_by are returned to the
|
|
279
|
+
root of the @options hash. This resolves an issue with
|
|
280
|
+
environment vars not being properly merged into the new
|
|
281
|
+
host_tags hash.
|
|
282
|
+
```
|
|
283
|
+
* (BKR-542) change logger level to info for "empty array of hosts" (b056ef83)
|
|
284
|
+
|
|
285
|
+
* (BKR-573) Add spec tests for remove_puppet_on (8e04650b)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
(BKR-573) Add spec tests for remove_puppet_on
|
|
290
|
+
|
|
291
|
+
This commit adds spec tests for the `remove_puppet_on` method.
|
|
292
|
+
```
|
|
293
|
+
* (QENG-2604) Add Host Tags (03fd8ca7)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
(QENG-2604) Add Host Tags
|
|
298
|
+
|
|
299
|
+
This commit adds the ability to specify arbitrary tags and have them
|
|
300
|
+
applied to AWS or vmpooler instances. The configuration parameter is
|
|
301
|
+
called "host_tags" to avoid confusion with test tagging. Host tags can
|
|
302
|
+
be specified at the host or CONFIG level.
|
|
303
|
+
|
|
304
|
+
The presets have been modified to pre-populate "host_tags" with:
|
|
305
|
+
project, department, and created_by.
|
|
306
|
+
|
|
307
|
+
Example:
|
|
308
|
+
HOSTS:
|
|
309
|
+
'agent1':
|
|
310
|
+
roles:
|
|
311
|
+
- agent
|
|
312
|
+
host_tags:
|
|
313
|
+
created_by: 'me'
|
|
314
|
+
some_key: 'yes it is'
|
|
315
|
+
CONFIG:
|
|
316
|
+
host_tags:
|
|
317
|
+
project: 'beaker'
|
|
318
|
+
```
|
|
319
|
+
* (BKR-573) Add remove_puppet_on (3c1f5daf)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
(BKR-573) Add remove_puppet_on
|
|
324
|
+
|
|
325
|
+
This commit adds a `remove_puppet_on` method that can be used to
|
|
326
|
+
ensure that puppet packages have been expunged from hosts.
|
|
327
|
+
|
|
328
|
+
This method is intended to be used in a pre-suite. It is currently
|
|
329
|
+
limited to the AIX and Solaris platforms.
|
|
330
|
+
```
|
|
331
|
+
* (BKR-380) beaker vagrant windows box support issues (c3379726)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
(BKR-380) beaker vagrant windows box support issues
|
|
336
|
+
Fix '3389' (host port) is declared multiple times
|
|
337
|
+
|
|
338
|
+
Without "auto_correct" we got error if source Vagrantfile of box already contains this port forwarding.
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
Error:
|
|
343
|
+
vm:
|
|
344
|
+
* Forwarded port '3389' (host port) is declared multiple times
|
|
345
|
+
with the protocol 'tcp'.
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
I think we need add this change as most part of Windows boxes in Vagrant Atlas already have this port forwarding:
|
|
350
|
+
- https://github.com/joefitzgerald/packer-windows/blob/master/vagrantfile-windows_2012_r2.template
|
|
351
|
+
- https://github.com/boxcutter/windows/blob/master/tpl/vagrantfile-eval-win2012r2-standard.tpl
|
|
352
|
+
|
|
353
|
+
change spec for 3389 rdp port
|
|
354
|
+
```
|
|
355
|
+
* (BKR-539) simplified Dockerfile support (63268b8f)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
(BKR-539) simplified Dockerfile support
|
|
360
|
+
|
|
361
|
+
Allow user to override the automatically generated Dockerfile
|
|
362
|
+
```
|
|
363
|
+
### <a name = "2.26.0">2.26.0 - 13 Oct, 2015 (427a512b)
|
|
364
|
+
|
|
365
|
+
* (HISTORY) update beaker history for gem release 2.26.0 (427a512b)
|
|
102
366
|
|
|
103
367
|
* (GEM) update beaker version to 2.26.0 (d581b613)
|
|
104
368
|
|
|
@@ -126,7 +126,7 @@ module Beaker
|
|
|
126
126
|
cmdline_args = conf_opts[:__commandline_args__]
|
|
127
127
|
service_args = conf_opts[:__service_args__] || {}
|
|
128
128
|
restart_when_done = true
|
|
129
|
-
restart_when_done = host[:restart_when_done] if host
|
|
129
|
+
restart_when_done = host[:restart_when_done] if host.has_key?(:restart_when_done)
|
|
130
130
|
restart_when_done = conf_opts.fetch(:restart_when_done, restart_when_done)
|
|
131
131
|
conf_opts = conf_opts.reject { |k,v| [:__commandline_args__, :__service_args__, :restart_when_done].include?(k) }
|
|
132
132
|
|
|
@@ -382,6 +382,8 @@ module Beaker
|
|
|
382
382
|
# by the caller; this can be used for additional
|
|
383
383
|
# validation, etc.
|
|
384
384
|
#
|
|
385
|
+
# @return [Array<Result>, Result] An array of results, or a result object.
|
|
386
|
+
# Check {#run_block_on} for more details on this.
|
|
385
387
|
def apply_manifest_on(host, manifest, opts = {}, &block)
|
|
386
388
|
block_on host do | host |
|
|
387
389
|
on_options = {}
|
|
@@ -1390,6 +1390,58 @@ NOASK
|
|
|
1390
1390
|
create_remote_file(host, "C:\\Windows\\Temp\\#{cert_name}.pem", cert)
|
|
1391
1391
|
on host, "certutil -v -addstore Root C:\\Windows\\Temp\\#{cert_name}.pem"
|
|
1392
1392
|
end
|
|
1393
|
+
|
|
1394
|
+
# Ensures Puppet and dependencies are no longer installed on host(s).
|
|
1395
|
+
#
|
|
1396
|
+
# @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
|
|
1397
|
+
# or a role (String or Symbol) that identifies one or more hosts.
|
|
1398
|
+
#
|
|
1399
|
+
# @return nil
|
|
1400
|
+
# @api public
|
|
1401
|
+
def remove_puppet_on( hosts )
|
|
1402
|
+
block_on hosts do |host|
|
|
1403
|
+
cmdline_args = ''
|
|
1404
|
+
# query packages
|
|
1405
|
+
case host[:platform]
|
|
1406
|
+
when /aix/
|
|
1407
|
+
pkgs = on(host, "rpm -qa | grep -E '(^pe-|puppet)'", :acceptable_exit_codes => [0,1]).stdout.chomp.split(/\n+/)
|
|
1408
|
+
pkgs.concat on(host, "rpm -q tar", :acceptable_exit_codes => [0,1]).stdout.chomp.split(/\n+/)
|
|
1409
|
+
when /solaris-10/
|
|
1410
|
+
cmdline_args = '-a noask'
|
|
1411
|
+
pkgs = on(host, "pkginfo | egrep '(^pe-|puppet)' | cut -f2 -d ' '", :acceptable_exit_codes => [0,1]).stdout.chomp.split(/\n+/)
|
|
1412
|
+
when /solaris-11/
|
|
1413
|
+
pkgs = on(host, "pkg list | egrep '(^pe-|puppet)' | awk '{print $1}'", :acceptable_exit_codes => [0,1]).stdout.chomp.split(/\n+/)
|
|
1414
|
+
else
|
|
1415
|
+
raise "remove_puppet_on() called for unsupported " +
|
|
1416
|
+
"platform '#{host['platform']}' on '#{host.name}'"
|
|
1417
|
+
end
|
|
1418
|
+
|
|
1419
|
+
# uninstall packages
|
|
1420
|
+
host.uninstall_package(pkgs.join(' '), cmdline_args) if pkgs.length > 0
|
|
1421
|
+
|
|
1422
|
+
if host[:platform] =~ /solaris-11/ then
|
|
1423
|
+
# FIXME: This leaves things in a state where Puppet Enterprise (3.x) cannot be cleanly installed
|
|
1424
|
+
# but is required to put things in a state that puppet-agent can be installed
|
|
1425
|
+
# extra magic for expunging left over publisher
|
|
1426
|
+
publishers = ['puppetlabs.com', 'com.puppetlabs']
|
|
1427
|
+
publishers.each do |publisher|
|
|
1428
|
+
if on(host, "pkg publisher #{publisher}", :acceptable_exit_codes => [0,1]).exit_code == 0 then
|
|
1429
|
+
# First, try to remove the publisher altogether
|
|
1430
|
+
if on(host, "pkg unset-publisher #{publisher}", :acceptable_exit_codes => [0,1]).exit_code == 1 then
|
|
1431
|
+
# If that doesn't work, we're in a non-global zone and the
|
|
1432
|
+
# publisher is from a global zone. As such, just remove any
|
|
1433
|
+
# references to the non-global zone uri.
|
|
1434
|
+
on(host, "pkg set-publisher -G '*' #{publisher}", :acceptable_exit_codes => [0,1])
|
|
1435
|
+
end
|
|
1436
|
+
end
|
|
1437
|
+
end
|
|
1438
|
+
end
|
|
1439
|
+
|
|
1440
|
+
# delete any residual files
|
|
1441
|
+
on(host, 'find / -name "*puppet*" -print | xargs rm -rf')
|
|
1442
|
+
|
|
1443
|
+
end
|
|
1444
|
+
end
|
|
1393
1445
|
end
|
|
1394
1446
|
end
|
|
1395
1447
|
end
|
data/lib/beaker/dsl/patterns.rb
CHANGED
|
@@ -11,13 +11,16 @@ module Beaker
|
|
|
11
11
|
#
|
|
12
12
|
module Patterns
|
|
13
13
|
|
|
14
|
-
#Execute a block selecting the hosts that match with the provided criteria
|
|
15
|
-
|
|
14
|
+
# Execute a block selecting the hosts that match with the provided criteria
|
|
15
|
+
# @param [Array<Host>, Host, String, Symbol] hosts_or_filter A host role as a String or Symbol that can be
|
|
16
16
|
# used to search for a set of Hosts, a host name
|
|
17
17
|
# as a String that can be used to search for
|
|
18
18
|
# a set of Hosts, or a {Host}
|
|
19
19
|
# or Array<{Host}> to run the block against
|
|
20
|
-
|
|
20
|
+
# @param [Block] block This method will yield to a block of code passed by the caller
|
|
21
|
+
#
|
|
22
|
+
# @return [Array<Result>, Result] An array of results, or a result object.
|
|
23
|
+
# Check {#run_block_on} for more details on this.
|
|
21
24
|
def block_on hosts_or_filter, &block
|
|
22
25
|
block_hosts = nil
|
|
23
26
|
if defined? hosts
|
data/lib/beaker/host/unix/pkg.rb
CHANGED
|
@@ -135,7 +135,9 @@ module Unix::Pkg
|
|
|
135
135
|
when /solaris-11/
|
|
136
136
|
execute("pkg #{cmdline_args} uninstall #{name}", opts)
|
|
137
137
|
when /solaris-10/
|
|
138
|
-
execute("
|
|
138
|
+
execute("pkgrm -n #{cmdline_args} #{name}", opts)
|
|
139
|
+
when /aix/
|
|
140
|
+
execute("rpm #{cmdline_args} -e #{name}", opts)
|
|
139
141
|
else
|
|
140
142
|
raise "Package #{name} cannot be installed on #{self}"
|
|
141
143
|
end
|
|
@@ -502,6 +502,10 @@ module Beaker
|
|
|
502
502
|
instance.add_tag("department", :value => @options[:department])
|
|
503
503
|
instance.add_tag("project", :value => @options[:project])
|
|
504
504
|
instance.add_tag("created_by", :value => @options[:created_by])
|
|
505
|
+
|
|
506
|
+
host[:host_tags].each do |name, val|
|
|
507
|
+
instance.add_tag(name.to_s, :value => val)
|
|
508
|
+
end
|
|
505
509
|
end
|
|
506
510
|
|
|
507
511
|
nil
|
|
@@ -168,90 +168,98 @@ module Beaker
|
|
|
168
168
|
end
|
|
169
169
|
|
|
170
170
|
def dockerfile_for(host)
|
|
171
|
+
if host['dockerfile'] then
|
|
172
|
+
@logger.debug("attempting to load user Dockerfile from #{host['dockerfile']}")
|
|
173
|
+
if File.exist?(host['dockerfile']) then
|
|
174
|
+
dockerfile = File.read(host['dockerfile'])
|
|
175
|
+
else
|
|
176
|
+
raise "requested Dockerfile #{host['dockerfile']} does not exist"
|
|
177
|
+
end
|
|
178
|
+
else
|
|
179
|
+
raise("Docker image undefined!") if (host['image']||= nil).to_s.empty?
|
|
180
|
+
|
|
181
|
+
# specify base image
|
|
182
|
+
dockerfile = <<-EOF
|
|
183
|
+
FROM #{host['image']}
|
|
184
|
+
EOF
|
|
171
185
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
# specify base image
|
|
176
|
-
dockerfile = <<-EOF
|
|
177
|
-
FROM #{host['image']}
|
|
178
|
-
EOF
|
|
179
|
-
|
|
180
|
-
# additional options to specify to the sshd
|
|
181
|
-
# may vary by platform
|
|
182
|
-
sshd_options = ''
|
|
186
|
+
# additional options to specify to the sshd
|
|
187
|
+
# may vary by platform
|
|
188
|
+
sshd_options = ''
|
|
183
189
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
dockerfile += <<-EOF
|
|
190
|
-
RUN apt-get update
|
|
191
|
-
RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::DEBIAN_PACKAGES.join(' ')}
|
|
192
|
-
EOF
|
|
193
|
-
when /cumulus/
|
|
190
|
+
# add platform-specific actions
|
|
191
|
+
service_name = "sshd"
|
|
192
|
+
case host['platform']
|
|
193
|
+
when /ubuntu/, /debian/
|
|
194
|
+
service_name = "ssh"
|
|
194
195
|
dockerfile += <<-EOF
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
196
|
+
RUN apt-get update
|
|
197
|
+
RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::DEBIAN_PACKAGES.join(' ')}
|
|
198
|
+
EOF
|
|
199
|
+
when /cumulus/
|
|
200
|
+
dockerfile += <<-EOF
|
|
201
|
+
RUN apt-get update
|
|
202
|
+
RUN apt-get install -y openssh-server openssh-client #{Beaker::HostPrebuiltSteps::CUMULUS_PACKAGES.join(' ')}
|
|
203
|
+
EOF
|
|
204
|
+
when /fedora-22/
|
|
205
|
+
dockerfile += <<-EOF
|
|
206
|
+
RUN dnf clean all
|
|
207
|
+
RUN dnf install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::UNIX_PACKAGES.join(' ')}
|
|
208
|
+
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
|
|
209
|
+
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
|
|
210
|
+
EOF
|
|
211
|
+
when /^el-/, /centos/, /fedora/, /redhat/, /eos/
|
|
212
|
+
dockerfile += <<-EOF
|
|
213
|
+
RUN yum clean all
|
|
214
|
+
RUN yum install -y sudo openssh-server openssh-clients #{Beaker::HostPrebuiltSteps::UNIX_PACKAGES.join(' ')}
|
|
215
|
+
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
|
|
216
|
+
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
|
|
217
|
+
EOF
|
|
218
|
+
when /opensuse/, /sles/
|
|
219
|
+
dockerfile += <<-EOF
|
|
220
|
+
RUN zypper -n in openssh #{Beaker::HostPrebuiltSteps::SLES_PACKAGES.join(' ')}
|
|
221
|
+
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
|
|
222
|
+
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
|
|
223
|
+
RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
|
|
224
|
+
EOF
|
|
225
|
+
else
|
|
226
|
+
# TODO add more platform steps here
|
|
227
|
+
raise "platform #{host['platform']} not yet supported on docker"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Make sshd directory, set root password
|
|
206
231
|
dockerfile += <<-EOF
|
|
207
|
-
RUN
|
|
208
|
-
RUN
|
|
209
|
-
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
|
|
210
|
-
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
|
|
232
|
+
RUN mkdir -p /var/run/sshd
|
|
233
|
+
RUN echo root:#{root_password} | chpasswd
|
|
211
234
|
EOF
|
|
212
|
-
|
|
235
|
+
|
|
236
|
+
# Configure sshd service to allowroot login using password
|
|
213
237
|
dockerfile += <<-EOF
|
|
214
|
-
RUN
|
|
215
|
-
RUN
|
|
216
|
-
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
|
|
217
|
-
RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
|
|
238
|
+
RUN sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
|
|
239
|
+
RUN sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
|
|
218
240
|
EOF
|
|
219
|
-
else
|
|
220
|
-
# TODO add more platform steps here
|
|
221
|
-
raise "platform #{host['platform']} not yet supported on docker"
|
|
222
|
-
end
|
|
223
241
|
|
|
224
|
-
# Make sshd directory, set root password
|
|
225
|
-
dockerfile += <<-EOF
|
|
226
|
-
RUN mkdir -p /var/run/sshd
|
|
227
|
-
RUN echo root:#{root_password} | chpasswd
|
|
228
|
-
EOF
|
|
229
242
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
EOF
|
|
243
|
+
# Any extra commands specified for the host
|
|
244
|
+
dockerfile += (host['docker_image_commands'] || []).map { |command|
|
|
245
|
+
"RUN #{command}\n"
|
|
246
|
+
}.join('')
|
|
235
247
|
|
|
248
|
+
# Override image entrypoint
|
|
249
|
+
if host['docker_image_entrypoint']
|
|
250
|
+
dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n"
|
|
251
|
+
end
|
|
236
252
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
"
|
|
240
|
-
|
|
253
|
+
# How to start a sshd on port 22. May be an init for more supervision
|
|
254
|
+
# Ensure that the ssh server can be restarted (done from set_env) and container keeps running
|
|
255
|
+
cmd = host['docker_cmd'] || ["sh","-c","service #{service_name} start ; tail -f /dev/null"]
|
|
256
|
+
dockerfile += <<-EOF
|
|
257
|
+
EXPOSE 22
|
|
258
|
+
CMD #{cmd}
|
|
259
|
+
EOF
|
|
241
260
|
|
|
242
|
-
# Override image entrypoint
|
|
243
|
-
if host['docker_image_entrypoint']
|
|
244
|
-
dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n"
|
|
245
261
|
end
|
|
246
|
-
|
|
247
|
-
# How to start a sshd on port 22. May be an init for more supervision
|
|
248
|
-
# Ensure that the ssh server can be restarted (done from set_env) and container keeps running
|
|
249
|
-
cmd = host['docker_cmd'] || ["sh","-c","service #{service_name} start ; tail -f /dev/null"]
|
|
250
|
-
dockerfile += <<-EOF
|
|
251
|
-
EXPOSE 22
|
|
252
|
-
CMD #{cmd}
|
|
253
|
-
EOF
|
|
254
|
-
|
|
262
|
+
|
|
255
263
|
@logger.debug("Dockerfile is #{dockerfile}")
|
|
256
264
|
return dockerfile
|
|
257
265
|
end
|
|
@@ -36,7 +36,7 @@ module Beaker
|
|
|
36
36
|
v_file << " v.vm.network :private_network, ip: \"#{host['ip'].to_s}\", :netmask => \"#{host['netmask'] ||= "255.255.0.0"}\", :mac => \"#{randmac}\"\n"
|
|
37
37
|
|
|
38
38
|
if /windows/i.match(host['platform'])
|
|
39
|
-
v_file << " v.vm.network :forwarded_port, guest: 3389, host: 3389\n"
|
|
39
|
+
v_file << " v.vm.network :forwarded_port, guest: 3389, host: 3389, id: 'rdp', auto_correct: true\n"
|
|
40
40
|
v_file << " v.vm.network :forwarded_port, guest: 5985, host: 5985, id: 'winrm', auto_correct: true\n"
|
|
41
41
|
v_file << " v.vm.guest = :windows\n"
|
|
42
42
|
end
|
|
@@ -73,6 +73,20 @@ module Beaker
|
|
|
73
73
|
template_url
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
+
# Override host tags with presets
|
|
77
|
+
# @param [Beaker::Host] host Beaker host
|
|
78
|
+
# @return [Hash] Tag hash
|
|
79
|
+
def add_tags(host)
|
|
80
|
+
host[:host_tags].merge(
|
|
81
|
+
{
|
|
82
|
+
'beaker_version' => Beaker::Version::STRING,
|
|
83
|
+
'jenkins_build_url' => @options[:jenkins_build_url],
|
|
84
|
+
'department' => @options[:department],
|
|
85
|
+
'project' => @options[:project],
|
|
86
|
+
'created_by' => @options[:created_by]
|
|
87
|
+
})
|
|
88
|
+
end
|
|
89
|
+
|
|
76
90
|
def provision
|
|
77
91
|
request_payload = {}
|
|
78
92
|
start = Time.now
|
|
@@ -143,14 +157,6 @@ module Beaker
|
|
|
143
157
|
start = Time.now
|
|
144
158
|
@logger.notify 'Tagging vmpooler VMs'
|
|
145
159
|
|
|
146
|
-
tags = {
|
|
147
|
-
'beaker_version' => Beaker::Version::STRING,
|
|
148
|
-
'jenkins_build_url' => @options[:jenkins_build_url],
|
|
149
|
-
'department' => @options[:department],
|
|
150
|
-
'project' => @options[:project],
|
|
151
|
-
'created_by' => @options[:created_by]
|
|
152
|
-
}
|
|
153
|
-
|
|
154
160
|
@hosts.each_with_index do |h, i|
|
|
155
161
|
begin
|
|
156
162
|
uri = URI.parse(@options[:pooling_api] + '/vm/' + h['vmhostname'].split('.')[0])
|
|
@@ -158,7 +164,8 @@ module Beaker
|
|
|
158
164
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
159
165
|
request = Net::HTTP::Put.new(uri.request_uri)
|
|
160
166
|
|
|
161
|
-
|
|
167
|
+
# merge pre-defined tags with host tags
|
|
168
|
+
request.body = { 'tags' => add_tags(h) }.to_json
|
|
162
169
|
|
|
163
170
|
response = http.request(request)
|
|
164
171
|
rescue RuntimeError, Errno::EINVAL, Errno::ECONNRESET, EOFError,
|
data/lib/beaker/logger.rb
CHANGED
|
@@ -41,7 +41,7 @@ module Beaker
|
|
|
41
41
|
:warn => 0,
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
attr_accessor :color, :log_level, :destinations
|
|
44
|
+
attr_accessor :color, :log_level, :destinations, :log_colors
|
|
45
45
|
|
|
46
46
|
# Initialization of the Logger class
|
|
47
47
|
# @overload initialize(dests)
|
|
@@ -83,6 +83,35 @@ module Beaker
|
|
|
83
83
|
|
|
84
84
|
@destinations = []
|
|
85
85
|
|
|
86
|
+
@log_colors = {
|
|
87
|
+
:error => RED,
|
|
88
|
+
:warn => BRIGHT_RED,
|
|
89
|
+
:success => MAGENTA,
|
|
90
|
+
:notify => BLUE,
|
|
91
|
+
:info => GREEN,
|
|
92
|
+
:debug => WHITE,
|
|
93
|
+
:trace => BRIGHT_YELLOW,
|
|
94
|
+
:perf => BRIGHT_MAGENTA,
|
|
95
|
+
:host => YELLOW
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@log_colors.merge!(options[:log_colors]) if options[:log_colors]
|
|
99
|
+
|
|
100
|
+
# if a user overrides any of the log_colors, we will no longer
|
|
101
|
+
# override the colors at all on a CI build. This is b/c it is
|
|
102
|
+
# assumed that if a user is overriding the colors, they know
|
|
103
|
+
# what they are doing. We could potentially add an additional
|
|
104
|
+
# option a user can pass to be explicit about still allowing
|
|
105
|
+
# the override.
|
|
106
|
+
unless options[:log_colors]
|
|
107
|
+
# Jenkins exposed variable - should be present on the slave directing
|
|
108
|
+
# the beaker run
|
|
109
|
+
ci_build = ENV['BUILD_NUMBER'] != nil
|
|
110
|
+
|
|
111
|
+
@log_colors[:notify] = NORMAL if ci_build
|
|
112
|
+
@log_colors[:info] = NORMAL if ci_build
|
|
113
|
+
end
|
|
114
|
+
|
|
86
115
|
dests = args
|
|
87
116
|
dests << STDOUT unless options[:quiet]
|
|
88
117
|
dests.uniq!
|
|
@@ -230,7 +259,7 @@ module Beaker
|
|
|
230
259
|
return unless is_verbose?
|
|
231
260
|
strings = strip_colors_from args
|
|
232
261
|
string = strings.join
|
|
233
|
-
optionally_color
|
|
262
|
+
optionally_color @log_colors[:host], string, false
|
|
234
263
|
end
|
|
235
264
|
|
|
236
265
|
# Custom reporting for messages generated by host SUTs - to preserve output
|
|
@@ -248,7 +277,7 @@ module Beaker
|
|
|
248
277
|
# @param args[Array<String>] Strings to be reported
|
|
249
278
|
def perf_output *args
|
|
250
279
|
return unless is_debug?
|
|
251
|
-
optionally_color
|
|
280
|
+
optionally_color @log_colors[:perf], *args
|
|
252
281
|
end
|
|
253
282
|
|
|
254
283
|
# Report a trace message.
|
|
@@ -256,7 +285,7 @@ module Beaker
|
|
|
256
285
|
# @param args[Array<String>] Strings to be reported
|
|
257
286
|
def trace *args
|
|
258
287
|
return unless is_trace?
|
|
259
|
-
optionally_color
|
|
288
|
+
optionally_color @log_colors[:trace], *args
|
|
260
289
|
end
|
|
261
290
|
|
|
262
291
|
# Report a debug message.
|
|
@@ -264,7 +293,7 @@ module Beaker
|
|
|
264
293
|
# @param args[Array<String>] Strings to be reported
|
|
265
294
|
def debug *args
|
|
266
295
|
return unless is_verbose?
|
|
267
|
-
optionally_color
|
|
296
|
+
optionally_color @log_colors[:debug], *args
|
|
268
297
|
end
|
|
269
298
|
|
|
270
299
|
# Report a warning message.
|
|
@@ -274,7 +303,7 @@ module Beaker
|
|
|
274
303
|
def warn *args
|
|
275
304
|
return unless is_warn?
|
|
276
305
|
strings = args.map {|msg| "Warning: #{msg}" }
|
|
277
|
-
optionally_color
|
|
306
|
+
optionally_color @log_colors[:warn], strings
|
|
278
307
|
end
|
|
279
308
|
|
|
280
309
|
# Report an info message.
|
|
@@ -282,14 +311,14 @@ module Beaker
|
|
|
282
311
|
# @param args[Array<String>] Strings to be reported
|
|
283
312
|
def info *args
|
|
284
313
|
return unless is_info?
|
|
285
|
-
optionally_color
|
|
314
|
+
optionally_color @log_colors[:info], *args
|
|
286
315
|
end
|
|
287
316
|
|
|
288
317
|
# Report a success message.
|
|
289
318
|
# Will always be reported.
|
|
290
319
|
# @param args[Array<String>] Strings to be reported
|
|
291
320
|
def success *args
|
|
292
|
-
optionally_color
|
|
321
|
+
optionally_color @log_colors[:success], *args
|
|
293
322
|
end
|
|
294
323
|
|
|
295
324
|
# Report a notify message.
|
|
@@ -297,14 +326,14 @@ module Beaker
|
|
|
297
326
|
# @param args[Array<String>] Strings to be reported
|
|
298
327
|
def notify *args
|
|
299
328
|
return unless is_notify?
|
|
300
|
-
optionally_color
|
|
329
|
+
optionally_color @log_colors[:notify], *args
|
|
301
330
|
end
|
|
302
331
|
|
|
303
332
|
# Report an error message.
|
|
304
333
|
# Will always be reported.
|
|
305
334
|
# @param args[Array<String>] Strings to be reported
|
|
306
335
|
def error *args
|
|
307
|
-
optionally_color
|
|
336
|
+
optionally_color @log_colors[:error], *args
|
|
308
337
|
end
|
|
309
338
|
|
|
310
339
|
# Strip any color codes from provided string(s)
|
|
@@ -325,6 +325,14 @@ module Beaker
|
|
|
325
325
|
if host[:platform] =~ /windows|el-4/
|
|
326
326
|
test_host_roles(name, host)
|
|
327
327
|
end
|
|
328
|
+
|
|
329
|
+
#check to see if a custom user account has been provided, if so use it
|
|
330
|
+
if host[:ssh] && host[:ssh][:user]
|
|
331
|
+
host[:user] = host[:ssh][:user]
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
# merge host tags for this host with the global/preset host tags
|
|
335
|
+
host[:host_tags] = @options[:host_tags].merge(host[:host_tags] || {})
|
|
328
336
|
end
|
|
329
337
|
|
|
330
338
|
normalize_and_validate_tags()
|
|
@@ -333,14 +341,6 @@ module Beaker
|
|
|
333
341
|
#set the default role
|
|
334
342
|
set_default_host!(@options[:HOSTS])
|
|
335
343
|
|
|
336
|
-
#check to see if a custom user account has been provided, if so use it
|
|
337
|
-
@options[:HOSTS].each_key do |name|
|
|
338
|
-
host = @options[:HOSTS][name]
|
|
339
|
-
if host[:ssh] && host[:ssh][:user]
|
|
340
|
-
host[:user] = host[:ssh][:user]
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
|
|
344
344
|
end
|
|
345
345
|
|
|
346
346
|
# Takes tag arguments given at this point, which are strings, converts
|
|
@@ -121,6 +121,7 @@ module Beaker
|
|
|
121
121
|
:project => 'Beaker',
|
|
122
122
|
:department => 'unknown',
|
|
123
123
|
:created_by => ENV['USER'] || ENV['USERNAME'] || 'unknown',
|
|
124
|
+
:host_tags => {},
|
|
124
125
|
:openstack_api_key => ENV['OS_PASSWORD'],
|
|
125
126
|
:openstack_username => ENV['OS_USERNAME'],
|
|
126
127
|
:openstack_auth_url => "#{ENV['OS_AUTH_URL']}/tokens",
|
|
@@ -68,10 +68,17 @@ module Beaker
|
|
|
68
68
|
host_with_role
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
#Execute a block selecting the hosts that match with the provided criteria
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
# Execute a block selecting the hosts that match with the provided criteria
|
|
72
|
+
#
|
|
73
|
+
# @param [Array<Host>, Host] hosts The host or hosts to run the provided block against
|
|
74
|
+
# @param [String, Symbol] filter Optional filter to apply to provided hosts - limits by name or role
|
|
75
|
+
# @param [Block] block This method will yield to a block of code passed by the caller
|
|
76
|
+
#
|
|
77
|
+
# @todo beaker3.0: simplify return types to Array<Result> only
|
|
78
|
+
#
|
|
79
|
+
# @return [Array<Result>, Result] If a non-empty array of hosts has been
|
|
80
|
+
# passed (after filtering), then an array of results is returned. Else,
|
|
81
|
+
# a result object is returned.
|
|
75
82
|
def run_block_on hosts = [], filter = nil, &block
|
|
76
83
|
result = nil
|
|
77
84
|
block_hosts = hosts #the hosts to apply the block to after any filtering
|
|
@@ -98,7 +105,7 @@ module Beaker
|
|
|
98
105
|
# should warn here
|
|
99
106
|
# check if logger is defined in this context
|
|
100
107
|
if ( cur_logger = (logger || @logger ) )
|
|
101
|
-
cur_logger.
|
|
108
|
+
cur_logger.info "Attempting to execute against an empty array of hosts (#{hosts}, filtered to #{block_hosts}), no execution will occur"
|
|
102
109
|
end
|
|
103
110
|
end
|
|
104
111
|
else
|
data/lib/beaker/test_suite.rb
CHANGED
|
@@ -306,7 +306,7 @@ module Beaker
|
|
|
306
306
|
@test_suite_results.total_tests = @test_files.length
|
|
307
307
|
|
|
308
308
|
@test_files.each do |test_file|
|
|
309
|
-
@logger.
|
|
309
|
+
@logger.info "Begin #{test_file}"
|
|
310
310
|
start = Time.now
|
|
311
311
|
test_case = TestCase.new(@hosts, @logger, options, test_file).run_test
|
|
312
312
|
duration = Time.now - start
|
|
@@ -319,7 +319,7 @@ module Beaker
|
|
|
319
319
|
when :pass
|
|
320
320
|
@logger.success msg
|
|
321
321
|
when :skip
|
|
322
|
-
@logger.
|
|
322
|
+
@logger.warn msg
|
|
323
323
|
when :fail
|
|
324
324
|
@logger.error msg
|
|
325
325
|
break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure
|
data/lib/beaker/version.rb
CHANGED
|
@@ -607,6 +607,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
607
607
|
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=stopped/).exactly(2).times
|
|
608
608
|
end
|
|
609
609
|
|
|
610
|
+
it 'can be set globally in options' do
|
|
611
|
+
host[:restart_when_done] = false
|
|
612
|
+
|
|
613
|
+
subject.with_puppet_running_on(host, {})
|
|
614
|
+
|
|
615
|
+
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=running/).once
|
|
616
|
+
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=stopped/).exactly(2).times
|
|
617
|
+
end
|
|
618
|
+
|
|
610
619
|
it 'yields to a block after bouncing service' do
|
|
611
620
|
execution = 0
|
|
612
621
|
allow( subject ).to receive(:curl_with_retries)
|
|
@@ -1180,4 +1180,61 @@ describe ClassMixedWithDSLInstallUtils do
|
|
|
1180
1180
|
end
|
|
1181
1181
|
|
|
1182
1182
|
end
|
|
1183
|
+
|
|
1184
|
+
describe '#remove_puppet_on' do
|
|
1185
|
+
let(:aixhost) { make_host('aix', :platform => 'aix-53-power') }
|
|
1186
|
+
let(:sol10host) { make_host('sol10', :platform => 'solaris-10-x86_64') }
|
|
1187
|
+
let(:sol11host) { make_host('sol11', :platform => 'solaris-11-x86_64') }
|
|
1188
|
+
let(:el6host) { make_host('el6', :platform => 'el-6-x64') }
|
|
1189
|
+
|
|
1190
|
+
pkg_list = 'foo bar'
|
|
1191
|
+
|
|
1192
|
+
it 'uninstalls packages on aix, including tar' do
|
|
1193
|
+
aix_depend_list = 'tar'
|
|
1194
|
+
result = Beaker::Result.new(aixhost,'')
|
|
1195
|
+
result.stdout = pkg_list
|
|
1196
|
+
result2 = Beaker::Result.new(aixhost,'')
|
|
1197
|
+
result2.stdout = aix_depend_list
|
|
1198
|
+
|
|
1199
|
+
expected_list = pkg_list + " " + aix_depend_list
|
|
1200
|
+
cmd_args = ''
|
|
1201
|
+
|
|
1202
|
+
expect( subject ).to receive(:on).exactly(3).times.and_return(result, result2, result)
|
|
1203
|
+
expect( aixhost ).to receive(:uninstall_package).with(expected_list, cmd_args)
|
|
1204
|
+
|
|
1205
|
+
subject.remove_puppet_on( aixhost )
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
it 'uninstalls packages on solaris 10' do
|
|
1209
|
+
result = Beaker::Result.new(sol10host,'')
|
|
1210
|
+
result.stdout = pkg_list
|
|
1211
|
+
|
|
1212
|
+
expected_list = pkg_list
|
|
1213
|
+
cmd_args = '-a noask'
|
|
1214
|
+
|
|
1215
|
+
expect( subject ).to receive(:on).exactly(2).times.and_return(result, result)
|
|
1216
|
+
expect( sol10host ).to receive(:uninstall_package).with(expected_list, cmd_args)
|
|
1217
|
+
|
|
1218
|
+
subject.remove_puppet_on( sol10host )
|
|
1219
|
+
end
|
|
1220
|
+
|
|
1221
|
+
it 'uninstalls packages on solaris 11' do
|
|
1222
|
+
result = Beaker::Result.new(sol11host,'')
|
|
1223
|
+
result.stdout='foo bar'
|
|
1224
|
+
|
|
1225
|
+
expected_list = pkg_list
|
|
1226
|
+
cmd_args = ''
|
|
1227
|
+
|
|
1228
|
+
expect( subject ).to receive(:on).exactly(4).times.and_return(result, result, result)
|
|
1229
|
+
expect( sol11host ).to receive(:uninstall_package).with(expected_list, cmd_args)
|
|
1230
|
+
|
|
1231
|
+
subject.remove_puppet_on( sol11host )
|
|
1232
|
+
end
|
|
1233
|
+
|
|
1234
|
+
it 'raises error on other platforms' do
|
|
1235
|
+
expect { subject.remove_puppet_on( el6host ) }.to raise_error(RuntimeError, /unsupported platform/)
|
|
1236
|
+
end
|
|
1237
|
+
|
|
1238
|
+
end
|
|
1239
|
+
|
|
1183
1240
|
end
|
|
@@ -388,6 +388,15 @@ module Beaker
|
|
|
388
388
|
@hosts.each {|host| host['instance'] = aws_instance}
|
|
389
389
|
end
|
|
390
390
|
|
|
391
|
+
it 'handles host_tags hash on host object' do
|
|
392
|
+
# set :host_tags on first host
|
|
393
|
+
aws.instance_eval {
|
|
394
|
+
@hosts[0][:host_tags] = {'test_tag' => 'test_value'}
|
|
395
|
+
}
|
|
396
|
+
expect(aws_instance).to receive(:add_tag).with('test_tag', hash_including(:value => 'test_value')).at_least(:once)
|
|
397
|
+
expect(add_tags).to be_nil
|
|
398
|
+
end
|
|
399
|
+
|
|
391
400
|
it 'adds tag for jenkins_build_url' do
|
|
392
401
|
aws.instance_eval('@options[:jenkins_build_url] = "my_build_url"')
|
|
393
402
|
expect(aws_instance).to receive(:add_tag).with('jenkins_build_url', hash_including(:value => 'my_build_url')).at_least(:once)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'fakefs/spec_helpers'
|
|
2
3
|
|
|
3
4
|
# fake the docker-api
|
|
4
5
|
module Docker
|
|
@@ -9,6 +10,14 @@ module Docker
|
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
module Beaker
|
|
13
|
+
platforms = [
|
|
14
|
+
"ubuntu-14.04-x86_64",
|
|
15
|
+
"cumulus-2.2-x86_64",
|
|
16
|
+
"fedora-22-x86_64",
|
|
17
|
+
"centos-7-x86_64",
|
|
18
|
+
"sles-12-x86_64"
|
|
19
|
+
]
|
|
20
|
+
|
|
12
21
|
describe Docker do
|
|
13
22
|
let(:hosts) { make_hosts }
|
|
14
23
|
|
|
@@ -298,42 +307,77 @@ module Beaker
|
|
|
298
307
|
end
|
|
299
308
|
|
|
300
309
|
describe '#dockerfile_for' do
|
|
310
|
+
FakeFS.deactivate!
|
|
301
311
|
before :each do
|
|
302
312
|
allow( ::Docker ).to receive(:validate_version!)
|
|
303
313
|
end
|
|
304
314
|
it 'should raise on an unsupported platform' do
|
|
305
|
-
expect { docker.send(:dockerfile_for, {'platform' => 'a_sidewalk' }) }.to raise_error(/platform a_sidewalk not yet supported
|
|
315
|
+
expect { docker.send(:dockerfile_for, {'platform' => 'a_sidewalk', 'image' => 'foobar' }) }.to raise_error(/platform a_sidewalk not yet supported/)
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
it 'should raise on missing image' do
|
|
319
|
+
expect { docker.send(:dockerfile_for, {'platform' => 'centos-7-x86_64'})}.to raise_error(/Docker image undefined/)
|
|
306
320
|
end
|
|
307
321
|
|
|
308
322
|
it 'should add docker_image_commands as RUN statements' do
|
|
323
|
+
FakeFS.deactivate!
|
|
324
|
+
platforms.each do |platform|
|
|
325
|
+
dockerfile = docker.send(:dockerfile_for, {
|
|
326
|
+
'platform' => platform,
|
|
327
|
+
'image' => 'foobar',
|
|
328
|
+
'docker_image_commands' => [
|
|
329
|
+
'special one',
|
|
330
|
+
'special two',
|
|
331
|
+
'special three',
|
|
332
|
+
]
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
expect( dockerfile ).to be =~ /RUN special one\nRUN special two\nRUN special three/
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it 'should add docker_image_entrypoint' do
|
|
340
|
+
FakeFS.deactivate!
|
|
341
|
+
platforms.each do |platform|
|
|
342
|
+
dockerfile = docker.send(:dockerfile_for, {
|
|
343
|
+
'platform' => platform,
|
|
344
|
+
'image' => 'foobar',
|
|
345
|
+
'docker_image_entrypoint' => '/bin/bash'
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
expect( dockerfile ).to be =~ %r{ENTRYPOINT /bin/bash}
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
it 'should use zypper on sles' do
|
|
353
|
+
FakeFS.deactivate!
|
|
309
354
|
dockerfile = docker.send(:dockerfile_for, {
|
|
310
|
-
'platform' => '
|
|
311
|
-
'
|
|
312
|
-
'special one',
|
|
313
|
-
'special two',
|
|
314
|
-
'special three',
|
|
315
|
-
]
|
|
355
|
+
'platform' => 'sles-12-x86_64',
|
|
356
|
+
'image' => 'foobar',
|
|
316
357
|
})
|
|
317
358
|
|
|
318
|
-
expect( dockerfile ).to be =~ /RUN
|
|
359
|
+
expect( dockerfile ).to be =~ /RUN zypper -n in openssh/
|
|
319
360
|
end
|
|
320
361
|
|
|
321
|
-
it 'should
|
|
362
|
+
it 'should use dnf on fedora-22' do
|
|
363
|
+
FakeFS.deactivate!
|
|
322
364
|
dockerfile = docker.send(:dockerfile_for, {
|
|
323
|
-
'platform' => '
|
|
324
|
-
'
|
|
365
|
+
'platform' => 'fedora-22-x86_64',
|
|
366
|
+
'image' => 'foobar',
|
|
325
367
|
})
|
|
326
368
|
|
|
327
|
-
expect( dockerfile ).to be =~
|
|
369
|
+
expect( dockerfile ).to be =~ /RUN dnf install -y sudo/
|
|
328
370
|
end
|
|
329
371
|
|
|
330
|
-
it 'should use
|
|
372
|
+
it 'should use user dockerfile if specified' do
|
|
373
|
+
FakeFS.deactivate!
|
|
331
374
|
dockerfile = docker.send(:dockerfile_for, {
|
|
332
|
-
'
|
|
375
|
+
'dockerfile' => 'README.md'
|
|
333
376
|
})
|
|
334
377
|
|
|
335
|
-
expect( dockerfile ).to be
|
|
378
|
+
expect( dockerfile ).to be == File.read('README.md')
|
|
336
379
|
end
|
|
380
|
+
|
|
337
381
|
end
|
|
338
382
|
end
|
|
339
383
|
end
|
|
@@ -100,7 +100,7 @@ EOF
|
|
|
100
100
|
|
|
101
101
|
generated_file = File.read( File.expand_path( File.join( path, "Vagrantfile") ) )
|
|
102
102
|
|
|
103
|
-
match = generated_file.match(/v.vm.network :forwarded_port, guest: 3389, host: 3389/)
|
|
103
|
+
match = generated_file.match(/v.vm.network :forwarded_port, guest: 3389, host: 3389, id: 'rdp', auto_correct: true/)
|
|
104
104
|
expect( match ).to_not be_nil,'Should have proper port for RDP'
|
|
105
105
|
|
|
106
106
|
match = generated_file.match(/v.vm.network :forwarded_port, guest: 5985, host: 5985, id: 'winrm', auto_correct: true/)
|
|
@@ -42,6 +42,24 @@ module Beaker
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
+
describe '#add_tags' do
|
|
46
|
+
let(:vmpooler) { Beaker::Vmpooler.new(make_hosts({:host_tags => {'test_tag' => 'test_value'}}), make_opts) }
|
|
47
|
+
|
|
48
|
+
it 'merges tags correctly' do
|
|
49
|
+
vmpooler.instance_eval {
|
|
50
|
+
@options = @options.merge({:project => 'vmpooler-spec'})
|
|
51
|
+
}
|
|
52
|
+
host = vmpooler.instance_variable_get(:@hosts)[0]
|
|
53
|
+
merged_tags = vmpooler.add_tags(host)
|
|
54
|
+
expected_hash = {
|
|
55
|
+
test_tag: 'test_value',
|
|
56
|
+
beaker_version: Beaker::Version::STRING,
|
|
57
|
+
project: 'vmpooler-spec'
|
|
58
|
+
}
|
|
59
|
+
expect(merged_tags).to include(expected_hash)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
45
63
|
describe "#provision" do
|
|
46
64
|
|
|
47
65
|
it 'provisions hosts from the pool' do
|
data/spec/beaker/logger_spec.rb
CHANGED
|
@@ -121,14 +121,95 @@ module Beaker
|
|
|
121
121
|
expect( stdout_logger.destinations.size ).to be === 1
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
-
|
|
125
124
|
context 'default for' do
|
|
126
125
|
its(:destinations) { should include(STDOUT) }
|
|
127
126
|
its(:color) { should be_nil }
|
|
128
127
|
its(:log_level) { should be :verbose }
|
|
129
128
|
end
|
|
130
|
-
end
|
|
131
129
|
|
|
130
|
+
context 'log_colors' do
|
|
131
|
+
original_build_number = ENV['BUILD_NUMBER']
|
|
132
|
+
|
|
133
|
+
before :each do
|
|
134
|
+
ENV['BUILD_NUMBER'] = nil
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
after :each do
|
|
138
|
+
ENV['BUILD_NUMER'] = original_build_number
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
it 'should have the default log_colors' do
|
|
143
|
+
expect(logger.log_colors).to be == {
|
|
144
|
+
:error=> Beaker::Logger::RED,
|
|
145
|
+
:warn=> Beaker::Logger::BRIGHT_RED,
|
|
146
|
+
:success=> Beaker::Logger::MAGENTA,
|
|
147
|
+
:notify=> Beaker::Logger::BLUE,
|
|
148
|
+
:info=> Beaker::Logger::GREEN,
|
|
149
|
+
:debug=> Beaker::Logger::WHITE,
|
|
150
|
+
:trace=> Beaker::Logger::BRIGHT_YELLOW,
|
|
151
|
+
:perf=> Beaker::Logger::BRIGHT_MAGENTA,
|
|
152
|
+
:host=> Beaker::Logger::YELLOW
|
|
153
|
+
}
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context 'when passing in log_color options' do
|
|
157
|
+
let(:log_colors) {
|
|
158
|
+
{
|
|
159
|
+
:error => "\e[00;30m"
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
let(:logger) { Logger.new(my_io, :quiet => true, :log_colors => log_colors) }
|
|
164
|
+
|
|
165
|
+
it 'should override the specified log colors' do
|
|
166
|
+
expect(logger.log_colors[:error]).to be == Beaker::Logger::BLACK
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it 'should leave other colors as the default' do
|
|
170
|
+
expect(logger.log_colors[:warn]).to be == Beaker::Logger::BRIGHT_RED
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context 'with CI detected' do
|
|
175
|
+
before :each do
|
|
176
|
+
ENV['BUILD_NUMBER'] = 'bob'
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context 'when using the default log colors' do
|
|
180
|
+
it 'should override notify with NORMAL' do
|
|
181
|
+
expect(logger.log_colors[:notify]).to be == Beaker::Logger::NORMAL
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it 'should override info with NORMAL' do
|
|
185
|
+
expect(logger.log_colors[:info]).to be == Beaker::Logger::NORMAL
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
context 'when overriding default log colors' do
|
|
190
|
+
let(:log_colors) {
|
|
191
|
+
{
|
|
192
|
+
:error => "\e[00;30m"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
let(:logger) { Logger.new(my_io, :quiet => true, :log_colors => log_colors) }
|
|
197
|
+
|
|
198
|
+
it 'should override the specified log colors' do
|
|
199
|
+
expect(logger.log_colors[:error]).to be == Beaker::Logger::BLACK
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it 'should not override notify with NORMAL' do
|
|
203
|
+
expect(logger.log_colors[:notify]).not_to be == Beaker::Logger::NORMAL
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it 'should not override info with NORMAL' do
|
|
207
|
+
expect(logger.log_colors[:notify]).not_to be == Beaker::Logger::NORMAL
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
132
213
|
|
|
133
214
|
context 'it can' do
|
|
134
215
|
it 'open/create a file when a string is given to add_destination' do
|
|
@@ -27,6 +27,11 @@ module Beaker
|
|
|
27
27
|
expect(presets.presets).to be_instance_of(Beaker::Options::OptionsHash)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
it 'has empty host_tags' do
|
|
31
|
+
expect(presets.presets.has_key?(:host_tags)).to be_truthy
|
|
32
|
+
expect(presets.presets[:host_tags]).to eq({})
|
|
33
|
+
end
|
|
34
|
+
|
|
30
35
|
end
|
|
31
36
|
end
|
|
32
37
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: beaker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.27.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Puppetlabs
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-10-
|
|
11
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|