summaryrefslogtreecommitdiffstats
path: root/controller-server/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src/main/java')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java41
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java39
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java10
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java13
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