diff options
author | jonmv <venstad@gmail.com> | 2022-06-23 10:00:02 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-06-23 10:00:02 +0200 |
commit | a5500136124d1270ce168b54ec3268c92c570bb2 (patch) | |
tree | 98dbd3f844c39bf6315954dffe417b62b38b08a9 | |
parent | 5be9df33cf7f84d27dfd7a1c4cc18aebcd6a5547 (diff) |
Stash with partial multile job types
4 files changed, 79 insertions, 20 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobType.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobType.java index 77879699ab9..53ced68be62 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobType.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobType.java @@ -1,9 +1,13 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.api.integration.deployment; +import com.yahoo.config.provision.Cloud; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.config.provision.zone.ZoneList; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry; import java.util.Comparator; @@ -38,18 +42,28 @@ public final class JobType implements Comparable<JobType> { } /** A system test in a test zone, or throws if no test zones are present.. */ - public static JobType systemTest(ZoneRegistry zones) { - return testIn(test, zones); + public static JobType systemTest(ZoneRegistry zones, CloudName cloud) { + return testIn(test, zones, cloud); } /** A staging test in a staging zone, or throws if no staging zones are present. */ - public static JobType stagingTest(ZoneRegistry zones){ - return testIn(staging, zones); + public static JobType stagingTest(ZoneRegistry zones, CloudName cloud){ + return testIn(staging, zones, cloud); } - private static JobType testIn(Environment environment, ZoneRegistry zones) { - return zones.zones().controllerUpgraded().in(environment).zones().stream().map(zone -> deploymentTo(zone.getId())) - .findFirst().orElseThrow(() -> new IllegalArgumentException("no zones in " + environment + " among " + zones.zones().controllerUpgraded().zones())); + private static CloudName extractCloud(String jobNameRest) { + return jobNameRest.contains("-") ? CloudName.from(jobNameRest.substring(jobNameRest.indexOf('-') + 1)) : null; + } + + /** Returns a test job in the given environment, preferring the given cloud, is possible; using the system cloud otherwise. */ + private static JobType testIn(Environment environment, ZoneRegistry zones, CloudName cloud) { + ZoneList candidates = zones.zones().controllerUpgraded().in(environment); + if (cloud == null || candidates.in(cloud).zones().isEmpty()) + cloud = zones.systemZone().getCloudName(); + + return candidates.in(cloud).zones().stream().map(zone -> deploymentTo(zone.getId())) + .findFirst().orElseThrow(() -> new IllegalArgumentException("no zones in " + environment + " among " + + zones.zones().controllerUpgraded().zones())); } /** A deployment to the given dev region. */ @@ -93,6 +107,18 @@ public final class JobType implements Comparable<JobType> { } /** A deployment to the given zone; this may be a zone in the {@code test} or {@code staging} environments. */ + public static JobType deploymentTo(ZoneId zone, CloudName cloud) { + String name; + switch (zone.environment()) { + case prod: name = "production-" + zone.region().value(); break; + case test: name = "system-test"; break; + case staging: name = "staging-test"; break; + default: name = zone.environment().value() + "-" + zone.region().value(); + } + return new JobType(name, zone, false); + } + + /** A deployment to the given zone; this may be a zone in the {@code test} or {@code staging} environments. */ public static JobType deploymentTo(ZoneId zone) { String name; switch (zone.environment()) { @@ -121,16 +147,16 @@ public final class JobType implements Comparable<JobType> { /** Creates a new job type from a job name, and a zone registry for looking up zones for the special system and staging test types. */ public static JobType fromJobName(String jobName, ZoneRegistry zones) { String[] parts = jobName.split("-", 2); - if (parts.length != 2) throw new IllegalArgumentException("job names must be 'system-test', 'staging-test', or environment and region parts, separated by '-', but got: " + jobName); - switch (parts[0]) { - case "system": return systemTest(zones); - case "staging": return stagingTest(zones); - case "production": return prod(parts[1]); - case "test": return test(parts[1]); - case "dev": return dev(parts[1]); - case "perf": return perf(parts[1]); - default: throw new IllegalArgumentException("job names must begin with one of: system, staging, production, test, dev, perf; but got: " + jobName); - } + if (parts.length == 2) + switch (parts[0]) { + case "system": return systemTest(zones, extractCloud(parts[1])); + case "staging": return stagingTest(zones, extractCloud(parts[1])); + case "production": return prod(parts[1]); + case "test": return test(parts[1]); + case "dev": return dev(parts[1]); + case "perf": return perf(parts[1]); + } + throw new IllegalArgumentException("job names must be 'system-test[-<cloud>]', 'staging-test[-<cloud>]', or <test|environment>-<region>, but got: " + jobName); } public static List<JobType> allIn(ZoneRegistry zones) { diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java index 6ff52bd5f03..bbe0c2bd458 100644 --- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java +++ b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java @@ -48,4 +48,4 @@ public class JobTypeTest { assertTrue(JobType.test("snohetta").isProduction()); } -} +}
\ No newline at end of file diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java index 7578c133fc6..996076b81c2 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java @@ -11,8 +11,10 @@ import com.yahoo.config.application.api.DeploymentSpec.DeclaredTest; import com.yahoo.config.application.api.DeploymentSpec.DeclaredZone; import com.yahoo.config.application.api.DeploymentSpec.UpgradeRollout; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.stream.CustomCollectors; import com.yahoo.vespa.hosted.controller.Application; @@ -86,8 +88,8 @@ public class DeploymentStatus { Version systemVersion, Function<InstanceName, VersionCompatibility> versionCompatibility, Instant now) { this.application = requireNonNull(application); this.zones = zones; - this.systemTest = JobType.systemTest(zones); - this.stagingTest = JobType.stagingTest(zones); + this.systemTest = JobType.systemTest(zones, null); + this.stagingTest = JobType.stagingTest(zones, null); this.versionStatus = requireNonNull(versionStatus); this.systemVersion = requireNonNull(systemVersion); this.versionCompatibility = versionCompatibility; 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 67ddc767b39..63ab0e32bf9 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 @@ -1,24 +1,33 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.deployment; +import ai.vespa.cloud.Environment; import com.yahoo.component.Version; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.SystemName; +import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.flags.PermanentFlags; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.Instance; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobId; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RevisionId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.pkg.ApplicationPackage; +import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; +import com.yahoo.vespa.hosted.controller.integration.ZoneRegistryMock; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; import org.junit.Assert; import org.junit.Test; import java.time.Duration; import java.time.Instant; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -2287,4 +2296,26 @@ public class DeploymentTriggerTest { assertTrue(tester.jobs().last(app.instanceId(), stagingTest).get().hasSucceeded()); } + @Test + public void testJobNames() { + ZoneRegistryMock zones = new ZoneRegistryMock(SystemName.main); + List<ZoneApi> existing = new ArrayList<>(zones.zones().all().zones()); + existing.add(ZoneApiMock.newBuilder().withCloud("pink-clouds").withId("test.zone").build()); + zones.setZones(existing); + + JobType systemTest = JobType.systemTest(zones, CloudName.defaultName()); + JobType pinkSystemTest = JobType.systemTest(zones, CloudName.from("pink-clouds")); + + assertEquals(systemTest, JobType.systemTest(zones, null)); + assertEquals(systemTest, JobType.systemTest(zones, CloudName.from("dark-clouds"))); + + assertEquals(systemTest, JobType.fromJobName("system-test", zones)); + assertEquals(systemTest, JobType.fromJobName("system-test-default", zones)); + assertEquals(systemTest, JobType.fromJobName("system-test-dark-clouds", zones)); + assertEquals(pinkSystemTest, JobType.fromJobName("system-test-pink-clouds", zones)); + + assertEquals(ZoneId.from("test", "us-east-1"), systemTest.zone()); + assertEquals(ZoneId.from("staging", "us-east-3"), JobType.stagingTest(zones, null).zone()); + } + } |