diff --git a/tools-v2/README.md b/tools-v2/README.md index f0e2f3f8e3..9a4e5c3480 100644 --- a/tools-v2/README.md +++ b/tools-v2/README.md @@ -83,6 +83,7 @@ A tool for CurveFS & CurveBs. - [update scan-state](#update-scan-state) - [update copyset availflag](#update-copyset-availflag) - [update leader-schedule](#update-leader-schedule) + - [update volume flatten](#update-volume-flatten) - [create](#create-1) - [create file](#create-file) - [create dir](#create-dir) @@ -1620,11 +1621,11 @@ curve bs delete volume clone Output: ```bash -+------+--------------------------------------+--------------------------------------+-------+---------+ -| USER | SRC | TASK ID | FILE | RESULT | -+------+--------------------------------------+--------------------------------------+-------+---------+ -| root | a19b5e5e-b306-488f-8e6d-d87282c869cb | d26e27a8-fcbd-4f7a-adf8-53795217cbb0 | /root | success | -+------+--------------------------------------+--------------------------------------+-------+---------+ ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ +| USER | SRC | TASK ID | FILE | RESULT | REASON | ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ +| root | a19b5e5e-b306-488f-8e6d-d87282c869cb | d26e27a8-fcbd-4f7a-adf8-53795217cbb0 | /root | success | | ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ ``` ###### delete volume recover @@ -1640,11 +1641,11 @@ curve bs delete volume recover Output: ```bash -+------+--------------------------------------+--------------------------------------+-------+---------+ -| USER | SRC | TASK ID | FILE | RESULT | -+------+--------------------------------------+--------------------------------------+-------+---------+ -| root | a19b5e5e-b306-488f-8e6d-d87282c869cb | 9dfa8699-a275-4891-8ec2-e447a0ccc77c | /root | success | -+------+--------------------------------------+--------------------------------------+-------+---------+ ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ +| USER | SRC | TASK ID | FILE | RESULT | REASON | ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ +| root | a19b5e5e-b306-488f-8e6d-d87282c869cb | 9dfa8699-a275-4891-8ec2-e447a0ccc77c | /root | success | | ++------+--------------------------------------+--------------------------------------+-------+---------+--------+ ``` #### update diff --git a/tools-v2/internal/error/error.go b/tools-v2/internal/error/error.go index a8d91a9cc9..b6c1954742 100644 --- a/tools-v2/internal/error/error.go +++ b/tools-v2/internal/error/error.go @@ -493,6 +493,9 @@ var ( ErrBsGetChunkHash = func() *CmdError { return NewInternalCmdError(77, "get chunk hash fail, err: %s") } + ErrBsListSnaspshot = func(requestId, code, message string) *CmdError { + return NewInternalCmdError(78, fmt.Sprintf("list snapshot fail, requestId: %s, code: %s, message: %s", requestId, code, message)) + } // http error ErrHttpUnreadableResult = func() *CmdError { diff --git a/tools-v2/internal/utils/snapshot.go b/tools-v2/internal/utils/snapshot/const.go similarity index 68% rename from tools-v2/internal/utils/snapshot.go rename to tools-v2/internal/utils/snapshot/const.go index 01e7104618..933ec4291f 100644 --- a/tools-v2/internal/utils/snapshot.go +++ b/tools-v2/internal/utils/snapshot/const.go @@ -20,13 +20,7 @@ * Author: baytan0720 */ -package cobrautil - -import ( - "fmt" - "net/url" - "strings" -) +package snapshot const ( Version = "0.0.6" @@ -61,32 +55,3 @@ const ( Limit = "100" Offset = "0" ) - -func NewSnapshotQuerySubUri(params map[string]any) string { - values := url.Values{} - - values.Add(QueryVersion, Version) - for key, value := range params { - if value != "" { - values.Add(key, fmt.Sprintf("%s", value)) - } - } - - return "/SnapshotCloneService?" + values.Encode() -} - -func NewSubUri(params map[string]any) string { - values := strings.Builder{} - for key, value := range params { - if value != "" { - values.WriteString(key) - values.WriteString("=") - values.WriteString(value.(string)) - values.WriteString("&") - } - } - str := values.String() - encodedParams := str[:len(str)-1] - subUri := fmt.Sprintf("/SnapshotCloneService?%s", encodedParams) - return subUri -} diff --git a/tools-v2/internal/utils/snapshot/snapshot.go b/tools-v2/internal/utils/snapshot/snapshot.go new file mode 100644 index 0000000000..5f97f868da --- /dev/null +++ b/tools-v2/internal/utils/snapshot/snapshot.go @@ -0,0 +1,86 @@ +/* + * 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: CurveCli + * Created Date: 2023-09-16 + * Author: baytan0720 + */ + +package snapshot + +import ( + "fmt" + "strings" +) + +func NewQuerySubUri(params map[string]any) string { + values := strings.Builder{} + for key, value := range params { + if value != "" && value != nil { + values.WriteString(key) + values.WriteString("=") + values.WriteString(fmt.Sprintf("%v", value)) + values.WriteString("&") + } + } + + return "/SnapshotCloneService?" + strings.TrimRight(values.String(), "&") +} + +type Response struct { + Code string `json:"Code"` + Message string `json:"Message"` + RequestId string `json:"RequestId"` +} + +type SnapshotInfo struct { + File string `json:"File"` + FileLength int `json:"FileLength"` + Name string `json:"Name"` + Progress float64 `json:"Progress"` + SeqNum int `json:"SeqNum"` + Status int `json:"status"` + Time int64 `json:"Time"` + UUID string `json:"UUID"` + User string `json:"User"` +} + +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"` +} + +type TaskInfos []TaskInfo + +var TaskStatus = []string{"Done", "Cloning", "Recovering", "Cleaning", "ErrorCleaning", "Error", "Retrying", "MetaInstalled"} +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 82a85f6993..46e9268468 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 @@ -31,6 +31,7 @@ import ( 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" @@ -72,80 +73,92 @@ func (rCmd *CloneCmd) Init(cmd *cobra.Command, args []string) error { if rCmd.failed { rCmd.status = "5" } - rCmd.SetHeader([]string{cobrautil.ROW_USER, cobrautil.ROW_SRC, cobrautil.ROW_TASK_ID, cobrautil.ROW_FILE, cobrautil.ROW_RESULT}) + rCmd.SetHeader([]string{cobrautil.ROW_USER, cobrautil.ROW_SRC, cobrautil.ROW_TASK_ID, cobrautil.ROW_FILE, cobrautil.ROW_RESULT, cobrautil.ROW_REASON}) return nil } func (rCmd *CloneCmd) RunCommand(cmd *cobra.Command, args []string) error { params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionGetCloneTaskList, - cobrautil.QueryType: cobrautil.TypeCloneTask, - cobrautil.QueryUser: rCmd.user, - cobrautil.QueryUUID: rCmd.taskID, - cobrautil.QuerySource: rCmd.src, - cobrautil.QueryDestination: rCmd.dest, - cobrautil.QueryStatus: rCmd.status, - cobrautil.QueryLimit: 100, - cobrautil.QueryOffset: 0, + 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([]map[string]string, 0) + records := make(snapshotutil.TaskInfos, 0) for { - subUri := cobrautil.NewSnapshotQuerySubUri(params) + 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 { - Code string `json:"Code"` - TaskInfos []map[string]string `json:"TaskInfos"` - TotalCount int `json:"TotalCount"` + var payload struct { + snapshotutil.Response + TaskInfos snapshotutil.TaskInfos `json:"TaskInfos"` + TotalCount int `json:"TotalCount"` } - if err := json.Unmarshal([]byte(result), &resp); err != nil { + if err := json.Unmarshal([]byte(result), &payload); err != nil { return err } - if resp.Code != cobrautil.ResultSuccess { - return fmt.Errorf("get clone list fail, error code: %s", resp.Code) + 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(resp.TaskInfos) == 0 { + if len(payload.TaskInfos) == 0 { break } else { - records = append(records, resp.TaskInfos...) - params[cobrautil.QueryOffset] = params[cobrautil.QueryOffset].(int) + params[cobrautil.QueryLimit].(int) + records = append(records, payload.TaskInfos...) + params[snapshotutil.QueryOffset] = params[snapshotutil.QueryOffset].(int) + params[snapshotutil.QueryLimit].(int) } } wg := sync.WaitGroup{} for _, item := range records { wg.Add(1) - go func(item map[string]string) { + go func(clone snapshotutil.TaskInfo) { defer wg.Done() + result := cobrautil.ROW_VALUE_SUCCESS + reason := "" params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionCleanCloneTask, - cobrautil.QueryUser: item["User"], - cobrautil.QueryUUID: item["UUID"], + snapshotutil.QueryAction: snapshotutil.ActionCleanCloneTask, + snapshotutil.QueryUser: clone.User, + snapshotutil.QueryUUID: clone.UUID, } - subUri := cobrautil.NewSnapshotQuerySubUri(params) + subUri := snapshotutil.NewQuerySubUri(params) metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) - result, err := basecmd.QueryMetric(metric) + retStr, err := basecmd.QueryMetric(metric) if err.TypeCode() != cmderror.CODE_SUCCESS { - item[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED + result = cobrautil.ROW_VALUE_FAILED + reason = err.ToError().Error() } else { - payload := map[string]any{} - if err := json.Unmarshal([]byte(result), &payload); err != nil { - item[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED + payload := snapshotutil.Response{} + if err := json.Unmarshal([]byte(retStr), &payload); err != nil { + result = cobrautil.ROW_VALUE_FAILED + reason = err.Error() } else { - if payload[cobrautil.ResultCode] != cobrautil.ResultSuccess { - item[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED + if payload.Code != snapshotutil.ResultSuccess { + result = cobrautil.ROW_VALUE_FAILED + reason = payload.Message } } } - item[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS - rCmd.TableNew.Append([]string{item["User"], item["Src"], item["UUID"], item["File"], item["Result"]}) + 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_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/delete/volume/recover/recover.go b/tools-v2/pkg/cli/command/curvebs/delete/volume/recover/recover.go index 678abb0a4a..4e4f4bc34e 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 @@ -29,6 +29,7 @@ import ( 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" @@ -71,77 +72,88 @@ func (rCmd *RecoverCmd) Init(cmd *cobra.Command, args []string) error { if rCmd.failed { rCmd.status = "5" } - rCmd.SetHeader([]string{cobrautil.ROW_USER, cobrautil.ROW_SRC, cobrautil.ROW_TASK_ID, cobrautil.ROW_FILE, cobrautil.ROW_RESULT}) + rCmd.SetHeader([]string{cobrautil.ROW_USER, cobrautil.ROW_SRC, cobrautil.ROW_TASK_ID, cobrautil.ROW_FILE, cobrautil.ROW_RESULT, cobrautil.ROW_REASON}) return nil } func (rCmd *RecoverCmd) RunCommand(cmd *cobra.Command, args []string) error { params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionGetCloneTaskList, - cobrautil.QueryType: cobrautil.TypeRecoverTask, - cobrautil.QueryUser: rCmd.user, - cobrautil.QueryUUID: rCmd.taskID, - cobrautil.QuerySource: rCmd.src, - cobrautil.QueryDestination: rCmd.dest, - cobrautil.QueryStatus: rCmd.status, - cobrautil.QueryLimit: 100, - cobrautil.QueryOffset: 0, + 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([]map[string]string, 0) + records := make(snapshotutil.TaskInfos, 0) for { - subUri := cobrautil.NewSnapshotQuerySubUri(params) + 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 { - Code string `json:"Code"` - TaskInfos []map[string]string `json:"TaskInfos"` - TotalCount int `json:"TotalCount"` + var payload struct { + snapshotutil.Response + TaskInfos snapshotutil.TaskInfos `json:"TaskInfos"` + TotalCount int `json:"TotalCount"` } - if err := json.Unmarshal([]byte(result), &resp); err != nil { + if err := json.Unmarshal([]byte(result), &payload); err != nil { return err } - if resp.Code != cobrautil.ResultSuccess { - return fmt.Errorf("get clone list fail, error code: %s", resp.Code) + 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(resp.TaskInfos) == 0 { + if len(payload.TaskInfos) == 0 { break } else { - records = append(records, resp.TaskInfos...) - params[cobrautil.QueryOffset] = params[cobrautil.QueryOffset].(int) + params[cobrautil.QueryLimit].(int) + records = append(records, payload.TaskInfos...) + params[snapshotutil.QueryOffset] = params[snapshotutil.QueryOffset].(int) + params[snapshotutil.QueryLimit].(int) } } wg := sync.WaitGroup{} for _, item := range records { wg.Add(1) - go func(item map[string]string) { + go func(clone snapshotutil.TaskInfo) { defer wg.Done() + result := cobrautil.ROW_VALUE_SUCCESS + reason := "" params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionCleanCloneTask, - cobrautil.QueryUser: item["User"], - cobrautil.QueryUUID: item["UUID"], + snapshotutil.QueryAction: snapshotutil.ActionCleanCloneTask, + snapshotutil.QueryUser: clone.User, + snapshotutil.QueryUUID: clone.UUID, } - subUri := cobrautil.NewSnapshotQuerySubUri(params) + subUri := snapshotutil.NewQuerySubUri(params) metric := basecmd.NewMetric(rCmd.snapshotAddrs, subUri, rCmd.timeout) - result, err := basecmd.QueryMetric(metric) + retStr, err := basecmd.QueryMetric(metric) if err.TypeCode() != cmderror.CODE_SUCCESS { - item["Result"] = cobrautil.ROW_VALUE_FAILED + result = cobrautil.ROW_VALUE_FAILED + reason = err.ToError().Error() } else { - payload := map[string]any{} - if err := json.Unmarshal([]byte(result), &payload); err != nil { - item["Result"] = cobrautil.ROW_VALUE_FAILED + payload := snapshotutil.Response{} + if err := json.Unmarshal([]byte(retStr), &payload); err != nil { + result = cobrautil.ROW_VALUE_FAILED + reason = err.Error() } else { - if payload[cobrautil.ResultCode] != cobrautil.ResultSuccess { - item["Result"] = cobrautil.ROW_VALUE_FAILED + if payload.Code != snapshotutil.ResultSuccess { + result = cobrautil.ROW_VALUE_FAILED + reason = payload.Message } } } - item["Result"] = cobrautil.ROW_VALUE_SUCCESS - rCmd.TableNew.Append([]string{item["User"], item["Src"], item["UUID"], item["File"], item["Result"]}) + 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_RESULT: result, + cobrautil.ROW_REASON: reason, + }, rCmd.Header)) }(item) } wg.Wait() diff --git a/tools-v2/pkg/cli/command/curvebs/list/snapshot/snapshot.go b/tools-v2/pkg/cli/command/curvebs/list/snapshot/snapshot.go index 79957c811e..da297d8c20 100644 --- a/tools-v2/pkg/cli/command/curvebs/list/snapshot/snapshot.go +++ b/tools-v2/pkg/cli/command/curvebs/list/snapshot/snapshot.go @@ -3,6 +3,7 @@ package snapshot import ( "encoding/json" "fmt" + snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot" "strconv" "time" @@ -18,26 +19,6 @@ const ( snapshotExample = `$ curve bs list snapshot` ) -type Response struct { - Code string `json:"Code"` - Message string `json:"Message"` - RequestId string `json:"RequestId"` - TotalCount int `json:"TotalCount"` - SnapShots []*SnapShotInfo `json:"Snapshots"` -} - -type SnapShotInfo struct { - File string `json:"File"` - FileLength int `json:"FileLength"` - Name string `json:"Name"` - Progress int `json:"Progress"` - SeqNum int `json:"SeqNum"` - Status int `json:"Status"` - Time int `json:"Time"` - UUID string `json:"UUID"` - User string `json:"User"` -} - type SnapShotCommand struct { basecmd.FinalCurveCmd snapshotAddrs []string @@ -109,15 +90,14 @@ func (sCmd *SnapShotCommand) Print(cmd *cobra.Command, args []string) error { func (sCmd *SnapShotCommand) RunCommand(cmd *cobra.Command, args []string) error { params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionGetFileSnapshotList, - cobrautil.QueryVersion: cobrautil.Version, - cobrautil.QueryUser: sCmd.user, - cobrautil.QueryFile: sCmd.file, - cobrautil.QueryLimit: cobrautil.Limit, - cobrautil.QueryOffset: cobrautil.Offset, + snapshotutil.QueryAction: snapshotutil.ActionGetFileSnapshotList, + snapshotutil.QueryUser: sCmd.user, + snapshotutil.QueryFile: sCmd.file, + snapshotutil.QueryLimit: snapshotutil.Limit, + snapshotutil.QueryOffset: snapshotutil.Offset, } if sCmd.uuid != "*" { - params[cobrautil.QueryUUID] = sCmd.uuid + params[snapshotutil.QueryUUID] = sCmd.uuid } snapshotsInfo, err := ListSnapShot(sCmd.snapshotAddrs, sCmd.timeout, params) if err != nil { @@ -149,11 +129,15 @@ func (sCmd *SnapShotCommand) ResultPlainOutput() error { return output.FinalCmdOutputPlain(&sCmd.FinalCurveCmd) } -func ListSnapShot(addrs []string, timeout time.Duration, params map[string]any) ([]*SnapShotInfo, *cmderror.CmdError) { - var snapshotsInfo []*SnapShotInfo +func ListSnapShot(addrs []string, timeout time.Duration, params map[string]any) ([]*snapshotutil.SnapshotInfo, *cmderror.CmdError) { + var snapshotsInfo []*snapshotutil.SnapshotInfo for { - var resp Response - subUri := cobrautil.NewSubUri(params) + var resp struct { + snapshotutil.Response + TotalCount int `json:"TotalCount"` + SnapShots []*snapshotutil.SnapshotInfo `json:"SnapShots"` + } + subUri := snapshotutil.NewQuerySubUri(params) metric := basecmd.NewMetric(addrs, subUri, timeout) result, err := basecmd.QueryMetric(metric) @@ -165,12 +149,15 @@ func ListSnapShot(addrs []string, timeout time.Duration, params map[string]any) retErr.Format(err.Error()) return snapshotsInfo, retErr } + if resp.Code != snapshotutil.ResultSuccess { + return snapshotsInfo, cmderror.ErrBsListSnaspshot(resp.RequestId, resp.Code, resp.Message) + } if len(resp.SnapShots) == 0 || resp.SnapShots == nil { return snapshotsInfo, nil } snapshotsInfo = append(snapshotsInfo, resp.SnapShots...) - offsetValue, _ := strconv.Atoi(params[cobrautil.QueryOffset].(string)) - limitValue, _ := strconv.Atoi(params[cobrautil.QueryLimit].(string)) - params[cobrautil.QueryOffset] = strconv.Itoa(offsetValue + limitValue) + offsetValue, _ := strconv.Atoi(params[snapshotutil.QueryOffset].(string)) + limitValue, _ := strconv.Atoi(params[snapshotutil.QueryLimit].(string)) + params[snapshotutil.QueryOffset] = strconv.Itoa(offsetValue + limitValue) } } diff --git a/tools-v2/pkg/cli/command/curvebs/update/volume/flatten/flatten.go b/tools-v2/pkg/cli/command/curvebs/update/volume/flatten/flatten.go index eab3240da6..a3bd04ee8f 100644 --- a/tools-v2/pkg/cli/command/curvebs/update/volume/flatten/flatten.go +++ b/tools-v2/pkg/cli/command/curvebs/update/volume/flatten/flatten.go @@ -23,10 +23,12 @@ package flatten 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" @@ -86,17 +88,17 @@ func (fCmd *FlattenCmd) Init(cmd *cobra.Command, args []string) error { func (fCmd *FlattenCmd) RunCommand(cmd *cobra.Command, args []string) error { params := map[string]any{ - cobrautil.QueryAction: cobrautil.ActionFlatten, - cobrautil.QueryUser: fCmd.user, - cobrautil.QueryUUID: fCmd.taskID, + snapshotutil.QueryAction: snapshotutil.ActionFlatten, + snapshotutil.QueryUser: fCmd.user, + snapshotutil.QueryUUID: fCmd.taskID, } - subUri := cobrautil.NewSnapshotQuerySubUri(params) + subUri := snapshotutil.NewQuerySubUri(params) metric := basecmd.NewMetric(fCmd.snapshotAddrs, subUri, fCmd.timeout) result, err := basecmd.QueryMetric(metric) if err.TypeCode() != cmderror.CODE_SUCCESS { return err.ToError() } - payload := map[string]any{} + payload := snapshotutil.Response{} if err := json.Unmarshal([]byte(result), &payload); err != nil { return err } @@ -104,12 +106,12 @@ func (fCmd *FlattenCmd) RunCommand(cmd *cobra.Command, args []string) error { row[cobrautil.ROW_USER] = fCmd.user row[cobrautil.ROW_TASK_ID] = fCmd.taskID - if payload[cobrautil.ResultCode] != cobrautil.ResultSuccess { - row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED - } else { - row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS + if payload.Code != snapshotutil.ResultSuccess { + return fmt.Errorf("update flatten failed, requestId: %s, code: %s, message: %s", payload.RequestId, payload.Code, payload.Message) } + row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS + fCmd.TableNew.Append([]string{row[cobrautil.ROW_USER], row[cobrautil.ROW_TASK_ID], row[cobrautil.ROW_RESULT]}) fCmd.Result = row return nil }