Browse Source

Allow for using custom s3 host with lfs server

By default, it will generate hostname using the aws region passed to the
constructor.

This will allow for easier testing, since you can just spin up a local
minio (or other s3-compatible storage service) instance and point the
application at that for the storage mechanism.

It will also allow for storing lfs objects on-prem.

Change-Id: I2566b1fcce58f3d306ddd23a8da702ef5a451c7b
Signed-off-by: Pat Long <pllong@arista.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v5.8.0.202006091008-r
Pat Long 4 years ago
parent
commit
d27dceb384

+ 1
- 0
org.eclipse.jgit.lfs.server/resources/org/eclipse/jgit/lfs/server/internal/LfsServerText.properties View File

@@ -4,6 +4,7 @@ objectNotFound=Object ''{0}'' not found
undefinedS3AccessKey=S3 configuration: 'accessKey' is undefined
undefinedS3Bucket=S3 configuration: 'bucket' is undefined
undefinedS3Region=S3 configuration: 'region' is undefined
undefinedS3Hostname=S3 configuration: 'hostname' is undefined
undefinedS3SecretKey=S3 configuration: 'secretKey' is undefined
undefinedS3StorageClass=S3 configuration: 'storageClass' is undefined
unparsableEndpoint=Unable to parse service endpoint: {0}

+ 1
- 0
org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/internal/LfsServerText.java View File

@@ -33,6 +33,7 @@ public class LfsServerText extends TranslationBundle {
/***/ public String undefinedS3AccessKey;
/***/ public String undefinedS3Bucket;
/***/ public String undefinedS3Region;
/***/ public String undefinedS3Hostname;
/***/ public String undefinedS3SecretKey;
/***/ public String undefinedS3StorageClass;
/***/ public String unparsableEndpoint;

+ 47
- 2
org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Config.java View File

@@ -16,6 +16,7 @@ package org.eclipse.jgit.lfs.server.s3;
* @since 4.3
*/
public class S3Config {
private final String hostname;
private final String region;
private final String bucket;
private final String storageClass;
@@ -25,8 +26,12 @@ public class S3Config {
private final boolean disableSslVerify;

/**
* <p>Constructor for S3Config.</p>
* <p>
* Constructor for S3Config.
* </p>
*
* @param hostname
* S3 API host
* @param region
* AWS region
* @param bucket
@@ -43,10 +48,12 @@ public class S3Config {
* @param disableSslVerify
* if {@code true} disable Amazon server certificate and hostname
* verification
* @since 5.8
*/
public S3Config(String region, String bucket, String storageClass,
public S3Config(String hostname, String region, String bucket, String storageClass,
String accessKey, String secretKey, int expirationSeconds,
boolean disableSslVerify) {
this.hostname = hostname;
this.region = region;
this.bucket = bucket;
this.storageClass = storageClass;
@@ -56,6 +63,44 @@ public class S3Config {
this.disableSslVerify = disableSslVerify;
}

/**
* <p>Constructor for S3Config.</p>
*
* @param region
* AWS region
* @param bucket
* S3 storage bucket
* @param storageClass
* S3 storage class
* @param accessKey
* access key for authenticating to AWS
* @param secretKey
* secret key for authenticating to AWS
* @param expirationSeconds
* period in seconds after which requests signed for this bucket
* will expire
* @param disableSslVerify
* if {@code true} disable Amazon server certificate and hostname
* verification
*/
public S3Config(String region, String bucket, String storageClass,
String accessKey, String secretKey, int expirationSeconds,
boolean disableSslVerify) {
this(String.format("s3-%s.amazonaws.com", region), region, bucket, //$NON-NLS-1$
storageClass, accessKey, secretKey, expirationSeconds,
disableSslVerify);
}

/**
* Get the <code>hostname</code>.
*
* @return Get the S3 API host
* @since 5.8
*/
public String getHostname() {
return hostname;
}

/**
* Get the <code>region</code>.
*

+ 4
- 2
org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/s3/S3Repository.java View File

@@ -159,6 +159,8 @@ public class S3Repository implements LargeFileRepository {
config.getBucket());
assertNotEmpty(LfsServerText.get().undefinedS3Region,
config.getRegion());
assertNotEmpty(LfsServerText.get().undefinedS3Hostname,
config.getHostname());
assertNotEmpty(LfsServerText.get().undefinedS3SecretKey,
config.getSecretKey());
assertNotEmpty(LfsServerText.get().undefinedS3StorageClass,
@@ -173,8 +175,8 @@ public class S3Repository implements LargeFileRepository {

private URL getObjectUrl(AnyLongObjectId oid) {
try {
return new URL(String.format("https://s3-%s.amazonaws.com/%s/%s", //$NON-NLS-1$
s3Config.getRegion(), s3Config.getBucket(),
return new URL(String.format("https://%s/%s/%s", //$NON-NLS-1$
s3Config.getHostname(), s3Config.getBucket(),
getPath(oid)));
} catch (MalformedURLException e) {
throw new IllegalArgumentException(MessageFormat.format(

Loading…
Cancel
Save