diff options
author | Harald Musum <musum@verizonmedia.com> | 2021-01-12 17:15:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-12 17:15:42 +0100 |
commit | 6fb9da718607e30498e7cd1d146df89ddbfdb448 (patch) | |
tree | 6c9eef17d2424f748d27c7ddf2e475031fb778ff | |
parent | 3af508945a49a03494e91aba2934d6bade6141cc (diff) | |
parent | 74733dd159d27fbdc5a9e6592f7b4e28dda09f07 (diff) |
Merge pull request #16021 from vespa-engine/revert-16019-revert-16012-revert-16003-revert-15987-revert-15983-revert-15979-revert-15978-revert-15977-hmusum/remove-unnecessary-component
Use just one HostRegistry [run-systemtest]
44 files changed, 255 insertions, 305 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java index 1eb18773898..49a61eb8dee 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server; import com.yahoo.cloud.config.ConfigserverConfig; @@ -9,7 +9,7 @@ import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.session.SessionPreparer; @@ -38,7 +38,6 @@ public interface GlobalComponentRegistry { ReloadListener getReloadListener(); ConfigDefinitionRepo getStaticConfigDefinitionRepo(); PermanentApplicationPackage getPermanentApplicationPackage(); - HostRegistries getHostRegistries(); ModelFactoryRegistry getModelFactoryRegistry(); Optional<Provisioner> getHostProvisioner(); Zone getZone(); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java index 9badd19009f..5760eae866c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server; import com.google.inject.Inject; @@ -11,7 +11,7 @@ import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; @@ -44,7 +44,6 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry private final ConfigserverConfig configserverConfig; private final ConfigDefinitionRepo staticConfigDefinitionRepo; private final PermanentApplicationPackage permanentApplicationPackage; - private final HostRegistries hostRegistries; private final Optional<Provisioner> hostProvisioner; private final Zone zone; private final ConfigServerDB configServerDB; @@ -52,6 +51,7 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry private final SecretStore secretStore; private final StripedExecutor<TenantName> zkWatcherExecutor; private final ExecutorService zkCacheExecutor; + private final HostRegistry hostRegistry; @SuppressWarnings("WeakerAccess") @Inject @@ -62,15 +62,14 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry SessionPreparer sessionPreparer, RpcServer rpcServer, ConfigserverConfig configserverConfig, - SuperModelGenerationCounter superModelGenerationCounter, ConfigDefinitionRepo staticConfigDefinitionRepo, PermanentApplicationPackage permanentApplicationPackage, - HostRegistries hostRegistries, HostProvisionerProvider hostProvisionerProvider, Zone zone, ConfigServerDB configServerDB, FlagSource flagSource, - SecretStore secretStore) { + SecretStore secretStore, + HostRegistry hostRegistry) { this.curator = curator; this.configCurator = configCurator; this.metrics = metrics; @@ -80,7 +79,6 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry this.configserverConfig = configserverConfig; this.staticConfigDefinitionRepo = staticConfigDefinitionRepo; this.permanentApplicationPackage = permanentApplicationPackage; - this.hostRegistries = hostRegistries; this.hostProvisioner = hostProvisionerProvider.getHostProvisioner(); this.zone = zone; this.configServerDB = configServerDB; @@ -88,6 +86,7 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry this.secretStore = secretStore; this.zkWatcherExecutor = new StripedExecutor<>(); this.zkCacheExecutor = Executors.newFixedThreadPool(1, ThreadFactoryFactory.getThreadFactory(TenantRepository.class.getName())); + this.hostRegistry = hostRegistry; } @Override @@ -109,8 +108,6 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry @Override public PermanentApplicationPackage getPermanentApplicationPackage() { return permanentApplicationPackage; } @Override - public HostRegistries getHostRegistries() { return hostRegistries; } - @Override public ModelFactoryRegistry getModelFactoryRegistry() { return modelFactoryRegistry; } @Override @@ -146,4 +143,5 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry public SecretStore getSecretStore() { return secretStore; } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ReloadListener.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ReloadListener.java index 773a4862033..7cdb596780a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ReloadListener.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ReloadListener.java @@ -1,8 +1,7 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.TenantName; import com.yahoo.vespa.config.server.application.ApplicationSet; import java.util.Collection; @@ -17,21 +16,21 @@ import java.util.Collection; public interface ReloadListener { /** - * Signal the listener that hosts used by by a particular tenant. + * Signals the listener that hosts used by a particular tenant. * - * @param tenant Name of tenant. + * @param applicationId application id * @param newHosts a {@link Collection} of hosts used by tenant. */ - void hostsUpdated(TenantName tenant, Collection<String> newHosts); + void hostsUpdated(ApplicationId applicationId, Collection<String> newHosts); /** - * Verify that given hosts are available for use by tenant. + * Verifies that given hosts are available for use by tenant. * - * @param tenant tenant that wants to allocate hosts. + * @param applicationId application id * @param newHosts a {@link java.util.Collection} of hosts that tenant wants to allocate. * @throws java.lang.IllegalArgumentException if one or more of the hosts are in use by another tenant. */ - void verifyHostsAreAvailable(TenantName tenant, Collection<String> newHosts); + void verifyHostsAreAvailable(ApplicationId applicationId, Collection<String> newHosts); /** * Configs has been activated for an application: Either an application 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 5a34217dbdd..0e5315c0dcc 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 @@ -27,7 +27,6 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; import java.nio.file.Files; @@ -62,7 +61,7 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica private final TenantName tenant; private final ReloadListener reloadListener; private final ConfigResponseFactory responseFactory; - private final HostRegistry<ApplicationId> hostRegistry; + private final HostRegistry hostRegistry; private final ApplicationMapper applicationMapper = new ApplicationMapper(); private final MetricUpdater tenantMetricUpdater; private final Clock clock; @@ -70,7 +69,7 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica public TenantApplications(TenantName tenant, Curator curator, StripedExecutor<TenantName> zkWatcherExecutor, ExecutorService zkCacheExecutor, Metrics metrics, ReloadListener reloadListener, - ConfigserverConfig configserverConfig, HostRegistry<ApplicationId> hostRegistry, + ConfigserverConfig configserverConfig, HostRegistry hostRegistry, TenantFileSystemDirs tenantFileSystemDirs, Clock clock) { this.database = new ApplicationCuratorDatabase(tenant, curator); this.tenant = tenant; @@ -88,7 +87,7 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica } // For testing only - public static TenantApplications create(GlobalComponentRegistry componentRegistry, TenantName tenantName) { + public static TenantApplications create(GlobalComponentRegistry componentRegistry, HostRegistry hostRegistry, TenantName tenantName) { return new TenantApplications(tenantName, componentRegistry.getCurator(), componentRegistry.getZkWatcherExecutor(), @@ -96,7 +95,7 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica componentRegistry.getMetrics(), componentRegistry.getReloadListener(), componentRegistry.getConfigserverConfig(), - componentRegistry.getHostRegistries().createApplicationHostRegistry(tenantName), + hostRegistry, new TenantFileSystemDirs(componentRegistry.getConfigServerDB(), tenantName), componentRegistry.getClock()); } @@ -222,7 +221,10 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica } private void notifyReloadListeners(ApplicationSet applicationSet) { - reloadListener.hostsUpdated(tenant, hostRegistry.getAllHosts()); + if (applicationSet.getAllApplications().isEmpty()) throw new IllegalArgumentException("application set cannot be empty"); + + reloadListener.hostsUpdated(applicationSet.getAllApplications().get(0).toApplicationInfo().getApplicationId(), + applicationSet.getAllHosts()); reloadListener.configActivated(applicationSet); } @@ -271,7 +273,7 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica } private void reloadListenersOnRemove(ApplicationId applicationId) { - reloadListener.hostsUpdated(tenant, hostRegistry.getAllHosts()); + reloadListener.hostsUpdated(applicationId, hostRegistry.getHostsForKey(applicationId)); reloadListener.applicationRemoved(applicationId); } @@ -382,9 +384,9 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica } @Override - public void verifyHosts(ApplicationId key, Collection<String> newHosts) { - hostRegistry.verifyHosts(key, newHosts); - reloadListener.verifyHostsAreAvailable(tenant, newHosts); + public void verifyHosts(ApplicationId applicationId, Collection<String> newHosts) { + hostRegistry.verifyHosts(applicationId, newHosts); + reloadListener.verifyHostsAreAvailable(applicationId, newHosts); } public HostValidator<ApplicationId> getHostValidator() { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistries.java b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistries.java deleted file mode 100644 index c25ab0315a3..00000000000 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistries.java +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.config.server.host; - -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.TenantName; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Component to hold host registries. - * - * @author hmusum - */ -public class HostRegistries { - - private final HostRegistry<TenantName> tenantHostRegistry = new HostRegistry<>(); - private final Map<TenantName, HostRegistry<ApplicationId>> applicationHostRegistries = new ConcurrentHashMap<>(); - - public HostRegistry<TenantName> getTenantHostRegistry() { - return tenantHostRegistry; - } - - public HostRegistry<ApplicationId> getApplicationHostRegistry(TenantName tenant) { - return applicationHostRegistries.get(tenant); - } - - public HostRegistry<ApplicationId> createApplicationHostRegistry(TenantName tenant) { - HostRegistry<ApplicationId> applicationIdHostRegistry = new HostRegistry<>(); - applicationHostRegistries.put(tenant, applicationIdHostRegistry); - return applicationIdHostRegistry; - } - -} 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 ec37f2598e0..d45764295dd 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 @@ -1,12 +1,18 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.host; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Collectors; import com.google.common.collect.Collections2; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.TenantName; + import java.util.logging.Level; /** @@ -15,20 +21,20 @@ import java.util.logging.Level; * * @author Ulf Lilleengen */ -public class HostRegistry<T> implements HostValidator<T> { +public class HostRegistry implements HostValidator<ApplicationId> { private static final Logger log = Logger.getLogger(HostRegistry.class.getName()); - private final Map<String, T> host2KeyMap = new ConcurrentHashMap<>(); + private final Map<String, ApplicationId> host2KeyMap = new ConcurrentHashMap<>(); - public T getKeyForHost(String hostName) { + public ApplicationId getKeyForHost(String hostName) { return host2KeyMap.get(hostName); } - public synchronized void update(T key, Collection<String> newHosts) { + 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 + "', " + + log.log(Level.INFO, () -> "Setting hosts for key '" + key + "', " + "newHosts: " + newHosts + ", " + "currentHosts: " + currentHosts); Collection<String> removedHosts = getRemovedHosts(newHosts, currentHosts); @@ -37,7 +43,7 @@ public class HostRegistry<T> implements HostValidator<T> { } @Override - public synchronized void verifyHosts(T key, Collection<String> newHosts) { + public synchronized void verifyHosts(ApplicationId key, Collection<String> newHosts) { for (String host : newHosts) { if (hostAlreadyTaken(host, key)) { throw new IllegalArgumentException("'" + key + "' tried to allocate host '" + host + @@ -46,22 +52,26 @@ public class HostRegistry<T> implements HostValidator<T> { } } - public synchronized void removeHostsForKey(T key) { + public synchronized void removeHostsForKey(ApplicationId key) { host2KeyMap.entrySet().removeIf(entry -> entry.getValue().equals(key)); } + 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<>(host2KeyMap.keySet())); } - synchronized Collection<String> getHostsForKey(T key) { + 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, T key) { + private boolean hostAlreadyTaken(String host, ApplicationId key) { return host2KeyMap.containsKey(host) && !key.equals(host2KeyMap.get(host)); } @@ -76,7 +86,7 @@ public class HostRegistry<T> implements HostValidator<T> { } } - private void addHosts(T key, Collection<String> newHosts) { + 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/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java index e64859e7267..370ae72bbbd 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 @@ -34,7 +34,6 @@ import com.yahoo.vespa.config.server.RequestHandler; import com.yahoo.vespa.config.server.SuperModelRequestHandler; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.filedistribution.FileServer; -import com.yahoo.vespa.config.server.host.HostRegistries; import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.monitoring.MetricUpdaterFactory; @@ -92,7 +91,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { private final DelayedConfigResponses delayedConfigResponses; - private final HostRegistry<TenantName> hostRegistry; + private final HostRegistry hostRegistry; private final Map<TenantName, Tenant> tenants = new ConcurrentHashMap<>(); private final Map<ApplicationId, ApplicationState> applicationStateMap = new ConcurrentHashMap<>(); private final SuperModelRequestHandler superModelRequestHandler; @@ -122,7 +121,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { */ @Inject public RpcServer(ConfigserverConfig config, SuperModelRequestHandler superModelRequestHandler, - MetricUpdaterFactory metrics, HostRegistries hostRegistries, + MetricUpdaterFactory metrics, HostRegistry hostRegistry, HostLivenessTracker hostLivenessTracker, FileServer fileServer, RpcAuthorizer rpcAuthorizer, RpcRequestHandlerProvider handlerProvider) { this.superModelRequestHandler = superModelRequestHandler; @@ -136,7 +135,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { 0, TimeUnit.SECONDS, workQueue, ThreadFactoryFactory.getDaemonThreadFactory(THREADPOOL_NAME)); delayedConfigResponses = new DelayedConfigResponses(this, config.numDelayedResponseThreads()); spec = new Spec(null, config.rpcport()); - hostRegistry = hostRegistries.getTenantHostRegistry(); + this.hostRegistry = hostRegistry; this.useRequestVersion = config.useVespaVersionInRequest(); this.hostedVespa = config.hostedVespa(); this.canReturnEmptySentinelConfig = config.canReturnEmptySentinelConfig(); @@ -303,14 +302,14 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { } @Override - public void hostsUpdated(TenantName tenant, Collection<String> newHosts) { + public void hostsUpdated(ApplicationId applicationId, Collection<String> newHosts) { log.log(Level.FINE, "Updating hosts in tenant host registry '" + hostRegistry + "' with " + newHosts); - hostRegistry.update(tenant, newHosts); + hostRegistry.update(applicationId, newHosts); } @Override - public void verifyHostsAreAvailable(TenantName tenant, Collection<String> newHosts) { - hostRegistry.verifyHosts(tenant, newHosts); + public void verifyHostsAreAvailable(ApplicationId applicationId, Collection<String> newHosts) { + hostRegistry.verifyHosts(applicationId, newHosts); } @Override @@ -334,8 +333,8 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { Optional<TenantName> resolveTenant(JRTServerConfigRequest request, Trace trace) { if ("*".equals(request.getConfigKey().getConfigId())) return Optional.of(ApplicationId.global().tenant()); String hostname = request.getClientHostName(); - TenantName tenant = hostRegistry.getKeyForHost(hostname); - if (tenant == null) { + ApplicationId applicationId = hostRegistry.getKeyForHost(hostname); + if (applicationId == null) { if (GetConfigProcessor.logDebug(trace)) { String message = "Did not find tenant for host '" + hostname + "', using " + TenantName.defaultName(); log.log(Level.FINE, message); @@ -344,7 +343,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { } return Optional.empty(); } - return Optional.of(tenant); + return Optional.of(applicationId.tenant()); } public ConfigResponse resolveConfig(JRTServerConfigRequest request, GetConfigContext context, Optional<Version> vespaVersion) { @@ -425,7 +424,8 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { @Override public void onTenantDelete(TenantName tenant) { - log.log(Level.FINE, TenantRepository.logPre(tenant)+"Tenant deleted, removing request handler and cleaning host registry"); + log.log(Level.FINE, TenantRepository.logPre(tenant) + + "Tenant deleted, removing request handler and cleaning host registry"); tenants.remove(tenant); hostRegistry.removeHostsForKey(tenant); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/DefaultRpcAuthorizerProvider.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/DefaultRpcAuthorizerProvider.java index 8d1d4f58e37..b00b6db4226 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/DefaultRpcAuthorizerProvider.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/security/DefaultRpcAuthorizerProvider.java @@ -1,4 +1,4 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.rpc.security; import com.google.inject.Inject; @@ -6,7 +6,7 @@ import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.provision.security.NodeIdentifier; import com.yahoo.container.di.componentgraph.Provider; import com.yahoo.security.tls.TransportSecurityUtils; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.rpc.RequestHandlerProvider; /** @@ -21,13 +21,13 @@ public class DefaultRpcAuthorizerProvider implements Provider<RpcAuthorizer> { @Inject public DefaultRpcAuthorizerProvider(ConfigserverConfig config, NodeIdentifier nodeIdentifier, - HostRegistries hostRegistries, + HostRegistry hostRegistry, RequestHandlerProvider handlerProvider) { boolean useMultiTenantAuthorizer = TransportSecurityUtils.isTransportSecurityEnabled() && config.multitenant() && config.hostedVespa(); this.rpcAuthorizer = useMultiTenantAuthorizer - ? new MultiTenantRpcAuthorizer(nodeIdentifier, hostRegistries, handlerProvider, getThreadPoolSize(config)) + ? new MultiTenantRpcAuthorizer(nodeIdentifier, hostRegistry, handlerProvider, getThreadPoolSize(config)) : new NoopRpcAuthorizer(); } 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 49a8df3d0e4..8353e3fab1f 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 @@ -1,4 +1,4 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.rpc.security; import com.yahoo.cloud.config.SentinelConfig; @@ -16,7 +16,6 @@ import com.yahoo.security.tls.TransportSecurityUtils; import com.yahoo.vespa.config.ConfigKey; import com.yahoo.vespa.config.protocol.JRTServerConfigRequestV3; import com.yahoo.vespa.config.server.RequestHandler; -import com.yahoo.vespa.config.server.host.HostRegistries; import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.rpc.RequestHandlerProvider; @@ -34,7 +33,6 @@ import java.util.logging.Logger; import static com.yahoo.vespa.config.server.rpc.security.AuthorizationException.Type; import static com.yahoo.yolean.Exceptions.throwUnchecked; - /** * A {@link RpcAuthorizer} that perform access control for configserver RPC methods when TLS and multi-tenant mode are enabled. * @@ -45,22 +43,22 @@ public class MultiTenantRpcAuthorizer implements RpcAuthorizer { private static final Logger log = Logger.getLogger(MultiTenantRpcAuthorizer.class.getName()); private final NodeIdentifier nodeIdentifier; - private final HostRegistry<TenantName> hostRegistry; + private final HostRegistry hostRegistry; private final RequestHandlerProvider handlerProvider; private final Executor executor; public MultiTenantRpcAuthorizer(NodeIdentifier nodeIdentifier, - HostRegistries hostRegistries, + HostRegistry hostRegistry, RequestHandlerProvider handlerProvider, int threadPoolSize) { this(nodeIdentifier, - hostRegistries.getTenantHostRegistry(), + hostRegistry, handlerProvider, Executors.newFixedThreadPool(threadPoolSize, new DaemonThreadFactory("multi-tenant-rpc-authorizer-"))); } MultiTenantRpcAuthorizer(NodeIdentifier nodeIdentifier, - HostRegistry<TenantName> hostRegistry, + HostRegistry hostRegistry, RequestHandlerProvider handlerProvider, Executor executor) { this.nodeIdentifier = nodeIdentifier; @@ -108,14 +106,14 @@ public class MultiTenantRpcAuthorizer implements RpcAuthorizer { return; // global config access ok } else { String hostname = configRequest.getClientHostName(); - Optional<TenantName> tenantName = Optional.ofNullable(hostRegistry.getKeyForHost(hostname)); - if (tenantName.isEmpty()) { + ApplicationId applicationId = hostRegistry.getKeyForHost(hostname); + if (applicationId == null) { if (isConfigKeyForSentinelConfig(configKey)) { return; // config processor will return empty sentinel config for unknown nodes } throw new AuthorizationException(Type.SILENT, String.format("Host '%s' not found in host registry for [%s]", hostname, configKey)); } - RequestHandler tenantHandler = getTenantHandler(tenantName.get()); + RequestHandler tenantHandler = getTenantHandler(applicationId.tenant()); ApplicationId resolvedApplication = tenantHandler.resolveApplicationId(hostname); ApplicationId peerOwner = applicationId(peerIdentity); if (peerOwner.equals(resolvedApplication)) { 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 5c15b72eaac..a2fa7851173 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 @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.tenant; import com.google.common.collect.ImmutableSet; @@ -14,6 +14,7 @@ import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.GlobalComponentRegistry; import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.session.SessionRepository; import com.yahoo.vespa.curator.Curator; @@ -78,6 +79,7 @@ public class TenantRepository { private final Map<TenantName, Tenant> tenants = Collections.synchronizedMap(new LinkedHashMap<>()); private final GlobalComponentRegistry componentRegistry; + private final HostRegistry hostRegistry; private final List<TenantListener> tenantListeners = Collections.synchronizedList(new ArrayList<>()); private final Curator curator; @@ -95,8 +97,9 @@ public class TenantRepository { * @param componentRegistry a {@link com.yahoo.vespa.config.server.GlobalComponentRegistry} */ @Inject - public TenantRepository(GlobalComponentRegistry componentRegistry) { + public TenantRepository(GlobalComponentRegistry componentRegistry, HostRegistry hostRegistry) { this.componentRegistry = componentRegistry; + this.hostRegistry = hostRegistry; ConfigserverConfig configserverConfig = componentRegistry.getConfigserverConfig(); this.bootstrapExecutor = Executors.newFixedThreadPool(configserverConfig.numParallelTenantLoaders(), new DaemonThreadFactory("bootstrap tenants")); @@ -228,7 +231,7 @@ public class TenantRepository { componentRegistry.getMetrics(), componentRegistry.getReloadListener(), componentRegistry.getConfigserverConfig(), - componentRegistry.getHostRegistries().createApplicationHostRegistry(tenantName), + hostRegistry, new TenantFileSystemDirs(componentRegistry.getConfigServerDB(), tenantName), componentRegistry.getClock()); SessionRepository sessionRepository = new SessionRepository(tenantName, diff --git a/configserver/src/main/resources/configserver-app/services.xml b/configserver/src/main/resources/configserver-app/services.xml index dac10ac4e59..00c65644e47 100644 --- a/configserver/src/main/resources/configserver-app/services.xml +++ b/configserver/src/main/resources/configserver-app/services.xml @@ -27,7 +27,7 @@ <component id="com.yahoo.vespa.config.server.InjectedGlobalComponentRegistry" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.tenant.TenantRepository" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.application.PermanentApplicationPackage" bundle="configserver" /> - <component id="com.yahoo.vespa.config.server.host.HostRegistries" bundle="configserver" /> + <component id="com.yahoo.vespa.config.server.host.HostRegistry" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.ApplicationRepository" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.version.VersionState" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.zookeeper.ConfigCurator" bundle="configserver" /> diff --git a/configserver/src/test/apps/app-jdisc-only-restart/hosts.xml b/configserver/src/test/apps/app-jdisc-only-restart/hosts.xml index f4256c9fc81..ab70b288ba6 100644 --- a/configserver/src/test/apps/app-jdisc-only-restart/hosts.xml +++ b/configserver/src/test/apps/app-jdisc-only-restart/hosts.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <hosts> - <host name="mytesthost"> + <host name="mytesthost2"> <alias>node1</alias> </host> </hosts> diff --git a/configserver/src/test/apps/app-jdisc-only/hosts.xml b/configserver/src/test/apps/app-jdisc-only/hosts.xml index f4256c9fc81..ab70b288ba6 100644 --- a/configserver/src/test/apps/app-jdisc-only/hosts.xml +++ b/configserver/src/test/apps/app-jdisc-only/hosts.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <hosts> - <host name="mytesthost"> + <host name="mytesthost2"> <alias>node1</alias> </host> </hosts> 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 0cab49a9f00..b45569c95b8 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 @@ -32,6 +32,7 @@ import com.yahoo.vespa.config.protocol.VespaVersion; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.deploy.DeployTester; import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.v2.PrepareResult; import com.yahoo.vespa.config.server.session.LocalSession; import com.yahoo.vespa.config.server.session.PrepareParams; @@ -127,7 +128,7 @@ public class ApplicationRepositoryTest { .flagSource(flagSource) .clock(clock) .build(); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(TenantRepository.HOSTED_VESPA_TENANT); tenantRepository.addTenant(tenant1); tenantRepository.addTenant(tenant2); @@ -192,7 +193,7 @@ public class ApplicationRepositoryTest { PrepareResult result = prepareAndActivate(testAppJdiscOnlyRestart); assertTrue(result.configChangeActions().getRefeedActions().isEmpty()); assertTrue(result.configChangeActions().getRestartActions().isEmpty()); - assertEquals(HostFilter.hostname("mytesthost"), provisioner.lastRestartFilter()); + assertEquals(HostFilter.hostname("mytesthost2"), provisioner.lastRestartFilter()); } @Test @@ -345,7 +346,7 @@ public class ApplicationRepositoryTest { // Deploy another app (with id fooId) ApplicationId fooId = applicationId(tenant2); PrepareParams prepareParams2 = new PrepareParams.Builder().applicationId(fooId).build(); - deployApp(testApp, prepareParams2); + deployApp(testAppJdiscOnly, prepareParams2); assertNotNull(applicationRepository.getActiveSession(fooId)); // Delete app with id fooId, should not affect original app @@ -530,14 +531,14 @@ public class ApplicationRepositoryTest { list.add(new NetworkPorts.Allocation(19081, "logserver", "admin/logserver", "unused/1")); list.add(new NetworkPorts.Allocation(19082, "logserver", "admin/logserver", "unused/2")); list.add(new NetworkPorts.Allocation(19083, "logserver", "admin/logserver", "unused/3")); - list.add(new NetworkPorts.Allocation(19089, "logd", "hosts/mytesthost/logd", "http")); - list.add(new NetworkPorts.Allocation(19090, "configproxy", "hosts/mytesthost/configproxy", "rpc")); - list.add(new NetworkPorts.Allocation(19092, "metricsproxy-container", "admin/metrics/mytesthost", "http")); - list.add(new NetworkPorts.Allocation(19093, "metricsproxy-container", "admin/metrics/mytesthost", "http/1")); - list.add(new NetworkPorts.Allocation(19094, "metricsproxy-container", "admin/metrics/mytesthost", "rpc/admin")); - list.add(new NetworkPorts.Allocation(19095, "metricsproxy-container", "admin/metrics/mytesthost", "rpc/metrics")); - list.add(new NetworkPorts.Allocation(19097, "config-sentinel", "hosts/mytesthost/sentinel", "rpc")); - list.add(new NetworkPorts.Allocation(19098, "config-sentinel", "hosts/mytesthost/sentinel", "http")); + list.add(new NetworkPorts.Allocation(19089, "logd", "hosts/mytesthost2/logd", "http")); + list.add(new NetworkPorts.Allocation(19090, "configproxy", "hosts/mytesthost2/configproxy", "rpc")); + list.add(new NetworkPorts.Allocation(19092, "metricsproxy-container", "admin/metrics/mytesthost2", "http")); + list.add(new NetworkPorts.Allocation(19093, "metricsproxy-container", "admin/metrics/mytesthost2", "http/1")); + list.add(new NetworkPorts.Allocation(19094, "metricsproxy-container", "admin/metrics/mytesthost2", "rpc/admin")); + list.add(new NetworkPorts.Allocation(19095, "metricsproxy-container", "admin/metrics/mytesthost2", "rpc/metrics")); + list.add(new NetworkPorts.Allocation(19097, "config-sentinel", "hosts/mytesthost2/sentinel", "rpc")); + list.add(new NetworkPorts.Allocation(19098, "config-sentinel", "hosts/mytesthost2/sentinel", "http")); list.add(new NetworkPorts.Allocation(19099, "slobrok", "admin/slobrok.0", "rpc")); list.add(new NetworkPorts.Allocation(19100, "container", "container/container.0", "http/1")); list.add(new NetworkPorts.Allocation(19101, "container", "container/container.0", "messaging")); @@ -547,7 +548,7 @@ public class ApplicationRepositoryTest { AllocatedHosts info = session.getAllocatedHosts(); assertNotNull(info); assertThat(info.getHosts().size(), is(1)); - assertTrue(info.getHosts().contains(new HostSpec("mytesthost", + assertTrue(info.getHosts().contains(new HostSpec("mytesthost2", Collections.emptyList(), Optional.empty()))); Optional<NetworkPorts> portsCopy = info.getHosts().iterator().next().networkPorts(); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java index bf54c2b309e..4f6642610dd 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java @@ -8,12 +8,12 @@ import com.yahoo.config.provision.Zone; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; -import com.yahoo.vespa.config.server.rpc.RpcServer; import com.yahoo.vespa.config.server.rpc.RpcRequestHandlerProvider; +import com.yahoo.vespa.config.server.rpc.RpcServer; import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer; import com.yahoo.vespa.config.server.session.SessionPreparer; import com.yahoo.vespa.config.server.session.SessionTest; @@ -46,7 +46,6 @@ public class InjectedGlobalComponentRegistryTest { private RpcServer rpcServer; private ConfigDefinitionRepo defRepo; private PermanentApplicationPackage permanentApplicationPackage; - private HostRegistries hostRegistries; private GlobalComponentRegistry globalComponentRegistry; private ModelFactoryRegistry modelFactoryRegistry; private Zone zone; @@ -65,20 +64,21 @@ public class InjectedGlobalComponentRegistryTest { .configServerDBDir(temporaryFolder.newFolder("serverdb").getAbsolutePath()) .configDefinitionsDir(temporaryFolder.newFolder("configdefinitions").getAbsolutePath())); sessionPreparer = new SessionTest.MockSessionPreparer(); + HostRegistry hostRegistry = new HostRegistry(); rpcServer = new RpcServer(configserverConfig, null, Metrics.createTestMetrics(), - new HostRegistries(), new ConfigRequestHostLivenessTracker(), + hostRegistry, new ConfigRequestHostLivenessTracker(), new FileServer(temporaryFolder.newFolder("filereferences")), new NoopRpcAuthorizer(), new RpcRequestHandlerProvider()); - SuperModelGenerationCounter generationCounter = new SuperModelGenerationCounter(curator); defRepo = new StaticConfigDefinitionRepo(); permanentApplicationPackage = new PermanentApplicationPackage(configserverConfig); - hostRegistries = new HostRegistries(); HostProvisionerProvider hostProvisionerProvider = HostProvisionerProvider.withProvisioner(new MockProvisioner()); zone = Zone.defaultZone(); globalComponentRegistry = - new InjectedGlobalComponentRegistry(curator, configCurator, metrics, modelFactoryRegistry, sessionPreparer, rpcServer, configserverConfig, - generationCounter, defRepo, permanentApplicationPackage, hostRegistries, hostProvisionerProvider, zone, - new ConfigServerDB(configserverConfig), new InMemoryFlagSource(), new MockSecretStore()); + new InjectedGlobalComponentRegistry(curator, configCurator, metrics, modelFactoryRegistry, sessionPreparer, + rpcServer, configserverConfig, defRepo, permanentApplicationPackage, + hostProvisionerProvider, zone, + new ConfigServerDB(configserverConfig), new InMemoryFlagSource(), + new MockSecretStore(), hostRegistry); } @Test @@ -92,7 +92,6 @@ public class InjectedGlobalComponentRegistryTest { assertThat(globalComponentRegistry.getTenantListener().hashCode(), is(rpcServer.hashCode())); assertThat(globalComponentRegistry.getStaticConfigDefinitionRepo(), is(defRepo)); assertThat(globalComponentRegistry.getPermanentApplicationPackage(), is(permanentApplicationPackage)); - assertThat(globalComponentRegistry.getHostRegistries(), is(hostRegistries)); assertThat(globalComponentRegistry.getZone(), is (zone)); assertTrue(globalComponentRegistry.getHostProvisioner().isPresent()); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelControllerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelControllerTest.java index 965374f2aa4..c58bd6d6b0a 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelControllerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelControllerTest.java @@ -83,34 +83,6 @@ public class SuperModelControllerTest { } @Test - public void test_lb_config_multiple_apps_legacy_super_model() throws IOException, SAXException { - Map<ApplicationId, ApplicationInfo> models = new LinkedHashMap<>(); - TenantName t1 = TenantName.from("t1"); - TenantName t2 = TenantName.from("t2"); - File testApp1 = new File("src/test/resources/deploy/app"); - File testApp2 = new File("src/test/resources/deploy/advancedapp"); - File testApp3 = new File("src/test/resources/deploy/advancedapp"); - - ApplicationId simple = applicationId("mysimpleapp", t1); - ApplicationId advanced = applicationId("myadvancedapp", t1); - ApplicationId tooAdvanced = applicationId("minetooadvancedapp", t2); - models.put(simple, createApplicationInfo(testApp1, simple, 4L)); - models.put(advanced, createApplicationInfo(testApp2, advanced, 4L)); - models.put(tooAdvanced, createApplicationInfo(testApp3, tooAdvanced, 4L)); - - SuperModel superModel = new SuperModel(models, true); - SuperModelController han = new SuperModelController(new SuperModelConfigProvider(superModel, Zone.defaultZone(), new InMemoryFlagSource()), new TestConfigDefinitionRepo(), 2, new UncompressedConfigResponseFactory()); - LbServicesConfig.Builder lb = new LbServicesConfig.Builder(); - han.getSuperModel().getConfig(lb); - LbServicesConfig lbc = new LbServicesConfig(lb); - assertThat(lbc.tenants().size(), is(2)); - assertThat(lbc.tenants("t1").applications().size(), is(2)); - assertThat(lbc.tenants("t2").applications().size(), is(1)); - assertThat(lbc.tenants("t2").applications("minetooadvancedapp:prod:default:default").hosts().size(), is(1)); - assertQrServer(lbc.tenants("t2").applications("minetooadvancedapp:prod:default:default")); - } - - @Test public void test_lb_config_multiple_apps() throws IOException, SAXException { Map<ApplicationId, ApplicationInfo> models = new LinkedHashMap<>(); TenantName t1 = TenantName.from("t1"); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java b/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java index e6652c3c5e1..0221cf9abfc 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server; import com.yahoo.cloud.config.ConfigserverConfig; @@ -12,12 +12,12 @@ import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; import com.yahoo.vespa.config.server.application.TenantApplicationsTest; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.filedistribution.FileDistributionFactory; +import com.yahoo.vespa.config.server.filedistribution.MockFileDistributionFactory; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; -import com.yahoo.vespa.config.server.filedistribution.FileDistributionFactory; -import com.yahoo.vespa.config.server.filedistribution.MockFileDistributionFactory; import com.yahoo.vespa.config.server.session.SessionPreparer; import com.yahoo.vespa.config.server.tenant.MockTenantListener; import com.yahoo.vespa.config.server.tenant.TenantListener; @@ -50,7 +50,6 @@ public class TestComponentRegistry implements GlobalComponentRegistry { private final ReloadListener reloadListener; private final TenantListener tenantListener; private final PermanentApplicationPackage permanentApplicationPackage; - private final HostRegistries hostRegistries; private final FileDistributionFactory fileDistributionFactory; private final ModelFactoryRegistry modelFactoryRegistry; private final Optional<Provisioner> hostProvisioner; @@ -66,7 +65,6 @@ public class TestComponentRegistry implements GlobalComponentRegistry { ModelFactoryRegistry modelFactoryRegistry, PermanentApplicationPackage permanentApplicationPackage, FileDistributionFactory fileDistributionFactory, - HostRegistries hostRegistries, ConfigserverConfig configserverConfig, SessionPreparer sessionPreparer, Optional<Provisioner> hostProvisioner, @@ -85,7 +83,6 @@ public class TestComponentRegistry implements GlobalComponentRegistry { this.tenantListener = tenantListener; this.defRepo = defRepo; this.permanentApplicationPackage = permanentApplicationPackage; - this.hostRegistries = hostRegistries; this.fileDistributionFactory = fileDistributionFactory; this.modelFactoryRegistry = modelFactoryRegistry; this.hostProvisioner = hostProvisioner; @@ -112,7 +109,6 @@ public class TestComponentRegistry implements GlobalComponentRegistry { private ReloadListener reloadListener = new TenantApplicationsTest.MockReloadListener(); private final MockTenantListener tenantListener = new MockTenantListener(); private Optional<PermanentApplicationPackage> permanentApplicationPackage = Optional.empty(); - private final HostRegistries hostRegistries = new HostRegistries(); private final Optional<FileDistributionFactory> fileDistributionFactory = Optional.empty(); private ModelFactoryRegistry modelFactoryRegistry = new ModelFactoryRegistry(Collections.singletonList(new VespaModelFactory(new NullConfigModelRegistry()))); private Optional<Provisioner> hostProvisioner = Optional.empty(); @@ -188,7 +184,7 @@ public class TestComponentRegistry implements GlobalComponentRegistry { configserverConfig, defRepo, curator, zone, flagSource, secretStore); return new TestComponentRegistry(curator, ConfigCurator.create(curator), metrics, modelFactoryRegistry, - permApp, fileDistributionProvider, hostRegistries, configserverConfig, + permApp, fileDistributionProvider, configserverConfig, sessionPreparer, hostProvisioner, defRepo, reloadListener, tenantListener, zone, clock, secretStore, flagSource); } @@ -213,8 +209,6 @@ public class TestComponentRegistry implements GlobalComponentRegistry { @Override public PermanentApplicationPackage getPermanentApplicationPackage() { return permanentApplicationPackage; } @Override - public HostRegistries getHostRegistries() { return hostRegistries;} - @Override public ModelFactoryRegistry getModelFactoryRegistry() { return modelFactoryRegistry; } @Override public Optional<Provisioner> getHostProvisioner() { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java index 947308962d4..4543d3b5673 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java @@ -12,6 +12,7 @@ import com.yahoo.vespa.config.ConfigKey; import com.yahoo.vespa.config.server.ReloadListener; import com.yahoo.vespa.config.server.ServerCache; import com.yahoo.vespa.config.server.TestComponentRegistry; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.model.TestModelFactory; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; @@ -75,10 +76,11 @@ public class TenantApplicationsTest { .modelFactoryRegistry(createRegistry()) .reloadListener(listener) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + HostRegistry hostRegistry = new HostRegistry(); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, hostRegistry); tenantRepository.addTenant(TenantRepository.HOSTED_VESPA_TENANT); tenantRepository.addTenant(tenantName); - applications = TenantApplications.create(componentRegistry, tenantName); + applications = TenantApplications.create(componentRegistry, hostRegistry, tenantName); } @Test @@ -151,12 +153,12 @@ public class TenantApplicationsTest { } @Override - public void hostsUpdated(TenantName tenant, Collection<String> newHosts) { - tenantHosts.put(tenant.value(), newHosts); + public void hostsUpdated(ApplicationId applicationId, Collection<String> newHosts) { + tenantHosts.put(applicationId.tenant().value(), newHosts); } @Override - public void verifyHostsAreAvailable(TenantName tenant, Collection<String> newHosts) { + public void verifyHostsAreAvailable(ApplicationId applicationId, Collection<String> newHosts) { } @Override @@ -171,7 +173,7 @@ public class TenantApplicationsTest { @Test public void testListConfigs() throws IOException, SAXException { - applications = TenantApplications.create(componentRegistry, TenantName.defaultName()); + applications = TenantApplications.create(componentRegistry, new HostRegistry(), TenantName.defaultName()); assertdefaultAppNotFound(); VespaModel model = new VespaModel(FilesApplicationPackage.fromFile(new File("src/test/apps/app"))); @@ -206,7 +208,7 @@ public class TenantApplicationsTest { } private TenantApplications createZKAppRepo() { - return TenantApplications.create(componentRegistry, tenantName); + return TenantApplications.create(componentRegistry, new HostRegistry(), tenantName); } private static ApplicationId createApplicationId(String name) { 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 5b5f830c737..54d23652349 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 @@ -26,6 +26,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TimeoutBudget; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.v2.PrepareResult; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; @@ -289,7 +290,7 @@ public class DeployTester { .zone(zone); if (configserverConfig.hostedVespa()) testComponentRegistryBuilder.provisioner(provisioner); - TenantRepository tenantRepository = new TenantRepository(testComponentRegistryBuilder.build()); + TenantRepository tenantRepository = new TenantRepository(testComponentRegistryBuilder.build(), new HostRegistry()); tenantRepository.addTenant(tenantName); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() 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 63dfb1d01bd..173e9f3e148 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 @@ -1,37 +1,44 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.host; +import com.yahoo.config.provision.ApplicationId; +import org.junit.Test; + import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.junit.Test; - import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; /** * @author Ulf Lilleengen */ public class HostRegistryTest { + + private final ApplicationId foo = ApplicationId.from("foo", "app1", "default"); + private final ApplicationId bar = ApplicationId.from("bar", "app2", "default"); + @Test public void old_hosts_are_removed() { - HostRegistry<String> reg = new HostRegistry<>(); + HostRegistry reg = new HostRegistry(); assertNull(reg.getKeyForHost("foo.com")); - reg.update("fookey", List.of("foo.com", "bar.com", "baz.com")); - assertGetKey(reg, "foo.com", "fookey"); - assertGetKey(reg, "bar.com", "fookey"); - assertGetKey(reg, "baz.com", "fookey"); + 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); assertThat(reg.getAllHosts().size(), is(3)); - reg.update("fookey", List.of("bar.com", "baz.com")); + reg.update(foo, List.of("bar.com", "baz.com")); assertNull(reg.getKeyForHost("foo.com")); - assertGetKey(reg, "bar.com", "fookey"); - assertGetKey(reg, "baz.com", "fookey"); + assertGetKey(reg, "bar.com", foo); + assertGetKey(reg, "baz.com", foo); assertThat(reg.getAllHosts().size(), is(2)); assertThat(reg.getAllHosts(), contains("bar.com", "baz.com")); - reg.removeHostsForKey("fookey"); + reg.removeHostsForKey(foo); assertThat(reg.getAllHosts().size(), is(0)); assertNull(reg.getKeyForHost("foo.com")); assertNull(reg.getKeyForHost("bar.com")); @@ -39,51 +46,51 @@ public class HostRegistryTest { @Test public void multiple_keys_are_handled() { - HostRegistry<String> reg = new HostRegistry<>(); - reg.update("fookey", List.of("foo.com", "bar.com")); - reg.update("barkey", List.of("baz.com", "quux.com")); - assertGetKey(reg, "foo.com", "fookey"); - assertGetKey(reg, "bar.com", "fookey"); - assertGetKey(reg, "baz.com", "barkey"); - assertGetKey(reg, "quux.com", "barkey"); + HostRegistry reg = new HostRegistry(); + reg.update(foo, List.of("foo.com", "bar.com")); + reg.update(bar, List.of("baz.com", "quux.com")); + assertGetKey(reg, "foo.com", foo); + assertGetKey(reg, "bar.com", foo); + assertGetKey(reg, "baz.com", bar); + assertGetKey(reg, "quux.com", bar); } @Test(expected = IllegalArgumentException.class) public void keys_cannot_overlap() { - HostRegistry<String> reg = new HostRegistry<>(); - reg.update("fookey", List.of("foo.com", "bar.com")); - reg.update("barkey", List.of("bar.com", "baz.com")); + HostRegistry reg = new HostRegistry(); + reg.update(foo, List.of("foo.com", "bar.com")); + reg.update(bar, List.of("bar.com", "baz.com")); } @Test public void all_hosts_are_returned() { - HostRegistry<String> reg = new HostRegistry<>(); - reg.update("fookey", List.of("foo.com", "bar.com")); - reg.update("barkey", List.of("baz.com", "quux.com")); + HostRegistry reg = new HostRegistry(); + reg.update(foo, List.of("foo.com", "bar.com")); + reg.update(bar, List.of("baz.com", "quux.com")); assertThat(reg.getAllHosts().size(), is(4)); } @Test public void ensure_that_collection_is_copied() { - HostRegistry<String> reg = new HostRegistry<>(); + HostRegistry reg = new HostRegistry(); List<String> hosts = new ArrayList<>(List.of("foo.com", "bar.com", "baz.com")); - reg.update("fookey", hosts); - assertThat(reg.getHostsForKey("fookey").size(), is(3)); + reg.update(foo, hosts); + assertThat(reg.getHostsForKey(foo).size(), is(3)); hosts.remove(2); - assertThat(reg.getHostsForKey("fookey").size(), is(3)); + assertThat(reg.getHostsForKey(foo).size(), is(3)); } @Test public void ensure_that_underlying_hosts_do_not_change() { - HostRegistry<String> reg = new HostRegistry<>(); - reg.update("fookey", List.of("foo.com", "bar.com", "baz.com")); + HostRegistry reg = new HostRegistry(); + reg.update(foo, List.of("foo.com", "bar.com", "baz.com")); Collection<String> hosts = reg.getAllHosts(); assertThat(hosts.size(), is(3)); - reg.update("fookey", List.of("foo.com")); + reg.update(foo, List.of("foo.com")); assertThat(hosts.size(), is(3)); } - private void assertGetKey(HostRegistry<String> reg, String host, String expectedKey) { + private void assertGetKey(HostRegistry reg, String host, ApplicationId expectedKey) { assertNotNull(reg.getKeyForHost(host)); assertThat(reg.getKeyForHost(host), is(expectedKey)); } 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 9b6ced7f0f6..6c5e25d0503 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.TenantRepository; import org.junit.Before; @@ -58,7 +59,7 @@ public class HttpGetConfigHandlerTest { .configDefinitionRepo(new TestConfigDefinitionRepo()) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenant); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 203b70c2f85..b55b250fc1c 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 @@ -12,6 +12,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HttpListConfigsHandler.ListConfigsResponse; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -63,7 +64,7 @@ public class HttpListConfigsHandlerTest { .configDefinitionRepo(new TestConfigDefinitionRepo()) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenant); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 126dfe88141..06bac6497a2 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 @@ -12,6 +12,7 @@ import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.ContentHandlerTestBase; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.session.Session; @@ -36,14 +37,12 @@ import static org.junit.Assert.assertThat; public class ApplicationContentHandlerTest extends ContentHandlerTestBase { private static final File testApp = new File("src/test/apps/content"); - private static final File testApp2 = new File("src/test/apps/content2"); private final TenantName tenantName1 = TenantName.from("mofet"); private final TenantName tenantName2 = TenantName.from("bla"); private final String baseServer = "http://foo:1337"; private final ApplicationId appId1 = new ApplicationId.Builder().tenant(tenantName1).applicationName("foo").instanceName("quux").build(); - private final ApplicationId appId2 = new ApplicationId.Builder().tenant(tenantName2).applicationName("foo").instanceName("quux").build(); private ApplicationRepository applicationRepository; private ApplicationHandler handler; @@ -64,7 +63,7 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { .build(); Clock clock = componentRegistry.getClock(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenantName1); tenantRepository.addTenant(tenantName2); @@ -77,8 +76,6 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { .build(); applicationRepository.deploy(testApp, prepareParams(appId1)); - applicationRepository.deploy(testApp2, prepareParams(appId2)); - handler = new ApplicationHandler(ApplicationHandler.testOnlyContext(), Zone.defaultZone(), applicationRepository); @@ -113,14 +110,6 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { } @Test - public void require_that_multiple_tenants_are_handled() throws IOException { - assertContent("/test.txt", "foo\n"); - pathPrefix = createPath(appId2, Zone.defaultZone()); - baseUrl = baseServer + pathPrefix; - assertContent("/test.txt", "bar\n"); - } - - @Test public void require_that_get_does_not_set_write_flag() throws IOException { Tenant tenant1 = applicationRepository.getTenant(appId1); Session session = applicationRepository.getActiveLocalSession(tenant1, appId1); 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 a0c63c8bba1..f9b33791a36 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 @@ -26,6 +26,7 @@ import com.yahoo.vespa.config.server.application.ClusterReindexing.Status; import com.yahoo.vespa.config.server.application.HttpProxy; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.deploy.DeployTester; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.SessionHandlerTest; @@ -76,6 +77,7 @@ import static org.mockito.Mockito.when; public class ApplicationHandlerTest { private static final File testApp = new File("src/test/apps/app"); + private static final File testAppJdiscOnly = new File("src/test/apps/app-jdisc-only"); private final static TenantName mytenantName = TenantName.from("mytenant"); private final static ApplicationId myTenantApplicationId = ApplicationId.from(mytenantName, ApplicationName.defaultName(), InstanceName.defaultName()); @@ -108,7 +110,7 @@ public class ApplicationHandlerTest { .configServerConfig(configserverConfig) .clock(clock) .build(); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(mytenantName); provisioner = new MockProvisioner(); orchestrator = new OrchestratorMock(); @@ -150,7 +152,7 @@ public class ApplicationHandlerTest { .instanceName("quux") .build(); PrepareParams prepareParams2 = new PrepareParams.Builder().applicationId(fooId).build(); - applicationRepository.deploy(testApp, prepareParams2); + applicationRepository.deploy(testAppJdiscOnly, prepareParams2); assertApplicationExists(fooId, Zone.defaultZone()); deleteAndAssertOKResponseMocked(fooId, true); 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 0b5c5d3d4da..6ef1a0b63cd 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 @@ -14,6 +14,7 @@ import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.session.PrepareParams; @@ -56,7 +57,7 @@ public class HostHandlerTest { .zone(zone) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(mytenant); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 f3703c5397d..68cd474412f 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 @@ -13,6 +13,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpConfigRequest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; @@ -66,7 +67,7 @@ public class HttpGetConfigHandlerTest { .configDefinitionRepo(new TestConfigDefinitionRepo()) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenant); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 c1c9874c35c..985a88ceed2 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 @@ -15,6 +15,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.v2.HttpListConfigsHandler.ListConfigsResponse; @@ -70,7 +71,7 @@ public class HttpListConfigsHandlerTest { .configDefinitionRepo(new TestConfigDefinitionRepo()) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenant); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java index 80a0b9edba6..232243c2b74 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java @@ -12,6 +12,7 @@ import com.yahoo.jdisc.Response; import com.yahoo.jdisc.http.HttpRequest.Method; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.TenantApplications; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.SessionHandlerTest; import com.yahoo.vespa.config.server.tenant.TenantRepository; import org.junit.Before; @@ -41,7 +42,7 @@ public class ListApplicationsHandlerTest { @Before public void setup() { - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(mytenant); tenantRepository.addTenant(foobar); applicationRepo = tenantRepository.getTenant(mytenant).getApplicationRepo(); 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 23b711adc02..8e9ef42352c 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 @@ -15,6 +15,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TimeoutBudget; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.model.TestModelFactory; @@ -79,7 +80,7 @@ public class SessionActiveHandlerTest { .modelFactoryRegistry(new ModelFactoryRegistry(List.of((modelFactory)))) .configServerConfig(configserverConfig) .build(); - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenantName); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 4f9b656dfb1..ce086cbfb15 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 @@ -14,6 +14,7 @@ import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.ContentHandlerTestBase; import com.yahoo.vespa.config.server.http.SessionHandlerTest; import com.yahoo.vespa.config.server.session.PrepareParams; @@ -60,7 +61,7 @@ public class SessionContentHandlerTest extends ContentHandlerTestBase { .configServerConfig(configserverConfig) .build(); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenantName); ApplicationRepository applicationRepository = new ApplicationRepository.Builder() 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 84feecec669..7efd448c3ed 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.CompressedApplicationInputStreamTest; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.SessionHandlerTest; import com.yahoo.vespa.config.server.session.Session; @@ -62,7 +63,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest { @Before public void setupRepo() { - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) .withProvisioner(new MockProvisioner()) 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 d24faa1b433..ed65d8294b8 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 @@ -19,6 +19,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TimeoutBudget; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.SessionHandler; import com.yahoo.vespa.config.server.http.SessionHandlerTest; @@ -81,7 +82,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest { .build(); Clock clock = componentRegistry.getClock(); timeoutBudget = new TimeoutBudget(clock, Duration.ofSeconds(10)); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); tenantRepository.addTenant(tenant); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 3d1d2f95e88..a8cc989c802 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 @@ -19,6 +19,7 @@ import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -56,7 +57,8 @@ public class TenantHandlerTest { tenantRepository = new TenantRepository(new TestComponentRegistry.Builder() .curator(new MockCurator()) .configServerConfig(configserverConfig) - .build()); + .build(), + new HostRegistry()); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) 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 1f93f1ce6fe..1d8f60bb683 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.deploy.DeployTester; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -46,7 +47,7 @@ class MaintainerTester { .provisioner(provisioner) .modelFactoryRegistry(new ModelFactoryRegistry(List.of(new DeployTester.CountingModelFactory(clock)))) .build(); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) .withProvisioner(provisioner) diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java index 9bd7a25faf2..a072bf62852 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java @@ -56,7 +56,8 @@ public class TenantsMaintainerTest { assertNotNull(tenantRepository.getTenant(TenantName.defaultName())); assertNotNull(tenantRepository.getTenant(TenantRepository.HOSTED_VESPA_TENANT)); - // Add tenant again and deploy + // Delete app, add tenant again and deploy + tester.applicationRepository().delete(applicationId(shouldNotBeDeleted)); tenantRepository.addTenant(shouldBeDeleted); tester.deployApp(applicationPackage, prepareParams(shouldBeDeleted)); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java index 7f4733f0b7c..997633eeb53 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.rpc; import com.yahoo.cloud.config.ConfigserverConfig; @@ -8,7 +8,7 @@ import com.yahoo.vespa.config.protocol.JRTServerConfigRequest; import com.yahoo.vespa.config.server.GetConfigContext; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer; @@ -37,7 +37,7 @@ public class MockRpcServer extends RpcServer { super(createConfig(port), null, Metrics.createTestMetrics(), - new HostRegistries(), + new HostRegistry(), new ConfigRequestHostLivenessTracker(), new FileServer(tempDir), new NoopRpcAuthorizer(), diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcServerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcServerTest.java index 735eae2700f..5a41eff3cc9 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcServerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcServerTest.java @@ -64,31 +64,19 @@ public class RpcServerTest { try (RpcTester tester = new RpcTester(applicationId, temporaryFolder)) { ApplicationRepository applicationRepository = tester.applicationRepository(); applicationRepository.deploy(testApp, new PrepareParams.Builder().applicationId(applicationId).build()); - TenantApplications applicationRepo = tester.tenant().getApplicationRepo(); - RemoteSession activeSession = applicationRepository.getActiveRemoteSession(applicationId); - ApplicationSet applicationSet = tester.tenant().getSessionRepository().ensureApplicationLoaded(activeSession); - applicationRepo.activateApplication(applicationSet, activeSession.getSessionId()); testPrintStatistics(tester); testGetConfig(tester); testEnabled(tester); testApplicationNotLoadedErrorWhenAppDeleted(tester); - testEmptySentinelConfigWhenAppDeletedOnHostedVespa(); } } - private void testApplicationNotLoadedErrorWhenAppDeleted(RpcTester tester) throws InterruptedException, IOException { - tester.rpcServer().onTenantDelete(tenantName); - tester.rpcServer().onTenantsLoaded(); + private void testApplicationNotLoadedErrorWhenAppDeleted(RpcTester tester) { + tester.applicationRepository().delete(applicationId); JRTClientConfigRequest clientReq = createSimpleRequest(); tester.performRequest(clientReq.getRequest()); assertFalse(clientReq.validateResponse()); assertThat(clientReq.errorCode(), is(ErrorCode.APPLICATION_NOT_LOADED)); - tester.stopRpc(); - tester.createAndStartRpcServer(); - tester.rpcServer().onTenantsLoaded(); - clientReq = createSimpleRequest(); - tester.performRequest(clientReq.getRequest()); - assertTrue(clientReq.validateResponse()); } @Test 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 2b2ed13fcfe..06c224b5a09 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,7 +12,6 @@ import com.yahoo.jrt.Supervisor; import com.yahoo.jrt.Transport; import com.yahoo.net.HostName; import com.yahoo.test.ManualClock; -import com.yahoo.vespa.config.GenerationCounter; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.MemoryGenerationCounter; import com.yahoo.vespa.config.server.MockProvisioner; @@ -24,7 +23,7 @@ import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; -import com.yahoo.vespa.config.server.host.HostRegistries; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer; import com.yahoo.vespa.config.server.tenant.Tenant; @@ -55,15 +54,15 @@ public class RpcTester implements AutoCloseable { private final ManualClock clock = new ManualClock(Instant.ofEpochMilli(100)); private final String myHostname = HostName.getLocalhost(); private final HostLivenessTracker hostLivenessTracker = new ConfigRequestHostLivenessTracker(clock); - private final GenerationCounter generationCounter; private final Spec spec; - private RpcServer rpcServer; + private final RpcServer rpcServer; private Thread t; private Supervisor sup; private final ApplicationId applicationId; private final TenantName tenantName; private final TenantRepository tenantRepository; + private final HostRegistry hostRegistry = new HostRegistry(); private final ApplicationRepository applicationRepository; private final List<Integer> allocatedPorts = new ArrayList<>(); @@ -85,23 +84,26 @@ public class RpcTester implements AutoCloseable { .configDefinitionsDir(temporaryFolder.newFolder().getAbsolutePath()) .fileReferencesDir(temporaryFolder.newFolder().getAbsolutePath()); configserverConfig = new ConfigserverConfig(configBuilder); + rpcServer = createRpcServer(configserverConfig); TestComponentRegistry componentRegistry = new TestComponentRegistry.Builder() .configDefinitionRepo(new TestConfigDefinitionRepo()) .configServerConfig(configserverConfig) + .reloadListener(rpcServer) .build(); - tenantRepository = new TenantRepository(componentRegistry); + tenantRepository = new TenantRepository(componentRegistry, hostRegistry); tenantRepository.addTenant(tenantName); + startRpcServer(); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) + .withConfigserverConfig(configserverConfig) .withProvisioner(new MockProvisioner()) .withOrchestrator(new OrchestratorMock()) .build(); - generationCounter = new MemoryGenerationCounter(); - createAndStartRpcServer(); assertFalse(hostLivenessTracker.lastRequestFrom(myHostname).isPresent()); } public void close() { + rpcServer.stop(); for (Integer port : allocatedPorts) { PortRangeAllocator.releasePort(port); } @@ -113,24 +115,25 @@ public class RpcTester implements AutoCloseable { return port; } - void createAndStartRpcServer() throws IOException { - HostRegistries hostRegistries = new HostRegistries(); - hostRegistries.createApplicationHostRegistry(tenantName).update(applicationId, List.of("localhost")); - hostRegistries.getTenantHostRegistry().update(tenantName, List.of("localhost")); - rpcServer = new RpcServer(configserverConfig, - new SuperModelRequestHandler(new TestConfigDefinitionRepo(), - configserverConfig, - new SuperModelManager( - configserverConfig, - Zone.defaultZone() , - generationCounter, - new InMemoryFlagSource())), - Metrics.createTestMetrics(), - hostRegistries, - hostLivenessTracker, - new FileServer(temporaryFolder.newFolder()), - new NoopRpcAuthorizer(), - new RpcRequestHandlerProvider()); + RpcServer createRpcServer(ConfigserverConfig config) throws IOException { + return new RpcServer(config, + new SuperModelRequestHandler(new TestConfigDefinitionRepo(), + configserverConfig, + new SuperModelManager( + config, + Zone.defaultZone(), + new MemoryGenerationCounter(), + new InMemoryFlagSource())), + Metrics.createTestMetrics(), + hostRegistry, + hostLivenessTracker, + new FileServer(temporaryFolder.newFolder()), + new NoopRpcAuthorizer(), + new RpcRequestHandlerProvider()); + } + + void startRpcServer() { + hostRegistry.update(applicationId, List.of("localhost")); rpcServer.onTenantCreate(tenantRepository.getTenant(tenantName)); t = new Thread(rpcServer); t.start(); @@ -165,7 +168,7 @@ public class RpcTester implements AutoCloseable { void performRequest(Request req) { clock.advance(Duration.ofMillis(10)); - sup.connect(spec).invokeSync(req, 120.0); + sup.connect(spec).invokeSync(req, 10.0); if (req.methodName().equals(RpcServer.getConfigMethodName)) assertEquals(clock.instant(), hostLivenessTracker.lastRequestFrom(myHostname).get()); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizerTest.java index 9e1edb35b8f..12debc347de 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/security/MultiTenantRpcAuthorizerTest.java @@ -7,7 +7,6 @@ import com.yahoo.config.FileReference; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.security.NodeIdentifier; import com.yahoo.config.provision.security.NodeIdentifierException; import com.yahoo.config.provision.security.NodeIdentity; @@ -66,7 +65,7 @@ public class MultiTenantRpcAuthorizerTest { @Test public void configserver_can_access_files_and_config() throws InterruptedException, ExecutionException { RpcAuthorizer authorizer = createAuthorizer(new NodeIdentity.Builder(NodeType.config).build(), - new HostRegistry<>()); + new HostRegistry()); Request configRequest = createConfigRequest(new ConfigKey<>("name", "configid", "namespace"), HOSTNAME); authorizer.authorizeConfigRequest(configRequest) @@ -83,8 +82,8 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(APPLICATION_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); - hostRegistry.update(APPLICATION_ID.tenant(), List.of(HOSTNAME.value())); + HostRegistry hostRegistry = new HostRegistry(); + hostRegistry.update(APPLICATION_ID, List.of(HOSTNAME.value())); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -99,7 +98,7 @@ public class MultiTenantRpcAuthorizerTest { @Test public void proxy_node_can_access_lbservice_config() throws ExecutionException, InterruptedException { - RpcAuthorizer authorizer = createAuthorizer(new NodeIdentity.Builder(NodeType.proxy).build(), new HostRegistry<>()); + RpcAuthorizer authorizer = createAuthorizer(new NodeIdentity.Builder(NodeType.proxy).build(), new HostRegistry()); Request configRequest = createConfigRequest( new ConfigKey<>(LbServicesConfig.CONFIG_DEF_NAME, "*", LbServicesConfig.CONFIG_DEF_NAMESPACE), @@ -110,7 +109,7 @@ public class MultiTenantRpcAuthorizerTest { @Test public void tenant_node_cannot_access_lbservice_config() throws ExecutionException, InterruptedException { - RpcAuthorizer authorizer = createAuthorizer(new NodeIdentity.Builder(NodeType.tenant).build(), new HostRegistry<>()); + RpcAuthorizer authorizer = createAuthorizer(new NodeIdentity.Builder(NodeType.tenant).build(), new HostRegistry()); Request configRequest = createConfigRequest( new ConfigKey<>(LbServicesConfig.CONFIG_DEF_NAME, "*", LbServicesConfig.CONFIG_DEF_NAMESPACE), @@ -129,8 +128,8 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(APPLICATION_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); - hostRegistry.update(APPLICATION_ID.tenant(), List.of(HOSTNAME.value())); + HostRegistry hostRegistry = new HostRegistry(); + hostRegistry.update(APPLICATION_ID, List.of(HOSTNAME.value())); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -149,8 +148,8 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(EVIL_APP_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); - hostRegistry.update(APPLICATION_ID.tenant(), List.of(HOSTNAME.value())); + HostRegistry hostRegistry = new HostRegistry(); + hostRegistry.update(APPLICATION_ID, List.of(HOSTNAME.value())); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -169,7 +168,7 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(EVIL_APP_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); + HostRegistry hostRegistry = new HostRegistry(); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -188,8 +187,8 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(EVIL_APP_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); - hostRegistry.update(EVIL_APP_ID.tenant(), List.of(HOSTNAME.value())); + HostRegistry hostRegistry = new HostRegistry(); + hostRegistry.update(EVIL_APP_ID, List.of(HOSTNAME.value())); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -208,7 +207,7 @@ public class MultiTenantRpcAuthorizerTest { .applicationId(APPLICATION_ID) .build(); - HostRegistry<TenantName> hostRegistry = new HostRegistry<>(); + HostRegistry hostRegistry = new HostRegistry(); RpcAuthorizer authorizer = createAuthorizer(identity, hostRegistry); @@ -219,7 +218,7 @@ public class MultiTenantRpcAuthorizerTest { } - private static RpcAuthorizer createAuthorizer(NodeIdentity identity, HostRegistry<TenantName> hostRegistry) { + private static RpcAuthorizer createAuthorizer(NodeIdentity identity, HostRegistry hostRegistry) { return new MultiTenantRpcAuthorizer( new StaticNodeIdentifier(identity), hostRegistry, 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 76958264d84..90d3bddc88d 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 @@ -187,7 +187,7 @@ public class SessionPreparerTest { @Test(expected = InvalidApplicationException.class) public void require_exception_for_overlapping_host() throws IOException { FilesApplicationPackage app = getApplicationPackage(testApp); - HostRegistry<ApplicationId> hostValidator = new HostRegistry<>(); + HostRegistry hostValidator = new HostRegistry(); hostValidator.update(applicationId("foo"), Collections.singletonList("mytesthost")); preparer.prepare(hostValidator, new BaseDeployLogger(), new PrepareParams.Builder().applicationId(applicationId("default")).build(), Optional.empty(), Instant.now(), app.getAppDir(), app, createSessionZooKeeperClient()); @@ -200,7 +200,7 @@ public class SessionPreparerTest { if (level.equals(Level.WARNING) && message.contains("The host mytesthost is already in use")) logged.append("ok"); }; FilesApplicationPackage app = getApplicationPackage(testApp); - HostRegistry<ApplicationId> hostValidator = new HostRegistry<>(); + HostRegistry hostValidator = new HostRegistry(); ApplicationId applicationId = applicationId(); hostValidator.update(applicationId, Collections.singletonList("mytesthost")); preparer.prepare(hostValidator, logger, new PrepareParams.Builder().applicationId(applicationId).build(), @@ -367,7 +367,7 @@ public class SessionPreparerTest { private PrepareResult prepare(File app, PrepareParams params, long sessionId) throws IOException { FilesApplicationPackage applicationPackage = getApplicationPackage(app); - return preparer.prepare(new HostRegistry<>(), getLogger(), params, + return preparer.prepare(new HostRegistry(), getLogger(), params, Optional.empty(), Instant.now(), applicationPackage.getAppDir(), applicationPackage, createSessionZooKeeperClient(sessionId)); } 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 bfcfc7d6e43..b2cfd7015ba 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 @@ -20,6 +20,7 @@ import com.yahoo.vespa.config.server.MockProvisioner; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.application.OrchestratorMock; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.http.InvalidApplicationException; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -60,6 +61,7 @@ public class SessionRepositoryTest { private static final TenantName tenantName = TenantName.defaultName(); private static final ApplicationId applicationId = ApplicationId.from(tenantName.value(), "testApp", "default"); private static final File testApp = new File("src/test/apps/app"); + private static final File appJdiscOnly = new File("src/test/apps/app-jdisc-only"); private MockCurator curator; private TenantRepository tenantRepository; @@ -90,7 +92,7 @@ public class SessionRepositoryTest { .build()) .flagSource(flagSource) .build(); - tenantRepository = new TenantRepository(globalComponentRegistry); + tenantRepository = new TenantRepository(globalComponentRegistry, new HostRegistry()); tenantRepository.addTenant(SessionRepositoryTest.tenantName); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) @@ -135,7 +137,7 @@ public class SessionRepositoryTest { // tenant is "newTenant" TenantName newTenant = TenantName.from("newTenant"); tenantRepository.addTenant(newTenant); - long sessionId = deploy(ApplicationId.from(newTenant.value(), "testapp", "default")); + long sessionId = deploy(ApplicationId.from(newTenant.value(), "testapp", "default"), appJdiscOnly); SessionRepository sessionRepository2 = tenantRepository.getTenant(newTenant).getSessionRepository(); assertNotNull(sessionRepository2.getLocalSession(sessionId)); } 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 4900c50f1d7..dbc352128f5 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 @@ -19,6 +19,7 @@ import com.yahoo.vespa.config.server.application.Application; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.application.TenantApplicationsTest; +import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; @@ -66,7 +67,7 @@ public class TenantRepositoryTest { listener = (TenantApplicationsTest.MockReloadListener)globalComponentRegistry.getReloadListener(); tenantListener = (MockTenantListener)globalComponentRegistry.getTenantListener(); assertFalse(tenantListener.tenantsLoaded); - tenantRepository = new TenantRepository(globalComponentRegistry); + tenantRepository = new TenantRepository(globalComponentRegistry, new HostRegistry()); assertTrue(tenantListener.tenantsLoaded); tenantRepository.addTenant(tenant1); tenantRepository.addTenant(tenant2); @@ -201,7 +202,7 @@ public class TenantRepositoryTest { private static class FailingDuringBootstrapTenantRepository extends TenantRepository { public FailingDuringBootstrapTenantRepository(GlobalComponentRegistry globalComponentRegistry) { - super(globalComponentRegistry); + super(globalComponentRegistry, new HostRegistry()); } @Override diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantTest.java index ac596198fe5..1b754ca6695 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantTest.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.config.server.tenant; import com.google.common.testing.EqualsTester; import com.yahoo.config.provision.TenantName; import com.yahoo.vespa.config.server.TestComponentRegistry; +import com.yahoo.vespa.config.server.host.HostRegistry; import org.junit.Before; import org.junit.Test; @@ -32,7 +33,7 @@ public class TenantTest { } private Tenant createTenant(String name) { - TenantRepository tenantRepository = new TenantRepository(componentRegistry); + TenantRepository tenantRepository = new TenantRepository(componentRegistry, new HostRegistry()); TenantName tenantName = TenantName.from(name); tenantRepository.addTenant(tenantName); return tenantRepository.getTenant(tenantName); diff --git a/configserver/src/test/resources/deploy/advancedapp/services.xml b/configserver/src/test/resources/deploy/advancedapp/services.xml index e3d5aea585b..b8e93b14317 100644 --- a/configserver/src/test/resources/deploy/advancedapp/services.xml +++ b/configserver/src/test/resources/deploy/advancedapp/services.xml @@ -22,7 +22,7 @@ <documents> <document type="keyvalue" mode="index"/> </documents> - <nodes>> + <nodes> <node hostalias="node1" distribution-key="0"/> </nodes> </content> |