aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorvalerijf <valerijf@yahoo-inc.com>2017-05-22 12:07:14 +0200
committervalerijf <valerijf@yahoo-inc.com>2017-05-22 12:07:14 +0200
commit44d2e14dac881ec5ec49fa8b037154f035163013 (patch)
tree749e1004bce039f0d649697c8515f10a4d0990d0 /node-admin
parent1fd919358e1a3f843a8c5a067477d7a5f0e15d5d (diff)
Set vespaVersion in node-repo to be the same as wantedVespaVersion
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java15
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java1
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java21
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java54
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java72
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java2
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java7
8 files changed, 86 insertions, 90 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java
index 5ad60475276..d30b674872c 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java
@@ -17,6 +17,7 @@ public class ContainerNodeSpec {
public final Node.State nodeState;
public final String nodeType;
public final String nodeFlavor;
+ public final Optional<String> wantedVespaVersion;
public final Optional<String> vespaVersion;
public final Optional<Owner> owner;
public final Optional<Membership> membership;
@@ -34,6 +35,7 @@ public class ContainerNodeSpec {
final Node.State nodeState,
final String nodeType,
final String nodeFlavor,
+ final Optional<String> wantedVespaVersion,
final Optional<String> vespaVersion,
final Optional<Owner> owner,
final Optional<Membership> membership,
@@ -54,6 +56,7 @@ public class ContainerNodeSpec {
this.nodeState = nodeState;
this.nodeType = nodeType;
this.nodeFlavor = nodeFlavor;
+ this.wantedVespaVersion = wantedVespaVersion;
this.vespaVersion = vespaVersion;
this.owner = owner;
this.membership = membership;
@@ -78,6 +81,7 @@ public class ContainerNodeSpec {
Objects.equals(nodeState, that.nodeState) &&
Objects.equals(nodeType, that.nodeType) &&
Objects.equals(nodeFlavor, that.nodeFlavor) &&
+ Objects.equals(wantedVespaVersion, that.wantedVespaVersion) &&
Objects.equals(vespaVersion, that.vespaVersion) &&
Objects.equals(owner, that.owner) &&
Objects.equals(membership, that.membership) &&
@@ -98,6 +102,7 @@ public class ContainerNodeSpec {
nodeState,
nodeType,
nodeFlavor,
+ wantedVespaVersion,
vespaVersion,
owner,
membership,
@@ -118,6 +123,7 @@ public class ContainerNodeSpec {
+ " nodeState=" + nodeState
+ " nodeType = " + nodeType
+ " nodeFlavor = " + nodeFlavor
+ + " wantedVespaVersion = " + wantedVespaVersion
+ " vespaVersion = " + vespaVersion
+ " owner = " + owner
+ " membership = " + membership
@@ -230,6 +236,7 @@ public class ContainerNodeSpec {
private Node.State nodeState;
private String nodeType;
private String nodeFlavor;
+ private Optional<String> wantedVespaVersion = Optional.empty();
private Optional<String> vespaVersion = Optional.empty();
private Optional<Owner> owner = Optional.empty();
private Optional<Membership> membership = Optional.empty();
@@ -250,6 +257,7 @@ public class ContainerNodeSpec {
nodeFlavor(nodeSpec.nodeFlavor);
nodeSpec.wantedDockerImage.ifPresent(this::wantedDockerImage);
+ nodeSpec.wantedVespaVersion.ifPresent(this::wantedVespaVersion);
nodeSpec.vespaVersion.ifPresent(this::vespaVersion);
nodeSpec.owner.ifPresent(this::owner);
nodeSpec.membership.ifPresent(this::membership);
@@ -286,6 +294,11 @@ public class ContainerNodeSpec {
return this;
}
+ public Builder wantedVespaVersion(String wantedVespaVersion) {
+ this.wantedVespaVersion = Optional.of(wantedVespaVersion);
+ return this;
+ }
+
public Builder vespaVersion(String vespaVersion) {
this.vespaVersion = Optional.of(vespaVersion);
return this;
@@ -338,7 +351,7 @@ public class ContainerNodeSpec {
public ContainerNodeSpec build() {
return new ContainerNodeSpec(hostname, wantedDockerImage, nodeState, nodeType, nodeFlavor,
- vespaVersion, owner, membership,
+ wantedVespaVersion, vespaVersion, owner, membership,
wantedRestartGeneration, currentRestartGeneration,
wantedRebootGeneration, currentRebootGeneration,
minCpuCores, minMainMemoryAvailableGb, minDiskAvailableGb);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
index aa7285ec17c..c8fff58badc 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
@@ -12,7 +12,6 @@ import java.util.List;
import java.util.Optional;
public interface DockerOperations {
- Optional<String> getVespaVersion(ContainerName containerName);
void startContainer(ContainerName containerName, ContainerNodeSpec nodeSpec);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
index b125dcbce54..5da51b83d37 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
@@ -36,7 +36,6 @@ import static com.yahoo.vespa.defaults.Defaults.getDefaults;
*/
public class DockerOperationsImpl implements DockerOperations {
public static final String NODE_PROGRAM = Defaults.getDefaults().underVespaHome("bin/vespa-nodectl");
- private static final String[] GET_VESPA_VERSION_COMMAND = new String[]{NODE_PROGRAM, "vespa-version"};
private static final String[] RESUME_NODE_COMMAND = new String[]{NODE_PROGRAM, "resume"};
private static final String[] SUSPEND_NODE_COMMAND = new String[]{NODE_PROGRAM, "suspend"};
@@ -92,26 +91,6 @@ public class DockerOperationsImpl implements DockerOperations {
this.environment = environment;
}
- @Override
- public Optional<String> getVespaVersion(ContainerName containerName) {
- PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName);
-
- ProcessResult result = docker.executeInContainer(containerName, DockerOperationsImpl.GET_VESPA_VERSION_COMMAND);
- if (!result.isSuccess()) {
- logger.warning("Container " + containerName.asString() + ": Command "
- + Arrays.toString(DockerOperationsImpl.GET_VESPA_VERSION_COMMAND) + " failed: " + result);
- return Optional.empty();
- }
- Optional<String> vespaVersion = parseVespaVersion(result.getOutput());
- if (vespaVersion.isPresent()) {
- return vespaVersion;
- } else {
- logger.warning("Container " + containerName.asString() + ": Failed to parse vespa version from "
- + result.getOutput());
- return Optional.empty();
- }
- }
-
// Returns empty if vespa version cannot be parsed.
static Optional<String> parseVespaVersion(final String rawVespaVersion) {
if (rawVespaVersion == null) return Optional.empty();
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
index 972cf9d56f7..0b11696ef99 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
@@ -15,13 +15,17 @@ import com.yahoo.vespa.hosted.dockerapi.metrics.CounterWrapper;
import com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions;
import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper;
import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
+import com.yahoo.vespa.hosted.node.admin.logging.FilebeatConfigProvider;
+import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
+import com.yahoo.vespa.hosted.node.admin.util.SecretAgentScheduleMaker;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
@@ -64,6 +68,56 @@ public class StorageMaintainer {
numberOfNodeAdminMaintenanceFails = metricReceiver.declareCounter(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "nodes.maintenance.fails");
}
+ public void writeMetricsConfig(ContainerName containerName, ContainerNodeSpec nodeSpec) {
+ final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/yamas-agent/");
+
+ Path vespaCheckPath = Paths.get(getDefaults().underVespaHome("libexec/yms/yms_check_vespa"));
+ SecretAgentScheduleMaker scheduleMaker = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all")
+ .withTag("namespace", "Vespa")
+ .withTag("role", "tenants")
+ .withTag("flavor", nodeSpec.nodeFlavor)
+ .withTag("state", nodeSpec.nodeState.toString())
+ .withTag("zone", environment.getZone())
+ .withTag("parentHostname", environment.getParentHostHostname());
+
+ nodeSpec.owner.ifPresent(owner ->
+ scheduleMaker
+ .withTag("tenantName", owner.tenant)
+ .withTag("app", owner.application + "." + owner.instance));
+
+ nodeSpec.membership.ifPresent(membership ->
+ scheduleMaker
+ .withTag("clustertype", membership.clusterType)
+ .withTag("clusterid", membership.clusterId));
+
+ nodeSpec.vespaVersion.ifPresent(version -> scheduleMaker.withTag("vespaVersion", version));
+
+ try {
+ scheduleMaker.writeTo(yamasAgentFolder);
+ final String[] restartYamasAgent = new String[]{"service", "yamas-agent", "restart"};
+ docker.executeInContainerAsRoot(containerName, restartYamasAgent);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to write secret-agent schedules for " + containerName, e);
+ }
+ }
+
+ public void writeFilebeatConfig(ContainerName containerName, ContainerNodeSpec nodeSpec) {
+ PrefixLogger logger = PrefixLogger.getNodeAgentLogger(StorageMaintainer.class, containerName);
+ try {
+ FilebeatConfigProvider filebeatConfigProvider = new FilebeatConfigProvider(environment);
+ Optional<String> config = filebeatConfigProvider.getConfig(nodeSpec);
+ if (!config.isPresent()) {
+ logger.error("Was not able to generate a config for filebeat, ignoring filebeat file creation." + nodeSpec.toString());
+ return;
+ }
+ Path filebeatPath = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/filebeat/filebeat.yml");
+ Files.write(filebeatPath, config.get().getBytes());
+ logger.info("Wrote filebeat config.");
+ } catch (Throwable t) {
+ logger.error("Failed writing filebeat config; " + nodeSpec, t);
+ }
+ }
+
public Optional<Long> updateIfNeededAndGetDiskMetricsFor(ContainerName containerName) {
// Calculating disk usage is IO expensive operation and its value changes relatively slowly, we want to perform
// that calculation rarely. Additionally, we spread out the calculation for different containers by adding
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
index 8e290725fcb..d8ee3550272 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
@@ -10,7 +10,6 @@ import com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions;
import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper;
import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
import com.yahoo.vespa.hosted.node.admin.docker.DockerOperations;
-import com.yahoo.vespa.hosted.node.admin.logging.FilebeatConfigProvider;
import com.yahoo.vespa.hosted.node.admin.maintenance.StorageMaintainer;
import com.yahoo.vespa.hosted.node.admin.maintenance.acl.AclMaintainer;
import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepository;
@@ -18,13 +17,8 @@ import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator;
import com.yahoo.vespa.hosted.node.admin.orchestrator.OrchestratorException;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
-import com.yahoo.vespa.hosted.node.admin.util.SecretAgentScheduleMaker;
import com.yahoo.vespa.hosted.provision.Node;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.Duration;
@@ -36,7 +30,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
-import static com.yahoo.vespa.defaults.Defaults.getDefaults;
import static com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.ABSENT;
import static com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.RUNNING;
import static com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN;
@@ -88,7 +81,6 @@ public class NodeAgentImpl implements NodeAgent {
private NodeAttributes lastAttributesSet = null;
private ContainerNodeSpec lastNodeSpec = null;
private CpuUsageReporter lastCpuMetric;
- private Optional<String> vespaVersion = Optional.empty();
public NodeAgentImpl(
final String hostName,
@@ -118,7 +110,6 @@ public class NodeAgentImpl implements NodeAgent {
dockerOperations.getContainer(containerName)
.ifPresent(container -> {
if (container.state.isRunning()) {
- vespaVersion = dockerOperations.getVespaVersion(container.name);
lastCpuMetric = new CpuUsageReporter(container.created);
}
containerState = RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN;
@@ -197,27 +188,10 @@ public class NodeAgentImpl implements NodeAgent {
}
}
- private void experimentalWriteFile(final ContainerNodeSpec nodeSpec) {
- try {
- FilebeatConfigProvider filebeatConfigProvider = new FilebeatConfigProvider(environment);
- Optional<String> config = filebeatConfigProvider.getConfig(nodeSpec);
- if (!config.isPresent()) {
- logger.error("Was not able to generate a config for filebeat, ignoring filebeat file creation." + nodeSpec.toString());
- return;
- }
- Path filebeatPath = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/filebeat/filebeat.yml");
- Files.write(filebeatPath, config.get().getBytes());
- logger.info("Wrote filebeat config.");
- } catch (Throwable t) {
- logger.error("Failed writing filebeat config; " + nodeSpec, t);
- }
- }
-
private void runLocalResumeScriptIfNeeded(final ContainerNodeSpec nodeSpec) {
if (containerState != RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN) {
return;
}
- experimentalWriteFile(nodeSpec);
addDebugMessage("Starting optional node program resume command");
dockerOperations.resumeNode(containerName);
@@ -243,7 +217,7 @@ public class NodeAgentImpl implements NodeAgent {
// want the two to be equal in node repo
.withRebootGeneration(nodeSpec.wantedRebootGeneration.orElse(0L))
.withDockerImage(nodeSpec.wantedDockerImage.orElse(new DockerImage("")))
- .withVespaVersion(vespaVersion.orElse(""));
+ .withVespaVersion(nodeSpec.wantedVespaVersion.orElse(""));
publishStateToNodeRepoIfChanged(nodeAttributes);
}
@@ -264,11 +238,8 @@ public class NodeAgentImpl implements NodeAgent {
if (!getContainer().isPresent()) {
aclMaintainer.ifPresent(AclMaintainer::run);
dockerOperations.startContainer(containerName, nodeSpec);
- metricReceiver.unsetMetricsForContainer(hostname);
lastCpuMetric = new CpuUsageReporter(clock.instant());
- vespaVersion = dockerOperations.getVespaVersion(containerName);
- configureContainerMetrics(nodeSpec);
addDebugMessage("startContainerIfNeeded: containerState " + containerState + " -> " +
RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN);
containerState = RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN;
@@ -347,7 +318,6 @@ public class NodeAgentImpl implements NodeAgent {
logger.info("Failed stopping services, ignoring", e);
}
}
- vespaVersion = Optional.empty();
dockerOperations.removeContainer(existingContainer.get());
metricReceiver.unsetMetricsForContainer(hostname);
containerState = ABSENT;
@@ -437,6 +407,10 @@ public class NodeAgentImpl implements NodeAgent {
// Every time the node spec changes, we should clear the metrics for this container as the dimensions
// will change and we will be reporting duplicate metrics.
metricReceiver.unsetMetricsForContainer(hostname);
+ storageMaintainer.ifPresent(maintainer -> {
+ maintainer.writeMetricsConfig(containerName, nodeSpec);
+ maintainer.writeFilebeatConfig(containerName, nodeSpec);
+ });
}
switch (nodeSpec.nodeState) {
@@ -507,7 +481,7 @@ public class NodeAgentImpl implements NodeAgent {
.add("state", nodeSpec.nodeState.toString())
.add("zone", environment.getZone())
.add("parentHostname", environment.getParentHostHostname());
- vespaVersion.ifPresent(version -> dimensionsBuilder.add("vespaVersion", version));
+ nodeSpec.vespaVersion.ifPresent(version -> dimensionsBuilder.add("vespaVersion", version));
nodeSpec.owner.ifPresent(owner ->
dimensionsBuilder
@@ -648,40 +622,6 @@ public class NodeAgentImpl implements NodeAgent {
return temp;
}
- private void configureContainerMetrics(ContainerNodeSpec nodeSpec) {
- if (!storageMaintainer.isPresent()) return;
- final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/yamas-agent/");
-
- Path vespaCheckPath = Paths.get(getDefaults().underVespaHome("libexec/yms/yms_check_vespa"));
- SecretAgentScheduleMaker scheduleMaker = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all")
- .withTag("namespace", "Vespa")
- .withTag("role", "tenants")
- .withTag("flavor", nodeSpec.nodeFlavor)
- .withTag("state", nodeSpec.nodeState.toString())
- .withTag("zone", environment.getZone())
- .withTag("parentHostname", environment.getParentHostHostname());
-
- nodeSpec.owner.ifPresent(owner ->
- scheduleMaker
- .withTag("tenantName", owner.tenant)
- .withTag("app", owner.application + "." + owner.instance));
-
- nodeSpec.membership.ifPresent(membership ->
- scheduleMaker
- .withTag("clustertype", membership.clusterType)
- .withTag("clusterid", membership.clusterId));
-
- vespaVersion.ifPresent(version -> scheduleMaker.withTag("vespaVersion", version));
-
- try {
- scheduleMaker.writeTo(yamasAgentFolder);
- final String[] restartYamasAgent = new String[]{"service", "yamas-agent", "restart"};
- dockerOperations.executeCommandInContainerAsRoot(containerName, restartYamasAgent);
- } catch (IOException e) {
- throw new RuntimeException("Failed to write secret-agent schedules for " + containerName, e);
- }
- }
-
class CpuUsageReporter {
private long totalContainerUsage = 0;
private long totalSystemUsage = 0;
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java
index c3755fc8d5b..b03c07717c4 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java
@@ -101,6 +101,7 @@ public class NodeRepositoryImpl implements NodeRepository {
Objects.requireNonNull(node.nodeState, "Unknown node state");
Node.State nodeState = Node.State.valueOf(node.nodeState);
if (nodeState == Node.State.active) {
+ Objects.requireNonNull(node.wantedVespaVersion, "Unknown vespa version for active node");
Objects.requireNonNull(node.wantedDockerImage, "Unknown docker image for active node");
Objects.requireNonNull(node.wantedRestartGeneration, "Unknown wantedRestartGeneration for active node");
Objects.requireNonNull(node.currentRestartGeneration, "Unknown currentRestartGeneration for active node");
@@ -125,6 +126,7 @@ public class NodeRepositoryImpl implements NodeRepository {
nodeState,
node.nodeType,
node.nodeFlavor,
+ Optional.ofNullable(node.wantedVespaVersion),
Optional.ofNullable(node.vespaVersion),
Optional.ofNullable(owner),
Optional.ofNullable(membership),
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java
index a63f6f10532..d8d416b9150 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java
@@ -31,6 +31,7 @@ public class GetNodesResponse {
public final String nodeState;
public final String nodeType;
public final String nodeFlavor;
+ public final String wantedVespaVersion;
public final String vespaVersion;
public final Owner owner;
public final Membership membership;
@@ -49,6 +50,7 @@ public class GetNodesResponse {
@JsonProperty("state") String nodeState,
@JsonProperty("type") String nodeType,
@JsonProperty("flavor") String nodeFlavor,
+ @JsonProperty("wantedVespaVersion") String wantedVespaVersion,
@JsonProperty("vespaVersion") String vespaVersion,
@JsonProperty("owner") Owner owner,
@JsonProperty("membership") Membership membership,
@@ -65,6 +67,7 @@ public class GetNodesResponse {
this.nodeState = nodeState;
this.nodeType = nodeType;
this.nodeFlavor = nodeFlavor;
+ this.wantedVespaVersion = wantedVespaVersion;
this.vespaVersion = vespaVersion;
this.owner = owner;
this.membership = membership;
@@ -85,6 +88,7 @@ public class GetNodesResponse {
+ " nodeState = " + nodeState
+ " nodeType = " + nodeType
+ " nodeFlavor = " + nodeFlavor
+ + " wantedVespaVersion = " + wantedVespaVersion
+ " vespaVersion = " + vespaVersion
+ " owner = " + owner
+ " membership = " + membership
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
index f74f4e0af78..12479db8ba3 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
@@ -94,6 +94,7 @@ public class NodeAgentImplTest {
final ContainerNodeSpec nodeSpec = nodeSpecBuilder
.wantedDockerImage(dockerImage)
.nodeState(Node.State.active)
+ .wantedVespaVersion(vespaVersion)
.vespaVersion(vespaVersion)
.wantedRestartGeneration(restartGeneration)
.currentRestartGeneration(restartGeneration)
@@ -131,6 +132,7 @@ public class NodeAgentImplTest {
final ContainerNodeSpec nodeSpec = nodeSpecBuilder
.wantedDockerImage(dockerImage)
.nodeState(Node.State.active)
+ .wantedVespaVersion(vespaVersion)
.vespaVersion(vespaVersion)
.wantedRestartGeneration(restartGeneration)
.currentRestartGeneration(restartGeneration)
@@ -224,6 +226,7 @@ public class NodeAgentImplTest {
final ContainerNodeSpec nodeSpec = nodeSpecBuilder
.wantedDockerImage(dockerImage)
.nodeState(Node.State.failed)
+ .wantedVespaVersion(vespaVersion)
.vespaVersion(vespaVersion)
.wantedRestartGeneration(restartGeneration)
.currentRestartGeneration(restartGeneration)
@@ -285,6 +288,7 @@ public class NodeAgentImplTest {
final ContainerNodeSpec nodeSpec = nodeSpecBuilder
.wantedDockerImage(dockerImage)
.nodeState(Node.State.inactive)
+ .wantedVespaVersion(vespaVersion)
.vespaVersion(vespaVersion)
.wantedRestartGeneration(restartGeneration)
.currentRestartGeneration(restartGeneration)
@@ -544,8 +548,9 @@ public class NodeAgentImplTest {
Optional.empty();
when(dockerOperations.getContainerStats(any())).thenReturn(Optional.of(emptyContainerStats));
- when(dockerOperations.getVespaVersion(eq(containerName))).thenReturn(Optional.of(vespaVersion));
when(dockerOperations.getContainer(eq(containerName))).thenReturn(container);
+ doNothing().when(storageMaintainer).writeFilebeatConfig(any(), any());
+ doNothing().when(storageMaintainer).writeMetricsConfig(any(), any());
return new NodeAgentImpl(hostName, nodeRepository, orchestrator, dockerOperations,
Optional.of(storageMaintainer), metricReceiver, environment, clock, Optional.of(aclMaintainer));