Skip to content

Commit ce0a756

Browse files
committed
feat(tool):add curve bs query snapshot
Signed-off-by: ZackSoul <2269713951@qq.com>
1 parent 35846be commit ce0a756

File tree

6 files changed

+259
-35
lines changed

6 files changed

+259
-35
lines changed

tools-v2/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ A tool for CurveFS & CurveBs.
6565
- [query segment](#query-segment)
6666
- [query scan-status](#query-scan-status)
6767
- [query volume clone-recover](#query-volume-clone-recover)
68+
- [query snapshot](#query-snapshot)
6869
- [status](#status-1)
6970
- [status etcd](#status-etcd-1)
7071
- [status mds](#status-mds-1)
@@ -1484,6 +1485,27 @@ Output:
14841485
+------+--------------------------------------+--------------------------------------+----------+-------+----------+--------+----------+--------+----------+---------------------+
14851486
```
14861487

1488+
##### query snapshot
1489+
1490+
query snapshot in curvebs
1491+
1492+
Usage:
1493+
1494+
```shell
1495+
curve bs query snapshot --path /test/test111 --snapshotstatus done
1496+
(other status: "in-progess" "deleting" "errorDeleteing" "canceling" "error")
1497+
```
1498+
1499+
Output:
1500+
1501+
```shell
1502+
+--------------------------------------+--------------+------+--------+----------------+-------------+----------+---------------------+---------------+
1503+
| SNAPSHOTID | SNAPSHOTNAME | USER | STATUS | SNAPSHOTSEQNUM | FILELENGTH | PROGRESS | CREATETIME | FILE |
1504+
+--------------------------------------+--------------+------+--------+----------------+-------------+----------+---------------------+---------------+
1505+
| 01a18978-cc3b-4762-a14d-38547511b526 | testsnap1 | root | 0 | 1 | 10737418240 | 100 | 2023-12-04 18:53:55 | /test/test111 |
1506+
+--------------------------------------+--------------+------+--------+----------------+-------------+----------+---------------------+---------------+
1507+
```
1508+
14871509
#### status
14881510

14891511
##### status etcd

tools-v2/internal/utils/snapshot/const.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,7 @@ const (
5555
ResultSuccess = "0"
5656
Limit = "100"
5757
Offset = "0"
58+
59+
ErrSnaphshot = "5"
60+
DefaultSnapID = "*"
5861
)

tools-v2/pkg/cli/command/curvebs/list/snapshot/snapshot.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package snapshot
22

33
import (
44
"encoding/json"
5-
"fmt"
6-
snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot"
75
"strconv"
86
"time"
97

8+
snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot"
9+
1010
cmderror "github.com/opencurve/curve/tools-v2/internal/error"
1111
cobrautil "github.com/opencurve/curve/tools-v2/internal/utils"
1212
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
@@ -105,18 +105,22 @@ func (sCmd *SnapShotCommand) RunCommand(cmd *cobra.Command, args []string) error
105105
return sCmd.Error.ToError()
106106
}
107107
rows := make([]map[string]string, 0)
108-
for _, item := range snapshotsInfo {
109-
row := make(map[string]string)
110-
row[cobrautil.ROW_SNAPSHOT_ID] = item.UUID
111-
row[cobrautil.ROW_SNAPSHOT_NAME] = item.Name
112-
row[cobrautil.ROW_USER] = item.User
113-
row[cobrautil.ROW_FILE] = item.File
114-
row[cobrautil.ROW_STATUS] = fmt.Sprintf("%d", item.Status)
115-
row[cobrautil.ROW_SNAPSHOT_SEQNUM] = fmt.Sprintf("%d", item.SeqNum)
116-
row[cobrautil.ROW_FILE_LENGTH] = fmt.Sprintf("%d", item.FileLength)
117-
row[cobrautil.ROW_PROGRESS] = fmt.Sprintf("%d", item.Progress)
118-
row[cobrautil.ROW_CREATE_TIME] = time.Unix(int64(item.Time/1000000), 0).Format("2006-01-02 15:04:05")
119-
rows = append(rows, row)
108+
if len(snapshotsInfo) == 0 {
109+
rows = append(rows, EmptyOutput())
110+
} else {
111+
for _, item := range snapshotsInfo {
112+
row := make(map[string]string)
113+
row[cobrautil.ROW_SNAPSHOT_ID] = item.UUID
114+
row[cobrautil.ROW_SNAPSHOT_NAME] = item.Name
115+
row[cobrautil.ROW_USER] = item.User
116+
row[cobrautil.ROW_FILE] = item.File
117+
row[cobrautil.ROW_STATUS] = strconv.Itoa(item.Status)
118+
row[cobrautil.ROW_SNAPSHOT_SEQNUM] = strconv.Itoa(item.SeqNum)
119+
row[cobrautil.ROW_FILE_LENGTH] = strconv.Itoa(item.FileLength)
120+
row[cobrautil.ROW_PROGRESS] = strconv.FormatFloat(item.Progress, 'f', 2, 64)
121+
row[cobrautil.ROW_CREATE_TIME] = time.Unix(int64(item.Time/1000000), 0).Format("2006-01-02 15:04:05")
122+
rows = append(rows, row)
123+
}
120124
}
121125
list := cobrautil.ListMap2ListSortByKeys(rows, sCmd.Header, []string{cobrautil.ROW_FILE, cobrautil.ROW_SNAPSHOT_NAME, cobrautil.ROW_SNAPSHOT_ID})
122126
sCmd.TableNew.AppendBulk(list)
@@ -161,3 +165,23 @@ func ListSnapShot(addrs []string, timeout time.Duration, params map[string]any)
161165
params[snapshotutil.QueryOffset] = strconv.Itoa(offsetValue + limitValue)
162166
}
163167
}
168+
169+
func EmptyOutput() map[string]string {
170+
emptyResult := "-"
171+
keys := []string{
172+
cobrautil.ROW_SNAPSHOT_ID,
173+
cobrautil.ROW_SNAPSHOT_NAME,
174+
cobrautil.ROW_USER,
175+
cobrautil.ROW_FILE,
176+
cobrautil.ROW_STATUS,
177+
cobrautil.ROW_SNAPSHOT_SEQNUM,
178+
cobrautil.ROW_FILE_LENGTH,
179+
cobrautil.ROW_PROGRESS,
180+
cobrautil.ROW_CREATE_TIME,
181+
}
182+
row := make(map[string]string)
183+
for _, key := range keys {
184+
row[key] = emptyResult
185+
}
186+
return row
187+
}

tools-v2/pkg/cli/command/curvebs/query/query.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/file"
2929
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/scanstatus"
3030
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/seginfo"
31+
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/snapshot"
3132
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/query/volume"
3233
"github.com/spf13/cobra"
3334
)
@@ -45,6 +46,7 @@ func (queryCmd *QueryCommand) AddSubCommands() {
4546
chunk.NewChunkCommand(),
4647
scanstatus.NewScanStatusCommand(),
4748
volume.NewVolumeCommand(),
49+
snapshot.NewSnapshotCommand(),
4850
)
4951
}
5052

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*
2+
* Copyright (c) 2022 NetEase Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
/*
18+
* Project: CurveCli
19+
* Created Date: 2023-12-04
20+
* Author: ZackSoul
21+
*/
22+
package snapshot
23+
24+
import (
25+
"strconv"
26+
"time"
27+
28+
cmderror "github.com/opencurve/curve/tools-v2/internal/error"
29+
cobrautil "github.com/opencurve/curve/tools-v2/internal/utils"
30+
snapshotutil "github.com/opencurve/curve/tools-v2/internal/utils/snapshot"
31+
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
32+
listSnapshot "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/list/snapshot"
33+
"github.com/opencurve/curve/tools-v2/pkg/config"
34+
"github.com/opencurve/curve/tools-v2/pkg/output"
35+
"github.com/spf13/cobra"
36+
)
37+
38+
const (
39+
snapshotExample = `$ curve bs query snapshot --path /test/test111 --snapshotstatus done
40+
(other status: "in-progress" "deleting" "errorDeleteing" "canceling" "error")`
41+
)
42+
43+
type SnapShotCommand struct {
44+
basecmd.FinalCurveCmd
45+
snapshotAddrs []string
46+
timeout time.Duration
47+
48+
user string
49+
file string
50+
uuid string
51+
status string
52+
}
53+
54+
var _ basecmd.FinalCurveCmdFunc = (*SnapShotCommand)(nil)
55+
56+
func NewQuerySnapshotCommand() *SnapShotCommand {
57+
sCmd := &SnapShotCommand{
58+
FinalCurveCmd: basecmd.FinalCurveCmd{
59+
Use: "snapshot",
60+
Short: "query snapshot in curve bs",
61+
Example: snapshotExample,
62+
},
63+
}
64+
65+
basecmd.NewFinalCurveCli(&sCmd.FinalCurveCmd, sCmd)
66+
return sCmd
67+
}
68+
69+
func NewSnapshotCommand() *cobra.Command {
70+
return NewQuerySnapshotCommand().Cmd
71+
}
72+
73+
func (sCmd *SnapShotCommand) AddFlags() {
74+
config.AddBsSnapshotCloneFlagOption(sCmd.Cmd)
75+
config.AddHttpTimeoutFlag(sCmd.Cmd)
76+
config.AddBsUserOptionFlag(sCmd.Cmd)
77+
config.AddBsSnapshotIDOptionFlag(sCmd.Cmd)
78+
config.AddBsPathOptionFlag(sCmd.Cmd)
79+
config.AddSnapshotStatusOptionalFlag(sCmd.Cmd)
80+
}
81+
82+
func (sCmd *SnapShotCommand) Init(cmd *cobra.Command, args []string) error {
83+
snapshotAddrs, err := config.GetBsSnapshotAddrSlice(sCmd.Cmd)
84+
if err.TypeCode() != cmderror.CODE_SUCCESS {
85+
sCmd.Error = err
86+
return err.ToError()
87+
}
88+
sCmd.snapshotAddrs = snapshotAddrs
89+
sCmd.timeout = config.GetFlagDuration(sCmd.Cmd, config.HTTPTIMEOUT)
90+
sCmd.user = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_USER)
91+
sCmd.file = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_PATH)
92+
sCmd.uuid = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_SNAPSHOT_ID)
93+
sCmd.status = config.GetBsFlagString(sCmd.Cmd, config.CURVEBS_SNAPSHOT_STATUS)
94+
header := []string{
95+
cobrautil.ROW_SNAPSHOT_ID,
96+
cobrautil.ROW_SNAPSHOT_NAME,
97+
cobrautil.ROW_USER,
98+
cobrautil.ROW_STATUS,
99+
cobrautil.ROW_SNAPSHOT_SEQNUM,
100+
cobrautil.ROW_FILE_LENGTH,
101+
cobrautil.ROW_PROGRESS,
102+
cobrautil.ROW_CREATE_TIME,
103+
cobrautil.ROW_FILE,
104+
}
105+
sCmd.SetHeader(header)
106+
sCmd.TableNew.SetAutoMergeCellsByColumnIndex(cobrautil.GetIndexSlice(
107+
sCmd.Header, []string{cobrautil.ROW_FILE},
108+
))
109+
return nil
110+
}
111+
112+
func (sCmd *SnapShotCommand) Print(cmd *cobra.Command, args []string) error {
113+
return output.FinalCmdOutput(&sCmd.FinalCurveCmd, sCmd)
114+
}
115+
116+
func (sCmd *SnapShotCommand) RunCommand(cmd *cobra.Command, args []string) error {
117+
params := map[string]any{
118+
snapshotutil.QueryAction: snapshotutil.ActionGetFileSnapshotList,
119+
snapshotutil.QueryVersion: snapshotutil.Version,
120+
snapshotutil.QueryUser: sCmd.user,
121+
snapshotutil.QueryFile: sCmd.file,
122+
snapshotutil.QueryLimit: snapshotutil.Limit,
123+
snapshotutil.QueryOffset: snapshotutil.Offset,
124+
}
125+
if sCmd.uuid != snapshotutil.DefaultSnapID {
126+
params[snapshotutil.QueryUUID] = sCmd.uuid
127+
}
128+
for i, status := range snapshotutil.SnapshotStatus {
129+
if status == sCmd.status {
130+
params[snapshotutil.QueryStatus] = i
131+
}
132+
}
133+
snapshotsInfo, err := listSnapshot.ListSnapShot(sCmd.snapshotAddrs, sCmd.timeout, params)
134+
if err != nil {
135+
sCmd.Error = err
136+
return sCmd.Error.ToError()
137+
}
138+
rows := make([]map[string]string, 0)
139+
if len(snapshotsInfo) == 0 {
140+
rows = append(rows, listSnapshot.EmptyOutput())
141+
}
142+
for _, item := range snapshotsInfo {
143+
row := make(map[string]string)
144+
row[cobrautil.ROW_SNAPSHOT_ID] = item.UUID
145+
row[cobrautil.ROW_SNAPSHOT_NAME] = item.Name
146+
row[cobrautil.ROW_USER] = item.User
147+
row[cobrautil.ROW_FILE] = item.File
148+
row[cobrautil.ROW_STATUS] = strconv.Itoa(item.Status)
149+
row[cobrautil.ROW_SNAPSHOT_SEQNUM] = strconv.Itoa(item.SeqNum)
150+
row[cobrautil.ROW_FILE_LENGTH] = strconv.Itoa(item.FileLength)
151+
row[cobrautil.ROW_PROGRESS] = strconv.FormatFloat(item.Progress, 'f', 2, 64)
152+
row[cobrautil.ROW_CREATE_TIME] = time.Unix(int64(item.Time/1000000), 0).Format("2006-01-02 15:04:05")
153+
rows = append(rows, row)
154+
}
155+
list := cobrautil.ListMap2ListSortByKeys(rows, sCmd.Header, []string{cobrautil.ROW_SNAPSHOT_NAME, cobrautil.ROW_SNAPSHOT_ID})
156+
sCmd.TableNew.AppendBulk(list)
157+
sCmd.Result = rows
158+
sCmd.Error = cmderror.Success()
159+
return nil
160+
}
161+
162+
func (sCmd *SnapShotCommand) ResultPlainOutput() error {
163+
return output.FinalCmdOutputPlain(&sCmd.FinalCurveCmd)
164+
}

tools-v2/pkg/config/bs.go

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ const (
147147
CURVEBS_DEFAULT_SNAPSHOT_ID = "*"
148148
CURVEBS_FAILED = "failed"
149149
VIPER_CURVEBS_FAILED = "curvebs.failed"
150+
CURVEBS_SNAPSHOT_STATUS = "snapshotstatus"
151+
VIPER_CURVEBS_SNAPSHOT_STATUS = "curvebs.snapshotstatus"
152+
CURVEBS_DEFAULT_SNAPSHOT_STATUS = "done"
150153
CURVEBS_CHUNK_SIZE = "chunksize"
151154
VIPER_CURVEBS_CHUNK_SIZE = "curvebs.chunksize"
152155
CURVEBS_CHECK_HASH = "checkhash"
@@ -215,31 +218,33 @@ var (
215218
CURVEBS_CHECK_HASH: VIPER_CURVEBS_CHECK_HASH,
216219
CURVEBS_FILENAME: VIPER_CURVEBS_FILENAME,
217220
CURVEBS_SNAPSHOTNAME: VIPER_CURVEBS_SNAPSHOTNAME,
221+
CURVEBS_SNAPSHOT_STATUS: VIPER_CURVEBS_SNAPSHOT_STATUS,
218222
}
219223

220224
BSFLAG2DEFAULT = map[string]interface{}{
221225
// bs
222-
CURVEBS_USER: CURVEBS_DEFAULT_USER,
223-
CURVEBS_PASSWORD: CURVEBS_DEFAULT_PASSWORD,
224-
CURVEBS_SIZE: CURVEBS_DEFAULT_SIZE,
225-
CURVEBS_STRIPE_UNIT: CURVEBS_DEFAULT_STRIPE_UNIT,
226-
CURVEBS_STRIPE_COUNT: CURVEBS_DEFAULT_STRIPE_COUNT,
227-
CURVEBS_BURST: CURVEBS_DEFAULT_BURST,
228-
CURVEBS_BURST_LENGTH: CURVEBS_DEFAULT_BURST_LENGTH,
229-
CURVEBS_PATH: CURVEBS_DEFAULT_PATH,
230-
CURVEBS_FORCE: CURVEBS_DEFAULT_FORCE,
231-
CURVEBS_MARGIN: CURVEBS_DEFAULT_MARGIN,
232-
CURVEBS_OP: CURVEBS_DEFAULT_OP,
233-
CURVEBS_CHECK_TIME: CURVEBS_DEFAULT_CHECK_TIME,
234-
CURVEBS_SCAN: CURVEBS_DEFAULT_SCAN,
235-
CURVEBS_CHUNKSERVER_ID: CURVEBS_DEFAULT_CHUNKSERVER_ID,
236-
CURVEBS_DRYRUN: CURVEBS_DEFAULT_DRYRUN,
237-
CURVEBS_FIlTER: CURVEBS_DEFAULT_FILTER,
238-
CURVEBS_ALL: CURVEBS_DEFAULT_ALL,
239-
CURVEBS_LOGIC_POOL_ID: CURVEBS_DEFAULT_LOGIC_POOL_ID,
240-
CURVEBS_COPYSET_ID: CURVEBS_DEFAULT_COPYSET_ID,
241-
CURVEBS_CHECK_HASH: CURVEBS_DEFAULT_CHECK_HASH,
242-
CURVEBS_SNAPSHOT_ID: CURVEBS_DEFAULT_SNAPSHOT_ID,
226+
CURVEBS_USER: CURVEBS_DEFAULT_USER,
227+
CURVEBS_PASSWORD: CURVEBS_DEFAULT_PASSWORD,
228+
CURVEBS_SIZE: CURVEBS_DEFAULT_SIZE,
229+
CURVEBS_STRIPE_UNIT: CURVEBS_DEFAULT_STRIPE_UNIT,
230+
CURVEBS_STRIPE_COUNT: CURVEBS_DEFAULT_STRIPE_COUNT,
231+
CURVEBS_BURST: CURVEBS_DEFAULT_BURST,
232+
CURVEBS_BURST_LENGTH: CURVEBS_DEFAULT_BURST_LENGTH,
233+
CURVEBS_PATH: CURVEBS_DEFAULT_PATH,
234+
CURVEBS_FORCE: CURVEBS_DEFAULT_FORCE,
235+
CURVEBS_MARGIN: CURVEBS_DEFAULT_MARGIN,
236+
CURVEBS_OP: CURVEBS_DEFAULT_OP,
237+
CURVEBS_CHECK_TIME: CURVEBS_DEFAULT_CHECK_TIME,
238+
CURVEBS_SCAN: CURVEBS_DEFAULT_SCAN,
239+
CURVEBS_CHUNKSERVER_ID: CURVEBS_DEFAULT_CHUNKSERVER_ID,
240+
CURVEBS_DRYRUN: CURVEBS_DEFAULT_DRYRUN,
241+
CURVEBS_FIlTER: CURVEBS_DEFAULT_FILTER,
242+
CURVEBS_ALL: CURVEBS_DEFAULT_ALL,
243+
CURVEBS_LOGIC_POOL_ID: CURVEBS_DEFAULT_LOGIC_POOL_ID,
244+
CURVEBS_COPYSET_ID: CURVEBS_DEFAULT_COPYSET_ID,
245+
CURVEBS_CHECK_HASH: CURVEBS_DEFAULT_CHECK_HASH,
246+
CURVEBS_SNAPSHOT_ID: CURVEBS_DEFAULT_SNAPSHOT_ID,
247+
CURVEBS_SNAPSHOT_STATUS: CURVEBS_DEFAULT_SNAPSHOT_STATUS,
243248
}
244249
)
245250

@@ -681,6 +686,10 @@ func AddBsSnapshotIDOptionFlag(cmd *cobra.Command) {
681686
AddBsStringOptionFlag(cmd, CURVEBS_SNAPSHOT_ID, "snapshot seqId")
682687
}
683688

689+
func AddSnapshotStatusOptionalFlag(cmd *cobra.Command) {
690+
AddBsStringOptionFlag(cmd, CURVEBS_SNAPSHOT_STATUS, "snapshot status")
691+
}
692+
684693
func AddBsTaskTypeOptionFlag(cmd *cobra.Command) {
685694
AddBsStringOptionFlag(cmd, CURVEBS_TYPE, "only query target type (clone or recover)")
686695
}

0 commit comments

Comments
 (0)