aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-01-14 11:07:42 +0100
committerMartin Polden <mpolden@mpolden.no>2021-01-14 13:34:24 +0100
commit1f9701dfedda7283e151fed7498dcd45d3be0ea6 (patch)
treed8fcebc45ecc1daad0a847aa9b41009cba1dc2ef /node-admin
parentd10b22fc5c8cddffe976706994660e040c90eb39 (diff)
Handle Yum 4 no-op messages
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/Yum.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java12
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java30
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
+
+}