Skip to content

Commit 6acd6a3

Browse files
committed
feat: add server-side encryption support and update upload part size handling
1 parent 15477ff commit 6acd6a3

File tree

2 files changed

+61
-14
lines changed

2 files changed

+61
-14
lines changed

pbm/storage/oss/client.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import (
1212
)
1313

1414
const (
15-
defaultPartSize int64 = 10 * 1024 * 1024 // 10Mb
16-
minPartSize int64 = 5 * 1024 * 1024 // 5MB
1715
defaultS3Region = "ap-southeast-5"
1816
maxPart int32 = 10000
1917

@@ -36,8 +34,16 @@ type Config struct {
3634
Retryer *Retryer `bson:"retryer,omitempty" json:"retryer,omitempty" yaml:"retryer,omitempty"`
3735

3836
ConnectTimeout time.Duration `bson:"connectTimeout" json:"connectTimeout" yaml:"connectTimeout"`
39-
UploadPartSize int `bson:"uploadPartSize,omitempty" json:"uploadPartSize,omitempty" yaml:"uploadPartSize,omitempty"`
37+
UploadPartSize int64 `bson:"uploadPartSize,omitempty" json:"uploadPartSize,omitempty" yaml:"uploadPartSize,omitempty"`
4038
MaxUploadParts int32 `bson:"maxUploadParts,omitempty" json:"maxUploadParts,omitempty" yaml:"maxUploadParts,omitempty"`
39+
40+
ServerSideEncryption *SSE `bson:"serverSideEncryption,omitempty" json:"serverSideEncryption,omitempty" yaml:"serverSideEncryption,omitempty"`
41+
}
42+
43+
type SSE struct {
44+
EncryptionMethod string `bson:"encryptionMethod,omitempty" json:"encryptionMethod,omitempty" yaml:"encryptionMethod,omitempty"`
45+
EncryptionAlgorithm string `bson:"encryptionAlgorithm,omitempty" json:"encryptionAlgorithm,omitempty" yaml:"encryptionAlgorithm,omitempty"`
46+
EncryptionKeyID string `bson:"encryptionKeyId,omitempty" json:"encryptionKeyId,omitempty" yaml:"encryptionKeyId,omitempty"`
4147
}
4248

4349
type Retryer struct {
@@ -81,6 +87,9 @@ func (cfg *Config) Cast() error {
8187
if cfg.MaxUploadParts <= 0 {
8288
cfg.MaxUploadParts = maxPart
8389
}
90+
if cfg.UploadPartSize <= 0 {
91+
cfg.UploadPartSize = oss.DefaultUploadPartSize
92+
}
8493
return nil
8594
}
8695

pbm/storage/oss/oss.go

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ import (
1616

1717
var _ storage.Storage = &OSS{}
1818

19+
const (
20+
ServerSideEncryptionAes256 = "AES256"
21+
ServerSideEncryptionKMS = "KMS"
22+
ServerSideEncryptionSM4 = "SM4"
23+
)
24+
1925
func New(cfg *Config, node string, l log.LogEvent) (*OSS, error) {
2026
if err := cfg.Cast(); err != nil {
2127
return nil, fmt.Errorf("cast config: %w", err)
@@ -61,9 +67,28 @@ func (o *OSS) Save(name string, data io.Reader, options ...storage.Option) error
6167
o.log.Debug("uploading %s", name)
6268
}
6369

70+
req := &oss.PutObjectRequest{
71+
Bucket: oss.Ptr(o.cfg.Bucket),
72+
Key: oss.Ptr(path.Join(o.cfg.Prefix, name)),
73+
}
74+
75+
if o.cfg.ServerSideEncryption != nil {
76+
sse := o.cfg.ServerSideEncryption
77+
switch sse.EncryptionMethod {
78+
case ServerSideEncryptionSM4:
79+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionSM4)
80+
case ServerSideEncryptionKMS:
81+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionKMS)
82+
req.ServerSideDataEncryption = oss.Ptr(sse.EncryptionAlgorithm)
83+
req.ServerSideEncryptionKeyId = oss.Ptr(sse.EncryptionKeyID)
84+
default:
85+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionAes256)
86+
}
87+
}
88+
6489
partSize := storage.ComputePartSize(
6590
opts.Size,
66-
defaultPartSize,
91+
o.cfg.UploadPartSize,
6792
oss.MinPartSize,
6893
int64(o.cfg.MaxUploadParts),
6994
int64(o.cfg.UploadPartSize),
@@ -72,11 +97,7 @@ func (o *OSS) Save(name string, data io.Reader, options ...storage.Option) error
7297
uploader := oss.NewUploader(o.ossCli, func(uo *oss.UploaderOptions) {
7398
uo.PartSize = partSize
7499
})
75-
76-
_, err := uploader.UploadFrom(context.Background(), &oss.PutObjectRequest{
77-
Bucket: oss.Ptr(o.cfg.Bucket),
78-
Key: oss.Ptr(path.Join(o.cfg.Prefix, name)),
79-
}, data)
100+
_, err := uploader.UploadFrom(context.Background(), req, data)
80101

81102
return errors.Wrap(err, "put object")
82103
}
@@ -101,10 +122,12 @@ func (o *OSS) SourceReader(name string) (io.ReadCloser, error) {
101122
func (o *OSS) FileStat(name string) (storage.FileInfo, error) {
102123
inf := storage.FileInfo{}
103124

104-
res, err := o.ossCli.HeadObject(context.Background(), &oss.HeadObjectRequest{
125+
req := &oss.HeadObjectRequest{
105126
Bucket: oss.Ptr(o.cfg.Bucket),
106127
Key: oss.Ptr(path.Join(o.cfg.Prefix, name)),
107-
})
128+
}
129+
130+
res, err := o.ossCli.HeadObject(context.Background(), req)
108131
if err != nil {
109132
var serr *oss.ServiceError
110133
if errors.As(err, &serr) && serr.Code == "NoSuchKey" {
@@ -187,12 +210,27 @@ func (o *OSS) Delete(name string) error {
187210

188211
// Copy makes a copy of the src object/file under dst name
189212
func (o *OSS) Copy(src, dst string) error {
190-
uploader := oss.NewCopier(o.ossCli)
191-
_, err := uploader.Copy(context.Background(), &oss.CopyObjectRequest{
213+
req := &oss.CopyObjectRequest{
192214
Bucket: oss.Ptr(o.cfg.Bucket),
193215
Key: oss.Ptr(path.Join(o.cfg.Prefix, dst)),
194216
SourceBucket: oss.Ptr(o.cfg.Bucket),
195217
SourceKey: oss.Ptr(path.Join(o.cfg.Prefix, src)),
196-
})
218+
}
219+
220+
if o.cfg.ServerSideEncryption != nil {
221+
sse := o.cfg.ServerSideEncryption
222+
switch sse.EncryptionMethod {
223+
case ServerSideEncryptionSM4:
224+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionSM4)
225+
case ServerSideEncryptionKMS:
226+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionKMS)
227+
req.ServerSideDataEncryption = oss.Ptr(sse.EncryptionAlgorithm)
228+
req.ServerSideEncryptionKeyId = oss.Ptr(sse.EncryptionKeyID)
229+
default:
230+
req.ServerSideEncryption = oss.Ptr(ServerSideEncryptionAes256)
231+
}
232+
}
233+
copier := oss.NewCopier(o.ossCli, func(co *oss.CopierOptions) {})
234+
_, err := copier.Copy(context.Background(), req)
197235
return errors.Wrap(err, "copy object")
198236
}

0 commit comments

Comments
 (0)