-
Notifications
You must be signed in to change notification settings - Fork 0
/
minio.go
120 lines (97 loc) · 2.43 KB
/
minio.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
113
114
115
116
117
118
119
120
package s3
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
"github.com/magefile/mage/sh"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"github.com/ttab/mage/internal"
)
const minioImage = "minio/minio:RELEASE.2024-03-05T04-48-44Z"
// Minio creates a local minio instance using docker.
func Minio() error {
uid := os.Getuid()
gid := os.Getgid()
stateDir, err := internal.StateDir()
if err != nil {
return fmt.Errorf("get state directory path: %w", err)
}
instanceName := "local-minio"
dataDir := filepath.Join(stateDir, instanceName)
err = os.MkdirAll(dataDir, 0o700)
if err != nil {
return fmt.Errorf("create local state directory: %w", err)
}
err = internal.StopContainerIfExists(instanceName)
if err != nil {
return fmt.Errorf("stop existing container: %w", err)
}
err = sh.Run("docker", "run", "-d", "--rm",
"--name", instanceName,
"--user", fmt.Sprintf("%d:%d", uid, gid),
"-v", fmt.Sprintf("%s:/data", dataDir),
"-p", "9000:9000",
"-p", "9001:9001",
minioImage,
"server", "/data",
"--console-address", ":9001",
)
if err != nil {
return fmt.Errorf("start postgres: %w", err)
}
client, err := minioClient()
if err != nil {
return err
}
ctx := context.Background()
deadline := time.Now().Add(20 * time.Second)
for {
_, err := client.BucketExists(ctx, "randomname")
if err != nil && time.Now().After(deadline) {
return fmt.Errorf("failed to ensure that minio is available: %w", err)
} else if err != nil {
time.Sleep(300 * time.Millisecond)
continue
}
break
}
return nil
}
// Bucket creates a bucket in the local minio instance.
func Bucket(name string) error {
client, err := minioClient()
if err != nil {
return err
}
ctx := context.Background()
exists, err := client.BucketExists(ctx, name)
if err != nil {
return fmt.Errorf("check if bucket exists: %w", err)
}
if exists {
return nil
}
err = client.MakeBucket(ctx, name,
minio.MakeBucketOptions{})
if err != nil {
return fmt.Errorf("create bucket: %w", err)
}
return nil
}
func minioClient() (*minio.Client, error) {
endpoint := "localhost:9000"
accessKeyID := "minioadmin"
secretAccessKey := "minioadmin"
useSSL := false
client, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
return nil, fmt.Errorf("create minio client: %w", err)
}
return client, nil
}