diff options
10 files changed, 125 insertions, 140 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java index c9ec355a3b9..3f1bebfed48 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java @@ -292,34 +292,6 @@ public class Instance { return metrics; } - /** Returns activity for this */ - public ApplicationActivity activity() { - return ApplicationActivity.from(deployments.values()); - } - - /** - * Returns the oldest platform version this has deployed in a permanent zone (not test or staging). - * - * This is unfortunately quite similar to {@link ApplicationController#oldestInstalledPlatform(TenantAndApplicationId)}, - * but this checks only what the controller has deployed to the production zones, while that checks the node repository - * to see what's actually installed on each node. Thus, this is the right choice for, e.g., target Vespa versions for - * new deployments, while that is the right choice for version to compile against. - */ - public Optional<Version> oldestDeployedPlatform() { - return productionDeployments().values().stream() - .map(Deployment::version) - .min(Comparator.naturalOrder()); - } - - /** - * Returns the oldest application version this has deployed in a permanent zone (not test or staging). - */ - public Optional<ApplicationVersion> oldestDeployedApplication() { - return productionDeployments().values().stream() - .map(Deployment::applicationVersion) - .min(Comparator.naturalOrder()); - } - /** Returns all rotations assigned to this */ public List<AssignedRotation> rotations() { return rotations; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java index 90a4ecdef9a..ab92e38ee4b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java @@ -184,7 +184,7 @@ class JobControllerApiHandlerHelper { lastPlatformObject.setString("pending", application.change().isEmpty() ? "Waiting for upgrade slot" - : "Waiting for " + instance.change() + " to complete"); + : "Waiting for " + application.change() + " to complete"); } private static void lastApplicationToSlime(Cursor lastApplicationObject, Application application, Instance instance, Change change, DeploymentSteps steps, Controller controller) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java index 075451f60bf..90d257d754d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java @@ -141,8 +141,6 @@ public class ControllerTest { // Simulate restart tester.restartController(); - applications = tester.controller().applications(); - assertNotNull(tester.controller().tenants().get(TenantName.from("tenant1"))); assertNotNull(tester.defaultInstance(app1.id())); assertEquals(4, tester.defaultInstance(app1.id()).deploymentJobs().jobStatus().size()); @@ -152,7 +150,7 @@ public class ControllerTest { // system and staging test job - succeeding tester.jobCompletion(component).application(app1).nextBuildNumber().uploadArtifact(applicationPackage).submit(); - applicationVersion = tester.defaultInstance("app1").change().application().get(); + applicationVersion = tester.application(app1.id()).change().application().get(); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, systemTest); assertStatus(JobStatus.initial(systemTest) .withTriggering(version1, applicationVersion, Optional.of(tester.defaultInstance(app1.id()).deployments().get(productionUsWest1.zone(main))), "", tester.clock().instant().truncatedTo(MILLIS)) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java index 5441ed6aec0..545729b5474 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java @@ -177,7 +177,7 @@ public class DeploymentTriggerTest { tester.deployAndNotify(instance.id(), Optional.empty(), false, systemTest); tester.deployAndNotify(instance.id(), Optional.empty(), false, stagingTest); tester.deployAndNotify(instance.id(), Optional.empty(), false, productionUsCentral1); - assertEquals(Change.empty(), tester.instance(instance.id()).change()); + assertEquals(Change.empty(), tester.application(application.id()).change()); tester.assertNotRunning(systemTest, instance.id()); tester.assertNotRunning(stagingTest, instance.id()); tester.assertNotRunning(productionUsCentral1, instance.id()); @@ -203,7 +203,7 @@ public class DeploymentTriggerTest { tester.readyJobTrigger().maintain(); iTester.runJob(JobType.productionUsWest1); iTester.runJob(JobType.productionUsEast3); - assertEquals(Change.empty(), iTester.instance().change()); + assertEquals(Change.empty(), iTester.application().change()); tester.upgradeSystem(new Version("8.9")); iTester.runJob(JobType.systemTest); @@ -542,7 +542,7 @@ public class DeploymentTriggerTest { tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsWest1); assertEquals(BuildJob.defaultBuildNumber, tester.defaultInstance(application.id()).deploymentJobs().jobStatus() .get(productionUsWest1).lastSuccess().get().application().buildNumber().getAsLong()); - assertEquals((BuildJob.defaultBuildNumber + 1), tester.defaultInstance(application.id()).outstandingChange().application().get().buildNumber().getAsLong()); + assertEquals((BuildJob.defaultBuildNumber + 1), tester.application(application.id()).outstandingChange().application().get().buildNumber().getAsLong()); tester.readyJobTrigger().maintain(); // Platform upgrade keeps rolling, since it has already deployed in a production zone, and tests for the new revision have also started. @@ -551,23 +551,23 @@ public class DeploymentTriggerTest { assertEquals(2, tester.buildService().jobs().size()); // Upgrade is done, and oustanding change rolls out when block window ends. - assertEquals(Change.empty(), tester.defaultInstance(application.id()).change()); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); - assertTrue(tester.defaultInstance(application.id()).outstandingChange().hasTargets()); + assertEquals(Change.empty(), tester.application(application.id()).change()); + assertFalse(tester.application(application.id()).change().hasTargets()); + assertTrue(tester.application(application.id()).outstandingChange().hasTargets()); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, stagingTest); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, systemTest); tester.clock().advance(Duration.ofHours(1)); tester.outstandingChangeDeployer().run(); - assertTrue(tester.defaultInstance(application.id()).change().hasTargets()); - assertFalse(tester.defaultInstance(application.id()).outstandingChange().hasTargets()); + assertTrue(tester.application(application.id()).change().hasTargets()); + assertFalse(tester.application(application.id()).outstandingChange().hasTargets()); tester.readyJobTrigger().run(); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsWest1); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsEast3); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); - assertFalse(tester.defaultInstance(application.id()).outstandingChange().hasTargets()); + assertFalse(tester.application(application.id()).change().hasTargets()); + assertFalse(tester.application(application.id()).outstandingChange().hasTargets()); } @Test @@ -622,7 +622,8 @@ public class DeploymentTriggerTest { public void applicationVersionIsNotDowngraded() { Application application = tester.createApplication("app1", "tenant1", 1, 1L); Instance instance = tester.defaultInstance(application.id()); - Supplier<Instance> app = () -> tester.defaultInstance(application.id()); + Supplier<Application> apps = () -> tester.application(application.id()); + Supplier<Instance> instances = () -> tester.defaultInstance(application.id()); ApplicationPackage applicationPackage = new ApplicationPackageBuilder() .environment(Environment.prod) .region("us-central-1") @@ -639,15 +640,15 @@ public class DeploymentTriggerTest { tester.deploy(productionUsCentral1, instance.id(), Optional.empty(), false); ApplicationVersion appVersion1 = ApplicationVersion.from(BuildJob.defaultSourceRevision, BuildJob.defaultBuildNumber + 1); - assertEquals(appVersion1, app.get().deployments().get(ZoneId.from("prod.us-central-1")).applicationVersion()); + assertEquals(appVersion1, instances.get().deployments().get(ZoneId.from("prod.us-central-1")).applicationVersion()); // Verify the application change is not removed when change is cancelled. tester.deploymentTrigger().cancelChange(application.id(), PLATFORM); - assertEquals(Change.of(appVersion1), app.get().change()); + assertEquals(Change.of(appVersion1), apps.get().change()); // Now cancel the change as is done through the web API. tester.deploymentTrigger().cancelChange(application.id(), ALL); - assertEquals(Change.empty(), app.get().change()); + assertEquals(Change.empty(), apps.get().change()); // A new version is released, which should now deploy the currently deployed application version to avoid downgrades. Version version1 = new Version("6.2"); @@ -665,7 +666,7 @@ public class DeploymentTriggerTest { // Finally, the two production jobs complete, in order. tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsCentral1); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionEuWest1); - assertEquals(appVersion1, app.get().deployments().get(ZoneId.from("prod.us-central-1")).applicationVersion()); + assertEquals(appVersion1, instances.get().deployments().get(ZoneId.from("prod.us-central-1")).applicationVersion()); } @Test @@ -673,8 +674,8 @@ public class DeploymentTriggerTest { Application application1 = tester.createApplication("app1", "tenant1", 1, 1L); Application application2 = tester.createApplication("app2", "tenant2", 2, 2L); Instance instance1 = tester.defaultInstance(application1.id()); - Instance instance2 = tester.defaultInstance(application2.id()); - Supplier<Instance> app1 = () -> tester.defaultInstance(application1.id()); + Supplier<Application> app1s = () -> tester.application(application1.id()); + Supplier<Instance> instance1s = () -> tester.defaultInstance(application1.id()); ApplicationPackage applicationPackage = new ApplicationPackageBuilder() .environment(Environment.prod) .region("us-central-1") @@ -701,21 +702,21 @@ public class DeploymentTriggerTest { tester.completeUpgradeWithError(application1, version2, applicationPackage, productionUsCentral1); tester.deploy(productionUsCentral1, instance1.id(), applicationPackage); tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), false, productionUsCentral1); - assertEquals(version2, app1.get().deployments().get(productionUsCentral1.zone(main)).version()); + assertEquals(version2, instance1s.get().deployments().get(productionUsCentral1.zone(main)).version()); // version2 becomes broken and upgrade targets latest non-broken tester.upgrader().overrideConfidence(version2, VespaVersion.Confidence.broken); tester.computeVersionStatus(); tester.upgrader().maintain(); // Cancel upgrades to broken version - assertEquals("Change becomes latest non-broken version", Change.of(version1), app1.get().change()); + assertEquals("Change becomes latest non-broken version", Change.of(version1), app1s.get().change()); tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), false, productionUsCentral1); - Instant triggered = app1.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at(); + Instant triggered = instance1s.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at(); tester.clock().advance(Duration.ofHours(1)); // version1 proceeds 'til the last job, where it fails; us-central-1 is skipped, as current change is strictly dominated by what's deployed there. tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), true, systemTest); tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), true, stagingTest); - assertEquals(triggered, app1.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at()); + assertEquals(triggered, instance1s.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at()); tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), false, productionEuWest1); //Eagerly triggered system and staging tests complete. @@ -729,15 +730,15 @@ public class DeploymentTriggerTest { tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), true, stagingTest); tester.assertRunning(productionUsCentral1, instance1.id()); - assertEquals(version2, app1.get().deployments().get(productionUsCentral1.zone(main)).version()); - assertEquals(42, app1.get().deployments().get(productionUsCentral1.zone(main)).applicationVersion().buildNumber().getAsLong()); - assertNotEquals(triggered, app1.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at()); + assertEquals(version2, instance1s.get().deployments().get(productionUsCentral1.zone(main)).version()); + assertEquals(42, instance1s.get().deployments().get(productionUsCentral1.zone(main)).applicationVersion().buildNumber().getAsLong()); + assertNotEquals(triggered, instance1s.get().deploymentJobs().jobStatus().get(productionUsCentral1).lastTriggered().get().at()); // Change has a higher application version than what is deployed -- deployment should trigger. tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), false, productionUsCentral1); tester.deploy(productionUsCentral1, instance1.id(), applicationPackage); - assertEquals(version2, app1.get().deployments().get(productionUsCentral1.zone(main)).version()); - assertEquals(43, app1.get().deployments().get(productionUsCentral1.zone(main)).applicationVersion().buildNumber().getAsLong()); + assertEquals(version2, instance1s.get().deployments().get(productionUsCentral1.zone(main)).version()); + assertEquals(43, instance1s.get().deployments().get(productionUsCentral1.zone(main)).applicationVersion().buildNumber().getAsLong()); // Change is again strictly dominated, and us-central-1 is skipped, even though it is still failing. tester.clock().advance(Duration.ofHours(2).plus(Duration.ofSeconds(1))); // Enough time for retry @@ -749,8 +750,8 @@ public class DeploymentTriggerTest { tester.deployAndNotify(instance1.id(), Optional.empty(), true, systemTest); tester.deployAndNotify(instance1.id(), Optional.empty(), true, stagingTest); tester.deployAndNotify(instance1.id(), Optional.of(applicationPackage), true, productionEuWest1); - assertFalse(app1.get().change().hasTargets()); - assertFalse(app1.get().deploymentJobs().jobStatus().get(productionUsCentral1).isSuccess()); + assertFalse(app1s.get().change().hasTargets()); + assertFalse(instance1s.get().deploymentJobs().jobStatus().get(productionUsCentral1).isSuccess()); } @Test @@ -805,7 +806,7 @@ public class DeploymentTriggerTest { tester.deployAndNotify(instance.id(), Optional.empty(), false, productionUsEast3); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsEast3); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionEuWest1); - assertFalse(app.get().change().hasTargets()); + assertFalse(tester.application(application.id()).change().hasTargets()); assertEquals(43, app.get().deploymentJobs().jobStatus().get(productionEuWest1).lastSuccess().get().application().buildNumber().getAsLong()); assertEquals(43, app.get().deploymentJobs().jobStatus().get(productionUsEast3).lastSuccess().get().application().buildNumber().getAsLong()); } @@ -941,7 +942,7 @@ public class DeploymentTriggerTest { tester.clock().advance(Duration.ofSeconds(1)); // Advance time so that we can detect jobs in progress tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), false, JobType.productionUsEast3); assertEquals("Production job is retried", 1, tester.buildService().jobs().size()); - assertEquals("Application has pending upgrade to " + version, version, tester.defaultInstance(app.id()).change().platform().get()); + assertEquals("Application has pending upgrade to " + version, version, tester.application(app.id()).change().platform().get()); // Another version is released, which cancels any pending upgrades to lower versions version = Version.fromString("6.4"); @@ -949,7 +950,7 @@ public class DeploymentTriggerTest { tester.upgrader().maintain(); tester.jobCompletion(JobType.productionUsEast3).application(app).unsuccessful().submit(); assertEquals("Application starts upgrading to new version", 2, tester.buildService().jobs().size()); - assertEquals("Application has pending upgrade to " + version, version, tester.defaultInstance(app.id()).change().platform().get()); + assertEquals("Application has pending upgrade to " + version, version, tester.application(app.id()).change().platform().get()); // Failure re-deployer did not retry failing job for prod.us-east-3, since it no longer had an available change assertFalse("Job is not retried", tester.buildService().jobs().stream() @@ -992,7 +993,7 @@ public class DeploymentTriggerTest { assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber()); tester.upgrader().maintain(); tester.readyJobTrigger().maintain(); - assertEquals("Application has pending upgrade to " + version, version, tester.defaultInstance(app.id()).change().platform().get()); + assertEquals("Application has pending upgrade to " + version, version, tester.application(app.id()).change().platform().get()); // system-test fails and is left with a retry tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), false, JobType.systemTest); @@ -1005,7 +1006,7 @@ public class DeploymentTriggerTest { tester.buildService().remove(buildJob(instance.id(), systemTest)); tester.upgrader().maintain(); tester.readyJobTrigger().maintain(); - assertEquals("Application has pending upgrade to " + version, version, tester.defaultInstance(app.id()).change().platform().get()); + assertEquals("Application has pending upgrade to " + version, version, tester.application(app.id()).change().platform().get()); // Cancellation of outdated version and triggering on a new version is done by the upgrader. assertEquals(version, tester.defaultInstance(app.id()).deploymentJobs().jobStatus().get(systemTest).lastTriggered().get().platform()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java index bcc6fcfda44..3dc9de5619a 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java @@ -152,8 +152,8 @@ public class InternalDeploymentTester { assertFalse(instance().deployments().values().stream() .anyMatch(deployment -> deployment.applicationVersion().equals(applicationVersion))); - assertEquals(applicationVersion, instance().change().application().get()); - assertFalse(instance().change().platform().isPresent()); + assertEquals(applicationVersion, application().change().application().get()); + assertFalse(application().change().platform().isPresent()); runJob(JobType.systemTest); runJob(JobType.stagingTest); @@ -171,8 +171,8 @@ public class InternalDeploymentTester { tester.upgradeSystem(version); assertFalse(instance().deployments().values().stream() .anyMatch(deployment -> deployment.version().equals(version))); - assertEquals(version, instance().change().platform().get()); - assertFalse(instance().change().application().isPresent()); + assertEquals(version, application().change().platform().get()); + assertFalse(application().change().application().isPresent()); runJob(JobType.systemTest); runJob(JobType.stagingTest); @@ -190,7 +190,7 @@ public class InternalDeploymentTester { assertTrue(tester.configServer().nodeRepository() .list(JobType.productionUsEast3.zone(tester.controller().system()), instanceId).stream() .allMatch(node -> node.currentVersion().equals(version))); - assertFalse(instance().change().hasTargets()); + assertFalse(application().change().hasTargets()); } /** @@ -282,7 +282,7 @@ public class InternalDeploymentTester { * Creates and submits a new application, and then starts the job of the given type. */ public RunId newRun(JobType type) { - assertFalse(instance().deploymentJobs().deployedInternally()); // Use this only once per test. + assertFalse(application().internal()); // Use this only once per test. newSubmission(); tester.readyJobTrigger().maintain(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java index ec98fbf69cb..5f210969b4d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java @@ -2,13 +2,16 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.TenantName; +import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.Instance; import com.yahoo.vespa.hosted.controller.api.integration.organization.ApplicationSummary; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.organization.OwnershipIssues; import com.yahoo.vespa.hosted.controller.api.integration.organization.User; +import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; import com.yahoo.vespa.hosted.controller.tenant.UserTenant; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; @@ -16,6 +19,9 @@ import org.junit.Before; import org.junit.Test; import java.time.Duration; +import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.Supplier; @@ -44,12 +50,12 @@ public class ApplicationOwnershipConfirmerTest { Optional<Contact> contact = Optional.of(tester.controllerTester().serviceRegistry().contactRetrieverMock().contact()); TenantName property = tester.controllerTester().createTenant("property", "domain", 1L, contact); tester.createAndDeploy(property, "application", 1, "default"); - Supplier<Instance> propertyApp = () -> tester.controller().applications().requireInstance(ApplicationId.from("property", "application", "default")); + Supplier<Application> propertyApp = () -> tester.controller().applications().requireApplication(TenantAndApplicationId.from("property", "application")); UserTenant user = UserTenant.create("by-user", contact); tester.controller().tenants().createUser(user); tester.createAndDeploy(user.name(), "application", 2, "default"); - Supplier<Instance> userApp = () -> tester.controller().applications().requireInstance(ApplicationId.from("by-user", "application", "default")); + Supplier<Application> userApp = () -> tester.controller().applications().requireApplication(TenantAndApplicationId.from("by-user", "application")); assertFalse("No issue is initially stored for a new application.", propertyApp.get().ownershipIssueId().isPresent()); assertFalse("No issue is initially stored for a new application.", userApp.get().ownershipIssueId().isPresent()); @@ -80,9 +86,15 @@ public class ApplicationOwnershipConfirmerTest { // The user deletes all production deployments — see that the issue is forgotten. assertEquals("Confirmation issue for user is sitll open.", issueId, userApp.get().ownershipIssueId()); - tester.controller().applications().deactivate(userApp.get().id(), userApp.get().productionDeployments().keySet().stream().findAny().get()); - tester.controller().applications().deactivate(userApp.get().id(), userApp.get().productionDeployments().keySet().stream().findAny().get()); - assertTrue("No production deployments are listed for user.", userApp.get().productionDeployments().isEmpty()); + tester.controller().applications().deactivate(userApp.get().id().defaultInstance(), + userApp.get().productionDeployments().values().stream() + .flatMap(List::stream) + .findAny().get().zone()); + tester.controller().applications().deactivate(userApp.get().id().defaultInstance(), + userApp.get().productionDeployments().values().stream() + .flatMap(List::stream) + .findAny().get().zone()); + assertTrue("No production deployments are listed for user.", userApp.get().require(InstanceName.defaultName()).productionDeployments().isEmpty()); confirmer.maintain(); // Time has passed, and a new confirmation issue is in order for the property which is still in production. diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java index cf33b354139..73ddeeaa0c6 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.Instance; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.application.v4.model.ClusterMetrics; @@ -40,8 +41,9 @@ public class DeploymentMetricsMaintainerTest { deploy(application.id().defaultInstance(), Version.fromString("7.1")); DeploymentMetricsMaintainer maintainer = maintainer(tester.controller()); - Supplier<Instance> app = () -> tester.defaultInstance(application.id()); - Supplier<Deployment> deployment = () -> app.get().deployments().values().stream().findFirst().get(); + Supplier<Application> app = () -> tester.application(application.id()); + Supplier<Instance> instance = () -> tester.defaultInstance(application.id()); + Supplier<Deployment> deployment = () -> instance.get().deployments().values().stream().findFirst().get(); // No metrics gathered yet assertEquals(0, app.get().metrics().queryServiceQuality(), 0); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java index 02282894544..bec2c9c7bc4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java @@ -45,8 +45,8 @@ public class OutstandingChangeDeployerTest { tester.deploymentTrigger().triggerChange(app1.id(), Change.of(version)); tester.deploymentTrigger().triggerReadyJobs(); - assertEquals(Change.of(version), tester.defaultInstance("app1").change()); - assertFalse(tester.defaultInstance("app1").outstandingChange().hasTargets()); + assertEquals(Change.of(version), tester.application(app1.id()).change()); + assertFalse(tester.application(app1.id()).outstandingChange().hasTargets()); tester.jobCompletion(JobType.component) .application(app1) @@ -56,14 +56,14 @@ public class OutstandingChangeDeployerTest { .submit(); Instance instance = tester.defaultInstance("app1"); - assertTrue(instance.outstandingChange().hasTargets()); - assertEquals("1.0.43-cafed00d", instance.outstandingChange().application().get().id()); + assertTrue(tester.application(app1.id()).outstandingChange().hasTargets()); + assertEquals("1.0.43-cafed00d", tester.application(app1.id()).outstandingChange().application().get().id()); assertEquals(2, tester.buildService().jobs().size()); deployer.maintain(); tester.deploymentTrigger().triggerReadyJobs(); assertEquals("No effect as job is in progress", 2, tester.buildService().jobs().size()); - assertEquals("1.0.43-cafed00d", instance.outstandingChange().application().get().id()); + assertEquals("1.0.43-cafed00d", tester.application(app1.id()).outstandingChange().application().get().id()); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, JobType.systemTest); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, JobType.stagingTest); @@ -75,12 +75,12 @@ public class OutstandingChangeDeployerTest { deployer.maintain(); tester.deploymentTrigger().triggerReadyJobs(); instance = tester.defaultInstance("app1"); - assertEquals("1.0.43-cafed00d", instance.change().application().get().id()); + assertEquals("1.0.43-cafed00d", tester.application(app1.id()).change().application().get().id()); List<BuildService.BuildJob> jobs = tester.buildService().jobs(); assertEquals(1, jobs.size()); assertEquals(JobType.productionUsWest1.jobName(), jobs.get(0).jobName()); assertEquals(app1.id().defaultInstance(), jobs.get(0).applicationId()); - assertFalse(tester.defaultInstance("app1").outstandingChange().hasTargets()); + assertFalse(tester.application(app1.id()).outstandingChange().hasTargets()); } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java index e247c2af3c9..d979f1753c4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java @@ -204,11 +204,11 @@ public class UpgraderTest { tester.triggerUntilQuiescence(); assertEquals("Upgrade of defaults are scheduled", 10, tester.buildService().jobs().size()); - assertEquals(version4, tester.defaultInstance(default0.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default1.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default2.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default3.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default4.id()).change().platform().get()); + assertEquals(version4, tester.application(default0.id()).change().platform().get()); + assertEquals(version4, tester.application(default1.id()).change().platform().get()); + assertEquals(version4, tester.application(default2.id()).change().platform().get()); + assertEquals(version4, tester.application(default3.id()).change().platform().get()); + assertEquals(version4, tester.application(default4.id()).change().platform().get()); tester.completeUpgrade(default0, version4, "default"); // State: Default applications started upgrading to version4 (and one completed) @@ -224,11 +224,11 @@ public class UpgraderTest { tester.triggerUntilQuiescence(); assertEquals("Upgrade of defaults are scheduled", 10, tester.buildService().jobs().size()); - assertEquals(version5, tester.defaultInstance(default0.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default1.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default2.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default3.id()).change().platform().get()); - assertEquals(version4, tester.defaultInstance(default4.id()).change().platform().get()); + assertEquals(version5, tester.application(default0.id()).change().platform().get()); + assertEquals(version4, tester.application(default1.id()).change().platform().get()); + assertEquals(version4, tester.application(default2.id()).change().platform().get()); + assertEquals(version4, tester.application(default3.id()).change().platform().get()); + assertEquals(version4, tester.application(default4.id()).change().platform().get()); tester.completeUpgrade(default1, version4, "default"); tester.completeUpgrade(default2, version4, "default"); @@ -260,7 +260,7 @@ public class UpgraderTest { assertEquals("Upgrade of defaults are scheduled on " + version4 + " instead, since " + version5 + " is broken: " + "This is default3 since it failed upgrade on both " + version4 + " and " + version5, 2, tester.buildService().jobs().size()); - assertEquals(version4, tester.defaultInstance(default3.id()).change().platform().get()); + assertEquals(version4, tester.application(default3.id()).change().platform().get()); } @Test @@ -371,7 +371,7 @@ public class UpgraderTest { // staging-test fails and failure is recorded tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), false, stagingTest); assertTrue("Failure is recorded", tester.defaultInstance(app.id()).deploymentJobs().hasFailures()); - assertTrue("Application has pending change", tester.defaultInstance(app.id()).change().hasTargets()); + assertTrue("Application has pending change", tester.application(app.id()).change().hasTargets()); // New version is released version = Version.fromString("6.4"); @@ -435,7 +435,7 @@ public class UpgraderTest { tester.triggerUntilQuiescence(); // apps pass system-test, but do not trigger next jobs as upgrade is cancelled - assertFalse("No change present", tester.applications().requireInstance(default4.id().defaultInstance()).change().hasTargets()); + assertFalse("No change present", tester.application(default4.id()).change().hasTargets()); tester.jobCompletion(systemTest).application(default0).submit(); tester.jobCompletion(systemTest).application(default1).submit(); tester.jobCompletion(systemTest).application(default2).submit(); @@ -510,7 +510,7 @@ public class UpgraderTest { tester.upgrader().maintain(); tester.triggerUntilQuiescence(); assertEquals("Upgrade scheduled for remaining apps", 10, tester.buildService().jobs().size()); - assertEquals("default4 is still upgrading to 5.1", v1, tester.defaultInstance(default4.id()).change().platform().get()); + assertEquals("default4 is still upgrading to 5.1", v1, tester.application(default4.id()).change().platform().get()); // 4/5 applications fail (in the last prod zone) and lowers confidence tester.completeUpgradeWithError(default0, v2, "default", productionUsEast3); @@ -538,7 +538,7 @@ public class UpgraderTest { assertEquals(v2, tester.defaultInstance("default0").deployments().get(ZoneId.from("prod.us-west-1")).version()); assertEquals("Last zone is upgraded to v1", v1, tester.defaultInstance("default0").deployments().get(ZoneId.from("prod.us-east-3")).version()); - assertFalse(tester.defaultInstance("default0").change().hasTargets()); + assertFalse(tester.application(default0.id()).change().hasTargets()); } @Test @@ -822,9 +822,8 @@ public class UpgraderTest { tester.jobCompletion(stagingTest).application(default4).unsuccessful().submit(); // 5th app never reports back and has a dead job, but no ongoing change - Instance deadLocked = tester.applications().requireInstance(default4.id().defaultInstance()); - tester.assertRunning(systemTest, deadLocked.id()); - assertFalse("No change present", deadLocked.change().hasTargets()); + tester.assertRunning(systemTest, tester.defaultInstance(default4.id()).id()); + assertFalse("No change present", tester.application(default4.id()).change().hasTargets()); // 4 out of 5 applications are repaired and confidence is restored ApplicationPackage defaultApplicationPackageV2 = new ApplicationPackageBuilder() @@ -850,10 +849,10 @@ public class UpgraderTest { tester.completeUpgrade(default2, version, defaultApplicationPackageV2); tester.completeUpgrade(default3, version, defaultApplicationPackageV2); - assertEquals(version, tester.defaultInstance(default0.id()).oldestDeployedPlatform().get()); - assertEquals(version, tester.defaultInstance(default1.id()).oldestDeployedPlatform().get()); - assertEquals(version, tester.defaultInstance(default2.id()).oldestDeployedPlatform().get()); - assertEquals(version, tester.defaultInstance(default3.id()).oldestDeployedPlatform().get()); + assertEquals(version, tester.application(default0.id()).oldestDeployedPlatform().get()); + assertEquals(version, tester.application(default1.id()).oldestDeployedPlatform().get()); + assertEquals(version, tester.application(default2.id()).oldestDeployedPlatform().get()); + assertEquals(version, tester.application(default3.id()).oldestDeployedPlatform().get()); } @Test @@ -959,7 +958,7 @@ public class UpgraderTest { Application canary0 = tester.createAndDeploy("canary0", 1, "canary"); Application default0 = tester.createAndDeploy("default0", 2, default0ApplicationPackage); tester.applications().lockApplicationOrThrow(default0.id(), a -> tester.applications().store(a.withMajorVersion(6))); - assertEquals(OptionalInt.of(6), tester.applications().getInstance(default0.id().defaultInstance()).get().majorVersion()); + assertEquals(OptionalInt.of(6), tester.application(default0.id()).majorVersion()); // New major version is released version = Version.fromString("7.0"); @@ -1179,16 +1178,16 @@ public class UpgraderTest { assertEquals(Collections.emptyList(), tester.buildService().jobs()); // No jobs left. tester.outstandingChangeDeployer().run(); - assertFalse(tester.defaultInstance(app.id()).change().hasTargets()); + assertFalse(tester.application(app.id()).change().hasTargets()); tester.clock().advance(Duration.ofHours(2)); tester.outstandingChangeDeployer().run(); - assertTrue(tester.defaultInstance(app.id()).change().hasTargets()); + assertTrue(tester.application(app.id()).change().hasTargets()); tester.readyJobTrigger().run(); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsWest1); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsCentral1); tester.deployAndNotify(instance.id(), Optional.of(applicationPackage), true, productionUsEast3); - assertFalse(tester.defaultInstance(app.id()).change().hasTargets()); + assertFalse(tester.application(app.id()).change().hasTargets()); } @Test @@ -1207,33 +1206,33 @@ public class UpgraderTest { tester.deploymentTrigger().forceChange(application.id(), Change.empty().withPin()); tester.deployCompletely(application, applicationPackage); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); - assertTrue(tester.defaultInstance(application.id()).change().isPinned()); + assertFalse(tester.application(application.id()).change().hasTargets()); + assertTrue(tester.application(application.id()).change().isPinned()); assertEquals(2, tester.defaultInstance(application.id()).deployments().size()); // Application does not upgrade. Version version1 = Version.fromString("6.3"); tester.upgradeSystem(version1); tester.upgrader().maintain(); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); - assertTrue(tester.defaultInstance(application.id()).change().isPinned()); + assertFalse(tester.application(application.id()).change().hasTargets()); + assertTrue(tester.application(application.id()).change().isPinned()); // New application package is deployed. tester.deployCompletely(application, applicationPackage, BuildJob.defaultBuildNumber + 1); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); - assertTrue(tester.defaultInstance(application.id()).change().isPinned()); + assertFalse(tester.application(application.id()).change().hasTargets()); + assertTrue(tester.application(application.id()).change().isPinned()); // Application upgrades to new version when pin is removed. tester.deploymentTrigger().cancelChange(application.id(), PIN); tester.upgrader().maintain(); - assertTrue(tester.defaultInstance(application.id()).change().hasTargets()); - assertFalse(tester.defaultInstance(application.id()).change().isPinned()); + assertTrue(tester.application(application.id()).change().hasTargets()); + assertFalse(tester.application(application.id()).change().isPinned()); // Application is pinned to new version, and upgrade is therefore not cancelled, even though confidence is broken. tester.deploymentTrigger().forceChange(application.id(), Change.empty().withPin()); tester.upgrader().maintain(); tester.readyJobTrigger().maintain(); - assertEquals(version1, tester.defaultInstance(application.id()).change().platform().get()); + assertEquals(version1, tester.application(application.id()).change().platform().get()); // Application fails upgrade after one zone is complete, and is pinned again to the old version. tester.deployAndNotify(instance.id(), Optional.empty(), true, systemTest); @@ -1244,16 +1243,16 @@ public class UpgraderTest { tester.deploymentTrigger().cancelChange(application.id(), ALL); tester.deploymentTrigger().forceChange(application.id(), Change.of(version0).withPin()); tester.buildService().clear(); - assertEquals(version0, tester.defaultInstance(application.id()).change().platform().get()); + assertEquals(version0, tester.application(application.id()).change().platform().get()); // Application downgrades to pinned version. tester.readyJobTrigger().maintain(); tester.deployAndNotify(instance.id(), Optional.empty(), true, systemTest); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsEast3); - assertTrue(tester.defaultInstance(application.id()).change().hasTargets()); + assertTrue(tester.application(application.id()).change().hasTargets()); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsWest1); - assertFalse(tester.defaultInstance(application.id()).change().hasTargets()); + assertFalse(tester.application(application.id()).change().hasTargets()); } @Test @@ -1288,14 +1287,14 @@ public class UpgraderTest { // App 2 is allowed on new major and upgrades tester.controller().applications().lockApplicationIfPresent(app2.id(), app -> tester.applications().store(app.withMajorVersion(7))); tester.upgrader().maintain(); - assertEquals(version2, tester.controller().applications().requireInstance(app2.id().defaultInstance()).change().platform().get()); + assertEquals(version2, tester.application(app2.id()).change().platform().orElseThrow()); // App 1 is unpinned and upgrades to latest 6 tester.controller().applications().lockApplicationIfPresent(app1.id(), app -> tester.controller().applications().store(app.withChange(app.get().change().withoutPin()))); tester.upgrader().maintain(); assertEquals("Application upgrades to latest allowed major", version1, - tester.controller().applications().requireInstance(app1.id().defaultInstance()).change().platform().get()); + tester.application(app1.id()).change().platform().orElseThrow()); } @Test @@ -1303,7 +1302,8 @@ public class UpgraderTest { DeploymentTester tester = new DeploymentTester(); Application application = tester.createApplication("app1", "tenant1", 1, 1L); Instance instance = tester.defaultInstance(application.id()); - Supplier<Instance> app = () -> tester.defaultInstance(application.id()); + Supplier<Application> applications = () -> tester.application(application.id()); + Supplier<Instance> instances = () -> tester.defaultInstance(application.id()); ApplicationPackage applicationPackage = new ApplicationPackageBuilder() .environment(Environment.prod) .region("us-central-1") @@ -1319,7 +1319,7 @@ public class UpgraderTest { Version v2 = Version.fromString("6.2"); tester.upgradeSystem(v2); tester.upgrader().maintain(); - assertEquals(Change.of(v2), app.get().change()); + assertEquals(Change.of(v2), applications.get().change()); tester.deployAndNotify(instance.id(), Optional.empty(), true, systemTest); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsCentral1); @@ -1329,13 +1329,13 @@ public class UpgraderTest { tester.computeVersionStatus(); tester.upgrader().maintain(); tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsWest1); - assertTrue(app.get().change().isEmpty()); + assertTrue(applications.get().change().isEmpty()); // Next version is released Version v3 = Version.fromString("6.3"); tester.upgradeSystem(v3); tester.upgrader().maintain(); - assertEquals(Change.of(v3), app.get().change()); + assertEquals(Change.of(v3), applications.get().change()); tester.deployAndNotify(instance.id(), Optional.empty(), true, systemTest); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); @@ -1345,22 +1345,22 @@ public class UpgraderTest { // Before deployment completes, v1->v3 combination is tested as us-east-3 is still on v1 tester.readyJobTrigger().maintain(); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); - assertEquals(v1, app.get().deploymentJobs().jobStatus().get(stagingTest).lastSuccess().get().sourcePlatform().get()); - assertEquals(v3, app.get().deploymentJobs().jobStatus().get(stagingTest).lastSuccess().get().platform()); + assertEquals(v1, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastSuccess().get().sourcePlatform().get()); + assertEquals(v3, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastSuccess().get().platform()); // First deployment fails and then successfully upgrades to v3 tester.jobCompletion(productionUsCentral1).application(application).unsuccessful().submit(); tester.jobCompletion(productionUsCentral1).application(application).submit(); // Deployments are now on 3 versions - assertEquals(v3, app.get().deployments().get(productionUsCentral1.zone(main)).version()); - assertEquals(v2, app.get().deployments().get(productionUsWest1.zone(main)).version()); - assertEquals(v1, app.get().deployments().get(productionUsEast3.zone(main)).version()); + assertEquals(v3, instances.get().deployments().get(productionUsCentral1.zone(main)).version()); + assertEquals(v2, instances.get().deployments().get(productionUsWest1.zone(main)).version()); + assertEquals(v1, instances.get().deployments().get(productionUsEast3.zone(main)).version()); // Need to test v2->v3 combination again before upgrading second deployment tester.readyJobTrigger().maintain(); - assertEquals(v2, app.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().sourcePlatform().get()); - assertEquals(v3, app.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().platform()); + assertEquals(v2, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().sourcePlatform().get()); + assertEquals(v3, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().platform()); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); // Second deployment upgrades @@ -1368,13 +1368,13 @@ public class UpgraderTest { // ... now we have to test v1->v3 again :( tester.readyJobTrigger().maintain(); - assertEquals(v1, app.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().sourcePlatform().get()); - assertEquals(v3, app.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().platform()); + assertEquals(v1, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().sourcePlatform().get()); + assertEquals(v3, instances.get().deploymentJobs().jobStatus().get(stagingTest).lastTriggered().get().platform()); tester.deployAndNotify(instance.id(), Optional.empty(), true, stagingTest); // Upgrade completes tester.deployAndNotify(instance.id(), Optional.empty(), true, productionUsEast3); - assertTrue("Upgrade complete", app.get().change().isEmpty()); + assertTrue("Upgrade complete", applications.get().change().isEmpty()); } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java index fb5f28e1963..6cb808133e3 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java @@ -55,7 +55,7 @@ public class JobControllerApiHandlerHelperTest { // Revision 1 gets deployed everywhere. ApplicationVersion revision1 = tester.deployNewSubmission(); - assertEquals(2, tester.instance().deploymentJobs().projectId().getAsLong()); + assertEquals(2, tester.application().projectId().getAsLong()); tester.clock().advance(Duration.ofMillis(1000)); // Revision 2 gets deployed everywhere except in us-east-3. |