JCS-pub/jcsctl/cmd/pubshards/create.go

106 lines
2.5 KiB
Go

package pubshards
import (
"fmt"
"github.com/chzyer/readline"
"github.com/spf13/cobra"
cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
"gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd"
"gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd/userspace"
)
func init() {
var opt createOption
c := &cobra.Command{
Use: "create",
Short: "create a new pubshards",
Args: cobra.NoArgs,
RunE: func(c *cobra.Command, args []string) error {
ctx := cmd.GetCmdCtx(c)
return create(c, ctx, opt, args)
},
}
PubShardsCmd.AddCommand(c)
}
type createOption struct {
}
func create(c *cobra.Command, ctx *cmd.CommandContext, opt createOption, args []string) error {
rl, err := readline.New("> ")
if err != nil {
return err
}
defer rl.Close()
var blder userspace.UserSpaceBuilder
name := cmd.ReadString(rl, "请输入共享分片存储名称")
stgTypes := []string{"Local", "OBS", "OSS", "COS", "EFile", "S3"}
idx := cmd.SelectOne(rl, "请选择共享分片存储的存储服务类型", stgTypes)
switch stgTypes[idx] {
case "Local":
blder.AskLocal(rl)
case "OBS":
blder.AskOBS(rl)
case "OSS":
blder.AskOSS(rl)
case "COS":
blder.AskCOS(rl)
case "EFile":
blder.AskEFile(rl)
case "S3":
blder.AskS3(rl)
}
blder.AskShardStore(rl, true)
blder.AskWorkingDir(rl)
hubID := cmd.ReadInt(rl, "请输入管理共享分片存储的工作组件ID")
var pwd string
for {
pwd = string(cmd.ReadPassword(rl, "请输入共享分片存储的密码"))
pwd2 := string(cmd.ReadPassword(rl, "请再次输入共享分片存储的密码"))
if pwd == pwd2 {
break
}
fmt.Println("两次输入的密码不一致,请重新输入")
}
resp, err := ctx.Client.PubShards().Create(cliapi.PubShardsCreate{
Name: name,
Storage: blder.Storage,
Credential: blder.Credential,
ShardStore: *blder.ShardStore,
Features: blder.Features,
WorkingDir: blder.WorkingDir,
Password: pwd,
MasterHub: jcstypes.HubID(hubID),
})
if err != nil {
return err
}
fmt.Printf("创建共享分片存储成功, ID为: %v\n可将此ID和密码分发给其他人以加入共享分片存储\n", resp.PubShards.PubShardsID)
if !cmd.ReadBool(rl, "是否要现在加入共享分片存储") {
return nil
}
usName := cmd.ReadString(rl, "请输入新用户空间的名称")
_, err = ctx.Client.PubShards().Join(cliapi.PubShardsJoin{
Name: usName,
PubShardsID: resp.PubShards.PubShardsID,
Password: pwd,
})
if err != nil {
return err
}
return nil
}