package com.airbnb.chancery;
import com.airbnb.chancery.github.GithubAuthChecker;
import com.airbnb.chancery.github.GithubClient;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import com.sun.jersey.api.client.Client;
import com.yammer.dropwizard.Service;
import com.yammer.dropwizard.client.JerseyClientBuilder;
import com.yammer.dropwizard.config.Bootstrap;
import com.yammer.dropwizard.config.Environment;
import lombok.extern.slf4j.Slf4j;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.Executors;
@Slf4j
public class ChanceryService extends Service<ChanceryConfig> {
public static void main(String[] args) throws Exception {
new ChanceryService().run(args);
}
@Override
public void initialize(Bootstrap<ChanceryConfig> bootstrap) {
bootstrap.setName("chancery");
}
private EventBus buildCallbackBus(final ChanceryConfig config) {
return new AsyncEventBus(
Executors.newFixedThreadPool(config.getHandlerThreads())
);
}
private Client buildGithubHttpClient(final ChanceryConfig config,
final Environment env) {
return new JerseyClientBuilder().
using(config.getGithubHttpConfig()).
using(env).build();
}
private AmazonS3Client buildS3Client(final ChanceryConfig config) {
return new AmazonS3Client(new BasicAWSCredentials(
config.getAwsAccessKeyID(),
config.getAwsSecretKey()
));
}
@Override
public void run(final ChanceryConfig config, final Environment env)
throws Exception {
final EventBus callbackBus = buildCallbackBus(config);
final GithubClient ghClient = new GithubClient(
buildGithubHttpClient(config, env),
config.getGithubOauth2Token()
);
final String githubSecret = config.getGithubSecret();
final GithubAuthChecker ghAuthChecker =
(githubSecret == null) ? null :
new GithubAuthChecker(githubSecret);
env.addHealthCheck(new GithubClientHealthCheck(ghClient));
final List<RefLoggerConfig> refLoggerConfigs = config.getRefLogs();
if (refLoggerConfigs != null)
for (RefLoggerConfig refLoggerConfig : refLoggerConfigs) {
log.info("Creating ref logger for {}", refLoggerConfig);
final RefLogger refLogger = new RefLogger(refLoggerConfig, ghClient);
callbackBus.register(refLogger);
}
final List<S3ArchiverConfig> s3ArchiverConfigs = config.getS3Archives();
if (s3ArchiverConfigs != null) {
final AmazonS3Client s3Client = buildS3Client(config);
final HashSet<String> buckets = new HashSet<>();
for (S3ArchiverConfig s3ArchiverConfig : s3ArchiverConfigs) {
log.info("Creating S3 archiver for {}", s3ArchiverConfig);
callbackBus.register(new S3Archiver(s3ArchiverConfig, s3Client, ghClient));
buckets.add(s3ArchiverConfig.getBucketName());
}
for (String bucketName : buckets)
env.addHealthCheck(new S3ClientHealthCheck(s3Client, bucketName));
}
final CallbackResource resource = new CallbackResource(ghAuthChecker, callbackBus);
env.addResource(resource);
}
}