diff options
Diffstat (limited to 'controller-server/src')
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()) + ); + } + } |