diff options
Diffstat (limited to 'configserver/src/test')
7 files changed, 68 insertions, 36 deletions
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java index 8a60a439943..5b4eca70364 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java @@ -140,9 +140,14 @@ public class DeployTester { PrepareParams.Builder paramsBuilder = new PrepareParams.Builder().applicationId(id); if (vespaVersion != null) paramsBuilder.vespaVersion(vespaVersion); + LocalSession activeSession = tenant.getLocalSessionRepo().getActiveSession(id); + Optional<com.yahoo.component.Version> currentActiveVespaVersion = Optional.empty(); + if (activeSession != null) + currentActiveVespaVersion = Optional.of(activeSession.getVespaVersion()); session.prepare(new SilentDeployLogger(), paramsBuilder.build(), Optional.empty(), + currentActiveVespaVersion, tenant.getPath(), now); session.createActivateTransaction().commit(); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java index 301ae63fb8c..e3f34cebd6d 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Optional; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -104,6 +105,21 @@ public class HostedDeployTest { } } + // If on hosted vespa and no version is given, the version for the current active application should be used + // This might be the case for manual/emergency deployments not coming from controller + @Test + public void deployWithoutVersionShouldUseActiveVersionOnHostedVespa() throws InterruptedException, IOException { + DeployTester tester = new DeployTester("src/test/apps/hosted/", createConfigserverConfig()); + String vespaVersion = "4.5.6"; + ApplicationId initialApplicationId = tester.deployApp("myApp", vespaVersion, Instant.now()); + long initialSessionId = tester.tenant().getApplicationRepo().getSessionIdForApplication(initialApplicationId); + + ApplicationId applicationId = tester.deployApp("myApp", Instant.now()); // no version + long sessionId = tester.tenant().getApplicationRepo().getSessionIdForApplication(applicationId); + assertNotEquals(initialSessionId, sessionId); + assertEquals(vespaVersion, tester.tenant().getLocalSessionRepo().getSession(sessionId).getVespaVersion().toFullString()); + } + @Test @Ignore //WIP public void testDeployWithDockerImage() throws InterruptedException, IOException { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java index 2c677441c68..8d159da84e3 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java @@ -104,7 +104,10 @@ public class SessionHandlerTest { } @Override - public ConfigChangeActions prepare(DeployLogger logger, PrepareParams params, Optional<ApplicationSet> application, Path tenantPath, Instant now) { + public ConfigChangeActions prepare(DeployLogger logger, PrepareParams params, + Optional<ApplicationSet> applicationSet, + Optional<com.yahoo.component.Version> currentActiveVespaVersion, + Path tenantPath, Instant now) { status = Session.Status.PREPARE; if (doVerboseLogging) { logger.log(LogLevel.DEBUG, "debuglog"); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java index a03940ca95c..5f9d42c9ce6 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.config.server.http.v2; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.UncheckedTimeoutException; import com.yahoo.cloud.config.ConfigserverConfig; +import com.yahoo.component.Version; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.api.ServiceInfo; @@ -408,7 +409,8 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest { @Override public ConfigChangeActions prepare(DeployLogger logger, PrepareParams params, - Optional<ApplicationSet> application, + Optional<ApplicationSet> applicationSet, + Optional<Version> currentActiveVespaVersion, Path tenantPath, Instant now) { throw exception; diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java index df011dd9307..13307e5625f 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java @@ -173,7 +173,7 @@ public class LocalSessionTest { } private void doPrepare(LocalSession session, PrepareParams params, Instant now) { - session.prepare(getLogger(false), params, Optional.empty(), tenantPath, now); + session.prepare(getLogger(false), params, Optional.empty(), Optional.empty(), tenantPath, now); } DeployHandlerLogger getLogger(boolean verbose) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java index 5dc529e3381..06d4039b9ab 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java @@ -21,6 +21,7 @@ import com.yahoo.vespa.config.server.*; import com.yahoo.config.provision.ApplicationId; import com.yahoo.vespa.config.server.application.MemoryTenantApplications; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; +import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; import com.yahoo.vespa.config.server.configchange.MockRestartAction; import com.yahoo.vespa.config.server.configchange.RestartActions; import com.yahoo.vespa.config.server.deploy.DeployHandlerLogger; @@ -100,31 +101,24 @@ public class SessionPreparerTest extends TestWithCurator { @Test(expected = InvalidApplicationException.class) public void require_that_application_validation_exception_is_not_caught() throws IOException, SAXException { - FilesApplicationPackage app = getApplicationPackage(invalidTestApp); - preparer.prepare(getContext(app), getLogger(), new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(invalidTestApp, new PrepareParams.Builder().build()); } @Test public void require_that_application_validation_exception_is_ignored_if_forced() throws IOException, SAXException { - FilesApplicationPackage app = getApplicationPackage(invalidTestApp); - preparer.prepare(getContext(app), getLogger(), - new PrepareParams.Builder().ignoreValidationErrors(true).timeoutBudget(TimeoutBudgetTest.day()).build(), - Optional.empty(), tenantPath, Instant.now()); + prepare(invalidTestApp, + new PrepareParams.Builder().ignoreValidationErrors(true).timeoutBudget(TimeoutBudgetTest.day()).build()); } @Test public void require_that_zookeeper_is_not_written_to_if_dryrun() throws IOException { - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), - new PrepareParams.Builder().dryRun(true).timeoutBudget(TimeoutBudgetTest.day()).build(), - Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().dryRun(true).timeoutBudget(TimeoutBudgetTest.day()).build()); assertFalse(configCurator.exists(sessionsPath.append(ConfigCurator.USERAPP_ZK_SUBPATH).append("services.xml").getAbsolute())); } @Test public void require_that_filedistribution_is_ignored_on_dryrun() throws IOException { - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), - new PrepareParams.Builder().dryRun(true).timeoutBudget(TimeoutBudgetTest.day()).build(), - Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().dryRun(true).timeoutBudget(TimeoutBudgetTest.day()).build()); assertThat(fileDistributionFactory.mockFileDistributionProvider.getMockFileDBHandler().sendDeployedFilesCalled, is(0)); assertThat(fileDistributionFactory.mockFileDistributionProvider.getMockFileDBHandler().limitSendingOfDeployedFilesToCalled, is(0)); assertThat(fileDistributionFactory.mockFileDistributionProvider.getMockFileDBHandler().reloadDeployFileDistributorCalled, is(0)); @@ -132,7 +126,7 @@ public class SessionPreparerTest extends TestWithCurator { @Test public void require_that_application_is_prepared() throws Exception { - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().build()); assertThat(fileDistributionFactory.mockFileDistributionProvider.getMockFileDBHandler().sendDeployedFilesCalled, is(2)); // Should be called only once no matter how many model versions are built assertThat(fileDistributionFactory.mockFileDistributionProvider.getMockFileDBHandler().reloadDeployFileDistributorCalled, is(1)); @@ -145,7 +139,7 @@ public class SessionPreparerTest extends TestWithCurator { new TestModelFactory(Version.fromIntValues(1, 2, 3)), new FailingModelFactory(Version.fromIntValues(3, 2, 1), new IllegalArgumentException("BOOHOO")))); preparer = createPreparer(modelFactoryRegistry, HostProvisionerProvider.empty()); - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().build()); } @Test(expected = InvalidApplicationException.class) @@ -154,14 +148,14 @@ public class SessionPreparerTest extends TestWithCurator { new TestModelFactory(Version.fromIntValues(3, 2, 3)), new FailingModelFactory(Version.fromIntValues(1, 2, 1), new IllegalArgumentException("BOOHOO")))); preparer = createPreparer(modelFactoryRegistry, HostProvisionerProvider.empty()); - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().build()); } @Test(expected = InvalidApplicationException.class) public void require_exception_for_overlapping_host() throws IOException { SessionContext ctx = getContext(getApplicationPackage(testApp)); ((HostRegistry<ApplicationId>)ctx.getHostValidator()).update(applicationId("foo"), Collections.singletonList("mytesthost")); - preparer.prepare(ctx, new BaseDeployLogger(), new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(new PrepareParams.Builder().build(), new BaseDeployLogger(), ctx); } @Test @@ -173,7 +167,7 @@ public class SessionPreparerTest extends TestWithCurator { System.out.println(level + ": "+message); if (level.equals(LogLevel.WARNING) && message.contains("The host mytesthost is already in use")) logged.append("ok"); }; - preparer.prepare(ctx, logger, new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, new PrepareParams.Builder().build(), logger); assertEquals(logged.toString(), ""); } @@ -184,7 +178,7 @@ public class SessionPreparerTest extends TestWithCurator { .tenant(tenant) .applicationName("foo").instanceName("quux").build(); PrepareParams params = new PrepareParams.Builder().applicationId(origId).build(); - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), params, Optional.empty(), tenantPath, Instant.now()); + prepare(testApp, params); SessionZooKeeperClient zkc = new SessionZooKeeperClient(curator, sessionsPath); assertTrue(configCurator.exists(sessionsPath.append(SessionZooKeeperClient.APPLICATION_ID_PATH).getAbsolute())); assertThat(zkc.readApplicationId(), is(origId)); @@ -199,10 +193,8 @@ public class SessionPreparerTest extends TestWithCurator { new ConfigChangeActionsModelFactory(Version.fromIntValues(1, 2, 4), new MockRestartAction("other change", Arrays.asList(service))))); preparer = createPreparer(modelFactoryRegistry, HostProvisionerProvider.empty()); - List<RestartActions.Entry> actions = - preparer.prepare(getContext(getApplicationPackage(testApp)), getLogger(), - new PrepareParams.Builder().build(), Optional.empty(), tenantPath, Instant.now()) - .getRestartActions().getEntries(); + List<RestartActions.Entry> actions = prepare(testApp, new PrepareParams.Builder().build()) + .getRestartActions().getEntries(); assertThat(actions.size(), is(1)); assertThat(actions.get(0).getMessages(), equalTo(ImmutableSet.of("change", "other change"))); } @@ -217,7 +209,7 @@ public class SessionPreparerTest extends TestWithCurator { final ApplicationId applicationId = applicationId("test"); PrepareParams params = new PrepareParams.Builder().applicationId(applicationId).rotations(rotations).build(); File app = new File("src/test/resources/deploy/app"); - preparer.prepare(getContext(getApplicationPackage(app)), getLogger(), params, Optional.empty(), tenantPath, Instant.now()); + prepare(app, params); assertThat(readRotationsFromZK(applicationId), contains(new Rotation(rotations))); } @@ -233,7 +225,7 @@ public class SessionPreparerTest extends TestWithCurator { new Rotations(curator, tenantPath).writeRotationsToZooKeeper(applicationId, Collections.singleton(new Rotation(rotations))); final PrepareParams params = new PrepareParams.Builder().applicationId(applicationId).build(); final File app = new File("src/test/resources/deploy/app"); - preparer.prepare(getContext(getApplicationPackage(app)), getLogger(), params, Optional.empty(), tenantPath, Instant.now()); + prepare(app, params); // check that the rotation from zookeeper were used final ModelContext modelContext = modelFactory.getModelContext(); @@ -244,6 +236,19 @@ public class SessionPreparerTest extends TestWithCurator { assertThat(readRotationsFromZK(applicationId), contains(new Rotation(rotations))); } + private ConfigChangeActions prepare(File app, PrepareParams params) throws IOException { + return prepare(app, params, getLogger()); + } + + private ConfigChangeActions prepare(File app, PrepareParams params, DeployLogger logger) throws IOException { + return prepare(params, logger, getContext(getApplicationPackage(app))); + } + + private ConfigChangeActions prepare(PrepareParams params, DeployLogger logger, SessionContext sessionContext) throws IOException { + return preparer.prepare(sessionContext, logger, params, Optional.empty(), + Optional.empty(), tenantPath, Instant.now()); + } + private SessionContext getContext(FilesApplicationPackage app) throws IOException { return new SessionContext(app, new SessionZooKeeperClient(curator, sessionsPath), app.getAppDir(), new MemoryTenantApplications(), new HostRegistry<>(), new SuperModelGenerationCounter(curator)); } @@ -254,12 +259,8 @@ public class SessionPreparerTest extends TestWithCurator { return FilesApplicationPackage.fromFile(appDir); } - DeployHandlerLogger getLogger() { - return getLogger(false); - } - - DeployHandlerLogger getLogger(boolean verbose) { - return new DeployHandlerLogger(new Slime().get(), verbose, + private DeployHandlerLogger getLogger() { + return new DeployHandlerLogger(new Slime().get(), false, new ApplicationId.Builder().tenant("testtenant").applicationName("testapp").build()); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java index 71b31754c5d..d2db5d06193 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.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.session; +import com.yahoo.component.Version; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.path.Path; import com.yahoo.vespa.config.server.application.ApplicationSet; @@ -18,14 +19,18 @@ import java.util.Optional; public class SessionTest { public static class MockSessionPreparer extends SessionPreparer { - public boolean isPrepared = false; + boolean isPrepared = false; public MockSessionPreparer() { - super(null, null, null, null, null, null, new MockCurator(), null); + super(null, null, null, null, + null, null, new MockCurator(), null); } @Override - public ConfigChangeActions prepare(SessionContext context, DeployLogger logger, PrepareParams params, Optional<ApplicationSet> currentActiveApplicationSet, Path tenantPath, Instant now) { + public ConfigChangeActions prepare(SessionContext context, DeployLogger logger, PrepareParams params, + Optional<ApplicationSet> currentActiveApplicationSet, + Optional<Version> currentVespaVersion, + Path tenantPath, Instant now) { isPrepared = true; return new ConfigChangeActions(new ArrayList<>()); } |