diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-05-03 16:06:14 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-05-05 14:55:53 +0200 |
commit | 9624701b8f3fa93779aa6fb352aacebb6dd138ac (patch) | |
tree | c2f490284b52d9f76b8cc608714ee0ab752fae9a /controller-server | |
parent | 25e3c3a9ac64309593433e87ade9d608c4c2c2e4 (diff) |
Generalize ContainerImageExpirer to ArtifactExpirer
Diffstat (limited to 'controller-server')
6 files changed, 41 insertions, 42 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContainerImageExpirer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArtifactExpirer.java index c87dd262fa3..a7cff2fdda0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ContainerImageExpirer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArtifactExpirer.java @@ -4,7 +4,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.component.Version; import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.hosted.controller.Controller; -import com.yahoo.vespa.hosted.controller.api.integration.container.ContainerImage; +import com.yahoo.vespa.hosted.controller.api.integration.artifact.Artifact; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; @@ -19,17 +19,17 @@ import java.util.logging.Logger; import java.util.stream.Collectors; /** - * Periodically expire unused container images. + * Periodically expire unused artifacts, e.g. container images and RPMs. * * @author mpolden */ -public class ContainerImageExpirer extends ControllerMaintainer { +public class ArtifactExpirer extends ControllerMaintainer { - private static final Logger log = Logger.getLogger(ContainerImageExpirer.class.getName()); + private static final Logger log = Logger.getLogger(ArtifactExpirer.class.getName()); private static final Duration MIN_AGE = Duration.ofDays(14); - public ContainerImageExpirer(Controller controller, Duration interval) { + public ArtifactExpirer(Controller controller, Duration interval) { super(controller, interval, null, expiringSystems()); } @@ -37,31 +37,31 @@ public class ContainerImageExpirer extends ControllerMaintainer { protected double maintain() { Instant now = controller().clock().instant(); VersionStatus versionStatus = controller().readVersionStatus(); - List<ContainerImage> imagesToExpire = controller().serviceRegistry().containerRegistry().list().stream() - .filter(image -> isExpired(image, now, versionStatus)) + List<Artifact> artifactsToExpire = controller().serviceRegistry().containerRegistry().list().stream() + .filter(artifact -> isExpired(artifact, now, versionStatus)) .collect(Collectors.toList()); - if (!imagesToExpire.isEmpty()) { - log.log(Level.INFO, "Expiring " + imagesToExpire.size() + " container images: " + imagesToExpire); - controller().serviceRegistry().containerRegistry().deleteAll(imagesToExpire); + if (!artifactsToExpire.isEmpty()) { + log.log(Level.INFO, "Expiring " + artifactsToExpire.size() + " artifacts: " + artifactsToExpire); + controller().serviceRegistry().containerRegistry().deleteAll(artifactsToExpire); } return 1.0; } - /** Returns whether given image is expired */ - private boolean isExpired(ContainerImage image, Instant now, VersionStatus versionStatus) { + /** Returns whether given artifact is expired */ + private boolean isExpired(Artifact artifact, Instant now, VersionStatus versionStatus) { List<VespaVersion> versions = versionStatus.versions(); if (versions.isEmpty()) return false; - if (versionStatus.isActive(image.version())) return false; - if (image.createdAt().isAfter(now.minus(MIN_AGE))) return false; + if (versionStatus.isActive(artifact.version())) return false; + if (artifact.createdAt().isAfter(now.minus(MIN_AGE))) return false; Version maxVersion = versions.stream().map(VespaVersion::versionNumber).max(Comparator.naturalOrder()).get(); - if (image.version().isAfter(maxVersion)) return false; // A future version + if (artifact.version().isAfter(maxVersion)) return false; // A future version return true; } - /** Returns systems where images can be expired */ + /** Returns systems where artifacts can be expired */ private static Set<SystemName> expiringSystems() { // Run only in public and main. Public systems have distinct container registries, while main and CD have // shared registries. diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java index 041d0694ca9..e929940b68b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java @@ -63,7 +63,7 @@ public class ControllerMaintenance extends AbstractComponent { maintainers.add(new ResourceTagMaintainer(controller, intervals.resourceTagMaintainer, controller.serviceRegistry().resourceTagger())); maintainers.add(new SystemRoutingPolicyMaintainer(controller, intervals.systemRoutingPolicyMaintainer)); maintainers.add(new ApplicationMetaDataGarbageCollector(controller, intervals.applicationMetaDataGarbageCollector)); - maintainers.add(new ContainerImageExpirer(controller, intervals.containerImageExpirer)); + maintainers.add(new ArtifactExpirer(controller, intervals.containerImageExpirer)); maintainers.add(new HostInfoUpdater(controller, intervals.hostInfoUpdater)); maintainers.add(new ReindexingTriggerer(controller, intervals.reindexingTriggerer)); maintainers.add(new EndpointCertificateMaintainer(controller, intervals.endpointCertificateMaintainer)); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ContainerRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ArtifactRegistryMock.java index 4791017548d..1d3974fe7a7 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ContainerRegistryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ArtifactRegistryMock.java @@ -1,8 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.integration; -import com.yahoo.vespa.hosted.controller.api.integration.container.ContainerImage; -import com.yahoo.vespa.hosted.controller.api.integration.container.ContainerRegistry; +import com.yahoo.vespa.hosted.controller.api.integration.artifact.Artifact; +import com.yahoo.vespa.hosted.controller.api.integration.artifact.ArtifactRegistry; import java.util.Comparator; import java.util.HashMap; @@ -13,26 +13,26 @@ import java.util.stream.Collectors; /** * @author mpolden */ -public class ContainerRegistryMock implements ContainerRegistry { +public class ArtifactRegistryMock implements ArtifactRegistry { - private static final Comparator<ContainerImage> comparator = Comparator.comparing(ContainerImage::registry) - .thenComparing(ContainerImage::repository) - .thenComparing(ContainerImage::version); + private static final Comparator<Artifact> comparator = Comparator.comparing((Artifact artifact) -> artifact.registry().orElse("")) + .thenComparing(artifact -> artifact.repository().orElse("")) + .thenComparing(Artifact::version); - private final Map<String, ContainerImage> images = new HashMap<>(); + private final Map<String, Artifact> images = new HashMap<>(); - public ContainerRegistryMock add(ContainerImage image) { + public ArtifactRegistryMock add(Artifact image) { images.put(image.id(), image); return this; } @Override - public void deleteAll(List<ContainerImage> images) { + public void deleteAll(List<Artifact> images) { images.forEach(image -> this.images.remove(image.id())); } @Override - public List<ContainerImage> list() { + public List<Artifact> list() { return images.values().stream().sorted(comparator).collect(Collectors.toUnmodifiableList()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java index 0afb1e67a85..0b37c4ebb8d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java @@ -82,7 +82,7 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg private final MockResourceTagger mockResourceTagger = new MockResourceTagger(); private final RoleService roleService = new MockRoleService(); private final BillingController billingController = new MockBillingController(clock); - private final ContainerRegistryMock containerRegistry = new ContainerRegistryMock(); + private final ArtifactRegistryMock containerRegistry = new ArtifactRegistryMock(); private final NoopTenantSecretService tenantSecretService = new NoopTenantSecretService(); private final ArchiveService archiveService = new MockArchiveService(); private final MockChangeRequestClient changeRequestClient = new MockChangeRequestClient(); @@ -236,7 +236,7 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg } @Override - public ContainerRegistryMock containerRegistry() { + public ArtifactRegistryMock containerRegistry() { return containerRegistry; } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ContainerImageExpirerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArtifactExpirerTest.java index baebf7239ee..ddc1c0b599f 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ContainerImageExpirerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArtifactExpirerTest.java @@ -2,10 +2,10 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.component.Version; -import com.yahoo.vespa.hosted.controller.api.integration.container.ContainerImage; +import com.yahoo.vespa.hosted.controller.api.integration.artifact.Artifact; import com.yahoo.vespa.hosted.controller.api.integration.container.ContainerImage.Architecture; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; -import com.yahoo.vespa.hosted.controller.integration.ContainerRegistryMock; +import com.yahoo.vespa.hosted.controller.integration.ArtifactRegistryMock; import org.junit.Test; import java.time.Duration; @@ -18,19 +18,18 @@ import static org.junit.Assert.assertEquals; /** * @author mpolden */ -public class ContainerImageExpirerTest { +public class ArtifactExpirerTest { @Test public void maintain() { DeploymentTester tester = new DeploymentTester(); - ContainerImageExpirer expirer = new ContainerImageExpirer(tester.controller(), Duration.ofDays(1)); - ContainerRegistryMock registry = tester.controllerTester().serviceRegistry().containerRegistry(); + ArtifactExpirer expirer = new ArtifactExpirer(tester.controller(), Duration.ofDays(1)); + ArtifactRegistryMock registry = tester.controllerTester().serviceRegistry().containerRegistry(); Instant instant = tester.clock().instant(); - ContainerImage image0 = new ContainerImage("image0", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.1"), Optional.empty()); - ContainerImage image1 = new ContainerImage("image1", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.2"), Optional.of(Architecture.amd64)); - ContainerImage image2 = new ContainerImage("image2", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.4"), Optional.of(Architecture.amd64)); - + Artifact image0 = new Artifact("image0", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.1"), Optional.empty()); + Artifact image1 = new Artifact("image1", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.2"), Optional.of(Architecture.amd64)); + Artifact image2 = new Artifact("image2", "registry.example.com", "vespa/vespa", instant, Version.fromString("7.4"), Optional.of(Architecture.amd64)); registry.add(image0) .add(image1) .add(image2); @@ -53,7 +52,7 @@ public class ContainerImageExpirerTest { assertEquals(List.of(image1, image2), registry.list()); // A new version becomes active. The active and future version are kept - ContainerImage image3 = new ContainerImage("image3", "registry.example.com", "vespa/vespa", tester.clock().instant(), Version.fromString("7.3"), Optional.of(Architecture.amd64)); + Artifact image3 = new Artifact("image3", "registry.example.com", "vespa/vespa", tester.clock().instant(), Version.fromString("7.3"), Optional.of(Architecture.amd64)); registry.add(image3); tester.controllerTester().upgradeSystem(image3.version()); expirer.maintain(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json index 79e11fa1140..8b2e5578ae0 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json @@ -13,6 +13,9 @@ "name": "ArchiveUriUpdater" }, { + "name": "ArtifactExpirer" + }, + { "name": "BillingDatabaseMaintainer" }, { @@ -28,9 +31,6 @@ "name": "ContactInformationMaintainer" }, { - "name": "ContainerImageExpirer" - }, - { "name": "CostReportMaintainer" }, { |