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

com.netflix.spinnaker.front50.config.S3Config Maven / Gradle / Ivy

The newest version!
package com.netflix.spinnaker.front50.config;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.spectator.api.Registry;
import com.netflix.spinnaker.front50.api.model.Timestamped;
import com.netflix.spinnaker.front50.api.model.pipeline.Pipeline;
import com.netflix.spinnaker.front50.jackson.mixins.PipelineMixins;
import com.netflix.spinnaker.front50.jackson.mixins.TimestampedMixins;
import com.netflix.spinnaker.front50.model.*;
import com.netflix.spinnaker.front50.plugins.PluginBinaryStorageService;
import com.netflix.spinnaker.front50.plugins.S3PluginBinaryStorageService;
import com.netflix.spinnaker.kork.aws.bastion.BastionConfig;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Optional;
import java.util.concurrent.Executors;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@ConditionalOnProperty("spinnaker.s3.enabled")
@Import(BastionConfig.class)
@EnableConfigurationProperties({S3MetadataStorageProperties.class, S3PluginStorageProperties.class})
public class S3Config {

  @Bean
  @ConditionalOnProperty(value = "spinnaker.s3.storage-service.enabled", matchIfMissing = true)
  public AmazonS3 awsS3MetadataClient(
      AWSCredentialsProvider awsCredentialsProvider, S3MetadataStorageProperties s3Properties) {
    return S3ClientFactory.create(awsCredentialsProvider, s3Properties);
  }

  @Bean
  @ConditionalOnProperty(value = "spinnaker.s3.storage-service.enabled", matchIfMissing = true)
  public S3StorageService s3StorageService(
      AmazonS3 awsS3MetadataClient, S3MetadataStorageProperties s3Properties) {
    ObjectMapper awsObjectMapper =
        new ObjectMapper()
            .addMixIn(Timestamped.class, TimestampedMixins.class)
            .addMixIn(Pipeline.class, PipelineMixins.class);

    S3StorageService service =
        new S3StorageService(
            awsObjectMapper,
            awsS3MetadataClient,
            s3Properties.getBucket(),
            s3Properties.getRootFolder(),
            s3Properties.isFailoverEnabled(),
            s3Properties.getRegion(),
            s3Properties.getVersioning(),
            s3Properties.getMaxKeys(),
            s3Properties.getServerSideEncryption());
    service.ensureBucketExists();

    return service;
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.plugin-storage.enabled")
  public AmazonS3 awsS3PluginClient(
      AWSCredentialsProvider awsCredentialsProvider, S3PluginStorageProperties s3Properties) {
    return S3ClientFactory.create(awsCredentialsProvider, s3Properties);
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.plugin-storage.enabled")
  PluginBinaryStorageService pluginBinaryStorageService(
      AmazonS3 awsS3PluginClient, S3PluginStorageProperties properties) {
    return new S3PluginBinaryStorageService(awsS3PluginClient, properties);
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.eventing.enabled")
  public AmazonSQS awsSQSClient(
      AWSCredentialsProvider awsCredentialsProvider, S3MetadataStorageProperties s3Properties) {
    return AmazonSQSClientBuilder.standard()
        .withCredentials(awsCredentialsProvider)
        .withClientConfiguration(new ClientConfiguration())
        .withRegion(s3Properties.getRegion())
        .build();
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.eventing.enabled")
  public AmazonSNS awsSNSClient(
      AWSCredentialsProvider awsCredentialsProvider, S3MetadataStorageProperties s3Properties) {
    return AmazonSNSClientBuilder.standard()
        .withCredentials(awsCredentialsProvider)
        .withClientConfiguration(new ClientConfiguration())
        .withRegion(s3Properties.getRegion())
        .build();
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.eventing.enabled")
  public TemporarySQSQueue temporaryQueueSupport(
      Optional applicationInfoManager,
      AmazonSQS amazonSQS,
      AmazonSNS amazonSNS,
      S3MetadataStorageProperties s3Properties) {
    return new TemporarySQSQueue(
        amazonSQS,
        amazonSNS,
        s3Properties.getEventing().getSnsTopicName(),
        getInstanceId(applicationInfoManager));
  }

  @Bean
  @ConditionalOnProperty("spinnaker.s3.eventing.enabled")
  public ObjectKeyLoader eventingS3ObjectKeyLoader(
      ObjectMapper objectMapper,
      S3MetadataStorageProperties s3Properties,
      StorageService storageService,
      TemporarySQSQueue temporaryQueueSupport,
      Registry registry) {
    return new EventingS3ObjectKeyLoader(
        Executors.newFixedThreadPool(1),
        objectMapper,
        s3Properties,
        temporaryQueueSupport,
        storageService,
        registry,
        true);
  }

  /**
   * This will likely need improvement should it ever need to run in a non-eureka environment.
   *
   * @return instance identifier that will be used to create a uniquely named sqs queue
   */
  private static String getInstanceId(Optional applicationInfoManager) {
    if (applicationInfoManager.isPresent()) {
      return applicationInfoManager.get().getInfo().getInstanceId();
    }

    try {
      return InetAddress.getLocalHost().getHostName();
    } catch (UnknownHostException e) {
      throw new IllegalStateException(e);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy