package com.hubspot.singularity.s3downloader.server; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.inject.Inject; import com.hubspot.singularity.runner.base.shared.SingularityDriver; import com.hubspot.singularity.s3.base.config.SingularityS3Configuration; import com.hubspot.singularity.s3downloader.config.SingularityS3DownloaderConfiguration; public class SingularityS3DownloaderServer implements SingularityDriver { private static final Logger LOG = LoggerFactory.getLogger(SingularityS3DownloaderServer.class); private final SingularityS3DownloaderConfiguration configuration; private final SingularityS3Configuration s3Configuration; private final SingularityS3DownloaderHandler handler; private Optional<Server> server; @Inject public SingularityS3DownloaderServer(SingularityS3DownloaderConfiguration configuration, SingularityS3Configuration s3Configuration, SingularityS3DownloaderHandler handler) { this.configuration = configuration; this.s3Configuration = s3Configuration; this.handler = handler; this.server = Optional.absent(); } @Override public void shutdown() { if (server.isPresent()) { try { server.get().stop(); } catch (Throwable t) { throw Throwables.propagate(t); } } } @Override public void startAndWait() { Preconditions.checkState(!server.isPresent()); Preconditions.checkState(s3Configuration.getS3AccessKey().isPresent(), "s3AccessKey not set!"); Preconditions.checkState(s3Configuration.getS3SecretKey().isPresent(), "s3SecretKey not set!"); Server server = new Server(); ServerConnector http = new ServerConnector(server); http.setHost("localhost"); http.setPort(s3Configuration.getLocalDownloadHttpPort()); http.setIdleTimeout(configuration.getHttpServerTimeout()); server.addConnector(http); server.setHandler(handler); try { LOG.info("Starting server on {} (configuration: {})", s3Configuration.getLocalDownloadHttpPort(), configuration); server.start(); this.server = Optional.of(server); server.join(); } catch (Throwable t) { throw Throwables.propagate(t); } } }