summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-07-06 14:07:55 +0200
committerMartin Polden <mpolden@mpolden.no>2021-07-06 14:08:06 +0200
commitd3762db8b33262efc8c5929ff91c231a007a6dd5 (patch)
treec6eaaa192b78a01b474b53f66028d90c559b8df3 /node-admin
parent8c8b129ad285bf36a7cc660c1d62f2410bfacd0d (diff)
Remove support for multiple Yum versions
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumCommand.java27
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageName.java11
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTester.java27
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumVersion.java25
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageNameTest.java10
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTest.java68
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTesterTest.java2
7 files changed, 18 insertions, 152 deletions
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 2a01a5ebcb4..ba9ba80ccb7 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
@@ -1,7 +1,6 @@
// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.task.util.yum;
-import com.yahoo.component.Version;
import com.yahoo.vespa.hosted.node.admin.component.TaskContext;
import com.yahoo.vespa.hosted.node.admin.task.util.process.CommandLine;
import com.yahoo.vespa.hosted.node.admin.task.util.process.CommandResult;
@@ -57,16 +56,6 @@ public abstract class YumCommand<T extends YumCommand<T>> {
public abstract boolean converge(TaskContext context);
- /** Returns the version of Yum itself */
- protected final Version version(TaskContext context) {
- return terminal.newCommandLine(context).add("yum", "--version")
- .executeSilently()
- .getOutputLinesStream()
- .findFirst()
- .map(Version::fromString).orElseThrow(() -> new IllegalStateException("Failed to detect Yum version"));
- }
-
-
public static class GenericYumCommand extends YumCommand<GenericYumCommand> {
private static final Pattern UNKNOWN_PACKAGE_PATTERN = Pattern.compile("(?dm)^No package ([^ ]+) available\\.$");
@@ -111,11 +100,10 @@ public abstract class YumCommand<T extends YumCommand<T>> {
if (yumCommand == CommandType.remove)
if (packages.stream().noneMatch(pkg -> isInstalled(context, pkg))) return false;
- Version yumVersion = version(context);
CommandLine commandLine = terminal.newCommandLine(context);
commandLine.add("yum", yumCommand.name());
addParametersToCommandLine(commandLine);
- commandLine.add(packages.stream().map(pkg -> pkg.toName(yumVersion)).collect(Collectors.toList()));
+ commandLine.add(packages.stream().map(pkg -> pkg.toName()).collect(Collectors.toList()));
// There's no way to figure out whether a yum command would have been a no-op.
// Therefore, run the command and parse the output to decide.
@@ -168,15 +156,10 @@ public abstract class YumCommand<T extends YumCommand<T>> {
@Override
public boolean converge(TaskContext context) {
- Version yumVersion = version(context);
- String targetVersionLockName = yumPackage.toVersionLockName(yumVersion);
+ String targetVersionLockName = yumPackage.toVersionLockName();
List<String> command = new ArrayList<>(4);
command.add("yum");
- // Using --quiet on Yum 4 always results in an empty list, even if locks exist...
- if (yumVersion.getMajor() < 4) {
- command.add("--quiet");
- }
command.add("versionlock");
command.add("list");
@@ -193,7 +176,7 @@ public abstract class YumCommand<T extends YumCommand<T>> {
if (packageName.getName().equals(yumPackage.getName())) {
// If existing lock doesn't exactly match the full package name,
// it means it's locked to another version and we must remove that lock.
- String versionLockName = packageName.toVersionLockName(yumVersion);
+ String versionLockName = packageName.toVersionLockName();
if (versionLockName.equals(targetVersionLockName)) {
return true;
} else {
@@ -231,7 +214,7 @@ public abstract class YumCommand<T extends YumCommand<T>> {
var installCommand = terminal.newCommandLine(context).add("yum", "install");
addParametersToCommandLine(installCommand);
- installCommand.add(yumPackage.toName(yumVersion));
+ installCommand.add(yumPackage.toName());
String output = installCommand.executeSilently().getUntrimmedOutput();
@@ -240,7 +223,7 @@ public abstract class YumCommand<T extends YumCommand<T>> {
// case 3.
var upgradeCommand = terminal.newCommandLine(context).add("yum", "downgrade");
addParametersToCommandLine(upgradeCommand);
- upgradeCommand.add(yumPackage.toName(yumVersion)).execute();
+ upgradeCommand.add(yumPackage.toName()).execute();
modified = true;
} else {
// case 2.
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageName.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageName.java
index abe5dc1cbb3..57e52a9581f 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageName.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageName.java
@@ -2,7 +2,6 @@
package com.yahoo.vespa.hosted.node.admin.task.util.yum;
import com.google.common.base.Strings;
-import com.yahoo.component.Version;
import java.util.Arrays;
import java.util.Objects;
@@ -79,8 +78,8 @@ public class YumPackageName {
*
* <p>WARNING: Should only be invoked if the YUM package actually has an epoch. Typically
* YUM packages doesn't have one explicitly set, and in case "0" will be used with
- * {@link #toVersionLockName(Version)} (otherwise it fails), but it will be absent from an
- * install with {@link #toName(Version)} (otherwise it fails). This typically means that
+ * {@link #toVersionLockName()} (otherwise it fails), but it will be absent from an
+ * install with {@link #toName()} (otherwise it fails). This typically means that
* you should set this only if the epoch is != "0".</p>
*/
public Builder setEpoch(String epoch) { this.epoch = Optional.of(epoch); return this; }
@@ -229,7 +228,7 @@ public class YumPackageName {
public Optional<String> getArchitecture() { return architecture; }
/** Return package name, omitting components that are not specified. */
- public String toName(Version yumVersion) {
+ public String toName() {
StringBuilder builder = new StringBuilder();
boolean isBare = version.isEmpty() && release.isEmpty() && architecture.isEmpty();
char nextDelimiter;
@@ -249,7 +248,7 @@ public class YumPackageName {
*
* @throws IllegalStateException if any field required for the version lock spec is missing
*/
- public String toVersionLockName(Version yumVersion) {
+ public String toVersionLockName() {
Builder b = new Builder(this).setArchitecture("*");
if (epoch.isEmpty()) {
b.setEpoch("0");
@@ -257,7 +256,7 @@ public class YumPackageName {
YumPackageName lockSpec = b.build();
if (lockSpec.getVersion().isEmpty()) throw new IllegalStateException("Version is missing for YUM package " + name);
if (lockSpec.getRelease().isEmpty()) throw new IllegalStateException("Release is missing for YUM package " + name);
- return lockSpec.toName(yumVersion);
+ return lockSpec.toName();
}
public boolean isSubsetOf(YumPackageName other) {
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTester.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTester.java
index a73f5d04704..e48a0fa2683 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTester.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTester.java
@@ -1,7 +1,6 @@
// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.task.util.yum;
-import com.yahoo.component.Version;
import com.yahoo.vespa.hosted.node.admin.task.util.process.TestChildProcess2;
import com.yahoo.vespa.hosted.node.admin.task.util.process.TestTerminal;
@@ -17,20 +16,10 @@ import java.util.stream.Stream;
public class YumTester extends Yum {
private final TestTerminal terminal;
- private final Version yumVersion;
public YumTester(TestTerminal terminal) {
- this(terminal, YumVersion.rhel8);
- }
-
- public YumTester(TestTerminal terminal, YumVersion yumVersion) {
super(terminal);
this.terminal = terminal;
- this.yumVersion = yumVersion.asVersion();
- }
-
- public Version yumVersion() {
- return yumVersion;
}
public GenericYumCommandExpectation expectInstall(String... packages) {
@@ -81,10 +70,6 @@ public class YumTester extends Yum {
}
}
- protected void expectYumVersion() {
- terminal.expectCommand("yum --version 2>&1", 0, yumVersion.toFullString() + "\ntrailing garbage\n");
- }
-
private YumTester execute(String output) {
if (commandType == CommandType.install)
terminal.interceptCommand("rpm query", cmd -> new TestChildProcess2(1, "Not installed"));
@@ -106,7 +91,7 @@ public class YumTester extends Yum {
if (commandType == CommandType.upgrade && packages.size() > 1)
cmd.append(" --setopt skip_missing_names_on_update=False");
packages.forEach(pkg -> {
- String name = pkg.toName(yumVersion);
+ String name = pkg.toName();
if (name.contains("(") || name.contains(")")) { // Ugly hack to handle implicit quoting done in com.yahoo.vespa.hosted.node.admin.task.util.process.CommandLine
name = "\"" + name + "\"";
}
@@ -114,26 +99,20 @@ public class YumTester extends Yum {
});
cmd.append(" 2>&1");
- expectYumVersion();
terminal.expectCommand(cmd.toString(), 0, output);
return YumTester.this;
}
}
public class InstallFixedCommandExpectation extends GenericYumCommandExpectation {
+
private InstallFixedCommandExpectation(String yumPackage) {
super(CommandType.installFixed, yumPackage);
}
@Override
- protected void expectYumVersion() {}
-
- @Override
public YumTester andReturn(boolean value) {
- // Pretend package is already correctly version-locked to simplify expectations
- terminal.expectCommand("yum --version 2>&1", 0, yumVersion.toFullString() + "\ntrailing garbage\n");
-
- terminal.expectCommand("yum versionlock list 2>&1", 0, packages.get(0).toVersionLockName(yumVersion));
+ terminal.expectCommand("yum versionlock list 2>&1", 0, packages.get(0).toVersionLockName());
return super.andReturn(value);
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumVersion.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumVersion.java
deleted file mode 100644
index 8eba4561805..00000000000
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumVersion.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.node.admin.task.util.yum;
-
-import com.yahoo.component.Version;
-
-/**
- * Red Hat versions and their associated Yum/DNF major version.
- *
- * @author mpolden
- */
-public enum YumVersion {
-
- rhel8(4);
-
- private final Version version;
-
- YumVersion(int yumMajor) {
- this.version = new Version(yumMajor, 0, 0);
- }
-
- public Version asVersion() {
- return version;
- }
-
-}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageNameTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageNameTest.java
index 0341558d538..02064277f6c 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageNameTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumPackageNameTest.java
@@ -1,7 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.task.util.yum;
-import com.yahoo.component.Version;
import org.junit.Test;
import java.util.Optional;
@@ -26,7 +25,7 @@ public class YumPackageNameTest {
.setRelease("71.git3e8e77d.el7.centos.1")
.setArchitecture("x86_64")
.build();
- assertEquals("docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", yumPackage.toName(Version.fromString("4")));
+ assertEquals("docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", yumPackage.toName());
}
@Test
@@ -115,24 +114,23 @@ public class YumPackageNameTest {
String architecture,
String toName,
String toVersionName) {
- YumVersion yumVersion = YumVersion.rhel8;
YumPackageName yumPackageName = YumPackageName.fromString(packageName);
verifyValue(epoch, yumPackageName.getEpoch());
verifyValue(name, Optional.of(yumPackageName.getName()));
verifyValue(version, yumPackageName.getVersion());
verifyValue(release, yumPackageName.getRelease());
verifyValue(architecture, yumPackageName.getArchitecture());
- verifyValue(toName, Optional.of(yumPackageName.toName(yumVersion.asVersion())));
+ verifyValue(toName, Optional.of(yumPackageName.toName()));
if (toVersionName == null) {
try {
- yumPackageName.toVersionLockName(yumVersion.asVersion());
+ yumPackageName.toVersionLockName();
fail();
} catch (IllegalStateException e) {
assertThat(e.getMessage(), containsStringIgnoringCase("Version is missing "));
}
} else {
- assertEquals(toVersionName, yumPackageName.toVersionLockName(yumVersion.asVersion()));
+ assertEquals(toVersionName, yumPackageName.toVersionLockName());
}
}
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 2699135b5b9..62fd7410e95 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
@@ -79,20 +79,6 @@ public class YumTest {
@Test
public void testAlreadyInstalled() {
mockRpmQuery("package-1", null);
- mockYumVersion();
- 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");
-
- assertFalse(yum
- .install("package-1", "package-2")
- .enableRepo("repo1", "repo2")
- .converge(taskContext));
-
- // RHEL 8
- mockRpmQuery("package-1", null);
- mockYumVersion();
terminal.expectCommand(
"yum install --assumeyes --enablerepo=repo1 --enablerepo=repo2 --setopt skip_missing_names_on_install=False package-1 package-2 2>&1",
0,
@@ -104,18 +90,6 @@ public class YumTest {
@Test
public void testAlreadyUpgraded() {
- mockYumVersion();
- terminal.expectCommand(
- "yum upgrade --assumeyes --setopt skip_missing_names_on_update=False package-1 package-2 2>&1",
- 0,
- "foobar\nNo packages marked for update\n");
-
- assertFalse(yum
- .upgrade("package-1", "package-2")
- .converge(taskContext));
-
- // RHEL 8
- mockYumVersion();
terminal.expectCommand(
"yum upgrade --assumeyes --setopt skip_missing_names_on_update=False package-1 package-2 2>&1",
0,
@@ -128,19 +102,6 @@ public class YumTest {
@Test
public void testAlreadyRemoved() {
mockRpmQuery("package-1", YumPackageName.fromString("package-1-1.2.3-1"));
- mockYumVersion();
- terminal.expectCommand(
- "yum remove --assumeyes package-1 package-2 2>&1",
- 0,
- "foobar\nNo Packages marked for removal\n");
-
- assertFalse(yum
- .remove("package-1", "package-2")
- .converge(taskContext));
-
- // RHEL 8
- mockRpmQuery("package-1", YumPackageName.fromString("package-1-1.2.3-1"));
- mockYumVersion();
terminal.expectCommand(
"yum remove --assumeyes package-1 package-2 2>&1",
0,
@@ -160,7 +121,6 @@ public class YumTest {
@Test
public void testInstall() {
mockRpmQuery("package-1", null);
- mockYumVersion();
terminal.expectCommand(
"yum install --assumeyes --setopt skip_missing_names_on_install=False package-1 package-2 2>&1",
0,
@@ -181,7 +141,6 @@ public class YumTest {
@Test
public void testInstallWithEnablerepo() {
mockRpmQuery("package-1", null);
- mockYumVersion();
terminal.expectCommand(
"yum install --assumeyes --enablerepo=repo-name --setopt skip_missing_names_on_install=False package-1 package-2 2>&1",
0,
@@ -195,23 +154,6 @@ public class YumTest {
@Test
public void testWithVersionLock() {
- mockYumVersion();
- terminal.expectCommand("yum versionlock list 2>&1",
- 0,
- "Repository chef_rpms-release is listed more than once in the configuration\n" +
- "0:chef-12.21.1-1.el7.*\n");
- terminal.expectCommand("yum versionlock add --assumeyes \"package-0:0.10-654.el7.*\" 2>&1");
- terminal.expectCommand(
- "yum install --assumeyes package-0:0.10-654.el7.x86_64 2>&1",
- 0,
- "installing");
-
- assertTrue(yum.installFixedVersion(YumPackageName.fromString("package-0:0.10-654.el7.x86_64")).converge(taskContext));
- }
-
- @Test
- public void testWithVersionLockYum4() {
- mockYumVersion();
terminal.expectCommand("yum versionlock list 2>&1",
0,
"Last metadata expiration check: 0:51:26 ago on Thu 14 Jan 2021 09:39:24 AM UTC.\n");
@@ -232,7 +174,6 @@ public class YumTest {
@Test
public void testWithDifferentVersionLock() {
- mockYumVersion();
terminal.expectCommand("yum versionlock list 2>&1",
0,
"Repository chef_rpms-release is listed more than once in the configuration\n" +
@@ -257,7 +198,6 @@ public class YumTest {
@Test
public void testWithExistingVersionLock() {
- mockYumVersion();
terminal.expectCommand("yum versionlock list 2>&1",
0,
"Repository chef_rpms-release is listed more than once in the configuration\n" +
@@ -273,7 +213,6 @@ public class YumTest {
@Test
public void testWithDowngrade() {
- mockYumVersion();
terminal.expectCommand("yum versionlock list 2>&1",
0,
"Repository chef_rpms-release is listed more than once in the configuration\n" +
@@ -294,7 +233,6 @@ public class YumTest {
@Test(expected = ChildProcessFailureException.class)
public void testFailedInstall() {
mockRpmQuery("package-1", null);
- mockYumVersion();
terminal.expectCommand(
"yum install --assumeyes --enablerepo=repo-name --setopt skip_missing_names_on_install=False package-1 package-2 2>&1",
1,
@@ -310,7 +248,6 @@ public class YumTest {
@Test
public void testUnknownPackages() {
mockRpmQuery("package-1", null);
- mockYumVersion();
terminal.expectCommand(
"yum install --assumeyes --setopt skip_missing_names_on_install=False package-1 package-2 package-3 2>&1",
0,
@@ -337,15 +274,10 @@ public class YumTest {
@Test
public void allowToCallUpgradeWithNoPackages() {
- mockYumVersion();
terminal.expectCommand("yum upgrade --assumeyes 2>&1", 0, "OK");
yum.upgrade().converge(taskContext);
}
- private void mockYumVersion() {
- terminal.expectCommand("yum --version 2>&1", 0, YumVersion.rhel8.asVersion().toFullString() + "\ntrailing garbage\n");
- }
-
private void mockRpmQuery(String packageName, YumPackageName installedOrNull) {
new YumTester(terminal).expectQueryInstalled(packageName).andReturn(installedOrNull);
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTesterTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTesterTest.java
index bb4bb2686a3..93fffffb2fa 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTesterTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/yum/YumTesterTest.java
@@ -37,7 +37,7 @@ public class YumTesterTest {
assertYumMethod(yum -> yum.expectRemove(packages).withEnableRepo(repos),
yum -> yum.remove(List.of(packages)).enableRepo(repos).converge(context));
- assertYumMethod(yum -> yum.expectInstallFixedVersion(minimalPackage.toName(yum.yumVersion())).withEnableRepo(repos),
+ assertYumMethod(yum -> yum.expectInstallFixedVersion(minimalPackage.toName()).withEnableRepo(repos),
yum -> yum.installFixedVersion(minimalPackage).enableRepo(repos).converge(context));
}