diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-01-14 11:07:42 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-01-14 13:34:24 +0100 |
commit | 1f9701dfedda7283e151fed7498dcd45d3be0ea6 (patch) | |
tree | d8fcebc45ecc1daad0a847aa9b41009cba1dc2ef /node-admin | |
parent | d10b22fc5c8cddffe976706994660e040c90eb39 (diff) |
Handle Yum 4 no-op messages
Diffstat (limited to 'node-admin')
3 files changed, 38 insertions, 10 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/Yum.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/Yum.java index 27054f6ed01..ecde05af57a 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/Yum.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/Yum.java @@ -21,9 +21,9 @@ import static com.yahoo.vespa.hosted.node.admin.task.util.yum.YumCommand.Install */ public class Yum { // Note: "(?dm)" makes newline be \n (only), and enables multiline mode where ^$ match lines with find() - private static final Pattern INSTALL_NOOP_PATTERN = Pattern.compile("(?dm)^Nothing to do$"); + private static final Pattern INSTALL_NOOP_PATTERN = Pattern.compile("(?dm)^Nothing to do\\.?$"); private static final Pattern UPGRADE_NOOP_PATTERN = Pattern.compile("(?dm)^No packages marked for update$"); - private static final Pattern REMOVE_NOOP_PATTERN = Pattern.compile("(?dm)^No Packages marked for removal$"); + private static final Pattern REMOVE_NOOP_PATTERN = Pattern.compile("(?dm)^No [pP]ackages marked for removal\\.?$"); // WARNING: These must be in the same order as the supplier below @@ -78,7 +78,7 @@ public class Yum { public GenericYumCommand upgrade(YumPackageName... packages) { - return new GenericYumCommand(terminal, "upgrade", List.of(packages), UPGRADE_NOOP_PATTERN); + return new GenericYumCommand(terminal, "upgrade", List.of(packages), INSTALL_NOOP_PATTERN, UPGRADE_NOOP_PATTERN); } public GenericYumCommand upgrade(String package1, String... packages) { diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java index 7b543304e6e..0cc0e256c54 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java @@ -40,15 +40,15 @@ public abstract class YumCommand<T extends YumCommand<T>> { private final Terminal terminal; private final String yumCommand; - private final Pattern commandOutputNoopPattern; + private final List<Pattern> outputNoopPatterns; private final List<YumPackageName> packages; private final List<String> options = new ArrayList<>(); - GenericYumCommand(Terminal terminal, String yumCommand, List<YumPackageName> packages, Pattern commandOutputNoopPattern) { + GenericYumCommand(Terminal terminal, String yumCommand, List<YumPackageName> packages, Pattern... outputNoopPatterns) { this.terminal = terminal; this.yumCommand = yumCommand; this.packages = packages; - this.commandOutputNoopPattern = commandOutputNoopPattern; + this.outputNoopPatterns = List.of(outputNoopPatterns); switch (yumCommand) { case "install": { @@ -89,7 +89,7 @@ public abstract class YumCommand<T extends YumCommand<T>> { // Therefore, run the command and parse the output to decide. boolean modifiedSystem = commandLine .executeSilently() - .mapOutput(this::mapOutput); + .mapOutput(this::packageChanged); if (modifiedSystem) { commandLine.recordSilentExecutionAsSystemModification(); @@ -98,13 +98,13 @@ public abstract class YumCommand<T extends YumCommand<T>> { return modifiedSystem; } - private boolean mapOutput(String output) { + private boolean packageChanged(String output) { Matcher unknownPackageMatcher = UNKNOWN_PACKAGE_PATTERN.matcher(output); if (unknownPackageMatcher.find()) { throw new IllegalArgumentException("Unknown package: " + unknownPackageMatcher.group(1)); } - return !commandOutputNoopPattern.matcher(output).find(); + return outputNoopPatterns.stream().noneMatch(pattern -> pattern.matcher(output).find()); } protected GenericYumCommand getThis() { return this; } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java index dc9c036b96b..8c14ceb3c76 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java @@ -83,6 +83,15 @@ public class YumTest { .install("package-1", "package-2") .enableRepo("repo1", "repo2") .converge(taskContext)); + + // RHEL 8 + terminal.expectCommand( + "yum install --assumeyes --enablerepo=repo1 --enablerepo=repo2 --setopt skip_missing_names_on_install=False package-1 package-2 2>&1", + 0, + "foobar\nNothing to do.\n"); // Note trailing dot + assertFalse(yum.install("package-1", "package-2") + .enableRepo("repo1", "repo2") + .converge(taskContext)); } @Test @@ -95,6 +104,15 @@ public class YumTest { assertFalse(yum .upgrade("package-1", "package-2") .converge(taskContext)); + + // RHEL 8 + terminal.expectCommand( + "yum upgrade --assumeyes --setopt skip_missing_names_on_update=False package-1 package-2 2>&1", + 0, + "foobar\nNothing to do.\n"); // Same message as yum install no-op + + assertFalse(yum.upgrade("package-1", "package-2") + .converge(taskContext)); } @Test @@ -107,6 +125,15 @@ public class YumTest { assertFalse(yum .remove("package-1", "package-2") .converge(taskContext)); + + // RHEL 8 + terminal.expectCommand( + "yum remove --assumeyes package-1 package-2 2>&1", + 0, + "foobar\nNo packages marked for removal.\n"); // Different output + + assertFalse(yum.remove("package-1", "package-2") + .converge(taskContext)); } @Test @@ -253,4 +280,5 @@ public class YumTest { yum.upgrade().converge(taskContext); } -}
\ No newline at end of file + +} |