All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.cdap.cdap.internal.app.sourcecontrol.LocalApplicationManager Maven / Gradle / Ivy

The newest version!
/*
 * Copyright © 2023 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 io.cdap.cdap.internal.app.sourcecontrol;

import com.google.inject.Inject;
import io.cdap.cdap.common.ApplicationNotFoundException;
import io.cdap.cdap.common.BadRequestException;
import io.cdap.cdap.common.NotFoundException;
import io.cdap.cdap.common.app.RunIds;
import io.cdap.cdap.internal.app.services.ApplicationLifecycleService;
import io.cdap.cdap.metadata.LocalApplicationDetailFetcher;
import io.cdap.cdap.proto.ApplicationDetail;
import io.cdap.cdap.proto.app.AppVersion;
import io.cdap.cdap.proto.app.MarkLatestAppsRequest;
import io.cdap.cdap.proto.app.UpdateMultiSourceControlMetaReqeust;
import io.cdap.cdap.proto.artifact.AppRequest;
import io.cdap.cdap.proto.id.ApplicationId;
import io.cdap.cdap.proto.id.ApplicationReference;
import io.cdap.cdap.proto.id.NamespaceId;
import io.cdap.cdap.proto.sourcecontrol.SourceControlMeta;
import io.cdap.cdap.security.spi.authorization.UnauthorizedException;
import io.cdap.cdap.sourcecontrol.ApplicationManager;
import io.cdap.cdap.sourcecontrol.SourceControlException;
import io.cdap.cdap.sourcecontrol.operationrunner.PullAppResponse;
import java.io.IOException;
import java.time.Clock;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Local implementation of {@link ApplicationManager} to fetch/update data while running in
 * app-fabric.
 */
public class LocalApplicationManager implements ApplicationManager {

  private final ApplicationLifecycleService appLifeCycleService;
  private final LocalApplicationDetailFetcher appDetailsFetcher;
  private final Clock clock;

  private static final Logger LOG = LoggerFactory.getLogger(LocalApplicationManager.class);


  @Inject
  LocalApplicationManager(ApplicationLifecycleService appLifeCycleService,
      LocalApplicationDetailFetcher fetcher) {
    this(appLifeCycleService, fetcher, Clock.systemUTC());
  }

  LocalApplicationManager(ApplicationLifecycleService appLifeCycleService,
      LocalApplicationDetailFetcher fetcher, Clock clock) {
    this.appLifeCycleService = appLifeCycleService;
    this.appDetailsFetcher = fetcher;
    this.clock = clock;
  }


  @Override
  public ApplicationId deployApp(ApplicationReference appRef, PullAppResponse pullDetails)
      throws Exception {
    String versionId = RunIds.generate().getId();
    ApplicationId appId = appRef.app(versionId);

    AppRequest appRequest = pullDetails.getAppRequest();
    SourceControlMeta sourceControlMeta = new SourceControlMeta(
        pullDetails.getApplicationFileHash(), pullDetails.getCommitId(), clock.instant());

    LOG.info("Start to deploy app {} in namespace {} without marking latest",
        appId.getApplication(), appId.getParent());

    appLifeCycleService.deployApp(appId, appRequest, sourceControlMeta, x -> {
    }, true);
    return appId;
  }

  @Override
  public void markAppVersionsLatest(NamespaceId namespace, List apps)
      throws SourceControlException, ApplicationNotFoundException, BadRequestException, IOException {
    MarkLatestAppsRequest request = new MarkLatestAppsRequest(apps);
    LOG.info("Marking latest in namespace {} : {}", namespace, apps);
      appLifeCycleService.markAppsAsLatest(namespace, request);
  }

  @Override
  public void updateSourceControlMeta(NamespaceId namespace,
      UpdateMultiSourceControlMetaReqeust metas)
      throws SourceControlException, BadRequestException, IOException {
      appLifeCycleService.updateSourceControlMeta(namespace, metas);
  }

  @Override
  public ApplicationDetail get(ApplicationReference appRef)
      throws IOException, NotFoundException, UnauthorizedException {
    return appDetailsFetcher.get(appRef);
  }

}






© 2015 - 2024 Weber Informatics LLC | Privacy Policy