package com.intuit.tank.vmManager.environment.amazon;
/*
* #%L
* VmManager
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.intuit.tank.vm.settings.CloudCredentials;
import com.intuit.tank.vm.settings.CloudProvider;
import com.intuit.tank.vm.settings.TankConfig;
public class AmazonS3 {
private static final Logger LOG = LogManager.getLogger(AmazonS3.class);
private AmazonS3Client s3Client;
/**
*
*/
public AmazonS3() {
try {
CloudCredentials creds = new TankConfig().getVmManagerConfig().getCloudCredentials(
CloudProvider.amazon);
ClientConfiguration config = new ClientConfiguration();
if (StringUtils.isNotBlank(System.getProperty("http.proxyHost"))) {
try {
config.setProxyHost(System.getProperty("http.proxyHost"));
if (StringUtils.isNotBlank(System.getProperty("http.proxyPort"))) {
config.setProxyPort(Integer.valueOf(System.getProperty("http.proxyPort")));
}
} catch (NumberFormatException e) {
LOG.error("invalid proxy setup.");
}
}
if (StringUtils.isNotBlank(creds.getKeyId()) && StringUtils.isNotBlank(creds.getKey())) {
BasicAWSCredentials credentials = new BasicAWSCredentials(creds.getKeyId(), creds.getKey());
this.s3Client = new AmazonS3Client(credentials, config);
} else {
this.s3Client = new AmazonS3Client(config);
}
} catch (Exception ex) {
LOG.error(ex.getMessage());
throw new RuntimeException(ex);
}
}
public void createBucket(String bucketName) {
AccessControlList configuration = s3Client.getBucketAcl(bucketName);
if (configuration == null) {
Bucket bucket = s3Client.createBucket(bucketName);
LOG.info("Created bucket " + bucket.getName() + " at " + bucket.getCreationDate());
}
}
/**
*
* @param key
* @param scriptFile
* @return
*/
public void storeFile(String bucketName, String path, Map<String, String> metaMap, InputStream in) {
ObjectMetadata metaData = new ObjectMetadata();
if (metaMap != null) {
for (Entry<String, String> entry : metaMap.entrySet()) {
metaData.addUserMetadata(entry.getKey(), entry.getValue());
}
}
s3Client.putObject(bucketName, path, in, metaData);
}
/**
*
* @param key
* @return
*/
public InputStream getFile(String bucketName, String path) {
InputStream ret = null;
S3ObjectInputStream objectContent = null;
try {
S3Object object = s3Client.getObject(bucketName, path);
if (object != null) {
ByteArrayOutputStream temp = new ByteArrayOutputStream();
objectContent = object.getObjectContent();
IOUtils.copy(objectContent, temp);
ret = new ByteArrayInputStream(temp.toByteArray());
}
} catch (Exception e) {
LOG.error("Error getting File: " + e, e);
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(objectContent);
}
return ret;
}
/**
* gets the metadata associated with the file
*
* @param bucketName
* the base bucketname
* @param path
* the
* @return
*/
public Map<String, String> getFileMetaData(String bucketName, String path) {
Map<String, String> ret = new HashMap<String, String>();
try {
ObjectMetadata objectMetadata = s3Client.getObjectMetadata(bucketName, path);
if (objectMetadata != null) {
for (Entry<String, Object> entry : objectMetadata.getRawMetadata().entrySet()) {
ret.put(entry.getKey(), entry.getValue().toString());
}
}
} catch (Exception e) {
LOG.error("Error getting MetaData: " + e, e);
throw new RuntimeException(e);
}
return ret;
}
}