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
undefinedS3AccessKey=S3 configuration: 'accessKey' is undefined | undefinedS3AccessKey=S3 configuration: 'accessKey' is undefined | ||||
undefinedS3Bucket=S3 configuration: 'bucket' is undefined | undefinedS3Bucket=S3 configuration: 'bucket' is undefined | ||||
undefinedS3Region=S3 configuration: 'region' is undefined | undefinedS3Region=S3 configuration: 'region' is undefined | ||||
undefinedS3Hostname=S3 configuration: 'hostname' is undefined | |||||
undefinedS3SecretKey=S3 configuration: 'secretKey' is undefined | undefinedS3SecretKey=S3 configuration: 'secretKey' is undefined | ||||
undefinedS3StorageClass=S3 configuration: 'storageClass' is undefined | undefinedS3StorageClass=S3 configuration: 'storageClass' is undefined | ||||
unparsableEndpoint=Unable to parse service endpoint: {0} | unparsableEndpoint=Unable to parse service endpoint: {0} |
/***/ public String undefinedS3AccessKey; | /***/ public String undefinedS3AccessKey; | ||||
/***/ public String undefinedS3Bucket; | /***/ public String undefinedS3Bucket; | ||||
/***/ public String undefinedS3Region; | /***/ public String undefinedS3Region; | ||||
/***/ public String undefinedS3Hostname; | |||||
/***/ public String undefinedS3SecretKey; | /***/ public String undefinedS3SecretKey; | ||||
/***/ public String undefinedS3StorageClass; | /***/ public String undefinedS3StorageClass; | ||||
/***/ public String unparsableEndpoint; | /***/ public String unparsableEndpoint; |
* @since 4.3 | * @since 4.3 | ||||
*/ | */ | ||||
public class S3Config { | public class S3Config { | ||||
private final String hostname; | |||||
private final String region; | private final String region; | ||||
private final String bucket; | private final String bucket; | ||||
private final String storageClass; | private final String storageClass; | ||||
private final boolean disableSslVerify; | private final boolean disableSslVerify; | ||||
/** | /** | ||||
* <p>Constructor for S3Config.</p> | |||||
* <p> | |||||
* Constructor for S3Config. | |||||
* </p> | |||||
* | * | ||||
* @param hostname | |||||
* S3 API host | |||||
* @param region | * @param region | ||||
* AWS region | * AWS region | ||||
* @param bucket | * @param bucket | ||||
* @param disableSslVerify | * @param disableSslVerify | ||||
* if {@code true} disable Amazon server certificate and hostname | * if {@code true} disable Amazon server certificate and hostname | ||||
* verification | * 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, | String accessKey, String secretKey, int expirationSeconds, | ||||
boolean disableSslVerify) { | boolean disableSslVerify) { | ||||
this.hostname = hostname; | |||||
this.region = region; | this.region = region; | ||||
this.bucket = bucket; | this.bucket = bucket; | ||||
this.storageClass = storageClass; | this.storageClass = storageClass; | ||||
this.disableSslVerify = disableSslVerify; | 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>. | * Get the <code>region</code>. | ||||
* | * |
config.getBucket()); | config.getBucket()); | ||||
assertNotEmpty(LfsServerText.get().undefinedS3Region, | assertNotEmpty(LfsServerText.get().undefinedS3Region, | ||||
config.getRegion()); | config.getRegion()); | ||||
assertNotEmpty(LfsServerText.get().undefinedS3Hostname, | |||||
config.getHostname()); | |||||
assertNotEmpty(LfsServerText.get().undefinedS3SecretKey, | assertNotEmpty(LfsServerText.get().undefinedS3SecretKey, | ||||
config.getSecretKey()); | config.getSecretKey()); | ||||
assertNotEmpty(LfsServerText.get().undefinedS3StorageClass, | assertNotEmpty(LfsServerText.get().undefinedS3StorageClass, | ||||
private URL getObjectUrl(AnyLongObjectId oid) { | private URL getObjectUrl(AnyLongObjectId oid) { | ||||
try { | 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))); | getPath(oid))); | ||||
} catch (MalformedURLException e) { | } catch (MalformedURLException e) { | ||||
throw new IllegalArgumentException(MessageFormat.format( | throw new IllegalArgumentException(MessageFormat.format( |