From 1ca66cc5a2419e2e8c630c95f7236fcd6825291e Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Sun, 24 Feb 2019 17:00:43 -0700
Subject: [PATCH] Ensure buckets are validated on startup

---
 .../matrix-media-repo/cmd/media_repo/main.go       | 14 ++++++++++++++
 .../storage/datastore/ds_s3/s3_store.go            | 11 +++++++++++
 2 files changed, 25 insertions(+)

diff --git a/src/github.com/turt2live/matrix-media-repo/cmd/media_repo/main.go b/src/github.com/turt2live/matrix-media-repo/cmd/media_repo/main.go
index f36f6628..2f4910e2 100644
--- a/src/github.com/turt2live/matrix-media-repo/cmd/media_repo/main.go
+++ b/src/github.com/turt2live/matrix-media-repo/cmd/media_repo/main.go
@@ -12,6 +12,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/metrics"
 	"github.com/turt2live/matrix-media-repo/storage"
 	"github.com/turt2live/matrix-media-repo/storage/datastore"
+	"github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3"
 )
 
 func main() {
@@ -55,7 +56,20 @@ func main() {
 		logrus.Info(fmt.Sprintf("\t%s (%s): %s", ds.Type, ds.DatastoreId, ds.Uri))
 
 		if ds.Type == "s3" {
+			conf, err := datastore.GetDatastoreConfig(ds)
+			if err != nil {
+				continue
+			}
 
+			s3, err := ds_s3.GetOrCreateS3Datastore(ds.DatastoreId, conf)
+			if err != nil {
+				continue
+			}
+
+			err = s3.EnsureBucketExists()
+			if err != nil {
+				logrus.Warn("\t\tBucket does not exist!")
+			}
 		}
 	}
 
diff --git a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
index 8690de71..f02ad753 100644
--- a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
+++ b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
@@ -57,6 +57,17 @@ func GetOrCreateS3Datastore(dsId string, conf config.DatastoreConfig) (*s3Datast
 	return s3ds, nil
 }
 
+func (s *s3Datastore) EnsureBucketExists() error {
+	found, err := s.client.BucketExists(s.bucket)
+	if err != nil {
+		return err
+	}
+	if !found {
+		return errors.New("bucket not found")
+	}
+	return nil
+}
+
 func (s *s3Datastore) UploadFile(file io.ReadCloser, ctx context.Context, log *logrus.Entry) (*types.ObjectInfo, error) {
 	objectName, err := util.GenerateRandomString(512)
 	if err != nil {
-- 
GitLab