Skip to content

Commit e074093

Browse files
committed
s3: Support S3 compatible services like Google Storage
Services like Google Storage expose s3 compatible APIs that can accessed with a non-aws URL. Signed-off-by: Andy Doan <[email protected]>
1 parent 5b8b259 commit e074093

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

reposerver/src/main/resources/application.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ storage {
1717
bucketId = ${?TUF_REPOSERVER_AWS_BUCKET_ID}
1818
region = "eu-central-1"
1919
region = ${?TUF_REPOSERVER_AWS_REGION}
20+
endpointUrl = ${?TUF_REPOSERVER_S3_URL}
2021
}
2122
}
2223

reposerver/src/main/scala/com/advancedtelematic/tuf/reposerver/Boot.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ trait Settings {
3939
val secretKey = _config.getString("storage.s3.secretKey")
4040
val bucketId = _config.getString("storage.s3.bucketId")
4141
val region = Regions.fromName(_config.getString("storage.s3.region"))
42-
new S3Credentials(accessKey, secretKey, bucketId, region)
42+
val endpointUrl = _config.getString("storage.s3.endpointUrl")
43+
new S3Credentials(accessKey, secretKey, bucketId, region, endpointUrl)
4344
}
4445

4546
lazy val useS3 = _config.getString("storage.type").equals("s3")

reposerver/src/main/scala/com/advancedtelematic/tuf/reposerver/target_store/S3TargetStoreEngine.scala

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import akka.util.ByteString
1212
import com.advancedtelematic.libtuf.data.TufDataType.{RepoId, TargetFilename}
1313
import com.advancedtelematic.tuf.reposerver.target_store.TargetStoreEngine.{TargetRedirect, TargetRetrieveResult, TargetStoreResult}
1414
import com.amazonaws.auth.{AWSCredentials, AWSCredentialsProvider}
15+
import com.amazonaws.client.builder.AwsClientBuilder
1516
import com.amazonaws.regions.Regions
1617
import com.amazonaws.services.s3.AmazonS3ClientBuilder
1718
import com.amazonaws.services.s3.model.{CannedAccessControlList, PutObjectRequest}
@@ -29,10 +30,19 @@ class S3TargetStoreEngine(credentials: S3Credentials)(implicit val system: Actor
2930

3031
private val log = LoggerFactory.getLogger(this.getClass)
3132

32-
private lazy val s3client = AmazonS3ClientBuilder.standard()
33-
.withCredentials(credentials)
34-
.withRegion(credentials.region)
35-
.build()
33+
protected lazy val s3client = {
34+
if(credentials.endpointUrl.length() > 0) {
35+
AmazonS3ClientBuilder.standard()
36+
.withCredentials(credentials)
37+
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(credentials.endpointUrl, credentials.region.getName()))
38+
.build()
39+
} else {
40+
AmazonS3ClientBuilder.standard()
41+
.withCredentials(credentials)
42+
.withRegion(credentials.region)
43+
.build()
44+
}
45+
}
3646

3747
override def store(repoId: RepoId, filename: TargetFilename, fileData: Source[ByteString, Any]): Future[TargetStoreResult] = {
3848
val tempFile = File.createTempFile("s3file", ".tmp")
@@ -91,7 +101,7 @@ class S3TargetStoreEngine(credentials: S3Credentials)(implicit val system: Actor
91101
}
92102
}
93103

94-
class S3Credentials(accessKey: String, secretKey: String, val bucketId: String, val region: Regions)
104+
class S3Credentials(accessKey: String, secretKey: String, val bucketId: String, val region: Regions, val endpointUrl: String)
95105
extends AWSCredentials with AWSCredentialsProvider {
96106
override def getAWSAccessKeyId: String = accessKey
97107

0 commit comments

Comments
 (0)