diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-10-24 08:45:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-24 08:45:31 +0200 |
commit | d0c7bb79ab5d79745cf686c8388972f4d3c7143c (patch) | |
tree | fcddfa8c08db67f3bff0bf7688dae5ba5dc5416c /controller-server | |
parent | fce53d10fb4ba25d8c0449b18eebd9eef830cdf1 (diff) | |
parent | c49cdc0e0ef900cb4cda93bcfdb88692767ae46e (diff) |
Merge pull request #7400 from vespa-engine/mpolden/remove-pr-instances
Remove PR instances
Diffstat (limited to 'controller-server')
4 files changed, 92 insertions, 0 deletions
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 33555c08a43..a00c2ccb4ed 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 @@ -48,6 +48,7 @@ public class ControllerMaintenance extends AbstractComponent { private final OsVersionStatusUpdater osVersionStatusUpdater; private final JobRunner jobRunner; private final ContactInformationMaintainer contactInformationMaintainer; + private final DatabaseMaintainer databaseMaintainer; @SuppressWarnings("unused") // instantiated by Dependency Injection public ControllerMaintenance(MaintainerConfig maintainerConfig, ApiAuthorityConfig apiAuthorityConfig, Controller controller, CuratorDb curator, @@ -74,6 +75,7 @@ public class ControllerMaintenance extends AbstractComponent { osUpgraders = osUpgraders(controller, jobControl); osVersionStatusUpdater = new OsVersionStatusUpdater(controller, maintenanceInterval, jobControl); contactInformationMaintainer = new ContactInformationMaintainer(controller, Duration.ofHours(12), jobControl, organization, apiAuthorityConfig); + databaseMaintainer = new DatabaseMaintainer(controller, maintenanceInterval, jobControl); } public Upgrader upgrader() { return upgrader; } @@ -100,6 +102,7 @@ public class ControllerMaintenance extends AbstractComponent { osVersionStatusUpdater.deconstruct(); jobRunner.deconstruct(); contactInformationMaintainer.deconstruct(); + databaseMaintainer.deconstruct(); } /** Create one OS upgrader per cloud found in the zone registry of controller */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainer.java new file mode 100644 index 00000000000..ac368b00b82 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainer.java @@ -0,0 +1,40 @@ +// 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.controller.maintenance; + +import com.yahoo.vespa.hosted.controller.Application; +import com.yahoo.vespa.hosted.controller.Controller; + +import java.time.Duration; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Runs maintenance operations for the controller database, such as removing stale entries. + * + * @author mpolden + */ +public class DatabaseMaintainer extends Maintainer { + + public DatabaseMaintainer(Controller controller, Duration interval, JobControl jobControl) { + super(controller, interval, jobControl); + } + + @Override + protected void maintain() { + removePullRequestInstances(); + } + + /** Pull request instances are no longer created. This removes all existing entries */ + // TODO: Remove after 2018-11-01 + // TODO: Remove ApplicationList#notPullRequest and its usages + private void removePullRequestInstances() { + List<Application> pullRequestInstances = controller().applications().asList().stream() + .filter(a -> a.id().instance().value().matches("^(default-pr)?\\d+$")) + .collect(Collectors.toList()); + + pullRequestInstances.forEach(application -> { + controller().applications().lockIfPresent(application.id(), (lockedApplication) -> controller().curator().removeApplication(lockedApplication.get().id())); + }); + } + +} diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainerTest.java new file mode 100644 index 00000000000..bdb55d0b546 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DatabaseMaintainerTest.java @@ -0,0 +1,46 @@ +// 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.controller.maintenance; + +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.Environment; +import com.yahoo.vespa.hosted.controller.Application; +import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; +import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; +import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; +import org.junit.Test; + +import java.time.Duration; +import java.time.Instant; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author mpolden + */ +public class DatabaseMaintainerTest { + + @Test + public void remove_pull_request_instances() { + DeploymentTester tester = new DeploymentTester(); + DatabaseMaintainer maintainer = new DatabaseMaintainer(tester.controller(), Duration.ofDays(1), new JobControl(tester.controller().curator())); + + // Deploy regular application + Application app1 = tester.createApplication("app1", "tenant1", 1, 1); + ApplicationPackage applicationPackage = new ApplicationPackageBuilder() + .environment(Environment.prod) + .region("us-east-3") + .build(); + tester.deployCompletely(app1, applicationPackage); + + // Create pr instance (no longer permitted through ApplicationController so we have to cheat) + Application app2 = new Application(ApplicationId.from("tenant1", "app1", "default-pr1"), Instant.now()); + tester.controller().curator().writeApplication(app2); + assertTrue(tester.applications().get(app2.id()).isPresent()); + + maintainer.maintain(); + assertTrue("Regular application is not deleted", tester.applications().get(app1.id()).isPresent()); + assertFalse("PR instance is deleted", tester.applications().get(app2.id()).isPresent()); + } + +} 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 6a71e524ae4..707b71b772f 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": "ContactInformationMaintainer" }, { + "name": "DatabaseMaintainer" + }, + { "name": "DefaultOsUpgrader" }, { |