You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

s2s.go 4.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package ops2
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
  5. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  6. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  7. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/pool"
  8. )
  9. func init() {
  10. exec.UseOp[*S2STransfer]()
  11. exec.UseOp[*S2STransferDyn]()
  12. }
  13. type S2STransfer struct {
  14. SrcSpace clitypes.UserSpaceDetail
  15. SrcPath clitypes.JPath
  16. DstSpace clitypes.UserSpaceDetail
  17. DstPath clitypes.JPath
  18. Output exec.VarID
  19. }
  20. func (o *S2STransfer) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  21. stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
  22. if err != nil {
  23. return fmt.Errorf("getting storage pool: %w", err)
  24. }
  25. s2s, err := stgPool.GetS2STransfer(&o.DstSpace)
  26. if err != nil {
  27. return err
  28. }
  29. // 传输文件
  30. fileInfo, err := s2s.Transfer(ctx.Context, &o.SrcSpace, o.SrcPath, o.DstPath)
  31. if err != nil {
  32. return err
  33. }
  34. defer s2s.Close()
  35. // 告知后续Op处理临时文件
  36. e.PutVar(o.Output, &FileInfoValue{FileInfo: fileInfo})
  37. return nil
  38. }
  39. func (o *S2STransfer) String() string {
  40. return fmt.Sprintf("S2STransfer %v:%v -> %v:%v, %v",
  41. o.SrcSpace.UserSpace.Storage.String(),
  42. o.SrcPath,
  43. o.DstSpace.UserSpace.Storage.String(),
  44. o.DstPath,
  45. o.Output)
  46. }
  47. type S2STransferDyn struct {
  48. SrcSpace clitypes.UserSpaceDetail
  49. SrcFileInfo exec.VarID
  50. DstSpace clitypes.UserSpaceDetail
  51. DstPath clitypes.JPath
  52. Output exec.VarID
  53. }
  54. func (o *S2STransferDyn) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  55. stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
  56. if err != nil {
  57. return fmt.Errorf("getting storage pool: %w", err)
  58. }
  59. srcInfo, err := exec.BindVar[*FileInfoValue](e, ctx.Context, o.SrcFileInfo)
  60. if err != nil {
  61. return err
  62. }
  63. s2s, err := stgPool.GetS2STransfer(&o.DstSpace)
  64. if err != nil {
  65. return err
  66. }
  67. // 传输文件
  68. fileInfo, err := s2s.Transfer(ctx.Context, &o.SrcSpace, srcInfo.Path, o.DstPath)
  69. if err != nil {
  70. return err
  71. }
  72. defer s2s.Close()
  73. // 告知后续Op处理临时文件
  74. e.PutVar(o.Output, &FileInfoValue{FileInfo: fileInfo})
  75. return nil
  76. }
  77. func (o *S2STransferDyn) String() string {
  78. return fmt.Sprintf("S2STransferDyn %v:%v -> %v:%v, %v",
  79. o.SrcSpace.UserSpace.Storage.String(),
  80. o.SrcFileInfo,
  81. o.DstSpace.UserSpace.Storage.String(),
  82. o.DstPath,
  83. o.Output)
  84. }
  85. type S2STransferNode struct {
  86. dag.NodeBase
  87. SrcSpace clitypes.UserSpaceDetail
  88. SrcPath clitypes.JPath
  89. DstSpace clitypes.UserSpaceDetail
  90. DstPath clitypes.JPath
  91. }
  92. func (b *GraphNodeBuilder) NewS2STransfer(srcSpace clitypes.UserSpaceDetail, srcPath clitypes.JPath, dstSpace clitypes.UserSpaceDetail, dstPath clitypes.JPath) *S2STransferNode {
  93. n := &S2STransferNode{
  94. SrcSpace: srcSpace,
  95. SrcPath: srcPath,
  96. DstSpace: dstSpace,
  97. DstPath: dstPath,
  98. }
  99. b.AddNode(n)
  100. n.OutputValues().Init(n, 1)
  101. return n
  102. }
  103. func (n *S2STransferNode) FileInfoVar() dag.ValueOutputSlot {
  104. return dag.ValueOutputSlot{
  105. Node: n,
  106. Index: 0,
  107. }
  108. }
  109. func (n *S2STransferNode) GenerateOp() (exec.Op, error) {
  110. return &S2STransfer{
  111. SrcSpace: n.SrcSpace,
  112. SrcPath: n.SrcPath,
  113. DstSpace: n.DstSpace,
  114. DstPath: n.DstPath,
  115. Output: n.FileInfoVar().Var().VarID,
  116. }, nil
  117. }
  118. type S2STransferDynNode struct {
  119. dag.NodeBase
  120. SrcSpace clitypes.UserSpaceDetail
  121. DstSpace clitypes.UserSpaceDetail
  122. DstPath clitypes.JPath
  123. }
  124. func (b *GraphNodeBuilder) NewS2STransferDyn(srcSpace clitypes.UserSpaceDetail, dstSpace clitypes.UserSpaceDetail, dstPath clitypes.JPath) *S2STransferDynNode {
  125. n := &S2STransferDynNode{
  126. SrcSpace: srcSpace,
  127. DstSpace: dstSpace,
  128. DstPath: dstPath,
  129. }
  130. b.AddNode(n)
  131. n.InputValues().Init(1)
  132. n.OutputValues().Init(n, 1)
  133. return n
  134. }
  135. func (n *S2STransferDynNode) SrcFileInfoSlot() dag.ValueInputSlot {
  136. return dag.ValueInputSlot{
  137. Node: n,
  138. Index: 0,
  139. }
  140. }
  141. func (n *S2STransferDynNode) FileInfoVar() dag.ValueOutputSlot {
  142. return dag.ValueOutputSlot{
  143. Node: n,
  144. Index: 0,
  145. }
  146. }
  147. func (n *S2STransferDynNode) GenerateOp() (exec.Op, error) {
  148. return &S2STransferDyn{
  149. SrcSpace: n.SrcSpace,
  150. SrcFileInfo: n.SrcFileInfoSlot().Var().VarID,
  151. DstSpace: n.DstSpace,
  152. DstPath: n.DstPath,
  153. Output: n.FileInfoVar().Var().VarID,
  154. }, nil
  155. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。