summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2023-02-22 19:34:37 +0100
committerGitHub <noreply@github.com>2023-02-22 19:34:37 +0100
commit08f219c4ff4eb717b4af0ec1612a8a34b347264c (patch)
tree5bc5755c2c21eca5cc185a460908b63a81546208 /configserver
parent88b6383b71458ebf9c2de5d34ee5c0e1784afb95 (diff)
Revert "Hmusum/configserver cleanup 1"
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java19
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java15
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java67
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/provision/HostProvisionerProvider.java5
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizer.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java59
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/MockProvisioner.java47
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/host/HostRegistryTest.java18
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpGetConfigHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpListConfigsHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java14
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpGetConfigHandlerTest.java6
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpListConfigsHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java5
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java5
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java3
28 files changed, 239 insertions, 72 deletions
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 8a4d523a6e4..9865cda7bc9 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
@@ -4,8 +4,8 @@ package com.yahoo.vespa.config.server;
import ai.vespa.http.DomainName;
import ai.vespa.http.HttpURL;
import ai.vespa.http.HttpURL.Query;
-import ai.vespa.util.http.hc5.DefaultHttpClientBuilder;
import ai.vespa.util.http.hc5.VespaHttpClientBuilder;
+import ai.vespa.util.http.hc5.DefaultHttpClientBuilder;
import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.component.Version;
import com.yahoo.component.annotation.Inject;
@@ -94,8 +94,10 @@ import com.yahoo.vespa.flags.InMemoryFlagSource;
import com.yahoo.vespa.orchestrator.Orchestrator;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.core5.http.HttpHeaders;
import org.apache.hc.core5.http.message.BasicHeader;
+
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -227,6 +229,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
// Should be used by tests only (first constructor in this class makes sure we use injectable components where possible)
public static class Builder {
private TenantRepository tenantRepository;
+ private Optional<Provisioner> hostProvisioner;
private HttpProxy httpProxy = new HttpProxy(new SimpleHttpFetcher(Duration.ofSeconds(30)));
private EndpointsChecker endpointsChecker = __ -> { throw new UnsupportedOperationException(); };
private Clock clock = Clock.systemUTC();
@@ -249,6 +252,18 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
return this;
}
+ public Builder withProvisioner(Provisioner provisioner) {
+ if (this.hostProvisioner != null) throw new IllegalArgumentException("provisioner already set in builder");
+ this.hostProvisioner = Optional.ofNullable(provisioner);
+ return this;
+ }
+
+ public Builder withHostProvisionerProvider(HostProvisionerProvider hostProvisionerProvider) {
+ if (this.hostProvisioner != null) throw new IllegalArgumentException("provisioner already set in builder");
+ this.hostProvisioner = hostProvisionerProvider.getHostProvisioner();
+ return this;
+ }
+
public Builder withHttpProxy(HttpProxy httpProxy) {
this.httpProxy = httpProxy;
return this;
@@ -301,7 +316,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
public ApplicationRepository build() {
return new ApplicationRepository(tenantRepository,
- tenantRepository.hostProvisionerProvider().getHostProvisioner(),
+ hostProvisioner,
InfraDeployerProvider.empty().getInfraDeployer(),
configConvergenceChecker,
httpProxy,
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java
index 19f41b514ec..5831cb3e75f 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java
@@ -253,7 +253,7 @@ public class TenantApplications implements RequestHandler, HostValidator {
if (hasApplication(applicationId)) {
applicationMapper.remove(applicationId);
- hostRegistry.removeHosts(applicationId);
+ hostRegistry.removeHostsForKey(applicationId);
configActivationListenersOnRemove(applicationId);
tenantMetricUpdater.setApplications(applicationMapper.numApplications());
metrics.removeMetricUpdater(Metrics.createDimensions(applicationId));
@@ -277,16 +277,17 @@ public class TenantApplications implements RequestHandler, HostValidator {
}
private void configActivationListenersOnRemove(ApplicationId applicationId) {
- configActivationListener.hostsUpdated(applicationId, hostRegistry.getHosts(applicationId));
+ configActivationListener.hostsUpdated(applicationId, hostRegistry.getHostsForKey(applicationId));
configActivationListener.applicationRemoved(applicationId);
}
private void setActiveApp(ApplicationSet applicationSet) {
- ApplicationId applicationId = applicationSet.getId();
- hostRegistry.update(applicationId, applicationSet.getAllHosts());
+ ApplicationId id = applicationSet.getId();
+ Collection<String> hostsForApp = applicationSet.getAllHosts();
+ hostRegistry.update(id, hostsForApp);
applicationSet.updateHostMetrics();
tenantMetricUpdater.setApplications(applicationMapper.numApplications());
- applicationMapper.register(applicationId, applicationSet);
+ applicationMapper.register(id, applicationSet);
}
@Override
@@ -376,7 +377,7 @@ public class TenantApplications implements RequestHandler, HostValidator {
@Override
public ApplicationId resolveApplicationId(String hostName) {
- return hostRegistry.getApplicationId(hostName);
+ return hostRegistry.getKeyForHost(hostName);
}
@Override
@@ -402,7 +403,7 @@ public class TenantApplications implements RequestHandler, HostValidator {
}
public ApplicationId getApplicationIdForHostName(String hostname) {
- return hostRegistry.getApplicationId(hostname);
+ return hostRegistry.getKeyForHost(hostname);
}
public TenantFileSystemDirs getTenantFileSystemDirs() { return tenantFileSystemDirs; }
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java
index 1a7408d6251..b89f3bba835 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java
@@ -9,26 +9,35 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
- * A host registry with a mapping between hostname and ApplicationId
+ * A host registry with a mapping between hosts (hostname as a String) and some type T
+ * TODO: Maybe we should have a Host type, but using String for now.
*
* @author Ulf Lilleengen
*/
public class HostRegistry implements HostValidator {
- private final Map<String, ApplicationId> host2ApplicationId = new ConcurrentHashMap<>();
+ private static final Logger log = Logger.getLogger(HostRegistry.class.getName());
- public ApplicationId getApplicationId(String hostName) {
- return host2ApplicationId.get(hostName);
+ private final Map<String, ApplicationId> host2KeyMap = new ConcurrentHashMap<>();
+
+ public ApplicationId getKeyForHost(String hostName) {
+ return host2KeyMap.get(hostName);
}
- public synchronized void update(ApplicationId applicationId, Collection<String> newHosts) {
- verifyHosts(applicationId, newHosts);
- Collection<String> removedHosts = findRemovedHosts(newHosts, getHosts(applicationId));
+ public synchronized void update(ApplicationId key, Collection<String> newHosts) {
+ verifyHosts(key, newHosts);
+ Collection<String> currentHosts = getHostsForKey(key);
+ log.log(Level.FINE, () -> "Setting hosts for key '" + key + "', " +
+ "newHosts: " + newHosts + ", " +
+ "currentHosts: " + currentHosts);
+ Collection<String> removedHosts = getRemovedHosts(newHosts, currentHosts);
removeHosts(removedHosts);
- addHosts(applicationId, newHosts);
+ addHosts(key, newHosts);
}
@Override
@@ -36,47 +45,49 @@ public class HostRegistry implements HostValidator {
for (String host : newHosts) {
if (hostAlreadyTaken(host, applicationId)) {
throw new IllegalArgumentException("'" + applicationId + "' tried to allocate host '" + host +
- "', but the host is already taken by '" + host2ApplicationId.get(host) + "'");
+ "', but the host is already taken by '" + host2KeyMap.get(host) + "'");
}
}
}
- public synchronized void removeHosts(ApplicationId applicationId) {
- host2ApplicationId.entrySet().removeIf(entry -> entry.getValue().equals(applicationId));
+ public synchronized void removeHostsForKey(ApplicationId key) {
+ host2KeyMap.entrySet().removeIf(entry -> entry.getValue().equals(key));
}
- public synchronized void removeHosts(TenantName tenantName) {
- host2ApplicationId.entrySet().removeIf(entry -> entry.getValue().tenant().equals(tenantName));
+ public synchronized void removeHostsForKey(TenantName key) {
+ host2KeyMap.entrySet().removeIf(entry -> entry.getValue().tenant().equals(key));
}
public synchronized Collection<String> getAllHosts() {
- return Collections.unmodifiableCollection(new ArrayList<>(host2ApplicationId.keySet()));
+ return Collections.unmodifiableCollection(new ArrayList<>(host2KeyMap.keySet()));
}
- public synchronized Collection<String> getHosts(ApplicationId applicationId) {
- return host2ApplicationId.entrySet().stream()
- .filter(entry -> entry.getValue().equals(applicationId))
- .map(Map.Entry::getKey)
- .collect(Collectors.toSet());
+ public synchronized Collection<String> getHostsForKey(ApplicationId key) {
+ return host2KeyMap.entrySet().stream()
+ .filter(entry -> entry.getValue().equals(key))
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toSet());
}
- private boolean hostAlreadyTaken(String host, ApplicationId applicationId) {
- return host2ApplicationId.containsKey(host) && !applicationId.equals(host2ApplicationId.get(host));
+ private boolean hostAlreadyTaken(String host, ApplicationId key) {
+ return host2KeyMap.containsKey(host) && !key.equals(host2KeyMap.get(host));
}
- private static Collection<String> findRemovedHosts(Collection<String> newHosts, Collection<String> previousHosts) {
+ private static Collection<String> getRemovedHosts(Collection<String> newHosts, Collection<String> previousHosts) {
return Collections2.filter(previousHosts, host -> !newHosts.contains(host));
}
- private void removeHosts(Collection<String> hosts) {
- for (String host : hosts) {
- host2ApplicationId.remove(host);
+ private void removeHosts(Collection<String> removedHosts) {
+ for (String host : removedHosts) {
+ log.log(Level.FINE, () -> "Removing " + host);
+ host2KeyMap.remove(host);
}
}
- private void addHosts(ApplicationId key, Collection<String> hosts) {
- for (String host : hosts) {
- host2ApplicationId.put(host, key);
+ private void addHosts(ApplicationId key, Collection<String> newHosts) {
+ for (String host : newHosts) {
+ log.log(Level.FINE, () -> "Adding " + host);
+ host2KeyMap.put(host, key);
}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/HostProvisionerProvider.java b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/HostProvisionerProvider.java
index 5547156721a..9229fb88b40 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/HostProvisionerProvider.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/HostProvisionerProvider.java
@@ -42,6 +42,11 @@ public class HostProvisionerProvider {
}
// for testing
+ public static HostProvisionerProvider withProvisioner(Provisioner provisioner, boolean hostedVespa) {
+ return withProvisioner(provisioner, new ConfigserverConfig(new ConfigserverConfig.Builder().hostedVespa(hostedVespa)));
+ }
+
+ // for testing
public static HostProvisionerProvider withProvisioner(Provisioner provisioner, ConfigserverConfig config) {
ComponentRegistry<Provisioner> registry = new ComponentRegistry<>();
registry.register(ComponentId.createAnonymousComponentId("foobar"), provisioner);
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java
index aac34238b90..be4738258d8 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java
@@ -351,7 +351,7 @@ public class RpcServer implements Runnable, ConfigActivationListener, TenantList
Optional<TenantName> resolveTenant(JRTServerConfigRequest request, Trace trace) {
if ("*".equals(request.getConfigKey().getConfigId())) return Optional.of(ApplicationId.global().tenant());
String hostname = request.getClientHostName();
- ApplicationId applicationId = hostRegistry.getApplicationId(hostname);
+ ApplicationId applicationId = hostRegistry.getKeyForHost(hostname);
if (applicationId == null) {
if (GetConfigProcessor.logDebug(trace)) {
String message = "Did not find tenant for host '" + hostname + "', using " + TenantName.defaultName() +
@@ -445,7 +445,7 @@ public class RpcServer implements Runnable, ConfigActivationListener, TenantList
log.log(Level.FINE, () -> TenantRepository.logPre(tenant) +
"Tenant deleted, removing request handler and cleaning host registry");
tenants.remove(tenant);
- hostRegistry.removeHosts(tenant);
+ hostRegistry.removeHostsForKey(tenant);
}
@Override
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizer.java
index 21f7354401f..536a446df2f 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizer.java
@@ -106,7 +106,7 @@ public class MultiTenantRpcAuthorizer implements RpcAuthorizer {
return; // global config access ok
} else {
String hostname = configRequest.getClientHostName();
- ApplicationId applicationId = hostRegistry.getApplicationId(hostname);
+ ApplicationId applicationId = hostRegistry.getKeyForHost(hostname);
if (applicationId == null) {
if (isConfigKeyForSentinelConfig(configKey)) {
return; // config processor will return empty sentinel config for unknown nodes
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java
index 00a10a97dc3..69d13bf2dea 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java
@@ -618,6 +618,4 @@ public class TenantRepository {
public com.yahoo.vespa.curator.Curator getCurator() { return curator; }
- public HostProvisionerProvider hostProvisionerProvider() { return hostProvisionerProvider; }
-
}
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 253b0d7c101..498940f8a63 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
@@ -13,6 +13,7 @@ import com.yahoo.config.provision.AllocatedHosts;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.Deployment;
+import com.yahoo.config.provision.HostFilter;
import com.yahoo.config.provision.HostSpec;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.NetworkPorts;
@@ -37,7 +38,6 @@ import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs;
import com.yahoo.vespa.config.server.filedistribution.FileDirectory;
import com.yahoo.vespa.config.server.filedistribution.MockFileDistributionFactory;
import com.yahoo.vespa.config.server.http.v2.PrepareResult;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.session.Session;
@@ -79,6 +79,7 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
/**
* @author hmusum
@@ -124,21 +125,21 @@ public class ApplicationRepositoryTest {
.build();
flagSource = new InMemoryFlagSource();
fileDirectory = new FileDirectory(configserverConfig);
- provisioner = new MockProvisioner();
tenantRepository = new TestTenantRepository.Builder()
.withClock(clock)
.withConfigserverConfig(configserverConfig)
.withCurator(curator)
.withFileDistributionFactory(new MockFileDistributionFactory(configserverConfig))
.withFlagSource(flagSource)
- .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig))
.build();
tenantRepository.addTenant(TenantRepository.HOSTED_VESPA_TENANT);
tenantRepository.addTenant(tenant1);
tenantRepository.addTenant(tenant2);
orchestrator = new OrchestratorMock();
+ provisioner = new MockProvisioner();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withConfigserverConfig(configserverConfig)
.withOrchestrator(orchestrator)
.withLogRetriever(new MockLogRetriever())
@@ -176,6 +177,7 @@ public class ApplicationRepositoryTest {
public void prepareAndActivateWithRestart() {
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withConfigserverConfig(configserverConfig)
.withOrchestrator(orchestrator)
.withLogRetriever(new MockLogRetriever())
@@ -186,7 +188,8 @@ public class ApplicationRepositoryTest {
prepareAndActivate(testAppJdiscOnly);
PrepareResult result = prepareAndActivate(testAppJdiscOnlyRestart);
assertTrue(result.configChangeActions().getRefeedActions().isEmpty());
- assertFalse(result.configChangeActions().getRestartActions().isEmpty());
+ assertTrue(result.configChangeActions().getRestartActions().isEmpty());
+ assertEquals(HostFilter.hostname("mytesthost2"), provisioner.lastRestartFilter());
}
@Test
@@ -194,6 +197,7 @@ public class ApplicationRepositoryTest {
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
.withOrchestrator(orchestrator)
+ .withProvisioner(null)
.build();
prepareAndActivate(testAppJdiscOnly);
@@ -281,6 +285,7 @@ public class ApplicationRepositoryTest {
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(orchestrator)
.withClock(clock)
.build();
@@ -324,16 +329,20 @@ public class ApplicationRepositoryTest {
File sessionFile = new File(tenantFileSystemDirs.sessionsPath(), String.valueOf(sessionId));
assertTrue(sessionFile.exists());
- // Delete app and verify that it has been deleted from repos and no application set exists
+ // Delete app and verify that it has been deleted from repos and provisioner and no application set exists
assertTrue(applicationRepository.delete(applicationId()));
assertTrue(applicationRepository.getActiveSession(applicationId()).isEmpty());
assertEquals(Optional.empty(), sessionRepository.getRemoteSession(sessionId).applicationSet());
+ assertEquals(1, provisioner.removeCount());
+ assertEquals(tenant().getName(), provisioner.lastApplicationId().tenant());
+ assertEquals(applicationId(), provisioner.lastApplicationId());
assertTrue(curator.exists(sessionNode));
assertEquals(Session.Status.DELETE.name(), Utf8.toString(curator.getData(sessionNode.append("sessionState")).get()));
assertTrue(sessionFile.exists());
- // Deleting a non-existent application will return false
+ // Deleting a non-existent application still attempts to remove resources
assertFalse(applicationRepository.delete(applicationId()));
+ assertEquals(2, provisioner.removeCount());
}
{
@@ -349,9 +358,46 @@ public class ApplicationRepositoryTest {
// Delete app with id fooId, should not affect original app
assertTrue(applicationRepository.delete(fooId));
+ assertEquals(fooId, provisioner.lastApplicationId());
+ assertNotNull(applicationRepository.getActiveSession(applicationId()));
+
+ assertTrue(applicationRepository.delete(applicationId()));
+ }
+
+ // If delete fails, a retry should work if the failure is transient and zookeeper state should be consistent
+ {
+ long sessionId = deployApp(testApp).sessionId();
+ assertNotNull(sessionRepository.getRemoteSession(sessionId));
+ assertNotNull(applicationRepository.getActiveSession(applicationId()));
+ assertEquals(sessionId, applicationRepository.getActiveSession(applicationId()).get().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()).get().getSessionId());
+ // Delete should work when there is no failure anymore
+ provisioner.failureOnRemove(false);
assertTrue(applicationRepository.delete(applicationId()));
+
+ // Session should be in state DELETE
+ Path sessionNode = sessionRepository.getSessionPath(sessionId);
+ assertEquals(Session.Status.DELETE.name(), Utf8.toString(curator.getData(sessionNode.append("sessionState")).get()));
+ assertNotNull(sessionRepository.getRemoteSession(sessionId)); // session still exists
+ assertTrue(applicationRepository.getActiveSession(applicationId()).isEmpty()); // but it is not active
+ try {
+ applicationRepository.getApplication(applicationId());
+ fail("Should fail with NotFoundException, application should not exist");
+ } catch (NotFoundException e) {
+ // ignore
+ }
}
}
@@ -476,6 +522,7 @@ public class ApplicationRepositoryTest {
MockMetric actual = new MockMetric();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(orchestrator)
.withMetric(actual)
.withClock(new ManualClock())
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 8effd9b6dfe..0ba3a6d883c 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
@@ -22,7 +22,15 @@ import java.util.List;
*/
public class MockProvisioner implements Provisioner {
+ private boolean activated = false;
+ private int removeCount = 0;
+ private boolean restarted = false;
+ private ApplicationId lastApplicationId;
+ private Collection<HostSpec> lastHosts;
+ private HostFilter lastRestartFilter;
+
private boolean transientFailureOnPrepare = false;
+ private boolean failureOnRemove = false;
private HostProvisioner hostProvisioner = null;
public MockProvisioner hostProvisioner(HostProvisioner hostProvisioner) {
@@ -35,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) {
@@ -48,14 +60,25 @@ public class MockProvisioner implements Provisioner {
@Override
public void activate(Collection<HostSpec> hosts, ActivationContext context, ApplicationTransaction transaction) {
+ activated = true;
+ lastApplicationId = transaction.application();
+ lastHosts = hosts;
}
@Override
public void remove(ApplicationTransaction transaction) {
+ if (failureOnRemove)
+ throw new IllegalStateException("Unable to remove " + transaction.application());
+
+ removeCount++;
+ lastApplicationId = transaction.application();
}
@Override
public void restart(ApplicationId application, HostFilter filter) {
+ restarted = true;
+ lastApplicationId = application;
+ lastRestartFilter = filter;
}
@Override
@@ -63,4 +86,28 @@ public class MockProvisioner implements Provisioner {
return new ProvisionLock(application, () -> {});
}
+ public Collection<HostSpec> lastHosts() {
+ return lastHosts;
+ }
+
+ public boolean activated() {
+ return activated;
+ }
+
+ public int removeCount() {
+ return removeCount;
+ }
+
+ public boolean restarted() {
+ return restarted;
+ }
+
+ public ApplicationId lastApplicationId() {
+ return lastApplicationId;
+ }
+
+ public HostFilter lastRestartFilter() {
+ return lastRestartFilter;
+ }
+
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
index c716219f86b..ab527833803 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
@@ -296,8 +296,7 @@ public class DeployTester {
.withZone(zone)
.withFlagSource(flagSource);
- if (configserverConfig.hostedVespa())
- builder.withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig));
+ if (configserverConfig.hostedVespa()) builder.withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, true));
TenantRepository tenantRepository = builder.build();
tenantRepository.addTenant(tenantName);
@@ -307,6 +306,7 @@ public class DeployTester {
.withConfigserverConfig(configserverConfig)
.withOrchestrator(new OrchestratorMock())
.withClock(clock)
+ .withProvisioner(provisioner)
.withConfigConvergenceChecker(configConvergenceChecker)
.withFlagSource(flagSource)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/host/HostRegistryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/host/HostRegistryTest.java
index 646017a498e..df00d28134f 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/host/HostRegistryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/host/HostRegistryTest.java
@@ -24,23 +24,23 @@ public class HostRegistryTest {
@Test
public void old_hosts_are_removed() {
HostRegistry reg = new HostRegistry();
- assertNull(reg.getApplicationId("foo.com"));
+ assertNull(reg.getKeyForHost("foo.com"));
reg.update(foo, List.of("foo.com", "bar.com", "baz.com"));
assertGetKey(reg, "foo.com", foo);
assertGetKey(reg, "bar.com", foo);
assertGetKey(reg, "baz.com", foo);
assertEquals(3, reg.getAllHosts().size());
reg.update(foo, List.of("bar.com", "baz.com"));
- assertNull(reg.getApplicationId("foo.com"));
+ assertNull(reg.getKeyForHost("foo.com"));
assertGetKey(reg, "bar.com", foo);
assertGetKey(reg, "baz.com", foo);
assertEquals(2, reg.getAllHosts().size());
assertTrue(reg.getAllHosts().containsAll(List.of("bar.com", "baz.com")));
- reg.removeHosts(foo);
+ reg.removeHostsForKey(foo);
assertTrue(reg.getAllHosts().isEmpty());
- assertNull(reg.getApplicationId("foo.com"));
- assertNull(reg.getApplicationId("bar.com"));
+ assertNull(reg.getKeyForHost("foo.com"));
+ assertNull(reg.getKeyForHost("bar.com"));
}
@Test
@@ -74,9 +74,9 @@ public class HostRegistryTest {
HostRegistry reg = new HostRegistry();
List<String> hosts = new ArrayList<>(List.of("foo.com", "bar.com", "baz.com"));
reg.update(foo, hosts);
- assertEquals(3, reg.getHosts(foo).size());
+ assertEquals(3, reg.getHostsForKey(foo).size());
hosts.remove(2);
- assertEquals(3, reg.getHosts(foo).size());
+ assertEquals(3, reg.getHostsForKey(foo).size());
}
@Test
@@ -90,8 +90,8 @@ public class HostRegistryTest {
}
private void assertGetKey(HostRegistry reg, String host, ApplicationId expectedKey) {
- assertNotNull(reg.getApplicationId(host));
- assertEquals(expectedKey, reg.getApplicationId(host));
+ assertNotNull(reg.getKeyForHost(host));
+ assertEquals(expectedKey, reg.getKeyForHost(host));
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpGetConfigHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpGetConfigHandlerTest.java
index 6cfdab1257f..279f3a237e8 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpGetConfigHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpGetConfigHandlerTest.java
@@ -7,6 +7,7 @@ import com.yahoo.config.provision.TenantName;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
@@ -15,6 +16,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@@ -57,6 +59,7 @@ public class HttpGetConfigHandlerTest {
tenantRepository.addTenant(tenant);
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpListConfigsHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpListConfigsHandlerTest.java
index 79881d07b25..520b4d0edc5 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpListConfigsHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/HttpListConfigsHandlerTest.java
@@ -8,6 +8,7 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HttpListConfigsHandler.ListConfigsResponse;
import com.yahoo.vespa.config.server.session.PrepareParams;
@@ -17,6 +18,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
@@ -62,6 +64,7 @@ public class HttpListConfigsHandlerTest {
tenantRepository.addTenant(tenant);
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
index 60ee3299de5..052f39c9e1f 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
@@ -9,6 +9,7 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.jdisc.Response;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.ContentHandlerTestBase;
import com.yahoo.vespa.config.server.session.PrepareParams;
@@ -20,6 +21,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
@@ -61,6 +63,7 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase {
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
index e8c4d819c31..c270b4559f9 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
@@ -87,7 +87,9 @@ import static com.yahoo.vespa.config.server.http.v2.ApplicationHandler.HttpServi
import static com.yahoo.yolean.Exceptions.uncheck;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
@@ -134,13 +136,14 @@ public class ApplicationHandlerTest {
.withClock(clock)
.withConfigserverConfig(configserverConfig)
.withFileDistributionFactory(new MockFileDistributionFactory(configserverConfig))
- .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig))
+ .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, false))
.withModelFactoryRegistry(new ModelFactoryRegistry(modelFactories))
.build();
tenantRepository.addTenant(mytenantName);
orchestrator = new OrchestratorMock();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(orchestrator)
.withClock(clock)
.withTesterClient(testerClient)
@@ -347,9 +350,11 @@ public class ApplicationHandlerTest {
@Test
public void testRestart() throws Exception {
- var result = applicationRepository.deploy(testApp, prepareParams(applicationId));
- assertTrue(result.configChangeActions().getRestartActions().isEmpty());
+ applicationRepository.deploy(testApp, prepareParams(applicationId));
+ assertFalse(provisioner.restarted());
restart(applicationId, Zone.defaultZone());
+ assertTrue(provisioner.restarted());
+ assertEquals(applicationId, provisioner.lastApplicationId());
}
@Test
@@ -373,6 +378,7 @@ public class ApplicationHandlerTest {
HttpProxy mockHttpProxy = mock(HttpProxy.class);
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withHostProvisionerProvider(HostProvisionerProvider.empty())
.withOrchestrator(orchestrator)
.withTesterClient(testerClient)
.withHttpProxy(mockHttpProxy)
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java
index ba1d69c13dd..fbc5e87c329 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java
@@ -11,6 +11,7 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.jdisc.Response;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
@@ -21,6 +22,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
@@ -56,6 +58,7 @@ public class HostHandlerTest {
tenantRepository.addTenant(mytenant);
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpGetConfigHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpGetConfigHandlerTest.java
index a0b5b879e45..9aae64cb884 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpGetConfigHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpGetConfigHandlerTest.java
@@ -9,6 +9,7 @@ import com.yahoo.config.provision.TenantName;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpConfigRequest;
@@ -22,6 +23,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@@ -58,13 +60,15 @@ public class HttpGetConfigHandlerTest {
.configDefinitionsDir(temporaryFolder.newFolder().getAbsolutePath())
.fileReferencesDir(temporaryFolder.newFolder().getAbsolutePath())
.build();
+ MockProvisioner provisioner = new MockProvisioner();
TenantRepository tenantRepository = new TestTenantRepository.Builder()
.withConfigserverConfig(configserverConfig)
- .withHostProvisionerProvider(HostProvisionerProvider.empty())
+ .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, false))
.build();
tenantRepository.addTenant(tenant);
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpListConfigsHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpListConfigsHandlerTest.java
index 3762e52ae62..2ee1064f614 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpListConfigsHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HttpListConfigsHandlerTest.java
@@ -11,6 +11,7 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
@@ -22,6 +23,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
@@ -69,6 +71,7 @@ public class HttpListConfigsHandlerTest {
tenantRepository.addTenant(tenant);
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
index d7e6273352b..1c71ef0b7fb 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
@@ -19,7 +19,6 @@ import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
import com.yahoo.vespa.config.server.model.TestModelFactory;
import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.session.Session;
import com.yahoo.vespa.config.server.tenant.Tenant;
@@ -75,11 +74,11 @@ public class SessionActiveHandlerTest {
TenantRepository tenantRepository = new TestTenantRepository.Builder()
.withConfigserverConfig(configserverConfig)
.withModelFactoryRegistry(new ModelFactoryRegistry(List.of((modelFactory))))
- .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig))
.build();
tenantRepository.addTenant(tenantName);
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(new OrchestratorMock())
.withClock(clock)
.withConfigserverConfig(configserverConfig)
@@ -165,6 +164,8 @@ public class SessionActiveHandlerTest {
"/environment/" + "prod" +
"/region/" + "default" +
"/instance/" + "default"));
+ assertTrue(provisioner.activated());
+ assertEquals(1, provisioner.lastHosts().size());
}
private SessionActiveHandler createHandler() {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
index b17f80fd510..7c2e0be0c3a 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
@@ -11,6 +11,7 @@ import com.yahoo.jdisc.Response;
import com.yahoo.jdisc.http.HttpRequest;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.ContentHandlerTestBase;
import com.yahoo.vespa.config.server.http.SessionHandlerTest;
@@ -23,6 +24,7 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
@@ -61,6 +63,7 @@ public class SessionContentHandlerTest extends ContentHandlerTestBase {
ApplicationRepository applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
@@ -183,6 +186,7 @@ public class SessionContentHandlerTest extends ContentHandlerTestBase {
SessionContentHandler.testContext(),
new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withClock(Clock.systemUTC())
.build()
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
index 04531fbb2e0..2e86f5e0538 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
@@ -1,14 +1,15 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.http.v2;
-import ai.vespa.http.HttpURL.Path;
import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.config.application.api.ApplicationFile;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.TenantName;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
+import ai.vespa.http.HttpURL.Path;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.CompressedApplicationInputStreamTest;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
@@ -22,6 +23,7 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -82,6 +84,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
.build();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.build();
tenantRepository.addTenant(tenant);
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
index 765523177a9..de6073bb1ea 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
@@ -16,6 +16,7 @@ import com.yahoo.jdisc.http.HttpRequest;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.TimeoutBudget;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
@@ -29,6 +30,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -80,6 +82,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest {
tenantRepository.addTenant(tenant);
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withClock(clock)
.withConfigserverConfig(configserverConfig)
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
index b39050250f9..b8bd35a564a 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java
@@ -10,6 +10,7 @@ import com.yahoo.container.jdisc.HttpRequestBuilder;
import com.yahoo.jdisc.http.HttpRequest.Method;
import com.yahoo.restapi.RestApiTestDriver;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
@@ -19,6 +20,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -56,6 +58,7 @@ public class TenantHandlerTest {
.build();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withConfigserverConfig(configserverConfig)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
index 5fb92e1f66f..a2dc0216b72 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
@@ -41,12 +41,13 @@ class MaintainerTester {
.build();
tenantRepository = new TestTenantRepository.Builder()
.withClock(clock)
- .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig))
+ .withHostProvisionerProvider(HostProvisionerProvider.withProvisioner(provisioner, true))
.withConfigserverConfig(configserverConfig)
.withModelFactoryRegistry(new ModelFactoryRegistry(List.of(new DeployTester.CountingModelFactory(clock))))
.build();
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(provisioner)
.withOrchestrator(new OrchestratorMock())
.withLogRetriever(new MockLogRetriever())
.withClock(clock)
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
index c40af30d1f4..b29edd480ad 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
@@ -12,6 +12,7 @@ import com.yahoo.jrt.Transport;
import com.yahoo.test.ManualClock;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.MemoryGenerationCounter;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.PortRangeAllocator;
import com.yahoo.vespa.config.server.SuperModelManager;
import com.yahoo.vespa.config.server.SuperModelRequestHandler;
@@ -86,6 +87,7 @@ public class RpcTester implements AutoCloseable {
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
.withConfigserverConfig(configserverConfig)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.build();
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java
index cc6cd4d86e9..c7113bbf803 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java
@@ -335,9 +335,7 @@ public class SessionPreparerTest {
@Test(expected = LoadBalancerServiceException.class)
public void require_that_conflict_is_returned_when_creating_load_balancer_fails() throws IOException {
- var configserverConfig = new ConfigserverConfig.Builder().hostedVespa(true).build();
- MockProvisioner provisioner = new MockProvisioner().transientFailureOnPrepare();
- preparer = createPreparer(HostProvisionerProvider.withProvisioner(provisioner, configserverConfig));
+ preparer = createPreparer(HostProvisionerProvider.withProvisioner(new MockProvisioner().transientFailureOnPrepare(), true));
var params = new PrepareParams.Builder().applicationId(applicationId("test")).build();
prepare(new File("src/test/resources/deploy/hosted-app"), params);
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
index 83ada4122c2..a5360fbc01c 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
@@ -19,6 +19,7 @@ import com.yahoo.io.reader.NamedReader;
import com.yahoo.path.Path;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.ApplicationRepository;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.application.ApplicationSet;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.filedistribution.MockFileDistributionFactory;
@@ -102,6 +103,7 @@ public class SessionRepositoryTest {
tenantRepository.addTenant(SessionRepositoryTest.tenantName);
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
+ .withProvisioner(new MockProvisioner())
.withOrchestrator(new OrchestratorMock())
.withFlagSource(flagSource)
.build();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java
index 9af1bbb875e..823466603b1 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java
@@ -13,6 +13,7 @@ import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.Zone;
import com.yahoo.vespa.config.server.ConfigServerDB;
+import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.MockSecretStore;
import com.yahoo.vespa.config.server.ServerCache;
import com.yahoo.vespa.config.server.TestConfigDefinitionRepo;
@@ -218,7 +219,7 @@ public class TenantRepositoryTest {
flagSource,
new InThreadExecutorService(),
new MockSecretStore(),
- HostProvisionerProvider.empty(),
+ HostProvisionerProvider.withProvisioner(new MockProvisioner(), false),
configserverConfig,
new ConfigServerDB(configserverConfig),
Zone.defaultZone(),