os-autoinst-distri-rocky/lib/anacondatest.pm

140 lines
5.3 KiB
Perl
Raw Permalink Normal View History

package anacondatest;
use strict;
use base 'basetest';
2015-02-13 14:08:29 +00:00
# base class for all Anaconda (installation) tests
# should be used in tests where Anaconda is running - when it makes sense
# to upload Anaconda logs when something fails. Many tests using this as a
# base likely will also want to `use anaconda` for commonly-used functions.
2015-02-13 14:08:29 +00:00
use testapi;
use utils;
2015-02-13 14:08:29 +00:00
sub post_fail_hook {
my $self = shift;
anaconda crash reporting: update needles, click Report again Summary: First off, this revises the anaconda crash handling needles a bit. We ditch gtk3195 and update anaconda_error to reflect current F24/Rawhide. We keep the old anaconda_error around for now as anaconda_error-23, to handle crashes in the F23 two-week Atomic nightlies. We also add an 'early' variant, which is for when (I think) the installer crashes very early, before it's loaded in GTK+ settings; when that happens, the dialog uses a different font. The screenshot comes from a recent Rawhide test that crashed. We also restore the anaconda `post_fail_hook` code to click the Report button when a crash happens. This was erroneously removed in D637. Before the Report button is clicked, the `anaconda-tb` file exists but the libreport stuff in `/var/tmp` does not. By removing this, we lost the libreport bits from the uploaded files, which makes it harder to report crashes. So let's add it back. Finally we fix the actual tarring and uploading of `/var/tmp`; also in D637 this got broken because it was being tarred up in whatever directory the commands happened to be running in, but we were still trying to upload it from `/var/tmp`. https://openqa.stg.fedoraproject.org/tests/8444 was run with these changes, and has `/var/tmp` correctly uploaded. Test Plan: Run some test that crashes, make sure the crash handling all works correctly. Reviewers: jskladan, garretraziel Reviewed By: garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D768
2016-03-08 16:10:51 +00:00
# if error dialog is shown, click "report" - it then creates directory structure for ABRT
my $has_traceback = 0;
if (check_screen "anaconda_error_report", 10) {
anaconda crash reporting: update needles, click Report again Summary: First off, this revises the anaconda crash handling needles a bit. We ditch gtk3195 and update anaconda_error to reflect current F24/Rawhide. We keep the old anaconda_error around for now as anaconda_error-23, to handle crashes in the F23 two-week Atomic nightlies. We also add an 'early' variant, which is for when (I think) the installer crashes very early, before it's loaded in GTK+ settings; when that happens, the dialog uses a different font. The screenshot comes from a recent Rawhide test that crashed. We also restore the anaconda `post_fail_hook` code to click the Report button when a crash happens. This was erroneously removed in D637. Before the Report button is clicked, the `anaconda-tb` file exists but the libreport stuff in `/var/tmp` does not. By removing this, we lost the libreport bits from the uploaded files, which makes it harder to report crashes. So let's add it back. Finally we fix the actual tarring and uploading of `/var/tmp`; also in D637 this got broken because it was being tarred up in whatever directory the commands happened to be running in, but we were still trying to upload it from `/var/tmp`. https://openqa.stg.fedoraproject.org/tests/8444 was run with these changes, and has `/var/tmp` correctly uploaded. Test Plan: Run some test that crashes, make sure the crash handling all works correctly. Reviewers: jskladan, garretraziel Reviewed By: garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D768
2016-03-08 16:10:51 +00:00
assert_and_click "anaconda_error_report";
$has_traceback = 1;
} elsif (check_screen "anaconda_text_error", 10) { # also for text install
type_string "1\n";
$has_traceback = 1;
}
save_screenshot;
$self->root_console();
# if we're in dracut, do things different
my $dracut = 0;
if (check_screen "root_console_dracut", 0) {
$dracut = 1;
script_run "dhclient";
}
# if we don't have tar or a network connection, we'll try and at
# least send out *some* kinda info via the serial line
my $hostip = testapi::host_ip();
if (script_run "ping -c 2 ${hostip}") {
if ($dracut) {
script_run 'printf "\n** RDSOSREPORT **\n" > /dev/' . $serialdev;
script_run "cat /run/initramfs/rdsosreport.txt > /dev/${serialdev}";
return;
}
script_run 'printf "\n** IP ADDR **\n" > /dev/' . $serialdev;
script_run "ip addr > /dev/${serialdev} 2>&1";
script_run 'printf "\n** IP ROUTE **\n" > /dev/' . $serialdev;
script_run "ip route > /dev/${serialdev} 2>&1";
script_run 'printf "\n** NETWORKMANAGER.SERVICE STATUS **\n" > /dev/' . $serialdev;
script_run "systemctl --no-pager -l status NetworkManager.service > /dev/${serialdev} 2>&1";
script_run 'printf "\n** X.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/X.log > /dev/${serialdev}";
script_run 'printf "\n** ANACONDA.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/anaconda.log > /dev/${serialdev}";
script_run 'printf "\n** PACKAGING.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/packaging.log > /dev/${serialdev}";
script_run 'printf "\n** STORAGE.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/storage.log > /dev/${serialdev}";
script_run 'printf "\n** SYSLOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/syslog > /dev/${serialdev}";
script_run 'printf "\n** PROGRAM.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/program.log > /dev/${serialdev}";
script_run 'printf "\n** DNF.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/dnf.log > /dev/${serialdev}";
script_run 'printf "\n** DNF.LIBREPO.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/dnf.librepo.log > /dev/${serialdev}";
script_run 'printf "\n** DNF.RPM.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/dnf.rpm.log > /dev/${serialdev}";
script_run 'printf "\n** DBUS.LOG **\n" > /dev/' . $serialdev;
script_run "cat /tmp/dbus.log > /dev/${serialdev}";
return;
}
if ($dracut) {
upload_logs "/run/initramfs/rdsosreport.txt", failok => 1;
# that's all that's really useful, so...
return;
}
upload_logs "/tmp/X.log", failok => 1;
upload_logs "/tmp/anaconda.log", failok => 1;
upload_logs "/tmp/packaging.log", failok => 1;
upload_logs "/tmp/storage.log", failok => 1;
upload_logs "/tmp/syslog", failok => 1;
upload_logs "/tmp/program.log", failok => 1;
upload_logs "/tmp/dnf.log", failok => 1;
upload_logs "/tmp/dnf.librepo.log", failok => 1;
upload_logs "/tmp/dnf.rpm.log", failok => 1;
upload_logs "/tmp/dbus.log", failok => 1;
if ($has_traceback) {
# Upload Anaconda traceback logs
script_run "tar czf /tmp/anaconda_tb.tar.gz /tmp/anaconda-tb-*";
upload_logs "/tmp/anaconda_tb.tar.gz";
}
2015-02-19 15:55:29 +00:00
# Upload all ABRT logs (if there are any)
unless (script_run 'test -n "$(ls -A /var/tmp)" && tar czf /var/tmp/var_tmp.tar.gz /var/tmp') {
upload_logs "/var/tmp/var_tmp.tar.gz";
}
# Upload /var/log
unless (script_run "tar czf /tmp/var_log.tar.gz /var/log") {
upload_logs "/tmp/var_log.tar.gz";
}
# Upload anaconda core dump, if there is one
unless (script_run "ls /tmp/anaconda.core.* && tar czf /tmp/anaconda.core.tar.gz /tmp/anaconda.core.*") {
upload_logs "/tmp/anaconda.core.tar.gz";
}
2015-02-13 14:08:29 +00:00
}
create fedora base class, factor out console login Summary: Root console in anaconda got broken by RHBZ #1222413 - no shell on tty2. Decided to clean up console use in general as part of fixing it. This creates a class 'fedorabase' and has 'anacondalog' and 'fedoralog' both inherit from it. boot_to_login_screen is moved there (as it seems appropriate) and it has a new method, console_login, which basically handles 'get me a shell on a console': if we're already at one it returns, if not it'll type the user name and the password *if necessary* (sometimes it's not) and return once it sees a prompt. It takes a hash of named parameters for user, password and 'check', which is whether it should die if it fails to reach a console or not (some users don't want it to). anacondalog and fedoralog both get 'root_console' methods which do something appropriate and then call console_login; both have a hash of named parameters, anacondalog's version only bothers with 'check', while fedoralog's also accepts 'tty' to pick the tty to use. This also adjusts all things which try to get to a console prompt to use either root_console or console_login as appropriate. It also tweaks the needle tags a bit, drops some unneeded needles, and adds a new 'user console prompt' needle; we really just need two versions of the root prompt needle and two of the user prompt needle (one for <F23, one for F23+ - the console font changed in F23, and the @ character at least doesn't match between the two). I think we still need the <F23 case for upgrade tests, for now. Test Plan: Do a full test run and see that more tests succeed. I've done a run on happyassassin with a hack to workaround the SELinux issue for interactive installs, and the results look good. I also fiddled about a bit to test some different cases, like forcing a failure in a live test to test post_fail_hook (and hence root_console) in that scenario, and forcing failures after some console commands had been run to check that it DTRT when we've already reached a console, etc. Reviewers: jskladan, garretraziel Reviewed By: jskladan, garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D462
2015-07-22 18:24:40 +00:00
sub root_console {
# Switch to an appropriate TTY and log in as root.
create fedora base class, factor out console login Summary: Root console in anaconda got broken by RHBZ #1222413 - no shell on tty2. Decided to clean up console use in general as part of fixing it. This creates a class 'fedorabase' and has 'anacondalog' and 'fedoralog' both inherit from it. boot_to_login_screen is moved there (as it seems appropriate) and it has a new method, console_login, which basically handles 'get me a shell on a console': if we're already at one it returns, if not it'll type the user name and the password *if necessary* (sometimes it's not) and return once it sees a prompt. It takes a hash of named parameters for user, password and 'check', which is whether it should die if it fails to reach a console or not (some users don't want it to). anacondalog and fedoralog both get 'root_console' methods which do something appropriate and then call console_login; both have a hash of named parameters, anacondalog's version only bothers with 'check', while fedoralog's also accepts 'tty' to pick the tty to use. This also adjusts all things which try to get to a console prompt to use either root_console or console_login as appropriate. It also tweaks the needle tags a bit, drops some unneeded needles, and adds a new 'user console prompt' needle; we really just need two versions of the root prompt needle and two of the user prompt needle (one for <F23, one for F23+ - the console font changed in F23, and the @ character at least doesn't match between the two). I think we still need the <F23 case for upgrade tests, for now. Test Plan: Do a full test run and see that more tests succeed. I've done a run on happyassassin with a hack to workaround the SELinux issue for interactive installs, and the results look good. I also fiddled about a bit to test some different cases, like forcing a failure in a live test to test post_fail_hook (and hence root_console) in that scenario, and forcing failures after some console commands had been run to check that it DTRT when we've already reached a console, etc. Reviewers: jskladan, garretraziel Reviewed By: jskladan, garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D462
2015-07-22 18:24:40 +00:00
my $self = shift;
my %args = (
# 0 means use console_login's default, non-zero values
# passed to console_login
timeout => 0,
create fedora base class, factor out console login Summary: Root console in anaconda got broken by RHBZ #1222413 - no shell on tty2. Decided to clean up console use in general as part of fixing it. This creates a class 'fedorabase' and has 'anacondalog' and 'fedoralog' both inherit from it. boot_to_login_screen is moved there (as it seems appropriate) and it has a new method, console_login, which basically handles 'get me a shell on a console': if we're already at one it returns, if not it'll type the user name and the password *if necessary* (sometimes it's not) and return once it sees a prompt. It takes a hash of named parameters for user, password and 'check', which is whether it should die if it fails to reach a console or not (some users don't want it to). anacondalog and fedoralog both get 'root_console' methods which do something appropriate and then call console_login; both have a hash of named parameters, anacondalog's version only bothers with 'check', while fedoralog's also accepts 'tty' to pick the tty to use. This also adjusts all things which try to get to a console prompt to use either root_console or console_login as appropriate. It also tweaks the needle tags a bit, drops some unneeded needles, and adds a new 'user console prompt' needle; we really just need two versions of the root prompt needle and two of the user prompt needle (one for <F23, one for F23+ - the console font changed in F23, and the @ character at least doesn't match between the two). I think we still need the <F23 case for upgrade tests, for now. Test Plan: Do a full test run and see that more tests succeed. I've done a run on happyassassin with a hack to workaround the SELinux issue for interactive installs, and the results look good. I also fiddled about a bit to test some different cases, like forcing a failure in a live test to test post_fail_hook (and hence root_console) in that scenario, and forcing failures after some console commands had been run to check that it DTRT when we've already reached a console, etc. Reviewers: jskladan, garretraziel Reviewed By: jskladan, garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D462
2015-07-22 18:24:40 +00:00
@_);
if (get_var("SERIAL_CONSOLE")) {
# select first virtio terminal, we rely on anaconda having run
# a root shell on it for us
select_console("virtio-console");
# as we don't have any live image serial install tests, we
# know we don't need to login
return;
}
else {
# tty3 has a shell on all f31+ installer and live images
send_key "ctrl-alt-f3";
}
console_login(user => "root", timeout => $args{timeout});
create fedora base class, factor out console login Summary: Root console in anaconda got broken by RHBZ #1222413 - no shell on tty2. Decided to clean up console use in general as part of fixing it. This creates a class 'fedorabase' and has 'anacondalog' and 'fedoralog' both inherit from it. boot_to_login_screen is moved there (as it seems appropriate) and it has a new method, console_login, which basically handles 'get me a shell on a console': if we're already at one it returns, if not it'll type the user name and the password *if necessary* (sometimes it's not) and return once it sees a prompt. It takes a hash of named parameters for user, password and 'check', which is whether it should die if it fails to reach a console or not (some users don't want it to). anacondalog and fedoralog both get 'root_console' methods which do something appropriate and then call console_login; both have a hash of named parameters, anacondalog's version only bothers with 'check', while fedoralog's also accepts 'tty' to pick the tty to use. This also adjusts all things which try to get to a console prompt to use either root_console or console_login as appropriate. It also tweaks the needle tags a bit, drops some unneeded needles, and adds a new 'user console prompt' needle; we really just need two versions of the root prompt needle and two of the user prompt needle (one for <F23, one for F23+ - the console font changed in F23, and the @ character at least doesn't match between the two). I think we still need the <F23 case for upgrade tests, for now. Test Plan: Do a full test run and see that more tests succeed. I've done a run on happyassassin with a hack to workaround the SELinux issue for interactive installs, and the results look good. I also fiddled about a bit to test some different cases, like forcing a failure in a live test to test post_fail_hook (and hence root_console) in that scenario, and forcing failures after some console commands had been run to check that it DTRT when we've already reached a console, etc. Reviewers: jskladan, garretraziel Reviewed By: jskladan, garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D462
2015-07-22 18:24:40 +00:00
}
2015-02-13 14:08:29 +00:00
1;
# vim: set sw=4 et: