From fe71e44f35929fe478ac365293ed5293070cdbe5 Mon Sep 17 00:00:00 2001
From: Russell Davies <russell@zeroflux.net>
Date: Tue, 12 Oct 2021 22:41:14 +0200
Subject: [PATCH] Add support for S3 storage classes

---
 storage/datastore/ds_s3/s3_store.go | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/storage/datastore/ds_s3/s3_store.go b/storage/datastore/ds_s3/s3_store.go
index 79824a3c..9140a2cc 100644
--- a/storage/datastore/ds_s3/s3_store.go
+++ b/storage/datastore/ds_s3/s3_store.go
@@ -27,6 +27,7 @@ type s3Datastore struct {
 	bucket   string
 	region string
 	tempPath string
+	storageClass string
 }
 
 func GetOrCreateS3Datastore(dsId string, conf config.DatastoreConfig) (*s3Datastore, error) {
@@ -40,12 +41,16 @@ func GetOrCreateS3Datastore(dsId string, conf config.DatastoreConfig) (*s3Datast
 	accessSecret, secretFound := conf.Options["accessSecret"]
 	region, regionFound := conf.Options["region"]
 	tempPath, tempPathFound := conf.Options["tempPath"]
+	storageClass, storageClassFound := conf.Options["storageClass"]
 	if !epFound || !bucketFound || !keyFound || !secretFound {
 		return nil, errors.New("invalid configuration: missing s3 options")
 	}
 	if !tempPathFound {
 		logrus.Warn("Datastore ", dsId, " (s3) does not have a tempPath set - this could lead to excessive memory usage by the media repo")
 	}
+	if !storageClassFound {
+		storageClass = "STANDARD"
+	}
 
 	useSsl := true
 	useSslStr, sslFound := conf.Options["ssl"]
@@ -72,6 +77,7 @@ func GetOrCreateS3Datastore(dsId string, conf config.DatastoreConfig) (*s3Datast
 		bucket:   bucket,
 		region: region,
 		tempPath: tempPath,
+		storageClass: storageClass,
 	}
 	stores[dsId] = s3ds
 	return s3ds, nil
@@ -177,7 +183,7 @@ func (s *s3Datastore) UploadFile(file io.ReadCloser, expectedLength int64, ctx r
 			}
 		}
 		ctx.Log.Info("Uploading file...")
-		sizeBytes, uploadErr = s.client.PutObjectWithContext(ctx, s.bucket, objectName, rs3, expectedLength, minio.PutObjectOptions{})
+		sizeBytes, uploadErr = s.client.PutObjectWithContext(ctx, s.bucket, objectName, rs3, expectedLength, minio.PutObjectOptions{StorageClass: s.storageClass})
 		ctx.Log.Info("Uploaded ", sizeBytes, " bytes to s3")
 		done <- true
 	}()
@@ -224,6 +230,6 @@ func (s *s3Datastore) ObjectExists(location string) bool {
 
 func (s *s3Datastore) OverwriteObject(location string, stream io.ReadCloser) error {
 	defer cleanup.DumpAndCloseStream(stream)
-	_, err := s.client.PutObject(s.bucket, location, stream, -1, minio.PutObjectOptions{})
+	_, err := s.client.PutObject(s.bucket, location, stream, -1, minio.PutObjectOptions{StorageClass: s.storageClass})
 	return err
 }
-- 
GitLab