/
swift.go
70 lines (59 loc) · 1.57 KB
/
swift.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
package storage
import (
"io"
"github.com/ncw/swift"
"github.com/traPtitech/neoshowcase/pkg/domain"
)
// SwiftStorage OpenStack Swiftストレージ
type SwiftStorage struct {
container string
conn *swift.Connection
}
// NewSwiftStorage 引数の情報でOpenStack Swiftストレージを生成する
func NewSwiftStorage(container, userName, apiKey, tenant, tenantID, authURL string) (*SwiftStorage, error) {
conn := &swift.Connection{
AuthUrl: authURL,
UserName: userName,
ApiKey: apiKey,
Tenant: tenant,
TenantId: tenantID,
}
if err := conn.Authenticate(); err != nil {
return &SwiftStorage{}, err
}
if _, _, err := conn.Container(container); err != nil {
return &SwiftStorage{}, err
}
s := SwiftStorage{
container: container,
conn: conn,
}
return &s, nil
}
// Save ファイルを保存する
func (ss *SwiftStorage) Save(filename string, src io.Reader) error {
_, err := ss.conn.ObjectPut(ss.container, filename, src, true, "", "", swift.Headers{})
return err
}
// Open ファイルを取得する
func (ss *SwiftStorage) Open(filename string) (io.ReadCloser, error) {
file, _, err := ss.conn.ObjectOpen(ss.container, filename, true, nil)
if err != nil {
if err == swift.ObjectNotFound {
return nil, domain.ErrFileNotFound
}
return nil, err
}
return file, nil
}
// Delete ファイルを削除する
func (ss *SwiftStorage) Delete(filename string) error {
err := ss.conn.ObjectDelete(ss.container, filename)
if err != nil {
if err == swift.ObjectNotFound {
return domain.ErrFileNotFound
}
return err
}
return nil
}