diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-07-06 14:07:55 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-07-06 14:08:06 +0200 |
commit | d3762db8b33262efc8c5929ff91c231a007a6dd5 (patch) | |
tree | c6eaaa192b78a01b474b53f66028d90c559b8df3 /node-admin | |
parent | 8c8b129ad285bf36a7cc660c1d62f2410bfacd0d (diff) |
Remove support for multiple Yum versions
Diffstat (limited to 'node-admin')
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)); } |