From fd89173ecc6ea1a196a86ee4c43852bcda31fe6a Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 23 Jan 2020 21:29:12 +0100 Subject: Support patching reservedTo --- .../java/com/yahoo/search/federation/FederationSearcher.java | 6 ++---- .../node/admin/configserver/noderepository/NodeAttributes.java | 10 +++++++++- .../admin/configserver/noderepository/RealNodeRepository.java | 4 ++++ .../noderepository/bindings/NodeRepositoryNode.java | 4 ++++ .../src/main/java/com/yahoo/vespa/hosted/provision/Node.java | 7 +++++++ .../yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java | 3 +++ 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java index c5573dc8fee..c3ede4fe20a 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java @@ -272,12 +272,10 @@ public class FederationSearcher extends ForkingSearcher { switch (propagateSourceProperties) { case ALL: - propagatePerSourceQueryProperties(query, outgoing, window, sourceName, providerName, - Query.nativeProperties); + propagatePerSourceQueryProperties(query, outgoing, window, sourceName, providerName, Query.nativeProperties); break; case OFFSET_HITS: - propagatePerSourceQueryProperties(query, outgoing, window, sourceName, providerName, - queryAndHits); + propagatePerSourceQueryProperties(query, outgoing, window, sourceName, providerName, queryAndHits); break; } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java index 5317aa74737..a6c876117b9 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.node.admin.configserver.noderepository; import com.fasterxml.jackson.databind.JsonNode; import com.yahoo.component.Version; import com.yahoo.config.provision.DockerImage; +import com.yahoo.config.provision.TenantName; import java.time.Instant; import java.util.Map; @@ -29,6 +30,7 @@ public class NodeAttributes { private Optional currentOsVersion = Optional.empty(); private Optional currentFirmwareCheck = Optional.empty(); private Optional wantToDeprovision = Optional.empty(); + private Optional reservedTo = Optional.empty(); /** The list of reports to patch. A null value is used to remove the report. */ private Map reports = new TreeMap<>(); @@ -121,10 +123,14 @@ public class NodeAttributes { return reports; } + public Optional getReservedTo() { + return reservedTo; + } + @Override public int hashCode() { return Objects.hash(restartGeneration, rebootGeneration, dockerImage, vespaVersion, currentOsVersion, - currentFirmwareCheck, wantToDeprovision, reports); + currentFirmwareCheck, wantToDeprovision, reports, reservedTo); } public boolean isEmpty() { @@ -145,6 +151,7 @@ public class NodeAttributes { && Objects.equals(currentOsVersion, other.currentOsVersion) && Objects.equals(currentFirmwareCheck, other.currentFirmwareCheck) && Objects.equals(reports, other.reports) + && Objects.equals(reservedTo, other.reservedTo) && Objects.equals(wantToDeprovision, other.wantToDeprovision); } @@ -158,6 +165,7 @@ public class NodeAttributes { currentOsVersion.map(ver -> "currentOsVersion=" + ver.toFullString()), currentFirmwareCheck.map(at -> "currentFirmwareCheck=" + at), Optional.ofNullable(reports.isEmpty() ? null : "reports=" + reports), + Optional.ofNullable(reservedTo.isEmpty() ? null : "reservedTo=" + reservedTo), wantToDeprovision.map(depr -> "wantToDeprovision=" + depr)) .filter(Optional::isPresent) .map(Optional::get) diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java index 38459979e7c..afe092fa325 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; +import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.host.FlavorOverrides; import com.yahoo.vespa.hosted.node.admin.configserver.ConfigServerApi; import com.yahoo.vespa.hosted.node.admin.configserver.HttpException; @@ -243,6 +244,7 @@ public class RealNodeRepository implements NodeRepository { node.resources.diskSpeed = toString(resources.diskSpeed()); node.resources.storageType = toString(resources.storageType()); }); + node.reservedTo = addNode.reservedTo.map(TenantName::value).orElse(null); node.type = addNode.nodeType.name(); node.ipAddresses = addNode.ipAddresses; node.additionalIpAddresses = addNode.additionalIpAddresses; @@ -258,10 +260,12 @@ public class RealNodeRepository implements NodeRepository { node.currentOsVersion = nodeAttributes.getCurrentOsVersion().map(Version::toFullString).orElse(null); node.currentFirmwareCheck = nodeAttributes.getCurrentFirmwareCheck().map(Instant::toEpochMilli).orElse(null); node.wantToDeprovision = nodeAttributes.getWantToDeprovision().orElse(null); + node.reservedTo = nodeAttributes.getReservedTo().map(TenantName::value).orElse(null); Map reports = nodeAttributes.getReports(); node.reports = reports == null || reports.isEmpty() ? null : new TreeMap<>(reports); return node; } + } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java index 3fdb8b420ce..4c1f74290e9 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java @@ -62,6 +62,8 @@ public class NodeRepositoryNode { public Integer failCount; @JsonProperty("environment") public String environment; + @JsonProperty("reservedTo") + public String reservedTo; @JsonProperty("type") public String type; @JsonProperty("wantedDockerImage") @@ -106,6 +108,7 @@ public class NodeRepositoryNode { ", wantedFirmwareCheck=" + wantedFirmwareCheck + ", failCount=" + failCount + ", environment='" + environment + '\'' + + ", reservedTo='" + reservedTo + "'" + ", type='" + type + '\'' + ", wantedDockerImage='" + wantedDockerImage + '\'' + ", currentDockerImage='" + currentDockerImage + '\'' + @@ -188,4 +191,5 @@ public class NodeRepositoryNode { '}'; } } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java index 3778b7aa625..4ad72063b6b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java @@ -294,6 +294,13 @@ public final class Node { allocation, history, type, reports, modelName, reservedTo); } + public Node withReservedTo(TenantName tenant) { + if (type != NodeType.host) + throw new IllegalArgumentException("Only host nodes can be reserved, " + hostname + " has type " + type); + return new Node(id, ipConfig, hostname, parentHostname, flavor, status, state, + allocation, history, type, reports, modelName, Optional.of(tenant)); + } + /** Returns a copy of this node which is not reserved to a tenant */ public Node withoutReservedTo() { return new Node(id, ipConfig, hostname, parentHostname, flavor, status, state, diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java index 81cf401d358..503e25b46b6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeResources; +import com.yahoo.config.provision.TenantName; import com.yahoo.io.IOUtils; import com.yahoo.slime.Inspector; import com.yahoo.slime.ObjectTraverser; @@ -166,6 +167,8 @@ public class NodePatcher { return node.withModelName(asString(value)); case "requiredDiskSpeed": return patchRequiredDiskSpeed(asString(value)); + case "reservedTo": + return node.withReservedTo(TenantName.from(value.asString())); default : throw new IllegalArgumentException("Could not apply field '" + name + "' on a node: No such modifiable field"); } -- cgit v1.2.3