summaryrefslogtreecommitdiffstats
path: root/configserver/src/test
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-08-31 10:18:46 +0200
committerGitHub <noreply@github.com>2020-08-31 10:18:46 +0200
commit71872411c49d93be0d154391d1276b36ee2d1b23 (patch)
tree7ea55d607fa44231bd6693a127a6e3d4c15925e0 /configserver/src/test
parent178c59a30e4b63fba2272fc748821e394fa21176 (diff)
Revert "Move code from RemoteSession to SessionRepository"
Diffstat (limited to 'configserver/src/test')
-rw-r--r--configserver/src/test/apps/app-major-version-2/deployment.xml1
-rw-r--r--configserver/src/test/apps/app-major-version-2/hosts.xml7
-rw-r--r--configserver/src/test/apps/app-major-version-2/searchdefinitions/music.sd50
-rw-r--r--configserver/src/test/apps/app-major-version-2/services.xml38
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcServerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java299
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java175
8 files changed, 302 insertions, 273 deletions
diff --git a/configserver/src/test/apps/app-major-version-2/deployment.xml b/configserver/src/test/apps/app-major-version-2/deployment.xml
deleted file mode 100644
index 7523c104b7e..00000000000
--- a/configserver/src/test/apps/app-major-version-2/deployment.xml
+++ /dev/null
@@ -1 +0,0 @@
-<deployment version='1.0' major-version='2'/>
diff --git a/configserver/src/test/apps/app-major-version-2/hosts.xml b/configserver/src/test/apps/app-major-version-2/hosts.xml
deleted file mode 100644
index f4256c9fc81..00000000000
--- a/configserver/src/test/apps/app-major-version-2/hosts.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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">
- <alias>node1</alias>
- </host>
-</hosts>
diff --git a/configserver/src/test/apps/app-major-version-2/searchdefinitions/music.sd b/configserver/src/test/apps/app-major-version-2/searchdefinitions/music.sd
deleted file mode 100644
index 7670e78f22b..00000000000
--- a/configserver/src/test/apps/app-major-version-2/searchdefinitions/music.sd
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-# A basic search definition - called music, should be saved to music.sd
-search music {
-
- # It contains one document type only - called music as well
- document music {
-
- field title type string {
- indexing: summary | index # How this field should be indexed
- # index-to: title, default # Create two indexes
- weight: 75 # Ranking importancy of this field, used by the built in nativeRank feature
- }
-
- field artist type string {
- indexing: summary | attribute | index
- # index-to: artist, default
-
- weight: 25
- }
-
- field year type int {
- indexing: summary | attribute
- }
-
- # Increase query
- field popularity type int {
- indexing: summary | attribute
- }
-
- field url type uri {
- indexing: summary | index
- }
-
- }
-
- rank-profile default inherits default {
- first-phase {
- expression: nativeRank(title,artist) + attribute(popularity)
- }
-
- }
-
- rank-profile textmatch inherits default {
- first-phase {
- expression: nativeRank(title,artist)
- }
-
- }
-
-}
diff --git a/configserver/src/test/apps/app-major-version-2/services.xml b/configserver/src/test/apps/app-major-version-2/services.xml
deleted file mode 100644
index 509d7786be0..00000000000
--- a/configserver/src/test/apps/app-major-version-2/services.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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. -->
-<services version="1.0">
-
- <admin version="2.0">
- <adminserver hostalias="node1"/>
- <logserver hostalias="node1" />
- </admin>
-
- <content version="1.0">
- <redundancy>2</redundancy>
- <documents>
- <document type="music" mode="index"/>
- </documents>
- <nodes>
- <node hostalias="node1" distribution-key="0"/>
- </nodes>
-
- </content>
-
- <container version="1.0">
- <document-processing compressdocuments="true">
- <chain id="ContainerWrapperTest">
- <documentprocessor id="com.yahoo.vespa.config.AppleDocProc"/>
- </chain>
- </document-processing>
-
- <config name="project.specific">
- <value>someval</value>
- </config>
-
- <nodes>
- <node hostalias="node1" />
- </nodes>
-
- </container>
-
-</services>
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 b81cacfbff6..f43154242fb 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
@@ -226,7 +226,7 @@ public class ApplicationHandlerTest {
ApplicationId unknown = new ApplicationId.Builder().applicationName("unknown").tenant("default").build();
HttpResponse responseForUnknown = fileDistributionStatus(unknown, zone);
assertEquals(404, responseForUnknown.getStatus());
- assertEquals("{\"error-code\":\"NOT_FOUND\",\"message\":\"No active session found for 'default.unknown'\"}",
+ assertEquals("{\"error-code\":\"NOT_FOUND\",\"message\":\"Unknown application id 'default.unknown'\"}",
getRenderedString(responseForUnknown));
}
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 d8d20d37551..ae6bd5feeab 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,8 +64,7 @@ public class RpcServerTest {
ApplicationRepository applicationRepository = tester.applicationRepository();
applicationRepository.deploy(testApp, new PrepareParams.Builder().applicationId(applicationId).build());
TenantApplications applicationRepo = tester.tenant().getApplicationRepo();
- ApplicationSet applicationSet = tester.tenant().getSessionRepository().ensureApplicationLoaded(applicationRepository.getActiveSession(applicationId));
- applicationRepo.reloadConfig(applicationSet);
+ applicationRepo.reloadConfig(applicationRepository.getActiveSession(applicationId).ensureApplicationLoaded());
testPrintStatistics(tester);
testGetConfig(tester);
testEnabled(tester);
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java
new file mode 100644
index 00000000000..cda3e09d3a8
--- /dev/null
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java
@@ -0,0 +1,299 @@
+// 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.session;
+
+import com.yahoo.cloud.config.ConfigserverConfig;
+import com.yahoo.component.Version;
+import com.yahoo.config.application.api.ApplicationPackage;
+import com.yahoo.config.model.NullConfigModelRegistry;
+import com.yahoo.config.model.api.Model;
+import com.yahoo.config.model.api.ModelContext;
+import com.yahoo.config.model.api.ModelCreateResult;
+import com.yahoo.config.model.api.ModelFactory;
+import com.yahoo.config.model.api.ValidationParameters;
+import com.yahoo.config.model.deploy.DeployState;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.TenantName;
+import com.yahoo.vespa.config.server.TestComponentRegistry;
+import com.yahoo.vespa.config.server.application.ApplicationSet;
+import com.yahoo.vespa.config.server.application.PermanentApplicationPackage;
+import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry;
+import com.yahoo.vespa.curator.Curator;
+import com.yahoo.vespa.curator.mock.MockCurator;
+import com.yahoo.vespa.model.VespaModel;
+import com.yahoo.vespa.model.VespaModelFactory;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.IOException;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Ulf Lilleengen
+ * @author bratseth
+ */
+public class RemoteSessionTest {
+
+ private static final TenantName tenantName = TenantName.from("default");
+
+ private Curator curator;
+
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ @Before
+ public void setupTest() {
+ curator = new MockCurator();
+ }
+
+ @Test
+ public void require_that_session_is_initialized() {
+ Clock clock = Clock.systemUTC();
+ Session session = createSession(2, clock);
+ assertThat(session.getSessionId(), is(2L));
+ session = createSession(Long.MAX_VALUE, clock);
+ assertThat(session.getSessionId(), is(Long.MAX_VALUE));
+ }
+
+ @Test
+ public void require_that_applications_are_loaded() {
+ RemoteSession session = createSession(3, Arrays.asList(new MockModelFactory(), new VespaModelFactory(new NullConfigModelRegistry())));
+ session.prepare();
+ ApplicationSet applicationSet = session.ensureApplicationLoaded();
+ assertNotNull(applicationSet);
+ assertThat(applicationSet.getApplicationGeneration(), is(3L));
+ assertThat(applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getId().application().value(), is("foo"));
+ assertNotNull(applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getModel());
+ session.deactivate();
+
+ applicationSet = session.ensureApplicationLoaded();
+ assertNotNull(applicationSet);
+ assertThat(applicationSet.getApplicationGeneration(), is(3L));
+ assertThat(applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getId().application().value(), is("foo"));
+ assertNotNull(applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getModel());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void require_that_new_invalid_application_throws_exception() {
+ MockModelFactory failingFactory = new MockModelFactory();
+ failingFactory.vespaVersion = new Version(1, 2, 0);
+ failingFactory.throwOnLoad = true;
+
+ MockModelFactory okFactory = new MockModelFactory();
+ okFactory.vespaVersion = new Version(1, 1, 0);
+ okFactory.throwOnLoad = false;
+
+ RemoteSession session = createSession(3, Arrays.asList(okFactory, failingFactory));
+ session.prepare();
+ }
+
+ @Test
+ public void require_that_old_invalid_application_does_not_throw_exception_if_skipped_also_across_major_versions() {
+ MockModelFactory failingFactory = new MockModelFactory();
+ failingFactory.vespaVersion = new Version(1, 0, 0);
+ failingFactory.throwOnLoad = true;
+
+ MockModelFactory okFactory =
+ new MockModelFactory("<validation-overrides><allow until='2000-01-30'>skip-old-config-models</allow></validation-overrides>");
+ okFactory.vespaVersion = new Version(2, 0, 0);
+ okFactory.throwOnLoad = false;
+
+ RemoteSession session = createSession(3, Arrays.asList(okFactory, failingFactory), failingFactory.clock());
+ session.prepare();
+ }
+
+ @Test
+ public void require_that_an_application_package_can_limit_to_one_major_version() {
+ ApplicationPackage application =
+ new MockApplicationPackage.Builder().withServices("<services version='1.0'/>")
+ .withDeploymentSpec("<deployment version='1.0' major-version='2'/>")
+ .build();
+ assertTrue(application.getMajorVersion().isPresent());
+ assertEquals(2, (int)application.getMajorVersion().get());
+
+ MockModelFactory failingFactory = new MockModelFactory();
+ failingFactory.vespaVersion = new Version(3, 0, 0);
+ failingFactory.throwErrorOnLoad = true;
+
+ MockModelFactory okFactory = new MockModelFactory();
+ okFactory.vespaVersion = new Version(2, 0, 0);
+ okFactory.throwErrorOnLoad = false;
+
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, 3, application);
+ RemoteSession session = createSession(3, zkc, Arrays.asList(okFactory, failingFactory));
+ session.prepare();
+
+ // Does not cause an error because model version 3 is skipped
+ }
+
+ @Test
+ public void require_that_an_application_package_can_limit_to_one_higher_major_version() {
+ ApplicationPackage application =
+ new MockApplicationPackage.Builder().withServices("<services version='1.0'/>")
+ .withDeploymentSpec("<deployment version='1.0' major-version='3'/>")
+ .build();
+ assertTrue(application.getMajorVersion().isPresent());
+ assertEquals(3, (int)application.getMajorVersion().get());
+
+ MockModelFactory failingFactory = new MockModelFactory();
+ failingFactory.vespaVersion = new Version(4, 0, 0);
+ failingFactory.throwErrorOnLoad = true;
+
+ MockModelFactory okFactory = new MockModelFactory();
+ okFactory.vespaVersion = new Version(2, 0, 0);
+ okFactory.throwErrorOnLoad = false;
+
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, 3, application);
+ RemoteSession session = createSession(4, zkc, Arrays.asList(okFactory, failingFactory));
+ session.prepare();
+
+ // Does not cause an error because model version 4 is skipped
+ }
+
+ @Test
+ public void require_that_session_status_is_updated() {
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, 3);
+ RemoteSession session = createSession(3, zkc, Clock.systemUTC());
+ assertThat(session.getStatus(), is(Session.Status.NEW));
+ zkc.writeStatus(Session.Status.PREPARE);
+ assertThat(session.getStatus(), is(Session.Status.PREPARE));
+ }
+
+ @Test
+ public void require_that_permanent_app_is_used() throws IOException {
+ Optional<PermanentApplicationPackage> permanentApp = Optional.of(new PermanentApplicationPackage(
+ new ConfigserverConfig(new ConfigserverConfig.Builder()
+ .applicationDirectory(temporaryFolder.newFolder("appdir").getAbsolutePath()))));
+ MockModelFactory mockModelFactory = new MockModelFactory();
+ try {
+ int sessionId = 3;
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, sessionId);
+ createSession(sessionId, zkc, Collections.singletonList(mockModelFactory), permanentApp, Clock.systemUTC()).ensureApplicationLoaded();
+ } catch (Exception e) {
+ e.printStackTrace();
+ // ignore, we're not interested in deploy errors as long as the below state is OK.
+ }
+ assertNotNull(mockModelFactory.modelContext);
+ assertTrue(mockModelFactory.modelContext.permanentApplicationPackage().isPresent());
+ }
+
+ private RemoteSession createSession(long sessionId, Clock clock) {
+ return createSession(sessionId, Collections.singletonList(new VespaModelFactory(new NullConfigModelRegistry())), clock);
+ }
+
+ private RemoteSession createSession(long sessionId, SessionZooKeeperClient zkc, Clock clock) {
+ return createSession(sessionId, zkc, Collections.singletonList(new VespaModelFactory(new NullConfigModelRegistry())), clock);
+ }
+
+ private RemoteSession createSession(long sessionId, List<ModelFactory> modelFactories) {
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, sessionId);
+ return createSession(sessionId, zkc, modelFactories, Clock.systemUTC());
+ }
+
+ private RemoteSession createSession(long sessionId, List<ModelFactory> modelFactories, Clock clock) {
+ SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, sessionId);
+ return createSession(sessionId, zkc, modelFactories, clock);
+ }
+
+ private RemoteSession createSession(long sessionId, SessionZooKeeperClient zkc, List<ModelFactory> modelFactories) {
+ return createSession(sessionId, zkc, modelFactories, Optional.empty(), Clock.systemUTC());
+ }
+
+ private RemoteSession createSession(long sessionId, SessionZooKeeperClient zkc, List<ModelFactory> modelFactories, Clock clock) {
+ return createSession(sessionId, zkc, modelFactories, Optional.empty(), clock);
+ }
+
+ private RemoteSession createSession(long sessionId, SessionZooKeeperClient zkc,
+ List<ModelFactory> modelFactories,
+ Optional<PermanentApplicationPackage> permanentApplicationPackage,
+ Clock clock) {
+ zkc.writeStatus(Session.Status.NEW);
+ zkc.writeApplicationId(new ApplicationId.Builder().applicationName("foo").instanceName("bim").build());
+ TestComponentRegistry.Builder registryBuilder = new TestComponentRegistry.Builder()
+ .curator(curator)
+ .clock(clock)
+ .modelFactoryRegistry(new ModelFactoryRegistry(modelFactories));
+ permanentApplicationPackage.ifPresent(registryBuilder::permanentApplicationPackage);
+
+ return new RemoteSession(tenantName, sessionId, registryBuilder.build(), zkc);
+ }
+
+ private static class MockModelFactory implements ModelFactory {
+
+ /** Throw a RuntimeException on load - this is handled gracefully during model building */
+ boolean throwOnLoad = false;
+
+ /** Throw an Error on load - this is useful to propagate this condition all the way to the test */
+ boolean throwErrorOnLoad = false;
+
+ ModelContext modelContext;
+ public Version vespaVersion = new Version(1, 2, 3);
+
+ /** The validation overrides of this, or null if none */
+ private final String validationOverrides;
+
+ private final Clock clock = Clock.fixed(LocalDate.parse("2000-01-01", DateTimeFormatter.ISO_DATE).atStartOfDay().atZone(ZoneOffset.UTC).toInstant(), ZoneOffset.UTC);
+
+ MockModelFactory() { this(null); }
+
+ MockModelFactory(String validationOverrides) {
+ this.validationOverrides = validationOverrides;
+ }
+
+ @Override
+ public Version version() {
+ return vespaVersion;
+ }
+
+ /** Returns the clock used by this, which is fixed at the instant 2000-01-01T00:00:00 */
+ public Clock clock() { return clock; }
+
+ @Override
+ public Model createModel(ModelContext modelContext) {
+ if (throwErrorOnLoad)
+ throw new Error("Foo");
+ if (throwOnLoad)
+ throw new IllegalArgumentException("Foo");
+ this.modelContext = modelContext;
+ return loadModel();
+ }
+
+ Model loadModel() {
+ try {
+ ApplicationPackage application = new MockApplicationPackage.Builder().withEmptyHosts().withEmptyServices().withValidationOverrides(validationOverrides).build();
+ DeployState deployState = new DeployState.Builder().applicationPackage(application).now(clock.instant()).build();
+ return new VespaModel(deployState);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public ModelCreateResult createAndValidateModel(ModelContext modelContext, ValidationParameters validationParameters) {
+ if (throwErrorOnLoad)
+ throw new Error("Foo");
+ if (throwOnLoad)
+ throw new IllegalArgumentException("Foo");
+ this.modelContext = modelContext;
+ return new ModelCreateResult(loadModel(), new ArrayList<>());
+ }
+ }
+
+}
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 c12918034b2..bb87233f979 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
@@ -2,26 +2,14 @@
package com.yahoo.vespa.config.server.session;
import com.yahoo.cloud.config.ConfigserverConfig;
-import com.yahoo.component.Version;
-import com.yahoo.config.application.api.ApplicationPackage;
-import com.yahoo.config.model.api.Model;
-import com.yahoo.config.model.api.ModelContext;
-import com.yahoo.config.model.api.ModelCreateResult;
-import com.yahoo.config.model.api.ModelFactory;
-import com.yahoo.config.model.api.ValidationParameters;
-import com.yahoo.config.model.deploy.DeployState;
-import com.yahoo.config.model.test.MockApplicationPackage;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.TenantName;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.GlobalComponentRegistry;
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.http.InvalidApplicationException;
import com.yahoo.vespa.config.server.http.SessionHandlerTest;
-import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
import com.yahoo.vespa.config.server.zookeeper.ConfigCurator;
import com.yahoo.vespa.config.util.ConfigUtils;
@@ -29,25 +17,16 @@ import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.mock.MockCurator;
import com.yahoo.vespa.flags.FlagSource;
import com.yahoo.vespa.flags.InMemoryFlagSource;
-import com.yahoo.vespa.model.VespaModel;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
-import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
-import java.time.LocalDate;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
import java.util.function.LongPredicate;
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
@@ -74,13 +53,9 @@ public class SessionRepositoryTest {
}
private void setup(FlagSource flagSource) throws Exception {
- setup(flagSource, new TestComponentRegistry.Builder());
- }
-
- private void setup(FlagSource flagSource, TestComponentRegistry.Builder componentRegistryBuilder) throws Exception {
curator = new MockCurator();
File configserverDbDir = temporaryFolder.newFolder().getAbsoluteFile();
- GlobalComponentRegistry globalComponentRegistry = componentRegistryBuilder
+ GlobalComponentRegistry globalComponentRegistry = new TestComponentRegistry.Builder()
.curator(curator)
.configServerConfig(new ConfigserverConfig.Builder()
.configServerDBDir(configserverDbDir.getAbsolutePath())
@@ -100,7 +75,6 @@ public class SessionRepositoryTest {
sessionRepository = tenantRepository.getTenant(tenantName).getSessionRepository();
}
-
@Test
public void require_that_local_sessions_are_created_and_deleted() throws Exception {
setup();
@@ -110,12 +84,6 @@ public class SessionRepositoryTest {
assertNotNull(sessionRepository.getLocalSession(secondSessionId));
assertNull(sessionRepository.getLocalSession(secondSessionId + 1));
- ApplicationSet applicationSet = sessionRepository.ensureApplicationLoaded(sessionRepository.getRemoteSession(firstSessionId));
- assertNotNull(applicationSet);
- assertEquals(2, applicationSet.getApplicationGeneration());
- assertEquals(applicationId.application(), applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getId().application());
- assertNotNull(applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getModel());
-
sessionRepository.close();
// All created sessions are deleted
assertNull(sessionRepository.getLocalSession(firstSessionId));
@@ -182,81 +150,6 @@ public class SessionRepositoryTest {
assertThat(sessionRepository.getRemoteSessions().size(), is(1));
}
- @Test(expected = InvalidApplicationException.class)
- public void require_that_new_invalid_application_throws_exception() throws Exception {
- MockModelFactory failingFactory = new MockModelFactory();
- failingFactory.vespaVersion = new Version(1, 2, 0);
- failingFactory.throwOnLoad = true;
-
- MockModelFactory okFactory = new MockModelFactory();
- okFactory.vespaVersion = new Version(1, 1, 0);
- okFactory.throwOnLoad = false;
-
- TestComponentRegistry.Builder registryBuilder = new TestComponentRegistry.Builder()
- .modelFactoryRegistry(new ModelFactoryRegistry(List.of(okFactory, failingFactory)));
- setup(new InMemoryFlagSource(), registryBuilder);
-
- deploy();
- }
-
- @Test
- public void require_that_old_invalid_application_does_not_throw_exception_if_skipped_also_across_major_versions() throws Exception {
- MockModelFactory failingFactory = new MockModelFactory();
- failingFactory.vespaVersion = new Version(1, 0, 0);
- failingFactory.throwOnLoad = true;
-
- MockModelFactory okFactory =
- new MockModelFactory("<validation-overrides><allow until='2000-01-30'>skip-old-config-models</allow></validation-overrides>");
- okFactory.vespaVersion = new Version(2, 0, 0);
- okFactory.throwOnLoad = false;
-
- TestComponentRegistry.Builder registryBuilder = new TestComponentRegistry.Builder()
- .modelFactoryRegistry(new ModelFactoryRegistry(List.of(okFactory, failingFactory)));
- setup(new InMemoryFlagSource(), registryBuilder);
-
- deploy();
- }
-
- @Test
- public void require_that_an_application_package_can_limit_to_one_major_version() throws Exception {
- MockModelFactory failingFactory = new MockModelFactory();
- failingFactory.vespaVersion = new Version(3, 0, 0);
- failingFactory.throwErrorOnLoad = true;
-
- MockModelFactory okFactory = new MockModelFactory();
- okFactory.vespaVersion = new Version(2, 0, 0);
- okFactory.throwErrorOnLoad = false;
-
- TestComponentRegistry.Builder registryBuilder = new TestComponentRegistry.Builder()
- .modelFactoryRegistry(new ModelFactoryRegistry(List.of(okFactory, failingFactory)));
- setup(new InMemoryFlagSource(), registryBuilder);
-
- File testApp = new File("src/test/apps/app-major-version-2");
- deploy(applicationId, testApp);
-
- // Does not cause an error because model version 3 is skipped
- }
-
- @Test
- public void require_that_an_application_package_can_limit_to_one_higher_major_version() throws Exception {
- MockModelFactory failingFactory = new MockModelFactory();
- failingFactory.vespaVersion = new Version(3, 0, 0);
- failingFactory.throwErrorOnLoad = true;
-
- MockModelFactory okFactory = new MockModelFactory();
- okFactory.vespaVersion = new Version(1, 0, 0);
- okFactory.throwErrorOnLoad = false;
-
- TestComponentRegistry.Builder registryBuilder = new TestComponentRegistry.Builder()
- .modelFactoryRegistry(new ModelFactoryRegistry(List.of(okFactory, failingFactory)));
- setup(new InMemoryFlagSource(), registryBuilder);
-
- File testApp = new File("src/test/apps/app-major-version-2");
- deploy(applicationId, testApp);
-
- // Does not cause an error because model version 3 is skipped
- }
-
private void createSession(long sessionId, boolean wait) {
SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator,
ConfigCurator.create(curator),
@@ -311,74 +204,8 @@ public class SessionRepositoryTest {
}
private long deploy(ApplicationId applicationId) {
- return deploy(applicationId, testApp);
- }
-
- private long deploy(ApplicationId applicationId, File testApp) {
applicationRepository.deploy(testApp, new PrepareParams.Builder().applicationId(applicationId).build());
return applicationRepository.getActiveSession(applicationId).getSessionId();
}
- private static class MockModelFactory implements ModelFactory {
-
- /** Throw a RuntimeException on load - this is handled gracefully during model building */
- boolean throwOnLoad = false;
-
- /** Throw an Error on load - this is useful to propagate this condition all the way to the test */
- boolean throwErrorOnLoad = false;
-
- ModelContext modelContext;
- public Version vespaVersion = new Version(1, 2, 3);
-
- /** The validation overrides of this, or null if none */
- private final String validationOverrides;
-
- private final Clock clock = Clock.fixed(LocalDate.parse("2000-01-01", DateTimeFormatter.ISO_DATE).atStartOfDay().atZone(ZoneOffset.UTC).toInstant(), ZoneOffset.UTC);
-
- MockModelFactory() { this(null); }
-
- MockModelFactory(String validationOverrides) {
- this.validationOverrides = validationOverrides;
- }
-
- @Override
- public Version version() {
- return vespaVersion;
- }
-
- /** Returns the clock used by this, which is fixed at the instant 2000-01-01T00:00:00 */
- public Clock clock() { return clock; }
-
- @Override
- public Model createModel(ModelContext modelContext) {
- if (throwErrorOnLoad)
- throw new Error("error on load");
- if (throwOnLoad)
- throw new IllegalArgumentException("exception on load");
- this.modelContext = modelContext;
- return loadModel();
- }
-
- Model loadModel() {
- try {
- ApplicationPackage application = new MockApplicationPackage.Builder().withEmptyHosts().withEmptyServices().withValidationOverrides(validationOverrides).build();
- DeployState deployState = new DeployState.Builder().applicationPackage(application).now(clock.instant()).build();
- return new VespaModel(deployState);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public ModelCreateResult createAndValidateModel(ModelContext modelContext, ValidationParameters validationParameters) {
- if (throwErrorOnLoad)
- throw new Error("error on load");
- if (throwOnLoad)
- throw new IllegalArgumentException("exception on load");
- this.modelContext = modelContext;
- return new ModelCreateResult(loadModel(), new ArrayList<>());
- }
- }
-
-
}