1BEAKERLIB(1) User Contributed Perl Documentation BEAKERLIB(1)
2
3
4
6 BeakerLib - a shell-level integration testing library
7
9 BeakerLib is a shell-level integration testing library, providing
10 convenience functions which simplify writing, running and analysis of
11 integration and blackbox tests.
12
13 The essential features include:
14
15 • Journal - uniform logging mechanism (logs & results saved in
16 flexible XML format, easy to compare results & generate reports)
17
18 • Phases - logical grouping of test actions, clear separation of
19 setup / test / cleanup (preventing false fails)
20
21 • Asserts - common checks affecting the overall results of the
22 individual phases (checking for exit codes, file existence &
23 content...)
24
25 • Helpers - convenience functions for common operations such as
26 managing services, backup & restore
27
28 The main script sets the "BEAKERLIB" variable and sources other scripts
29 where the actual functions are defined. You should source it at the
30 beginning of your test with:
31
32 . /usr/share/beakerlib/beakerlib.sh
33
34 See the EXAMPLES section for quick start inspiration.
35
36 See the BKRDOC section for more information about Automated
37 documentation generator for BeakerLib tests.
38
39 Result fingerprint
40 Beakerlib provides two types of fingerprint of the test run. The
41 fingerprints are counted at the phase end and journal end.
42
43 The first one is a phases fingerprint which represents a list of the
44 results of all the executed phases in the order of the execution.
45
46 The second one is a asserts fingerprint which represents a list of the
47 results of all the executed asserts in the order of the execution.
48
49 The lists are then hashed resulting in a 8 letters string.
50
51 Such fingerprint may be used as a reference result of the respective
52 test run in a particular environment.
53
55 Journalling
56 rlJournalStart
57
58 Initialize the journal file.
59
60 rlJournalStart
61
62 Run on the very beginning of your script to initialize journalling
63 functionality.
64
65 rlJournalEnd
66
67 Summarize the test run and upload the journal file.
68
69 rlJournalEnd
70
71 Run on the very end of your script to print summary of the whole test
72 run, generate OUTPUTFILE and include journal in Beaker logs.
73
74 rlJournalPrint
75
76 Print the content of the journal in pretty xml format.
77
78 rlJournalPrint [type]
79
80 type
81 Can be either 'raw' or 'pretty', with the latter as a default.
82 Raw: xml is in raw form, no indentation etc Pretty: xml is pretty
83 printed, indented, with one record per line
84
85 Example:
86
87 <?xml version="1.0"?>
88 <BEAKER_TEST>
89 <test_id>debugging</test_id>
90 <package>setup</package>
91 <pkgdetails>setup-2.8.9-1.fc12.noarch</pkgdetails>
92 <starttime>2010-02-08 15:17:47</starttime>
93 <endtime>2010-02-08 15:17:47</endtime>
94 <testname>/examples/beakerlib/Sanity/simple</testname>
95 <release>Fedora release 12 (Constantine)</release>
96 <hostname>localhost</hostname>
97 <arch>i686</arch>
98 <purpose>PURPOSE of /examples/beakerlib/Sanity/simple
99 Description: Minimal BeakerLib sanity test
100 Author: Petr Splichal <psplicha@redhat.com>
101
102 This is a minimal sanity test for BeakerLib. It contains a single
103 phase with a couple of asserts. We Just check that the "setup"
104 package is installed and that there is a sane /etc/passwd file.
105 </purpose>
106 <log>
107 <phase endtime="2010-02-08 15:17:47" name="Test" result="PASS"
108 score="0" starttime="2010-02-08 15:17:47" type="FAIL">
109 <test message="Checking for the presence of setup rpm">PASS</test>
110 <test message="File /etc/passwd should exist">PASS</test>
111 <test message="File '/etc/passwd' should contain 'root'">PASS</test>
112 </phase>
113 </log>
114 </BEAKER_TEST>
115
116 rlJournalPrintText
117
118 Print the content of the journal in pretty text format.
119
120 rlJournalPrintText [--full-journal]
121
122 --full-journal
123 The option is now deprecated, has no effect and will be removed in
124 a future version.
125
126 Example:
127
128 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
129 :: [ LOG ] :: TEST PROTOCOL
130 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
131
132 :: [ LOG ] :: Test run ID : debugging
133 :: [ LOG ] :: Package : debugging
134 :: [ LOG ] :: Test started : 2010-02-08 14:45:57
135 :: [ LOG ] :: Test finished : 2010-02-08 14:45:58
136 :: [ LOG ] :: Test name :
137 :: [ LOG ] :: Distro: : Fedora release 12 (Constantine)
138 :: [ LOG ] :: Hostname : localhost
139 :: [ LOG ] :: Architecture : i686
140
141 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
142 :: [ LOG ] :: Test description
143 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
144
145 PURPOSE of /examples/beakerlib/Sanity/simple
146 Description: Minimal BeakerLib sanity test
147 Author: Petr Splichal <psplicha@redhat.com>
148
149 This is a minimal sanity test for BeakerLib. It contains a single
150 phase with a couple of asserts. We Just check that the "setup"
151 package is installed and that there is a sane /etc/passwd file.
152
153
154 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
155 :: [ LOG ] :: Test
156 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
157
158 :: [ PASS ] :: Checking for the presence of setup rpm
159 :: [ PASS ] :: File /etc/passwd should exist
160 :: [ PASS ] :: File '/etc/passwd' should contain 'root'
161 :: [ LOG ] :: Duration: 1s
162 :: [ LOG ] :: Assertions: 3 good, 0 bad
163 :: [ PASS ] :: RESULT: Test
164
165 rlGetTestState
166
167 Returns number of failed asserts so far, or 255 if there are more than
168 255 failures. The variable ECODE is set to the precise number.
169
170 rlGetTestState
171
172 rlGetPhaseState
173
174 Returns number of failed asserts in the current phase so far, or 255 if
175 there are more than 255 failures. The variable ECODE is set to the
176 precise number.
177
178 rlGetPhaseState
179
180 Logging
181 rlLog
182
183 rlLogDebug
184
185 rlLogInfo
186
187 rlLogWarning
188
189 rlLogError
190
191 rlLogFatal
192
193 Create a time/priority-labelled message in the log. There is a bunch of
194 aliases which can create messages formated as DEBUG/INFO/WARNING/ERROR
195 or FATAL (but you would probably want to use rlDie instead of the last
196 one).
197
198 rlLog message [logfile] [priority] [label]
199
200 message
201 Message you want to show (use quotes when invoking).
202
203 logfile
204 Log file. If not supplied, OUTPUTFILE is assumed.
205
206 priority
207 Priority of the log.
208
209 label
210 Print this text instead of time in log label.
211
212 rlDie
213
214 Create a time-labelled message in the log, report test result, upload
215 logs, close unfinished phase and terminate the test.
216
217 rlDie message [file...]
218
219 message
220 Message you want to show (use quotes when invoking) - this option
221 is mandatory.
222
223 file
224 Files (logs) you want to upload as well. "rlBundleLogs" will be
225 used for it. Files which are not readable will be excluded before
226 calling "rlBundleLogs", so it is safe to call even with possibly
227 nonexistent logs and it will succeed.
228
229 rlBundleLogs
230
231 Create a tarball of files (e.g. logs) and attach them to the test
232 result.
233
234 rlBundleLogs package file [file...]
235
236 package
237 Name of the package. Will be used as part of the tarball name.
238
239 file
240 File(s) to be packed and submitted.
241
242 Returns result of submitting the tarball.
243
244 rlFileSubmit
245
246 Resolves absolute path to the file, replaces / with - and uploads this
247 renamed file using rhts-submit-log. It also allows you to specify your
248 custom name for the uploaded file.
249
250 rlFileSubmit [-s sep] path_to_file [required_name]
251
252 -s sep
253 Sets separator (i.e. the replacement of the /) to sep.
254
255 path_to_file
256 Either absolute or relative path to file. Relative path is
257 converted to absolute.
258
259 required_name
260 Default behavior renames file to full_path_to_file with / replaced
261 for -, if this does not suit your needs, you can specify the name
262 using this option.
263
264 Examples:
265
266 rlFileSubmit logfile.txt -> logfile.txt cd /etc; rlFileSubmit
267 ./passwd -> etc-passwd rlFileSubmit /etc/passwd -> etc-passwd
268 rlFileSubmit /etc/passwd my-top-secret_file -> my-top-secret-file
269 rlFileSubmit -s '_' /etc/passwd -> etc_passwd
270
271 Info
272 rlShowPackageVersion
273
274 Shows a message about version of packages.
275
276 rlShowPackageVersion package [package...]
277
278 package
279 Name of a package(s) you want to log.
280
281 rlGetArch
282
283 Sanitize architecture for simplier matching.
284
285 Return base arch for the current system (good when you need base arch
286 on a multilib system).
287
288 rlGetArch
289
290 On any 32-bit Intel (i386, i486, i586, ...) system you will get i386.
291
292 rlGetPrimaryArch
293
294 Return primary arch for the current system (good when you need base
295 arch on a multilib system).
296
297 rlGetPrimaryArch
298
299 On non-RHEL systems if the primary/secondary sedicision fails a
300 fallback to rlGetArch is done.
301
302 rlGetSecondaryArch
303
304 Return base arch for the current system (good when you need base arch
305 on a multilib system).
306
307 rlGetSecondaryArch
308
309 rlGetDistroRelease
310
311 rlGetDistroVariant
312
313 Return release or variant of the distribution on the system.
314
315 rlGetDistroRelease
316 rlGetDistroVariant
317
318 For example on the RHEL-4-AS you will get release 4 and variant AS, on
319 the RHEL-5-Client you will get release 5 and variant Client.
320
321 rlShowRunningKernel
322
323 Log a message with version of the currently running kernel.
324
325 rlShowRunningKernel
326
327 Phases
328 rlPhaseStart
329
330 Starts a phase of a specific type. The final phase result is based on
331 all asserts included in the phase. Do not forget to end phase with
332 "rlPhaseEnd" when you are done.
333
334 rlPhaseStart type [name]
335
336 type
337 Type of the phase, one of the following:
338
339 FAIL
340 When assert fails here, phase will report a FAIL.
341
342 WARN
343 When assert fails here, phase will report a WARN.
344
345 name
346 Optional name of the phase (if not provided, one will be
347 generated).
348
349 If all asserts included in the phase pass, phase reports PASS.
350
351 rlPhaseEnd
352
353 End current phase, summarize asserts included and report phase result.
354
355 rlPhaseEnd
356
357 Final phase result is based on included asserts and phase type.
358
359 rlPhaseStartSetup
360
361 rlPhaseStartTest
362
363 rlPhaseStartCleanup
364
365 Start a phase of the specified type: Setup -> WARN, Test -> FAIL,
366 Cleanup -> WARN.
367
368 rlPhaseStartSetup [name]
369 rlPhaseStartTest [name]
370 rlPhaseStartCleanup [name]
371
372 name
373 Optional name of the phase. If not specified, default
374 Setup/Test/Cleanup are used.
375
376 If you do not want these shortcuts, use plain "rlPhaseStart" function.
377
378 Reboot
379 Controlled reboot must not be executed inside of an open phase.
380 Otherwise it is possible the Overall result of the test will be
381 reported incorrectly.
382
383 Metric
384 rlLogMetricLow
385
386 Log a metric, which should be as low as possible to the journal.
387 (Example: memory consumption, run time)
388
389 rlLogMetricLow name value [tolerance]
390
391 name
392 Name of the metric. It has to be unique in a phase.
393
394 value
395 Value of the metric.
396
397 tolerance
398 It is used when comparing via rcw. It means how larger can the
399 second value be to not trigger a FAIL. Default is 0.2
400
401 When comparing FIRST, SECOND, then:
402
403 FIRST >= SECOND means PASS
404 FIRST+FIRST*tolerance >= SECOND means WARN
405 FIRST+FIRST*tolerance < SECOND means FAIL
406
407 Example: Simple benchmark is compared via this metric type in rcw. It
408 has a tolerance of 0.2. First run had 1 second. So:
409
410 For PASS, second run has to be better or equal to first.
411 So any value of second or less is a PASS.
412 For WARN, second run can be a little worse than first.
413 Tolerance is 0.2, so anything lower than 1.2 means WARN.
414 For FAIL, anything worse than 1.2 means FAIL.
415
416 rlLogMetricHigh
417
418 Log a metric, which should be as high as possible to the journal.
419 (Example: number of executions per second)
420
421 rlLogMetricHigh name value [tolerance]
422
423 name
424 Name of the metric. It has to be unique in a phase.
425
426 value
427 Value of the metric.
428
429 tolerance
430 It is used when comparing via rcw. It means how lower can the
431 second value be to not trigger a FAIL. Default is 0.2
432
433 When comparing FIRST, SECOND, then:
434
435 FIRST <= SECOND means PASS
436 FIRST+FIRST*tolerance <= SECOND means WARN
437 FIRST+FIRST*tolerance > SECOND means FAIL
438
439 Manual Asserts
440 rlPass
441
442 Manual assertion, asserts and logs PASS.
443
444 rlPass comment
445
446 comment
447 Short test summary.
448
449 Returns 0 and asserts PASS.
450
451 rlFail
452
453 Manual assertion, asserts and logs FAIL.
454
455 rlFail comment
456
457 comment
458 Short test summary.
459
460 Returns 1 and asserts FAIL.
461
462 Arithmetic Asserts
463 rlAssert0
464
465 Assertion checking for the equality of parameter to zero.
466
467 rlAssert0 comment value
468
469 comment
470 Short test summary, e.g. "Test if compilation ended successfully".
471
472 value
473 Integer value (usually return code of a command).
474
475 Returns 0 and asserts PASS when "value == 0".
476
477 rlAssertEquals
478
479 Assertion checking for the equality of two parameters.
480
481 rlAssertEquals comment value1 value2
482
483 comment
484 Short test summary, e.g. "Test if all 3 packages have been
485 downloaded".
486
487 value1
488 First parameter to compare, can be a number or a string
489
490 value2
491 Second parameter to compare, can be a number or a string
492
493 Returns 0 and asserts PASS when "value1 == value2".
494
495 rlAssertNotEquals
496
497 Assertion checking for the non-equality of two parameters.
498
499 rlAssertNotEquals comment value1 value2
500
501 comment
502 Short test summary, e.g. "Test if return code is not 139".
503
504 value1
505 First parameter to compare, can be a number or a string
506
507 value2
508 Second parameter to compare, can be a number or a string
509
510 Returns 0 and asserts PASS when "value1 != value2".
511
512 rlAssertGreater
513
514 Assertion checking whether first parameter is greater than the second
515 one.
516
517 rlAssertGreater comment value1 value2
518
519 comment
520 Short test summary, e.g. "Test whether there are running more
521 instances of program."
522
523 value1
524 Integer value.
525
526 value2
527 Integer value.
528
529 Returns 0 and asserts PASS when "value1 > value2".
530
531 rlAssertGreaterOrEqual
532
533 Assertion checking whether first parameter is greater or equal to the
534 second one.
535
536 rlAssertGreaterOrEqual comment value1 value2
537
538 comment
539 Short test summary (e.g. "There should present at least one...")
540
541 value1
542 Integer value.
543
544 value2
545 Integer value.
546
547 Returns 0 and asserts PASS when "value1 X= value2".
548
549 rlAssertLesser
550
551 Assertion checking whether first parameter is lesser than the second
552 one.
553
554 rlAssertLesser comment value1 value2
555
556 comment
557 Short test summary, e.g. "Test whether there are running more
558 instances of program."
559
560 value1
561 Integer value.
562
563 value2
564 Integer value.
565
566 Returns 0 and asserts PASS when "value1 < value2".
567
568 rlAssertLesserOrEqual
569
570 Assertion checking whether first parameter is lesser or equal to the
571 second one.
572
573 rlAssertLesserOrEqual comment value1 value2
574
575 comment
576 Short test summary (e.g. "There should present at least one...")
577
578 value1
579 Integer value.
580
581 value2
582 Integer value.
583
584 Returns 0 and asserts PASS when "value1 X= value2".
585
586 File Asserts
587 rlAssertExists
588
589 Assertion checking for the existence of a file or a directory.
590
591 rlAssertExists file|directory
592
593 file|directory
594 Path to the file or directory.
595
596 Returns 0 and asserts PASS when "file" exists.
597
598 rlAssertNotExists
599
600 Assertion checking for the non-existence of a file or a directory.
601
602 rlAssertNotExists file|directory
603
604 file|directory
605 Path to the file or directory.
606
607 Returns 0 and asserts PASS when "file" does not exist.
608
609 rlAssertGrep
610
611 Assertion checking if the file contains a pattern.
612
613 rlAssertGrep pattern file [options]
614
615 pattern
616 Regular expression to be searched for.
617
618 file
619 Path to the file.
620
621 options
622 Optional parameters to be passed to grep, default is "-q". Can be
623 used to perform case insensitive matches (-i), or using extended
624 (-E) or perl (-P) regular expressions.
625
626 Returns 0 and asserts PASS when "file" exists and contains given
627 "pattern".
628
629 rlAssertNotGrep
630
631 Assertion checking that the file does not contain a pattern.
632
633 rlAssertNotGrep pattern file [options]
634
635 pattern
636 Regular expression to be searched for.
637
638 file
639 Path to the file.
640
641 options
642 Optional parameters to be passed to grep, default is "-q". Can be
643 used to perform case insensitive matches (-i), or using extended
644 (-E) or perl (-P) regular expressions.
645
646 Returns 0 and asserts PASS when "file" exists and does not contain
647 given "pattern".
648
649 rlAssertDiffer
650
651 Assertion checking that two files differ (are not identical).
652
653 rlAssertDiffer file1 file2
654
655 file1
656 Path to first file1
657
658 file2
659 Path to second file
660
661 Returns 0 and asserts PASS when "file1" and "file2" differs.
662
663 rlAssertNotDiffer
664
665 Assertion checking that two files do not differ (are identical).
666
667 rlAssertNotDiffer file1 file2
668
669 file1
670 Path to first file1
671
672 file2
673 Path to second file
674
675 Returns 0 and asserts PASS when "file1" and "file2" do not differ.
676
677 Run, Watch, Report
678 rlRun
679
680 Run command with optional comment and make sure its exit code matches
681 expectations.
682
683 rlRun [-t] [-l] [-c] [-s] command [status[,status...] [comment]]
684
685 -t If specified, stdout and stderr of the command output will be
686 tagged with strings 'STDOUT: ' and 'STDERR: '.
687
688 -l If specified, output of the command (tagged, if -t was specified)
689 is logged using rlLog function. This is intended for short outputs,
690 and therefore only last 50 lines are logged this way. Longer
691 outputs should be analysed separately, or uploaded via rlFileSubmit
692 or rlBundleLogs.
693
694 -c Same as "-l", but only log the command output if it failed.
695
696 -s Store stdout and stderr to a file (mixed together, as the user
697 would see it on a terminal) and set $rlRun_LOG variable to name of
698 the file. $rlRun_LOG is now actually an array where the first index
699 holds the last reference to the file. Thus its behavior is not
700 changed if used without an index. The array is consumed by the
701 rlJournalEnd function to remove the leftover files, so no manual
702 files removal is needed anymore. Note that if you need to use such
703 a file after calling the rlJournalEnd function you need to create
704 your own copy of the respective file. When -t option is used, the
705 content of the file becomes tagged too.
706
707 If the -s option is not used, $rlRun_LOG is not modified and keeps
708 its content from the last "rlRun -s".
709
710 command
711 Command to run.
712
713 status
714 Expected exit code(s). Optional, default 0. If you expect more exit
715 codes, separate them with comma (e.g. "0,1" when both 0 and 1 are
716 OK and expected), or use from-to notation (i.e. "2-5" for
717 "2,3,4,5"), or combine them (e.g. "2-4,26" for "2,3,4,26").
718
719 comment
720 Short summary describing the action (optional, but recommended -
721 explain what you are doing here).
722
723 Returns the exit code of the command run. Asserts PASS when command\'s
724 exit status is in the list of expected exit codes.
725
726 Note:
727
728 • The output of rlRun is buffered when using "-t", "-l" or "-s"
729 option (they use unix pipes, which are buffered by nature). If you
730 need an unbuffered output just make sure that "expect" package is
731 installed on your system (its "unbuffer" tool will automatically be
732 used to produce unbuffered output).
733
734 • Be aware that there are some variables which can collide with your
735 code executed within rlRun. You should avoid using
736 __INTERNAL_rlRun_* variables.
737
738 • When any of "-t" "-l", "-c", or "-s" option is used, special file
739 descriptors 111 and 112 are used to avoid the issue with incomplete
740 log file, bz1361246. As there might be an indefinite loop, there's
741 a timeout of two minutes implemented as a fix for bz1416796. Also
742 an error message is issued to signal the possibility of running
743 subprocess which keeps the file descriptors open.
744
745 Do not use these options if you expect process forking and
746 continuouse run. Try your own apropriate solution instead.
747
748 Warning: using "unbuffer" tool is now disabled because of bug 547686.
749
750 rlWatchdog
751
752 Run "command". If it does not finish in specified time, then kill it
753 using "signal". Note that the command is executed in a sub-shell so
754 modified environment (e.g. set variables) is not relfected in the test
755 environment.
756
757 rlWatchdog command timeout [signal] [callback]
758
759 command
760 Command to run.
761
762 timeout
763 Timeout to wait, in seconds.
764
765 signal
766 Signal to use (optional, default KILL).
767
768 callback
769 Callback function to be called before the signal is send (optional,
770 none by default). The callback function will have one argument
771 available -- PGID of the process group.
772
773 Returns 0 if the command ends normally, without need to be killed.
774
775 rlReport
776
777 Report test result to the test harness. The command to be used for
778 reporting is set by the respective plugin. You can also use the
779 $BEAKERLIB_COMMAND_REPORT_RESULT variable to use your custom command.
780
781 rlReport name result [score] [log]
782
783 name
784 Name of the test result.
785
786 result
787 Result (one of PASS, WARN, FAIL). If called with something else,
788 will use WARN.
789
790 score
791 Test score (optional).
792
793 log Optional log file to be submitted instead of default "OUTPUTFILE".
794
795 rlCmpVersion
796
797 Compare two given versions composed by numbers and letters divided by
798 dot (.), underscore (_), or dash (-).
799
800 rlCmpVersion ver1 ver2
801
802 If ver1 = ver2, sign '=' is printed to stdout and 0 is returned. If
803 ver1 > ver2, sign '>' is printed to stdout and 1 is returned. If ver1
804 < ver2, sign '<' is printed to stdout and 2 is returned.
805
806 rlTestVersion
807
808 Test releation between two given versions based on given operator.
809
810 rlTestVersion ver1 op ver2
811
812 op Operator defining the logical expression. It can be '=', '==',
813 '!=', '<', '<=', '=<', '>', '>=', or '=>'.
814
815 Returns 0 if the expresison ver1 op ver2 is true; 1 if the expression
816 is false and 2 if something went wrong.
817
818 Release Info
819 rlIsRHEL
820
821 rlIsRHEL [VERSION_SPEC]...
822
823 VERSION_SPEC
824 Argument specifies version of particular RHEL distribution, eg. 8,
825 8.4 ">8.4".
826
827 For more details see description of "rlIsOSVersion".
828
829 Returns 0 when we're running on RHEL. With given version specification
830 in arguments returns 0 if the particular RHEL version is running.
831
832 Prototype:
833
834 rlIsRHEL
835
836 Returns 0 if we are running on RHEL.
837
838 rlIsRHEL 7 '>=8.5'
839
840 Returns 0 if we are running any RHEL 7 or RHEL 8.5 and higher.
841
842 rlIsFedora
843
844 rlIsFedora [VERSION_SPEC]...
845
846 VERSION_SPEC
847 Argument specifies version of particular Fedora distribution, eg.
848 30, ">30".
849
850 For more details see description of "rlIsOSVersion".
851
852 Returns 0 when we're running on Fedora. With given version
853 specification in arguments returns 0 if the particular Fedora version
854 is running.
855
856 Prototype:
857
858 rlIsFedora
859
860 Returns 0 if we are running on Fedora.
861
862 rlIsFedora 30 32
863
864 Returns 0 if we are running Fedora 30 or 32.
865
866 rlIsCentOS
867
868 rlIsCentOS [VERSION_SPEC]...
869
870 VERSION_SPEC
871 Argument specifies version of particular CentOS distribution, eg.
872 7, ">7".
873
874 For more details see description of "rlIsOSVersion".
875
876 Returns 0 when we're running on CentOS. With given version
877 specification in arguments returns 0 if the particular CentOS version
878 is running.
879
880 Prototype:
881
882 rlIsCentOS
883
884 Returns 0 if we are running on CentOS.
885
886 rlIsCentOS 7.1 6
887
888 Returns 0 if we are running CentOS 7.1 or any CentOS 6.
889
890 rlIsOS
891
892 rlIsOS ID
893
894 ID Argument is based on contents of /etc/os-release. Possible options
895 of ID are e.g. fedora, rhel, centos, ol.
896
897 Returns 0 when we're running on system with respective ID. Returns 1
898 when parameter does not match with ID in os-release. Returns 2 when
899 there is no ID defined. Returns 3 when no argument is given.
900
901 Prototype:
902
903 rlIsOS rhel
904
905 Returns 0 if we are running on RHEL.
906
907 rlIsOSLike
908
909 rlIsOSLike ID_LIKE
910
911 ID_LIKE
912 Argument is based on contents of /etc/os-release. Possible options
913 of ID_LIKE are e.g. fedora, rhel.
914
915 Returns 0 when we're running on system with requested ID_LIKE. Returns
916 1 when parameter does not match with ID nor ID_LIKE in os-release.
917 Returns 2 when there is no ID or ID_LIKE defined. Returns 3 when no
918 argument is given.
919
920 Prototype:
921
922 rlIsOSLike rhel
923
924 Returns 0 if we are running on RHEL, CentOS, Rocky Linux, etc..
925
926 rlIsOSLike fedora
927
928 Returns 0 if we are running on Fedora, RHEL, CentOS, Oracle Linux, etc..
929
930 rlIsOSVersion
931
932 rlIsOsVersion VERSION_SPEC...
933
934 VERSION_SPEC
935 Parameter is based on VERSION_ID in /etc/os-release. It consists
936 of either "major" or "major"."minor" refering to a particular
937 release.
938
939 It accepts multiple arguments separated by space (8.1 8.2 8.3 9).
940
941 To specify a group of distributions optional operator can be passed
942 in argument together with the version number as one string
943 ('>8.5'). Operator can be '<', '<=', '=<', '=', '>', '>=' matching
944 whether the currently installed version is lesser, lesser or equal,
945 equal, equal or greater, greater than the version number supplied
946 as second half of the argument.
947
948 Note that when using >/< operators you have to either put the
949 argument in quotes or escape the operators to avoid them being
950 interpreted as bash redirection operator.
951
952 Returns 0 when we're running distribution of the particular version
953 requested by the argument.
954
955 It usually follows after "rlIsOS" and "rlIsOSLike".
956
957 Be cautious when using together with "rlIsOSLike" as different
958 distributions may use different versioning schema.
959
960 Prototype:
961
962 rlIsOSVersion 6 7 9
963
964 Returns 0 if we are running distribution with VERSION_ID 6, 7 or 9.
965
966 rlIsOSVersion 7.8 8
967
968 Returns 0 if we are running distribution 7.8 or any 8.
969
970 rlIsOSVersion ">=7.5" or rlIsOSVersion \>=7.5
971
972 Returns 0 if we are running distribution 7.5 or higher (both minors or majors).
973
974 Note:
975
976 rlIsOSVersion '<7.5' || rlIsOSVersion '<8.5'
977
978 would also cover 7.9 as it is less than 8.5, which is not what you want.
979 So if you want to construct a condition for a distribution <7.5 within the major 7 or
980 a distribution <8.5 within the major 8 you actually need to use following construct:
981
982 rlIsOSVersion 7 && rlIsOSVersion '<7.5' || rlIsOSVersion 8 && rlIsOSVersion '<8.5'
983
984 This returns 0 when running distribution less than 7.5 and less then 8.5, but not 7.9 (nor 6.9).
985
986 rlIsRHELLike
987
988 rlIsRHELLike [VERSION_SPEC]...
989
990 VERSION_SPEC
991 Argument specifies version of particular RHEL distribution, eg. 8,
992 8.4 ">8.4".
993
994 For more details see description of "rlIsOSVersion".
995
996 Returns 0 when we're running on RHEL-like distribution. These are
997 considered to be RHEL, CentOS, Rocky Linux, etc.. With given version
998 specification in arguments returns 0 if the particular version of RHEL-
999 like distribution is running.
1000
1001 Prototype:
1002
1003 rlIsRHELLike
1004
1005 Returns 0 if we are running on RHEL-like system.
1006
1007 rlIsRHELLike ">=6"
1008
1009 Returns 0 if we are running on RHEL-like distribution of version 6.0 or higher.
1010
1011 Rpm Handling
1012 rlCheckRpm
1013
1014 Check whether a package is installed.
1015
1016 rlCheckRpm name [version] [release] [arch]
1017
1018 name
1019 Package name like "kernel"
1020
1021 version
1022 Package version like 2.6.25.6
1023
1024 release
1025 Package release like "55.fc9"
1026
1027 arch
1028 Package architucture like "i386"
1029
1030 Returns 0 if the specified package is installed.
1031
1032 rlAssertRpm
1033
1034 Assertion making sure that a package is installed.
1035
1036 rlAssertRpm name [version] [release] [arch]>
1037 rlAssertRpm --all
1038
1039 name
1040 Package name like "kernel"
1041
1042 version
1043 Package version like 2.6.25.6
1044
1045 release
1046 Package release like "55.fc9"
1047
1048 arch
1049 Package architucture like "i386"
1050
1051 --all
1052 Assert all packages listed in the $PACKAGES $REQUIRES and
1053 $COLLECTIONS environment variables.
1054
1055 Returns 0 and asserts PASS if the specified package is installed.
1056
1057 rlAssertNotRpm
1058
1059 Assertion making sure that a package is not installed. This is just
1060 inverse of "rlAssertRpm".
1061
1062 rlAssertNotRpm name [version] [release] [arch]>
1063
1064 name
1065 Package name like "kernel"
1066
1067 version
1068 Package version like 2.6.25.6
1069
1070 release
1071 Package release like "55.fc9"
1072
1073 arch
1074 Package architucture like "i386"
1075
1076 Returns 0 and asserts PASS if the specified package is not installed.
1077
1078 Example
1079
1080 Function "rlAssertRpm" is useful especially in prepare phase where it
1081 causes abort if a package is missing, while "rlCheckRpm" is handy when
1082 doing something like:
1083
1084 if ! rlCheckRpm package; then
1085 yum install package
1086 rlAssertRpm package
1087 fi
1088
1089 rlAssertBinaryOrigin
1090
1091 Assertion making sure that given binary is owned by (one of) the given
1092 package(s).
1093
1094 rlAssertBinaryOrigin binary package [package2 [...]]
1095 PACKAGES=... rlAssertBinaryOrigin binary
1096
1097 binary
1098 Binary name like "ksh" or "/bin/ksh"
1099
1100 package
1101 List of packages like "ksh mksh". The parameter is optional. If
1102 missing, contents of environment variable $PACKAGES are taken into
1103 account.
1104
1105 Returns 0 and asserts PASS if the specified binary belongs to (one of)
1106 the given package(s). Returns 1 and asserts FAIL if the specified
1107 binary does not belong to (any of) the given package(s). Returns 2 and
1108 asserts FAIL if the specified binary is not found. Returns 3 and
1109 asserts FAIL if no packages are given. Returns 100 and asserts FAIL if
1110 invoked with no parameters.
1111
1112 Example
1113
1114 Function "rlAssertBinaryOrigin" is useful especially in prepare phase
1115 where it causes abort if a binary is missing or is owned by different
1116 package:
1117
1118 PACKAGES=mksh rlAssertBinaryOrigin ksh
1119 or
1120 rlAssertBinaryOrigin ksh mksh
1121
1122 Returns true if ksh is owned by the mksh package (in this case:
1123 /bin/ksh is a symlink pointing to /bin/mksh).
1124
1125 rlGetMakefileRequires
1126
1127 Prints space separated list of requirements defined in Makefile using
1128 'Requires' attribute.
1129
1130 Return 0 if success.
1131
1132 rlGetYAMLdeps
1133
1134 Prints space separated list of requirements defined in metadata.yaml
1135 using 'require' and / or 'recommend' attribute.
1136
1137 Full fmf ids and library references are to be ignored.
1138
1139 rlGetYAMLdeps DEP_TYPE [array_var_name]
1140
1141 DEP_TYPE
1142 Dependency type defined as a regexp. Expected values are 'require',
1143 'recommend', or 'require|recommend'. The matching attribute values
1144 are then processed. Defaults to 'require'.
1145
1146 array_var_name
1147 Name of the variable to put the output to in a form of an array.
1148 This can hold also dependencies with specific version. If used,
1149 the output to stdout is suppressed.
1150
1151 Return 0 if success.
1152
1153 rlCheckRequirements
1154
1155 Check that all given requirements are covered eigther by installed
1156 package or by binary available in PATHs or by some package's provides.
1157
1158 rlRun "rlCheckRequirements REQ..."
1159
1160 REQ Requirement to be checked. It can be package name, provides string
1161 or binary name. Moreover, the requirement can be written the same
1162 way as the Require in the spec file, including the version
1163 specification, e.g. "bash >= 4.4". The comparsion operator may be
1164 any of supported by rlTestVersion(), see its manual.
1165
1166 Returns number of unsatisfied requirements.
1167
1168 rlCheckMakefileRequires
1169
1170 Check presence of required packages / binaries defined in metadata.yaml
1171 provided by "tmt" or Makefile of the test.
1172
1173 Also check presence of recommended packages / binaries defined in
1174 metadata.yaml provided by "tmt". These however do not participate on
1175 the return code, these are just informative.
1176
1177 Example
1178
1179 rlRun "rlCheckMakefileRequires"
1180
1181 Return 255 if requirements could not be retrieved, 0 if all
1182 requirements are satisfied or number of unsatisfied requirements.
1183
1184 rlGetRequired =head3 rlGetRecommended
1185
1186 Get a list of required or recommended packages / binaries defined in
1187 metadata.yaml provided by "tmt" or in a Makefile of the test.
1188
1189 rlGetRequired [ARRAY_VAR_NAME]
1190 rlGetRecommended [ARRAY_VAR_NAME]
1191
1192 ARRAY_VAR_NAME
1193 If provided the variable is populated as an array with the
1194 respective dependencies. Otherwise the dependencies are printed out
1195 to the STDOUT.
1196
1197 Return 255 if requirements could not be retrieved, 0 otherwise.
1198
1199 rlCheckRequired =head3 rlCheckRecommended =head3 rlCheckDependencies
1200
1201 Check presence of required, recommended or both packages / binaries
1202 defined in metadata.yaml provided by "tmt" or in a Makefile of the
1203 test.
1204
1205 Example
1206
1207 rlRun "rlCheckRequired"
1208 rlRun "rlCheckRecommended"
1209 rlRun "rlCheckDependencies"
1210
1211 Return 255 if requirements could not be retrieved, 0 if all
1212 requirements are satisfied or number of unsatisfied requirements.
1213
1214 rlAssertRequired
1215
1216 Ensures that all required packages provided in either metadata.yaml or
1217 Makefile are installed.
1218
1219 rlAssertRequired
1220
1221 Prints out a verbose list of installed/missing packages during
1222 operation.
1223
1224 Returns 0 if all required packages are installed, 1 if one or more
1225 packages are missing or if no Makefile is present.
1226
1227 Getting RPMs
1228 Download methods
1229
1230 Functions handling rpm downloading/installing can use more methods for
1231 actual download of the rpm.
1232
1233 Currently there are two download methonds available:
1234
1235 direct
1236 Use use dirct download from build system (brew).
1237
1238 yum Use yumdownloader or dnf download.
1239
1240 The methods and their order are defined by
1241 BEAKERLIB_RPM_DOWNLOAD_METHODS variable as space separated list. By
1242 default it is 'direct yum'. This can be overridden by user. There may
1243 be done also additions or changes to the original value, e.g.
1244 BEAKERLIB_RPM_DOWNLOAD_METHODS='yum
1245 ${BEAKERLIB_RPM_DOWNLOAD_METHODS/yum/}'
1246
1247
1248
1249 Beakerlib is prepared for more Koji-based sources of packages while
1250 usigng direct download method. By default packages are fetched from
1251 Koji, particularly from https://kojipkgs.fedoraproject.org/packages.
1252
1253 rlRpmInstall
1254
1255 Try to install specified package from local Red Hat sources.
1256
1257 rlRpmInstall [--quiet] package version release arch
1258
1259 --quiet
1260 Make the download and the install process be quiet.
1261
1262 package
1263 Package name like "kernel"
1264
1265 version
1266 Package version like 2.6.25.6
1267
1268 release
1269 Package release like "55.fc9"
1270
1271 arch
1272 Package arch like "i386"
1273
1274 Returns 0 if specified package was installed successfully.
1275
1276 rlRpmDownload
1277
1278 Try to download specified package.
1279
1280 rlRpmDownload [--quiet] {package version release arch|N-V-R.A}
1281 rlRpmDownload [--quiet] --source {package version release|N-V-R}
1282
1283 --quiet
1284 Make the download process be quiet.
1285
1286 package
1287 Package name like "kernel"
1288
1289 version
1290 Package version like 2.6.25.6
1291
1292 release
1293 Package release like "55.fc9"
1294
1295 arch
1296 Package arch like "i386"
1297
1298 Returns 0 if specified package was downloaded successfully.
1299
1300 rlFetchSrcForInstalled
1301
1302 Tries various ways to download source rpm for specified installed rpm.
1303
1304 rlFetchSrcForInstalled [--quiet] package
1305
1306 --quiet
1307 Make the download process be quiet.
1308
1309 package
1310 Installed package name like "kernel". It accepts in-direct names.
1311 E.g. for the package name "krb5-libs" the function will download
1312 the "krb5" source rpm.
1313
1314 Returns 0 if the source package was successfully downloaded.
1315
1316 Mounting
1317 rlMount
1318
1319 Create mount point (if neccessary) and mount a NFS share.
1320
1321 rlMount [-o MOUNT_OPTS] server share mountpoint
1322
1323 server
1324 NFS server hostname.
1325
1326 share
1327 Shared directory name.
1328
1329 mountpoint
1330 Local mount point.
1331
1332 MOUNT_OPTS
1333 Mount options.
1334
1335 Returns 0 if mounting the share was successful.
1336
1337 rlCheckMount
1338
1339 Check either if a directory is a mountpoint, if it is a mountpoint to a
1340 specific server, or if it is a mountpoint to a specific export on a
1341 specific server and if it uses specific mount options.
1342
1343 rlCheckMount [-o MOUNT_OPTS] mountpoint
1344 rlCheckMount [-o MOUNT_OPTS] server mountpoint
1345 rlCheckMount [-o MOUNT_OPTS] server share mountpoint
1346
1347 mountpoint
1348 Local mount point.
1349
1350 server
1351 NFS server hostname
1352
1353 share
1354 Shared directory name
1355
1356 MOUNT_OPTS
1357 Mount options to check (comma separated list)
1358
1359 With one parameter, returns 0 when specified directory exists and is a
1360 mountpoint. With two parameters, returns 0 when specific directory
1361 exists, is a mountpoint and an export from specific server is mounted
1362 there. With three parameters, returns 0 if a specific shared directory
1363 is mounted on a given server on a given mountpoint
1364
1365 If the -o option is provided, returns 0 if the mountpoint uses all the
1366 given options, 2 otherwise.
1367
1368 rlAssertMount
1369
1370 Assertion making sure that given directory is a mount point, if it is a
1371 mountpoint to a specific server, or if it is a mountpoint to a specific
1372 export on a specific server and if it uses specific mount options.
1373
1374 rlAssertMount [-o MOUNT_OPTS] mountpoint
1375 rlAssertMount [-o MOUNT_OPTS] server mountpoint
1376 rlAssertMount [-o MOUNT_OPTS] server share mountpoint
1377
1378 mountpoint
1379 Local mount point.
1380
1381 server
1382 NFS server hostname
1383
1384 share
1385 Shared directory name
1386
1387 MOUNT_OPTS
1388 Mount options to check (comma separated list)
1389
1390 With one parameter, returns 0 when specified directory exists and is a
1391 mountpoint. With two parameters, returns 0 when specific directory
1392 exists, is a mountpoint and an export from specific server is mounted
1393 there. With three parameters, returns 0 if a specific shared directory
1394 is mounted on a given server on a given mountpoint. Asserts PASS when
1395 the condition is true.
1396
1397 If the -o option is provided, asserts PASS if the above conditions are
1398 met and the mountpoint uses all the given options.
1399
1400 rlHash, rlUnhash
1401
1402 Hashes/Unhashes given string and prints the result to stdout.
1403
1404 rlHash [--decode] [--algorithm HASH_ALG] --stdin|STRING
1405 rlUnhash [--algorithm HASH_ALG] --stdin|STRING
1406
1407 --decode
1408 Unhash given string.
1409
1410 --algorithm
1411 Use given hash algorithm. Currently supported algorithms:
1412 base64
1413 base64_ - this is standard base64 where '=' is replaced by '_'
1414 hex
1415
1416 Defaults to hex. Default algorithm can be override using global
1417 variable rlHashAlgorithm.
1418
1419 --stdin
1420 Get the string from stdin.
1421
1422 STRING
1423 String to be hashed/unhashed.
1424
1425 Returns 0 if success.
1426
1427 Backup and Restore
1428 rlFileBackup
1429
1430 Create a backup of files or directories (recursive). Can be used
1431 multiple times to add more files to backup. Backing up an already
1432 backed up file overwrites the original backup.
1433
1434 rlFileBackup [--clean] [--namespace name] [--missing-ok|--no-missing-ok] file [file...]
1435
1436 You can use "rlRun" for asserting the result but keep in mind meaning
1437 of exit codes, especialy exit code 8, if using without --clean option.
1438
1439 --clean
1440 If this option is provided (has to be the first option of the
1441 command), then file/dir backed up using this command (provided in
1442 next options) will be (recursively) removed before we restore it.
1443 This option implies --missing-ok, which can be overridden by
1444 --no-missing-ok.
1445
1446 --namespace name
1447 Specifies the namespace to use. Namespaces can be used to separate
1448 backups and their restoration.
1449
1450 --missing-ok
1451 Do not raise an error in case of missing file to backup.
1452
1453 --no-missing-ok
1454 Do raise an error in case of missing file to backup. This is
1455 useful with --clean. This behaviour can be globally set by global
1456 variable BEAKERLIB_FILEBACKUP_MISSING_OK=false.
1457
1458 file
1459 Files and/or directories to be backed up.
1460
1461 Returns 0 if the backup was successful. Returns 1 if parsing of
1462 parameters was not successful. Returns 2 if no files specification was
1463 provided. Returns 3 if BEAKERLIB_DIR variable is not set, e.g.
1464 rlJournalStart was not executed. Returns 4 if creating of main backup
1465 destination directories was not successful. Returns 5 if creating of
1466 file specific backup destination directories was not successful.
1467 Returns 6 if the copy of backed up files was not successful. Returns 7
1468 if attributes of backed up files were not successfuly copied. Returns
1469 8 if backed up files do not exist. This can be suppressed based on
1470 other options.
1471
1472 Example with --clean:
1473
1474 touch cleandir/aaa
1475 rlRun "rlFileBackup --clean cleandir/"
1476 touch cleandir/bbb
1477 ls cleandir/
1478 aaa bbb
1479 rlRun "rlFileRestore"
1480 ls cleandir/
1481 aaa
1482
1483 rlFileRestore
1484
1485 Restore backed up files to their original location. "rlFileRestore"
1486 does not remove new files appearing after backup has been made. If you
1487 don't want to leave anything behind just remove the whole original tree
1488 before running "rlFileRestore", or see "--clean" option of
1489 "rlFileBackup".
1490
1491 rlFileRestore [--namespace name]
1492
1493 You can use "rlRun" for asserting the result.
1494
1495 --namespace name
1496 Specifies the namespace to use. Namespaces can be used to separate
1497 backups and their restoration.
1498
1499 Returns 0 if backup dir is found and files are restored successfully.
1500
1501 Return code bits meaning:
1502
1503 XXXXX
1504 |||||
1505 ||||\_ error parsing parameters
1506 |||\__ could not find backup directory
1507 ||\___ files cleanup failed
1508 |\____ files restore failed
1509 \_____ no files were restored nor cleaned
1510
1511 Services
1512 Following routines implement comfortable way how to start/stop system
1513 services with the possibility to restore them to their original state
1514 after testing.
1515
1516 rlServiceStart
1517
1518 Make sure the given "service" is running with fresh configuration.
1519 (Start it if it is stopped and restart if it is already running.) In
1520 addition, when called for the first time, the current state is saved so
1521 that the "service" can be restored to its original state when testing
1522 is finished, see "rlServiceRestore".
1523
1524 rlServiceStart service [service...]
1525
1526 service
1527 Name of the service(s) to start.
1528
1529 Returns number of services which failed to start/restart; thus zero is
1530 returned when everything is OK.
1531
1532 rlServiceStop
1533
1534 Make sure the given "service" is stopped. Stop it if it is running and
1535 do nothing when it is already stopped. In addition, when called for the
1536 first time, the current state is saved so that the "service" can be
1537 restored to its original state when testing is finished, see
1538 "rlServiceRestore".
1539
1540 rlServiceStop service [service...]
1541
1542 service
1543 Name of the service(s) to stop.
1544
1545 Returns number of services which failed to become stopped; thus zero is
1546 returned when everything is OK.
1547
1548 rlServiceRestore
1549
1550 Restore given "service" into its original state (before the first
1551 "rlServiceStart" or "rlServiceStop" was called). If "rlServiceStart"
1552 was called on already running "service", "rlServiceRestore" will
1553 restart the "service" when restoring its state.
1554
1555 rlServiceRestore [service...]
1556
1557 service
1558 Name of the service(s) to restore to original state. All services
1559 will be restored in reverse order if no service name is given.
1560
1561 Returns number of services which failed to get back to their original
1562 state; thus zero is returned when everything is OK.
1563
1564 rlServiceStatus
1565
1566 Print status (output of `service SERVICE status` or `systemctl status
1567 SERVICE`) of given "SERVICE".
1568
1569 rlServiceStatus SERVICE [SERVICE...]
1570
1571 SERVICE
1572 The service to get the status of.
1573
1574 Returns service status return code of the last provided SERVICE.
1575
1576 rlServiceEnable
1577
1578 Enables selected services if needed, or does nothing if already
1579 enabled. In addition, when called for the first time, the current
1580 state is saved so that the "service" can be restored to its original
1581 state when testing is finished, see "rlServiceRestore".
1582
1583 rlServiceEnable service [service...]
1584
1585 service
1586 Name of the service(s) to enable.
1587
1588 Returns number of services which failed enablement; thus zero is
1589 returned when everything is OK.
1590
1591 rlServiceDisable
1592
1593 Disables selected services if needed, or does nothing if already
1594 disabled. In addition, when called for the first time, the current
1595 state is saved so that the "service" can be restored to its original
1596 state when testing is finished, see "rlServiceRestore".
1597
1598 rlServiceDisable service [service...]
1599
1600 service
1601 Name of the service(s) to disable.
1602
1603 Returns number of services which failed disablement; thus zero is
1604 returned when everything is OK.
1605
1606 Sockets
1607 Following routines implement comfortable way how to start/stop system
1608 sockets with the possibility to restore them to their original state
1609 after testing.
1610
1611 rlSocketStart
1612
1613 Make sure the given "socket" is running. (Start it if stopped, leave it
1614 if already running.) In addition, when called for the first time, the
1615 current state is saved so that the "socket" can be restored to its
1616 original state when testing is finished, see "rlSocketRestore".
1617
1618 rlSocketStart socket [socket...]
1619
1620 socket
1621 Name of the socket(s) to start.
1622
1623 Returns number of sockets which failed to start/restart; thus zero is
1624 returned when everything is OK.
1625
1626 rlSocketStop
1627
1628 Make sure the given "socket" is stopped. Stop it if it is running and
1629 do nothing when it is already stopped. In addition, when called for the
1630 first time, the current state is saved so that the "socket" can be
1631 restored to its original state when testing is finished, see
1632 "rlSocketRestore".
1633
1634 rlSocketStop socket [socket...]
1635
1636 socket
1637 Name of the socket(s) to stop.
1638
1639 Returns number of sockets which failed to become stopped; thus zero is
1640 returned when everything is OK.
1641
1642 rlSocketRestore
1643
1644 Restore given "socket" into its original state (before the first
1645 "rlSocketStart" or "rlSocketStop" was called).
1646
1647 Warning !!! Xinetd process [even though it might have been used] is
1648 NOT restored. It is recommended to call rlServiceRestore xinetd as
1649 well.
1650
1651 rlSocketRestore socket [socket...]
1652
1653 socket
1654 Name of the socket(s) to restore to original state.
1655
1656 Returns number of sockets which failed to get back to their original
1657 state; thus zero is returned when everything is OK.
1658
1659 Cleanup management
1660 Cleanup management works with a so-called cleanup buffer, which is a
1661 temporary representation of what should be run at cleanup time, and a
1662 final cleanup script (executable), which is generated from this buffer
1663 and wraps it using BeakerLib essentials (journal initialization,
1664 cleanup phase, ...). The cleanup script must always be updated on an
1665 atomic basis (filesystem-wise) to allow an asynchronous execution by a
1666 third party (ie. test watcher).
1667
1668 The test watcher usage is mandatory for the cleanup management system
1669 to work properly as it is the test watcher that executes the actual
1670 cleanup script. Limited, catastrophe-avoiding mechanism is in place
1671 even when the test is not run in test watcher, but that should be seen
1672 as a backup and such situation is to be avoided whenever possible.
1673
1674 The cleanup script shares all environment (variables, exported or not,
1675 and functions) with the test itself - the cleanup append/prepend
1676 functions "sample" or "snapshot" the environment at the time of their
1677 call, IOW any changes to the test environment are synchronized to the
1678 cleanup script only upon calling append/prepend. When the
1679 append/prepend functions are called within a function which has local
1680 variables, these will appear as global in the cleanup.
1681
1682 While the cleanup script receives $PWD from the test, its working dir
1683 is set to the initial test execution dir even if $PWD contains
1684 something else. It is impossible to use relative paths inside cleanup
1685 reliably - certain parts of the cleanup might have been added under
1686 different current directories (CWDs). Therefore always use absolute
1687 paths in append/prepend cleanup or make sure you never 'cd' elsewhere
1688 (ie. to a TmpDir).
1689
1690 rlCleanupAppend
1691
1692 Appends a string to the cleanup buffer and recreates the cleanup
1693 script.
1694
1695 rlCleanupAppend string
1696
1697 Returns 0 if the operation was successful, 1 otherwise.
1698
1699 rlCleanupPrepend
1700
1701 Prepends a string to the cleanup buffer and recreates the cleanup
1702 script.
1703
1704 rlCleanupPrepend string
1705
1706 Returns 0 if the operation was successful, 1 otherwise.
1707
1708 Time Performance
1709 rlPerfTime_RunsInTime
1710
1711 Measures, how many runs of some commands can be done in specified time.
1712 This approach is suitable for short-time running tasks (up to few
1713 seconds), where averaging few runs is not precise. This is done several
1714 times, and the final result is the average of all runs. It prints the
1715 number on stdout, so it has to be captured.
1716
1717 rlPerfTime_RunsInTime command [time] [runs]
1718
1719 command
1720 Command to run.
1721
1722 time
1723 Time in seconds (optional, default=30).
1724
1725 runs
1726 Number of averaged runs (optional, default=3).
1727
1728 rlPerfTime_AvgFromRuns
1729
1730 Measures the average time of running some task. This approach is
1731 suitable for long-time running tasks (tens of seconds and more), where
1732 it is precise enough. Measured runs can be preceded by dry run, which
1733 is not measured and it's purpose is to warm up various caches. It
1734 prints the number on stdout, so it has to be captured. Or, result is
1735 then stored in special rl_retval variable.
1736
1737 rlPerfTime_AvgFromRuns command [count] [warmup]
1738
1739 command
1740 Command to run.
1741
1742 count
1743 Times to run (optional, default=3).
1744
1745 warmup
1746 Warm-up run, run if this option is not "warmup" (optional,
1747 default="warmup")
1748
1749 Analyze
1750 rlDejaSum
1751
1752 TODO description
1753
1754 rlDejaSum par1 par2
1755
1756 par1
1757 TODO description
1758
1759 par2
1760 TODO description
1761
1762 Return 0 if... TODO
1763
1764 rlImport
1765
1766 Imports code provided by one or more libraries into the test namespace.
1767 The library search mechanism is based on Beaker test hierarchy system,
1768 i.e.:
1769
1770 /component/type/test-name/test-file
1771
1772 When test-file calls rlImport with 'foo/bar' parameter, the libraries
1773 are searched in following locations: these are the possible path
1774 prefixes
1775
1776 - colon-separated paths from $BEAKERLIB_LIBRARY_PATH
1777 - /mnt/tests
1778 - /usr/share/beakerlib-libraries
1779
1780 the next component of the path is one of the following:
1781
1782 - /foo/Library/bar
1783 - /foo/bar
1784 - /libs/foo/bar
1785 - /*/foo/Library/bar
1786 - /*/foo/bar
1787 - /libs/*/foo/Library/bar
1788 - /libs/*/foo/bar
1789
1790 the directory path is then constructed as prefix/path/lib.sh If the
1791 library is still not found an upwards directory traversal is used, and
1792 a check for presence of the library in the above mentioned possible
1793 paths is to be performed. This means this function needs to be called
1794 from the test hierarchy, not e.g. the /tmp directory.
1795
1796 Once library is found, it is sourced and a verifier function is called.
1797 The verifier function is cunstructed by composing the library prefix
1798 and LibraryLoaded. Library prefix must be defined in the library
1799 itself. It should be part of lib.sh header in format: '# library-
1800 prefix = <PREFIX>'. If the verifier passes the library is ready to
1801 use. Also variable <PREFIX>LibraryDir is created and it points to the
1802 library folder.
1803
1804 Usage:
1805
1806 rlImport --all
1807 rlImport LIBRARY [LIBRARY2...]
1808
1809 --all
1810 Read $BEAKERLIB_DIR/metadata.yaml or ./Makefile, pickup the library
1811 requirements and import them all.
1812
1813 LIBRARY
1814 Must have '[component/]path' or '.' format. Identifies the library
1815 to import. The dot (.) is a special case where the lib.sh from the
1816 current directory is used.
1817
1818 Returns 0 if the import of all libraries was successful. Returns non-
1819 zero if one or more library failed to import.
1820
1821 Process Synchronisation
1822 rlWaitForCmd
1823
1824 Pauses script execution until command exit status is the expeced value.
1825 Logs a WARNING and returns 1 if the command didn't exit successfully
1826 before timeout elapsed or a maximum number of invocations has been
1827 reached.
1828
1829 rlWaitForCmd command [-p PID] [-t time] [-m count] [-d delay] [-r retval]
1830
1831 command
1832 Command that will be executed until its return code is equal 0 or
1833 value speciefied as option to '-r'.
1834
1835 -t time
1836 Timeout in seconds, default=120. If the command doesn't return 0
1837 before time elapses, the command will be killed.
1838
1839 -p PID
1840 PID of the process to check before running command. If the process
1841 exits before the socket is opened, the command will log a WARNING.
1842
1843 -m count
1844 Maximum number of 'command' executions before continuing anyway.
1845 Default is infite. Returns 1 if the maximum was reached.
1846
1847 -d delay
1848 Delay between 'command' invocations. Default 1.
1849
1850 -r retval
1851 Expected return value of command. Default 0.
1852
1853 rlWaitForFile
1854
1855 Pauses script execution until specified file or directory starts
1856 existing. Returns 0 if file started existing, 1 if timeout was reached
1857 or PID exited. Return code is greater than 1 in case of error.
1858
1859 rlWaitForFile path [-p PID] [-t time] [-d delay]
1860
1861 path
1862 Path to file that should start existing.
1863
1864 -t time
1865 Timeout in seconds (optional, default=120). If the file isn't
1866 opened before the time elapses the command returns 1.
1867
1868 -p PID
1869 PID of the process that should also be running. If the process
1870 exits before the file is created, the command returns with status
1871 code of 1.
1872
1873 -d delay
1874 Delay between subsequent checks for existence of file. Default 1.
1875
1876 rlWaitForSocket
1877
1878 Pauses script execution until local socket starts listening. Returns 0
1879 if socket started listening, 1 if timeout was reached or PID exited.
1880 Return code is greater than 1 in case of error.
1881
1882 rlWaitForSocket {port|path} [-p PID] [-t time] [-d delay] [--close] [--remote]
1883
1884 port|path
1885 Network port to wait for opening or a path to UNIX socket. Regular
1886 expressions are also supported.
1887
1888 -t time
1889 Timeout in seconds (optional, default=120). If the socket isn't
1890 opened before the time elapses the command returns 1.
1891
1892 -p PID
1893 PID of the process that should also be running. If the process
1894 exits before the socket is opened, the command returns with status
1895 code of 1.
1896
1897 -d delay
1898 Delay between subsequent checks for availability of socket. Default
1899 1.
1900
1901 --close
1902 Wait for the socket to stop listening.
1903
1904 --remote
1905 Wait for the remote socket to start listening instead of local one.
1906
1907 rlWait
1908
1909 Wrapper around bash builtin 'wait' command. See bash_builtins(1) man
1910 page. Kills the process and all its children if the timeout elapses.
1911
1912 rlWaitFor [n ...] [-s SIGNAL] [-t time]
1913
1914 n List of PIDs to wait for. They need to be background tasks of
1915 current shell. See bash_builtins(1) section for 'wait' command.
1916
1917 -t time
1918 Timeout in seconds (optional, default=30). If the wait isn't
1919 successful before the time elapses then all specified tasks are
1920 killed.
1921
1922 -s SIGNAL
1923 Signal used to kill the process, optional SIGTERM by default.
1924
1925 Virtual X Server
1926 Functions providing simple way how to start and stop virtual X server.
1927
1928 rlVirtualXStart
1929
1930 Start a virtual X server on a first free display. Tries only first N
1931 displays, so you can run out of them.
1932
1933 rlVirtualXStart name [N]
1934
1935 name
1936 String identifying the X server.
1937
1938 N Maximum number of displays to try. Defaults to 3.
1939
1940 Returns 0 when the server is started successfully.
1941
1942 rlVirtualXGetDisplay
1943
1944 Get the DISPLAY variable for specified virtual X server.
1945
1946 rlVirtualXGetDisplay name
1947
1948 name
1949 String identifying the X server.
1950
1951 Displays the number of display where specified virtual X server is
1952 running to standard output. Returns 0 on success.
1953
1954 rlVirtualXStop
1955
1956 Kill the specified X server.
1957
1958 rlVirtualXStop name
1959
1960 name
1961 String identifying the X server.
1962
1963 Returns 0 when the server is stopped successfully.
1964
1965 Example
1966
1967 Below is a simple example of usage. Note that a lot of usefull
1968 debugging information is reported on the DEBUG level, so you can run
1969 your test with "DEBUG=1 make run" to get them.
1970
1971 rlVirtualXStart $TEST
1972 rlAssert0 "Virtual X server started" $?
1973 export DISPLAY="$( rlVirtualXGetDisplay $TEST )"
1974 # ...your test which needs X...
1975 rlVirtualXStop $TEST
1976 rlAssert0 "Virtual X server killed" $?
1977
1978 These are "Requires" lines for your scripts - note different package
1979 names for different RHEL versions:
1980
1981 @echo "Requires: xorg-x11-server-Xvfb" >> $(METADATA) # RHEL-5
1982 @echo "Requires: xorg-x11-Xvfb" >> $(METADATA) # RHEL-4
1983 @echo "Requires: XFree86-Xvfb" >> $(METADATA) # RHEL-3
1984
1985 rlYash_parse
1986
1987 Parse yaml data to the associative array.
1988
1989 rlYash_parse VAR_NAME YAML_DATA
1990
1991 VAR_NAME
1992 Name of the variable to which the yaml structure will be saved.
1993
1994 Note that the variable needs to be predeclared as an associative
1995 array.
1996
1997 YAML_DATA
1998 The actual yaml data.
1999
2000 Beakerlib Profiling
2001 Enable profiling
2002
2003 Set environment variable BEAKERLIB_PROFILING=1
2004
2005 BEAKERLIB_PROFILING=1 make run
2006
2007 A file /dev/shm/beakerlib_profile will be created for later processing.
2008
2009 Process the profile
2010
2011 /usr/share/beakerlib/profiling.sh process > profile.csv
2012
2014 Location of test results related output files can be configured by
2015 setting BEAKERLIB_DIR variable before running the test. If it is not
2016 set, temporary directory is created.
2017
2018 journal.txt
2019 Journal in human readable form.
2020
2021 journal.xml
2022 Journal in XML format, requires python. This dependency can be avoided
2023 if the test is run with variable BEAKERLIB_JOURNAL set to 0 in which
2024 case journal.xml is not created.
2025
2026 XSLT
2027
2028 XML journal can be transformed through XSLT template. Which template is
2029 used is configurable by setting BEAKERLIB_JOURNAL variable. Value can
2030 be either filename in which case beakerlib will try to use
2031 $INSTALL_DIR/xslt-template/$filename (e.g.:
2032 /usr/share/beakerlib/xstl-templates/xunit.xsl) or it can be path to a
2033 template anywhere on the system.
2034
2035 TestResults
2036 Overall results of the test in a 'sourceable' form. Each line contains
2037 a pair VAR=VALUE. All variable names have 'TESTRESULT_' prefix.
2038
2039 List of variables:
2040
2041 TESTRESULT_STATE
2042 Current state of the test run; possible values: started, incomplete
2043 and complete. - 'started' is set after a Journal is opened. -
2044 'incomplete' is set after a Phase is closed. - 'complete' is set
2045 after a Journal is closed.
2046
2047 TESTRESULT_RESULT_STRING
2048 Result of the test in a string, e.g.: PASS, FAIL, WARN.
2049
2050 TESTRESULT_RESULT_ECODE
2051 Result of the test as an integer, 0 equals to PASS.
2052
2053 TESTRESULT_PHASES_PASSED
2054 Number of phases that ended with PASS.
2055
2056 TESTRESULT_PHASES_FAILED
2057 Number of phases that ended with non-PASS result.
2058
2059 TESTRESULT_PHASES_SKIPPED
2060 Number of skipped phases.
2061
2062 TESTRESULT_ASSERTS_FAILED
2063 Number of asserts that ended with non-PASS result in the whole
2064 test.
2065
2066 TESTRESULT_STARTTIME
2067 Time when test started in seconds since epoch.
2068
2069 TESTRESULT_ENDTIME
2070 Time when test ended in seconds since epoch.
2071
2072 TESTRESULT_DURATION
2073 Duration of the test run in seconds.
2074
2075 TESTRESULT_BEAKERLIB_DIR
2076 Directory with test results files.
2077
2078 TESTRESULT_PHASES_FINGERPRINT
2079 A hash of all phases results which may serve as a reference result
2080 in a specific environment.
2081
2082 TESTRESULT_ASSERTS_FINGERPRINT
2083 A hash of all asserts results which may serve as a reference result
2084 in a specific environment.
2085
2087 Simple
2088 A minimal BeakerLib test can look like this:
2089
2090 . /usr/share/beakerlib/beakerlib.sh
2091
2092 rlJournalStart
2093 rlPhaseStartTest
2094 rlAssertRpm "setup"
2095 rlAssertExists "/etc/passwd"
2096 rlAssertGrep "root" "/etc/passwd"
2097 rlPhaseEnd
2098 rlJournalEnd
2099
2100 Phases
2101 Here comes a bit more interesting example of a test which sets all the
2102 recommended variables and makes use of the phases:
2103
2104 # Include the BeakerLib environment
2105 . /usr/share/beakerlib/beakerlib.sh
2106
2107 # Set the full test name
2108 TEST="/examples/beakerlib/Sanity/phases"
2109
2110 # Package being tested
2111 PACKAGE="coreutils"
2112
2113 rlJournalStart
2114 # Setup phase: Prepare test directory
2115 rlPhaseStartSetup
2116 rlAssertRpm $PACKAGE
2117 rlRun 'TmpDir=$(mktemp -d)' 0 'Creating tmp directory' # no-reboot
2118 rlRun "pushd $TmpDir"
2119 rlPhaseEnd
2120
2121 # Test phase: Testing touch, ls and rm commands
2122 rlPhaseStartTest
2123 rlRun "touch foo" 0 "Creating the foo test file"
2124 rlAssertExists "foo"
2125 rlRun "ls -l foo" 0 "Listing the foo test file"
2126 rlRun "rm foo" 0 "Removing the foo test file"
2127 rlAssertNotExists "foo"
2128 rlRun "ls -l foo" 2 "Listing foo should now report an error"
2129 rlPhaseEnd
2130
2131 # Cleanup phase: Remove test directory
2132 rlPhaseStartCleanup
2133 rlRun "popd"
2134 rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
2135 rlPhaseEnd
2136 rlJournalEnd
2137
2138 # Print the test report
2139 rlJournalPrintText
2140
2141 The ouput of the rlJournalPrintText command would produce an output
2142 similar to the following:
2143
2144 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2145 :: TEST PROTOCOL
2146 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2147
2148 Package : coreutils
2149 Installed : coreutils-8.27-19.fc27.x86_64
2150 beakerlib RPM : beakerlib-1.17-6.fc27.noarch
2151 Test started : 2018-02-08 15:43:03 CET
2152 Test finished : 2018-02-08 15:43:04 CET
2153 Test duration : 1 seconds
2154 Test name : /examples/beakerlib/Sanity/phases
2155 Distro : Fedora release 27 (Twenty Seven)
2156 Hostname : localhost
2157 Architecture : x86_64
2158 CPUs : 4 x Intel Core Processor (Skylake)
2159 RAM size : 1992 MB
2160 HDD size : 17.55 GB
2161
2162 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2163 :: Test description
2164 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2165
2166 PURPOSE of /examples/beakerlib/Sanity/phases
2167 Description: Testing BeakerLib phases
2168 Author: Petr Splichal <psplicha@redhat.com>
2169
2170 This example shows how the phases work in the BeakerLib on a
2171 trivial smoke test for the "touch", "ls" and "rm" commands from
2172 the coreutils package.
2173
2174
2175
2176 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2177 :: Setup
2178 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2179
2180 :: [ 15:43:03 ] :: [ PASS ] :: Checking for the presence of coreutils rpm
2181 :: [ 15:43:03 ] :: [ LOG ] :: Package versions:
2182 :: [ 15:43:03 ] :: [ LOG ] :: coreutils-8.27-19.fc27.x86_64
2183 :: [ 15:43:03 ] :: [ PASS ] :: Creating tmp directory (Expected 0, got 0)
2184 :: [ 15:43:03 ] :: [ PASS ] :: Command 'pushd /tmp/tmp.MMQf7dj9QV' (Expected 0, got 0)
2185 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2186 :: Duration: 1s
2187 :: Assertions: 3 good, 0 bad
2188 :: RESULT: PASS
2189
2190
2191 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2192 :: Test
2193 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2194
2195 :: [ 15:43:04 ] :: [ PASS ] :: Creating the foo test file (Expected 0, got 0)
2196 :: [ 15:43:04 ] :: [ PASS ] :: File foo should exist
2197 :: [ 15:43:04 ] :: [ PASS ] :: Listing the foo test file (Expected 0, got 0)
2198 :: [ 15:43:04 ] :: [ PASS ] :: Removing the foo test file (Expected 0, got 0)
2199 :: [ 15:43:04 ] :: [ PASS ] :: File foo should not exist
2200 :: [ 15:43:04 ] :: [ PASS ] :: Listing foo should now report an error (Expected 2, got 2)
2201 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2202 :: Duration: 0s
2203 :: Assertions: 6 good, 0 bad
2204 :: RESULT: PASS
2205
2206
2207 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2208 :: Cleanup
2209 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2210
2211 :: [ 15:43:04 ] :: [ PASS ] :: Command 'popd' (Expected 0, got 0)
2212 :: [ 15:43:04 ] :: [ PASS ] :: Removing tmp directory (Expected 0, got 0)
2213 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2214 :: Duration: 0s
2215 :: Assertions: 2 good, 0 bad
2216 :: RESULT: PASS
2217
2218
2219 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2220 :: /examples/beakerlib/Sanity/phases
2221 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2222
2223 :: [ 15:43:04 ] :: [ LOG ] :: Phases fingerprint: ZmU1NmJ
2224 :: [ 15:43:04 ] :: [ LOG ] :: Asserts fingerprint: YTBiZDE
2225 :: [ 15:43:04 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-pRiJfWE/journal.xml
2226 :: [ 15:43:04 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-pRiJfWE/journal.txt
2227 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2228 :: Duration: 1s
2229 :: Phases: 3 good, 0 bad
2230 :: OVERALL RESULT: PASS
2231
2232 Note that the detailed test description is read from a separate file
2233 PURPOSE placed in the same directory as the test itself.
2234
2235 A lot of useful debugging information is reported on the DEBUG level.
2236 You can run your test with "DEBUG=1 make run" to get them.
2237
2238 Verbosity of the test logging may be altered also by setting the
2239 LOG_LEVEL variable. Possible values are "ERROR", "WARNING", "INFO" and
2240 "DEBUG". You will see messages like the ones below.
2241
2242 :: [ WARNING ] :: rlGetArch: Update test to use rlGetPrimaryArch/rlGetSecondaryArch
2243 :: [ DEBUG ] :: rlGetArch: This is architecture 'x86_64'
2244 :: [ ERROR ] :: this function was dropped as its development is completely moved to the beaker library
2245 :: [ INFO ] :: if you realy on this function and you really need to have it present in core beakerlib, file a RFE, please
2246
2247 Setting LOG_LEVEL="DEBUG" is equivalent to DEBUG=1.
2248
2249 Set DEBUG_TO_CONSOLE_ONLY=1 in conjuction with DEBUG=1 to avoid storing
2250 debug messages in journal. This also speeds up the execution in debug
2251 mode as those messages are not fully processed than.
2252
2254 Description
2255 Bkrdoc is a documentation generator from tests written using
2256 BeakerLib library. This generator makes documentation from test
2257 code with and also without any documentation markup.
2258
2259 What it's good for
2260 For fast, brief and reliable documentation creation. It`s good for
2261 quick start with unknown BeakerLib test. Created documentations
2262 provides information about the documentation credibility. Also
2263 created documentations shows environmental variables and helps
2264 reader to run test script from which was documentation created.
2265
2266 Bkrdoc project page
2267 https://github.com/rh-lab-q/bkrdoc
2268
2270 Project Page
2271 https://github.com/beakerlib/beakerlib
2272
2273 Manual
2274 https://github.com/beakerlib/beakerlib/wiki/man
2275
2276 Issues list
2277 https://bugzilla.redhat.com/buglist.cgi?component=beakerlib&&order=bug_status%2Cassigned_to%2Cpriority
2278
2279 https://github.com/beakerlib/beakerlib/issues
2280
2281 Reporting issues
2282 https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=beakerlib
2283
2284 https://github.com/beakerlib/beakerlib/issues/new
2285
2287 • Petr Muller <pmuller@redhat.com>
2288
2289 • Ondrej Hudlicky <ohudlick@redhat.com>
2290
2291 • Jan Hutar <jhutar@redhat.com>
2292
2293 • Petr Splichal <psplicha@redhat.com>
2294
2295 • Ales Zelinka <azelinka@redhat.com>
2296
2297 • Dalibor Pospisil <dapospis@redhat.com>
2298
2299 • Martin Kyral <mkyral@redhat.com>
2300
2301 • Jakub Prokes <jprokes@redhat.com>
2302
2303 • Jakub Heger <jheger@redhat.com>
2304
2305
2306
2307perl v5.36.0 2022-10-20 BEAKERLIB(1)