diff options
Diffstat (limited to 'controller-server')
6 files changed, 77 insertions, 16 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index 5e775ea6cd3..9f47472284f 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -25,6 +25,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NoInstanceException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationStore; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ArtifactRepository; import com.yahoo.vespa.hosted.controller.api.integration.dns.NameService; import com.yahoo.vespa.hosted.controller.api.integration.dns.Record; @@ -86,6 +87,7 @@ public class ApplicationController { private final CuratorDb curator; private final ArtifactRepository artifactRepository; + private final ApplicationStore applicationStore; private final RotationRepository rotationRepository; private final AthenzClientFactory zmsClientFactory; private final NameService nameService; @@ -98,7 +100,7 @@ public class ApplicationController { ApplicationController(Controller controller, CuratorDb curator, AthenzClientFactory zmsClientFactory, RotationsConfig rotationsConfig, NameService nameService, ConfigServer configServer, - ArtifactRepository artifactRepository, + ArtifactRepository artifactRepository, ApplicationStore applicationStore, RoutingGenerator routingGenerator, BuildService buildService, Clock clock) { this.controller = controller; this.curator = curator; @@ -109,6 +111,7 @@ public class ApplicationController { this.clock = clock; this.artifactRepository = artifactRepository; + this.applicationStore = applicationStore; this.rotationRepository = new RotationRepository(rotationsConfig, this, curator); this.deploymentTrigger = new DeploymentTrigger(controller, buildService, clock); @@ -143,6 +146,8 @@ public class ApplicationController { public ArtifactRepository artifacts() { return artifactRepository; } + public ApplicationStore applicationStore() { return applicationStore; } + /** * Set the rotations marked as 'global' either 'in' or 'out of' service. * @@ -299,7 +304,12 @@ public class ApplicationController { applicationVersion = preferOldestVersion ? triggered.sourceApplication().orElse(triggered.application()) : triggered.application(); - applicationPackage = new ApplicationPackage(artifactRepository.getApplicationPackage(application.get().id(), applicationVersion.id())); + + if (application.get().deploymentJobs().builtInternally()) { + applicationPackage = new ApplicationPackage(applicationStore.getApplicationPackage(application.get().id(), applicationVersion.id())); + } else { + applicationPackage = new ApplicationPackage(artifactRepository.getApplicationPackage(application.get().id(), applicationVersion.id())); + } validateRun(application.get(), zone, platformVersion, applicationVersion); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java index f8be9f55b84..22af16fdce8 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java @@ -17,6 +17,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.MetricsService; import com.yahoo.vespa.hosted.controller.api.integration.athenz.AthenzClientFactory; import com.yahoo.vespa.hosted.controller.api.integration.chef.Chef; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServer; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationStore; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ArtifactRepository; import com.yahoo.vespa.hosted.controller.api.integration.dns.NameService; import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService; @@ -87,11 +88,12 @@ public class Controller extends AbstractComponent { ZoneRegistry zoneRegistry, ConfigServer configServer, MetricsService metricsService, NameService nameService, RoutingGenerator routingGenerator, Chef chef, AthenzClientFactory athenzClientFactory, - ArtifactRepository artifactRepository, BuildService buildService, LogStore logStore) { + ArtifactRepository artifactRepository, ApplicationStore applicationStore, + BuildService buildService, LogStore logStore) { this(curator, rotationsConfig, gitHub, entityService, organization, globalRoutingService, zoneRegistry, configServer, metricsService, nameService, routingGenerator, chef, - Clock.systemUTC(), athenzClientFactory, artifactRepository, buildService, + Clock.systemUTC(), athenzClientFactory, artifactRepository, applicationStore, buildService, logStore, com.yahoo.net.HostName::getLocalhost); } @@ -102,6 +104,7 @@ public class Controller extends AbstractComponent { MetricsService metricsService, NameService nameService, RoutingGenerator routingGenerator, Chef chef, Clock clock, AthenzClientFactory athenzClientFactory, ArtifactRepository artifactRepository, + ApplicationStore applicationStore, BuildService buildService, LogStore logStore, Supplier<String> hostnameSupplier) { this.hostnameSupplier = Objects.requireNonNull(hostnameSupplier, "HostnameSupplier cannot be null"); @@ -123,6 +126,7 @@ public class Controller extends AbstractComponent { Objects.requireNonNull(nameService, "NameService cannot be null"), configServer, Objects.requireNonNull(artifactRepository, "ArtifactRepository cannot be null"), + Objects.requireNonNull(applicationStore, "ApplicationStore cannot be null"), Objects.requireNonNull(routingGenerator, "RoutingGenerator cannot be null"), Objects.requireNonNull(buildService, "BuildService cannot be null"), clock); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java index cf9da750949..36dab609be3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java @@ -167,7 +167,9 @@ public class JobController { controller.applications().store(application.withBuiltInternally(true))); } - /** Accepts and stores a new application package and test jar pair under a generated application version key. */ + /** + * Accepts and stores a new application package and test jar pair under a generated application version key. + */ public ApplicationVersion submit(ApplicationId id, SourceRevision revision, byte[] applicationPackage, byte[] applicationTestPackage) { AtomicReference<ApplicationVersion> version = new AtomicReference<>(); @@ -175,16 +177,16 @@ public class JobController { long run = nextBuild(id); version.set(ApplicationVersion.from(revision, run)); - controller.applications().artifacts().putApplicationPackage(id, - version.get().id(), - applicationPackage); - controller.applications().artifacts().putTesterPackage(InternalStepRunner.testerOf(id), - version.get().id(), - applicationTestPackage); + controller.applications().applicationStore().putApplicationPackage(id, + version.get().id(), + applicationPackage); + controller.applications().applicationStore().putTesterPackage(InternalStepRunner.testerOf(id), + version.get().id(), + applicationTestPackage); application = application.withBuiltInternally(true); controller.applications().store(controller.applications().withUpdatedConfig(application, - new ApplicationPackage(applicationPackage))); + new ApplicationPackage(applicationPackage))); notifyOfNewSubmission(id, revision, run); }); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java index 106cd280098..dcc28360696 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java @@ -15,6 +15,7 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.api.integration.BuildService; import com.yahoo.vespa.hosted.controller.api.integration.chef.ChefMock; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationStore; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ArtifactRepository; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.dns.MemoryNameService; @@ -30,6 +31,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock; import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzDbMock; +import com.yahoo.vespa.hosted.controller.integration.ApplicationStoreMock; import com.yahoo.vespa.hosted.controller.integration.ArtifactRepositoryMock; import com.yahoo.vespa.hosted.controller.integration.ConfigServerMock; import com.yahoo.vespa.hosted.controller.integration.MetricsServiceMock; @@ -67,6 +69,7 @@ public final class ControllerTester { private final MemoryNameService nameService; private final RotationsConfig rotationsConfig; private final ArtifactRepositoryMock artifactRepository; + private final ApplicationStoreMock applicationStore; private final EntityService entityService; private final MockBuildService buildService; private final MetricsServiceMock metricsService; @@ -78,7 +81,8 @@ public final class ControllerTester { MetricsServiceMock metricsService) { this(new AthenzDbMock(), clock, new ConfigServerMock(new ZoneRegistryMock()), new ZoneRegistryMock(), new GitHubMock(), curatorDb, rotationsConfig, - new MemoryNameService(), new ArtifactRepositoryMock(), new MemoryEntityService(), new MockBuildService(), + new MemoryNameService(), new ArtifactRepositoryMock(), new ApplicationStoreMock(), + new MemoryEntityService(), new MockBuildService(), metricsService, new RoutingGeneratorMock()); } @@ -102,6 +106,7 @@ public final class ControllerTester { ConfigServerMock configServer, ZoneRegistryMock zoneRegistry, GitHubMock gitHub, CuratorDb curator, RotationsConfig rotationsConfig, MemoryNameService nameService, ArtifactRepositoryMock artifactRepository, + ApplicationStoreMock appStoreMock, EntityService entityService, MockBuildService buildService, MetricsServiceMock metricsService, RoutingGeneratorMock routingGenerator) { this.athenzDb = athenzDb; @@ -113,12 +118,13 @@ public final class ControllerTester { this.nameService = nameService; this.rotationsConfig = rotationsConfig; this.artifactRepository = artifactRepository; + this.applicationStore = appStoreMock; this.entityService = entityService; this.buildService = buildService; this.metricsService = metricsService; this.routingGenerator = routingGenerator; this.controller = createController(curator, rotationsConfig, configServer, clock, gitHub, zoneRegistry, - athenzDb, nameService, artifactRepository, entityService, buildService, + athenzDb, nameService, artifactRepository, appStoreMock, entityService, buildService, metricsService, routingGenerator); // Make root logger use time from manual clock @@ -158,7 +164,7 @@ public final class ControllerTester { /** Create a new controller instance. Useful to verify that controller state is rebuilt from persistence */ public final void createNewController() { controller = createController(curator, rotationsConfig, configServer, clock, gitHub, zoneRegistry, athenzDb, - nameService, artifactRepository, entityService, buildService, metricsService, + nameService, artifactRepository, applicationStore, entityService, buildService, metricsService, routingGenerator); } @@ -272,7 +278,8 @@ public final class ControllerTester { ConfigServerMock configServer, ManualClock clock, GitHubMock gitHub, ZoneRegistryMock zoneRegistryMock, AthenzDbMock athensDb, MemoryNameService nameService, - ArtifactRepository artifactRepository, EntityService entityService, + ArtifactRepository artifactRepository, ApplicationStore applicationStore, + EntityService entityService, BuildService buildService, MetricsServiceMock metricsService, RoutingGenerator routingGenerator) { Controller controller = new Controller(curator, @@ -290,6 +297,7 @@ public final class ControllerTester { clock, new AthenzClientFactoryMock(athensDb), artifactRepository, + applicationStore, buildService, new MockLogStore(), () -> "test-controller"); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ApplicationStoreMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ApplicationStoreMock.java new file mode 100644 index 00000000000..bb242dd7989 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ApplicationStoreMock.java @@ -0,0 +1,36 @@ +package com.yahoo.vespa.hosted.controller.integration; + +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationStore; + +import java.util.HashMap; +import java.util.Map; + +public class ApplicationStoreMock implements ApplicationStore { + + Map<String, byte[]> store = new HashMap<>(); + + @Override + public byte[] getApplicationPackage(ApplicationId application, String applicationVersion) { + return store.get(path(application, applicationVersion)); + } + + @Override + public void putApplicationPackage(ApplicationId application, String applicationVersion, byte[] applicationPackage) { + store.put(path(application, applicationVersion), applicationPackage); + } + + @Override + public void putTesterPackage(ApplicationId tester, String applicationVersion, byte[] testerPackage) { + store.put(path(tester, applicationVersion), testerPackage); + } + + @Override + public byte[] getTesterPackage(ApplicationId tester, String applicationVersion) { + return store.get(path(tester, applicationVersion)); + } + + String path(ApplicationId tester, String applicationVersion) { + return tester.toString() + applicationVersion; + } +} diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java index 639cfad9958..978e8bce2f4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java @@ -81,6 +81,7 @@ public class ControllerContainerTest { " <component id='com.yahoo.vespa.hosted.controller.maintenance.JobControl'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.integration.RoutingGeneratorMock'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.integration.ArtifactRepositoryMock'/>\n" + + " <component id='com.yahoo.vespa.hosted.controller.integration.ApplicationStoreMock'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockTesterCloud'/>\n" + " <handler id='com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiHandler'>\n" + " <binding>http://*/application/v4/*</binding>\n" + |