Skip to content

Commit

Permalink
[feat] tools-v2: add do-snapshot
Browse files Browse the repository at this point in the history
Signed-off-by: Xinlong-Chen <[email protected]>
  • Loading branch information
Xinlong-Chen committed May 10, 2023
1 parent 8a2d5d0 commit 2bb9918
Show file tree
Hide file tree
Showing 4 changed files with 232 additions and 3 deletions.
28 changes: 25 additions & 3 deletions tools-v2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ A tool for CurveFS & CurveBs.
- [create dir](#create-dir)
- [check](#check-1)
- [check copyset](#check-copyset-1)
- [snapshot](#snapshot)
- [snapshot copyset](#snapshot-copyset)
- [clean-recycle](#clean-recycle)
- [Comparison of old and new commands](#comparison-of-old-and-new-commands)
- [curve fs](#curve-fs)
- [curve bs](#curve-bs)
Expand Down Expand Up @@ -1269,6 +1272,26 @@ Output:
+------------+-----------+--------+--------+--------+---------+
```

### snapshot

#### snapshot copyset

take a snapshot for peer from the copyset

Usage:
```bash
curve bs snapshot copyset 127.0.0.0:8200:0 --logicalpoolid=1 --copysetid=1
```

Output:
```
+-----------------------+---------+---------+
| PEER | COPYSET | RESULT |
+-----------------------+---------+---------+
| ***.***.**.***:****:* | (**:**) | success |
+-----------------------+---------+---------+
```

## Comparison of old and new commands

### curve fs
Expand Down Expand Up @@ -1299,7 +1322,6 @@ Output:

### curve bs

<<<<<<< HEAD
| old | new |
| ------------------------------------ | ------------------------------ |
| curve_ops_tool logical-pool-list | curve bs list logical-pool |
Expand All @@ -1321,14 +1343,14 @@ Output:
| curve_ops_tool client-status | curve bs status client |
| curve_ops_tool check-operator | curve bs check operator |
| curve_ops_tool snapshot-clone-status | curve bs status snapshotserver |
| transfer-leader | curve bs update leader |
| curve_ops_tool transfer-leader | curve bs update leader |
| curve_ops_tool do-snapshot | curve bs snapshot copyset |
| curve_ops_tool status | |
| curve_ops_tool chunkserver-status | |
| curve_ops_tool copysets-status | |
| curve_ops_tool chunkserver-list | |
| curve_ops_tool clean-recycle | |
| curve_ops_tool check-consistency | |
| curve_ops_tool do-snapshot | |
| curve_ops_tool do-snapshot-all | |
| curve_ops_tool check-chunkserver | |
| curve_ops_tool check-server | |
Expand Down
2 changes: 2 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/bs.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/list"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/snapshot"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/status"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/update"
)
Expand All @@ -52,6 +53,7 @@ func (bsCmd *CurveBsCommand) AddSubCommands() {
update.NewUpdateCommand(),
clean_recycle.NewCleanRecycleCommand(),
check.NewCheckCommand(),
snapshot.NewSnapshotCommand(),
)
}

Expand Down
154 changes: 154 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/snapshot/copyset/copyset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/*
* 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-04-28
* Author: Xinlong-Chen
*/

package copyset

import (
"context"
"fmt"

"github.com/spf13/cobra"
"google.golang.org/grpc"

cmderror "github.com/opencurve/curve/tools-v2/internal/error"
cobrautil "github.com/opencurve/curve/tools-v2/internal/utils"
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/delete/peer"
"github.com/opencurve/curve/tools-v2/pkg/config"
"github.com/opencurve/curve/tools-v2/pkg/output"
"github.com/opencurve/curve/tools-v2/proto/proto/cli2"
)

const (
updateExample = `$ curve bs snapshot copyset 127.0.0.0:8200:0 --logicalpoolid=1 --copysetid=1`
)

type SnapshotRpc struct {
Info *basecmd.Rpc
Request *cli2.SnapshotRequest2
Client cli2.CliService2Client
}

func (sRpc *SnapshotRpc) NewRpcClient(cc grpc.ClientConnInterface) {
sRpc.Client = cli2.NewCliService2Client(cc)
}

func (sRpc *SnapshotRpc) Stub_Func(ctx context.Context) (interface{}, error) {
return sRpc.Client.Snapshot(ctx, sRpc.Request)
}

type SnapshotOneCommand struct {
basecmd.FinalCurveCmd

Rpc *SnapshotRpc
Response *cli2.SnapshotResponse2
row map[string]string
}

var _ basecmd.FinalCurveCmdFunc = (*SnapshotOneCommand)(nil) // check interface

// NewCommand ...
func NewSnapshotOneCommand() *cobra.Command {
peerCmd := &SnapshotOneCommand{
FinalCurveCmd: basecmd.FinalCurveCmd{
Use: "copyset",
Short: "take a snapshot for peer from the copyset",
Example: updateExample,
},
}
basecmd.NewFinalCurveCli(&peerCmd.FinalCurveCmd, peerCmd)
return peerCmd.Cmd
}

func (sCmd *SnapshotOneCommand) AddFlags() {
config.AddRpcRetryTimesFlag(sCmd.Cmd)
config.AddRpcTimeoutFlag(sCmd.Cmd)

config.AddBSLogicalPoolIdRequiredFlag(sCmd.Cmd)
config.AddBSCopysetIdRequiredFlag(sCmd.Cmd)
}

func (sCmd *SnapshotOneCommand) Init(cmd *cobra.Command, args []string) error {
sCmd.SetHeader([]string{cobrautil.ROW_PEER, cobrautil.ROW_COPYSET, cobrautil.ROW_RESULT})
sCmd.TableNew.SetAutoMergeCellsByColumnIndex(cobrautil.GetIndexSlice(
sCmd.Header, []string{},
))

opts := peer.Options{}

opts.Timeout = config.GetFlagDuration(sCmd.Cmd, config.RPCTIMEOUT)
opts.RetryTimes = config.GetFlagInt32(sCmd.Cmd, config.RPCRETRYTIMES)

copysetID := config.GetBsFlagUint32(sCmd.Cmd, config.CURVEBS_COPYSET_ID)

logicalPoolID := config.GetBsFlagUint32(sCmd.Cmd, config.CURVEBS_LOGIC_POOL_ID)

// parse peer conf
if len(args) < 1 {
pErr := cmderror.ErrGetPeer()
pErr.Format("should specified the peer address")
return pErr.ToError()
}
snapshotPeer, err := peer.ParsePeer(args[0])
if err != nil {
return err.ToError()
}

out := make(map[string]string)
out[cobrautil.ROW_PEER] = fmt.Sprintf("%s:%d", snapshotPeer.GetAddress(), snapshotPeer.GetId())
out[cobrautil.ROW_COPYSET] = fmt.Sprintf("(%d:%d)", logicalPoolID, copysetID)
sCmd.row = out

sCmd.Rpc = &SnapshotRpc{
Info: basecmd.NewRpc([]string{snapshotPeer.GetAddress()}, opts.Timeout, opts.RetryTimes, "Snapshot"),
Request: &cli2.SnapshotRequest2{
LogicPoolId: &logicalPoolID,
CopysetId: &copysetID,
Peer: snapshotPeer,
},
}

return nil
}

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

func (sCmd *SnapshotOneCommand) RunCommand(cmd *cobra.Command, args []string) error {
response, err := basecmd.GetRpcResponse(sCmd.Rpc.Info, sCmd.Rpc)
sCmd.Error = err
if err.TypeCode() != cmderror.CODE_SUCCESS {
return err.ToError()
}

sCmd.row[cobrautil.ROW_RESULT] = "success"
sCmd.Response = response.(*cli2.SnapshotResponse2)

list := cobrautil.Map2List(sCmd.row, sCmd.Header)
sCmd.TableNew.Append(list)
return nil
}

func (sCmd *SnapshotOneCommand) ResultPlainOutput() error {
return output.FinalCmdOutputPlain(&sCmd.FinalCurveCmd)
}
51 changes: 51 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/snapshot/snapshot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* 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-04-28
* Author: Xinlong-Chen
*/

package snapshot

import (
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/snapshot/copyset"
"github.com/spf13/cobra"
)

type SnapshotCommand struct {
basecmd.MidCurveCmd
}

var _ basecmd.MidCurveCmdFunc = (*SnapshotCommand)(nil) // check interface

func (statusCmd *SnapshotCommand) AddSubCommands() {
statusCmd.Cmd.AddCommand(
copyset.NewSnapshotOneCommand(),
)
}

func NewSnapshotCommand() *cobra.Command {
statusCmd := &SnapshotCommand{
basecmd.MidCurveCmd{
Use: "snapshot",
Short: "take a snapshot for peer",
},
}
return basecmd.NewMidCurveCli(&statusCmd.MidCurveCmd, statusCmd)
}

0 comments on commit 2bb9918

Please sign in to comment.