summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java10
-rw-r--r--config-model/src/main/resources/schema/containercluster.rnc3
-rw-r--r--config-model/src/test/schema-test-files/services.xml4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java10
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java38
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java9
-rw-r--r--container-core/abi-spec.json1
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/VipStatus.java36
-rw-r--r--container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java62
-rw-r--r--container-disc/pom.xml5
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java26
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java48
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java71
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java4
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/FilterBindings.java30
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilterBindings.java110
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java18
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java2
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscContext.java12
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java10
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java4
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/package-info.java4
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/FilterTestCase.java123
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/HttpServerConformanceTest.java6
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/TestDrivers.java9
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/servlet/JDiscFilterForServletTest.java36
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricSnapshot.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java19
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java9
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcherTest.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDbTest.java (renamed from node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java)6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDbTest.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainerTest.java120
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java27
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java7
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java12
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImagesTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningCompleteHostCalculatorTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java28
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java20
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java30
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java18
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java90
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java6
55 files changed, 714 insertions, 440 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java
index acf9340fa7c..ab283a8fbd1 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java
@@ -16,11 +16,15 @@ public class AutoscalingMetrics {
private static MetricSet create() {
return new MetricSet("autoscaling",
- metrics("cpu.util", "mem_total.util", "disk.util", "application_generation"));
+ metrics("cpu.util",
+ "mem_total.util",
+ "disk.util",
+ "application_generation",
+ "in_service"));
}
- private static Set<Metric> metrics(String ... names) {
- return Arrays.stream(names).map(Metric::new).collect(Collectors.toSet());
+ private static Set<Metric> metrics(String ... metrics) {
+ return Arrays.stream(metrics).map(Metric::new).collect(Collectors.toSet());
}
}
diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc
index 66438570d2f..25d10e0d9b3 100644
--- a/config-model/src/main/resources/schema/containercluster.rnc
+++ b/config-model/src/main/resources/schema/containercluster.rnc
@@ -53,6 +53,7 @@ Http = element http {
}
Filtering = element filtering {
+ attribute strict-mode { xsd:boolean }? &
HttpFilter* &
AccessControl? &
element request-chain {
@@ -66,6 +67,8 @@ Filtering = element filtering {
HttpServer = element server {
attribute port { xsd:nonNegativeInteger }? &
attribute required { xsd:boolean }? &
+ attribute default-request-chain { xsd:string }? &
+ attribute default-response-chain { xsd:string }? &
ComponentId &
(Ssl | SslProvider)? &
GenericConfig*
diff --git a/config-model/src/test/schema-test-files/services.xml b/config-model/src/test/schema-test-files/services.xml
index 51310682f78..7ae4bba00ce 100644
--- a/config-model/src/test/schema-test-files/services.xml
+++ b/config-model/src/test/schema-test-files/services.xml
@@ -85,7 +85,7 @@
</servlet>
<http>
- <filtering>
+ <filtering strict-mode="true">
<access-control domain="my.athens-domain" read="true">
<exclude>
<binding>http//*/foo/*</binding>
@@ -124,7 +124,7 @@
</request-chain>
</filtering>
- <server port="4080" id="myServer"/>
+ <server port="4080" id="myServer" default-request-chain="DerivedChain" default-response-chain="BaseChain"/>
<server port="4081" id="anotherServer"/>
<server port="4082" id="defaultSsl">
<ssl>
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index ef45b1aa0dd..32b1a847134 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -486,8 +486,12 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
Optional<Long> activeSession = tenantApplications.activeSessionOf(applicationId);
if (activeSession.isEmpty()) return false;
- Session session = getRemoteSession(tenant, activeSession.get());
- tenant.getSessionRepository().createSetStatusTransaction(session, Session.Status.DELETE).commit();
+ try {
+ Session session = getRemoteSession(tenant, activeSession.get());
+ transaction.add(tenant.getSessionRepository().createSetStatusTransaction(session, Session.Status.DELETE));
+ } catch (NotFoundException e) {
+ log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Active session exists, but has not been deleted properly. Trying to cleanup");
+ }
Curator curator = tenantRepository.getCurator();
transaction.add(new ContainerEndpointsCache(tenant.getPath(), curator).delete(applicationId)); // TODO: Not unit tested
@@ -592,7 +596,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
return tenantRepository.getTenant(applicationId.tenant());
}
- private Application getApplication(ApplicationId applicationId) {
+ Application getApplication(ApplicationId applicationId) {
return getApplication(applicationId, Optional.empty());
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
index d153c63b537..0cab49a9f00 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
@@ -77,6 +77,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
/**
* @author hmusum
@@ -354,6 +355,43 @@ public class ApplicationRepositoryTest {
assertTrue(applicationRepository.delete(applicationId()));
}
+
+ // If delete fails, a retry should work if the failure is transient and zookeeper state should be constistent
+ {
+ PrepareResult result = deployApp(testApp);
+ long sessionId = result.sessionId();
+ assertNotNull(sessionRepository.getRemoteSession(sessionId));
+ assertNotNull(applicationRepository.getActiveSession(applicationId()));
+ assertEquals(sessionId, applicationRepository.getActiveSession(applicationId()).getSessionId());
+ assertNotNull(applicationRepository.getApplication(applicationId()));
+
+ provisioner.failureOnRemove(true);
+ try {
+ applicationRepository.delete(applicationId());
+ fail("Should fail with RuntimeException");
+ } catch (RuntimeException e) {
+ // ignore
+ }
+ assertNotNull(sessionRepository.getRemoteSession(sessionId));
+ assertNotNull(applicationRepository.getActiveSession(applicationId()));
+ assertEquals(sessionId, applicationRepository.getActiveSession(applicationId()).getSessionId());
+
+ // Delete should work when there is no failure anymore
+ provisioner.failureOnRemove(false);
+ assertTrue(applicationRepository.delete(applicationId()));
+
+ // Session should be in state DELETE
+ String sessionNode = sessionRepository.getSessionPath(sessionId).getAbsolute();
+ assertEquals(Session.Status.DELETE.name(), configCurator.getData(sessionNode + "/sessionState"));
+ assertNotNull(sessionRepository.getRemoteSession(sessionId)); // session still exists
+ assertNull(applicationRepository.getActiveSession(applicationId())); // but it is not active
+ try {
+ applicationRepository.getApplication(applicationId());
+ fail("Should fail with NotFoundException, application should not exist");
+ } catch (NotFoundException e) {
+ // ignore
+ }
+ }
}
@Test
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
index d857fa29450..83184ef6d47 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
@@ -15,6 +15,7 @@ import com.yahoo.container.core.VipStatusConfig;
import com.yahoo.container.handler.ClustersStatus;
import com.yahoo.container.handler.VipStatus;
import com.yahoo.container.jdisc.state.StateMonitor;
+import com.yahoo.docproc.jdisc.metric.NullMetric;
import com.yahoo.path.Path;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.deploy.DeployTester;
@@ -233,7 +234,8 @@ public class ConfigServerBootstrapTest {
return new VipStatus(new QrSearchersConfig.Builder().build(),
new VipStatusConfig.Builder().build(),
new ClustersStatus(),
- stateMonitor);
+ stateMonitor,
+ new NullMetric());
}
private VersionState createVersionState() throws IOException {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java b/configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java
index b47a81284c0..e828aa1fc6c 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java
@@ -13,7 +13,6 @@ import com.yahoo.config.provision.ProvisionLock;
import com.yahoo.config.provision.ProvisionLogger;
import com.yahoo.config.provision.Provisioner;
import com.yahoo.config.provision.exception.LoadBalancerServiceException;
-import com.yahoo.transaction.NestedTransaction;
import java.util.Collection;
import java.util.List;
@@ -31,6 +30,7 @@ public class MockProvisioner implements Provisioner {
private HostFilter lastRestartFilter;
private boolean transientFailureOnPrepare = false;
+ private boolean failureOnRemove = false;
private HostProvisioner hostProvisioner = null;
public MockProvisioner hostProvisioner(HostProvisioner hostProvisioner) {
@@ -43,6 +43,10 @@ public class MockProvisioner implements Provisioner {
return this;
}
+ public void failureOnRemove(boolean failureOnRemove) {
+ this.failureOnRemove = failureOnRemove;
+ }
+
@Override
public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) {
if (hostProvisioner != null) {
@@ -63,6 +67,9 @@ public class MockProvisioner implements Provisioner {
@Override
public void remove(ApplicationTransaction transaction) {
+ if (failureOnRemove)
+ throw new IllegalStateException("Unable to remove " + transaction.application());
+
removed = true;
lastApplicationId = transaction.application();
}
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json
index 458320c87df..e734ceee046 100644
--- a/container-core/abi-spec.json
+++ b/container-core/abi-spec.json
@@ -257,6 +257,7 @@
"public void <init>(com.yahoo.container.QrSearchersConfig)",
"public void <init>(com.yahoo.container.handler.ClustersStatus)",
"public void <init>(com.yahoo.container.QrSearchersConfig, com.yahoo.container.handler.ClustersStatus)",
+ "public void <init>(com.yahoo.container.QrSearchersConfig, com.yahoo.container.core.VipStatusConfig, com.yahoo.container.handler.ClustersStatus, com.yahoo.container.jdisc.state.StateMonitor, com.yahoo.jdisc.Metric)",
"public void <init>(com.yahoo.container.QrSearchersConfig, com.yahoo.container.core.VipStatusConfig, com.yahoo.container.handler.ClustersStatus, com.yahoo.container.jdisc.state.StateMonitor)",
"public void <init>(com.yahoo.container.QrSearchersConfig, com.yahoo.container.handler.ClustersStatus, com.yahoo.container.jdisc.state.StateMonitor)",
"public void <init>(com.yahoo.container.QrSearchersConfig, com.yahoo.container.core.VipStatusConfig, com.yahoo.container.handler.ClustersStatus)",
diff --git a/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java b/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java
index 876d05b7be9..50b34d39751 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java
@@ -5,7 +5,9 @@ import com.google.inject.Inject;
import com.yahoo.container.QrSearchersConfig;
import com.yahoo.container.core.VipStatusConfig;
import com.yahoo.container.jdisc.state.StateMonitor;
+import com.yahoo.jdisc.Metric;
+import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -19,6 +21,8 @@ import java.util.stream.Collectors;
*/
public class VipStatus {
+ private final Metric metric;
+
private final ClustersStatus clustersStatus;
private final StateMonitor healthState;
@@ -57,15 +61,25 @@ public class VipStatus {
public VipStatus(QrSearchersConfig dispatchers,
VipStatusConfig vipStatusConfig,
ClustersStatus clustersStatus,
- StateMonitor healthState) {
+ StateMonitor healthState,
+ Metric metric) {
this.clustersStatus = clustersStatus;
this.healthState = healthState;
+ this.metric = metric;
initiallyInRotation = vipStatusConfig.initiallyInRotation();
clustersStatus.setClusters(dispatchers.searchcluster().stream().map(c -> c.name()).collect(Collectors.toSet()));
updateCurrentlyInRotation();
}
@Deprecated // TODO: Remove on Vespa 8
+ public VipStatus(QrSearchersConfig dispatchers,
+ VipStatusConfig vipStatusConfig,
+ ClustersStatus clustersStatus,
+ StateMonitor healthState) {
+ this(dispatchers, vipStatusConfig, clustersStatus, healthState, new NullMetric());
+ }
+
+ @Deprecated // TODO: Remove on Vespa 8
public VipStatus(QrSearchersConfig dispatchers, ClustersStatus clustersStatus, StateMonitor healthState) {
this(dispatchers, new VipStatusConfig.Builder().build(), clustersStatus, healthState);
}
@@ -134,6 +148,8 @@ public class VipStatus {
healthState.status(StateMonitor.Status.up);
else if (healthState.status() == StateMonitor.Status.up)
healthState.status(StateMonitor.Status.down);
+
+ metric.set("in_service", currentlyInRotation ? 1 : 0, metric.createContext(Map.of()));
}
}
@@ -144,4 +160,22 @@ public class VipStatus {
}
}
+ private static class NullMetric implements Metric {
+
+ @Override
+ public void set(String key, Number val, Context ctx) { }
+
+ @Override
+ public void add(String key, Number val, Context ctx) { }
+
+ @Override
+ public Context createContext(Map<String, ?> properties) {
+ return new NullContext();
+ }
+
+ private static class NullContext implements Context {
+ }
+
+ }
+
}
diff --git a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
index 3f33efa1993..bce9fe318d5 100644
--- a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
+++ b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
@@ -4,8 +4,11 @@ package com.yahoo.container.handler;
import com.yahoo.container.QrSearchersConfig;
import com.yahoo.container.core.VipStatusConfig;
import com.yahoo.container.jdisc.state.StateMonitor;
+import com.yahoo.jdisc.Metric;
import org.junit.Test;
+import java.util.Map;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -26,7 +29,7 @@ public class VipStatusTestCase {
public void testUpRequireAllDown() {
String[] clusters = {"cluster1", "cluster2", "cluster3"};
- VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus());
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus(), new MetricMock());
assertFalse(v.isInRotation());
addToRotation(clusters, v);
assertTrue(v.isInRotation());
@@ -53,15 +56,28 @@ public class VipStatusTestCase {
@Test
public void testNoClustersConfiguringInitiallyInRotationFalse() {
String[] clusters = {};
- VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, false, new ClustersStatus());
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, false, new ClustersStatus(), new MetricMock());
assertFalse(v.isInRotation());
}
@Test
public void testNoClustersConfiguringInitiallyInRotationTrue() {
String[] clusters = {};
- VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus());
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus(), new MetricMock());
+ assertTrue(v.isInRotation());
+ }
+
+ @Test
+ public void testInRotationMetricFollowsRotationState() {
+ MetricMock metric = new MetricMock();
+ String[] clusters = {"cluster1", "cluster2", "cluster3"};
+
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus(), metric);
+ assertFalse(v.isInRotation());
+ assertEquals(0, metric.inRotation);
+ addToRotation(clusters, v);
assertTrue(v.isInRotation());
+ assertEquals(1, metric.inRotation);
}
@Test
@@ -85,7 +101,7 @@ public class VipStatusTestCase {
String[] clusters = {"cluster1", "cluster2", "cluster3"};
- VipStatus v = createVipStatus(clusters, true, clustersStatus, stateMonitor);
+ VipStatus v = createVipStatus(clusters, true, clustersStatus, stateMonitor, new MetricMock());
assertFalse(v.isInRotation());
assertEquals(StateMonitor.Status.initializing, stateMonitor.status());
@@ -98,7 +114,7 @@ public class VipStatusTestCase {
v.removeFromRotation("cluster1");
if (anotherIsDown)
v.removeFromRotation("cluster3");
- v = createVipStatus(newClusters, true, clustersStatus, stateMonitor);
+ v = createVipStatus(newClusters, true, clustersStatus, stateMonitor, new MetricMock());
assertTrue(v.isInRotation());
assertEquals(StateMonitor.Status.up, stateMonitor.status());
@@ -124,18 +140,21 @@ public class VipStatusTestCase {
private static VipStatus createVipStatus(String[] clusters,
StateMonitor.Status startState,
boolean initiallyInRotation,
- ClustersStatus clustersStatus) {
- return createVipStatus(clusters, initiallyInRotation, clustersStatus, createStateMonitor(startState));
+ ClustersStatus clustersStatus,
+ Metric metric) {
+ return createVipStatus(clusters, initiallyInRotation, clustersStatus, createStateMonitor(startState), metric);
}
private static VipStatus createVipStatus(String[] clusters,
boolean initiallyInRotation,
ClustersStatus clustersStatus,
- StateMonitor stateMonitor) {
+ StateMonitor stateMonitor,
+ Metric metric) {
return new VipStatus(createSearchersConfig(clusters),
new VipStatusConfig.Builder().initiallyInRotation(initiallyInRotation).build(),
clustersStatus,
- stateMonitor);
+ stateMonitor,
+ metric);
}
private static StateMonitor createStateMonitor(StateMonitor.Status startState) {
@@ -155,7 +174,7 @@ public class VipStatusTestCase {
}
private static void verifyStatus(String[] clusters, StateMonitor.Status status) {
- VipStatus v = createVipStatus(clusters, status, true, new ClustersStatus());
+ VipStatus v = createVipStatus(clusters, status, true, new ClustersStatus(), new MetricMock());
removeFromRotation(clusters, v);
// initial state
assertFalse(v.isInRotation());
@@ -167,4 +186,27 @@ public class VipStatusTestCase {
assertTrue(v.isInRotation());
}
+ private static class MetricMock implements Metric {
+
+ int inRotation = 0;
+
+ @Override
+ public void add(String key, Number val, Context ctx) {
+ throw new RuntimeException("Metric.add called unexpectedly");
+ }
+
+ @Override
+ public void set(String key, Number val, Context ctx) {
+ if ( ! key.equals("in_service"))
+ throw new RuntimeException("Metric.set called with unexpected key " + key);
+ inRotation = val.intValue();
+ }
+
+ @Override
+ public Context createContext(Map<String, ?> properties) { return new EmptyContext(); }
+
+ private static class EmptyContext implements Context {}
+
+ }
+
} \ No newline at end of file
diff --git a/container-disc/pom.xml b/container-disc/pom.xml
index 1caf66e29dc..413af786f2c 100644
--- a/container-disc/pom.xml
+++ b/container-disc/pom.xml
@@ -32,6 +32,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>com.yahoo.vespa</groupId>
<artifactId>config-lib</artifactId>
<version>${project.version}</version>
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java
index 972f9dd8e18..195aee93246 100644
--- a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java
@@ -5,12 +5,9 @@ import com.yahoo.component.ComponentId;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.container.di.componentgraph.Provider;
import com.yahoo.container.http.filter.FilterChainRepository;
-import com.yahoo.jdisc.application.BindingRepository;
import com.yahoo.jdisc.http.ServerConfig;
-import com.yahoo.jdisc.http.filter.RequestFilter;
-import com.yahoo.jdisc.http.filter.ResponseFilter;
import com.yahoo.jdisc.http.filter.SecurityRequestFilter;
-import com.yahoo.jdisc.http.server.FilterBindings;
+import com.yahoo.jdisc.http.server.jetty.FilterBindings;
import java.util.ArrayList;
import java.util.List;
@@ -18,28 +15,26 @@ import java.util.List;
/**
* Provides filter bindings based on vespa config.
*
- * @author bakksjo
+ * @author Oyvind Bakksjo
+ * @author bjorncs
*/
public class FilterBindingsProvider implements Provider<FilterBindings> {
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
+ private final FilterBindings filterBindings;
public FilterBindingsProvider(ComponentId componentId,
ServerConfig config,
FilterChainRepository filterChainRepository,
ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) {
- ComponentId serverId = componentId.getNamespace();
try {
- FilterUtil.setupFilters(
+ this.filterBindings = FilterUtil.setupFilters(
componentId,
legacyRequestFilters,
toFilterSpecs(config.filter()),
- filterChainRepository,
- requestFilters,
- responseFilters);
+ filterChainRepository);
} catch (Exception e) {
- throw new RuntimeException("Invalid config for http server " + serverId, e);
+ throw new RuntimeException(
+ "Invalid config for http server '" + componentId.getNamespace() + "': " + e.getMessage(), e);
}
}
@@ -51,10 +46,7 @@ public class FilterBindingsProvider implements Provider<FilterBindings> {
return outFilters;
}
- @Override
- public FilterBindings get() {
- return new FilterBindings(requestFilters, responseFilters);
- }
+ @Override public FilterBindings get() { return filterBindings; }
@Override
public void deconstruct() {}
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java
index 24af56788b9..52829d6710e 100644
--- a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java
@@ -5,12 +5,11 @@ import com.yahoo.component.ComponentId;
import com.yahoo.component.ComponentSpecification;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.container.http.filter.FilterChainRepository;
-import com.yahoo.jdisc.application.BindingRepository;
-import com.yahoo.jdisc.application.UriPattern;
import com.yahoo.jdisc.http.filter.RequestFilter;
import com.yahoo.jdisc.http.filter.ResponseFilter;
import com.yahoo.jdisc.http.filter.SecurityRequestFilter;
import com.yahoo.jdisc.http.filter.SecurityRequestFilterChain;
+import com.yahoo.jdisc.http.server.jetty.FilterBindings;
import java.util.List;
@@ -18,18 +17,15 @@ import java.util.List;
* Helper class to set up filter binding repositories based on config.
*
* @author Øyvind Bakksjø
+ * @author bjorncs
*/
class FilterUtil {
private static final ComponentId SEARCH_SERVER_COMPONENT_ID = ComponentId.fromString("SearchServer");
- private final BindingRepository<RequestFilter> requestFilters;
- private final BindingRepository<ResponseFilter> responseFilters;
+ private final FilterBindings.Builder builder = new FilterBindings.Builder();
- private FilterUtil(BindingRepository<RequestFilter> requestFilters, BindingRepository<ResponseFilter> responseFilters) {
- this.requestFilters = requestFilters;
- this.responseFilters = responseFilters;
- }
+ private FilterUtil() {}
private void configureFilters(List<FilterSpec> filtersConfig, FilterChainRepository filterChainRepository) {
for (FilterSpec filterConfig : filtersConfig) {
@@ -37,50 +33,48 @@ class FilterUtil {
if (filter == null) {
throw new RuntimeException("No http filter with id " + filterConfig.getId());
}
- addFilter(filter, filterConfig.getBinding());
+ addFilter(filter, filterConfig.getBinding(), filterConfig.getId());
}
}
- private void addFilter(Object filter, String binding) {
+ private void addFilter(Object filter, String binding, String filterId) {
if (filter instanceof RequestFilter && filter instanceof ResponseFilter) {
throw new RuntimeException("The filter " + filter.getClass().getName() +
" is unsupported since it's both a RequestFilter and a ResponseFilter.");
} else if (filter instanceof RequestFilter) {
- requestFilters.put(new UriPattern(binding), (RequestFilter) filter);
+ builder.addRequestFilter(filterId, binding, (RequestFilter) filter);
} else if (filter instanceof ResponseFilter) {
- responseFilters.put(new UriPattern(binding), (ResponseFilter) filter);
+ builder.addResponseFilter(filterId, binding, (ResponseFilter) filter);
} else {
throw new RuntimeException("Unknown filter type " + filter.getClass().getName());
}
}
- //TVT: remove
+ // TODO(gjoranv): remove
private void configureLegacyFilters(ComponentId id, ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) {
ComponentId serverName = id.getNamespace();
if (SEARCH_SERVER_COMPONENT_ID.equals(serverName) && !legacyRequestFilters.allComponents().isEmpty()) {
- requestFilters.bind("http://*/*",
- SecurityRequestFilterChain.newInstance(legacyRequestFilters.allComponents()));
+ builder.addRequestFilter(
+ "legacy-filters", "http://*/*", SecurityRequestFilterChain.newInstance(legacyRequestFilters.allComponents()));
}
}
/**
* Populates binding repositories with filters based on config.
- *
- * @param requestFilters output argument that will be mutated
- * @param responseFilters output argument that will be mutated
*/
- public static void setupFilters(ComponentId componentId,
- ComponentRegistry<SecurityRequestFilter> legacyRequestFilters,
- List<FilterSpec> filtersConfig,
- FilterChainRepository filterChainRepository,
- BindingRepository<RequestFilter> requestFilters,
- BindingRepository<ResponseFilter> responseFilters) {
- FilterUtil filterUtil = new FilterUtil(requestFilters, responseFilters);
-
- // TODO: remove
+ public static FilterBindings setupFilters(
+ ComponentId componentId,
+ ComponentRegistry<SecurityRequestFilter> legacyRequestFilters,
+ List<FilterSpec> filtersConfig,
+ FilterChainRepository filterChainRepository) {
+ FilterUtil filterUtil = new FilterUtil();
+
+ // TODO(gjoranv): remove
filterUtil.configureLegacyFilters(componentId, legacyRequestFilters);
filterUtil.configureFilters(filtersConfig, filterChainRepository);
+
+ return filterUtil.builder.build();
}
public static class FilterSpec {
diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
index e3039e88525..c233680590d 100644
--- a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
+++ b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
@@ -5,32 +5,19 @@ import com.yahoo.component.ComponentId;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.container.core.ChainsConfig;
import com.yahoo.container.http.filter.FilterChainRepository;
-import com.yahoo.jdisc.application.BindingRepository;
-import com.yahoo.jdisc.application.UriPattern;
import com.yahoo.jdisc.http.ServerConfig;
import com.yahoo.jdisc.http.filter.RequestFilter;
import com.yahoo.jdisc.http.filter.ResponseFilter;
-import com.yahoo.jdisc.http.server.FilterBindings;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
+import com.yahoo.jdisc.http.server.jetty.FilterBindings;
import org.junit.Test;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
/**
- * @author bakksjo
+ * @author Oyvind Bakksjo
+ * @author bjorncs
*/
public class FilterBindingsProviderTest {
final ServerConfig.Builder configBuilder = new ServerConfig.Builder();
@@ -52,9 +39,9 @@ public class FilterBindingsProviderTest {
final FilterBindings filterBindings = provider.get();
- assertNotNull(filterBindings);
- assertFalse(filterBindings.getRequestFilters().iterator().hasNext());
- assertFalse(filterBindings.getResponseFilters().iterator().hasNext());
+ assertThat(filterBindings).isNotNull();
+ assertThat(filterBindings.requestFilterIds()).isEmpty();
+ assertThat(filterBindings.responseFilterIds()).isEmpty();
}
@Test
@@ -105,19 +92,11 @@ public class FilterBindingsProviderTest {
final FilterBindings filterBindings = provider.get();
// Verify.
- assertNotNull(filterBindings);
- assertThat(
- filterBindings.getRequestFilters(),
- containsFilters(requestFilter1Instance, requestFilter2Instance));
- assertThat(
- filterBindings.getRequestFilters(),
- not(containsFilters(requestFilter3Instance)));
- assertThat(
- filterBindings.getResponseFilters(),
- containsFilters(responseFilter1Instance, responseFilter3Instance));
- assertThat(
- filterBindings.getResponseFilters(),
- not(containsFilters(responseFilter2Instance)));
+ assertThat(filterBindings).isNotNull();
+ assertThat(filterBindings.requestFilters())
+ .containsExactlyInAnyOrder(requestFilter1Instance, requestFilter2Instance);
+ assertThat(filterBindings.responseFilters())
+ .containsExactlyInAnyOrder(responseFilter1Instance, responseFilter3Instance);
}
private interface DualRoleFilter extends RequestFilter, ResponseFilter {}
@@ -148,7 +127,7 @@ public class FilterBindingsProviderTest {
new ComponentRegistry<>());
fail("Dual-role filter should not be accepted");
} catch (RuntimeException e) {
- assertTrue(e.getMessage().contains("Invalid config"));
+ assertThat(e.getMessage()).contains("Invalid config");
}
}
@@ -173,30 +152,8 @@ public class FilterBindingsProviderTest {
new ComponentRegistry<>());
fail("Config with unknown filter reference should not be accepted");
} catch (RuntimeException e) {
- assertTrue(e.getMessage().contains("Invalid config"));
+ assertThat(e.getMessage()).contains("Invalid config");
}
}
- @SafeVarargs
- @SuppressWarnings("varargs")
- private static <T> Matcher<? super BindingRepository<T>> containsFilters(
- final T... requiredInstances) {
- return new TypeSafeMatcher<>() {
- private final Set<T> requiredFilterSet = new HashSet<>(Arrays.asList(requiredInstances));
-
- @Override
- protected boolean matchesSafely(final BindingRepository<T> actualInstances) {
- final Set<T> notFoundFilterSet = new HashSet<>(requiredFilterSet);
- for (final Map.Entry<UriPattern, T> actualEntry : actualInstances) {
- notFoundFilterSet.remove(actualEntry.getValue());
- }
- return notFoundFilterSet.isEmpty();
- }
-
- @Override
- public void describeTo(final Description description) {
- description.appendText("BindingRepository containing " + requiredFilterSet);
- }
- };
- }
}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index 6a831cb67d5..cd60a082472 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -332,9 +332,9 @@ public class Flags {
public static final UnboundBooleanFlag REGIONAL_CONTAINER_REGISTRY = defineFeatureFlag(
"regional-container-registry",
- false,
+ true,
"Whether host-admin should download images from the zone's regional container registry",
- "Takes effect on host-admin restart");
+ "Takes effect immediately");
public static final UnboundBooleanFlag ENABLE_AUTOMATIC_REINDEXING = defineFeatureFlag(
"enable-automatic-reindexing",
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/FilterBindings.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/FilterBindings.java
deleted file mode 100644
index 4dabed41bc6..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/FilterBindings.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.server;
-
-import com.yahoo.jdisc.application.BindingRepository;
-import com.yahoo.jdisc.http.filter.RequestFilter;
-import com.yahoo.jdisc.http.filter.ResponseFilter;
-
-/**
- * @author bakksjo
- */
-public class FilterBindings {
-
- private final BindingRepository<RequestFilter> requestFilters;
- private final BindingRepository<ResponseFilter> responseFilters;
-
- public FilterBindings(BindingRepository<RequestFilter> requestFilters,
- BindingRepository<ResponseFilter> responseFilters) {
- this.requestFilters = requestFilters;
- this.responseFilters = responseFilters;
- }
-
- public BindingRepository<RequestFilter> getRequestFilters() {
- return requestFilters;
- }
-
- public BindingRepository<ResponseFilter> getResponseFilters() {
- return responseFilters;
- }
-
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilterBindings.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilterBindings.java
new file mode 100644
index 00000000000..301c92a4583
--- /dev/null
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilterBindings.java
@@ -0,0 +1,110 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.jdisc.http.server.jetty;
+
+import com.yahoo.jdisc.application.BindingRepository;
+import com.yahoo.jdisc.application.BindingSet;
+import com.yahoo.jdisc.application.UriPattern;
+import com.yahoo.jdisc.http.filter.RequestFilter;
+import com.yahoo.jdisc.http.filter.ResponseFilter;
+
+import java.net.URI;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import static java.util.stream.Collectors.toSet;
+
+/**
+ * Resolves request/response filter (chain) from a {@link URI} instance.
+ *
+ * @author Oyvind Bakksjo
+ * @author bjorncs
+ */
+public class FilterBindings {
+
+ private final BindingSet<FilterHolder<RequestFilter>> requestFilters;
+ private final BindingSet<FilterHolder<ResponseFilter>> responseFilters;
+
+ private FilterBindings(
+ BindingSet<FilterHolder<RequestFilter>> requestFilters,
+ BindingSet<FilterHolder<ResponseFilter>> responseFilters) {
+ this.requestFilters = requestFilters;
+ this.responseFilters = responseFilters;
+ }
+
+ public Optional<String> resolveRequestFilter(URI uri) { return resolveFilterId(requestFilters, uri); }
+
+ public Optional<String> resolveResponseFilter(URI uri) { return resolveFilterId(responseFilters, uri); }
+
+ public RequestFilter getRequestFilter(String filterId) { return getFilterInstance(requestFilters, filterId); }
+
+ public ResponseFilter getResponseFilter(String filterId) { return getFilterInstance(responseFilters, filterId); }
+
+ public Collection<String> requestFilterIds() { return filterIds(requestFilters); }
+
+ public Collection<String> responseFilterIds() { return filterIds(responseFilters); }
+
+ public Collection<RequestFilter> requestFilters() { return filters(requestFilters); }
+
+ public Collection<ResponseFilter> responseFilters() { return filters(responseFilters); }
+
+ private static <T> Optional<String> resolveFilterId(BindingSet<FilterHolder<T>> filters, URI uri) {
+ return Optional.ofNullable(filters.resolve(uri))
+ .map(holder -> holder.filterId);
+ }
+
+ private static <T> T getFilterInstance(BindingSet<FilterHolder<T>> filters, String filterId) {
+ return stream(filters)
+ .filter(filterEntry -> filterId.equals(filterEntry.getValue().filterId))
+ .map(filterEntry -> filterEntry.getValue().filterInstance)
+ .findAny()
+ .orElseThrow(() -> new IllegalArgumentException("No filter with id " + filterId));
+ }
+
+ private static <T> Collection<String> filterIds(BindingSet<FilterHolder<T>> filters) {
+ return stream(filters)
+ .map(filterEntry -> filterEntry.getValue().filterId)
+ .collect(toSet());
+ }
+
+ private static <T> Collection<T> filters(BindingSet<FilterHolder<T>> filters) {
+ return stream(filters)
+ .map(filterEntry -> filterEntry.getValue().filterInstance)
+ .collect(toSet());
+ }
+
+ private static <T> Stream<Map.Entry<UriPattern, FilterHolder<T>>> stream(BindingSet<FilterHolder<T>> filters) {
+ return StreamSupport.stream(filters.spliterator(), false);
+ }
+
+ public static class Builder {
+ private final BindingRepository<FilterHolder<RequestFilter>> requestFilters = new BindingRepository<>();
+ private final BindingRepository<FilterHolder<ResponseFilter>> responseFilters = new BindingRepository<>();
+
+ public Builder() {}
+
+ public Builder addRequestFilter(String id, String binding, RequestFilter filter) {
+ requestFilters.bind(binding, new FilterHolder<>(id, filter));
+ return this;
+ }
+
+ public Builder addResponseFilter(String id, String binding, ResponseFilter filter) {
+ responseFilters.bind(binding, new FilterHolder<>(id, filter));
+ return this;
+ }
+
+ public FilterBindings build() { return new FilterBindings(requestFilters.activate(), responseFilters.activate()); }
+ }
+
+ private static class FilterHolder<T> {
+ final String filterId;
+ final T filterInstance;
+
+ FilterHolder(String filterId, T filterInstance) {
+ this.filterId = filterId;
+ this.filterInstance = filterInstance;
+ }
+ }
+}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java
index 1734dc3716f..7f761d6ab4a 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java
@@ -4,7 +4,6 @@ package com.yahoo.jdisc.http.server.jetty;
import com.google.common.base.Preconditions;
import com.yahoo.jdisc.Request;
import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.application.BindingSet;
import com.yahoo.jdisc.handler.AbstractRequestHandler;
import com.yahoo.jdisc.handler.BindingNotFoundException;
import com.yahoo.jdisc.handler.CompletionHandler;
@@ -42,13 +41,10 @@ class FilteringRequestHandler extends AbstractRequestHandler {
};
- private final BindingSet<RequestFilter> requestFilters;
- private final BindingSet<ResponseFilter> responseFilters;
+ private final FilterBindings filterBindings;
- public FilteringRequestHandler(BindingSet<RequestFilter> requestFilters,
- BindingSet<ResponseFilter> responseFilters) {
- this.requestFilters = requestFilters;
- this.responseFilters = responseFilters;
+ public FilteringRequestHandler(FilterBindings filterBindings) {
+ this.filterBindings = filterBindings;
}
@Override
@@ -56,8 +52,12 @@ class FilteringRequestHandler extends AbstractRequestHandler {
Preconditions.checkArgument(request instanceof HttpRequest, "Expected HttpRequest, got " + request);
Objects.requireNonNull(originalResponseHandler, "responseHandler");
- RequestFilter requestFilter = requestFilters.resolve(request.getUri());
- ResponseFilter responseFilter = responseFilters.resolve(request.getUri());
+ RequestFilter requestFilter = filterBindings.resolveRequestFilter(request.getUri())
+ .map(filterBindings::getRequestFilter)
+ .orElse(null);
+ ResponseFilter responseFilter = filterBindings.resolveResponseFilter(request.getUri())
+ .map(filterBindings::getResponseFilter)
+ .orElse(null);
// Not using request.connect() here - it adds logic for error handling that we'd rather leave to the framework.
RequestHandler resolvedRequestHandler = request.container().resolveHandler(request);
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
index 2cab06e9e23..ed5095fb06f 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
@@ -212,7 +212,7 @@ class HttpRequestDispatch {
AccessLogEntry accessLogEntry,
HttpServletRequest servletRequest) {
RequestHandler requestHandler = wrapHandlerIfFormPost(
- new FilteringRequestHandler(context.requestFilters, context.responseFilters),
+ new FilteringRequestHandler(context.filterBindings),
servletRequest, context.serverConfig.removeRawPostBodyForWwwUrlEncodedPost());
return new AccessLoggingRequestHandler(requestHandler, accessLogEntry);
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscContext.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscContext.java
index 4172ec16b00..4667ff3975b 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscContext.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscContext.java
@@ -2,31 +2,25 @@
package com.yahoo.jdisc.http.server.jetty;
import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.application.BindingSet;
import com.yahoo.jdisc.http.ServerConfig;
-import com.yahoo.jdisc.http.filter.RequestFilter;
-import com.yahoo.jdisc.http.filter.ResponseFilter;
import com.yahoo.jdisc.service.CurrentContainer;
import java.util.concurrent.Executor;
public class JDiscContext {
- final BindingSet<RequestFilter> requestFilters;
- final BindingSet<ResponseFilter> responseFilters;
+ final FilterBindings filterBindings;
final CurrentContainer container;
final Executor janitor;
final Metric metric;
final ServerConfig serverConfig;
- public JDiscContext(BindingSet<RequestFilter> requestFilters,
- BindingSet<ResponseFilter> responseFilters,
+ public JDiscContext(FilterBindings filterBindings,
CurrentContainer container,
Executor janitor,
Metric metric,
ServerConfig serverConfig) {
- this.requestFilters = requestFilters;
- this.responseFilters = responseFilters;
+ this.filterBindings = filterBindings;
this.container = container;
this.janitor = janitor;
this.metric = metric;
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java
index e3bcec765cd..5a904299e44 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java
@@ -3,7 +3,6 @@ package com.yahoo.jdisc.http.server.jetty;
import com.yahoo.container.logging.AccessLogEntry;
import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.filter.RequestFilter;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncListener;
@@ -76,7 +75,8 @@ class JDiscFilterInvokerFilter implements Filter {
private void runChainAndResponseFilters(URI uri, HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
Optional<OneTimeRunnable> responseFilterInvoker =
- Optional.ofNullable(jDiscContext.responseFilters.resolve(uri))
+ jDiscContext.filterBindings.resolveResponseFilter(uri)
+ .map(jDiscContext.filterBindings::getResponseFilter)
.map(responseFilter ->
new OneTimeRunnable(() ->
filterInvoker.invokeResponseFilterChain(responseFilter, uri, request, response)));
@@ -106,12 +106,12 @@ class JDiscFilterInvokerFilter implements Filter {
private HttpServletRequest runRequestFilterWithMatchingBinding(AtomicReference<Boolean> responseReturned, URI uri, HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
- RequestFilter requestFilter = jDiscContext.requestFilters.resolve(uri);
- if (requestFilter == null)
+ String requestFilterId = jDiscContext.filterBindings.resolveRequestFilter(uri).orElse(null);
+ if (requestFilterId == null)
return request;
ResponseHandler responseHandler = createResponseHandler(responseReturned, request, response);
- return filterInvoker.invokeRequestFilterChain(requestFilter, uri, request, responseHandler);
+ return filterInvoker.invokeRequestFilterChain(jDiscContext.filterBindings.getRequestFilter(requestFilterId), uri, request, responseHandler);
} catch (Exception e) {
throw new RuntimeException("Failed running request filter chain for uri " + uri, e);
}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
index 2f96cb76ae0..490b379bc98 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
@@ -10,7 +10,6 @@ import com.yahoo.jdisc.Metric;
import com.yahoo.jdisc.http.ConnectorConfig;
import com.yahoo.jdisc.http.ServerConfig;
import com.yahoo.jdisc.http.ServletPathsConfig;
-import com.yahoo.jdisc.http.server.FilterBindings;
import com.yahoo.jdisc.service.AbstractServerProvider;
import com.yahoo.jdisc.service.CurrentContainer;
import org.eclipse.jetty.http.HttpField;
@@ -94,8 +93,7 @@ public class JettyHttpServer extends AbstractServerProvider {
janitor = newJanitor();
- JDiscContext jDiscContext = new JDiscContext(filterBindings.getRequestFilters().activate(),
- filterBindings.getResponseFilters().activate(),
+ JDiscContext jDiscContext = new JDiscContext(filterBindings,
container,
janitor,
metric,
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/package-info.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/package-info.java
deleted file mode 100644
index f6afffbaff0..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-@ExportPackage
-package com.yahoo.jdisc.http.server;
-import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/FilterTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/FilterTestCase.java
index 0b94829f720..a978e42f7cb 100644
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/FilterTestCase.java
+++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/FilterTestCase.java
@@ -7,7 +7,6 @@ import com.yahoo.jdisc.AbstractResource;
import com.yahoo.jdisc.Request;
import com.yahoo.jdisc.ResourceReference;
import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.application.BindingRepository;
import com.yahoo.jdisc.handler.AbstractRequestHandler;
import com.yahoo.jdisc.handler.CompletionHandler;
import com.yahoo.jdisc.handler.ContentChannel;
@@ -24,7 +23,6 @@ import com.yahoo.jdisc.http.filter.ResponseHeaderFilter;
import com.yahoo.jdisc.http.filter.chain.RequestFilterChain;
import com.yahoo.jdisc.http.filter.chain.ResponseFilterChain;
import com.yahoo.jdisc.http.guiceModules.ConnectorFactoryRegistryModule;
-import com.yahoo.jdisc.http.server.FilterBindings;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -53,12 +51,12 @@ import static org.mockito.Mockito.when;
public class FilterTestCase {
@Test
public void requireThatRequestFilterIsNotRunOnUnboundPath() throws Exception {
- final RequestFilter filter = mock(RequestFilterMockBase.class);
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/filtered/*", filter);
- final BindingRepository<ResponseFilter> responseFilters = null;
+ RequestFilterMockBase filter = mock(RequestFilterMockBase.class);
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/filtered/*", filter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html");
@@ -71,11 +69,11 @@ public class FilterTestCase {
@Test
public void requireThatRequestFilterIsRunOnBoundPath() throws Exception {
final RequestFilter filter = mock(RequestFilterMockBase.class);
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/filtered/*", filter);
- final BindingRepository<ResponseFilter> responseFilters = null;
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/filtered/*", filter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/filtered/status.html");
@@ -88,11 +86,11 @@ public class FilterTestCase {
@Test
public void requireThatRequestFilterChangesAreSeenByRequestHandler() throws Exception {
final RequestFilter filter = new HeaderRequestFilter("foo", "bar");
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/*", filter);
- final BindingRepository<ResponseFilter> responseFilters = null;
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", filter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("status.html");
@@ -104,11 +102,11 @@ public class FilterTestCase {
@Test
public void requireThatRequestFilterCanRespond() throws Exception {
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/*", new RespondForbiddenFilter());
- final BindingRepository<ResponseFilter> responseFilters = null;
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", new RespondForbiddenFilter())
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html").expectStatusCode(is(Response.Status.FORBIDDEN));
@@ -121,11 +119,11 @@ public class FilterTestCase {
public void requireThatFilterCanHaveNullCompletionHandler() throws Exception {
final int responseStatus = Response.Status.OK;
final String responseMessage = "Excellent";
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/*", new NullCompletionHandlerFilter(responseStatus, responseMessage));
- final BindingRepository<ResponseFilter> responseFilters = null;
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", new NullCompletionHandlerFilter(responseStatus, responseMessage))
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html")
.expectStatusCode(is(responseStatus))
@@ -138,11 +136,11 @@ public class FilterTestCase {
@Test
public void requireThatRequestFilterExecutionIsExceptionSafe() throws Exception {
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- final BindingRepository<ResponseFilter> responseFilters = null;
- requestFilters.bind("http://*/*", new ThrowingRequestFilter());
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", new ThrowingRequestFilter())
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html").expectStatusCode(is(Response.Status.INTERNAL_SERVER_ERROR));
@@ -154,11 +152,11 @@ public class FilterTestCase {
@Test
public void requireThatResponseFilterIsNotRunOnUnboundPath() throws Exception {
final ResponseFilter filter = mock(ResponseFilterMockBase.class);
- final BindingRepository<RequestFilter> requestFilters = null;
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
- responseFilters.bind("http://*/filtered/*", filter);
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addResponseFilter("my-response-filter", "http://*/filtered/*", filter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html");
@@ -171,11 +169,11 @@ public class FilterTestCase {
@Test
public void requireThatResponseFilterIsRunOnBoundPath() throws Exception {
final ResponseFilter filter = mock(ResponseFilterMockBase.class);
- final BindingRepository<RequestFilter> requestFilters = null;
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
- responseFilters.bind("http://*/filtered/*", filter);
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addResponseFilter("my-response-filter", "http://*/filtered/*", filter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/filtered/status.html");
@@ -187,11 +185,11 @@ public class FilterTestCase {
@Test
public void requireThatResponseFilterChangesAreWrittenToResponse() throws Exception {
- final BindingRepository<RequestFilter> requestFilters = null;
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
- responseFilters.bind("http://*/*", new HeaderResponseFilter("foo", "bar"));
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addResponseFilter("my-response-filter", "http://*/*", new HeaderResponseFilter("foo", "bar"))
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html")
.expectHeader("foo", is("bar"));
@@ -203,11 +201,11 @@ public class FilterTestCase {
@Test
public void requireThatResponseFilterExecutionIsExceptionSafe() throws Exception {
- final BindingRepository<RequestFilter> requestFilters = null;
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
- responseFilters.bind("http://*/*", new ThrowingResponseFilter());
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addResponseFilter("my-response-filter", "http://*/*", new ThrowingResponseFilter())
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html").expectStatusCode(is(Response.Status.INTERNAL_SERVER_ERROR));
@@ -218,15 +216,15 @@ public class FilterTestCase {
@Test
public void requireThatRequestFilterAndResponseFilterCanBindToSamePath() throws Exception {
- final String uriPattern = "http://*/*";
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
final RequestFilter requestFilter = mock(RequestFilterMockBase.class);
- requestFilters.bind(uriPattern, requestFilter);
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
final ResponseFilter responseFilter = mock(ResponseFilterMockBase.class);
- responseFilters.bind(uriPattern, responseFilter);
+ final String uriPattern = "http://*/*";
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", uriPattern, requestFilter)
+ .addResponseFilter("my-response-filter", uriPattern, responseFilter)
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html");
@@ -239,12 +237,12 @@ public class FilterTestCase {
@Test
public void requireThatResponseFromRequestFilterGoesThroughResponseFilter() throws Exception {
- final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
- requestFilters.bind("http://*/*", new RespondForbiddenFilter());
- final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
- responseFilters.bind("http://*/*", new HeaderResponseFilter("foo", "bar"));
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", new RespondForbiddenFilter())
+ .addResponseFilter("my-response-filter", "http://*/*", new HeaderResponseFilter("foo", "bar"))
+ .build();
final MyRequestHandler requestHandler = new MyRequestHandler();
- final TestDriver testDriver = newDriver(requestHandler, requestFilters, responseFilters);
+ final TestDriver testDriver = newDriver(requestHandler, filterBindings);
testDriver.client().get("/status.html")
.expectStatusCode(is(Response.Status.FORBIDDEN))
@@ -384,26 +382,20 @@ public class FilterTestCase {
private static TestDriver newDriver(
final MyRequestHandler requestHandler,
- final BindingRepository<RequestFilter> requestFilters,
- final BindingRepository<ResponseFilter> responseFilters)
+ FilterBindings filterBindings)
throws IOException {
return TestDriver.newInstance(
JettyHttpServer.class,
requestHandler,
- newFilterModule(requestFilters, responseFilters));
+ newFilterModule(filterBindings));
}
- private static com.google.inject.Module newFilterModule(
- final BindingRepository<RequestFilter> requestFilters,
- final BindingRepository<ResponseFilter> responseFilters) {
+ private static com.google.inject.Module newFilterModule(FilterBindings filterBindings) {
return Modules.combine(
new AbstractModule() {
@Override
protected void configure() {
- bind(FilterBindings.class).toInstance(
- new FilterBindings(
- requestFilters != null ? requestFilters : EMPTY_REQUEST_FILTER_REPOSITORY,
- responseFilters != null ? responseFilters : EMPTY_RESPONSE_FILTER_REPOSITORY));
+ bind(FilterBindings.class).toInstance(filterBindings);
bind(ServerConfig.class).toInstance(new ServerConfig(new ServerConfig.Builder()));
bind(ConnectorConfig.class).toInstance(new ConnectorConfig(new ConnectorConfig.Builder()));
bind(ServletPathsConfig.class).toInstance(new ServletPathsConfig(new ServletPathsConfig.Builder()));
@@ -412,9 +404,6 @@ public class FilterTestCase {
new ConnectorFactoryRegistryModule());
}
- private static final BindingRepository<RequestFilter> EMPTY_REQUEST_FILTER_REPOSITORY = new BindingRepository<>();
- private static final BindingRepository<ResponseFilter> EMPTY_RESPONSE_FILTER_REPOSITORY = new BindingRepository<>();
-
private static abstract class RequestFilterMockBase extends AbstractResource implements RequestFilter {}
private static abstract class ResponseFilterMockBase extends AbstractResource implements ResponseFilter {}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/HttpServerConformanceTest.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/HttpServerConformanceTest.java
index a239dc1ae23..63307dab5ff 100644
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/HttpServerConformanceTest.java
+++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/HttpServerConformanceTest.java
@@ -4,11 +4,9 @@ package com.yahoo.jdisc.http.server.jetty;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.util.Modules;
-import com.yahoo.jdisc.application.BindingRepository;
import com.yahoo.jdisc.http.ServerConfig;
import com.yahoo.jdisc.http.ServletPathsConfig;
import com.yahoo.jdisc.http.guiceModules.ConnectorFactoryRegistryModule;
-import com.yahoo.jdisc.http.server.FilterBindings;
import com.yahoo.jdisc.test.ServerProviderConformanceTest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
@@ -770,9 +768,7 @@ public class HttpServerConformanceTest extends ServerProviderConformanceTest {
@Override
protected void configure() {
bind(FilterBindings.class)
- .toInstance(new FilterBindings(
- new BindingRepository<>(),
- new BindingRepository<>()));
+ .toInstance(new FilterBindings.Builder().build());
bind(ServerConfig.class)
.toInstance(new ServerConfig(new ServerConfig.Builder()));
bind(ServletPathsConfig.class)
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/TestDrivers.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/TestDrivers.java
index 255e42fb886..2ff19794ea3 100644
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/TestDrivers.java
+++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/TestDrivers.java
@@ -4,16 +4,12 @@ package com.yahoo.jdisc.http.server.jetty;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.util.Modules;
-import com.yahoo.jdisc.application.BindingRepository;
import com.yahoo.jdisc.handler.RequestHandler;
import com.yahoo.jdisc.http.ConnectorConfig;
import com.yahoo.jdisc.http.ServerConfig;
import com.yahoo.jdisc.http.ServletPathsConfig;
-import com.yahoo.jdisc.http.filter.RequestFilter;
-import com.yahoo.jdisc.http.filter.ResponseFilter;
import com.yahoo.jdisc.http.guiceModules.ConnectorFactoryRegistryModule;
import com.yahoo.jdisc.http.guiceModules.ServletModule;
-import com.yahoo.jdisc.http.server.FilterBindings;
import java.io.IOException;
import java.nio.file.Path;
@@ -83,10 +79,7 @@ public class TestDrivers {
bind(ServletPathsConfig.class).toInstance(new ServletPathsConfig(new ServletPathsConfig.Builder()));
bind(ServerConfig.class).toInstance(new ServerConfig(serverConfig));
bind(ConnectorConfig.class).toInstance(new ConnectorConfig(connectorConfigBuilder));
- bind(FilterBindings.class).toInstance(
- new FilterBindings(
- new BindingRepository<>(),
- new BindingRepository<>()));
+ bind(FilterBindings.class).toInstance(new FilterBindings.Builder().build());
}
},
new ConnectorFactoryRegistryModule(connectorConfigBuilder),
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/servlet/JDiscFilterForServletTest.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/servlet/JDiscFilterForServletTest.java
index 5ad76c6348f..272d6fbb66c 100644
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/servlet/JDiscFilterForServletTest.java
+++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/server/jetty/servlet/JDiscFilterForServletTest.java
@@ -7,13 +7,12 @@ import com.google.inject.util.Modules;
import com.yahoo.jdisc.AbstractResource;
import com.yahoo.jdisc.Request;
import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.application.BindingRepository;
import com.yahoo.jdisc.handler.ContentChannel;
import com.yahoo.jdisc.handler.ResponseHandler;
import com.yahoo.jdisc.http.HttpRequest;
import com.yahoo.jdisc.http.filter.RequestFilter;
import com.yahoo.jdisc.http.filter.ResponseFilter;
-import com.yahoo.jdisc.http.server.FilterBindings;
+import com.yahoo.jdisc.http.server.jetty.FilterBindings;
import com.yahoo.jdisc.http.server.jetty.FilterInvoker;
import com.yahoo.jdisc.http.server.jetty.SimpleHttpClient.ResponseValidator;
import com.yahoo.jdisc.http.server.jetty.TestDriver;
@@ -79,21 +78,27 @@ public class JDiscFilterForServletTest extends ServletTestBase {
}
private TestDriver requestFilterTestDriver() throws IOException {
- return TestDrivers.newInstance(dummyRequestHandler, bindings(requestFilters(), noBindings()));
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addRequestFilter("my-request-filter", "http://*/*", new TestRequestFilter())
+ .build();
+ return TestDrivers.newInstance(dummyRequestHandler, bindings(filterBindings));
}
private TestDriver responseFilterTestDriver() throws IOException {
- return TestDrivers.newInstance(dummyRequestHandler, bindings(noBindings(), responseFilters()));
+ FilterBindings filterBindings = new FilterBindings.Builder()
+ .addResponseFilter("my-response-filter", "http://*/*", new TestResponseFilter())
+ .build();
+ return TestDrivers.newInstance(dummyRequestHandler, bindings(filterBindings));
}
- private Module bindings(BindingRepository<RequestFilter> requestFilters,
- BindingRepository<ResponseFilter> responseFilters) {
+
+ private Module bindings(FilterBindings filterBindings) {
return Modules.combine(
new AbstractModule() {
@Override
protected void configure() {
- bind(FilterBindings.class).toInstance(new FilterBindings(requestFilters, responseFilters));
+ bind(FilterBindings.class).toInstance(filterBindings);
bind(FilterInvoker.class).toInstance(new FilterInvoker() {
@Override
public HttpServletRequest invokeRequestFilterChain(
@@ -122,23 +127,6 @@ public class JDiscFilterForServletTest extends ServletTestBase {
guiceModule());
}
- private BindingRepository<RequestFilter> requestFilters() {
- BindingRepository<RequestFilter> repository = new BindingRepository<>();
- repository.bind("http://*/*" , new TestRequestFilter());
- return repository;
- }
-
- private BindingRepository<ResponseFilter> responseFilters() {
- BindingRepository<ResponseFilter> repository = new BindingRepository<>();
- repository.bind("http://*/*" , new TestResponseFilter());
- return repository;
- }
-
- private <T> BindingRepository<T> noBindings() {
- return new BindingRepository<>();
- }
-
-
static class TestRequestFilter extends AbstractResource implements RequestFilter {
static final String simpleName = TestRequestFilter.class.getSimpleName();
static final String responseContent = "Rejected by " + simpleName;
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricSnapshot.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricSnapshot.java
index 7861cf4698d..6f6cd862c33 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricSnapshot.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricSnapshot.java
@@ -17,13 +17,15 @@ public class MetricSnapshot {
private final double memory;
private final double disk;
private final long generation;
+ private final boolean inService;
- public MetricSnapshot(Instant at, double cpu, double memory, double disk, long generation) {
+ public MetricSnapshot(Instant at, double cpu, double memory, double disk, long generation, boolean inService) {
this.at = at;
this.cpu = cpu;
this.memory = memory;
this.disk = disk;
this.generation = generation;
+ this.inService = inService;
}
public Instant at() { return at; }
@@ -31,6 +33,7 @@ public class MetricSnapshot {
public double memory() { return memory; }
public double disk() { return disk; }
public long generation() { return generation; }
+ public boolean inService() { return inService; }
@Override
public String toString() { return "metrics at " + at + ":" +
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
index 1b24788c2a9..4471d267416 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java
@@ -48,7 +48,8 @@ public class MetricsResponse {
Metric.cpu.from(values),
Metric.memory.from(values),
Metric.disk.from(values),
- (long)Metric.generation.from(values))));
+ (long)Metric.generation.from(values),
+ Metric.inService.from(values) > 0)));
}
private void consumeServiceMetrics(String hostname, Inspector node) {
@@ -85,6 +86,11 @@ public class MetricsResponse {
generation { // application config generation active on the node
public String metricResponseName() { return "application_generation"; }
double convertValue(double metricValue) { return (float)metricValue; } // Really a long
+ },
+ inService {
+ public String metricResponseName() { return "in_service"; }
+ double convertValue(double metricValue) { return (float)metricValue; } // Really a boolean
+ double defaultValue() { return 1.0; }
};
/** The name of this metric as emitted from its source */
@@ -93,8 +99,10 @@ public class MetricsResponse {
/** Convert from the emitted value of this metric to the value we want to use here */
abstract double convertValue(double metricValue);
+ double defaultValue() { return 0.0; }
+
public double from(Map<String, Double> values) {
- return convertValue(values.getOrDefault(metricResponseName(), 0.0));
+ return convertValue(values.getOrDefault(metricResponseName(), defaultValue()));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java
index 4597fc04e17..33bdc746678 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java
@@ -45,7 +45,7 @@ public class MetricsV2MetricsFetcher extends AbstractComponent implements Metric
this(nodeRepository, orchestrator, new ApacheHttpClient());
}
- MetricsV2MetricsFetcher(NodeRepository nodeRepository, Orchestrator orchestrator, HttpClient httpClient) {
+ public MetricsV2MetricsFetcher(NodeRepository nodeRepository, Orchestrator orchestrator, HttpClient httpClient) {
this.nodeRepository = nodeRepository;
this.orchestrator = orchestrator;
this.httpClient = httpClient;
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
index 163ee74e8f1..bf013810b2f 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
@@ -199,7 +199,8 @@ public class QuestMetricsDb implements MetricsDb {
record.getFloat(2),
record.getFloat(3),
record.getFloat(4),
- record.getLong(5)));
+ record.getLong(5),
+ true));
}
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java
index 5770564d23a..ff7bc9393bd 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java
@@ -1,15 +1,19 @@
// 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.collections.Pair;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.provision.NodeRepository;
+import com.yahoo.vespa.hosted.provision.autoscale.MetricSnapshot;
import com.yahoo.vespa.hosted.provision.autoscale.MetricsFetcher;
import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb;
import com.yahoo.yolean.Exceptions;
import java.time.Duration;
+import java.util.Collection;
import java.util.logging.Level;
+import java.util.stream.Collectors;
/**
* Maintainer which keeps the node metric db up to date by periodically fetching metrics from all
@@ -21,16 +25,16 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer {
private static final int maxWarningsPerInvocation = 2;
- private final MetricsFetcher nodeMetrics;
+ private final MetricsFetcher metricsFetcher;
private final MetricsDb metricsDb;
public NodeMetricsDbMaintainer(NodeRepository nodeRepository,
- MetricsFetcher nodeMetrics,
+ MetricsFetcher metricsFetcher,
MetricsDb metricsDb,
Duration interval,
Metric metric) {
super(nodeRepository, interval, metric);
- this.nodeMetrics = nodeMetrics;
+ this.metricsFetcher = metricsFetcher;
this.metricsDb = metricsDb;
}
@@ -39,7 +43,7 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer {
int warnings = 0;
for (ApplicationId application : activeNodesByApplication().keySet()) {
try {
- metricsDb.add(nodeMetrics.fetchMetrics(application));
+ metricsDb.add(filter(metricsFetcher.fetchMetrics(application)));
}
catch (Exception e) {
// TODO: Don't warn if this only happens occasionally
@@ -55,4 +59,11 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer {
return warnings == 0;
}
+ /** Filter out uninformative snapshots before storing */
+ private Collection<Pair<String, MetricSnapshot>> filter(Collection<Pair<String, MetricSnapshot>> snapshots) {
+ return snapshots.stream()
+ .filter(snapshot -> snapshot.getSecond().inService())
+ .collect(Collectors.toList());
+ }
+
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java
index 07889599c4c..214872348a3 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java
@@ -61,7 +61,7 @@ public class NodeRebooter extends NodeRepositoryMaintainer {
.max(Comparator.naturalOrder())
.map(lastReboot -> Duration.between(lastReboot, clock().instant()).minus(rebootInterval));
- if (overdue.isEmpty()) // should never happen as all !docker-container should have provisioned timestamp
+ if (overdue.isEmpty()) // should never happen as all hosts should have provisioned timestamp
return random.nextDouble() < interval().getSeconds() / (double) rebootInterval.getSeconds();
if (overdue.get().isNegative()) return false;
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
index 77fcde96c3c..4d8b6d13a86 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java
@@ -136,7 +136,8 @@ class AutoscalingTester {
cpu,
memory,
disk,
- 0))));
+ 0,
+ true))));
}
}
}
@@ -165,7 +166,8 @@ class AutoscalingTester {
cpu,
memory,
disk,
- 0))));
+ 0,
+ true))));
}
}
}
@@ -179,7 +181,8 @@ class AutoscalingTester {
cpu,
memory,
disk,
- generation))));
+ generation,
+ true))));
}
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcherTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcherTest.java
index dfa78b1fd13..dd991f15087 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcherTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcherTest.java
@@ -34,8 +34,8 @@ public class MetricsV2MetricsFetcherTest {
tester.makeReadyNodes(4, resources); // Creates (in order) host-1.yahoo.com, host-2.yahoo.com, host-3.yahoo.com, host-4.yahoo.com
tester.activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
- ApplicationId application2 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
+ ApplicationId application2 = ProvisioningTester.applicationId();
tester.deploy(application1, Capacity.from(new ClusterResources(2, 1, resources))); // host-1.yahoo.com, host-2.yahoo.com
tester.deploy(application2, Capacity.from(new ClusterResources(2, 1, resources))); // host-4.yahoo.com, host-3.yahoo.com
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDbTest.java
index bc5303e14b8..dba19d675dd 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDbTest.java
@@ -22,14 +22,14 @@ import static org.junit.Assert.assertEquals;
/**
* @author bratseth
*/
-public class MetricsFetcherDbTest {
+public class NodeMetricsDbTest {
@Test
public void testNodeMetricsDb() {
ProvisioningTester tester = new ProvisioningTester.Builder().build();
tester.makeReadyHosts(10, new NodeResources(10, 100, 1000, 10))
.activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
var hosts =
tester.activate(app1,
ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("7.0").build(),
@@ -40,7 +40,7 @@ public class MetricsFetcherDbTest {
MetricsDb db = MetricsDb.createTestInstance(tester.nodeRepository());
Collection<Pair<String, MetricSnapshot>> values = new ArrayList<>();
for (int i = 0; i < 40; i++) {
- values.add(new Pair<>(node0, new MetricSnapshot(clock.instant(), 0.9f, 0.6f, 0.6f, 0)));
+ values.add(new Pair<>(node0, new MetricSnapshot(clock.instant(), 0.9f, 0.6f, 0.6f, 0, true)));
clock.advance(Duration.ofMinutes(120));
}
db.add(values);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDbTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDbTest.java
index 6d52fb29160..b97d5136485 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDbTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDbTest.java
@@ -120,7 +120,8 @@ public class QuestMetricsDbTest {
i * 0.1,
i * 0.2,
i * 0.4,
- i % 100)));
+ i % 100,
+ true)));
clock.advance(sampleRate);
}
return timeseries;
@@ -134,7 +135,8 @@ public class QuestMetricsDbTest {
i * 0.1,
i * 0.2,
i * 0.4,
- i % 100)));
+ i % 100,
+ true)));
}
return timeseries;
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java
index 6e8b75a9af5..fadcd40ad0a 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java
@@ -14,7 +14,6 @@ import com.yahoo.config.provisioning.FlavorsConfig;
import com.yahoo.test.ManualClock;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
-import com.yahoo.vespa.hosted.provision.autoscale.MemoryMetricsDb;
import com.yahoo.vespa.hosted.provision.autoscale.MetricSnapshot;
import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb;
import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder;
@@ -62,7 +61,7 @@ public class AutoscalingMaintainerTester {
public AutoscalingMaintainer maintainer() { return maintainer; }
public MetricsDb nodeMetricsDb() { return metricsDb; }
- public static ApplicationId makeApplicationId(String name) { return ProvisioningTester.makeApplicationId(name); }
+ public static ApplicationId makeApplicationId(String name) { return ProvisioningTester.applicationId(name); }
public static ClusterSpec containerClusterSpec() { return ProvisioningTester.containerClusterSpec(); }
public List<Node> deploy(ApplicationId application, ClusterSpec cluster, Capacity capacity) {
@@ -77,7 +76,8 @@ public class AutoscalingMaintainerTester {
cpu,
mem,
disk,
- generation))));
+ generation,
+ true))));
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java
index 444844a758f..c08e51bf0cc 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java
@@ -182,7 +182,7 @@ public class DynamicProvisioningMaintainerTest {
tester.provisioningTester.activateTenantHosts();
// Allocating nodes to a host does not result in provisioning of additional capacity
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.provisioningTester.deploy(application,
Capacity.from(new ClusterResources(2, 1, new NodeResources(4, 8, 50, 0.1))));
assertEquals(2, tester.nodeRepository.list().owner(application).size());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
index de0e5d4223a..8bcf1552204 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
@@ -44,8 +44,8 @@ public class LoadBalancerExpirerTest {
// Deploy two applications with a total of three load balancers
ClusterSpec.Id cluster1 = ClusterSpec.Id.from("qrs");
ClusterSpec.Id cluster2 = ClusterSpec.Id.from("qrs2");
- ApplicationId app1 = ProvisioningTester.makeApplicationId();
- ApplicationId app2 = ProvisioningTester.makeApplicationId();
+ ApplicationId app1 = ProvisioningTester.applicationId();
+ ApplicationId app2 = ProvisioningTester.applicationId();
LoadBalancerId lb1 = new LoadBalancerId(app1, cluster1);
LoadBalancerId lb2 = new LoadBalancerId(app2, cluster1);
LoadBalancerId lb3 = new LoadBalancerId(app2, cluster2);
@@ -110,7 +110,7 @@ public class LoadBalancerExpirerTest {
// Prepare application
ClusterSpec.Id cluster = ClusterSpec.Id.from("qrs");
- ApplicationId app = ProvisioningTester.makeApplicationId();
+ ApplicationId app = ProvisioningTester.applicationId();
LoadBalancerId lb = new LoadBalancerId(app, cluster);
deployApplication(app, false, cluster);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainerTest.java
new file mode 100644
index 00000000000..722911569de
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainerTest.java
@@ -0,0 +1,120 @@
+// 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.config.provision.Capacity;
+import com.yahoo.config.provision.ClusterResources;
+import com.yahoo.config.provision.NodeResources;
+import com.yahoo.vespa.hosted.provision.autoscale.MetricSnapshot;
+import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb;
+import com.yahoo.vespa.hosted.provision.autoscale.MetricsV2MetricsFetcher;
+import com.yahoo.vespa.hosted.provision.autoscale.NodeTimeseries;
+import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester;
+import com.yahoo.vespa.hosted.provision.testutils.OrchestratorMock;
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author bratseth
+ */
+public class NodeMetricsDbMaintainerTest {
+
+ @Test
+ public void testNodeMetricsDbMaintainer() {
+ NodeResources resources = new NodeResources(1, 10, 100, 1);
+ ProvisioningTester tester = new ProvisioningTester.Builder().build();
+ tester.clock().setInstant(Instant.ofEpochMilli(1400));
+ tester.makeReadyNodes(2, resources);
+ tester.activateTenantHosts();
+ tester.deploy(ProvisioningTester.applicationId("test"),
+ Capacity.from(new ClusterResources(2, 1, resources)));
+ OrchestratorMock orchestrator = new OrchestratorMock();
+ MockHttpClient httpClient = new MockHttpClient();
+ MetricsV2MetricsFetcher fetcher = new MetricsV2MetricsFetcher(tester.nodeRepository(), orchestrator, httpClient);
+ MetricsDb db = MetricsDb.createTestInstance(tester.nodeRepository());
+ NodeMetricsDbMaintainer maintainer = new NodeMetricsDbMaintainer(tester.nodeRepository(),
+ fetcher,
+ db,
+ Duration.ofHours(1),
+ new TestMetric());
+ assertTrue(maintainer.maintain());
+ List<NodeTimeseries> timeseriesList = db.getNodeTimeseries(Instant.ofEpochMilli(0),
+ Set.of("host-1.yahoo.com", "host-2.yahoo.com"));
+ assertEquals(2, timeseriesList.size());
+ List<MetricSnapshot> allSnapshots = timeseriesList.stream()
+ .flatMap(timeseries -> timeseries.asList().stream())
+ .collect(Collectors.toList());
+ assertEquals("Snapshot from the node not in service is filtered out",
+ 1, allSnapshots.size());
+ assertEquals(0.14, allSnapshots.get(0).cpu(), 0.000001);
+ }
+
+ private static class MockHttpClient implements MetricsV2MetricsFetcher.HttpClient {
+
+ final String cannedResponse =
+ "{\n" +
+ " \"nodes\": [\n" +
+ " {\n" +
+ " \"hostname\": \"host-1.yahoo.com\",\n" +
+ " \"role\": \"role0\",\n" +
+ " \"node\": {\n" +
+ " \"timestamp\": 1300,\n" +
+ " \"metrics\": [\n" +
+ " {\n" +
+ " \"values\": {\n" +
+ " \"cpu.util\": 14,\n" + // this value asserted on above
+ " \"mem_total.util\": 15,\n" +
+ " \"disk.util\": 20,\n" +
+ " \"application_generation\": 3,\n" +
+ " \"in_service\": 1\n" +
+ " },\n" +
+ " \"dimensions\": {\n" +
+ " \"state\": \"active\"\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " },\n" +
+ " {\n" +
+ " \"hostname\": \"host-2.yahoo.com\",\n" +
+ " \"role\": \"role0\",\n" +
+ " \"node\": {\n" +
+ " \"timestamp\": 1300,\n" +
+ " \"metrics\": [\n" +
+ " {\n" +
+ " \"values\": {\n" +
+ " \"cpu.util\": 1,\n" +
+ " \"mem_total.util\": 2,\n" +
+ " \"disk.util\": 3,\n" +
+ " \"application_generation\": 3,\n" +
+ " \"in_service\": 0\n" +
+ " },\n" +
+ " \"dimensions\": {\n" +
+ " \"state\": \"active\"\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ "}\n";
+
+ @Override
+ public String get(String url) {
+ return cannedResponse;
+ }
+
+ @Override
+ public void close() { }
+
+ }
+
+
+}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java
index 0ee60f4c27f..36d088a59df 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooterTest.java
@@ -13,6 +13,7 @@ import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester;
import org.junit.Test;
import java.time.Duration;
+import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -26,10 +27,9 @@ public class NodeRebooterTest {
@Test
public void testRebootScheduling() {
- var rebootInterval = Duration.ofDays(30);
- var flagSource = new InMemoryFlagSource().withIntFlag(Flags.REBOOT_INTERVAL_IN_DAYS.id(), (int) rebootInterval.toDays());
- var tester = new ProvisioningTester.Builder().flagSource(flagSource).build();
- ((MockCurator) tester.getCurator()).setZooKeeperEnsembleConnectionSpec("zk1.host:1,zk2.host:2,zk3.host:3");
+ Duration rebootInterval = Duration.ofDays(30);
+ InMemoryFlagSource flagSource = new InMemoryFlagSource();
+ ProvisioningTester tester = createTester(rebootInterval, flagSource);
makeReadyHosts(15, tester);
NodeRepository nodeRepository = tester.nodeRepository();
@@ -70,12 +70,11 @@ public class NodeRebooterTest {
assertReadyHosts(15, nodeRepository, 2L);
}
- @Test
+ @Test(timeout = 30_000) // Avoid looping forever if assertions don't hold
public void testRebootScheduledEvenWithSmallProbability() {
Duration rebootInterval = Duration.ofDays(30);
- var flagSource = new InMemoryFlagSource().withIntFlag(Flags.REBOOT_INTERVAL_IN_DAYS.id(), (int) rebootInterval.toDays());
- var tester = new ProvisioningTester.Builder().flagSource(flagSource).build();
- ((MockCurator) tester.getCurator()).setZooKeeperEnsembleConnectionSpec("zk1.host:1,zk2.host:2,zk3.host:3");
+ InMemoryFlagSource flagSource = new InMemoryFlagSource();
+ ProvisioningTester tester = createTester(rebootInterval, flagSource);
makeReadyHosts(2, tester);
NodeRepository nodeRepository = tester.nodeRepository();
@@ -92,7 +91,7 @@ public class NodeRebooterTest {
// Advancing just a little bit into the 1x-2x interval, there is a >0 probability of
// rebooting a host. Run until all have been scheduled.
tester.clock().advance(Duration.ofMinutes(25));
- for (int i = 0;; ++i) {
+ while (true) {
rebooter.maintain();
simulateReboot(nodeRepository);
List<Node> nodes = nodeRepository.getNodes(NodeType.host, Node.State.ready);
@@ -136,10 +135,18 @@ public class NodeRebooterTest {
() -> {});
}
}
-
+
/** Returns the subset of the given nodes which have the given current reboot generation */
private List<Node> withCurrentRebootGeneration(long generation, List<Node> nodes) {
return nodes.stream().filter(n -> n.status().reboot().current() == generation).collect(Collectors.toList());
}
+ private static ProvisioningTester createTester(Duration rebootInterval, InMemoryFlagSource flagSource) {
+ flagSource = flagSource.withIntFlag(Flags.REBOOT_INTERVAL_IN_DAYS.id(), (int) rebootInterval.toDays());
+ ProvisioningTester tester = new ProvisioningTester.Builder().flagSource(flagSource).build();
+ tester.clock().setInstant(Instant.ofEpochMilli(1605522619000L)); // Use a fixed random seed
+ ((MockCurator) tester.getCurator()).setZooKeeperEnsembleConnectionSpec("zk1.host:1,zk2.host:2,zk3.host:3");
+ return tester;
+ }
+
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java
index 9c952cc605e..15966a4c44b 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java
@@ -38,10 +38,10 @@ public class ScalingSuggestionsMaintainerTest {
public void testScalingSuggestionsMaintainer() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east3"))).flavorsConfig(flavorsConfig()).build();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ProvisioningTester.containerClusterSpec();
- ApplicationId app2 = ProvisioningTester.makeApplicationId("app2");
+ ApplicationId app2 = ProvisioningTester.applicationId("app2");
ClusterSpec cluster2 = ProvisioningTester.contentClusterSpec();
MetricsDb metricsDb = MetricsDb.createTestInstance(tester.nodeRepository());
@@ -80,7 +80,8 @@ public class ScalingSuggestionsMaintainerTest {
cpu,
memory,
disk,
- generation))));
+ generation,
+ true))));
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
index 61274d04fe0..fd54a44c3df 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
@@ -38,14 +38,14 @@ public class AclProvisioningTest {
// Populate repo
tester.makeReadyNodes(10, new NodeResources(1, 4, 10, 1));
List<Node> dockerHost = tester.makeReadyNodes(1, new NodeResources(1, 4, 10, 1), NodeType.host);
- ApplicationId zoneApplication = ProvisioningTester.makeApplicationId();
+ ApplicationId zoneApplication = ProvisioningTester.applicationId();
tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.host));
tester.makeReadyVirtualDockerNodes(1,new NodeResources(1, 4, 10, 1),
dockerHost.get(0).hostname());
List<Node> proxyNodes = tester.makeReadyNodes(3, new NodeResources(1, 4, 10, 1), NodeType.proxy);
// Allocate 2 nodes
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
List<Node> activeNodes = tester.deploy(application, Capacity.from(new ClusterResources(2, 1, new NodeResources(1, 4, 10, 1)), false, true));
assertEquals(2, activeNodes.size());
@@ -110,7 +110,7 @@ public class AclProvisioningTest {
tester.makeReadyNodes(3, "default", NodeType.proxy);
// Deploy zone application
- ApplicationId zoneApplication = ProvisioningTester.makeApplicationId();
+ ApplicationId zoneApplication = ProvisioningTester.applicationId();
tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.proxy));
// Get trusted nodes for first proxy node
@@ -152,7 +152,7 @@ public class AclProvisioningTest {
tester.makeReadyNodes(3, "default", NodeType.controller);
// Allocate
- ApplicationId controllerApplication = ProvisioningTester.makeApplicationId();
+ ApplicationId controllerApplication = ProvisioningTester.applicationId();
List<Node> controllers = tester.deploy(controllerApplication, Capacity.fromRequiredNodeType(NodeType.controller));
// Controllers and hosts all trust each other
@@ -172,7 +172,7 @@ public class AclProvisioningTest {
}
// Deploy application
- var application = ProvisioningTester.makeApplicationId();
+ var application = ProvisioningTester.applicationId();
List<Node> activeNodes = deploy(application, 2);
assertEquals(2, activeNodes.size());
@@ -207,7 +207,7 @@ public class AclProvisioningTest {
}
private List<Node> deploy(int nodeCount) {
- return deploy(ProvisioningTester.makeApplicationId(), nodeCount);
+ return deploy(ProvisioningTester.applicationId(), nodeCount);
}
private List<Node> deploy(ApplicationId application, int nodeCount) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImagesTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImagesTest.java
index 94b670f8e5e..d02244b7e11 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImagesTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImagesTest.java
@@ -58,7 +58,8 @@ public class ContainerImagesTest {
var hosts = tester.makeReadyNodes(2, "default", NodeType.host);
tester.activateTenantHosts();
- // Default image is used initially
+ // Default image is used with flag disabled
+ flagSource.withBooleanFlag(Flags.REGIONAL_CONTAINER_REGISTRY.id(), false);
for (var host : hosts) {
assertEquals(defaultImage, tester.nodeRepository().containerImages().imageFor(host.type()));
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningCompleteHostCalculatorTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningCompleteHostCalculatorTest.java
index 2e5aa949953..e5fd00005a4 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningCompleteHostCalculatorTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningCompleteHostCalculatorTest.java
@@ -33,7 +33,7 @@ public class DockerProvisioningCompleteHostCalculatorTest {
.build();
tester.makeReadyHosts(9, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
var initialResources = new NodeResources(2, 16, 50, 1);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
index 1dcc70b0add..e046bc0a512 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
@@ -46,7 +46,7 @@ public class DockerProvisioningTest {
public void docker_application_deployment() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(10, dockerResources).activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
Version wantedVespaVersion = Version.fromString("6.39");
int nodeCount = 7;
@@ -75,12 +75,12 @@ public class DockerProvisioningTest {
public void refuses_to_activate_on_non_active_host() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId zoneApplication = ProvisioningTester.makeApplicationId();
+ ApplicationId zoneApplication = ProvisioningTester.applicationId();
List<Node> parents = tester.makeReadyNodes(10, new NodeResources(2, 4, 20, 2), NodeType.host, 1);
for (Node parent : parents)
tester.makeReadyVirtualDockerNodes(1, dockerResources, parent.hostname());
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
Version wantedVespaVersion = Version.fromString("6.39");
int nodeCount = 7;
try {
@@ -152,12 +152,12 @@ public class DockerProvisioningTest {
NodeResources nodeResources = new NodeResources(1, 4, 100, 1);
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, hostResources).activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
prepareAndActivate(application1, 2, true, nodeResources, tester);
assertEquals(Set.of("host-1.yahoo.com", "host-2.yahoo.com"),
hostsOf(tester.getNodes(application1, Node.State.active)));
- ApplicationId application2 = ProvisioningTester.makeApplicationId("app2");
+ ApplicationId application2 = ProvisioningTester.applicationId("app2");
prepareAndActivate(application2, 2, false, nodeResources, tester);
assertEquals("Application is assigned to separate hosts",
Set.of("host-3.yahoo.com", "host-4.yahoo.com"),
@@ -171,12 +171,12 @@ public class DockerProvisioningTest {
NodeResources nodeResources = new NodeResources(1, 4, 100, 1);
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, hostResources).activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
prepareAndActivate(application1, 2, false, nodeResources, tester);
assertEquals(Set.of("host-1.yahoo.com", "host-2.yahoo.com"),
hostsOf(tester.getNodes(application1, Node.State.active)));
- ApplicationId application2 = ProvisioningTester.makeApplicationId("app2");
+ ApplicationId application2 = ProvisioningTester.applicationId("app2");
prepareAndActivate(application2, 2, true, nodeResources, tester);
assertEquals("Application is assigned to separate hosts",
Set.of("host-3.yahoo.com", "host-4.yahoo.com"),
@@ -201,7 +201,7 @@ public class DockerProvisioningTest {
tester.makeReadyVirtualDockerNode(i, dockerResources, "host4");
*/
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
prepareAndActivate(application1, 2, false, nodeResources, tester);
for (Node node : tester.getNodes(application1, Node.State.active))
assertFalse(node.allocation().get().membership().cluster().isExclusive());
@@ -255,7 +255,7 @@ public class DockerProvisioningTest {
try {
ProvisioningTester tester = new ProvisioningTester.Builder()
.zone(new Zone(Environment.prod, RegionName.from("us-east-1"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
tester.makeReadyVirtualDockerNodes(1, dockerResources, "dockerHost1");
tester.makeReadyVirtualDockerNodes(1, dockerResources, "dockerHost2");
@@ -282,7 +282,7 @@ public class DockerProvisioningTest {
.build();
tester.makeReadyHosts(2, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
var resources = new NodeResources(1, 8, 10, 1);
@@ -302,7 +302,7 @@ public class DockerProvisioningTest {
.build();
tester.makeReadyHosts(9, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
var initialResources = new NodeResources(2, 16, 50, 1);
@@ -337,7 +337,7 @@ public class DockerProvisioningTest {
.build();
tester.makeReadyHosts(2, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// 5 Gb requested memory becomes 5-3=2 Gb real memory, which is an illegally small amount
@@ -359,7 +359,7 @@ public class DockerProvisioningTest {
.build();
tester.makeReadyHosts(5, r).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.container, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
tester.activate(app1, cluster1, Capacity.from(new ClusterResources(5, 1, r)));
@@ -392,7 +392,7 @@ public class DockerProvisioningTest {
.build();
tester.makeReadyHosts(4, r).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(clusterType, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
tester.activate(app1, cluster1, Capacity.from(new ClusterResources(4, 1, r)));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
index 8edc836a090..3c6e39702e4 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
@@ -229,7 +229,7 @@ public class DynamicDockerAllocationTest {
tester.activateTenantHosts();
//Deploy an application having 6 nodes (3 nodes in 2 groups). We only have 5 docker hosts available
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.prepare(application1, clusterSpec("myContent.t1.a1"), 6, 2, new NodeResources(1, 4, 100, 1));
fail("Two groups have been allocated to the same parent host");
@@ -245,7 +245,7 @@ public class DynamicDockerAllocationTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
// Setup test
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyNodes(5, "host-small", NodeType.host, 32);
tester.activateTenantHosts();
NodeResources flavor = new NodeResources(1, 4, 100, 1);
@@ -277,7 +277,7 @@ public class DynamicDockerAllocationTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
tester.makeReadyNodes(3, "host-small", NodeType.host, 32);
tester.activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
List<HostSpec> hosts = tester.prepare(application1, clusterSpec("myContent.t1.a1"), 3, 1, new NodeResources(1, 4, 100, 1));
tester.activate(application1, ImmutableSet.copyOf(hosts));
@@ -290,7 +290,7 @@ public class DynamicDockerAllocationTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.test, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
tester.makeReadyNodes(4, new Flavor(new NodeResources(1, 8, 120, 1, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
List<HostSpec> hosts = tester.prepare(application1, clusterSpec("myContent.t1.a1"), 3, 1, new NodeResources(1, 4, 100, 1));
tester.activate(application1, ImmutableSet.copyOf(hosts));
}
@@ -301,7 +301,7 @@ public class DynamicDockerAllocationTest {
tester.makeProvisionedNodes(3, "host-small", NodeType.host, 32).forEach(node ->
tester.nodeRepository().fail(node.hostname(), Agent.system, getClass().getSimpleName()));
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.prepare(application, clusterSpec("myContent.t2.a2"), 2, 1, new NodeResources(1, 40, 100, 1));
}
@@ -311,7 +311,7 @@ public class DynamicDockerAllocationTest {
tester.makeReadyNodes(2, "host-large", NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
List<HostSpec> hosts = tester.prepare(application, clusterSpec("myContent.t1.a1"), 2, 1, new NodeResources(1, 4, 100, 1));
tester.activate(application, hosts);
@@ -342,7 +342,7 @@ public class DynamicDockerAllocationTest {
tester.makeReadyNodes(2, new Flavor(new NodeResources(1, 8, 120, 1, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("1").build();
NodeResources resources = new NodeResources(1, 4, 100, 1, NodeResources.DiskSpeed.any);
@@ -359,7 +359,7 @@ public class DynamicDockerAllocationTest {
tester.makeReadyNodes(2, new Flavor(new NodeResources(1, 8, 120, 1, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("1").build();
NodeResources resources = new NodeResources(1, 4, 100, 1, requestDiskSpeed);
@@ -381,7 +381,7 @@ public class DynamicDockerAllocationTest {
tester.makeReadyNodes(2, new Flavor(new NodeResources(1, 8, 120, 1, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("1").build();
NodeResources resources = new NodeResources(1, 4, 100, 1, NodeResources.DiskSpeed.fast);
@@ -399,7 +399,7 @@ public class DynamicDockerAllocationTest {
tester.makeReadyNodes(2, new Flavor(new NodeResources(5, 20, 1400, 3)), NodeType.host, 10, true);
tester.activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("1").build();
List<HostSpec> hosts1 = tester.prepare(application, cluster, Capacity.from(new ClusterResources(2, 1, NodeResources.fromLegacyName("d-2-8-500")), false, true));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java
index 40d0f52dc37..4917a59879f 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java
@@ -67,7 +67,7 @@ public class DynamicDockerProvisionTest {
public void dynamically_provision_with_empty_node_repo() {
assertEquals(0, tester.nodeRepository().list().size());
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
NodeResources resources = new NodeResources(1, 4, 10, 1);
mockHostProvisioner(hostProvisioner, "large", 3, null); // Provision shared hosts
@@ -83,7 +83,7 @@ public class DynamicDockerProvisionTest {
.map(Node::hostname).sorted().collect(Collectors.toList()));
// Deploy new application
- ApplicationId application2 = ProvisioningTester.makeApplicationId();
+ ApplicationId application2 = ProvisioningTester.applicationId();
prepareAndActivate(application2, clusterSpec("mycluster"), 4, 1, resources);
// Total of 12 nodes should now be in node-repo, 4 active hosts and 8 active nodes
@@ -95,7 +95,7 @@ public class DynamicDockerProvisionTest {
.map(Node::hostname).sorted().collect(Collectors.toList()));
// Deploy new exclusive application
- ApplicationId application3 = ProvisioningTester.makeApplicationId();
+ ApplicationId application3 = ProvisioningTester.applicationId();
mockHostProvisioner(hostProvisioner, "large", 3, application3);
prepareAndActivate(application3, clusterSpec("mycluster", true), 4, 1, resources);
verify(hostProvisioner).provisionHosts(List.of(104, 105, 106, 107), resources, application3,
@@ -114,11 +114,11 @@ public class DynamicDockerProvisionTest {
NodeResources initialResources = new NodeResources(2, 8, 10, 1);
NodeResources smallResources = new NodeResources(1, 4, 10, 1);
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
mockHostProvisioner(hostProvisioner, "large", 3, null); // Provision shared hosts
prepareAndActivate(application1, clusterSpec("mycluster"), 4, 1, initialResources);
- ApplicationId application2 = ProvisioningTester.makeApplicationId();
+ ApplicationId application2 = ProvisioningTester.applicationId();
mockHostProvisioner(hostProvisioner, "large", 3, application2); // Provision exclusive hosts
prepareAndActivate(application2, clusterSpec("mycluster", true), 4, 1, initialResources);
@@ -144,24 +144,24 @@ public class DynamicDockerProvisionTest {
NodeResources resources = new NodeResources(1, 4, 10, 4);
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
prepareAndActivate(application1, clusterSpec("mycluster"), 4, 1, resources);
- ApplicationId application2 = ProvisioningTester.makeApplicationId();
+ ApplicationId application2 = ProvisioningTester.applicationId();
prepareAndActivate(application2, clusterSpec("mycluster"), 3, 1, resources);
- ApplicationId application3 = ProvisioningTester.makeApplicationId();
+ ApplicationId application3 = ProvisioningTester.applicationId();
prepareAndActivate(application3, clusterSpec("mycluster"), 3, 1, resources);
assertEquals(4, tester.nodeRepository().getNodes(NodeType.tenant).stream().map(Node::parentHostname).distinct().count());
- ApplicationId application4 = ProvisioningTester.makeApplicationId();
+ ApplicationId application4 = ProvisioningTester.applicationId();
prepareAndActivate(application4, clusterSpec("mycluster"), 3, 1, resources);
assertEquals(5, tester.nodeRepository().getNodes(NodeType.tenant).stream().map(Node::parentHostname).distinct().count());
}
@Test
public void retires_on_exclusivity_violation() {
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
NodeResources resources = new NodeResources(1, 4, 10, 1);
mockHostProvisioner(hostProvisioner, "large", 3, null); // Provision shared hosts
@@ -184,7 +184,7 @@ public class DynamicDockerProvisionTest {
@Test
public void node_indices_are_unique_even_when_a_node_is_left_in_reserved_state() {
NodeResources resources = new NodeResources(10, 10, 10, 10);
- ApplicationId app = ProvisioningTester.makeApplicationId();
+ ApplicationId app = ProvisioningTester.applicationId();
Function<Node, Node> retireNode = node -> tester.patchNode(node, (n) -> n.withWantToRetire(true, Agent.system, Instant.now()));
Function<Integer, Node> getNodeInGroup = group -> tester.nodeRepository().getNodes(app).stream()
@@ -229,7 +229,7 @@ public class DynamicDockerProvisionTest {
tester.activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Deploy using real memory amount (17)
@@ -275,7 +275,7 @@ public class DynamicDockerProvisionTest {
tester.activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Limits where each number is within flavor limits but but which don't contain any flavor leads to an error
@@ -350,7 +350,7 @@ public class DynamicDockerProvisionTest {
tester.activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
tester.activate(app1, cluster1, Capacity.from(resources(4, 2, 2, 10, 200, fast, local),
@@ -385,7 +385,7 @@ public class DynamicDockerProvisionTest {
tester.activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
tester.activate(app1, cluster1, Capacity.from(resources(4, 2, 2, 10, 200, fast, StorageType.any),
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java
index 67a364ea504..230195a92bd 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java
@@ -61,8 +61,8 @@ public class InPlaceResizeProvisionTest {
private final ProvisioningTester tester = new ProvisioningTester.Builder()
.flagSource(flagSource)
.zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- private final ApplicationId infraApp = ProvisioningTester.makeApplicationId();
- private final ApplicationId app = ProvisioningTester.makeApplicationId();
+ private final ApplicationId infraApp = ProvisioningTester.applicationId();
+ private final ApplicationId app = ProvisioningTester.applicationId();
@Test
public void single_group_same_cluster_size_resource_increase() {
@@ -129,7 +129,7 @@ public class InPlaceResizeProvisionTest {
addParentHosts(4, new NodeResources(8, 16, 320, 8, fast, local));
// Allocate 2 nodes for one app that leaves exactly enough capacity for mediumResources left on the host
- new PrepareHelper(tester, ProvisioningTester.makeApplicationId()).prepare(container1, 2, 1, mediumResources).activate();
+ new PrepareHelper(tester, ProvisioningTester.applicationId()).prepare(container1, 2, 1, mediumResources).activate();
// Allocate 4 nodes for another app. After this, 2 hosts should be completely full
new PrepareHelper(tester, app).prepare(container1, 4, 1, mediumResources).activate();
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 9e2b453bf78..ccc4a155d56 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
@@ -42,7 +42,7 @@ public class MultigroupProvisioningTest {
public void test_provisioning_of_multiple_groups() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
tester.makeReadyNodes(31, small);
@@ -75,7 +75,7 @@ public class MultigroupProvisioningTest {
public void test_provisioning_of_groups_with_asymmetry() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyNodes(21, large);
@@ -88,7 +88,7 @@ public class MultigroupProvisioningTest {
public void test_provisioning_of_multiple_groups_after_flavor_migration() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
tester.makeReadyNodes(10, small);
tester.makeReadyNodes(16, large);
@@ -102,7 +102,7 @@ public class MultigroupProvisioningTest {
public void test_one_node_and_group_to_two() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyNodes(10, small);
@@ -114,7 +114,7 @@ public class MultigroupProvisioningTest {
public void test_one_node_and_group_to_two_with_resource_change() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyNodes(10, small);
tester.makeReadyNodes(10, large);
@@ -136,7 +136,7 @@ public class MultigroupProvisioningTest {
.build();
tester.makeReadyHosts(6, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Deploy with 1 group
@@ -162,7 +162,7 @@ public class MultigroupProvisioningTest {
.build();
tester.makeReadyHosts(6, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Deploy with 3 groups
@@ -192,7 +192,7 @@ public class MultigroupProvisioningTest {
.build();
tester.makeReadyHosts(12, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Deploy with 3 groups
@@ -220,7 +220,7 @@ public class MultigroupProvisioningTest {
public void test_provisioning_of_multiple_groups_after_flavor_migration_and_exiration() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId application1 = ProvisioningTester.applicationId("app1");
tester.makeReadyNodes(10, small);
tester.makeReadyNodes(16, large);
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 7b964b4c7f3..acf7bda3cbf 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
@@ -33,7 +33,7 @@ public class NodeTypeProvisioningTest {
private final ProvisioningTester tester = new ProvisioningTester.Builder().build();
- private final ApplicationId application = ProvisioningTester.makeApplicationId(); // application using proxy nodes
+ private final ApplicationId application = ProvisioningTester.applicationId(); // application using proxy nodes
private final Capacity capacity = Capacity.fromRequiredNodeType(NodeType.proxy);
private final ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.42").build();
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
index 020849e66d8..82b20bcae14 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
@@ -64,8 +64,8 @@ public class ProvisioningTest {
public void application_deployment_constant_application_size() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
- ApplicationId application2 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
+ ApplicationId application2 = ProvisioningTester.applicationId();
tester.makeReadyHosts(21, defaultResources).activateTenantHosts();
@@ -144,10 +144,10 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
// deploy
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
SystemState state1 = prepare(application1, 1, 1, 1, 1, defaultResources, tester);
tester.activate(application1, state1.allHosts);
@@ -169,10 +169,10 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
// deploy
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
SystemState state1 = prepare(application1, tester, 1, 1, 1, 1, defaultResources, "1.2.3");
String dockerImageRepo = "docker.domain.tld/my/image";
prepare(application1, tester, 1, 1, 1 , 1 , false, defaultResources, "1.2.3", Optional.of(dockerImageRepo));
@@ -196,7 +196,7 @@ public class ProvisioningTest {
public void application_deployment_variable_application_size() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyHosts(24, defaultResources);
tester.activateTenantHosts();
@@ -265,7 +265,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyHosts(12, small);
tester.activateTenantHosts();
@@ -300,7 +300,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyHosts(12, small);
tester.makeReadyHosts(12, large);
@@ -318,7 +318,7 @@ public class ProvisioningTest {
public void application_deployment_above_then_at_capacity_limit() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyHosts(5, defaultResources).activateTenantHosts();
@@ -344,9 +344,9 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
SystemState state = prepare(application, 2, 2, 3, 3, defaultResources, tester);
assertEquals(4, state.allHosts.size());
tester.activate(application, state.allHosts);
@@ -357,8 +357,8 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(13, defaultResources).activateTenantHosts();
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
+ ApplicationId application = ProvisioningTester.applicationId();
{
// Deploy with disk-speed any and make sure that information is retained
@@ -400,9 +400,9 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources).activateTenantHosts();
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
SystemState state = prepare(application, tester, 2, 2, 3, 3, defaultResources, "6.91");
assertEquals(4, state.allHosts.size());
tester.activate(application, state.allHosts);
@@ -413,9 +413,9 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources).activateTenantHosts();
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
String dockerImageRepo = "docker.domain.tld/my/image";
SystemState state = prepare(application, tester, 2, 2, 3, 3, false, defaultResources, "6.91", Optional.of(dockerImageRepo));
assertEquals(4, state.allHosts.size());
@@ -426,7 +426,7 @@ public class ProvisioningTest {
public void test_deployment_size() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.test, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(4, defaultResources).activateTenantHosts();
SystemState state = prepare(application, 2, 2, 3, 3, defaultResources, tester);
@@ -442,7 +442,7 @@ public class ProvisioningTest {
.build();
tester.makeReadyHosts(4, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
tester.activate(app1, cluster1, Capacity.from(new ClusterResources(2, 1, NodeResources.unspecified()),
@@ -460,7 +460,7 @@ public class ProvisioningTest {
.build();
tester.makeReadyHosts(31, hostFlavor.resources()).activateTenantHosts();
- ApplicationId app1 = ProvisioningTester.makeApplicationId("app1");
+ ApplicationId app1 = ProvisioningTester.applicationId("app1");
ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.content, new ClusterSpec.Id("cluster1")).vespaVersion("7").build();
// Initial deployment
@@ -517,7 +517,7 @@ public class ProvisioningTest {
public void prod_deployment_requires_redundancy() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
prepare(application, 1, 2, 3, 3, defaultResources, tester);
}
@@ -526,7 +526,7 @@ public class ProvisioningTest {
public void below_memory_resource_limit() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
try {
prepare(application, 2, 2, 3, 3,
@@ -541,7 +541,7 @@ public class ProvisioningTest {
public void below_vcpu_resource_limit() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
try {
prepare(application, 2, 2, 3, 3,
@@ -558,9 +558,9 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, new NodeResources(2, 4, 10, 2));
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
SystemState state = prepare(application, 2, 2, 3, 3,
new NodeResources(2, 4, 10, 2), tester);
assertEquals(4, state.allHosts.size());
@@ -574,7 +574,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.test, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(4, large).activateTenantHosts();
SystemState state = prepare(application, 2, 2, 3, 3, large, tester);
assertEquals(4, state.allHosts.size());
@@ -585,7 +585,7 @@ public class ProvisioningTest {
public void staging_deployment_size() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.staging, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(14, defaultResources).activateTenantHosts();
SystemState state = prepare(application, 1, 1, 1, 64, defaultResources, tester); // becomes 1, 1, 1, 1, 6
assertEquals(9, state.allHosts.size());
@@ -597,7 +597,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
SystemState state = prepare(application, 2, 2, 3, 3, defaultResources, tester);
// Simulate expiry
@@ -617,7 +617,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(9, defaultResources).activateTenantHosts(); // need 2+2+3+3=10
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
try {
prepare(application, 2, 2, 3, 3, defaultResources, tester);
fail("Expected exception");
@@ -634,7 +634,7 @@ public class ProvisioningTest {
RegionName.from("us-east"))).build();
tester.makeReadyHosts(13, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
try {
prepare(application, 2, 2, 6, 3, defaultResources, tester);
fail("Expected exception");
@@ -652,7 +652,7 @@ public class ProvisioningTest {
RegionName.from("us-east"))).build();
tester.makeReadyHosts(13, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
prepare(application, 2, 2, 6, 3, defaultResources, tester);
}
@@ -660,7 +660,7 @@ public class ProvisioningTest {
public void out_of_capacity_but_cannot_fail() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(4, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("4.5.6").build();
tester.prepare(application, cluster, Capacity.from(new ClusterResources(5, 1, NodeResources.unspecified()), false, false));
// No exception; Success
@@ -670,7 +670,7 @@ public class ProvisioningTest {
public void out_of_capacity_all_nodes_want_to_retire() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
// Flag all nodes for retirement
List<Node> readyNodes = tester.makeReadyNodes(5, defaultResources);
tester.patchNodes(readyNodes, (node) -> node.withWantToRetire(true, Agent.system, tester.clock().instant()));
@@ -690,7 +690,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
// Create 10 nodes
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
@@ -723,7 +723,7 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
Capacity capacityCanFail = Capacity.from(new ClusterResources(5, 1, defaultResources), false, true);
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("4.5.6").build();
@@ -745,7 +745,7 @@ public class ProvisioningTest {
public void highest_node_indexes_are_retired_first() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application1 = ProvisioningTester.makeApplicationId();
+ ApplicationId application1 = ProvisioningTester.applicationId();
tester.makeReadyHosts(14, defaultResources).activateTenantHosts();
@@ -776,7 +776,7 @@ public class ProvisioningTest {
.spareCount(1).build();
tester.makeReadyHosts(7, defaultResources).activateTenantHosts();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
ClusterSpec spec = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("content1")).vespaVersion("7.1.2").build();
tester.deploy(application, spec, Capacity.from(new ClusterResources(6, 1, defaultResources)));
@@ -796,7 +796,7 @@ public class ProvisioningTest {
public void application_deployment_retires_nodes_that_want_to_retire() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(10, defaultResources).activateTenantHosts();
// Deploy application
@@ -824,7 +824,7 @@ public class ProvisioningTest {
public void application_deployment_extends_existing_reservations_on_deploy() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
tester.makeReadyHosts(2, defaultResources).activateTenantHosts();
// Deploy fails with out of capacity
@@ -864,7 +864,7 @@ public class ProvisioningTest {
@Test
public void required_capacity_respects_prod_redundancy_requirement() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
try {
prepare(application, tester, 1, 0, 1, 0, true, defaultResources, "6.42", Optional.empty());
fail("Expected exception");
@@ -876,9 +876,9 @@ public class ProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.dev, Environment.dev, RegionName.from("no-central"))).build();
tester.makeReadyNodes(4, defaultResources, NodeType.devhost, 1);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.devhost);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.devhost);
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
SystemState state = prepare(application, 2, 2, 3, 3, defaultResources, tester);
assertEquals(4, state.allHosts.size());
tester.activate(application, state.allHosts);
@@ -918,7 +918,7 @@ public class ProvisioningTest {
@Test
public void cluster_spec_update_for_already_reserved_nodes() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
- ApplicationId application = ProvisioningTester.makeApplicationId();
+ ApplicationId application = ProvisioningTester.applicationId();
String version1 = "6.42";
String version2 = "6.43";
tester.makeReadyNodes(2, defaultResources);
@@ -935,7 +935,7 @@ public class ProvisioningTest {
@Test
public void change_to_and_from_combined_cluster_does_not_change_node_allocation() {
var tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- var application = ProvisioningTester.makeApplicationId();
+ var application = ProvisioningTester.applicationId();
tester.makeReadyHosts(4, defaultResources).activateTenantHosts();
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
index 0a24eb82c50..d39ea3786f1 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
@@ -342,14 +342,14 @@ public class ProvisioningTester {
return removed;
}
- public static ApplicationId makeApplicationId() {
+ public static ApplicationId applicationId() {
return ApplicationId.from(
TenantName.from(UUID.randomUUID().toString()),
ApplicationName.from(UUID.randomUUID().toString()),
InstanceName.from(UUID.randomUUID().toString()));
}
- public static ApplicationId makeApplicationId(String applicationName) {
+ public static ApplicationId applicationId(String applicationName) {
return ApplicationId.from("tenant", applicationName, "default");
}
@@ -527,7 +527,7 @@ public class ProvisioningTester {
}
public void activateTenantHosts() {
- ApplicationId applicationId = makeApplicationId();
+ ApplicationId applicationId = applicationId();
List<HostSpec> list = prepare(applicationId,
ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(),
Capacity.fromRequiredNodeType(NodeType.host));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java
index d1446cd8bc1..b80e267efc6 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java
@@ -39,7 +39,7 @@ public class VirtualNodeProvisioningTest {
private static final ClusterSpec containerClusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("myContainer")).vespaVersion("6.42").build();
private ProvisioningTester tester = new ProvisioningTester.Builder().build();
- private ApplicationId applicationId = ProvisioningTester.makeApplicationId("test");
+ private ApplicationId applicationId = ProvisioningTester.applicationId("test");
@Test
public void distinct_parent_host_for_each_node_in_a_cluster() {
@@ -81,7 +81,7 @@ public class VirtualNodeProvisioningTest {
NodeResources flavor = new NodeResources(1, 4, 10, 1);
tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build();
tester.makeReadyNodes(4, flavor, NodeType.host, 1);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
List<HostSpec> containerHosts = prepare(containerClusterSpec, containerNodeCount, groups, flavor);
List<HostSpec> contentHosts = prepare(contentClusterSpec, contentNodeCount, groups, flavor);
@@ -95,7 +95,7 @@ public class VirtualNodeProvisioningTest {
{
tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))).build();
tester.makeReadyNodes(4, resources, NodeType.host, 1);
- tester.prepareAndActivateInfraApplication(ProvisioningTester.makeApplicationId(), NodeType.host);
+ tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host);
List<HostSpec> containerHosts = prepare(containerClusterSpec, containerNodeCount, groups);
List<HostSpec> contentHosts = prepare(contentClusterSpec, contentNodeCount, groups);