summaryrefslogtreecommitdiffstats
path: root/controller-server/src
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java39
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/AssignedRotation.java48
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/MailVerifier.java (renamed from controller-server/src/main/java/com/yahoo/vespa/hosted/controller/MailVerifier.java)10
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java32
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/MailVerificationSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NotificationsSerializer.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/certificate/EndpointCertificatesHandler.java (renamed from controller-server/src/main/java/com/yahoo/vespa/hosted/controller/certificate/EndpointCertificatesHandler.java)4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java18
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/MailVerifierTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java18
14 files changed, 88 insertions, 110 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
index 727f2f58c90..1bcef125e8c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
@@ -428,14 +428,6 @@ public class ApplicationController {
(wantedMajor.isPresent() ? " for specified major: " + wantedMajor.getAsInt() : ""));
}
- private OptionalInt firstNonEmpty(OptionalInt... choices) {
- for (OptionalInt choice : choices)
- if (choice.isPresent())
- return choice;
-
- return OptionalInt.empty();
- }
-
/**
* Creates a new application for an existing tenant.
*
@@ -729,10 +721,12 @@ public class ApplicationController {
// Remove the instance as well, if it is no longer referenced, and contains only production deployments that are removed now.
boolean removeInstance = ! deploymentSpec.instanceNames().contains(instance)
&& application.get().require(instance).deployments().size() == deploymentsToRemove.size();
- for (ZoneId zone : deploymentsToRemove)
- application = deactivate(application, instance, zone);
- if (removeInstance)
+ for (ZoneId zone : deploymentsToRemove) {
+ application = deactivate(application.get().id().instance(instance), zone, Optional.of(application)).get();
+ }
+ if (removeInstance) {
application = application.without(instance);
+ }
return application;
}
@@ -871,10 +865,13 @@ public class ApplicationController {
configServer.setSuspension(deploymentId, suspend);
}
- /** Deactivate application in the given zone */
- public void deactivate(ApplicationId id, ZoneId zone) {
- lockApplicationOrThrow(TenantAndApplicationId.from(id),
- application -> store(deactivate(application, id.instance(), zone)));
+ /** Deactivate application in the given zone. Even if the application itself does not exist, deactivation of the deployment will still be attempted */
+ public void deactivate(ApplicationId instanceId, ZoneId zone) {
+ TenantAndApplicationId applicationId = TenantAndApplicationId.from(instanceId);
+ try (Mutex lock = lock(applicationId)) {
+ Optional<LockedApplication> application = getApplication(applicationId).map(app -> new LockedApplication(app, lock));
+ deactivate(instanceId, zone, application).ifPresent(this::store);
+ }
}
/**
@@ -882,18 +879,18 @@ public class ApplicationController {
*
* @return the application with the deployment in the given zone removed
*/
- private LockedApplication deactivate(LockedApplication application, InstanceName instanceName, ZoneId zone) {
- DeploymentId id = new DeploymentId(application.get().id().instance(instanceName), zone);
+ private Optional<LockedApplication> deactivate(ApplicationId instanceId, ZoneId zone, Optional<LockedApplication> application) {
+ DeploymentId id = new DeploymentId(instanceId, zone);
try {
configServer.deactivate(id);
} finally {
- controller.routing().of(id).configure(application.get().deploymentSpec());
- if (zone.environment().isManuallyDeployed())
+ application.ifPresent(app -> controller.routing().of(id).configure(app.get().deploymentSpec()));
+ if (id.zoneId().environment().isManuallyDeployed())
applicationStore.putMetaTombstone(id, clock.instant());
- if (!zone.environment().isTest())
+ if (!id.zoneId().environment().isTest())
controller.notificationsDb().removeNotifications(NotificationSource.from(id));
}
- return application.with(instanceName, instance -> instance.withoutDeploymentIn(zone));
+ return application.map(app -> app.with(instanceId.instance(), instance -> instance.withoutDeploymentIn(id.zoneId())));
}
public DeploymentTrigger deploymentTrigger() { return deploymentTrigger; }
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
index 9a7fffd2a9e..c8ec38ec73b 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
@@ -17,6 +17,7 @@ import com.yahoo.vespa.flags.FlagSource;
import com.yahoo.vespa.hosted.controller.api.integration.ServiceRegistry;
import com.yahoo.vespa.hosted.controller.api.integration.maven.MavenRepository;
import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry;
+import com.yahoo.vespa.hosted.controller.application.MailVerifier;
import com.yahoo.vespa.hosted.controller.archive.CuratorArchiveBucketDb;
import com.yahoo.vespa.hosted.controller.auditlog.AuditLogger;
import com.yahoo.vespa.hosted.controller.config.ControllerConfig;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java
index f8135e27d74..bdf3d438bd7 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java
@@ -51,12 +51,11 @@ public abstract class LockedTenant {
}
static LockedTenant of(Tenant tenant, Mutex lock) {
- switch (tenant.type()) {
- case athenz: return new Athenz((AthenzTenant) tenant);
- case cloud: return new Cloud((CloudTenant) tenant);
- case deleted: return new Deleted((DeletedTenant) tenant);
- default: throw new IllegalArgumentException("Unexpected tenant type '" + tenant.getClass().getName() + "'.");
- }
+ return switch (tenant.type()) {
+ case athenz -> new Athenz((AthenzTenant) tenant);
+ case cloud -> new Cloud((CloudTenant) tenant);
+ case deleted -> new Deleted((DeletedTenant) tenant);
+ };
}
/** Returns a read-only copy of this */
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
index 411c2c133f5..2d3c060c7b5 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
@@ -2,17 +2,12 @@
package com.yahoo.vespa.hosted.controller.application;
import com.yahoo.collections.AbstractFilteringList;
-import com.yahoo.component.Version;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.ApplicationController;
-import java.time.Instant;
import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Collectors;
/**
* A list of applications which can be filtered in various ways.
@@ -36,7 +31,7 @@ public class ApplicationList extends AbstractFilteringList<Application, Applicat
.map(TenantAndApplicationId::from)
.distinct()
.map(applications::requireApplication)
- .collect(Collectors.toUnmodifiableList()));
+ .toList());
}
// ----------------------------------- Filters
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/AssignedRotation.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/AssignedRotation.java
index ab9304e75f3..eeeb822ecf5 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/AssignedRotation.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/AssignedRotation.java
@@ -5,10 +5,8 @@ import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.RegionName;
import com.yahoo.vespa.hosted.controller.routing.rotation.RotationId;
-import java.util.Collection;
import java.util.Objects;
import java.util.Set;
-import java.util.stream.Collectors;
/**
* Contains the tuple of [clusterId, endpointId, rotationId, regions[]], to keep track
@@ -16,11 +14,7 @@ import java.util.stream.Collectors;
*
* @author ogronnesby
*/
-public class AssignedRotation {
- private final ClusterSpec.Id clusterId;
- private final EndpointId endpointId;
- private final RotationId rotationId;
- private final Set<RegionName> regions;
+public record AssignedRotation(ClusterSpec.Id clusterId, EndpointId endpointId, RotationId rotationId, Set<RegionName> regions) {
public AssignedRotation(ClusterSpec.Id clusterId, EndpointId endpointId, RotationId rotationId, Set<RegionName> regions) {
this.clusterId = requireNonEmpty(clusterId, clusterId.value(), "clusterId");
@@ -29,35 +23,14 @@ public class AssignedRotation {
this.regions = Set.copyOf(Objects.requireNonNull(regions));
}
- public ClusterSpec.Id clusterId() { return clusterId; }
- public EndpointId endpointId() { return endpointId; }
- public RotationId rotationId() { return rotationId; }
- public Set<RegionName> regions() { return regions; }
-
@Override
public String toString() {
return "AssignedRotation{" +
- "clusterId=" + clusterId +
- ", endpointId='" + endpointId + '\'' +
- ", rotationId=" + rotationId +
- ", regions=" + regions +
- '}';
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- AssignedRotation that = (AssignedRotation) o;
- return clusterId.equals(that.clusterId) &&
- endpointId.equals(that.endpointId) &&
- rotationId.equals(that.rotationId) &&
- regions.equals(that.regions);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(clusterId, endpointId, rotationId, regions);
+ "clusterId=" + clusterId +
+ ", endpointId='" + endpointId + '\'' +
+ ", rotationId=" + rotationId +
+ ", regions=" + regions +
+ '}';
}
private static <T> T requireNonEmpty(T object, String value, String field) {
@@ -69,13 +42,4 @@ public class AssignedRotation {
return object;
}
- /** Convenience method intended for tests */
- public static AssignedRotation fromStrings(String clusterId, String endpointId, String rotationId, Collection<String> regions) {
- return new AssignedRotation(
- new ClusterSpec.Id(clusterId),
- EndpointId.of(endpointId),
- new RotationId(rotationId),
- regions.stream().map(RegionName::from).collect(Collectors.toSet())
- );
- }
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java
index cbac700a9a0..1eb68c14353 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java
@@ -31,7 +31,6 @@ import static java.util.Comparator.comparing;
*/
public class Endpoint {
- private static final String YAHOO_DNS_SUFFIX = ".vespa.yahooapis.com";
private static final String OATH_DNS_SUFFIX = ".vespa.oath.cloud";
private static final String PUBLIC_DNS_SUFFIX = ".vespa-app.cloud";
private static final String PUBLIC_CD_DNS_SUFFIX = ".cd.vespa-app.cloud";
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/MailVerifier.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/MailVerifier.java
index 902343d5acf..afb0b61c23a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/MailVerifier.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/MailVerifier.java
@@ -1,7 +1,9 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller;
+package com.yahoo.vespa.hosted.controller.application;
import com.yahoo.config.provision.TenantName;
+import com.yahoo.vespa.hosted.controller.LockedTenant;
+import com.yahoo.vespa.hosted.controller.TenantController;
import com.yahoo.vespa.hosted.controller.api.integration.organization.Mail;
import com.yahoo.vespa.hosted.controller.api.integration.organization.Mailer;
import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
@@ -26,13 +28,13 @@ import static com.yahoo.yolean.Exceptions.uncheck;
*/
public class MailVerifier {
+ private static final Duration VERIFICATION_DEADLINE = Duration.ofDays(7);
+
private final TenantController tenantController;
private final Mailer mailer;
private final CuratorDb curatorDb;
private final Clock clock;
- private final URI dashboardUri;
- private static final Duration VERIFICATION_DEADLINE = Duration.ofDays(7);
-
+ private final URI dashboardUri;
public MailVerifier(URI dashboardUri, TenantController tenantController, Mailer mailer, CuratorDb curatorDb, Clock clock) {
this.tenantController = tenantController;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
index 6567b0076e7..9f648675cd0 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
@@ -18,7 +18,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* Serialisation of {@link LogEntry} objects. Not all fields are stored!
@@ -98,25 +97,24 @@ class LogSerializer {
}
static String valueOf(Type type) {
- switch (type) {
- case debug: return "debug";
- case info: return "info";
- case warning: return "warning";
- case error: return "error";
- case html: return "html";
- default: throw new AssertionError("Unexpected log entry type '" + type + "'!");
- }
+ return switch (type) {
+ case debug -> "debug";
+ case info -> "info";
+ case warning -> "warning";
+ case error -> "error";
+ case html -> "html";
+ };
}
static Type typeOf(String type) {
- switch (type) {
- case "debug": return Type.debug;
- case "info": return Type.info;
- case "warning": return Type.warning;
- case "error": return Type.error;
- case "html": return Type.html;
- default: throw new IllegalArgumentException("Unknown log entry type '" + type + "'!");
- }
+ return switch (type) {
+ case "debug" -> Type.debug;
+ case "info" -> Type.info;
+ case "warning" -> Type.warning;
+ case "error" -> Type.error;
+ case "html" -> Type.html;
+ default -> throw new IllegalArgumentException("Unknown log entry type '" + type + "'!");
+ };
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/MailVerificationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/MailVerificationSerializer.java
index 6910d5c21c0..e5ee695e4e8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/MailVerificationSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/MailVerificationSerializer.java
@@ -15,12 +15,10 @@ import java.time.Instant;
public class MailVerificationSerializer {
private static final String tenantField = "tenant";
- private static final String audiencesField = "audiences";
private static final String emailField = "email";
private static final String emailTypeField = "emailType";
private static final String emailVerificationCodeField = "emailVerificationCode";
private static final String emailVerificationDeadlineField = "emailVerificationDeadline";
- private static final String rolesField = "roles";
public static Slime toSlime(PendingMailVerification pendingMailVerification) {
var slime = new Slime();
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NotificationsSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NotificationsSerializer.java
index beda8942fc2..3d28f35fc26 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NotificationsSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NotificationsSerializer.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.hosted.controller.persistence;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.InstanceName;
-import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.slime.Cursor;
@@ -16,7 +15,6 @@ import com.yahoo.vespa.hosted.controller.notification.Notification;
import com.yahoo.vespa.hosted.controller.notification.NotificationSource;
import java.util.List;
-import java.util.stream.Collectors;
/**
* (de)serializes notifications for a tenant
@@ -105,7 +103,6 @@ public class NotificationsSerializer {
case deployment -> "deployment";
case feedBlock -> "feedBlock";
case reindex -> "reindex";
- default -> throw new IllegalArgumentException("No serialization defined for notification type " + type);
};
}
@@ -126,7 +123,6 @@ public class NotificationsSerializer {
case info -> "info";
case warning -> "warning";
case error -> "error";
- default -> throw new IllegalArgumentException("No serialization defined for notification level " + level);
};
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/certificate/EndpointCertificatesHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/certificate/EndpointCertificatesHandler.java
index dc59f513509..a00e80b17d4 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/certificate/EndpointCertificatesHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/certificate/EndpointCertificatesHandler.java
@@ -1,4 +1,4 @@
-package com.yahoo.vespa.hosted.controller.certificate;
+package com.yahoo.vespa.hosted.controller.restapi.certificate;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.container.jdisc.HttpRequest;
@@ -74,4 +74,4 @@ public class EndpointCertificatesHandler extends ThreadedHttpRequestHandler {
return new StringResponse(EndpointCertificateMetadataSerializer.toSlime(reRequestedMetadata).toString());
}
}
-} \ No newline at end of file
+}
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 978587d9c5c..8fdff787420 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
@@ -15,12 +15,15 @@ import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.RoutingMethod;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.path.Path;
import com.yahoo.vespa.flags.PermanentFlags;
+import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeploymentData;
import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.Quota;
import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateMetadata;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ContainerEndpoint;
import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion;
@@ -38,7 +41,6 @@ import com.yahoo.vespa.hosted.controller.application.pkg.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentContext;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
-import com.yahoo.vespa.hosted.controller.deployment.RunStatus;
import com.yahoo.vespa.hosted.controller.deployment.Submission;
import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock;
import com.yahoo.vespa.hosted.controller.notification.Notification;
@@ -54,6 +56,7 @@ import com.yahoo.vespa.hosted.controller.versions.VespaVersion.Confidence;
import com.yahoo.vespa.hosted.rotation.config.RotationsConfig;
import org.junit.jupiter.api.Test;
+import java.io.InputStream;
import java.time.Duration;
import java.time.Instant;
import java.util.Collection;
@@ -1399,4 +1402,17 @@ public class ControllerTest {
}
}
+ @Test
+ void testDeactivateDeploymentUnknownByController() {
+ DeploymentContext context = tester.newDeploymentContext();
+ DeploymentId deployment = context.deploymentIdIn(ZoneId.from("prod", "us-west-1"));
+ DeploymentData deploymentData = new DeploymentData(deployment.applicationId(), Tags.empty(), deployment.zoneId(), InputStream::nullInputStream, Version.fromString("6.1"),
+ Set.of(), Optional::empty, Optional.empty(), Optional.empty(),
+ Quota::unlimited, List.of(), List.of(), Optional::empty, false);
+ tester.configServer().deploy(deploymentData);
+ assertTrue(tester.configServer().application(deployment.applicationId(), deployment.zoneId()).isPresent());
+ tester.controller().applications().deactivate(deployment.applicationId(), deployment.zoneId());
+ assertFalse(tester.configServer().application(deployment.applicationId(), deployment.zoneId()).isPresent());
+ }
+
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/MailVerifierTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/MailVerifierTest.java
index edea07e205c..77145be4197 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/MailVerifierTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/MailVerifierTest.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.TenantName;
import com.yahoo.vespa.hosted.controller.api.integration.stubs.MockMailer;
+import com.yahoo.vespa.hosted.controller.application.MailVerifier;
import com.yahoo.vespa.hosted.controller.tenant.CloudTenant;
import com.yahoo.vespa.hosted.controller.tenant.Email;
import com.yahoo.vespa.hosted.controller.tenant.PendingMailVerification;
@@ -99,4 +100,4 @@ class MailVerifierTest {
assertTrue(tester.curator().getPendingMailVerification(resentVerification.get().getVerificationCode()).isPresent());
}
-} \ No newline at end of file
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
index 40217890351..04a623f819b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
@@ -5,7 +5,8 @@ import com.yahoo.component.Version;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.application.api.ValidationOverrides;
import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.SystemName;
+import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Tags;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.security.KeyUtils;
@@ -23,6 +24,7 @@ import com.yahoo.vespa.hosted.controller.application.Change;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentActivity;
import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
+import com.yahoo.vespa.hosted.controller.application.EndpointId;
import com.yahoo.vespa.hosted.controller.application.QuotaUsage;
import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentContext;
@@ -40,6 +42,7 @@ import java.security.PublicKey;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -47,6 +50,7 @@ import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import java.util.Set;
+import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -69,7 +73,6 @@ public class ApplicationSerializerTest {
"pDhJeqczkyFcT2PysJ5sZwm7rKPEeXDOhzTPCyRvbUqc2SGdWbKUGGa/Yw==\n" +
"-----END PUBLIC KEY-----\n");
-
@Test
void testSerialization() throws Exception {
DeploymentSpec deploymentSpec = DeploymentSpec.fromXml("<deployment version='1.0'>\n" +
@@ -133,7 +136,7 @@ public class ApplicationSerializerTest {
Tags.fromString("tag1 tag2"),
deployments,
Map.of(DeploymentContext.systemTest, Instant.ofEpochMilli(333)),
- List.of(AssignedRotation.fromStrings("foo", "default", "my-rotation", Set.of("us-west-1"))),
+ List.of(rotation("foo", "default", "my-rotation", Set.of("us-west-1"))),
rotationStatus,
Change.of(new Version("6.1"))),
new Instance(id3,
@@ -236,4 +239,13 @@ public class ApplicationSerializerTest {
// ok if no error
}
+ private static AssignedRotation rotation(String clusterId, String endpointId, String rotationId, Collection<String> regions) {
+ return new AssignedRotation(
+ new ClusterSpec.Id(clusterId),
+ EndpointId.of(endpointId),
+ new RotationId(rotationId),
+ regions.stream().map(RegionName::from).collect(Collectors.toSet())
+ );
+ }
+
}