From d4afb08f2c373978a9ce76612d4be413eb6555a4 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Fri, 2 Jul 2021 13:37:27 +0200 Subject: Revert "Remove support for Yum 3" --- .../node/admin/task/util/yum/YumPackageName.java | 16 ++++-- .../hosted/node/admin/task/util/yum/YumTester.java | 7 +-- .../node/admin/task/util/yum/YumVersion.java | 3 +- .../admin/task/util/yum/YumPackageNameTest.java | 53 +++++++++++++------ .../hosted/node/admin/task/util/yum/YumTest.java | 60 ++++++++++++---------- 5 files changed, 87 insertions(+), 52 deletions(-) (limited to 'node-admin') 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..f3fa6bc65e4 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 @@ -233,11 +233,17 @@ public class YumPackageName { StringBuilder builder = new StringBuilder(); boolean isBare = version.isEmpty() && release.isEmpty() && architecture.isEmpty(); char nextDelimiter; - builder.append(name); - // Fully versioned package names must always include epoch in Yum 4 - epoch.or(() -> Optional.of("0").filter(v -> !isBare)) - .ifPresent(ep -> builder.append('-').append(ep)); - nextDelimiter = ':'; + if (yumVersion.getMajor() < 4) { + epoch.ifPresent(ep -> builder.append(ep).append(':')); + builder.append(name); + nextDelimiter = '-'; + } else { + builder.append(name); + // Fully versioned package names must always include epoch in Yum 4 + epoch.or(() -> Optional.of("0").filter(v -> !isBare)) + .ifPresent(ep -> builder.append('-').append(ep)); + nextDelimiter = ':'; + } version.ifPresent(s -> builder.append(nextDelimiter).append(s)); release.ifPresent(s -> builder.append('-').append(s)); architecture.ifPresent(arch -> builder.append('.').append(arch)); 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..e47d71cbdf7 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 @@ -20,7 +20,7 @@ public class YumTester extends Yum { private final Version yumVersion; public YumTester(TestTerminal terminal) { - this(terminal, YumVersion.rhel8); + this(terminal, YumVersion.rhel7); } public YumTester(TestTerminal terminal, YumVersion yumVersion) { @@ -130,10 +130,11 @@ public class YumTester extends Yum { @Override public YumTester andReturn(boolean value) { - // Pretend package is already correctly version-locked to simplify expectations + // 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)); + String quiet = yumVersion.getMajor() < 4 ? " --quiet" : ""; + terminal.expectCommand("yum" + quiet +" versionlock list 2>&1", 0, packages.get(0).toVersionLockName(yumVersion)); 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 index 8eba4561805..b0c2805d620 100644 --- 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 @@ -4,12 +4,13 @@ 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. + * Red Hat versions and their associated Yum major version. * * @author mpolden */ public enum YumVersion { + rhel7(3), rhel8(4); private final Version 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..0880640b84d 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 @@ -26,6 +26,7 @@ public class YumPackageNameTest { .setRelease("71.git3e8e77d.el7.centos.1") .setArchitecture("x86_64") .build(); + assertEquals("2:docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64", yumPackage.toName(Version.fromString("3"))); assertEquals("docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", yumPackage.toName(Version.fromString("4"))); } @@ -61,28 +62,28 @@ public class YumPackageNameTest { null, null, "x86_64", - "docker-engine-selinux-0.x86_64", + "docker-engine-selinux.x86_64", null); // name-ver-rel - verifyPackageName("docker-engine-selinux-0:1.12.6-1.el7", - "0", + verifyPackageName("docker-engine-selinux-1.12.6-1.el7", + null, "docker-engine-selinux", "1.12.6", "1.el7", null, - "docker-engine-selinux-0:1.12.6-1.el7", - "docker-engine-selinux-0:1.12.6-1.el7.*"); + "docker-engine-selinux-1.12.6-1.el7", + "0:docker-engine-selinux-1.12.6-1.el7.*"); // name-ver-rel.arch - verifyPackageName("docker-engine-selinux-0:1.12.6-1.el7.x86_64", - "0", + verifyPackageName("docker-engine-selinux-1.12.6-1.el7.x86_64", + null, "docker-engine-selinux", "1.12.6", "1.el7", "x86_64", - "docker-engine-selinux-0:1.12.6-1.el7.x86_64", - "docker-engine-selinux-0:1.12.6-1.el7.*"); + "docker-engine-selinux-1.12.6-1.el7.x86_64", + "0:docker-engine-selinux-1.12.6-1.el7.*"); // name-epoch:ver-rel.arch verifyPackageName( @@ -92,19 +93,30 @@ public class YumPackageNameTest { "1.12.6", "71.git3e8e77d.el7.centos.1", "x86_64", - "docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", - "docker-2:1.12.6-71.git3e8e77d.el7.centos.1.*"); + "2:docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64", + "2:docker-1.12.6-71.git3e8e77d.el7.centos.1.*"); // epoch:name-ver-rel.arch verifyPackageName( - "docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", + "2:docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64", "2", "docker", "1.12.6", "71.git3e8e77d.el7.centos.1", "x86_64", - "docker-2:1.12.6-71.git3e8e77d.el7.centos.1.x86_64", - "docker-2:1.12.6-71.git3e8e77d.el7.centos.1.*"); + "2:docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64", + "2:docker-1.12.6-71.git3e8e77d.el7.centos.1.*"); + + // name-ver-rel.arch (RHEL 8) + verifyPackageName("podman-1.9.3-2.module+el8.2.1+6867+366c07d6.x86_64", + null, + "podman", + "1.9.3", + "2.module+el8.2.1+6867+366c07d6", + "x86_64", + "podman-0:1.9.3-2.module+el8.2.1+6867+366c07d6.x86_64", + "podman-0:1.9.3-2.module+el8.2.1+6867+366c07d6.*", + YumVersion.rhel8); } private void verifyPackageName(String packageName, @@ -115,7 +127,18 @@ public class YumPackageNameTest { String architecture, String toName, String toVersionName) { - YumVersion yumVersion = YumVersion.rhel8; + verifyPackageName(packageName, epoch, name, version, release, architecture, toName, toVersionName, YumVersion.rhel7); + } + + private void verifyPackageName(String packageName, + String epoch, + String name, + String version, + String release, + String architecture, + String toName, + String toVersionName, + YumVersion yumVersion) { YumPackageName yumPackageName = YumPackageName.fromString(packageName); verifyValue(epoch, yumPackageName.getEpoch()); verifyValue(name, Optional.of(yumPackageName.getName())); 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..92f8f78d255 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 @@ -92,7 +92,7 @@ public class YumTest { // RHEL 8 mockRpmQuery("package-1", null); - mockYumVersion(); + mockYumVersion(YumVersion.rhel8); terminal.expectCommand( "yum install --assumeyes --enablerepo=repo1 --enablerepo=repo2 --setopt skip_missing_names_on_install=False package-1 package-2 2>&1", 0, @@ -115,7 +115,7 @@ public class YumTest { .converge(taskContext)); // RHEL 8 - mockYumVersion(); + mockYumVersion(YumVersion.rhel8); terminal.expectCommand( "yum upgrade --assumeyes --setopt skip_missing_names_on_update=False package-1 package-2 2>&1", 0, @@ -140,7 +140,7 @@ public class YumTest { // RHEL 8 mockRpmQuery("package-1", YumPackageName.fromString("package-1-1.2.3-1")); - mockYumVersion(); + mockYumVersion(YumVersion.rhel8); terminal.expectCommand( "yum remove --assumeyes package-1 package-2 2>&1", 0, @@ -196,22 +196,22 @@ public class YumTest { @Test public void testWithVersionLock() { mockYumVersion(); - terminal.expectCommand("yum versionlock list 2>&1", + terminal.expectCommand("yum --quiet 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 versionlock add --assumeyes \"0:package-1-0.10-654.el7.*\" 2>&1"); terminal.expectCommand( - "yum install --assumeyes package-0:0.10-654.el7.x86_64 2>&1", + "yum install --assumeyes 0:package-1-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)); + assertTrue(yum.installFixedVersion(YumPackageName.fromString("0:package-1-0.10-654.el7.x86_64")).converge(taskContext)); } @Test public void testWithVersionLockYum4() { - mockYumVersion(); + mockYumVersion(YumVersion.rhel8); 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"); @@ -233,24 +233,24 @@ public class YumTest { @Test public void testWithDifferentVersionLock() { mockYumVersion(); - terminal.expectCommand("yum versionlock list 2>&1", + terminal.expectCommand("yum --quiet versionlock list 2>&1", 0, "Repository chef_rpms-release is listed more than once in the configuration\n" + - "chef-0:12.21.1-1.el7.*\n" + - "package-0:0.1-8.el7.*\n"); + "0:chef-12.21.1-1.el7.*\n" + + "0:package-1-0.1-8.el7.*\n"); - terminal.expectCommand("yum versionlock delete \"package-0:0.1-8.el7.*\" 2>&1"); + terminal.expectCommand("yum versionlock delete \"0:package-1-0.1-8.el7.*\" 2>&1"); - terminal.expectCommand("yum versionlock add --assumeyes --enablerepo=somerepo \"package-0:0.10-654.el7.*\" 2>&1"); + terminal.expectCommand("yum versionlock add --assumeyes --enablerepo=somerepo \"0:package-1-0.10-654.el7.*\" 2>&1"); terminal.expectCommand( - "yum install --assumeyes --enablerepo=somerepo package-0:0.10-654.el7 2>&1", + "yum install --assumeyes --enablerepo=somerepo 0:package-1-0.10-654.el7 2>&1", 0, "Nothing to do\n"); assertTrue(yum - .installFixedVersion(YumPackageName.fromString("package-0:0.10-654.el7")) + .installFixedVersion(YumPackageName.fromString("0:package-1-0.10-654.el7")) .enableRepo("somerepo") .converge(taskContext)); } @@ -258,37 +258,37 @@ public class YumTest { @Test public void testWithExistingVersionLock() { mockYumVersion(); - terminal.expectCommand("yum versionlock list 2>&1", + terminal.expectCommand("yum --quiet versionlock list 2>&1", 0, "Repository chef_rpms-release is listed more than once in the configuration\n" + - "chef-0:12.21.1-1.el7.*\n" + - "package-0:0.10-654.el7.*\n"); + "0:chef-12.21.1-1.el7.*\n" + + "0:package-1-0.10-654.el7.*\n"); terminal.expectCommand( - "yum install --assumeyes package-0:0.10-654.el7 2>&1", + "yum install --assumeyes 0:package-1-0.10-654.el7 2>&1", 0, "Nothing to do\n"); - assertFalse(yum.installFixedVersion(YumPackageName.fromString("package-0:0.10-654.el7")).converge(taskContext)); + assertFalse(yum.installFixedVersion(YumPackageName.fromString("0:package-1-0.10-654.el7")).converge(taskContext)); } @Test public void testWithDowngrade() { mockYumVersion(); - terminal.expectCommand("yum versionlock list 2>&1", + terminal.expectCommand("yum --quiet versionlock list 2>&1", 0, "Repository chef_rpms-release is listed more than once in the configuration\n" + - "chef-0:12.21.1-1.el7.*\n" + - "package-0:0.10-654.el7.*\n"); + "0:chef-12.21.1-1.el7.*\n" + + "0:package-1-0.10-654.el7.*\n"); terminal.expectCommand( - "yum install --assumeyes package-0:0.10-654.el7 2>&1", + "yum install --assumeyes 0:package-1-0.10-654.el7 2>&1", 0, - "Package matching package-=.0.10-654.el7 already installed. Checking for update.\n" + + "Package matching package-1-0.10-654.el7 already installed. Checking for update.\n" + "Nothing to do\n"); - terminal.expectCommand("yum downgrade --assumeyes package-0:0.10-654.el7 2>&1"); + terminal.expectCommand("yum downgrade --assumeyes 0:package-1-0.10-654.el7 2>&1"); - assertTrue(yum.installFixedVersion(YumPackageName.fromString("package-0:0.10-654.el7")).converge(taskContext)); + assertTrue(yum.installFixedVersion(YumPackageName.fromString("0:package-1-0.10-654.el7")).converge(taskContext)); } @Test(expected = ChildProcessFailureException.class) @@ -342,8 +342,12 @@ public class YumTest { yum.upgrade().converge(taskContext); } + private void mockYumVersion(YumVersion yumVersion) { + terminal.expectCommand("yum --version 2>&1", 0, yumVersion.asVersion().toFullString() + "\ntrailing garbage\n"); + } + private void mockYumVersion() { - terminal.expectCommand("yum --version 2>&1", 0, YumVersion.rhel8.asVersion().toFullString() + "\ntrailing garbage\n"); + mockYumVersion(YumVersion.rhel7); } private void mockRpmQuery(String packageName, YumPackageName installedOrNull) { -- cgit v1.2.3