diff options
Diffstat (limited to 'controller-server/src/main/java')
17 files changed, 82 insertions, 76 deletions
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 14a5d3c7ddf..ce7af03aa7e 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 @@ -26,6 +26,7 @@ public class Endpoint { private final Scope scope; private final boolean legacy; private final boolean directRouting; + private final boolean tls; private Endpoint(String name, ApplicationId application, ZoneId zone, SystemName system, Port port, boolean legacy, boolean directRouting) { @@ -37,6 +38,7 @@ public class Endpoint { this.scope = zone == null ? Scope.global : Scope.zone; this.legacy = legacy; this.directRouting = directRouting; + this.tls = port.tls; } /** Returns the URL used to access this */ @@ -67,6 +69,11 @@ public class Endpoint { return directRouting; } + /** Returns whether this endpoint supports TLS connections */ + public boolean tls() { + return tls; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java index c4b69ce5588..2fc852d79d5 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java @@ -23,28 +23,23 @@ import java.util.Set; public class RoutingPolicy { private final ApplicationId owner; + private final ClusterSpec.Id cluster; private final ZoneId zone; - private final HostName alias; private final HostName canonicalName; private final Optional<String> dnsZone; private final Set<RotationName> rotations; /** DO NOT USE. Public for serialization purposes */ - public RoutingPolicy(ApplicationId owner, ZoneId zone, HostName alias, HostName canonicalName, + public RoutingPolicy(ApplicationId owner, ClusterSpec.Id cluster, ZoneId zone, HostName canonicalName, Optional<String> dnsZone, Set<RotationName> rotations) { this.owner = Objects.requireNonNull(owner, "owner must be non-null"); + this.cluster = Objects.requireNonNull(cluster, "cluster must be non-null"); this.zone = Objects.requireNonNull(zone, "zone must be non-null"); - this.alias = Objects.requireNonNull(alias, "alias must be non-null"); this.canonicalName = Objects.requireNonNull(canonicalName, "canonicalName must be non-null"); this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null"); this.rotations = ImmutableSortedSet.copyOf(Objects.requireNonNull(rotations, "rotations must be non-null")); } - public RoutingPolicy(ApplicationId owner, ZoneId zone, ClusterSpec.Id cluster, SystemName system, HostName canonicalName, - Optional<String> dnsZone, Set<RotationName> rotations) { - this(owner, zone, HostName.from(endpointOf(cluster, owner, zone, system).dnsName()), canonicalName, dnsZone, rotations); - } - /** The application owning this */ public ApplicationId owner() { return owner; @@ -55,9 +50,9 @@ public class RoutingPolicy { return zone; } - /** This alias (lhs of a CNAME or ALIAS record) */ - public HostName alias() { - return alias; + /** The cluster this applies to */ + public ClusterSpec.Id cluster() { + return cluster; } /** The canonical name for this (rhs of a CNAME or ALIAS record) */ @@ -75,8 +70,13 @@ public class RoutingPolicy { return rotations; } - /** Endpoints for this routing policy */ - public EndpointList endpointsIn(SystemName system) { + /** Returns the endpoint of this */ + public Endpoint endpointIn(SystemName system) { + return Endpoint.of(owner).target(cluster, zone).on(Port.tls()).directRouting().in(system); + } + + /** Returns rotation endpoints of this */ + public EndpointList rotationEndpointsIn(SystemName system) { return EndpointList.of(rotations.stream().map(rotation -> endpointOf(owner, rotation, system))); } @@ -86,19 +86,21 @@ public class RoutingPolicy { if (o == null || getClass() != o.getClass()) return false; RoutingPolicy policy = (RoutingPolicy) o; return owner.equals(policy.owner) && + cluster.equals(policy.cluster) && zone.equals(policy.zone) && - canonicalName.equals(policy.canonicalName); + canonicalName.equals(policy.canonicalName) && + dnsZone.equals(policy.dnsZone); } @Override public int hashCode() { - return Objects.hash(owner, zone, canonicalName); + return Objects.hash(owner, cluster, zone, canonicalName, dnsZone); } @Override public String toString() { - return String.format("%s -> %s [rotations: %s%s], owned by %s, in %s", alias, canonicalName, rotations, - dnsZone.map(z -> ", DNS zone: " + z).orElse(""), owner.toShortString(), + return String.format("%s [rotations: %s%s], %s owned by %s, in %s", canonicalName, rotations, + dnsZone.map(z -> ", DNS zone: " + z).orElse(""), cluster, owner.toShortString(), zone.value()); } @@ -107,9 +109,4 @@ public class RoutingPolicy { return Endpoint.of(application).target(rotation).on(Port.tls()).directRouting().in(system); } - /** Returns the endpoint of given cluster */ - public static Endpoint endpointOf(ClusterSpec.Id cluster, ApplicationId application, ZoneId zone, SystemName system) { - return Endpoint.of(application).target(cluster, zone).on(Port.tls()).directRouting().in(system); - } - } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java index e6aa8bc51b5..a8130d60cc5 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java @@ -98,7 +98,7 @@ public class DeploymentTrigger { report.jobType(), report.applicationId(), report.projectId())); - if ( ! applications().get(report.applicationId()).isPresent()) { + if (applications().get(report.applicationId()).isEmpty()) { log.log(LogLevel.WARNING, "Ignoring completion of job of project '" + report.projectId() + "': Unknown application '" + report.applicationId() + "'"); return; @@ -285,7 +285,7 @@ public class DeploymentTrigger { } private static <T extends Comparable<T>> Optional<T> max(Optional<T> o1, Optional<T> o2) { - return ! o1.isPresent() ? o2 : ! o2.isPresent() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2; + return o1.isEmpty() ? o2 : o2.isEmpty() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2; } // ---------- Ready job computation ---------- @@ -396,11 +396,11 @@ public class DeploymentTrigger { /** Returns whether the given job can trigger at the given instant */ public boolean triggerAt(Instant instant, JobType job, Versions versions, Application application) { Optional<JobStatus> jobStatus = application.deploymentJobs().statusOf(job); - if ( ! jobStatus.isPresent()) return true; + if (jobStatus.isEmpty()) return true; if (jobStatus.get().pausedUntil().isPresent() && jobStatus.get().pausedUntil().getAsLong() > clock.instant().toEpochMilli()) return false; if (jobStatus.get().isSuccess()) return true; // Success - if ( ! jobStatus.get().lastCompleted().isPresent()) return true; // Never completed - if ( ! jobStatus.get().firstFailing().isPresent()) return true; // Should not happen as firstFailing should be set for an unsuccessful job + if (jobStatus.get().lastCompleted().isEmpty()) return true; // Never completed + if (jobStatus.get().firstFailing().isEmpty()) return true; // Should not happen as firstFailing should be set for an unsuccessful job if ( ! versions.targetsMatch(jobStatus.get().lastCompleted().get())) return true; // Always trigger as targets have changed if (application.deploymentSpec().upgradePolicy() == DeploymentSpec.UpgradePolicy.canary) return true; // Don't throttle canaries @@ -516,7 +516,7 @@ public class DeploymentTrigger { if ( ! application.deploymentSpec().canChangeRevisionAt(clock.instant())) return false; if (application.change().application().isPresent()) return true; // Replacing a previous application change is ok. if (application.deploymentJobs().hasFailures()) return true; // Allow changes to fix upgrade problems. - return ! application.change().platform().isPresent(); + return application.change().platform().isEmpty(); } private Change remainingChange(Application application) { @@ -552,7 +552,7 @@ public class DeploymentTrigger { for (JobType jobType : steps(application.deploymentSpec()).testJobs()) { Optional<JobRun> completion = successOn(application, jobType, versions) .filter(run -> versions.sourcesMatchIfPresent(run) || jobType == systemTest); - if ( ! completion.isPresent() && condition.test(jobType)) + if (completion.isEmpty() && condition.test(jobType)) jobs.add(deploymentJob(application, versions, application.change(), jobType, reason, availableSince)); } return jobs; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java index 9133c8980ec..cd3341ed3a6 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java @@ -1,16 +1,12 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.maintenance; -import com.yahoo.config.provision.Environment; import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.Controller; -import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.yolean.Exceptions; -import java.time.Clock; import java.time.Duration; -import java.time.Instant; import java.util.logging.Level; /** @@ -21,41 +17,32 @@ import java.util.logging.Level; */ public class DeploymentExpirer extends Maintainer { - private final Clock clock; - public DeploymentExpirer(Controller controller, Duration interval, JobControl jobControl) { - this(controller, interval, Clock.systemUTC(), jobControl); - } - - public DeploymentExpirer(Controller controller, Duration interval, Clock clock, JobControl jobControl) { super(controller, interval, jobControl); - this.clock = clock; } @Override protected void maintain() { for (Application application : controller().applications().asList()) { for (Deployment deployment : application.deployments().values()) { - if (deployment.zone().environment().equals(Environment.prod)) { - continue; - } - - if (hasExpired(controller().zoneRegistry(), deployment, clock.instant())) { - try { - controller().applications().deactivate(application.id(), deployment.zone()); - } catch (Exception e) { - log.log(Level.WARNING, "Could not expire " + deployment + " of " + application + - ": " + Exceptions.toMessageString(e) + ". Retrying in " + - maintenanceInterval()); - } + if (!isExpired(deployment)) continue; + + try { + controller().applications().deactivate(application.id(), deployment.zone()); + } catch (Exception e) { + log.log(Level.WARNING, "Could not expire " + deployment + " of " + application + + ": " + Exceptions.toMessageString(e) + ". Retrying in " + + maintenanceInterval()); } } } } - private static boolean hasExpired(ZoneRegistry zoneRegistry, Deployment deployment, Instant now) { - return zoneRegistry.getDeploymentTimeToLive(deployment.zone()) - .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(now)) + /** Returns whether given deployment has expired according to its TTL */ + private boolean isExpired(Deployment deployment) { + if (deployment.zone().environment().isProduction()) return false; // Never expire production deployments + return controller().zoneRegistry().getDeploymentTimeToLive(deployment.zone()) + .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(controller().clock().instant())) .orElse(false); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java index 417a1944ad3..03d894f9a17 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java @@ -137,11 +137,10 @@ public class RoutingPolicyMaintainer extends Maintainer { /** Register DNS alias for given load balancer */ private RoutingPolicy registerCname(ApplicationId application, ZoneId zone, LoadBalancer loadBalancer) { - RoutingPolicy routingPolicy = new RoutingPolicy(application, zone, - loadBalancer.cluster(), controller().system(), + RoutingPolicy routingPolicy = new RoutingPolicy(application, loadBalancer.cluster(), zone, loadBalancer.hostname(), loadBalancer.dnsZone(), loadBalancer.rotations()); - RecordName name = RecordName.from(routingPolicy.alias().value()); + RecordName name = RecordName.from(routingPolicy.endpointIn(controller().system()).dnsName()); RecordData data = RecordData.fqdn(loadBalancer.hostname().value()); List<Record> existingRecords = nameService.findRecords(Record.Type.CNAME, name); if (existingRecords.size() > 1) { @@ -170,11 +169,12 @@ public class RoutingPolicyMaintainer extends Maintainer { // Remove any active load balancers removalCandidates.removeIf(policy -> activeLoadBalancers.contains(policy.canonicalName())); for (RoutingPolicy policy : removalCandidates) { + String dnsName = policy.endpointIn(controller().system()).dnsName(); try { - List<Record> records = nameService.findRecords(Record.Type.CNAME, RecordName.from(policy.alias().value())); + List<Record> records = nameService.findRecords(Record.Type.CNAME, RecordName.from(dnsName)); nameService.removeRecords(records); } catch (Exception e) { - log.log(LogLevel.WARNING, "Failed to remove record '" + policy.alias() + + log.log(LogLevel.WARNING, "Failed to remove record '" + dnsName + "'. Retrying in " + maintenanceInterval()); } } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 47ae8566ab8..3c2cbade606 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -47,7 +47,7 @@ import java.util.OptionalLong; import java.util.TreeMap; /** - * Serializes applications to/from slime. + * Serializes {@link Application} to/from slime. * This class is multithread safe. * * @author bratseth diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java index 93dd59e577f..36583f4320e 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java @@ -14,7 +14,7 @@ import java.util.Optional; import java.util.function.Function; /** - * Slime serializer for the audit log. + * Slime serializer for {@link AuditLog}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java index c56d8b3849c..a87875da104 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java @@ -1,7 +1,6 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.persistence; - import com.yahoo.component.Version; import com.yahoo.slime.Cursor; import com.yahoo.slime.ObjectTraverser; @@ -13,7 +12,7 @@ import java.util.LinkedHashMap; import java.util.Map; /** - * Serializes overrides of version confidence. + * Serializer for {@link Confidence} overrides. * * @author mpolden */ 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 36736f7f398..40781ac6e92 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 @@ -21,7 +21,7 @@ import java.util.Map; import java.util.stream.Collectors; /** - * Serialisation of LogRecord objects. Not all fields are stored! + * Serialisation of {@link LogEntry} objects. Not all fields are stored! * * @author jonmv */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java index d996b79fe18..21f8b1bcb80 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java @@ -14,7 +14,7 @@ import java.util.Set; import java.util.TreeSet; /** - * Serializer for an OS version. + * Serializer for an {@link OsVersion}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java index b0557863426..3e3c0df1673 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java @@ -20,7 +20,7 @@ import java.util.Objects; import java.util.TreeMap; /** - * Serializer for OS version status. + * Serializer for {@link OsVersionStatus}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java index 722cde68c65..7c4f9a66fd3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.persistence; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.RotationName; import com.yahoo.slime.ArrayTraverser; @@ -21,11 +22,12 @@ import java.util.function.Function; * Serializer and deserializer for a {@link RoutingPolicy}. * * @author mortent + * @author mpolden */ public class RoutingPolicySerializer { private static final String routingPoliciesField = "routingPolicies"; - private static final String aliasField = "alias"; + private static final String clusterField = "cluster"; private static final String canonicalNameField = "canonicalName"; private static final String zoneField = "zone"; private static final String dnsZoneField = "dnsZone"; @@ -37,7 +39,7 @@ public class RoutingPolicySerializer { Cursor policyArray = root.setArray(routingPoliciesField); routingPolicies.forEach(policy -> { Cursor policyObject = policyArray.addObject(); - policyObject.setString(aliasField, policy.alias().value()); + policyObject.setString(clusterField, policy.cluster().value()); policyObject.setString(zoneField, policy.zone().value()); policyObject.setString(canonicalNameField, policy.canonicalName().value()); policy.dnsZone().ifPresent(dnsZone -> policyObject.setString(dnsZoneField, dnsZone)); @@ -57,8 +59,8 @@ public class RoutingPolicySerializer { Set<RotationName> rotations = new LinkedHashSet<>(); inspect.field(rotationsField).traverse((ArrayTraverser) (j, rotation) -> rotations.add(RotationName.from(rotation.asString()))); policies.add(new RoutingPolicy(owner, + clusterId(inspect.field(clusterField)), ZoneId.from(inspect.field(zoneField).asString()), - HostName.from(inspect.field(aliasField).asString()), HostName.from(inspect.field(canonicalNameField).asString()), optionalField(inspect.field(dnsZoneField), Function.identity()), rotations)); @@ -66,6 +68,11 @@ public class RoutingPolicySerializer { return Collections.unmodifiableSet(policies); } + // TODO: Remove and inline after Vespa 7.43 + private static ClusterSpec.Id clusterId(Inspector field) { + return optionalField(field, ClusterSpec.Id::from).orElseGet(() -> new ClusterSpec.Id("default")); + } + private static <T> Optional<T> optionalField(Inspector field, Function<String, T> fieldMapper) { return Optional.of(field).filter(Inspector::valid).map(Inspector::asString).map(fieldMapper); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java index be464f95385..ce757e015b8 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java @@ -50,7 +50,7 @@ import static com.yahoo.vespa.hosted.controller.deployment.Step.endTests; import static java.util.Comparator.comparing; /** - * Serialises and deserialises RunStatus objects for persistent storage. + * Serialises and deserialises {@link Run} objects for persistent storage. * * @author jonmv */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index 2a685914408..56e80068908 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Optional; /** - * Slime serialization of tenants. + * Slime serialization of {@link Tenant} sub-types. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java index 78045a15e9c..5edae803fdb 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java @@ -7,7 +7,7 @@ import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; /** - * Serializer for version numbers. + * Serializer for {@link Version}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java index 11f0bfcfa0f..72d38bbee5f 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Set; /** - * Serializes VersionStatus to and from slime + * Serializer for {@link VersionStatus}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 74206d05009..1b9bf28f395 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -508,7 +508,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { // Per-cluster rotations Set<RoutingPolicy> routingPolicies = controller.applications().routingPolicies(application.id()); for (RoutingPolicy policy : routingPolicies) { - policy.endpointsIn(controller.system()).asList().stream() + policy.rotationEndpointsIn(controller.system()).asList().stream() .map(Endpoint::url) .map(URI::toString) .forEach(globalRotationsArray::addString); @@ -584,13 +584,22 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } private void toSlime(Cursor response, DeploymentId deploymentId, Deployment deployment, HttpRequest request) { - response.setString("tenant", deploymentId.applicationId().tenant().value()); response.setString("application", deploymentId.applicationId().application().value()); response.setString("instance", deploymentId.applicationId().instance().value()); // pointless response.setString("environment", deploymentId.zoneId().environment().value()); response.setString("region", deploymentId.zoneId().region().value()); + // Add endpoint(s) defined by routing policies + var endpointArray = response.setArray("endpoints"); + for (var policy : controller.applications().routingPolicies(deploymentId.applicationId())) { + Cursor endpointObject = endpointArray.addObject(); + Endpoint endpoint = policy.endpointIn(controller.system()); + endpointObject.setString("cluster", policy.cluster().value()); + endpointObject.setBool("tls", endpoint.tls()); + endpointObject.setString("url", endpoint.url().toString()); + } + // serviceUrls contains zone/cluster-specific endpoints for this deployment. The name of these endpoints may // contain the cluster name (if non-default) and since the controller has no knowledge of clusters, we have to // ask the routing layer here |