diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-04-18 15:53:19 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-04-18 15:53:19 +0200 |
commit | 352b828e91711ab1384213ad7f741d423688eeca (patch) | |
tree | 55094ccb785eeca6156f8445cd45a1c5e868bbba /configserver | |
parent | 76497a12e6ec76d82527b2bd2fbe3de8bba6eb63 (diff) | |
parent | bd5edd2681f6b0a3282cd053acb98d4b0ee126c4 (diff) |
Merge branch 'master' into bratseth/receive-wanted-version
Diffstat (limited to 'configserver')
12 files changed, 112 insertions, 70 deletions
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/http/SessionHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java index 74b4eea2ee0..2816ef9dc1c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java @@ -24,6 +24,7 @@ import java.util.concurrent.Executor; * @since 5.1.14 */ public class SessionHandler extends HttpHandler { + protected final ApplicationRepository applicationRepository; public SessionHandler(Executor executor, AccessLog accessLog, ApplicationRepository applicationRepository) { 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 461019439e0..729472051fd 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 9fbd8d539fb..dd74270c817 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 @@ -5,6 +5,7 @@ import com.yahoo.component.Version; import com.yahoo.component.Vtag; 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; @@ -23,6 +24,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; /** @@ -44,17 +46,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); } @@ -133,7 +142,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/apps/zkapp/services.xml b/configserver/src/test/apps/zkapp/services.xml index aee18cc450a..9549bc2d063 100644 --- a/configserver/src/test/apps/zkapp/services.xml +++ b/configserver/src/test/apps/zkapp/services.xml @@ -10,51 +10,22 @@ </slobroks> </admin> - <clients version="2.0"> - <gateways protocols="http"> - <gateway hostalias="node1" /> - </gateways> - </clients> + <jdisc version="1.0"> + <documentapi/> + <search/> + <nodes> + <node hostalias="node1"/> + </nodes> + </jdisc> - <search version="2.0"> - <qrservers> - <qrserver hostalias="node1" /> - </qrservers> - <cluster name="music" indexingmode="realtime"> - <searchdefinitions> - <searchdefinition name="music" /> - </searchdefinitions> - <clustercontrollers> - <clustercontroller hostalias="node1" /> - </clustercontrollers> - <topleveldispatchers> - <topleveldispatcher hostalias="node1" /> - </topleveldispatchers> - <row index="0"> - <searchnodes> - <searchnode hostalias="node1" index="0" /> - </searchnodes> - </row> - </cluster> - </search> - - <storage version="3.0"> - <cluster redundancy="1"> -<!-- -Do not reshuffle nodes or change index values - this will cause -massive document redistribution. - -If you want to discontinue use of a node, set it in the 'retired' state, -this will rebalance the documents out of the node. Once node is empty, -you can stop it and delete the reference to it in vespa-services and -vespa-hosts files. ---> - <group index="0" name="mycluster"> - <node hostalias="node1" index="0"/> - </group> - - <fleetcontroller hostalias="node1" /> - </cluster> - </storage> + <content version="1.0"> + <redundancy>1</redundancy> + <documents> + <document name="music" mode="index"/> + </documents> + <nodes> + <node hostalias="node1" distribution-key="0"/> + </nodes> + </content> </services> 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)) + ); + } + } } |