-
Notifications
You must be signed in to change notification settings - Fork 0
/
storage.go
112 lines (97 loc) · 3.02 KB
/
storage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package application
import (
"context"
"fmt"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/agreyfox/baas"
"github.com/agreyfox/baas/adapter/ipfs"
"github.com/agreyfox/baas/adapter/s3"
"github.com/agreyfox/baas/cmd/baasd"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/gosimple/slug"
)
func (s *Service) FileBlobStorage(engine, accessKey, secretKey, region, endpoint string) (baas.FileBlobStorage, error) {
var fileBlobStorage baas.FileBlobStorage
var err error
switch engine {
case baas.StorageEngineAzureBlob:
return nil, fmt.Errorf("engine not supported yet")
case baas.StorageEngineIPFS:
erray := strings.Split(endpoint, ",")
if len(erray) != 2 {
fmt.Fprintf(os.Stderr, "Ipfs configuration error, Please check")
os.Exit(1)
}
fileBlobStorage = &ipfs.FileBlobStorage{
ApiHandle: erray[0],
ServiceHandle: erray[1],
}
return fileBlobStorage, nil
default:
// s3, DO, wasabi, b2
fileBlobStorage, err = s.s3FileBlobStorage(accessKey, secretKey, region, endpoint)
if err != nil {
return nil, fmt.Errorf("cuold not create s3 file blob storage %w", err)
}
}
return fileBlobStorage, nil
}
func (s *Service) createStorageBucket(ctx context.Context, n *baas.NewApplication) error {
fileBlobStorage, err := s.FileBlobStorage(n.StorageEngine, n.StorageAccessKey, n.StorageSecretKey, n.StorageRegion, n.StorageEndpoint)
if err != nil {
return err
}
if err := fileBlobStorage.CreateBucket(ctx, n.StorageBucket); err != nil {
return err
}
return nil
}
func (s *Service) s3FileBlobStorage(accessKey, secretKey, region, endpoint string) (*s3.FileBlobStorage, error) {
// get the user's access keys
plaintextSecret, err := s.EncryptionService.DecryptString(secretKey)
if err != nil {
return nil, fmt.Errorf("could not decrypt storage secret key %w", err)
}
// create storage engine configuration
creds := credentials.NewStaticCredentials(accessKey, string(plaintextSecret), "")
config := &aws.Config{
Endpoint: aws.String(endpoint),
Region: aws.String(region),
Credentials: creds,
HTTPClient: &http.Client{Timeout: 5 * time.Minute},
}
// create a new s3 session
sess, err := session.NewSession(config)
if err != nil {
return nil, err
}
return &s3.FileBlobStorage{
AWSSession: sess,
}, nil
}
func makeStorageEndpoint(engine, region string) string {
switch engine {
case baas.StorageEngineDigitalOcean:
return fmt.Sprintf("%s.digitaloceanspaces.com", region)
case baas.StorageEngineWasabi:
return fmt.Sprintf("s3.%s.wasabisys.com", region)
case baas.StorageEngineB2:
return fmt.Sprintf("s3.%s.backblazeb2.com", region)
case baas.StorageEngineIPFS:
conf := baasd.GetSystemConfig()
return fmt.Sprintf("%s,%s", conf.IPFS.API, conf.IPFS.Service) //"127.0.0.1:5001,127.0.0.1:10010"
default:
return ""
}
}
func makeStorageBucketName(appname string) string {
salt := strconv.Itoa(baas.RandInt(1000, 10000))
sluggedName := appname + "-" + salt
return slug.Make("baas" + sluggedName)
}