From 0999921fe34b27200a145814c213645f5efcccab Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Tue, 8 Sep 2020 14:03:23 -0700 Subject: [PATCH] Tweak detection of installed update packages Previously we were relying on `rpm -q` always outputting the right package last. We saw some test failures on recent kernel updates, e.g. https://openqa.fedoraproject.org/tests/658768 , which indicate this isn't always the case; there the 'right' package was second of three for kernel, third of three for kernel-core and first of three for kernel-modules. So we need to make it more robust. This uses an additional call: `rpm -q $pkg --last | head -1` to find the most recent package, if there are more than one; this should always be the right one, I hope. Note we cannot just add `--last` to the `rpm -q --qf...` call because the output when you do that is weird; you get the output you'd get if you just called `rpm -q --last` first, and *then* the query-formatted output afterwards (though with the modified order as expected). There doesn't seem to be any way to get only the latter. I also tweaked the log uploading so we always upload the working logs even when the test passes; it can't hurt anything and it is sometimes useful to have them. Signed-off-by: Adam Williamson --- lib/utils.pm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/utils.pm b/lib/utils.pm index 1a2b8e21..da350bde 100644 --- a/lib/utils.pm +++ b/lib/utils.pm @@ -944,22 +944,23 @@ sub advisory_check_nonmatching_packages { # versions installed after the update; I'm hoping the last line of output # for any given package is the most recent version, i.e. the one in the # update. - script_run 'for pkg in $(cat /var/log/updatepkgnames.txt); do rpm -q $pkg && rpm -q $pkg --qf "%{SOURCERPM} %{EPOCH} %{NAME}-%{VERSION}-%{RELEASE}\n" | tail -1 >> /tmp/installedupdatepkgs.txt; done'; + script_run 'for pkg in $(cat /var/log/updatepkgnames.txt); do rpm -q $pkg && rpm -q $pkg --last | head -1 | cut -d" " -f1 | xargs rpm -q --qf "%{SOURCERPM} %{EPOCH} %{NAME}-%{VERSION}-%{RELEASE}\n" >> /tmp/installedupdatepkgs.txt; done'; script_run 'sort -u -o /tmp/installedupdatepkgs.txt /tmp/installedupdatepkgs.txt'; + # for debugging, may as well always upload these, can't hurt anything + upload_logs "/tmp/installedupdatepkgs.txt", failok=>1; + upload_logs "/var/log/updatepkgs.txt", failok=>1; # if any line appears in installedupdatepkgs.txt but not updatepkgs.txt, # we have a problem. if (script_run 'comm -23 /tmp/installedupdatepkgs.txt /var/log/updatepkgs.txt > /var/log/installednotupdatedpkgs.txt') { # occasionally, for some reason, it's unhappy about sorting; - # we shouldn't fail the test in this case, just upload the - # files so we can see why... - upload_logs "/tmp/installedupdatepkgs.txt", failok=>1; - upload_logs "/var/log/updatepkgs.txt", failok=>1; + # we shouldn't fail the test in this case, just make a note + # of it so we can look why... + diag "Installed vs. all update package comparison unexpectedly returned non-zero!"; } # this exits 1 if the file is zero-length, 0 if it's longer # if it's 0, that's *BAD*: we want to upload the file and fail unless (script_run 'test -s /var/log/installednotupdatedpkgs.txt') { upload_logs "/var/log/installednotupdatedpkgs.txt", failok=>1; - upload_logs "/var/log/updatepkgs.txt", failok=>1; my $message = "Package(s) from update not installed when it should have been! See installednotupdatedpkgs.txt"; if ($args{fatal}) { set_var("_ACNMP_DONE", "1");