From a54894711296b4a106f0cf848af57613ea35fc72 Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Tue, 19 Nov 2024 16:09:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0=E5=B9=B6?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdks/storage/cdsapi/object.go | 13 +++---- sdks/storage/cdsapi/package.go | 56 +++++++++++++++++++++++++++++ sdks/storage/cdsapi/storage_test.go | 6 ++-- sdks/storage/shared_storage.go | 3 +- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/sdks/storage/cdsapi/object.go b/sdks/storage/cdsapi/object.go index 5283be0..f0743f6 100644 --- a/sdks/storage/cdsapi/object.go +++ b/sdks/storage/cdsapi/object.go @@ -33,9 +33,10 @@ type ObjectUpload struct { } type ObjectUploadInfo struct { - UserID cdssdk.UserID `json:"userID" binding:"required"` - PackageID cdssdk.PackageID `json:"packageID" binding:"required"` - StorageAffinity cdssdk.StorageID `json:"storageAffinity"` + UserID cdssdk.UserID `json:"userID" binding:"required"` + PackageID cdssdk.PackageID `json:"packageID" binding:"required"` + Affinity cdssdk.StorageID `json:"affinity"` + LoadTo []cdssdk.StorageID `json:"loadTo"` } type UploadingObject struct { @@ -46,11 +47,7 @@ type UploadingObject struct { type UploadObjectIterator = iterator.Iterator[*UploadingObject] type ObjectUploadResp struct { - Uploadeds []UploadedObject `json:"uploadeds"` -} -type UploadedObject struct { - Object *cdssdk.Object `json:"object"` - Error string `json:"error"` + Uploadeds []cdssdk.Object `json:"uploadeds"` } func (c *ObjectService) Upload(req ObjectUpload) (*ObjectUploadResp, error) { diff --git a/sdks/storage/cdsapi/package.go b/sdks/storage/cdsapi/package.go index 9dfb6c7..6be57aa 100644 --- a/sdks/storage/cdsapi/package.go +++ b/sdks/storage/cdsapi/package.go @@ -6,6 +6,7 @@ import ( "strings" "gitlink.org.cn/cloudream/common/consts/errorcode" + "gitlink.org.cn/cloudream/common/pkgs/iterator" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" "gitlink.org.cn/cloudream/common/utils/http2" "gitlink.org.cn/cloudream/common/utils/serder" @@ -127,6 +128,61 @@ func (s *PackageService) Create(req PackageCreate) (*PackageCreateResp, error) { return nil, codeResp.ToError() } +const PackageCreateLoadPath = "/package/createLoad" + +type PackageCreateLoad struct { + PackageCreateLoadInfo + Files UploadObjectIterator `json:"-"` +} +type PackageCreateLoadInfo struct { + UserID cdssdk.UserID `json:"userID" binding:"required"` + BucketID cdssdk.BucketID `json:"bucketID" binding:"required"` + Name string `json:"name" binding:"required"` + LoadTo []cdssdk.StorageID `json:"loadTo" binding:"required"` +} +type PackageCreateLoadResp struct { + Package cdssdk.Package `json:"package"` + Objects []cdssdk.Object `json:"objects"` + LoadedDirs []string `json:"loadedDirs"` +} + +func (c *PackageService) CreateLoad(req PackageCreateLoad) (*PackageCreateLoadResp, error) { + url, err := url.JoinPath(c.baseURL, PackageCreateLoadPath) + if err != nil { + return nil, err + } + + infoJSON, err := serder.ObjectToJSON(req) + if err != nil { + return nil, fmt.Errorf("upload info to json: %w", err) + } + + resp, err := http2.PostMultiPart(url, http2.MultiPartRequestParam{ + Form: map[string]string{"info": string(infoJSON)}, + Files: iterator.Map(req.Files, func(src *UploadingObject) (*http2.IterMultiPartFile, error) { + return &http2.IterMultiPartFile{ + FieldName: "files", + FileName: src.Path, + File: src.File, + }, nil + }), + }) + if err != nil { + return nil, err + } + + codeResp, err := ParseJSONResponse[response[PackageCreateLoadResp]](resp) + if err != nil { + return nil, err + } + + if codeResp.Code == errorcode.OK { + return &codeResp.Data, nil + } + + return nil, codeResp.ToError() +} + const PackageDeletePath = "/package/delete" type PackageDelete struct { diff --git a/sdks/storage/cdsapi/storage_test.go b/sdks/storage/cdsapi/storage_test.go index 6a76ad4..cec219e 100644 --- a/sdks/storage/cdsapi/storage_test.go +++ b/sdks/storage/cdsapi/storage_test.go @@ -89,9 +89,9 @@ func Test_Object(t *testing.T) { _, err = cli.Object().Upload(ObjectUpload{ ObjectUploadInfo: ObjectUploadInfo{ - UserID: 1, - PackageID: createResp.Package.PackageID, - StorageAffinity: stgAff, + UserID: 1, + PackageID: createResp.Package.PackageID, + Affinity: stgAff, }, Files: iterator.Array( &UploadingObject{ diff --git a/sdks/storage/shared_storage.go b/sdks/storage/shared_storage.go index 4f4fa0c..7364143 100644 --- a/sdks/storage/shared_storage.go +++ b/sdks/storage/shared_storage.go @@ -18,7 +18,8 @@ var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[SharedS )), "type") type LocalSharedStorage struct { - Type string `json:"type"` + serder.Metadata `union:"Local"` + Type string `json:"type"` // 调度Package时的Package的根路径 LoadBase string `json:"loadBase"` }