| @@ -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 | |||
| } | |||