| @@ -0,0 +1,124 @@ | |||||
| package ops2 | |||||
| import ( | |||||
| "encoding/json" | |||||
| "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag" | |||||
| "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec" | |||||
| "gitlink.org.cn/cloudream/common/sdks/cloudstorage" | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | |||||
| ) | |||||
| func init() { | |||||
| exec.UseOp[*MultipartManage]() | |||||
| exec.UseOp[*MultipartUpload]() | |||||
| } | |||||
| type MultipartManage struct { | |||||
| Address cdssdk.StorageAddress `json:"address"` | |||||
| UploadID *exec.StringVar `json:"uploadID"` | |||||
| ObjectID *exec.StringVar `json:"objectID"` | |||||
| } | |||||
| func (o *MultipartManage) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| var oss cloudstorage.ObjectStorage | |||||
| switch addr := o.Address.(type) { | |||||
| case *cdssdk.LocalStorageAddress: | |||||
| err := json.Unmarshal([]byte(addr.String()), &oss) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| client, err := cloudstorage.NewObjectStorageClient(oss) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| defer client.Close() | |||||
| uploadID, err := client.InitiateMultipartUpload("") | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| o.UploadID.Value = uploadID | |||||
| e.PutVars(o.UploadID) | |||||
| objectID, err := client.CompleteMultipartUpload() | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| o.ObjectID.Value = objectID | |||||
| e.PutVars(o.ObjectID) | |||||
| return nil | |||||
| } | |||||
| func (o *MultipartManage) String() string { | |||||
| return "MultipartManage" | |||||
| } | |||||
| type MultipartManageNode struct { | |||||
| dag.NodeBase | |||||
| Address cdssdk.StorageAddress | |||||
| } | |||||
| func (b *GraphNodeBuilder) NewMultipartManage(addr cdssdk.StorageAddress) *MultipartManageNode { | |||||
| node := &MultipartManageNode{ | |||||
| Address: addr, | |||||
| } | |||||
| b.AddNode(node) | |||||
| return node | |||||
| } | |||||
| func (t *MultipartManageNode) GenerateOp() (exec.Op, error) { | |||||
| return &MultipartManage{ | |||||
| Address: t.Address, | |||||
| }, nil | |||||
| } | |||||
| type MultipartUpload struct { | |||||
| Address cdssdk.StorageAddress `json:"address"` | |||||
| FileMD5 *exec.StringVar `json:"fileMD5"` | |||||
| } | |||||
| func (o *MultipartUpload) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| var oss cloudstorage.ObjectStorage | |||||
| switch addr := o.Address.(type) { | |||||
| case *cdssdk.LocalStorageAddress: | |||||
| err := json.Unmarshal([]byte(addr.String()), &oss) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| client, err := cloudstorage.NewObjectStorageClient(oss) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| client.UploadPart() | |||||
| return nil | |||||
| } | |||||
| func (o *MultipartUpload) String() string { | |||||
| return "MultipartUpload" | |||||
| } | |||||
| type MultipartUploadNode struct { | |||||
| dag.NodeBase | |||||
| Address cdssdk.StorageAddress | |||||
| } | |||||
| func (b *GraphNodeBuilder) NewMultipartUpload(addr cdssdk.StorageAddress) *MultipartUploadNode { | |||||
| node := &MultipartUploadNode{ | |||||
| Address: addr, | |||||
| } | |||||
| b.AddNode(node) | |||||
| return node | |||||
| } | |||||
| func (t MultipartUploadNode) GenerateOp() (exec.Op, error) { | |||||
| return &MultipartUpload{ | |||||
| Address: t.Address, | |||||
| }, nil | |||||
| } | |||||