diff options
author | Harald Musum <musum@verizonmedia.com> | 2023-02-22 19:34:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-22 19:34:37 +0100 |
commit | 08f219c4ff4eb717b4af0ec1612a8a34b347264c (patch) | |
tree | 5bc5755c2c21eca5cc185a460908b63a81546208 | |
parent | 88b6383b71458ebf9c2de5d34ee5c0e1784afb95 (diff) |
Revert "Hmusum/configserver cleanup 1"
29 files changed, 242 insertions, 74 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(), diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/DuperModel.java b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/DuperModel.java index fb31cbcdd84..3a9c2b1f1e7 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/DuperModel.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/DuperModel.java @@ -5,7 +5,9 @@ import com.yahoo.config.model.api.ApplicationInfo; import com.yahoo.config.model.api.HostInfo; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostName; +import java.util.logging.Level; import com.yahoo.vespa.service.monitor.DuperModelListener; + import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -13,7 +15,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -22,7 +23,7 @@ import java.util.logging.Logger; * @author hakonhall */ public class DuperModel { - private static final Logger logger = Logger.getLogger(DuperModel.class.getName()); + private static Logger logger = Logger.getLogger(DuperModel.class.getName()); private final Map<ApplicationId, ApplicationInfo> applicationsById = new HashMap<>(); private final Map<HostName, ApplicationId> idsByHostname = new HashMap<>(); |