Skip to content

Commit 29cd85f

Browse files
committed
chore(deps): reduce aliyun-oss dependencies
1 parent a0648a9 commit 29cd85f

13 files changed

Lines changed: 1004 additions & 102 deletions

File tree

go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.24
55
require (
66
github.com/404tk/go-prompt v0.0.1
77
github.com/404tk/table v0.0.4
8-
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
98
github.com/aws/aws-sdk-go-v2 v1.41.6
109
github.com/jdcloud-api/jdcloud-sdk-go v1.64.0
1110
github.com/volcengine/volcengine-go-sdk v1.0.168
@@ -30,7 +29,6 @@ require (
3029
github.com/volcengine/volc-sdk-golang v1.0.23 // indirect
3130
golang.org/x/net v0.15.0 // indirect
3231
golang.org/x/sys v0.15.0 // indirect
33-
golang.org/x/time v0.1.0 // indirect
3432
google.golang.org/appengine v1.6.7 // indirect
3533
google.golang.org/protobuf v1.31.0 // indirect
3634
gopkg.in/yaml.v2 v2.4.0 // indirect

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ github.com/404tk/go-prompt v0.0.1/go.mod h1:BU3cEVX1xhNDco8T27cBQ8lzkY8P+xUCLotU
88
github.com/404tk/table v0.0.4 h1:WlhqtfsX8zEHMwBJRknq2D5J2ew9EvMHw4ahD8EBSq0=
99
github.com/404tk/table v0.0.4/go.mod h1:bMAHHOKSl6wXuSY6TX6t/f3/XfCNsbjmzZKb6S9PjsQ=
1010
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
11-
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
12-
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
1311
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
1412
github.com/aws/aws-sdk-go-v2 v1.41.6 h1:1AX0AthnBQzMx1vbmir3Y4WsnJgiydmnJjiLu+LvXOg=
1513
github.com/aws/aws-sdk-go-v2 v1.41.6/go.mod h1:dy0UzBIfwSeot4grGvY1AqFWN5zgziMmWGzysDnHFcQ=
@@ -121,8 +119,6 @@ golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
121119
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
122120
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
123121
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
124-
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
125-
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
126122
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
127123
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
128124
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=

pkg/providers/alibaba/alibaba.go

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -148,33 +148,17 @@ func (p *Provider) BucketDump(ctx context.Context, action, bucketName string) {
148148
ossdrvier := &_oss.Driver{Cred: p.apiCred, Region: p.region}
149149
switch action {
150150
case "list":
151-
var infos = make(map[string]string)
152-
if bucketName == "all" {
153-
buckets, err := ossdrvier.GetBuckets(context.Background())
154-
if err != nil {
155-
logger.Error("List buckets failed:", err)
156-
return
157-
}
158-
for _, b := range buckets {
159-
infos[b.BucketName] = b.Region
160-
}
161-
} else {
162-
infos[bucketName] = p.region
151+
infos, err := p.bucketInfos(context.Background(), ossdrvier, bucketName)
152+
if err != nil {
153+
logger.Error("List buckets failed:", err)
154+
return
163155
}
164156
ossdrvier.ListObjects(ctx, infos)
165157
case "total":
166-
var infos = make(map[string]string)
167-
if bucketName == "all" {
168-
buckets, err := ossdrvier.GetBuckets(context.Background())
169-
if err != nil {
170-
logger.Error("List buckets failed:", err)
171-
return
172-
}
173-
for _, b := range buckets {
174-
infos[b.BucketName] = b.Region
175-
}
176-
} else {
177-
infos[bucketName] = p.region
158+
infos, err := p.bucketInfos(context.Background(), ossdrvier, bucketName)
159+
if err != nil {
160+
logger.Error("List buckets failed:", err)
161+
return
178162
}
179163
ossdrvier.TotalObjects(ctx, infos)
180164
default:
@@ -286,3 +270,40 @@ func (p *Provider) lookupDatabase(instanceID string) (schema.Database, bool) {
286270
}
287271
return schema.Database{}, false
288272
}
273+
274+
func (p *Provider) bucketInfos(ctx context.Context, driver *_oss.Driver, bucketName string) (map[string]string, error) {
275+
infos := make(map[string]string)
276+
bucketName = strings.TrimSpace(bucketName)
277+
region := strings.TrimSpace(p.region)
278+
switch {
279+
case bucketName == "":
280+
return nil, fmt.Errorf("empty bucket name")
281+
case bucketName == "all":
282+
buckets, err := driver.GetBuckets(ctx)
283+
if err != nil {
284+
return nil, err
285+
}
286+
for _, bucket := range buckets {
287+
infos[bucket.BucketName] = bucket.Region
288+
}
289+
if len(infos) == 0 {
290+
return nil, fmt.Errorf("no buckets found")
291+
}
292+
return infos, nil
293+
case region != "" && region != "all":
294+
infos[bucketName] = region
295+
return infos, nil
296+
default:
297+
buckets, err := driver.GetBuckets(ctx)
298+
if err != nil {
299+
return nil, err
300+
}
301+
for _, bucket := range buckets {
302+
if bucket.BucketName == bucketName {
303+
infos[bucket.BucketName] = bucket.Region
304+
return infos, nil
305+
}
306+
}
307+
return nil, fmt.Errorf("bucket %s region not found; set region explicitly or use `list all` first", bucketName)
308+
}
309+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package alibaba
2+
3+
import (
4+
"context"
5+
"io"
6+
"net/http"
7+
"strings"
8+
"testing"
9+
"time"
10+
11+
"github.com/404tk/cloudtoolkit/pkg/providers/alibaba/api"
12+
aliauth "github.com/404tk/cloudtoolkit/pkg/providers/alibaba/auth"
13+
"github.com/404tk/cloudtoolkit/pkg/providers/alibaba/oss"
14+
)
15+
16+
func TestBucketInfosResolvesRegionFromBucketListWhenProviderRegionIsAll(t *testing.T) {
17+
driver := &oss.Driver{
18+
Cred: aliauth.New("ak", "sk", ""),
19+
Client: oss.NewClient(
20+
aliauth.New("ak", "sk", ""),
21+
oss.WithHTTPClient(&http.Client{
22+
Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
23+
if req.URL.Host != "oss-cn-hangzhou.aliyuncs.com" {
24+
t.Fatalf("unexpected host: %s", req.URL.Host)
25+
}
26+
return &http.Response{
27+
StatusCode: http.StatusOK,
28+
Header: make(http.Header),
29+
Body: io.NopCloser(strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?>
30+
<ListAllMyBucketsResult>
31+
<Buckets>
32+
<Bucket><Name>a</Name><Location>oss-cn-hangzhou</Location></Bucket>
33+
<Bucket><Name>b</Name><Location>oss-cn-shanghai</Location></Bucket>
34+
</Buckets>
35+
</ListAllMyBucketsResult>`)),
36+
Request: req,
37+
}, nil
38+
}),
39+
}),
40+
oss.WithRetryPolicy(api.RetryPolicy{MaxAttempts: 1}),
41+
oss.WithClock(func() time.Time { return time.Date(2026, 4, 19, 12, 0, 0, 0, time.UTC) }),
42+
),
43+
}
44+
45+
provider := &Provider{region: "all"}
46+
infos, err := provider.bucketInfos(context.Background(), driver, "b")
47+
if err != nil {
48+
t.Fatalf("bucketInfos() error = %v", err)
49+
}
50+
if len(infos) != 1 || infos["b"] != "cn-shanghai" {
51+
t.Fatalf("unexpected bucket infos: %+v", infos)
52+
}
53+
}
54+
55+
type roundTripFunc func(*http.Request) (*http.Response, error)
56+
57+
func (fn roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
58+
return fn(req)
59+
}

pkg/providers/alibaba/oss/bucket.go

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,23 @@ import (
77
aliauth "github.com/404tk/cloudtoolkit/pkg/providers/alibaba/auth"
88
"github.com/404tk/cloudtoolkit/pkg/schema"
99
"github.com/404tk/cloudtoolkit/utils/logger"
10-
"github.com/aliyun/aliyun-oss-go-sdk/oss"
1110
)
1211

1312
type Driver struct {
1413
Cred aliauth.Credential
1514
Region string
16-
clientOptions []oss.ClientOption
15+
Client *Client
16+
clientOptions []Option
1717
}
1818

19-
func (d *Driver) NewClient() (*oss.Client, error) {
19+
func (d *Driver) NewClient() (*Client, error) {
2020
if err := d.Cred.Validate(); err != nil {
2121
return nil, err
2222
}
23-
region := d.Region
24-
if region == "all" {
25-
region = "cn-hangzhou"
23+
if d.Client != nil {
24+
return d.Client, nil
2625
}
27-
options := append([]oss.ClientOption{}, d.clientOptions...)
28-
if d.Cred.SecurityToken != "" {
29-
options = append(options, oss.SecurityToken(d.Cred.SecurityToken))
30-
}
31-
return oss.New(
32-
"https://oss-"+region+".aliyuncs.com",
33-
d.Cred.AccessKeyID,
34-
d.Cred.AccessKeySecret,
35-
options...)
26+
return NewClient(d.Cred, d.clientOptions...), nil
3627
}
3728

3829
func (d *Driver) GetBuckets(ctx context.Context) ([]schema.Storage, error) {
@@ -47,21 +38,20 @@ func (d *Driver) GetBuckets(ctx context.Context) ([]schema.Storage, error) {
4738
if err != nil {
4839
return list, err
4940
}
50-
response, err := client.ListBuckets(oss.MaxKeys(1000))
41+
response, err := client.ListBuckets(ctx, d.Region)
5142
if err != nil {
5243
logger.Error("List buckets failed.")
5344
return list, err
5445
}
5546

5647
for _, bucket := range response.Buckets {
57-
/*
58-
if !strings.Contains(d.Client.Config.Endpoint, bucket.Location) {
59-
continue
60-
}
61-
*/
48+
region := strings.TrimSpace(bucket.Region)
49+
if region == "" {
50+
region = strings.TrimPrefix(bucket.Location, "oss-")
51+
}
6252
_bucket := schema.Storage{
6353
BucketName: bucket.Name,
64-
Region: strings.TrimPrefix(bucket.Location, "oss-"),
54+
Region: region,
6555
}
6656
list = append(list, _bucket)
6757
}

pkg/providers/alibaba/oss/bucket_test.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import (
66
"net/http"
77
"strings"
88
"testing"
9+
"time"
910

11+
"github.com/404tk/cloudtoolkit/pkg/providers/alibaba/api"
1012
aliauth "github.com/404tk/cloudtoolkit/pkg/providers/alibaba/auth"
11-
aliyunoss "github.com/aliyun/aliyun-oss-go-sdk/oss"
1213
)
1314

1415
func TestNewClientUsesNormalizedEndpointAndToken(t *testing.T) {
@@ -23,11 +24,12 @@ func TestNewClientUsesNormalizedEndpointAndToken(t *testing.T) {
2324
if err != nil {
2425
t.Fatalf("NewClient() error = %v", err)
2526
}
26-
if client.Config.Endpoint != "https://oss-cn-hangzhou.aliyuncs.com" {
27-
t.Fatalf("unexpected endpoint: %s", client.Config.Endpoint)
27+
u, err := client.serviceURL(driver.Region)
28+
if err != nil {
29+
t.Fatalf("serviceURL() error = %v", err)
2830
}
29-
if client.Config.SecurityToken != "sts-token" {
30-
t.Fatalf("unexpected security token: %s", client.Config.SecurityToken)
31+
if u.String() != "https://oss-cn-hangzhou.aliyuncs.com/" {
32+
t.Fatalf("unexpected endpoint: %s", u.String())
3133
}
3234
}
3335

@@ -50,18 +52,24 @@ func TestGetBucketsMapsResponseAndUsesToken(t *testing.T) {
5052
driver := Driver{
5153
Cred: aliauth.New("ak", "sk", "sts-token"),
5254
Region: "cn-shanghai",
53-
clientOptions: []aliyunoss.ClientOption{
54-
aliyunoss.HTTPClient(&http.Client{
55+
clientOptions: []Option{
56+
WithHTTPClient(&http.Client{
5557
Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
5658
if req.Method != http.MethodGet {
5759
t.Fatalf("unexpected method: %s", req.Method)
5860
}
5961
if req.URL.Host != "oss-cn-shanghai.aliyuncs.com" {
6062
t.Fatalf("unexpected host: %s", req.URL.Host)
6163
}
64+
if got := req.URL.Query().Get("max-keys"); got != "1000" {
65+
t.Fatalf("unexpected max-keys query: %s", got)
66+
}
6267
if got := req.Header.Get("X-Oss-Security-Token"); got != "sts-token" {
6368
t.Fatalf("unexpected security token header: %s", got)
6469
}
70+
if got := req.Header.Get("Authorization"); got == "" || !strings.HasPrefix(got, "OSS ak:") {
71+
t.Fatalf("unexpected authorization: %s", got)
72+
}
6573
body := `<?xml version="1.0" encoding="UTF-8"?>
6674
<ListAllMyBucketsResult>
6775
<Buckets>
@@ -79,9 +87,12 @@ func TestGetBucketsMapsResponseAndUsesToken(t *testing.T) {
7987
StatusCode: http.StatusOK,
8088
Header: http.Header{"Content-Type": []string{"application/xml"}},
8189
Body: io.NopCloser(strings.NewReader(body)),
90+
Request: req,
8291
}, nil
8392
}),
8493
}),
94+
WithRetryPolicy(api.RetryPolicy{MaxAttempts: 1}),
95+
WithClock(func() time.Time { return time.Date(2026, 4, 19, 12, 0, 0, 0, time.UTC) }),
8596
},
8697
}
8798

0 commit comments

Comments
 (0)