Skip to content

Commit

Permalink
Merge pull request #73 from bsideup/feature/metadata_overrides
Browse files Browse the repository at this point in the history
Metadata overrides per entry
  • Loading branch information
ndeloof committed Nov 6, 2015
2 parents e33be15 + 386a860 commit a57c89b
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 25 deletions.
10 changes: 9 additions & 1 deletion src/main/java/hudson/plugins/s3/Entry.java
Expand Up @@ -7,6 +7,8 @@
import hudson.util.ListBoxModel;
import org.kohsuke.stapler.DataBoundConstructor;

import java.util.List;

public final class Entry implements Describable<Entry> {

/**
Expand Down Expand Up @@ -66,10 +68,15 @@ public final class Entry implements Describable<Entry> {

public boolean gzipFiles;

/**
* Metadata overrides
*/
public List<MetadataPair> userMetadata;

@DataBoundConstructor
public Entry(String bucket, String sourceFile, String storageClass, String selectedRegion,
boolean noUploadOnFailure, boolean uploadFromSlave, boolean managedArtifacts,
boolean useServerSideEncryption, boolean flatten, boolean gzipFiles) {
boolean useServerSideEncryption, boolean flatten, boolean gzipFiles, List<MetadataPair> userMetadata) {
this.bucket = bucket;
this.sourceFile = sourceFile;
this.storageClass = storageClass;
Expand All @@ -80,6 +87,7 @@ public Entry(String bucket, String sourceFile, String storageClass, String selec
this.useServerSideEncryption = useServerSideEncryption;
this.flatten = flatten;
this.gzipFiles = gzipFiles;
this.userMetadata = userMetadata;
}

public Descriptor<Entry> getDescriptor() {
Expand Down
38 changes: 25 additions & 13 deletions src/main/java/hudson/plugins/s3/S3BucketPublisher.java
@@ -1,6 +1,7 @@
package hudson.plugins.s3;

import com.amazonaws.regions.Regions;
import com.google.common.collect.Iterables;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
Expand Down Expand Up @@ -28,10 +29,7 @@
import java.io.IOException;
import java.io.File;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand Down Expand Up @@ -166,20 +164,34 @@ public boolean perform(AbstractBuild<?, ?> build,
String bucket = Util.replaceMacro(entry.bucket, envVars);
String storageClass = Util.replaceMacro(entry.storageClass, envVars);
String selRegion = entry.selectedRegion;
List<MetadataPair> escapedUserMetadata = new ArrayList<MetadataPair>();
for (MetadataPair metadataPair : userMetadata) {
escapedUserMetadata.add(
new MetadataPair(
Util.replaceMacro(metadataPair.key, envVars),
Util.replaceMacro(metadataPair.value, envVars))
);

Map<String, String> mergedMetadata = new HashMap<String, String>();

if (userMetadata != null) {
for (MetadataPair pair : userMetadata) {
mergedMetadata.put(pair.key, pair.value);
}
}


if (entry.userMetadata != null) {
for (MetadataPair pair : entry.userMetadata) {
mergedMetadata.put(pair.key, pair.value);
}
}

Map<String, String> escapedMetadata = new HashMap<String, String>();

for (Map.Entry<String, String> mapEntry : mergedMetadata.entrySet()) {
escapedMetadata.put(
Util.replaceMacro(mapEntry.getKey(), envVars),
Util.replaceMacro(mapEntry.getValue(), envVars));
}

List<FingerprintRecord> records = Lists.newArrayList();

for (FilePath src : paths) {
log(listener.getLogger(), "bucket=" + bucket + ", file=" + src.getName() + " region=" + selRegion + ", upload from slave=" + entry.uploadFromSlave + " managed="+ entry.managedArtifacts + " , server encryption "+entry.useServerSideEncryption);
records.add(profile.upload(build, listener, bucket, src, searchPathLength, escapedUserMetadata, storageClass, selRegion, entry.uploadFromSlave, entry.managedArtifacts, entry.useServerSideEncryption, entry.flatten, entry.gzipFiles));
records.add(profile.upload(build, listener, bucket, src, searchPathLength, escapedMetadata, storageClass, selRegion, entry.uploadFromSlave, entry.managedArtifacts, entry.useServerSideEncryption, entry.flatten, entry.gzipFiles));
}
if (entry.managedArtifacts) {
artifacts.addAll(records);
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/hudson/plugins/s3/S3Profile.java
Expand Up @@ -9,6 +9,7 @@
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import jenkins.model.Jenkins;
Expand Down Expand Up @@ -166,7 +167,7 @@ public void check() throws Exception {
getClient().listBuckets();
}

public FingerprintRecord upload(AbstractBuild<?,?> build, final BuildListener listener, String bucketName, FilePath filePath, int searchPathLength, List<MetadataPair> userMetadata,
public FingerprintRecord upload(AbstractBuild<?,?> build, final BuildListener listener, String bucketName, FilePath filePath, int searchPathLength, Map<String, String> userMetadata,
String storageClass, String selregion, boolean uploadFromSlave, boolean managedArtifacts, boolean useServerSideEncryption, boolean flatten, boolean gzipFiles) throws IOException, InterruptedException {
if (filePath.isDirectory()) {
throw new IOException(filePath + " is a directory");
Expand Down
33 changes: 23 additions & 10 deletions src/main/java/hudson/plugins/s3/callable/S3UploadCallable.java
Expand Up @@ -12,7 +12,9 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPOutputStream;

import com.amazonaws.regions.Region;
Expand All @@ -25,11 +27,22 @@
import org.apache.commons.io.IOUtils;

public class S3UploadCallable extends AbstractS3Callable implements FileCallable<FingerprintRecord> {

private static Map<String, String> convertOldMeta(List<MetadataPair> userMeta) {
Map<String, String> result = new HashMap<String, String>();

for (MetadataPair pair : userMeta) {
result.put(pair.key, pair.value);
}

return result;
}

private static final long serialVersionUID = 1L;
private final String bucketName;
private final Destination dest;
private final String storageClass;
private final List<MetadataPair> userMetadata;
private final Map<String, String> userMetadata;
private final String selregion;
private final boolean produced;
private final boolean useServerSideEncryption;
Expand All @@ -38,10 +51,10 @@ public class S3UploadCallable extends AbstractS3Callable implements FileCallable
@Deprecated
public S3UploadCallable(boolean produced, String accessKey, Secret secretKey, boolean useRole, Destination dest, List<MetadataPair> userMetadata, String storageClass,
String selregion, boolean useServerSideEncryption) {
this(produced, accessKey, secretKey, useRole, dest.bucketName, dest, userMetadata, storageClass, selregion, useServerSideEncryption, false);
this(produced, accessKey, secretKey, useRole, dest.bucketName, dest, convertOldMeta(userMetadata), storageClass, selregion, useServerSideEncryption, false);
}

public S3UploadCallable(boolean produced, String accessKey, Secret secretKey, boolean useRole, String bucketName, Destination dest, List<MetadataPair> userMetadata, String storageClass,
public S3UploadCallable(boolean produced, String accessKey, Secret secretKey, boolean useRole, String bucketName, Destination dest, Map<String, String> userMetadata, String storageClass,
String selregion, boolean useServerSideEncryption, boolean gzipFiles) {
super(accessKey, secretKey, useRole);
this.bucketName = bucketName;
Expand All @@ -66,21 +79,21 @@ public ObjectMetadata buildMetadata(FilePath filePath) throws IOException, Inter
metadata.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
}

for (MetadataPair metadataPair : userMetadata) {
String key = metadataPair.key.toLowerCase();
for (Map.Entry<String, String> entry : userMetadata.entrySet()) {
String key = entry.getKey().toLowerCase();
if (key.equals("cache-control")) {
metadata.setCacheControl(metadataPair.value);
metadata.setCacheControl(entry.getValue());
} else if (key.equals("expires")) {
try {
Date expires = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z").parse(metadataPair.value);
Date expires = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z").parse(entry.getValue());
metadata.setHttpExpiresDate(expires);
} catch (ParseException e) {
metadata.addUserMetadata(metadataPair.key, metadataPair.value);
metadata.addUserMetadata(entry.getKey(), entry.getValue());
}
} else if (key.equals("content-encoding")) {
metadata.setContentEncoding(metadataPair.value);
metadata.setContentEncoding(entry.getValue());
} else {
metadata.addUserMetadata(metadataPair.key, metadataPair.value);
metadata.addUserMetadata(entry.getKey(), entry.getValue());
}
}
return metadata;
Expand Down
10 changes: 10 additions & 0 deletions src/main/resources/hudson/plugins/s3/Entry/config.jelly
Expand Up @@ -31,4 +31,14 @@
<f:checkbox />
</f:entry>

<f:entry title="Metadata tags">
<f:repeatableProperty field="userMetadata">
<f:entry title="">
<div align="right">
<f:repeatableDeleteButton />
</div>
</f:entry>
</f:repeatableProperty>
</f:entry>

</j:jelly>

0 comments on commit a57c89b

Please sign in to comment.