/* * Copyright © 2014-2016 Cask Data, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package co.cask.cdap.internal.app.deploy; import co.cask.cdap.api.metrics.MetricStore; import co.cask.cdap.app.deploy.Manager; import co.cask.cdap.app.store.Store; import co.cask.cdap.common.conf.CConfiguration; import co.cask.cdap.common.namespace.NamespacedLocationFactory; import co.cask.cdap.data2.dataset2.DatasetFramework; import co.cask.cdap.data2.metadata.store.MetadataStore; import co.cask.cdap.data2.registry.UsageRegistry; import co.cask.cdap.data2.transaction.queue.QueueAdmin; import co.cask.cdap.data2.transaction.stream.StreamAdmin; import co.cask.cdap.data2.transaction.stream.StreamConsumerFactory; import co.cask.cdap.internal.app.deploy.pipeline.ApplicationRegistrationStage; import co.cask.cdap.internal.app.deploy.pipeline.ApplicationVerificationStage; import co.cask.cdap.internal.app.deploy.pipeline.CreateDatasetInstancesStage; import co.cask.cdap.internal.app.deploy.pipeline.CreateSchedulesStage; import co.cask.cdap.internal.app.deploy.pipeline.CreateStreamsStage; import co.cask.cdap.internal.app.deploy.pipeline.DeletedProgramHandlerStage; import co.cask.cdap.internal.app.deploy.pipeline.DeployDatasetModulesStage; import co.cask.cdap.internal.app.deploy.pipeline.LocalArtifactLoaderStage; import co.cask.cdap.internal.app.deploy.pipeline.ProgramGenerationStage; import co.cask.cdap.internal.app.deploy.pipeline.SystemMetadataWriterStage; import co.cask.cdap.internal.app.runtime.artifact.ArtifactRepository; import co.cask.cdap.internal.app.runtime.schedule.Scheduler; import co.cask.cdap.pipeline.Pipeline; import co.cask.cdap.pipeline.PipelineFactory; import co.cask.cdap.proto.Id; import co.cask.cdap.security.authorization.AuthorizerInstantiatorService; import com.google.common.util.concurrent.ListenableFuture; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.google.inject.name.Named; import javax.annotation.Nullable; /** * This class is concrete implementation of {@link Manager} that deploys an Application. * * @param <I> Input type. * @param <O> Output type. */ public class LocalApplicationManager<I, O> implements Manager<I, O> { private final PipelineFactory pipelineFactory; private final NamespacedLocationFactory namespacedLocationFactory; private final CConfiguration configuration; private final Store store; private final StreamConsumerFactory streamConsumerFactory; private final QueueAdmin queueAdmin; private final StreamAdmin streamAdmin; private final Scheduler scheduler; private final ProgramTerminator programTerminator; private final DatasetFramework datasetFramework; private final DatasetFramework inMemoryDatasetFramework; private final MetricStore metricStore; private final UsageRegistry usageRegistry; private final ArtifactRepository artifactRepository; private final MetadataStore metadataStore; private final AuthorizerInstantiatorService authorizerInstantiatorService; @Inject LocalApplicationManager(CConfiguration configuration, PipelineFactory pipelineFactory, NamespacedLocationFactory namespacedLocationFactory, Store store, StreamConsumerFactory streamConsumerFactory, QueueAdmin queueAdmin, DatasetFramework datasetFramework, @Named("datasetMDS") DatasetFramework inMemoryDatasetFramework, StreamAdmin streamAdmin, Scheduler scheduler, @Assisted ProgramTerminator programTerminator, MetricStore metricStore, UsageRegistry usageRegistry, ArtifactRepository artifactRepository, MetadataStore metadataStore, AuthorizerInstantiatorService authorizerInstantiatorService) { this.configuration = configuration; this.namespacedLocationFactory = namespacedLocationFactory; this.pipelineFactory = pipelineFactory; this.store = store; this.streamConsumerFactory = streamConsumerFactory; this.queueAdmin = queueAdmin; this.programTerminator = programTerminator; this.datasetFramework = datasetFramework; this.inMemoryDatasetFramework = inMemoryDatasetFramework; this.streamAdmin = streamAdmin; this.scheduler = scheduler; this.metricStore = metricStore; this.usageRegistry = usageRegistry; this.artifactRepository = artifactRepository; this.metadataStore = metadataStore; this.authorizerInstantiatorService = authorizerInstantiatorService; } @Override public ListenableFuture<O> deploy(Id.Namespace namespace, @Nullable String appId, I input) throws Exception { Pipeline<O> pipeline = pipelineFactory.getPipeline(); pipeline.addLast(new LocalArtifactLoaderStage(configuration, store, namespace, appId, artifactRepository)); pipeline.addLast(new ApplicationVerificationStage(store, datasetFramework)); pipeline.addLast(new DeployDatasetModulesStage(configuration, namespace, datasetFramework, inMemoryDatasetFramework)); pipeline.addLast(new CreateDatasetInstancesStage(configuration, datasetFramework, namespace)); pipeline.addLast(new CreateStreamsStage(namespace, streamAdmin)); pipeline.addLast(new DeletedProgramHandlerStage(store, programTerminator, streamConsumerFactory, queueAdmin, metricStore, metadataStore, authorizerInstantiatorService.get())); pipeline.addLast(new ProgramGenerationStage(configuration, namespacedLocationFactory, authorizerInstantiatorService.get())); pipeline.addLast(new ApplicationRegistrationStage(store, usageRegistry)); pipeline.addLast(new CreateSchedulesStage(scheduler)); pipeline.addLast(new SystemMetadataWriterStage(metadataStore)); return pipeline.execute(input); } }