diff options
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); |