Skip to content
This repository was archived by the owner on Mar 26, 2025. It is now read-only.

Commit eef502a

Browse files
davieschnliyong
andauthored
support CTYun OOS (#87)
* support CTYun OOS * change loglevl Co-authored-by: liyong <chnliyong@gmail.com>
1 parent 8eb3aa0 commit eef502a

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ SRC and DST must be an URI of the following object storage:
100100
- b2: Backblaze B2
101101
- space: Digital Ocean Space
102102
- obs: Huawei Object Storage Service
103+
- oos: CTYun OOS
103104

104105
SRC and DST should be in the following format:
105106

object/object_storage_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,3 +362,12 @@ func TestHDFS(t *testing.T) {
362362
dfs := newHDFS(os.Getenv("HDFS_ADDR"), "", "")
363363
testStorage(t, dfs)
364364
}
365+
366+
func TestOOS(t *testing.T) {
367+
if os.Getenv("OOS_ACCESS_KEY") == "" {
368+
t.SkipNow()
369+
}
370+
b := newOOS(fmt.Sprintf("https://%s", os.Getenv("OOS_TEST_BUCKET")),
371+
os.Getenv("OOS_ACCESS_KEY"), os.Getenv("OOS_SECRET_KEY"))
372+
testStorage(t, b)
373+
}

object/oos.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright (C) 2018-present Juicedata Inc.
2+
3+
package object
4+
5+
import (
6+
"fmt"
7+
"net/url"
8+
"strings"
9+
10+
"github.com/aws/aws-sdk-go/aws"
11+
"github.com/aws/aws-sdk-go/aws/credentials"
12+
"github.com/aws/aws-sdk-go/aws/session"
13+
"github.com/aws/aws-sdk-go/service/s3"
14+
)
15+
16+
type oos struct {
17+
s3client
18+
}
19+
20+
func (s *oos) String() string {
21+
return fmt.Sprintf("oos://%s", s.s3client.bucket)
22+
}
23+
24+
func (s *oos) Create() error {
25+
_, err := s.List("", "", 1)
26+
if err != nil {
27+
return fmt.Errorf("please create bucket %s manually", s.s3client.bucket)
28+
}
29+
return err
30+
}
31+
32+
func (s *oos) List(prefix, marker string, limit int64) ([]*Object, error) {
33+
if limit > 1000 {
34+
limit = 1000
35+
}
36+
objs, err := s.s3client.List(prefix, marker, limit)
37+
if marker != "" && len(objs) > 0 && objs[0].Key == marker {
38+
objs = objs[1:]
39+
}
40+
return objs, err
41+
}
42+
43+
func newOOS(endpoint, accessKey, secretKey string) ObjectStorage {
44+
uri, err := url.ParseRequestURI(endpoint)
45+
if err != nil {
46+
logger.Fatalf("Invalid endpoint %s: %s", endpoint, err)
47+
}
48+
ssl := strings.ToLower(uri.Scheme) == "https"
49+
hostParts := strings.Split(uri.Host, ".")
50+
bucket := hostParts[0]
51+
region := hostParts[1][4:]
52+
endpoint = uri.Host[len(bucket)+1:]
53+
54+
awsConfig := &aws.Config{
55+
Region: &region,
56+
Endpoint: &endpoint,
57+
DisableSSL: aws.Bool(!ssl),
58+
S3ForcePathStyle: aws.Bool(true),
59+
// HTTPClient: httpClient,
60+
Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
61+
}
62+
63+
ses := session.New(awsConfig)
64+
return &oos{s3client{bucket, s3.New(ses), ses}}
65+
}
66+
67+
func init() {
68+
register("oos", newOOS)
69+
}

0 commit comments

Comments
 (0)