diff options
author | gjoranv <gjoranv@gmail.com> | 2017-04-07 13:11:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-07 13:11:49 +0200 |
commit | bde2604037eee583a9e1d21e0f2c352f206816c6 (patch) | |
tree | 5aef61697dc0aaf7a867784b59b410e7cad9c44e | |
parent | fc61c8f114f2d1dd7938afd6831a9f1c0a05e8e1 (diff) | |
parent | aeacb51b8c54b0cc5685983b56510b190efb8158 (diff) |
Merge pull request #2167 from yahoo/gjoranv/add-flavor-to-zk-app
Gjoranv/add flavor to zk app
16 files changed, 146 insertions, 47 deletions
diff --git a/config-application-package/pom.xml b/config-application-package/pom.xml index 7f49e9fb8b6..3e1bdd20936 100644 --- a/config-application-package/pom.xml +++ b/config-application-package/pom.xml @@ -92,6 +92,12 @@ <artifactId>jackson-databind</artifactId> </dependency> <dependency> + <groupId>com.yahoo.vespa</groupId> + <artifactId>configdefinitions</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java index 920759d3b83..b9698c21da0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java @@ -13,6 +13,7 @@ import com.yahoo.config.provision.ProvisionLogger; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -187,13 +188,11 @@ public class HostSystem extends AbstractConfigProducer<Host> { } Set<HostSpec> getSingleTenantHosts() { - LinkedHashSet<HostSpec> hostSpecs = new LinkedHashSet<>(); - for (HostResource host: hostname2host.values()) { - if (! host.getHost().isMultitenant()) { - hostSpecs.add(new HostSpec(host.getHostName(), host.primaryClusterMembership())); - } - } - return hostSpecs; + return hostname2host.values().stream() + .filter(host -> ! host.getHost().isMultitenant()) + .map(host -> new HostSpec(host.getHostName(), Collections.emptyList(), + host.getFlavor(), host.primaryClusterMembership())) + .collect(Collectors.toCollection(LinkedHashSet::new)); } /** A provision logger which forwards to a deploy logger */ diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java index e903332bd6f..c5ccb7d2f58 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java @@ -23,6 +23,7 @@ public class ProvisionInfo { private static final String hostSpecKey = "hostSpec"; private static final String hostSpecHostName = "hostName"; private static final String hostSpecMembership = "membership"; + private static final String hostSpecFlavor = "flavor"; private static final String dockerImage = "dockerImage"; private final Set<HostSpec> hosts = new LinkedHashSet<>(); @@ -50,29 +51,33 @@ public class ProvisionInfo { if (host.membership().get().cluster().dockerImage().isPresent()) cursor.setString(dockerImage, host.membership().get().cluster().dockerImage().get()); } + if (host.flavor().isPresent()) + cursor.setString(hostSpecFlavor, host.flavor().get().name()); } public Set<HostSpec> getHosts() { return Collections.unmodifiableSet(hosts); } - private static ProvisionInfo fromSlime(Inspector inspector) { + private static ProvisionInfo fromSlime(Inspector inspector, Optional<NodeFlavors> nodeFlavors) { Inspector array = inspector.field(mappingKey); final Set<HostSpec> hosts = new LinkedHashSet<>(); array.traverse(new ArrayTraverser() { @Override public void entry(int i, Inspector inspector) { - hosts.add(createHostSpec(inspector.field(hostSpecKey))); + hosts.add(createHostSpec(inspector.field(hostSpecKey), nodeFlavors)); } }); return new ProvisionInfo(hosts); } - private static HostSpec createHostSpec(Inspector object) { + private static HostSpec createHostSpec(Inspector object, Optional<NodeFlavors> nodeFlavors) { Optional<ClusterMembership> membership = - object.field(hostSpecMembership).valid() ? Optional.of(readMembership(object)) : Optional.empty(); - HostSpec h = new HostSpec(object.field(hostSpecHostName).asString(), Collections.emptyList(), Optional.empty(), membership); - return h; + object.field(hostSpecMembership).valid() ? Optional.of(readMembership(object)) : Optional.empty(); + Optional<Flavor> flavor = + object.field(hostSpecFlavor).valid() ? readFlavor(object, nodeFlavors) : Optional.empty(); + + return new HostSpec(object.field(hostSpecHostName).asString(),Collections.emptyList(), flavor, membership); } private static ClusterMembership readMembership(Inspector object) { @@ -80,14 +85,19 @@ public class ProvisionInfo { object.field(dockerImage).valid() ? Optional.of(object.field(dockerImage).asString()) : Optional.empty()); } + private static Optional<Flavor> readFlavor(Inspector object, Optional<NodeFlavors> nodeFlavors) { + return nodeFlavors.map(flavorMapper -> flavorMapper.getFlavor(object.field(hostSpecFlavor).asString())) + .orElse(Optional.empty()); + } + public byte[] toJson() throws IOException { Slime slime = new Slime(); toSlime(slime.setObject()); return SlimeUtils.toJsonBytes(slime); } - public static ProvisionInfo fromJson(byte[] json) { - return fromSlime(SlimeUtils.jsonToSlime(json).get()); + public static ProvisionInfo fromJson(byte[] json, Optional<NodeFlavors> nodeFlavors) { + return fromSlime(SlimeUtils.jsonToSlime(json).get(), nodeFlavors); } public ProvisionInfo merge(ProvisionInfo provisionInfo) { diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java index 6ff26d0aad7..6559e08d3ed 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java @@ -20,11 +20,15 @@ public class Zone { private final RegionName region; private final SystemName systemName; private final FlavorDefaults flavorDefaults; + private final Optional<NodeFlavors> nodeFlavors; @Inject - public Zone(ConfigserverConfig configserverConfig) { - this(SystemName.from(configserverConfig.system()), Environment.from(configserverConfig.environment()), - RegionName.from(configserverConfig.region()), new FlavorDefaults(configserverConfig)); + public Zone(ConfigserverConfig configserverConfig, NodeFlavors nodeFlavors) { + this(SystemName.from(configserverConfig.system()), + Environment.from(configserverConfig.environment()), + RegionName.from(configserverConfig.region()), + new FlavorDefaults(configserverConfig), + nodeFlavors); } /** Create from environment and region */ @@ -39,14 +43,19 @@ public class Zone { /** Create from environment and region. Useful for testing. */ public Zone(SystemName system, Environment environment, RegionName region, String defaultFlavor) { - this(system, environment, region, new FlavorDefaults(defaultFlavor)); + this(system, environment, region, new FlavorDefaults(defaultFlavor), null); } - private Zone(SystemName systemName, Environment environment, RegionName region, FlavorDefaults flavorDefaults) { + private Zone(SystemName systemName, + Environment environment, + RegionName region, + FlavorDefaults flavorDefaults, + NodeFlavors nodeFlavors) { this.environment = environment; this.region = region; this.flavorDefaults = flavorDefaults; this.systemName = systemName; + this.nodeFlavors = Optional.ofNullable(nodeFlavors); } /** Returns the current environment */ @@ -61,6 +70,9 @@ public class Zone { /** Returns the default hardware flavor to assign in this zone */ public String defaultFlavor(ClusterSpec.Type clusterType) { return flavorDefaults.flavor(clusterType); } + /** Returns all available node flavors for the zone, or empty if not set for this Zone. */ + public Optional<NodeFlavors> nodeFlavors() { return nodeFlavors; } + /** Do not use */ public static Zone defaultZone() { return new Zone(SystemName.defaultSystem(), Environment.defaultEnvironment(), RegionName.defaultName()); diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java index 52b4f6853b8..a6ccdb8536f 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java @@ -49,7 +49,7 @@ public class ProvisionInfoTest { } private void assertProvisionInfo(ProvisionInfo info) throws IOException { - ProvisionInfo serializedInfo = ProvisionInfo.fromJson(info.toJson()); + ProvisionInfo serializedInfo = ProvisionInfo.fromJson(info.toJson(), Optional.empty()); assertEquals(info.getHosts().size(), serializedInfo.getHosts().size()); assertTrue(serializedInfo.getHosts().contains(h1)); assertTrue(serializedInfo.getHosts().contains(h2)); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelRequestHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelRequestHandler.java index 9291e6030e2..650958c61dc 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelRequestHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelRequestHandler.java @@ -5,6 +5,7 @@ import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.ConfigInstance; import com.yahoo.config.model.api.ConfigDefinitionRepo; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.Version; import com.yahoo.config.provision.Zone; import com.yahoo.log.LogLevel; @@ -48,13 +49,13 @@ public class SuperModelRequestHandler implements RequestHandler { * Creates a supermodel controller */ @Inject - public SuperModelRequestHandler(GenerationCounter generationCounter, ConfigDefinitionRepo configDefinitionRepo, - ConfigserverConfig configserverConfig) { + public SuperModelRequestHandler(GenerationCounter generationCounter, ConfigDefinitionRepo configDefinitionRepo, + ConfigserverConfig configserverConfig, NodeFlavors nodeFlavors) { this.generationCounter = generationCounter; this.configDefinitionRepo = configDefinitionRepo; this.masterGeneration = configserverConfig.masterGeneration(); this.responseFactory = ConfigResponseFactoryFactory.createFactory(configserverConfig); - this.zone = new Zone(configserverConfig); + this.zone = new Zone(configserverConfig, nodeFlavors); this.handler = createNewHandler(Collections.emptyMap()); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionFactory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionFactory.java index c44436740be..f87c6525a64 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionFactory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionFactory.java @@ -37,7 +37,12 @@ public class RemoteSessionFactory { public RemoteSession createSession(long sessionId) { Path sessionPath = sessionDirPath.append(String.valueOf(sessionId)); - SessionZooKeeperClient sessionZKClient = new SessionZooKeeperClient(curator, configCurator, sessionPath, defRepo, configserverConfig.serverId()); + SessionZooKeeperClient sessionZKClient = new SessionZooKeeperClient(curator, + configCurator, + sessionPath, + defRepo, + configserverConfig.serverId(), + componentRegistry.getZone().nodeFlavors()); return new RemoteSession(tenant, sessionId, componentRegistry, sessionZKClient); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java index 652f27ddaf4..e7380708d47 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java @@ -6,6 +6,7 @@ import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.application.provider.*; import com.yahoo.config.model.api.ConfigDefinitionRepo; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.io.IOUtils; import com.yahoo.log.LogLevel; import com.yahoo.path.Path; @@ -22,6 +23,7 @@ import com.yahoo.vespa.curator.Curator; import java.io.File; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -49,6 +51,7 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader { private final ConfigDefinitionRepo defRepo; private final TenantName tenant; private final String serverId; + private final Optional<NodeFlavors> nodeFlavors; public SessionFactoryImpl(GlobalComponentRegistry globalComponentRegistry, SessionCounter sessionCounter, @@ -67,6 +70,7 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader { this.superModelGenerationCounter = globalComponentRegistry.getSuperModelGenerationCounter(); this.defRepo = globalComponentRegistry.getConfigDefinitionRepo(); this.serverId = globalComponentRegistry.getConfigserverConfig().serverId(); + this.nodeFlavors = globalComponentRegistry.getZone().nodeFlavors(); } @Override @@ -131,7 +135,12 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader { log.log(LogLevel.DEBUG, Tenants.logPre(tenant) + "Next session id is " + sessionId + " , sessionIdPath=" + sessionIdPath.getAbsolute()); try { ensureZKPathDoesNotExist(sessionIdPath); - SessionZooKeeperClient sessionZooKeeperClient = new SessionZooKeeperClient(curator, configCurator, sessionIdPath, defRepo, serverId); + SessionZooKeeperClient sessionZooKeeperClient = new SessionZooKeeperClient(curator, + configCurator, + sessionIdPath, + defRepo, + serverId, + nodeFlavors); File userApplicationDir = tenantFileSystemDirs.getUserApplicationDir(sessionId); IOUtils.copyDirectory(applicationFile, userApplicationDir); ApplicationPackage applicationPackage = createApplication(applicationFile, userApplicationDir, applicationName, sessionId, currentlyActiveSession); @@ -155,7 +164,12 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader { File sessionDir = getSessionAppDir(sessionId); ApplicationPackage applicationPackage = FilesApplicationPackage.fromFile(sessionDir); Path sessionIdPath = sessionsPath.append(String.valueOf(sessionId)); - SessionZooKeeperClient sessionZKClient = new SessionZooKeeperClient(curator, configCurator, sessionIdPath, defRepo, serverId); + SessionZooKeeperClient sessionZKClient = new SessionZooKeeperClient(curator, + configCurator, + sessionIdPath, + defRepo, + serverId, + nodeFlavors); SessionContext context = new SessionContext(applicationPackage, sessionZKClient, sessionDir, applicationRepo, hostRegistry, superModelGenerationCounter); return new LocalSession(tenant, sessionId, sessionPreparer, context); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java index ecb5d0980bb..c29a00057a2 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.config.server.session; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.ProvisionInfo; import com.yahoo.config.provision.TenantName; import com.yahoo.transaction.Transaction; @@ -21,6 +22,7 @@ import com.yahoo.vespa.curator.transaction.CuratorOperations; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.config.server.zookeeper.ConfigCurator; +import java.util.Optional; import java.util.concurrent.TimeUnit; /** @@ -41,17 +43,24 @@ public class SessionZooKeeperClient { private final Path sessionStatusPath; private final String serverId; private final ServerCacheLoader cacheLoader; + private final Optional<NodeFlavors> nodeFlavors; // Only for testing when cache loader does not need cache entries. public SessionZooKeeperClient(Curator curator, Path rootPath) { - this(curator, ConfigCurator.create(curator), rootPath, new StaticConfigDefinitionRepo(), ""); + this(curator, ConfigCurator.create(curator), rootPath, new StaticConfigDefinitionRepo(), "", Optional.empty()); } - public SessionZooKeeperClient(Curator curator, ConfigCurator configCurator, Path rootPath, ConfigDefinitionRepo definitionRepo, String serverId) { + public SessionZooKeeperClient(Curator curator, + ConfigCurator configCurator, + Path rootPath, + ConfigDefinitionRepo definitionRepo, + String serverId, + Optional<NodeFlavors> nodeFlavors) { this.curator = curator; this.configCurator = configCurator; this.rootPath = rootPath; this.serverId = serverId; + this.nodeFlavors = nodeFlavors; this.sessionStatusPath = rootPath.append(ConfigCurator.SESSIONSTATE_ZK_SUBPATH); this.cacheLoader = new ServerCacheLoader(configCurator, rootPath, definitionRepo); } @@ -130,7 +139,7 @@ public class SessionZooKeeperClient { } public ApplicationPackage loadApplicationPackage() { - return new ZKApplicationPackage(configCurator, rootPath); + return new ZKApplicationPackage(configCurator, rootPath, nodeFlavors); } public ServerCache loadServerCache() { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackage.java b/configserver/src/main/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackage.java index 40f50be2b7f..946e70c715a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackage.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackage.java @@ -10,6 +10,7 @@ import com.yahoo.config.codegen.DefParser; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.model.application.provider.*; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.ProvisionInfo; import com.yahoo.config.provision.Version; import com.yahoo.io.IOUtils; @@ -42,33 +43,34 @@ public class ZKApplicationPackage implements ApplicationPackage { public static final String allocatedHostsNode = "allocatedHosts"; private final ApplicationMetaData metaData; - public ZKApplicationPackage(ConfigCurator zk, Path appPath) { + public ZKApplicationPackage(ConfigCurator zk, Path appPath, Optional<NodeFlavors> nodeFlavors) { verifyAppPath(zk, appPath); liveApp = new ZKLiveApp(zk, appPath); metaData = readMetaDataFromLiveApp(liveApp); importFileRegistries(fileRegistryNode); - importProvisionInfos(allocatedHostsNode); + importProvisionInfos(allocatedHostsNode, nodeFlavors); } - private void importProvisionInfos(String allocatedHostsNode) { + private void importProvisionInfos(String allocatedHostsNode, Optional<NodeFlavors> nodeFlavors) { List<String> provisionInfoNodes = liveApp.getChildren(allocatedHostsNode); if (provisionInfoNodes.isEmpty()) { - Optional<ProvisionInfo> provisionInfo = importProvisionInfo(allocatedHostsNode); + Optional<ProvisionInfo> provisionInfo = importProvisionInfo(allocatedHostsNode, nodeFlavors); provisionInfo.ifPresent(info -> provisionInfoMap.put(legacyVersion, info)); } else { provisionInfoNodes.stream() .forEach(versionStr -> { Version version = Version.fromString(versionStr); - Optional<ProvisionInfo> provisionInfo = importProvisionInfo(Joiner.on("/").join(allocatedHostsNode, versionStr)); + Optional<ProvisionInfo> provisionInfo = importProvisionInfo(Joiner.on("/").join(allocatedHostsNode, versionStr), + nodeFlavors); provisionInfo.ifPresent(info -> provisionInfoMap.put(version, info)); }); } } - private Optional<ProvisionInfo> importProvisionInfo(String provisionInfoNode) { + private Optional<ProvisionInfo> importProvisionInfo(String provisionInfoNode, Optional<NodeFlavors> nodeFlavors) { try { if (liveApp.exists(provisionInfoNode)) { - return Optional.of(ProvisionInfo.fromJson(liveApp.getBytes(provisionInfoNode))); + return Optional.of(ProvisionInfo.fromJson(liveApp.getBytes(provisionInfoNode), nodeFlavors)); } else { return Optional.empty(); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java index a2b0b4e7d22..9bf86b4aa0a 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java @@ -3,7 +3,9 @@ package com.yahoo.vespa.config.server; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.model.application.provider.FilesApplicationPackage; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.Version; +import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.config.server.application.Application; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.TenantName; @@ -43,7 +45,8 @@ public class SuperModelRequestHandlerTest { counter = new SuperModelGenerationCounter(new MockCurator()); controller = new SuperModelRequestHandler(counter, new TestConfigDefinitionRepo(), - new ConfigserverConfig(new ConfigserverConfig.Builder())); + new ConfigserverConfig(new ConfigserverConfig.Builder()), + emptyNodeFlavors()); } @Test @@ -94,7 +97,8 @@ public class SuperModelRequestHandlerTest { long masterGen = 10; controller = new SuperModelRequestHandler(counter, new TestConfigDefinitionRepo(), - new ConfigserverConfig(new ConfigserverConfig.Builder().masterGeneration(masterGen))); + new ConfigserverConfig(new ConfigserverConfig.Builder().masterGeneration(masterGen)), + emptyNodeFlavors()); long gen = counter.increment(); controller.reloadConfig(tenantA, createApp(tenantA, "foo", 3L, 1)); @@ -127,4 +131,8 @@ public class SuperModelRequestHandlerTest { } } + public static NodeFlavors emptyNodeFlavors() { + return new NodeFlavors(new FlavorsConfig(new FlavorsConfig.Builder())); + } + } 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 efd8b2f843b..87f94fc4d1d 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 @@ -26,6 +26,8 @@ import com.yahoo.vespa.model.VespaModelFactory; import java.util.Collections; import java.util.Optional; +import static com.yahoo.vespa.config.server.SuperModelRequestHandlerTest.emptyNodeFlavors; + /** * @author lulf * @since 5.1 @@ -141,7 +143,8 @@ public class TestComponentRegistry implements GlobalComponentRegistry { HostProvisionerProvider.empty(); SessionPreparer sessionPreparer = new SessionPreparer(modelFactoryRegistry, fileDistributionFactory, hostProvisionerProvider, permApp, - configserverConfig, defRepo, curator, new Zone(configserverConfig)); + configserverConfig, defRepo, curator, + new Zone(configserverConfig, emptyNodeFlavors())); return new TestComponentRegistry(curator, configCurator.orElse(ConfigCurator.create(curator)), metrics, modelFactoryRegistry, permApp, diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/TestWithRpc.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/TestWithRpc.java index 8f1754357b2..df1bb7f4f62 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/TestWithRpc.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/TestWithRpc.java @@ -27,6 +27,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import static com.yahoo.vespa.config.server.SuperModelRequestHandlerTest.emptyNodeFlavors; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -84,7 +85,8 @@ public class TestWithRpc { rpcServer = new RpcServer(new ConfigserverConfig(new ConfigserverConfig.Builder().rpcport(port).numthreads(1).maxgetconfigclients(1).hostedVespa(hostedVespa)), new SuperModelRequestHandler(generationCounter, new TestConfigDefinitionRepo(), - new ConfigserverConfig(new ConfigserverConfig.Builder())), + new ConfigserverConfig(new ConfigserverConfig.Builder()), + emptyNodeFlavors()), Metrics.createTestMetrics(), new HostRegistries(), hostLivenessTracker); rpcServer.onTenantCreate(TenantName.from("default"), tenantProvider); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRequestHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRequestHandlerTest.java index fc0dc52dc01..bd8c764353f 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRequestHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRequestHandlerTest.java @@ -85,7 +85,10 @@ public class TenantRequestHandlerTest extends TestWithCurator { } private void feedApp(File appDir, long sessionId, ApplicationId appId) throws IOException { - SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, new PathProvider(Path.createRoot()).getSessionDir(sessionId), new TestConfigDefinitionRepo(), ""); + SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, + new PathProvider(Path.createRoot()).getSessionDir(sessionId), + new TestConfigDefinitionRepo(), + "", Optional.empty()); zkc.writeApplicationId(appId); File app = tempFolder.newFolder(); IOUtils.copyDirectory(appDir, app); @@ -98,7 +101,10 @@ public class TenantRequestHandlerTest extends TestWithCurator { } private ApplicationSet reloadConfig(long id, String application) { - SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, new PathProvider(Path.createRoot()).getSessionDir(id), new TestConfigDefinitionRepo(), ""); + SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, + new PathProvider(Path.createRoot()).getSessionDir(id), + new TestConfigDefinitionRepo(), + "", Optional.empty()); zkc.writeApplicationId(new ApplicationId.Builder().tenant(tenant).applicationName(application).build()); RemoteSession session = new RemoteSession(tenant, id, componentRegistry, zkc); return session.ensureApplicationLoaded(); @@ -176,7 +182,10 @@ public class TenantRequestHandlerTest extends TestWithCurator { @Test public void testResolveForAppId() { long id = 1l; - SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, new PathProvider(Path.createRoot()).getSessionDir(id), new TestConfigDefinitionRepo(), ""); + SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, configCurator, + new PathProvider(Path.createRoot()).getSessionDir(id), + new TestConfigDefinitionRepo(), + "", Optional.empty()); ApplicationId appId = new ApplicationId.Builder() .tenant(tenant) .applicationName("myapp").instanceName("myinst").build(); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java index 217e2a04f9b..f6b00aa7e88 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java @@ -8,13 +8,17 @@ import java.io.File; import java.io.IOException; import java.io.Reader; import java.util.Collections; +import java.util.Optional; import java.util.regex.Pattern; import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostSpec; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.ProvisionInfo; import com.yahoo.config.provision.Version; +import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.path.Path; import com.yahoo.text.Utf8; import com.yahoo.vespa.config.server.TestWithCurator; @@ -27,8 +31,10 @@ import com.yahoo.io.IOUtils; public class ZKApplicationPackageTest extends TestWithCurator { private static final String APP = "src/test/apps/zkapp"; + private static final String TEST_FLAVOR_NAME = "test-flavor"; + private static final Optional<Flavor> TEST_FLAVOR = new MockNodeFlavors().getFlavor(TEST_FLAVOR_NAME); private static final ProvisionInfo provisionInfo = ProvisionInfo.withHosts( - Collections.singleton(new HostSpec("foo.yahoo.com", Collections.emptyList()))); + Collections.singleton(new HostSpec("foo.yahoo.com", Collections.emptyList(), TEST_FLAVOR, Optional.empty()))); @Rule public TemporaryFolder tmpDir = new TemporaryFolder(); @@ -36,7 +42,7 @@ public class ZKApplicationPackageTest extends TestWithCurator { @Test public void testBasicZKFeed() throws IOException { feed(configCurator, new File(APP)); - ZKApplicationPackage zkApp = new ZKApplicationPackage(configCurator, Path.fromString("/0")); + ZKApplicationPackage zkApp = new ZKApplicationPackage(configCurator, Path.fromString("/0"), Optional.of(new MockNodeFlavors())); assertTrue(Pattern.compile(".*<slobroks>.*",Pattern.MULTILINE+Pattern.DOTALL).matcher(IOUtils.readAll(zkApp.getServices())).matches()); assertTrue(Pattern.compile(".*<alias>.*",Pattern.MULTILINE+Pattern.DOTALL).matcher(IOUtils.readAll(zkApp.getHosts())).matches()); assertTrue(Pattern.compile(".*<slobroks>.*",Pattern.MULTILINE+Pattern.DOTALL).matcher(IOUtils.readAll(zkApp.getFile(Path.fromString("services.xml")).createReader())).matches()); @@ -61,6 +67,7 @@ public class ZKApplicationPackageTest extends TestWithCurator { assertTrue(zkApp.getProvisionInfoMap().containsKey(goodVersion)); ProvisionInfo readInfo = zkApp.getProvisionInfoMap().get(goodVersion); assertThat(Utf8.toString(readInfo.toJson()), is(Utf8.toString(provisionInfo.toJson()))); + assertThat(readInfo.getHosts().iterator().next().flavor(), is(TEST_FLAVOR)); assertTrue(zkApp.getDeployment().isPresent()); assertThat(DeploymentSpec.fromXml(zkApp.getDeployment().get()).globalServiceId().get(), is("mydisc")); } @@ -74,4 +81,14 @@ public class ZKApplicationPackageTest extends TestWithCurator { zk.putData("/0/" + ZKApplicationPackage.allocatedHostsNode + "/3.0.0", provisionInfo.toJson()); } + private static class MockNodeFlavors extends NodeFlavors{ + + MockNodeFlavors() { super(flavorsConfig()); } + + private static FlavorsConfig flavorsConfig() { + return new FlavorsConfig(new FlavorsConfig.Builder() + .flavor(new FlavorsConfig.Flavor.Builder().name(TEST_FLAVOR_NAME)) + ); + } + } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index a12d77ecbd5..d89541daebb 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -12,6 +12,7 @@ import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.OutOfCapacityException; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.TenantName; @@ -238,7 +239,8 @@ public class ProvisioningTest { config.defaultFlavor("not-used"); config.defaultContainerFlavor("small"); config.defaultContentFlavor("large"); - ProvisioningTester tester = new ProvisioningTester(new Zone(new ConfigserverConfig(config))); + ProvisioningTester tester = new ProvisioningTester(new Zone(new ConfigserverConfig(config), + new NodeFlavors(new FlavorsConfig(new FlavorsConfig.Builder())))); ApplicationId application1 = tester.makeApplicationId(); |