Skip to content

Commit

Permalink
feat(tool):add bs delete snapshot
Browse files Browse the repository at this point in the history
Signed-off-by: ZackSoul <[email protected]>
  • Loading branch information
ZackSoul authored and caoxianfei1 committed Jan 5, 2024
1 parent 3a82cb7 commit 3310650
Show file tree
Hide file tree
Showing 6 changed files with 277 additions and 38 deletions.
37 changes: 30 additions & 7 deletions tools-v2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ A tool for CurveFS & CurveBs.
- [delete volume](#delete-volume)
- [delete volume clone](#delete-volume-clone)
- [delete volume recover](#delete-volume-recover)
- [delete snapshot](#delete-snapshot)
- [update](#update)
- [update peer](#update-peer)
- [update leader](#update-leader)
Expand Down Expand Up @@ -1693,6 +1694,28 @@ Output:
+------+--------------------------------------+--------------------------------------+-------+---------+--------+
```

##### delete snapshot

delete the snapshot in curvebs

Usage:

```shell
curve bs delete snapshot --path /test111/test222 --user root --snapshotFailed=false
```

Output:

```shell
+--------------------------------------+--------------+---------+--------+
| SNAPSHOTID | SNAPSHOTNAME | RESULT | REASON |
+--------------------------------------+--------------+---------+--------+
| 3b9d14c2-79a2-4454-9b0a-6cb7477956db | testsnap1 | success | null |
+--------------------------------------+--------------+---------+--------+
| 2a94fb51-e985-4e98-a34c-f02aef8e97b5 | testsnap2 | success | null |
+--------------------------------------+--------------+---------+--------+
```

#### update

##### update peer
Expand Down Expand Up @@ -2030,13 +2053,13 @@ curve bs stop snapshot
Output:

```shell
+--------------------------------------+--------------+---------+
| SNAPSHOTID | SNAPSHOTNAME | RESULT |
+--------------------------------------+--------------+---------+
| 9aa2b4c5-f27b-40a2-82c9-4e0ad6093567 | testsnap | success |
+--------------------------------------+--------------+---------+
| 0171a33b-17b7-4215-9f00-6d8de2686f77 | testsnap1 | success |
+--------------------------------------+--------------+---------+
+--------------------------------------+--------------+---------+--------+
| SNAPSHOTID | SNAPSHOTNAME | RESULT | REASON |
+--------------------------------------+--------------+---------+--------+
| 3b9d14c2-79a2-4454-9b0a-6cb7477956db | testsnap1 | success | null |
+--------------------------------------+--------------+---------+--------+
| 2a94fb51-e985-4e98-a34c-f02aef8e97b5 | testsnap2 | success | null |
+--------------------------------------+--------------+---------+--------+
```

#### recover
Expand Down
3 changes: 3 additions & 0 deletions tools-v2/internal/utils/snapshot/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,7 @@ const (
ResultSuccess = "0"
Limit = "100"
Offset = "0"

ErrSnaphshot = "5"
DefaultSnapID = "*"
)
2 changes: 2 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/delete/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete/file"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete/peer"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete/snapshot"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete/volume"
)

Expand All @@ -26,6 +27,7 @@ func (dCmd *DeleteCommand) AddSubCommands() {
file.NewFileCommand(),
peer.NewCommand(),
volume.NewVolumeCommand(),
snapshot.NewSnapShotCommand(),
)
}

Expand Down
177 changes: 177 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/delete/snapshot/snapshot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
/*
* 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-11-10
* Author: ZackSoul
*/
package snapshot

import (
"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"
listSnapshot "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/list/snapshot"
stopSnapShot "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/stop/snapshot"
"github.com/opencurve/curve/tools-v2/pkg/config"
"github.com/opencurve/curve/tools-v2/pkg/output"
"github.com/spf13/cobra"
)

const (
snapshotExample = `$ curve bs delete snapshot --path /test111/test222 --user root --snapshotFailed=false`
)

type SnapShotCommand struct {
basecmd.FinalCurveCmd
snapshotAddrs []string
timeout time.Duration

user string
file string
uuid string
failed bool
}

var _ basecmd.FinalCurveCmdFunc = (*SnapShotCommand)(nil)

func NewSnapShotCommand() *cobra.Command {
return NewDeleteSnapShotCommand().Cmd
}

func NewDeleteSnapShotCommand() *SnapShotCommand {
snapShotCommand := &SnapShotCommand{
FinalCurveCmd: basecmd.FinalCurveCmd{
Use: "snapshot",
Short: "delete snapshot in curvebs",
Example: snapshotExample,
},
}

basecmd.NewFinalCurveCli(&snapShotCommand.FinalCurveCmd, snapShotCommand)
return snapShotCommand
}

func (sCmd *SnapShotCommand) AddFlags() {
config.AddBsSnapshotCloneFlagOption(sCmd.Cmd)
config.AddHttpTimeoutFlag(sCmd.Cmd)
config.AddBsUserOptionFlag(sCmd.Cmd)
config.AddBsSnapshotIDOptionFlag(sCmd.Cmd)
config.AddBsPathOptionFlag(sCmd.Cmd)
config.AddBsSnapshotFailedOptionFlag(sCmd.Cmd)
}

func (sCmd *SnapShotCommand) Init(cmd *cobra.Command, args []string) error {
snapshotAddrs, err := config.GetBsSnapshotAddrSlice(sCmd.Cmd)
if err.TypeCode() != cmderror.CODE_SUCCESS {
sCmd.Error = err
return err.ToError()
}
sCmd.snapshotAddrs = snapshotAddrs
sCmd.timeout = config.GetFlagDuration(sCmd.Cmd, config.HTTPTIMEOUT)
sCmd.user = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_USER)
sCmd.file = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_PATH)
sCmd.uuid = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_SNAPSHOT_ID)
sCmd.failed = config.GetBsFlagBool(sCmd.Cmd, config.CURVEBS_SNAPSHOT_FAILED)
header := []string{
cobrautil.ROW_SNAPSHOT_ID,
cobrautil.ROW_SNAPSHOT_NAME,
cobrautil.ROW_RESULT,
cobrautil.ROW_REASON,
}
sCmd.TableNew.SetAutoMergeCellsByColumnIndex(cobrautil.GetIndexSlice(
sCmd.Header, []string{cobrautil.ROW_FILE},
))
sCmd.SetHeader(header)
return nil
}

func (sCmd *SnapShotCommand) Print(cmd *cobra.Command, args []string) error {
return output.FinalCmdOutput(&sCmd.FinalCurveCmd, sCmd)
}

func (sCmd *SnapShotCommand) RunCommand(cmd *cobra.Command, args []string) error {
params := map[string]any{
snapshotutil.QueryAction: snapshotutil.ActionGetFileSnapshotList,
snapshotutil.QueryUser: sCmd.user,
snapshotutil.QueryFile: sCmd.file,
snapshotutil.QueryLimit: snapshotutil.Limit,
snapshotutil.QueryOffset: snapshotutil.Offset,
}
if sCmd.failed {
params[snapshotutil.QueryStatus] = snapshotutil.ErrSnaphshot
}
if sCmd.uuid != snapshotutil.DefaultSnapID {
params[snapshotutil.QueryUUID] = sCmd.uuid
}
snapshotsList, err := listSnapshot.ListSnapShot(sCmd.snapshotAddrs, sCmd.timeout, params)
if err != nil {
sCmd.Error = err
return sCmd.Error.ToError()
}
rows := make([]map[string]string, 0)
if len(snapshotsList) == 0 {
rows = append(rows, stopSnapShot.EmptyOutPut())
} else {
for _, snapshot := range snapshotsList {
row := make(map[string]string)
err := DeleteSnapShot(sCmd.snapshotAddrs, sCmd.timeout, snapshot)
row[cobrautil.ROW_SNAPSHOT_ID] = snapshot.UUID
row[cobrautil.ROW_SNAPSHOT_NAME] = snapshot.Name
if err.TypeCode() == cmderror.CODE_SUCCESS {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS
row[cobrautil.ROW_REASON] = "null"
} else {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED
row[cobrautil.ROW_REASON] = err.ToError().Error()
}
rows = append(rows, row)
}
}
list := cobrautil.ListMap2ListSortByKeys(rows, sCmd.Header, []string{cobrautil.ROW_SNAPSHOT_NAME, cobrautil.ROW_SNAPSHOT_ID})
var emptyList [][]string = [][]string{}
if len(snapshotsList) == 0 {
sCmd.TableNew.AppendBulk(emptyList)
sCmd.Result = rows
sCmd.Error = cmderror.Success()
return nil
}
sCmd.TableNew.AppendBulk(list)
sCmd.Result = rows
sCmd.Error = cmderror.Success()
return nil
}

func (sCmd *SnapShotCommand) ResultPlainOutput() error {
return output.FinalCmdOutputPlain(&sCmd.FinalCurveCmd)
}

func DeleteSnapShot(addrs []string, timeout time.Duration, snapshot *snapshotutil.SnapshotInfo) *cmderror.CmdError {
params := map[string]any{
snapshotutil.QueryAction: snapshotutil.ActionDeleteSnapshot,
snapshotutil.QueryUser: snapshot.User,
snapshotutil.QueryUUID: snapshot.UUID,
snapshotutil.QueryFile: snapshot.File,
}
subUri := snapshotutil.NewQuerySubUri(params)
metric := basecmd.NewMetric(addrs, subUri, timeout)
_, err := basecmd.QueryMetric(metric)
return err
}
45 changes: 35 additions & 10 deletions tools-v2/pkg/cli/command/curvebs/stop/snapshot/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,11 @@ func (sCmd *SnapShotCommand) Init(cmd *cobra.Command, args []string) error {
cobrautil.ROW_SNAPSHOT_ID,
cobrautil.ROW_SNAPSHOT_NAME,
cobrautil.ROW_RESULT,
cobrautil.ROW_REASON,
}
sCmd.TableNew.SetAutoMergeCellsByColumnIndex(cobrautil.GetIndexSlice(
sCmd.Header, []string{cobrautil.ROW_FILE},
))
sCmd.SetHeader(header)
return nil
}
Expand All @@ -115,17 +119,23 @@ func (sCmd *SnapShotCommand) RunCommand(cmd *cobra.Command, args []string) error
return sCmd.Error.ToError()
}
rows := make([]map[string]string, 0)
for _, snapshot := range snapshotsList {
row := make(map[string]string)
err := StopSnapShot(sCmd.snapshotAddrs, sCmd.timeout, snapshot)
row[cobrautil.ROW_SNAPSHOT_ID] = snapshot.UUID
row[cobrautil.ROW_SNAPSHOT_NAME] = snapshot.Name
if err.TypeCode() == cmderror.CODE_SUCCESS {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS
} else {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED
if len(snapshotsList) == 0 {
rows = append(rows, EmptyOutPut())
} else {
for _, snapshot := range snapshotsList {
row := make(map[string]string)
err := StopSnapShot(sCmd.snapshotAddrs, sCmd.timeout, snapshot)
row[cobrautil.ROW_SNAPSHOT_ID] = snapshot.UUID
row[cobrautil.ROW_SNAPSHOT_NAME] = snapshot.Name
if err.TypeCode() == cmderror.CODE_SUCCESS {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_SUCCESS
row[cobrautil.ROW_REASON] = "null"
} else {
row[cobrautil.ROW_RESULT] = cobrautil.ROW_VALUE_FAILED
row[cobrautil.ROW_REASON] = err.ToError().Error()
}
rows = append(rows, row)
}
rows = append(rows, row)
}
list := cobrautil.ListMap2ListSortByKeys(rows, sCmd.Header, []string{cobrautil.ROW_SNAPSHOT_NAME, cobrautil.ROW_SNAPSHOT_ID})
sCmd.TableNew.AppendBulk(list)
Expand All @@ -150,3 +160,18 @@ func StopSnapShot(addrs []string, timeout time.Duration, snapshot *snapshotutil.
_, err := basecmd.QueryMetric(metric)
return err
}

func EmptyOutPut() map[string]string {
emptyResult := "-"
keys := []string{
cobrautil.ROW_SNAPSHOT_ID,
cobrautil.ROW_SNAPSHOT_NAME,
cobrautil.ROW_RESULT,
cobrautil.ROW_REASON,
}
row := make(map[string]string)
for _, key := range keys {
row[key] = emptyResult
}
return row
}
Loading

0 comments on commit 3310650

Please sign in to comment.