diff --git a/common/pkgs/ioswitch2/ops2/multipart.go b/common/pkgs/ioswitch2/ops2/multipart.go new file mode 100644 index 0000000..0ef7da6 --- /dev/null +++ b/common/pkgs/ioswitch2/ops2/multipart.go @@ -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 +}