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.

create.go 5.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package userspace
  2. import (
  3. "fmt"
  4. "github.com/chzyer/readline"
  5. "github.com/inhies/go-bytesize"
  6. "github.com/spf13/cobra"
  7. "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
  8. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  9. "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd"
  10. )
  11. func init() {
  12. cmd := cobra.Command{
  13. Use: "create",
  14. Short: "add a new cloud storage",
  15. Run: func(c *cobra.Command, args []string) {
  16. ctx := cmd.GetCmdCtx(c)
  17. create(c, ctx)
  18. },
  19. }
  20. UserSpaceCmd.AddCommand(&cmd)
  21. }
  22. func create(c *cobra.Command, ctx *cmd.CommandContext) {
  23. rl, err := readline.New("> ")
  24. if err != nil {
  25. fmt.Printf("初始化命令行失败: %v\n", err)
  26. return
  27. }
  28. defer rl.Close()
  29. var blder UserSpaceBuilder
  30. blder.Name = cmd.ReadString(rl, "请输入存储服务名称(Name)")
  31. stgTypes := []string{"Local", "OBS", "OSS", "COS", "EFile", "S3", "PubShards"}
  32. idx := cmd.SelectOne(rl, "请选择存储类型(StorageType)", stgTypes)
  33. switch stgTypes[idx] {
  34. case "Local":
  35. blder.AskLocal(rl)
  36. case "OBS":
  37. blder.AskOBS(rl)
  38. case "OSS":
  39. blder.AskOSS(rl)
  40. case "COS":
  41. blder.AskCOS(rl)
  42. case "EFile":
  43. blder.AskEFile(rl)
  44. case "S3":
  45. blder.AskS3(rl)
  46. case "PubShards":
  47. blder.AskPubShards(rl)
  48. }
  49. blder.AskShardStore(rl, false)
  50. blder.AskWorkingDir(rl)
  51. _, err = ctx.Client.UserSpace().Create(blder.UserSpaceCreate)
  52. if err != nil {
  53. fmt.Printf("\033[31m保存配置失败: %v\033[0m", err)
  54. return
  55. }
  56. fmt.Println("\033[32m配置保存成功!\033[0m")
  57. }
  58. type UserSpaceBuilder struct {
  59. api.UserSpaceCreate
  60. }
  61. func (b *UserSpaceBuilder) AskLocal(rl *readline.Instance) {
  62. b.Storage = &jcstypes.LocalType{
  63. Type: "Local",
  64. Location: jcstypes.Location{
  65. StorageName: cmd.ReadString(rl, "StorageName"),
  66. Location: cmd.ReadString(rl, "Location"),
  67. },
  68. }
  69. b.Credential = &jcstypes.LocalCred{
  70. Type: "Local",
  71. RootDir: cmd.ReadString(rl, "RootDir"),
  72. }
  73. }
  74. func (b *UserSpaceBuilder) AskOBS(rl *readline.Instance) {
  75. b.Storage = &jcstypes.OBSType{
  76. Type: "OBS",
  77. Region: cmd.ReadString(rl, "Region"),
  78. Endpoint: cmd.ReadString(rl, "Endpoint"),
  79. Bucket: cmd.ReadString(rl, "Bucket"),
  80. ProjectID: cmd.ReadString(rl, "ProjectID"),
  81. }
  82. b.Credential = &jcstypes.OBSCred{
  83. Type: "OBS",
  84. AK: cmd.ReadString(rl, "AccessKeyID"),
  85. SK: string(cmd.ReadPassword(rl, "AccessKeySecret")),
  86. }
  87. if cmd.ReadBool(rl, "是否支持存储服务间直传文件?") {
  88. b.Features = append(b.Features, &jcstypes.S2STransferFeature{
  89. Type: "S2STransfer",
  90. })
  91. }
  92. }
  93. func (b *UserSpaceBuilder) AskOSS(rl *readline.Instance) {
  94. b.Storage = &jcstypes.OSSType{
  95. Type: "OSS",
  96. Region: cmd.ReadString(rl, "Region"),
  97. Endpoint: cmd.ReadString(rl, "Endpoint"),
  98. Bucket: cmd.ReadString(rl, "Bucket"),
  99. }
  100. b.Credential = &jcstypes.OSSCred{
  101. Type: "OSS",
  102. AK: cmd.ReadString(rl, "AccessKeyID"),
  103. SK: string(cmd.ReadPassword(rl, "SecretAccessKey")),
  104. }
  105. }
  106. func (b *UserSpaceBuilder) AskCOS(rl *readline.Instance) {
  107. b.Storage = &jcstypes.COSType{
  108. Type: "COS",
  109. Region: cmd.ReadString(rl, "Region"),
  110. Endpoint: cmd.ReadString(rl, "Endpoint"),
  111. Bucket: cmd.ReadString(rl, "Bucket"),
  112. }
  113. b.Credential = &jcstypes.COSCred{
  114. Type: "COS",
  115. AK: cmd.ReadString(rl, "AccessKeyID"),
  116. SK: string(cmd.ReadPassword(rl, "SecretAccessKey")),
  117. }
  118. }
  119. func (b *UserSpaceBuilder) AskEFile(rl *readline.Instance) {
  120. b.Storage = &jcstypes.EFileType{
  121. Type: "EFile",
  122. ClusterID: cmd.ReadString(rl, "ClusterID"),
  123. }
  124. b.Credential = &jcstypes.EFileCred{
  125. Type: "EFile",
  126. TokenURL: cmd.ReadString(rl, "TokenURL"),
  127. APIURL: cmd.ReadString(rl, "APIURL"),
  128. TokenExpire: cmd.ReadIntRanged(rl, "TokenExpire", 60, 3600),
  129. User: cmd.ReadString(rl, "User"),
  130. Password: string(cmd.ReadPassword(rl, "Password")),
  131. OrgID: cmd.ReadString(rl, "OrgID"),
  132. }
  133. if cmd.ReadBool(rl, "是否提供能进行EC计算的接口?") {
  134. b.Features = append(b.Features, &jcstypes.ECMultiplierFeature{
  135. Type: "ECMultiplier",
  136. })
  137. }
  138. }
  139. func (b *UserSpaceBuilder) AskS3(rl *readline.Instance) {
  140. b.Storage = &jcstypes.S3Type{
  141. Type: "S3",
  142. Region: cmd.ReadString(rl, "Region"),
  143. Endpoint: cmd.ReadString(rl, "Endpoint"),
  144. Bucket: cmd.ReadString(rl, "Bucket"),
  145. }
  146. b.Credential = &jcstypes.S3Cred{
  147. Type: "S3",
  148. AK: cmd.ReadString(rl, "AccessKeyID"),
  149. SK: string(cmd.ReadPassword(rl, "SecretAccessKey")),
  150. }
  151. if cmd.ReadBool(rl, "是否支持分段上传?") {
  152. b.Features = append(b.Features, &jcstypes.MultipartUploadFeature{
  153. Type: "MultipartUpload",
  154. })
  155. }
  156. }
  157. func (u *UserSpaceBuilder) AskPubShards(rl *readline.Instance) {
  158. u.Storage = &jcstypes.PubShardsType{
  159. PubShardsID: jcstypes.PubShardsID(cmd.ReadString(rl, "共享分片存储ID")),
  160. Password: string(cmd.ReadPassword(rl, "共享分片存储密码")),
  161. }
  162. }
  163. func (b *UserSpaceBuilder) AskShardStore(rl *readline.Instance, must bool) {
  164. if !must && !cmd.ReadBool(rl, "是否开启分片存储功能?") {
  165. return
  166. }
  167. var size bytesize.ByteSize
  168. cmd.ReadStringValue(rl, "分片存储最大容量", &size)
  169. b.ShardStore = &jcstypes.ShardStoreUserConfig{
  170. MaxSize: int64(size),
  171. }
  172. }
  173. func (b *UserSpaceBuilder) AskWorkingDir(rl *readline.Instance) {
  174. b.WorkingDir = cmd.ReadStringDef(rl, "工作目录", "jcs")
  175. }

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