aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@yahooinc.com>2022-08-18 16:57:55 +0200
committerHåkon Hallingstad <hakon@yahooinc.com>2022-08-18 16:57:55 +0200
commitb679206de2431f11e52e6734abfcaefa40554037 (patch)
treebde9c884a71f552165d5554596c48bcd3f63fdf1 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi
parent7a65553cd4efc3574cb1bd859b17008ecdf878d6 (diff)
Allow overriding wanted docker tag and vespa version
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java31
1 files changed, 29 insertions, 2 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
index 87a9735f91e..2ecf73a645b 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.restapi;
+import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.DockerImage;
@@ -10,10 +11,14 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.restapi.SlimeJsonResponse;
import com.yahoo.slime.Cursor;
import com.yahoo.vespa.applicationmodel.HostName;
+import com.yahoo.vespa.flags.FetchVector;
+import com.yahoo.vespa.flags.PermanentFlags;
+import com.yahoo.vespa.flags.StringFlag;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Address;
+import com.yahoo.vespa.hosted.provision.node.Allocation;
import com.yahoo.vespa.hosted.provision.node.History;
import com.yahoo.vespa.hosted.provision.node.TrustStoreItem;
import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter;
@@ -47,6 +52,8 @@ class NodesResponse extends SlimeJsonResponse {
private final boolean recursive;
private final Function<HostName, Optional<HostInfo>> orchestrator;
private final NodeRepository nodeRepository;
+ private final StringFlag wantedDockerTagFlag;
+ private final StringFlag wantedVespaVersionFlag;
public NodesResponse(ResponseType responseType, HttpRequest request,
Orchestrator orchestrator, NodeRepository nodeRepository) {
@@ -56,6 +63,8 @@ class NodesResponse extends SlimeJsonResponse {
this.recursive = request.getBooleanProperty("recursive");
this.orchestrator = orchestrator.getHostResolver();
this.nodeRepository = nodeRepository;
+ this.wantedDockerTagFlag = PermanentFlags.WANTED_DOCKER_TAG.bindTo(nodeRepository.flagSource());
+ this.wantedVespaVersionFlag = PermanentFlags.WANTED_VESPA_VERSION.bindTo(nodeRepository.flagSource());
Cursor root = slime.setObject();
switch (responseType) {
@@ -146,8 +155,8 @@ class NodesResponse extends SlimeJsonResponse {
toSlime(allocation.membership(), object.setObject("membership"));
object.setLong("restartGeneration", allocation.restartGeneration().wanted());
object.setLong("currentRestartGeneration", allocation.restartGeneration().current());
- object.setString("wantedDockerImage", nodeRepository.containerImages().get(node).withTag(allocation.membership().cluster().vespaVersion()).asString());
- object.setString("wantedVespaVersion", allocation.membership().cluster().vespaVersion().toFullString());
+ object.setString("wantedDockerImage", nodeRepository.containerImages().get(node).withTag(resolveVersionFlag(wantedDockerTagFlag, node, allocation)).asString());
+ object.setString("wantedVespaVersion", resolveVersionFlag(wantedVespaVersionFlag, node, allocation).toFullString());
NodeResourcesSerializer.toSlime(allocation.requestedResources(), object.setObject("requestedResources"));
allocation.networkPorts().ifPresent(ports -> NetworkPortsSerializer.toSlime(ports, object.setArray("networkPorts")));
orchestrator.apply(new HostName(node.hostname()))
@@ -189,6 +198,24 @@ class NodesResponse extends SlimeJsonResponse {
node.cloudAccount().ifPresent(cloudAccount -> object.setString("cloudAccount", cloudAccount.value()));
}
+ private Version resolveVersionFlag(StringFlag flag, Node node, Allocation allocation) {
+ String value = flag
+ .with(FetchVector.Dimension.HOSTNAME, node.hostname())
+ .with(FetchVector.Dimension.NODE_TYPE, node.type().name())
+ .with(FetchVector.Dimension.TENANT_ID, allocation.owner().tenant().value())
+ .with(FetchVector.Dimension.APPLICATION_ID, allocation.owner().serializedForm())
+ .with(FetchVector.Dimension.CLUSTER_TYPE, allocation.membership().cluster().type().name())
+ .with(FetchVector.Dimension.CLUSTER_ID, allocation.membership().cluster().id().value())
+ .with(FetchVector.Dimension.VESPA_VERSION, allocation.membership().cluster().vespaVersion().toFullString())
+ .value();
+
+ return value.isEmpty() ?
+ allocation.membership().cluster().vespaVersion() :
+ value.indexOf('.') == -1 ?
+ allocation.membership().cluster().vespaVersion().withQualifier(value) :
+ new Version(value);
+ }
+
private void toSlime(ApplicationId id, Cursor object) {
object.setString("tenant", id.tenant().value());
object.setString("application", id.application().value());