diff options
10 files changed, 124 insertions, 75 deletions
diff --git a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/StaticConfigDefinitionRepo.java b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/StaticConfigDefinitionRepo.java index 7640a20d09c..58318958dfb 100644 --- a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/StaticConfigDefinitionRepo.java +++ b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/StaticConfigDefinitionRepo.java @@ -22,8 +22,7 @@ import java.util.stream.Collectors; * A global pool of all config definitions that this server knows about. These objects can be shared * by all tenants, as they are not modified. * - * @author lulf - * @since 5.10 + * @author Ulf Lilleengen */ public class StaticConfigDefinitionRepo implements ConfigDefinitionRepo { @@ -67,4 +66,7 @@ public class StaticConfigDefinitionRepo implements ConfigDefinitionRepo { return Collections.unmodifiableMap(configDefinitions); } + @Override + public ConfigDefinition get(ConfigDefinitionKey key) { return configDefinitions.get(key); } + } diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ConfigDefinitionRepo.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ConfigDefinitionRepo.java index b3f0f578e22..d2b8dc75d22 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/ConfigDefinitionRepo.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ConfigDefinitionRepo.java @@ -7,10 +7,9 @@ import com.yahoo.vespa.config.buildergen.ConfigDefinition; import java.util.Map; /** - * Represents a repository of config definitions. + * A config definition repository. * - * @author lulf - * @since 5.10 + * @author Ulf Lillengen */ public interface ConfigDefinitionRepo { @@ -19,4 +18,10 @@ public interface ConfigDefinitionRepo { */ Map<ConfigDefinitionKey, ConfigDefinition> getConfigDefinitions(); + /** + * Gets a config definition from repo or null if not found + */ + // TODO: Remove default implementation when 6.246 is the oldest version in use + default ConfigDefinition get(ConfigDefinitionKey key) { return null; } + } diff --git a/config-model/src/test/java/com/yahoo/config/model/deploy/DeployStateTest.java b/config-model/src/test/java/com/yahoo/config/model/deploy/DeployStateTest.java index cfadea9297a..2a9547df839 100644 --- a/config-model/src/test/java/com/yahoo/config/model/deploy/DeployStateTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/deploy/DeployStateTest.java @@ -126,6 +126,10 @@ public class DeployStateTest { public Map<ConfigDefinitionKey, com.yahoo.vespa.config.buildergen.ConfigDefinition> getConfigDefinitions() { return defs; } + @Override + public com.yahoo.vespa.config.buildergen.ConfigDefinition get(ConfigDefinitionKey key) { + return null; + } }); return builder.build(true); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ServerCache.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ServerCache.java index 4d64763bab3..7d6463c49f1 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ServerCache.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ServerCache.java @@ -1,6 +1,7 @@ // 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; +import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.vespa.config.ConfigCacheKey; import com.yahoo.vespa.config.ConfigDefinitionKey; import com.yahoo.vespa.config.buildergen.ConfigDefinition; @@ -10,21 +11,28 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** - * Cache that holds configs and config definitions. It has separate maps for the separate - * "types", for clarity. + * Cache that holds configs and config definitions (builtin and user config definitions). * * @author vegardh */ public class ServerCache { - private final Map<ConfigDefinitionKey, ConfigDefinition> defs = new ConcurrentHashMap<>(); + private final ConfigDefinitionRepo builtinConfigDefinitions; + private final ConfigDefinitionRepo userConfigDefinitions; // NOTE: The reason we do a double mapping here is to dedup configs that have the same md5. private final Map<ConfigCacheKey, String> md5Sums = new ConcurrentHashMap<>(); private final Map<String, ConfigResponse> md5ToConfig = new ConcurrentHashMap<>(); - public void addDef(ConfigDefinitionKey key, ConfigDefinition def) { - defs.put(key, def); + + public ServerCache(ConfigDefinitionRepo builtinConfigDefinitions, ConfigDefinitionRepo userConfigDefinitions) { + this.builtinConfigDefinitions = builtinConfigDefinitions; + this.userConfigDefinitions = userConfigDefinitions; + } + + // For testing only + public ServerCache() { + this(new StaticConfigDefinitionRepo(), new UserConfigDefinitionRepo()); } public void put(ConfigCacheKey key, ConfigResponse config, String configMd5) { @@ -42,15 +50,17 @@ public class ServerCache { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Cache\n"); - sb.append("defs: ").append(defs.size()).append("\n"); - sb.append("md5sums: ").append(md5Sums.size()).append("\n"); - sb.append("md5ToConfig: ").append(md5ToConfig.size()).append("\n"); + sb.append("builtin defs: ").append(builtinConfigDefinitions.getConfigDefinitions().size()).append("\n"); + sb.append("user defs: ").append(userConfigDefinitions.getConfigDefinitions().size()).append("\n"); + sb.append("md5sums: ").append(md5Sums.size()).append("\n"); + sb.append("md5ToConfig: ").append(md5ToConfig.size()).append("\n"); return sb.toString(); } public ConfigDefinition getDef(ConfigDefinitionKey defKey) { - return defs.get(defKey); + ConfigDefinition def = userConfigDefinitions.get(defKey); + return (def != null) ? def : builtinConfigDefinitions.getConfigDefinitions().get(defKey); } /** diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/StaticConfigDefinitionRepo.java b/configserver/src/main/java/com/yahoo/vespa/config/server/StaticConfigDefinitionRepo.java index 306443ca8cd..abb573a7b81 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/StaticConfigDefinitionRepo.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/StaticConfigDefinitionRepo.java @@ -13,20 +13,24 @@ import java.util.Map; * A global pool of all config definitions that this server knows about. These objects can be shared * by all tenants, as they are not modified. * - * @author lulf - * @since 5.10 + * @author Ulf Lilleengen */ public class StaticConfigDefinitionRepo implements ConfigDefinitionRepo { private final ConfigDefinitionRepo repo; - // Only useful in tests that dont need full blown repo. + // Only useful in tests that don't need full blown repo. public StaticConfigDefinitionRepo() { this.repo = new ConfigDefinitionRepo() { @Override public Map<ConfigDefinitionKey, ConfigDefinition> getConfigDefinitions() { return Collections.emptyMap(); } + + @Override + public ConfigDefinition get(ConfigDefinitionKey key) { + return null; + } }; } @@ -39,4 +43,7 @@ public class StaticConfigDefinitionRepo implements ConfigDefinitionRepo { public Map<ConfigDefinitionKey, ConfigDefinition> getConfigDefinitions() { return repo.getConfigDefinitions(); } + + @Override + public ConfigDefinition get(ConfigDefinitionKey key) { return repo.get(key); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/UserConfigDefinitionRepo.java b/configserver/src/main/java/com/yahoo/vespa/config/server/UserConfigDefinitionRepo.java new file mode 100644 index 00000000000..2f1798f14dd --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/UserConfigDefinitionRepo.java @@ -0,0 +1,33 @@ +// Copyright 2018 Yahoo Holdings. 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.model.api.ConfigDefinitionRepo; +import com.yahoo.vespa.config.ConfigDefinitionKey; +import com.yahoo.vespa.config.buildergen.ConfigDefinition; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author hmusum + */ +public class UserConfigDefinitionRepo implements ConfigDefinitionRepo { + + private final Map<ConfigDefinitionKey, ConfigDefinition> defs = new LinkedHashMap<>(); + + + public void add(ConfigDefinitionKey key, ConfigDefinition configDefinition) { + defs.put(key, configDefinition); + } + + @Override + public Map<ConfigDefinitionKey, ConfigDefinition> getConfigDefinitions() { + return defs; + } + + @Override + public ConfigDefinition get(ConfigDefinitionKey key) { + return defs.get(key); + } +} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java index d83548dcc3d..651e5a6bbb0 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java @@ -15,7 +15,6 @@ import com.yahoo.config.provision.Version; import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.server.GlobalComponentRegistry; import com.yahoo.vespa.config.server.tenant.Rotations; -import com.yahoo.vespa.config.server.ServerCache; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.config.server.application.Application; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; @@ -74,7 +73,6 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { Instant now) { log.log(LogLevel.DEBUG, String.format("Loading model version %s for session %s application %s", modelFactory.getVersion(), appGeneration, applicationId)); - ServerCache cache = zkClient.loadServerCache(); ModelContext modelContext = new ModelContextImpl( applicationPackage, Optional.empty(), @@ -88,7 +86,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { new com.yahoo.component.Version(modelFactory.getVersion().toString()), wantedNodeVespaVersion); MetricUpdater applicationMetricUpdater = metrics.getOrCreateMetricUpdater(Metrics.createDimensions(applicationId)); - return new Application(modelFactory.createModel(modelContext), cache, appGeneration, + return new Application(modelFactory.createModel(modelContext), zkClient.loadServerCache(), appGeneration, applicationPackage.getMetaData().isInternalRedeploy(), modelFactory.getVersion(), applicationMetricUpdater, applicationId); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/ServerCacheLoader.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/ServerCacheLoader.java index b2cf2c56156..62e92f4ff08 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/ServerCacheLoader.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/ServerCacheLoader.java @@ -3,33 +3,30 @@ package com.yahoo.vespa.config.server.session; import com.google.common.base.Splitter; import com.yahoo.config.model.api.ConfigDefinitionRepo; -import com.yahoo.log.LogLevel; import com.yahoo.path.Path; import com.yahoo.vespa.config.ConfigDefinitionKey; import com.yahoo.vespa.config.buildergen.ConfigDefinition; import com.yahoo.vespa.config.server.ServerCache; +import com.yahoo.vespa.config.server.UserConfigDefinitionRepo; import com.yahoo.vespa.config.util.ConfigUtils; import com.yahoo.vespa.config.server.zookeeper.ConfigCurator; -import java.util.Map; - /** - * This class is tasked with reading config definitions and legacy configs/ from zookeeper, and create - * a {@link ServerCache} instance containing these in memory. + * Loads config definitions from zookeeper and creates a {@link ServerCache} instance containing these + * and the builtin config definitions in memory. * - * @author lulf - * @since 5.1 + * @author Ulf Lilleengen */ public class ServerCacheLoader { - private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(ServerCacheLoader.class.getName()); private final ConfigDefinitionRepo repo; private final ConfigCurator configCurator; private final Path path; - public ServerCacheLoader(ConfigCurator configCurator, Path rootPath, ConfigDefinitionRepo repo) { + + ServerCacheLoader(ConfigCurator configCurator, Path rootPath, ConfigDefinitionRepo builtinConfigDefinitions) { this.configCurator = configCurator; this.path = rootPath; - this.repo = repo; + this.repo = builtinConfigDefinitions; } public ServerCache loadCache() { @@ -40,39 +37,31 @@ public class ServerCacheLoader { * Reads config definitions from zookeeper, parses them and puts both ConfigDefinition instances * and payload (raw config definition) into cache. * - * @return the populated cache. + * @return the populated cache. */ - public ServerCache loadConfigDefinitions() { - ServerCache cache = new ServerCache(); + private ServerCache loadConfigDefinitions() { try { - log.log(LogLevel.DEBUG, "Getting config definitions"); - loadGlobalConfigDefinitions(cache); - loadConfigDefinitionsFromPath(cache, path.append(ConfigCurator.USER_DEFCONFIGS_ZK_SUBPATH).getAbsolute()); - log.log(LogLevel.DEBUG, "Done getting config definitions"); + return new ServerCache(repo, createUserConfigDefinitionsRepo(path.append(ConfigCurator.USER_DEFCONFIGS_ZK_SUBPATH).getAbsolute())); } catch (Exception e) { - throw new IllegalStateException("Could not load config definitions for " + path, e); - } - return cache; - } - - private void loadGlobalConfigDefinitions(ServerCache cache) { - for (Map.Entry<ConfigDefinitionKey, ConfigDefinition> entry : repo.getConfigDefinitions().entrySet()) { - cache.addDef(entry.getKey(), entry.getValue()); + throw new IllegalStateException("Could not load user config definitions from " + path, e); } } /** - * Loads config definitions from a specified path into server cache and returns it. + * Creates repo with user config definitions * * @param appPath the path to load config definitions from */ - private void loadConfigDefinitionsFromPath(ServerCache cache, String appPath) { - if ( ! configCurator.exists(appPath)) return; + private UserConfigDefinitionRepo createUserConfigDefinitionsRepo(String appPath) { + UserConfigDefinitionRepo userConfigDefinitionRepo = new UserConfigDefinitionRepo(); + if ( ! configCurator.exists(appPath)) return userConfigDefinitionRepo; + for (String nodeName : configCurator.getChildren(appPath)) { String payload = configCurator.getData(appPath, nodeName); ConfigDefinitionKey dKey = ConfigUtils.createConfigDefinitionKeyFromZKString(nodeName); - cache.addDef(dKey, new ConfigDefinition(dKey.getName(), Splitter.on("\n").splitToList(payload).toArray(new String[0]))); + userConfigDefinitionRepo.add(dKey, new ConfigDefinition(dKey.getName(), Splitter.on("\n").splitToList(payload).toArray(new String[0]))); } + return userConfigDefinitionRepo; } } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ServerCacheTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ServerCacheTest.java index b93b3fa28e0..f2ee7815df3 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ServerCacheTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ServerCacheTest.java @@ -17,8 +17,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; /** - * @author lulf - * @since 5.1 + * @author Ulf Lilleengen */ public class ServerCacheTest { private ServerCache cache; @@ -27,8 +26,8 @@ public class ServerCacheTest { private static String defMd5_2 = "a2f8edfc965802bf6d44826f9da7e2b0"; private static String configMd5 = "mymd5"; private static String configMd5_2 = "mymd5_2"; - private static ConfigDefinition payload = new ConfigDefinition("mypayload", new String[0]); - private static ConfigDefinition payload_2 = new ConfigDefinition("otherpayload", new String[0]); + private static ConfigDefinition def = new ConfigDefinition("mypayload", new String[0]); + private static ConfigDefinition def_2 = new ConfigDefinition("otherpayload", new String[0]); private static ConfigDefinitionKey fooBarDefKey = new ConfigDefinitionKey("foo", "bar"); private static ConfigDefinitionKey fooBazDefKey = new ConfigDefinitionKey("foo", "baz"); @@ -37,28 +36,28 @@ public class ServerCacheTest { private static ConfigKey<?> fooConfigKey = new ConfigKey<>("foo", "id", "bar"); private static ConfigKey<?> bazConfigKey = new ConfigKey<>("foo", "id2", "bar"); - ConfigCacheKey fooBarCacheKey = new ConfigCacheKey(fooConfigKey, defMd5); - ConfigCacheKey bazQuuxCacheKey = new ConfigCacheKey(bazConfigKey, defMd5); - ConfigCacheKey fooBarCacheKeyDifferentMd5 = new ConfigCacheKey(fooConfigKey, defMd5_2); + private ConfigCacheKey fooBarCacheKey = new ConfigCacheKey(fooConfigKey, defMd5); + private ConfigCacheKey bazQuuxCacheKey = new ConfigCacheKey(bazConfigKey, defMd5); + private ConfigCacheKey fooBarCacheKeyDifferentMd5 = new ConfigCacheKey(fooConfigKey, defMd5_2); @Before public void setup() { - cache = new ServerCache(); + UserConfigDefinitionRepo userConfigDefinitionRepo = new UserConfigDefinitionRepo(); + userConfigDefinitionRepo.add(fooBarDefKey, def); + userConfigDefinitionRepo.add(fooBazDefKey, new com.yahoo.vespa.config.buildergen.ConfigDefinition("baz", new String[0])); + userConfigDefinitionRepo.add(fooBimDefKey, new ConfigDefinition("mynode", new String[0])); - cache.addDef(fooBarDefKey, payload); - cache.addDef(fooBazDefKey, new com.yahoo.vespa.config.buildergen.ConfigDefinition("baz", new String[0])); + cache = new ServerCache(new TestConfigDefinitionRepo(), userConfigDefinitionRepo); - cache.addDef(fooBimDefKey, new ConfigDefinition("mynode", new String[0])); - - cache.put(fooBarCacheKey, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), payload.getCNode(), 2, false, configMd5), configMd5); - cache.put(bazQuuxCacheKey, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), payload.getCNode(), 2, false, configMd5), configMd5); - cache.put(fooBarCacheKeyDifferentMd5, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), payload_2.getCNode(), 2, false, configMd5_2), configMd5_2); + cache.put(fooBarCacheKey, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), def.getCNode(), 2, false, configMd5), configMd5); + cache.put(bazQuuxCacheKey, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), def.getCNode(), 2, false, configMd5), configMd5); + cache.put(fooBarCacheKeyDifferentMd5, SlimeConfigResponse.fromConfigPayload(ConfigPayload.empty(), def_2.getCNode(), 2, false, configMd5_2), configMd5_2); } @Test public void testThatCacheWorks() { assertNotNull(cache.getDef(fooBazDefKey)); - assertThat(cache.getDef(fooBarDefKey), is(payload)); + assertThat(cache.getDef(fooBarDefKey), is(def)); assertThat(cache.getDef(fooBimDefKey).getCNode().getName(), is("mynode")); ConfigResponse raw = cache.get(fooBarCacheKey); assertThat(raw.getConfigMd5(), is(configMd5)); @@ -66,7 +65,7 @@ public class ServerCacheTest { @Test public void testThatCacheWorksWithSameKeyDifferentMd5() { - assertThat(cache.getDef(fooBarDefKey), is(payload)); + assertThat(cache.getDef(fooBarDefKey), is(def)); ConfigResponse raw = cache.get(fooBarCacheKey); assertThat(raw.getConfigMd5(), is(configMd5)); raw = cache.get(fooBarCacheKeyDifferentMd5); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/ApplicationTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/ApplicationTest.java index 90a27c39736..97a229750a1 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/ApplicationTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/ApplicationTest.java @@ -23,7 +23,9 @@ import com.yahoo.vespa.config.protocol.JRTServerConfigRequestV3; import com.yahoo.vespa.config.protocol.Trace; import com.yahoo.vespa.config.server.ModelStub; import com.yahoo.vespa.config.server.ServerCache; +import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.UnknownConfigDefinitionException; +import com.yahoo.vespa.config.server.UserConfigDefinitionRepo; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.model.VespaModel; @@ -47,7 +49,7 @@ import static org.junit.Assert.assertTrue; public class ApplicationTest { @Test - public void testThatApplicationIsInitialized() throws IOException, SAXException { + public void testThatApplicationIsInitialized() { ApplicationId appId = ApplicationId.from(TenantName.defaultName(), ApplicationName.from("foobar"), InstanceName.defaultName()); ServerCache cache = new ServerCache(); @@ -76,22 +78,22 @@ public class ApplicationTest { } private static ServerCache createCacheAndAddContent() { - ServerCache cache = new ServerCache(); + UserConfigDefinitionRepo userDefs = new UserConfigDefinitionRepo(); ConfigDefinitionKey key = new ConfigDefinitionKey(SimpletypesConfig.CONFIG_DEF_NAME, SimpletypesConfig.CONFIG_DEF_NAMESPACE); com.yahoo.vespa.config.buildergen.ConfigDefinition def = getDef(key, SimpletypesConfig.CONFIG_DEF_SCHEMA); // TODO Why do we have to use empty def md5 here? - cache.addDef(key, def); + userDefs.add(key, def); ConfigDefinitionKey key2 = new ConfigDefinitionKey(SlobroksConfig.CONFIG_DEF_NAME, SlobroksConfig.CONFIG_DEF_NAMESPACE); com.yahoo.vespa.config.buildergen.ConfigDefinition def2 = getDef(key2, SlobroksConfig.CONFIG_DEF_SCHEMA); - cache.addDef(key2, def2); + userDefs.add(key2, def2); ConfigDefinitionKey key3 = new ConfigDefinitionKey(LogdConfig.CONFIG_DEF_NAME, LogdConfig.CONFIG_DEF_NAMESPACE); com.yahoo.vespa.config.buildergen.ConfigDefinition def3 = getDef(key3, LogdConfig.CONFIG_DEF_SCHEMA); - cache.addDef(key3, def3); + userDefs.add(key3, def3); - return cache; + return new ServerCache(new TestConfigDefinitionRepo(), userDefs); } private static com.yahoo.vespa.config.buildergen.ConfigDefinition getDef(ConfigDefinitionKey key, String[] schema) { @@ -104,18 +106,18 @@ public class ApplicationTest { } @Test - public void require_that_known_config_defs_are_found() throws IOException, SAXException { + public void require_that_known_config_defs_are_found() { handler.resolveConfig(createSimpleConfigRequest(emptySchema)); } @Test - public void require_that_build_config_can_be_resolved() throws IOException, SAXException { + public void require_that_build_config_can_be_resolved() { List<String> payload = handler.resolveConfig(createRequest(ModelConfig.CONFIG_DEF_NAME, ModelConfig.CONFIG_DEF_NAMESPACE, ModelConfig.CONFIG_DEF_MD5, ModelConfig.CONFIG_DEF_SCHEMA)).getLegacyPayload(); assertTrue(payload.get(1).contains("host")); } @Test - public void require_that_non_existent_fields_in_schema_is_skipped() throws IOException, SAXException { + public void require_that_non_existent_fields_in_schema_is_skipped() { // Ask for config without schema and check that we get correct default value back List<String> payload = handler.resolveConfig(createSimpleConfigRequest(emptySchema)).getLegacyPayload(); assertThat(payload.get(0), is("boolval false")); |