summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java7
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java11
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java8
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java8
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java68
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java5
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java75
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java11
19 files changed, 144 insertions, 97 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
index e9e09781e31..44dd023677c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance;
import com.yahoo.concurrent.DaemonThreadFactory;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Deployer;
+import com.yahoo.jdisc.Metric;
import com.yahoo.log.LogLevel;
import com.yahoo.vespa.hosted.provision.NodeRepository;
@@ -22,6 +23,7 @@ import java.util.concurrent.TimeUnit;
public abstract class ApplicationMaintainer extends Maintainer {
private final Deployer deployer;
+ private final Metric metric;
private final CopyOnWriteArrayList<ApplicationId> pendingDeployments = new CopyOnWriteArrayList<>();
// Use a fixed thread pool to avoid overload on config servers. Resource usage when deploying varies
@@ -32,9 +34,10 @@ public abstract class ApplicationMaintainer extends Maintainer {
new LinkedBlockingQueue<>(),
new DaemonThreadFactory("node repo application maintainer"));
- protected ApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval) {
+ protected ApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository, Duration interval) {
super(nodeRepository, interval);
this.deployer = deployer;
+ this.metric = metric;
}
@Override
@@ -73,7 +76,7 @@ public abstract class ApplicationMaintainer extends Maintainer {
/** Redeploy this application. A lock will be taken for the duration of the deployment activation */
protected final void deployWithLock(ApplicationId application) {
- try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) {
+ try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) {
if ( ! deployment.isValid()) return; // this will be done at another config server
if ( ! canDeployNow(application)) return; // redeployment is no longer needed
deployment.activate();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java
index abfe65408b6..0d7d10663c5 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java
@@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.Deployer;
import com.yahoo.config.provision.NodeResources;
+import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.applications.Application;
@@ -32,15 +33,18 @@ public class AutoscalingMaintainer extends Maintainer {
private final Autoscaler autoscaler;
private final Deployer deployer;
+ private final Metric metric;
private final Map<Pair<ApplicationId, ClusterSpec.Id>, Instant> lastLogged = new HashMap<>();
public AutoscalingMaintainer(NodeRepository nodeRepository,
HostResourcesCalculator hostResourcesCalculator,
NodeMetricsDb metricsDb,
Deployer deployer,
+ Metric metric,
Duration interval) {
super(nodeRepository, interval);
this.autoscaler = new Autoscaler(hostResourcesCalculator, metricsDb, nodeRepository);
+ this.metric = metric;
this.deployer = deployer;
}
@@ -52,7 +56,7 @@ public class AutoscalingMaintainer extends Maintainer {
}
private void autoscale(ApplicationId application, List<Node> applicationNodes) {
- try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) {
+ try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) {
if ( ! deployment.isValid()) return; // Another config server will consider this application
nodesByCluster(applicationNodes).forEach((clusterId, clusterNodes) -> autoscale(application, clusterId, clusterNodes, deployment));
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
index d9e06f87db7..8e1cd801a15 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
@@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationLockException;
import com.yahoo.config.provision.Deployer;
import com.yahoo.config.provision.Deployment;
import com.yahoo.config.provision.TransientException;
+import com.yahoo.jdisc.Metric;
import com.yahoo.log.LogLevel;
import com.yahoo.transaction.Mutex;
import com.yahoo.vespa.hosted.provision.Node;
@@ -14,6 +15,7 @@ import com.yahoo.yolean.Exceptions;
import java.io.Closeable;
import java.time.Duration;
+import java.util.Map;
import java.util.Optional;
import java.util.logging.Logger;
@@ -28,13 +30,18 @@ class MaintenanceDeployment implements Closeable {
private static final Logger log = Logger.getLogger(MaintenanceDeployment.class.getName());
private final ApplicationId application;
+ private final Metric metric;
private final Optional<Mutex> lock;
private final Optional<Deployment> deployment;
private boolean closed = false;
- public MaintenanceDeployment(ApplicationId application, Deployer deployer, NodeRepository nodeRepository) {
+ public MaintenanceDeployment(ApplicationId application,
+ Deployer deployer,
+ Metric metric,
+ NodeRepository nodeRepository) {
this.application = application;
+ this.metric = metric;
Optional<Mutex> lock = tryLock(application, nodeRepository);
try {
deployment = tryDeployment(lock, application, deployer, nodeRepository);
@@ -75,10 +82,12 @@ class MaintenanceDeployment implements Closeable {
action.run();
return true;
} catch (TransientException e) {
+ metric.add("maintenanceDeployment.transientFailure", 1, metric.createContext(Map.of()));
log.log(LogLevel.INFO, "Failed to maintenance deploy " + application + " with a transient error: " +
Exceptions.toMessageString(e));
return false;
} catch (RuntimeException e) {
+ metric.add("maintenanceDeployment.failure", 1, metric.createContext(Map.of()));
log.log(LogLevel.WARNING, "Exception on maintenance deploy of " + application, e);
return false;
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
index 104ab72a6a2..054c273dc99 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
@@ -72,10 +72,10 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
DefaultTimes defaults = new DefaultTimes(zone);
nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, defaults.failGrace, clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric);
- periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, defaults.periodicRedeployInterval);
- operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, defaults.operatorChangeRedeployInterval);
+ periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, metric, nodeRepository, defaults.redeployMaintainerInterval, defaults.periodicRedeployInterval);
+ operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, metric, nodeRepository, defaults.operatorChangeRedeployInterval);
reservationExpirer = new ReservationExpirer(nodeRepository, clock, defaults.reservationExpiry);
- retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, defaults.retiredInterval, defaults.retiredExpiry);
+ retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, metric, clock, defaults.retiredInterval, defaults.retiredExpiry);
inactiveExpirer = new InactiveExpirer(nodeRepository, clock, defaults.inactiveExpiry);
failedExpirer = new FailedExpirer(nodeRepository, zone, clock, defaults.failedExpirerInterval);
dirtyExpirer = new DirtyExpirer(nodeRepository, clock, defaults.dirtyExpiry);
@@ -91,7 +91,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
osUpgradeActivator = new OsUpgradeActivator(nodeRepository, defaults.osUpgradeActivatorInterval);
rebalancer = new Rebalancer(deployer, nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), provisionServiceProvider.getHostProvisioner(), metric, clock, defaults.rebalancerInterval);
nodeMetricsDbMaintainer = new NodeMetricsDbMaintainer(nodeRepository, nodeMetrics, nodeMetricsDb, defaults.nodeMetricsCollectionInterval);
- autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), nodeMetricsDb, deployer, defaults.autoscalingInterval);
+ autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), nodeMetricsDb, deployer, metric, defaults.autoscalingInterval);
// The DuperModel is filled with infrastructure applications by the infrastructure provisioner, so explicitly run that now
infrastructureProvisioner.maintainButThrowOnException();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java
index e7406bf3478..9f829c095f4 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Deployer;
import com.yahoo.config.provision.NodeType;
+import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Agent;
@@ -31,8 +32,8 @@ import java.util.stream.Collectors;
*/
public class OperatorChangeApplicationMaintainer extends ApplicationMaintainer {
- OperatorChangeApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval) {
- super(deployer, nodeRepository, interval);
+ OperatorChangeApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository, Duration interval) {
+ super(deployer, metric, nodeRepository, interval);
}
@Override
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java
index 6ab85e76ba2..d06d24872e1 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.maintenance;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Deployer;
+import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
@@ -29,9 +30,9 @@ public class PeriodicApplicationMaintainer extends ApplicationMaintainer {
private final Clock clock;
private final Instant start;
- PeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository,
+ PeriodicApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository,
Duration interval, Duration minTimeBetweenRedeployments) {
- super(deployer, nodeRepository, interval);
+ super(deployer, metric, nodeRepository, interval);
this.minTimeBetweenRedeployments = minTimeBetweenRedeployments;
this.clock = nodeRepository.clock();
this.start = clock.instant();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
index db99f8544f1..240dd85c8d4 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
@@ -129,7 +129,7 @@ public class Rebalancer extends Maintainer {
*/
private boolean deployTo(Move move) {
ApplicationId application = move.node.allocation().get().owner();
- try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) {
+ try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) {
if ( ! deployment.isValid()) return false;
boolean couldMarkRetiredNow = markWantToRetire(move.node, true);
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java
index 1d31917b3e1..3c01c8bc23c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance;
import com.google.common.util.concurrent.UncheckedTimeoutException;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Deployer;
+import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.applicationmodel.HostName;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
@@ -26,6 +27,7 @@ import java.util.stream.Collectors;
public class RetiredExpirer extends Maintainer {
private final Deployer deployer;
+ private final Metric metric;
private final Orchestrator orchestrator;
private final Duration retiredExpiry;
private final Clock clock;
@@ -33,11 +35,13 @@ public class RetiredExpirer extends Maintainer {
public RetiredExpirer(NodeRepository nodeRepository,
Orchestrator orchestrator,
Deployer deployer,
+ Metric metric,
Clock clock,
Duration maintenanceInterval,
Duration retiredExpiry) {
super(nodeRepository, maintenanceInterval);
this.deployer = deployer;
+ this.metric = metric;
this.orchestrator = orchestrator;
this.retiredExpiry = retiredExpiry;
this.clock = clock;
@@ -56,7 +60,7 @@ public class RetiredExpirer extends Maintainer {
ApplicationId application = entry.getKey();
List<Node> retiredNodes = entry.getValue();
- try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) {
+ try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) {
if ( ! deployment.isValid()) continue; // this will be done at another config server
List<Node> nodesToRemove = retiredNodes.stream().filter(this::canRemove).collect(Collectors.toList());
@@ -103,7 +107,7 @@ public class RetiredExpirer extends Maintainer {
log.info("Node " + node + " has been granted permission to be removed");
return true;
} catch (UncheckedTimeoutException e) {
- log.info("Timed out trying to aquire permission to remove " + node.hostname() + ": " + e.getMessage());
+ log.info("Timed out trying to acquire permission to remove " + node.hostname() + ": " + e.getMessage());
return false;
} catch (OrchestrationException e) {
log.info("Did not get permission to remove retired " + node + ": " + e.getMessage());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java
index da169cba08f..8f8f8d0f38b 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java
@@ -59,6 +59,7 @@ public class AutoscalingMaintainerTest {
tester.identityHostResourcesCalculator(),
nodeMetricsDb,
deployer,
+ new TestMetric(),
Duration.ofMinutes(1));
maintainer.maintain(); // noop
assertTrue(deployer.lastDeployTime(app1).isEmpty());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
index 9bb3a55abfd..4fcd5793b8a 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
@@ -19,6 +19,7 @@ import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.History;
import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
+import com.yahoo.vespa.hosted.provision.testutils.MockNodeMetrics;
import com.yahoo.vespa.orchestrator.OrchestrationException;
import com.yahoo.vespa.orchestrator.Orchestrator;
import org.junit.Test;
@@ -152,7 +153,7 @@ public class InactiveAndFailedExpirerTest {
);
Orchestrator orchestrator = mock(Orchestrator.class);
doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any());
- new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30),
+ new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, new TestMetric(), tester.clock(), Duration.ofDays(30),
Duration.ofMinutes(10)).run();
assertEquals(1, tester.nodeRepository().getNodes(Node.State.inactive).size());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
index ca7c33f96bd..665dd74176d 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
@@ -36,9 +36,7 @@ import org.junit.Test;
import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -224,70 +222,4 @@ public class MetricsReporterTest {
return Optional.empty();
}
- public static class TestMetric implements Metric {
-
- public Map<String, Number> values = new LinkedHashMap<>();
- public Map<String, List<Context>> context = new LinkedHashMap<>();
-
- @Override
- public void set(String key, Number val, Context ctx) {
- values.put(key, val);
- if (ctx != null) {
- //Create one context pr value added - copy the context to not have side effects
- TestContext kontekst = (TestContext)createContext(((TestContext) ctx).properties);
- if (!context.containsKey(key)) {
- context.put(key, new ArrayList<>());
- }
- kontekst.setValue(val);
- context.get(key).add(kontekst);
- }
- }
-
- @Override
- public void add(String key, Number val, Context ctx) {
- values.put(key, val);
- if (ctx != null) {
- //Create one context pr value added - copy the context to not have side effects
- TestContext copy = (TestContext) createContext(((TestContext) ctx).properties);
- if (!context.containsKey(key)) {
- context.put(key, new ArrayList<>());
- }
- copy.setValue(val);
- context.get(key).add(copy);
- }
- }
-
- @Override
- public Context createContext(Map<String, ?> properties) {
- return new TestContext(properties);
- }
-
- double sumDoubleValues(String key, Context sumContext) {
- double sum = 0.0;
- for(Context c : context.get(key)) {
- TestContext tc = (TestContext) c;
- if (tc.value instanceof Double && tc.properties.equals(((TestContext) sumContext).properties)) {
- sum += (double) tc.value;
- }
- }
- return sum;
- }
-
- /**
- * Context where the propertymap is not shared - but unique to each value.
- */
- private static class TestContext implements Context{
- Number value;
- Map<String, ?> properties;
-
- public TestContext(Map<String, ?> properties) {
- this.properties = properties;
- }
-
- public void setValue(Number value) {
- this.value = value;
- }
- }
- }
-
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
index 585d57aae4e..ab97de80418 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
@@ -65,7 +65,7 @@ public class NodeFailTester {
public NodeFailer failer;
public ServiceMonitorStub serviceMonitor;
public MockDeployer deployer;
- public MetricsReporterTest.TestMetric metric;
+ public TestMetric metric;
private final TestHostLivenessTracker hostLivenessTracker;
private final Orchestrator orchestrator;
private final NodeRepositoryProvisioner provisioner;
@@ -103,7 +103,7 @@ public class NodeFailTester {
app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2));
tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps);
tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository);
- tester.metric = new MetricsReporterTest.TestMetric();
+ tester.metric = new TestMetric();
tester.failer = tester.createFailer();
return tester;
}
@@ -139,7 +139,7 @@ public class NodeFailTester {
app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2));
tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps);
tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository);
- tester.metric = new MetricsReporterTest.TestMetric();
+ tester.metric = new TestMetric();
tester.failer = tester.createFailer();
return tester;
}
@@ -158,7 +158,7 @@ public class NodeFailTester {
app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes));
tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps);
tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository);
- tester.metric = new MetricsReporterTest.TestMetric();
+ tester.metric = new TestMetric();
tester.failer = tester.createFailer();
return tester;
}
@@ -167,7 +167,7 @@ public class NodeFailTester {
NodeFailTester tester = new NodeFailTester();
tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), Map.of());
tester.serviceMonitor = new ServiceMonitorStub(Map.of(), tester.nodeRepository);
- tester.metric = new MetricsReporterTest.TestMetric();
+ tester.metric = new TestMetric();
tester.failer = tester.createFailer();
return tester;
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
index 2dda6c714a7..eb2a1d4db68 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
@@ -66,7 +66,10 @@ public class OperatorChangeApplicationMaintainerTest {
// Create applications
fixture.activate();
assertEquals("Initial applications are deployed", 3, fixture.deployer.redeployments);
- OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer, nodeRepository, Duration.ofMinutes(1));
+ OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer,
+ new TestMetric(),
+ nodeRepository,
+ Duration.ofMinutes(1));
clock.advance(Duration.ofMinutes(2));
maintainer.maintain();
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
index 3037d5972e5..63a22cc3029 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
@@ -303,7 +303,7 @@ public class PeriodicApplicationMaintainerTest {
TestablePeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval,
Duration minTimeBetweenRedeployments) {
- super(deployer, nodeRepository, interval, minTimeBetweenRedeployments);
+ super(deployer, new TestMetric(), nodeRepository, interval, minTimeBetweenRedeployments);
}
@Override
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java
index 387f614c5eb..d25ae234f35 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java
@@ -17,7 +17,6 @@ import com.yahoo.transaction.NestedTransaction;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder;
-import com.yahoo.vespa.hosted.provision.provisioning.HostResourcesCalculator;
import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
import org.junit.Test;
@@ -46,7 +45,7 @@ public class RebalancerTest {
NodeResources memResources = new NodeResources(4, 9, 1, 0.1);
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
- MetricsReporterTest.TestMetric metric = new MetricsReporterTest.TestMetric();
+ TestMetric metric = new TestMetric();
Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of(
cpuApp, new MockDeployer.ApplicationContext(cpuApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, cpuResources))),
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
index 276b9484ad4..7ece8cba65e 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
@@ -241,6 +241,7 @@ public class RetiredExpirerTest {
nodeRepository,
orchestrator,
deployer,
+ new TestMetric(),
clock,
Duration.ofDays(30), /* Maintenance interval, use large value so it never runs by itself */
RETIRED_EXPIRATION);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java
new file mode 100644
index 00000000000..c98216f9d14
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java
@@ -0,0 +1,75 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision.maintenance;
+
+import com.yahoo.jdisc.Metric;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TestMetric implements Metric {
+
+ public Map<String, Number> values = new LinkedHashMap<>();
+ public Map<String, List<Context>> context = new LinkedHashMap<>();
+
+ @Override
+ public void set(String key, Number val, Context ctx) {
+ values.put(key, val);
+ if (ctx != null) {
+ //Create one context pr value added - copy the context to not have side effects
+ TestContext kontekst = (TestContext)createContext(((TestContext) ctx).properties);
+ if (!context.containsKey(key)) {
+ context.put(key, new ArrayList<>());
+ }
+ kontekst.setValue(val);
+ context.get(key).add(kontekst);
+ }
+ }
+
+ @Override
+ public void add(String key, Number val, Context ctx) {
+ values.put(key, val);
+ if (ctx != null) {
+ //Create one context pr value added - copy the context to not have side effects
+ TestContext copy = (TestContext) createContext(((TestContext) ctx).properties);
+ if (!context.containsKey(key)) {
+ context.put(key, new ArrayList<>());
+ }
+ copy.setValue(val);
+ context.get(key).add(copy);
+ }
+ }
+
+ @Override
+ public Context createContext(Map<String, ?> properties) {
+ return new TestContext(properties);
+ }
+
+ double sumDoubleValues(String key, Context sumContext) {
+ double sum = 0.0;
+ for(Context c : context.get(key)) {
+ TestContext tc = (TestContext) c;
+ if (tc.value instanceof Double && tc.properties.equals(((TestContext) sumContext).properties)) {
+ sum += (double) tc.value;
+ }
+ }
+ return sum;
+ }
+
+ /**
+ * Context where the propertymap is not shared - but unique to each value.
+ */
+ private static class TestContext implements Context{
+ Number value;
+ Map<String, ?> properties;
+
+ public TestContext(Map<String, ?> properties) {
+ this.properties = properties;
+ }
+
+ public void setValue(Number value) {
+ this.value = value;
+ }
+ }
+}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
index 4a75d86f530..1265961e351 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
@@ -12,6 +12,7 @@ import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Zone;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer;
+import com.yahoo.vespa.hosted.provision.maintenance.TestMetric;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
import org.junit.Ignore;
import org.junit.Test;
@@ -140,8 +141,13 @@ public class MultigroupProvisioningTest {
Collections.singletonMap(application1,
new MockDeployer.ApplicationContext(application1, cluster(),
Capacity.from(new ClusterResources(8, 1, large), false, true))));
- new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30),
- Duration.ofHours(12)).run();
+ new RetiredExpirer(tester.nodeRepository(),
+ tester.orchestrator(),
+ deployer,
+ new TestMetric(),
+ tester.clock(),
+ Duration.ofDays(30),
+ Duration.ofHours(12)).run();
assertEquals(8, tester.getNodes(application1, Node.State.inactive).resources(small).size());
deploy(application1, 8, 8, large, tester);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java
index 8420bdeacfe..98133898cf6 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java
@@ -8,6 +8,7 @@ import com.yahoo.config.provision.HostSpec;
import com.yahoo.config.provision.NodeType;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer;
+import com.yahoo.vespa.hosted.provision.maintenance.TestMetric;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
import org.junit.Before;
@@ -94,8 +95,13 @@ public class NodeTypeProvisioningTest {
tester.clock(),
Collections.singletonMap(
application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity)));
- RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer,
- tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10));
+ RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(),
+ tester.orchestrator(),
+ deployer,
+ new TestMetric(),
+ tester.clock(),
+ Duration.ofDays(30),
+ Duration.ofMinutes(10));
{ // Deploy
List<HostSpec> hosts = deployProxies(application, tester);
@@ -161,6 +167,7 @@ public class NodeTypeProvisioningTest {
RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(),
tester.orchestrator(),
deployer,
+ new TestMetric(),
tester.clock(),
Duration.ofDays(30),
Duration.ofMinutes(10));