From cf3d33f13e86c07d81b0fcdd47349a39a0dcbb81 Mon Sep 17 00:00:00 2001 From: baytan0720 Date: Mon, 9 Oct 2023 02:01:55 +0800 Subject: [PATCH] [feat]tools-v2: add bs query volume clone-recover Signed-off-by: baytan0720 --- tools-v2/README.md | 43 +++- tools-v2/internal/error/error.go | 3 + tools-v2/internal/utils/row.go | 4 + tools-v2/internal/utils/snapshot/snapshot.go | 23 +- .../curvebs/delete/volume/clone/clone.go | 45 +--- .../curvebs/delete/volume/recover/recover.go | 60 ++--- .../pkg/cli/command/curvebs/query/query.go | 2 + .../volume/clone-recover/clone-recover.go | 205 ++++++++++++++++++ .../command/curvebs/query/volume/volume.go | 50 +++++ tools-v2/pkg/config/bs.go | 4 + 10 files changed, 334 insertions(+), 105 deletions(-) create mode 100644 tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover/clone-recover.go create mode 100644 tools-v2/pkg/cli/command/curvebs/query/volume/volume.go diff --git a/tools-v2/README.md b/tools-v2/README.md index 9a4e5c3480..cc24dc284f 100644 --- a/tools-v2/README.md +++ b/tools-v2/README.md @@ -48,21 +48,22 @@ A tool for CurveFS & CurveBs. - [warmup query](#warmup-query) - [bs](#bs) - [list](#list-1) - - [list logical-pool](#list-logical-pool) - - [list server](#list-server) - - [list client](#list-client) - - [list dir](#list-dir) - - [list space](#list-space) - - [list chunkserver](#list-chunkserver) - - [list scan-status](#list-scan-status) - - [list may-broken-vol](#list-may-broken-vol) - - [list snapshot](#list-snapshot) + - [list logical-pool](#list-logical-pool) + - [list server](#list-server) + - [list client](#list-client) + - [list dir](#list-dir) + - [list space](#list-space) + - [list chunkserver](#list-chunkserver) + - [list scan-status](#list-scan-status) + - [list may-broken-vol](#list-may-broken-vol) + - [list snapshot](#list-snapshot) - [clean-recycle](#clean-recycle) - [query](#query-1) - - [query file](#query-file) - - [query chunk](#query-chunk) - - [query segment](#query-segment) + - [query file](#query-file) + - [query chunk](#query-chunk) + - [query segment](#query-segment) - [query scan-status](#query-scan-status) + - [query volume clone-recover](#query-volume-clone-recover) - [status](#status-1) - [status etcd](#status-etcd-1) - [status mds](#status-mds-1) @@ -1441,6 +1442,24 @@ Output: +-------------+-----------+-------+-------------+--------------------+ ``` + +##### query volume clone-recover +query volume clone and recover in curvebs cluster + +Usage: +```bash +curve bs query volume clone-recover +``` + +Output: +```bash ++------+--------------------------------------+--------------------------------------+----------+-------+----------+--------+----------+--------+----------+---------------------+ +| USER | SRC | TASK ID | TASKTYPE | FILE | FILETYPE | ISLAZY | NEXTSTEP | STATUS | PROGRESS | TIME | ++------+--------------------------------------+--------------------------------------+----------+-------+----------+--------+----------+--------+----------+---------------------+ +| root | a19b5e5e-b306-488f-8e6d-d87282c869cb | d26e27a8-fcbd-4f7a-adf8-53795217cbb0 | clone | /root | file | false | end | done | 1 | 2006-01-02 15:04:05 | ++------+--------------------------------------+--------------------------------------+----------+-------+----------+--------+----------+--------+----------+---------------------+ +``` + #### status ##### status etcd diff --git a/tools-v2/internal/error/error.go b/tools-v2/internal/error/error.go index fb637fcf90..7a1b71d870 100644 --- a/tools-v2/internal/error/error.go +++ b/tools-v2/internal/error/error.go @@ -497,6 +497,9 @@ var ( ErrBsListSnaspshot = func(requestId, code, message string) *CmdError { return NewInternalCmdError(78, fmt.Sprintf("list snapshot fail, requestId: %s, code: %s, message: %s", requestId, code, message)) } + ErrBsGetCloneRecover = func() *CmdError { + return NewInternalCmdError(73, "get clone-recover fail, err: %s") + } // http error ErrHttpUnreadableResult = func() *CmdError { diff --git a/tools-v2/internal/utils/row.go b/tools-v2/internal/utils/row.go index 8196bff29f..6369aa3ed5 100644 --- a/tools-v2/internal/utils/row.go +++ b/tools-v2/internal/utils/row.go @@ -132,6 +132,10 @@ const ( ROW_HEALTHY_RATIO = "ratio" ROW_UNHEALTHY_RATIO = "unhealthyRatio" ROW_FORMAT_PERCENT = "formatPercent" + ROW_TASKTYPE = "taskType" + ROW_ISLAZY = "isLazy" + ROW_NEXTSTEP = "nextStep" + ROW_TIME = "time" ROW_RW_STATUS = "rwStatus" ROW_DISK_STATE = "diskState" diff --git a/tools-v2/internal/utils/snapshot/snapshot.go b/tools-v2/internal/utils/snapshot/snapshot.go index 5f97f868da..b4fdbf7df0 100644 --- a/tools-v2/internal/utils/snapshot/snapshot.go +++ b/tools-v2/internal/utils/snapshot/snapshot.go @@ -64,17 +64,17 @@ type SnapshotInfos []SnapshotInfo var SnapshotStatus = []string{"done", "in-progress", "deleting", "errorDeleting", "canceling", "error"} type TaskInfo struct { - File string `json:"File"` - FileType int `json:"FileType"` - IsLazy bool `json:"IsLazy"` - NextStep int `json:"NextStep"` - Progress int `json:"Progress"` - Src string `json:"Src"` - TaskStatus int `json:"TaskStatus"` - TaskType int `json:"TaskType"` - Time int `json:"Time"` - UUID string `json:"UUID"` - User string `json:"User"` + File string `json:"File"` + FileType int `json:"FileType"` + IsLazy bool `json:"IsLazy"` + NextStep int `json:"NextStep"` + Progress float64 `json:"Progress"` + Src string `json:"Src"` + TaskStatus int `json:"TaskStatus"` + TaskType int `json:"TaskType"` + Time int64 `json:"Time"` + UUID string `json:"UUID"` + User string `json:"User"` } type TaskInfos []TaskInfo @@ -83,4 +83,3 @@ var TaskStatus = []string{"Done", "Cloning", "Recovering", "Cleaning", "ErrorCle var TaskType = []string{"clone", "recover"} var FileType = []string{"file", "snapshot"} var CloneStep = []string{"CreateCloneFile", "CreateCloneMeta", "CreateCloneChunk", "CompleteCloneMeta", "RecoverChunk", "ChangeOwner", "RenameCloneFile", "CompleteCloneFile", "End"} -var IsLazy = []string{"false", "true"} diff --git a/tools-v2/pkg/cli/command/curvebs/delete/volume/clone/clone.go b/tools-v2/pkg/cli/command/curvebs/delete/volume/clone/clone.go index 46e9268468..ba9a89bae7 100644 --- a/tools-v2/pkg/cli/command/curvebs/delete/volume/clone/clone.go +++ b/tools-v2/pkg/cli/command/curvebs/delete/volume/clone/clone.go @@ -24,6 +24,7 @@ package clone import ( "encoding/json" "fmt" + clone_recover "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover" "sync" "time" @@ -78,43 +79,13 @@ func (rCmd *CloneCmd) Init(cmd *cobra.Command, args []string) error { } func (rCmd *CloneCmd) RunCommand(cmd *cobra.Command, args []string) error { - params := map[string]any{ - snapshotutil.QueryAction: snapshotutil.ActionGetCloneTaskList, - snapshotutil.QueryType: snapshotutil.TypeCloneTask, - snapshotutil.QueryUser: rCmd.user, - snapshotutil.QueryUUID: rCmd.taskID, - snapshotutil.QuerySource: rCmd.src, - snapshotutil.QueryDestination: rCmd.dest, - snapshotutil.QueryStatus: rCmd.status, - snapshotutil.QueryLimit: 100, - snapshotutil.QueryOffset: 0, - } - records := make(snapshotutil.TaskInfos, 0) - for { - subUri := snapshotutil.NewQuerySubUri(params) - metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) - result, err := basecmd.QueryMetric(metric) - if err.TypeCode() != cmderror.CODE_SUCCESS { - return err.ToError() - } - - var payload struct { - snapshotutil.Response - TaskInfos snapshotutil.TaskInfos `json:"TaskInfos"` - TotalCount int `json:"TotalCount"` - } - if err := json.Unmarshal([]byte(result), &payload); err != nil { - return err - } - if payload.Code != snapshotutil.ResultSuccess { - return fmt.Errorf("get clone list fail, requestId: %s, code: %s, message: %s", payload.RequestId, payload.Code, payload.Message) - } - if len(payload.TaskInfos) == 0 { - break - } else { - records = append(records, payload.TaskInfos...) - params[snapshotutil.QueryOffset] = params[snapshotutil.QueryOffset].(int) + params[snapshotutil.QueryLimit].(int) - } + config.AddBsTaskTypeOptionFlag(rCmd.Cmd) + rCmd.Cmd.ParseFlags([]string{ + fmt.Sprintf("--%s", config.CURVEBS_TYPE), "clone", + }) + records, err := clone_recover.GetCloneOrRecoverList(rCmd.Cmd) + if err.TypeCode() != cmderror.CODE_SUCCESS { + return err.ToError() } wg := sync.WaitGroup{} diff --git a/tools-v2/pkg/cli/command/curvebs/delete/volume/recover/recover.go b/tools-v2/pkg/cli/command/curvebs/delete/volume/recover/recover.go index 4e4f4bc34e..9dcf3df0d6 100644 --- a/tools-v2/pkg/cli/command/curvebs/delete/volume/recover/recover.go +++ b/tools-v2/pkg/cli/command/curvebs/delete/volume/recover/recover.go @@ -31,6 +31,7 @@ import ( cobrautil "github.com/opencurve/curve/tools-v2/internal/utils" snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot" basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command" + clone_recover "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover" "github.com/opencurve/curve/tools-v2/pkg/config" "github.com/opencurve/curve/tools-v2/pkg/output" "github.com/spf13/cobra" @@ -77,56 +78,26 @@ func (rCmd *RecoverCmd) Init(cmd *cobra.Command, args []string) error { } func (rCmd *RecoverCmd) RunCommand(cmd *cobra.Command, args []string) error { - params := map[string]any{ - snapshotutil.QueryAction: snapshotutil.ActionGetCloneTaskList, - snapshotutil.QueryType: snapshotutil.TypeRecoverTask, - snapshotutil.QueryUser: rCmd.user, - snapshotutil.QueryUUID: rCmd.taskID, - snapshotutil.QuerySource: rCmd.src, - snapshotutil.QueryDestination: rCmd.dest, - snapshotutil.QueryStatus: rCmd.status, - snapshotutil.QueryLimit: 100, - snapshotutil.QueryOffset: 0, - } - records := make(snapshotutil.TaskInfos, 0) - for { - subUri := snapshotutil.NewQuerySubUri(params) - metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) - result, err := basecmd.QueryMetric(metric) - if err.TypeCode() != cmderror.CODE_SUCCESS { - return err.ToError() - } - - var payload struct { - snapshotutil.Response - TaskInfos snapshotutil.TaskInfos `json:"TaskInfos"` - TotalCount int `json:"TotalCount"` - } - if err := json.Unmarshal([]byte(result), &payload); err != nil { - return err - } - if payload.Code != snapshotutil.ResultSuccess { - return fmt.Errorf("get clone list fail, requestId: %s, code: %s, message: %s", payload.RequestId, payload.Code, payload.Message) - } - if len(payload.TaskInfos) == 0 { - break - } else { - records = append(records, payload.TaskInfos...) - params[snapshotutil.QueryOffset] = params[snapshotutil.QueryOffset].(int) + params[snapshotutil.QueryLimit].(int) - } + config.AddBsTaskTypeOptionFlag(rCmd.Cmd) + rCmd.Cmd.ParseFlags([]string{ + fmt.Sprintf("--%s", config.CURVEBS_TYPE), "recover", + }) + records, err := clone_recover.GetCloneOrRecoverList(rCmd.Cmd) + if err.TypeCode() != cmderror.CODE_SUCCESS { + return err.ToError() } wg := sync.WaitGroup{} for _, item := range records { wg.Add(1) - go func(clone snapshotutil.TaskInfo) { + go func(recover snapshotutil.TaskInfo) { defer wg.Done() result := cobrautil.ROW_VALUE_SUCCESS reason := "" params := map[string]any{ snapshotutil.QueryAction: snapshotutil.ActionCleanCloneTask, - snapshotutil.QueryUser: clone.User, - snapshotutil.QueryUUID: clone.UUID, + snapshotutil.QueryUser: recover.User, + snapshotutil.QueryUUID: recover.UUID, } subUri := snapshotutil.NewQuerySubUri(params) metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) @@ -147,16 +118,17 @@ func (rCmd *RecoverCmd) RunCommand(cmd *cobra.Command, args []string) error { } } rCmd.TableNew.Append(cobrautil.Map2List(map[string]string{ - cobrautil.ROW_USER: clone.User, - cobrautil.ROW_SRC: clone.Src, - cobrautil.ROW_TASK_ID: clone.UUID, - cobrautil.ROW_FILE: clone.File, + cobrautil.ROW_USER: recover.User, + cobrautil.ROW_SRC: recover.Src, + cobrautil.ROW_TASK_ID: recover.UUID, + cobrautil.ROW_FILE: recover.File, cobrautil.ROW_RESULT: result, cobrautil.ROW_REASON: reason, }, rCmd.Header)) }(item) } wg.Wait() + rCmd.Result = records rCmd.Error = cmderror.Success() return nil diff --git a/tools-v2/pkg/cli/command/curvebs/query/query.go b/tools-v2/pkg/cli/command/curvebs/query/query.go index c26a35f48a..04270c5900 100644 --- a/tools-v2/pkg/cli/command/curvebs/query/query.go +++ b/tools-v2/pkg/cli/command/curvebs/query/query.go @@ -28,6 +28,7 @@ import ( "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/file" "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/scanstatus" "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/seginfo" + "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/volume" "github.com/spf13/cobra" ) @@ -43,6 +44,7 @@ func (queryCmd *QueryCommand) AddSubCommands() { seginfo.NewSeginfoCommand(), chunk.NewChunkCommand(), scanstatus.NewScanStatusCommand(), + volume.NewVolumeCommand(), ) } diff --git a/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover/clone-recover.go b/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover/clone-recover.go new file mode 100644 index 0000000000..dbdc48926c --- /dev/null +++ b/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover/clone-recover.go @@ -0,0 +1,205 @@ +/* +* Copyright (c) 2023 NetEase Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ +/* +* Project: curve +* Created Date: 2023-10-08 +* Author: baytan0720 + */ + +package clone_recover + +import ( + "encoding/json" + "fmt" + "time" + + cmderror "github.com/opencurve/curve/tools-v2/internal/error" + cobrautil "github.com/opencurve/curve/tools-v2/internal/utils" + snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot" + basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command" + "github.com/opencurve/curve/tools-v2/pkg/config" + "github.com/opencurve/curve/tools-v2/pkg/output" + "github.com/spf13/cobra" +) + +const ( + cloneRecoverExample = `$ curve bs query volume clone-recover` +) + +type CloneCmd struct { + basecmd.FinalCurveCmd + snapshotAddrs []string + timeout time.Duration + + user string + src string + dest string + failed bool + status string + taskID string + taskType string + records snapshotutil.TaskInfos +} + +var _ basecmd.FinalCurveCmdFunc = (*CloneCmd)(nil) + +func (rCmd *CloneCmd) Init(cmd *cobra.Command, args []string) error { + snapshotAddrs, err := config.GetBsSnapshotAddrSlice(rCmd.Cmd) + if err.TypeCode() != cmderror.CODE_SUCCESS || len(snapshotAddrs) == 0 { + return err.ToError() + } + rCmd.snapshotAddrs = snapshotAddrs + rCmd.timeout = config.GetFlagDuration(rCmd.Cmd, config.HTTPTIMEOUT) + rCmd.user = config.GetBsFlagString(rCmd.Cmd, config.CURVEBS_USER) + rCmd.src = config.GetBsFlagString(rCmd.Cmd, config.CURVEBS_SRC) + rCmd.dest = config.GetBsFlagString(rCmd.Cmd, config.CURVEBS_DEST) + rCmd.taskID = config.GetBsFlagString(rCmd.Cmd, config.CURVEBS_TASKID) + rCmd.failed = config.GetBsFlagBool(rCmd.Cmd, config.CURVEBS_FAILED) + if rCmd.failed { + rCmd.status = "5" + } + taskType := config.GetBsFlagString(rCmd.Cmd, config.CURVEBS_TYPE) + switch taskType { + case "clone": + rCmd.taskType = snapshotutil.TypeCloneTask + case "recover": + rCmd.taskType = snapshotutil.TypeRecoverTask + case "": + default: + return fmt.Errorf("invalid task type: %s, only support clone and recover", taskType) + } + + rCmd.SetHeader([]string{cobrautil.ROW_USER, cobrautil.ROW_SRC, cobrautil.ROW_TASK_ID, cobrautil.ROW_TASKTYPE, cobrautil.ROW_FILE, cobrautil.ROW_FILE_TYPE, cobrautil.ROW_ISLAZY, cobrautil.ROW_NEXTSTEP, cobrautil.ROW_STATUS, cobrautil.ROW_PROGRESS, cobrautil.ROW_TIME}) + return nil +} + +func (rCmd *CloneCmd) RunCommand(cmd *cobra.Command, args []string) error { + params := map[string]any{ + snapshotutil.QueryAction: snapshotutil.ActionGetCloneTaskList, + snapshotutil.QueryType: rCmd.taskType, + snapshotutil.QueryUser: rCmd.user, + snapshotutil.QueryUUID: rCmd.taskID, + snapshotutil.QuerySource: rCmd.src, + snapshotutil.QueryDestination: rCmd.dest, + snapshotutil.QueryStatus: rCmd.status, + snapshotutil.QueryLimit: 100, + snapshotutil.QueryOffset: 0, + } + records := make(snapshotutil.TaskInfos, 0) + for { + subUri := snapshotutil.NewQuerySubUri(params) + metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) + result, err := basecmd.QueryMetric(metric) + if err.TypeCode() != cmderror.CODE_SUCCESS { + return err.ToError() + } + + var resp struct { + snapshotutil.Response + TaskInfos snapshotutil.TaskInfos `json:"TaskInfos"` + } + if err := json.Unmarshal([]byte(result), &resp); err != nil { + return err + } + if resp.Code != snapshotutil.ResultSuccess { + return fmt.Errorf("get clone-recover list fail, requestId: %s,code: %s, error: %s", resp.RequestId, resp.Code, resp.Message) + } + if len(resp.TaskInfos) == 0 { + break + } else { + records = append(records, resp.TaskInfos...) + params[snapshotutil.QueryOffset] = params[snapshotutil.QueryOffset].(int) + params[snapshotutil.QueryLimit].(int) + } + } + + rows := make([][]string, len(records)) + for _, record := range records { + rows = append(rows, []string{ + record.User, + record.Src, + record.UUID, + snapshotutil.TaskType[record.TaskType], + record.File, + snapshotutil.FileType[record.FileType], + fmt.Sprintf("%t", record.IsLazy), + snapshotutil.CloneStep[record.NextStep], + snapshotutil.TaskStatus[record.TaskStatus], + fmt.Sprintf("%f", record.Progress), + time.Unix(record.Time, 0).Format("2006-01-02 15:04:05"), + }) + } + + rCmd.TableNew.AppendBulk(rows) + rCmd.records = records + rCmd.Result = records + rCmd.Error = cmderror.Success() + return nil +} + +func (rCmd *CloneCmd) Print(cmd *cobra.Command, args []string) error { + return output.FinalCmdOutput(&rCmd.FinalCurveCmd, rCmd) +} + +func (rCmd *CloneCmd) ResultPlainOutput() error { + return output.FinalCmdOutputPlain(&rCmd.FinalCurveCmd) +} + +func (rCmd *CloneCmd) AddFlags() { + config.AddBsSnapshotCloneFlagOption(rCmd.Cmd) + config.AddHttpTimeoutFlag(rCmd.Cmd) + config.AddBsUserOptionFlag(rCmd.Cmd) + config.AddBsSrcOptionFlag(rCmd.Cmd) + config.AddBsDestOptionFlag(rCmd.Cmd) + config.AddBsTaskIDOptionFlag(rCmd.Cmd) + config.AddBsAllOptionFlag(rCmd.Cmd) + config.AddBsFailedOptionFlag(rCmd.Cmd) + config.AddBsTaskTypeOptionFlag(rCmd.Cmd) +} + +func NewQueryCloneRecoverCommand() *CloneCmd { + rCmd := &CloneCmd{ + FinalCurveCmd: basecmd.FinalCurveCmd{ + Use: "clone-recover", + Short: "query volume clone and recover in curvebs cluster", + Example: cloneRecoverExample, + }, + } + basecmd.NewFinalCurveCli(&rCmd.FinalCurveCmd, rCmd) + return rCmd +} + +func NewCommand() *cobra.Command { + return NewQueryCloneRecoverCommand().Cmd +} + +func GetCloneOrRecoverList(caller *cobra.Command) (snapshotutil.TaskInfos, *cmderror.CmdError) { + getCmd := NewQueryCloneRecoverCommand() + config.AlignFlagsValue(caller, getCmd.Cmd, []string{ + config.CURVEBS_SNAPSHOTADDR, config.HTTPTIMEOUT, config.CURVEBS_USER, + config.CURVEBS_SRC, config.CURVEBS_DEST, config.CURVEBS_TASKID, + config.CURVEBS_ALL, config.CURVEBS_FAILED, config.CURVEBS_TYPE, + }) + getCmd.Cmd.SilenceErrors = true + getCmd.Cmd.SilenceUsage = true + getCmd.Cmd.SetArgs([]string{"--format", config.FORMAT_NOOUT}) + err := getCmd.Cmd.Execute() + if err != nil { + retErr := cmderror.ErrBsGetCloneRecover() + retErr.Format(err.Error()) + return nil, retErr + } + return getCmd.records, cmderror.Success() +} diff --git a/tools-v2/pkg/cli/command/curvebs/query/volume/volume.go b/tools-v2/pkg/cli/command/curvebs/query/volume/volume.go new file mode 100644 index 0000000000..df0e891adf --- /dev/null +++ b/tools-v2/pkg/cli/command/curvebs/query/volume/volume.go @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2023 NetEase Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ +/* +* Project: curve +* Created Date: 2023-10-08 +* Author: baytan0720 + */ + +package volume + +import ( + basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command" + clone_recover "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/volume/clone-recover" + "github.com/spf13/cobra" +) + +type RecoverCommand struct { + basecmd.MidCurveCmd +} + +var _ basecmd.MidCurveCmdFunc = (*RecoverCommand)(nil) // check interface + +func (dCmd *RecoverCommand) AddSubCommands() { + dCmd.Cmd.AddCommand( + clone_recover.NewCommand(), + ) +} + +func NewVolumeCommand() *cobra.Command { + dCmd := &RecoverCommand{ + basecmd.MidCurveCmd{ + Use: "volume", + Short: "query resources in the curvebs", + }, + } + return basecmd.NewMidCurveCli(&dCmd.MidCurveCmd, dCmd) +} diff --git a/tools-v2/pkg/config/bs.go b/tools-v2/pkg/config/bs.go index 4b18821b78..2eceb2b9ca 100644 --- a/tools-v2/pkg/config/bs.go +++ b/tools-v2/pkg/config/bs.go @@ -675,6 +675,10 @@ func AddBsSnapshotIDOptionFlag(cmd *cobra.Command) { AddBsStringOptionFlag(cmd, CURVEBS_SNAPSHOT_ID, "snapshot seqId") } +func AddBsTaskTypeOptionFlag(cmd *cobra.Command) { + AddBsStringOptionFlag(cmd, CURVEBS_TYPE, "only query target type (clone or recover)") +} + // get stingslice flag func GetBsFlagStringSlice(cmd *cobra.Command, flagName string) []string { var value []string