Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bs target #2976

Merged
merged 1 commit into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions tools-v2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ A tool for CurveFS & CurveBs.
- [stop snapshot](#stop-snapshot)
- [recover](#recover)
- [recover volume](#recover-volume)
- [export](#export)
- [export target](#export-target)
- [Comparison of old and new commands](#comparison-of-old-and-new-commands)
- [curve fs](#curve-fs)
- [curve bs](#curve-bs)
Expand Down Expand Up @@ -2038,6 +2040,72 @@ Output:
| 0171a33b-17b7-4215-9f00-6d8de2686f77 | testsnap1 | success |
+--------------------------------------+--------------+---------+
```
#### export

##### export target

export services and clients in the bs cluster

Usage:

Copy link
Contributor

@caoxianfei1 caoxianfei1 Dec 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add specific commands.
curve export or curve export target or curve bs export target?

Copy link
Contributor Author

@wsehjk wsehjk Dec 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My mistake. I have fixed it

```shell
curve bs export target
```

Output:

```shell
[
{
"label": {
"job": "etcd"
},
"targets": [
"172.21.0.13:23790",
"172.21.0.13:23791",
"172.21.0.13:23792"
]
},
{
"label": {
"job": "mds"
},
"targets": [
"172.21.0.13:6700",
"172.21.0.13:6701",
"172.21.0.13:6702"
]
},
{
"label": {
"job": "chunkserver"
},
"targets": [
"172.21.0.13:8200",
"172.21.0.13:8202",
"172.21.0.13:8201"
]
},
{
"label": {
"job": "snapshotcloneserver"
},
"targets": [
"172.21.0.13:5550",
"172.21.0.13:5551",
"172.21.0.13:5552"
]
},
{
"label": {
"job": "client"
},
"targets": [
"172.21.0.13:9000"
]
}
]
```

#### recover

Expand Down
7 changes: 7 additions & 0 deletions tools-v2/internal/error/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,13 @@ var (
ErrBsRecoverFile = func() *CmdError {
return NewInternalCmdError(81, "recover file fail, err: %s")
}
ErrTargetCluster = func() *CmdError {
return NewInternalCmdError(82, "get cluster target error: %s")
}
ErrTargetClient = func() *CmdError {
return NewInternalCmdError(83, "get client target error: %s")
}

// http error
ErrHttpUnreadableResult = func() *CmdError {
return NewHttpResultCmdError(1, "http response is unreadable, the uri is: %s, the error is: %s")
Expand Down
35 changes: 35 additions & 0 deletions tools-v2/internal/utils/target.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright (c) 2022 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-12-26
* Author: wsehjk
*/
package cobrautil
const (
LabelKey = "label"
ClientTarget = "client"
EtcdTarget = "etcd"
MdsTarget = "mds"
ChunkServerTarget = "chunkserver"
SnapshotTarget = "snapshot"
SnapshotServerTarget = "snapshotcloneserver"
TargetKey = "targets"
JobKey = "job"
OutputFile = "target.json"
TargetPathFlag = "path"
)
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 @@ -36,6 +36,7 @@ import (
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/status"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/stop"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/update"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/export"
)

type CurveBsCommand struct {
Expand All @@ -56,6 +57,7 @@ func (bsCmd *CurveBsCommand) AddSubCommands() {
check.NewCheckCommand(),
snapshot.NewSnapshotCommand(),
stop.NewStopCommand(),
export.NewExportCommand(),
)
}

Expand Down
48 changes: 48 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/export/export.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* 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-12-11
* Author: wsehjk
*/

package export

import (
basecmd "github.com/opencurve/curve/tools-v2/pkg/cli/command"
target "github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/export/target"
"github.com/spf13/cobra"
)
type ExportCommand struct {
basecmd.MidCurveCmd
}

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

func (eCmd *ExportCommand) AddSubCommands() {
eCmd.Cmd.AddCommand(
target.NewTargetCommand(),
)
}
func NewExportCommand() *cobra.Command{
eCmd := &ExportCommand {
basecmd.MidCurveCmd{
Use: "export",
Short: "export the target in curvebs",
},
}
return basecmd.NewMidCurveCli(&eCmd.MidCurveCmd, eCmd)
}
137 changes: 137 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/export/target/target.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* 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-12-11
* Author: wsehjk
*/

package target

import (
"encoding/json"
"fmt"
"os"

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/status/client"
"github.com/opencurve/curve/tools-v2/pkg/cli/command/curvebs/status/cluster"
"github.com/opencurve/curve/tools-v2/pkg/output"
"github.com/spf13/cobra"
)

const (
targetExample = "$curve bs export target"
)
type ResultStruct map[string]interface{}
type targetcommand struct {
basecmd.FinalCurveCmd
}
// check interface targetcommand implement FinalCurveCmdFunc
var _ basecmd.FinalCurveCmdFunc = (*targetcommand)(nil)

func ExtractClusterResult(clusterResult map[string]interface{}, service string) ResultStruct{
result := ResultStruct{}
arrs := clusterResult[service].([]map[string]string)
result[cobrautil.LabelKey] = map[string]string{
cobrautil.JobKey : service,
}
if service == cobrautil.SnapshotTarget {
result[cobrautil.LabelKey] = map[string]string{
cobrautil.JobKey : cobrautil.SnapshotServerTarget,
}
}
result[cobrautil.TargetKey] = make([]string, 0)
for _, arr := range arrs {
if addr, ok := arr["addr"]; ok { // see the output of curve bs status cluster
result[cobrautil.TargetKey] = append(result[cobrautil.TargetKey].([]string), addr)
}
if addr, ok := arr["internalAddr"]; ok {
result[cobrautil.TargetKey] = append(result[cobrautil.TargetKey].([]string), addr)
}
}
return result
}
func NewTargetCommand() (cmd *cobra.Command) {
tCmd := &targetcommand{
FinalCurveCmd: basecmd.FinalCurveCmd {
Use: "target",
Short: "export all the target in cluster and used by monitor",
Example: targetExample,
},
}
return basecmd.NewFinalCurveCli(&tCmd.FinalCurveCmd, tCmd)
}

func (tCmd *targetcommand)Init(cmd *cobra.Command, args []string) error {
return nil
}
func (tCmd *targetcommand)RunCommand(cmd *cobra.Command, args []string) error {
// get cluster target
clusterResult, err := cluster.GetClusterStatus()
if err != nil {
retErr := cmderror.ErrTargetCluster()
retErr.Format(err.Error())
return retErr.ToError()
}
tCmd.Result = []ResultStruct{}
tCmd.Result = append(tCmd.Result.([]ResultStruct), ExtractClusterResult(clusterResult.(map[string]interface{}), cobrautil.EtcdTarget))
tCmd.Result = append(tCmd.Result.([]ResultStruct), ExtractClusterResult(clusterResult.(map[string]interface{}), cobrautil.MdsTarget))
tCmd.Result = append(tCmd.Result.([]ResultStruct), ExtractClusterResult(clusterResult.(map[string]interface{}), cobrautil.ChunkServerTarget))
tCmd.Result = append(tCmd.Result.([]ResultStruct), ExtractClusterResult(clusterResult.(map[string]interface{}), cobrautil.SnapshotTarget))

// get client target
clientResult, err := client.GetClientStatus()
if err != nil {
retErr := cmderror.ErrTargetClient()
retErr.Format(err.Error())
return retErr.ToError()
}
clientStruct := ResultStruct{}
clientStruct[cobrautil.LabelKey] = map[string]string{
cobrautil.JobKey : cobrautil.ClientTarget,
}
clientStruct[cobrautil.TargetKey] = make([]string, 0)
for _, result := range clientResult.([]map[string]string) {
clientStruct[cobrautil.TargetKey] = append(clientStruct[cobrautil.TargetKey].([]string), result["addr"])
}
tCmd.Result = append(tCmd.Result.([]ResultStruct), clientStruct)
return nil
}

func (tCmd *targetcommand)Print(cmd *cobra.Command, args []string) error {
output, err := json.MarshalIndent(tCmd.Result, "", " ")
if err != nil {
return err
}
path := tCmd.Cmd.Flag(cobrautil.TargetPathFlag).Value.String()
if err = os.WriteFile(path + "/" + cobrautil.OutputFile, output, 0666); err != nil {
return err
}
fmt.Println(string(output))
return nil
}
// result in plain format string
func (tCmd *targetcommand)ResultPlainOutput() error {
return output.FinalCmdOutputPlain(&tCmd.FinalCurveCmd)
}

// target final command has no flag
func (tCmd *targetcommand)AddFlags() {
tCmd.Cmd.Flags().String(cobrautil.TargetPathFlag, ".", "specify the path of target.json")
}
11 changes: 11 additions & 0 deletions tools-v2/pkg/cli/command/curvebs/status/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ package client
import (
"strconv"
"strings"
"fmt"

cmderror "github.com/opencurve/curve/tools-v2/internal/error"
cobrautil "github.com/opencurve/curve/tools-v2/internal/utils"
Expand Down Expand Up @@ -238,3 +239,13 @@ func NewStatusClientCommand() *ClientCommand {
basecmd.NewFinalCurveCli(&clientCmd.FinalCurveCmd, clientCmd)
return clientCmd
}

func GetClientStatus() (interface{}, error){
clientCommand := NewStatusClientCommand()
clientCommand.Cmd.SetArgs([]string{
fmt.Sprintf("--%s", config.FORMAT), config.FORMAT_NOOUT,})
clientCommand.Cmd.SilenceErrors = true
err := clientCommand.Cmd.Execute()

return clientCommand.Result, err
}
16 changes: 15 additions & 1 deletion tools-v2/pkg/cli/command/curvebs/status/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ const (
)

func NewClusterCommand() *cobra.Command {
return NewStatusClusterCommand().Cmd
}

func NewStatusClusterCommand() *ClusterCommand {
cCmd := &ClusterCommand{
FinalCurveCmd: basecmd.FinalCurveCmd{
Use: "cluster",
Expand All @@ -75,7 +79,7 @@ func NewClusterCommand() *cobra.Command {
},
}
basecmd.NewFinalCurveCli(&cCmd.FinalCurveCmd, cCmd)
return cCmd.Cmd
return cCmd
}

func (cCmd *ClusterCommand) AddFlags() {
Expand Down Expand Up @@ -245,3 +249,13 @@ func (cCmd *ClusterCommand) buildTableCopyset(results []map[string]string) {
row = append(row, results[0][cobrautil.ROW_UNHEALTHY_RATIO])
cCmd.tableCopyset.Append(row)
}

func GetClusterStatus() (interface{}, error){
clusterCommand := NewStatusClusterCommand()
// cluster command no output
clusterCommand.Cmd.SetArgs([]string{
fmt.Sprintf("--%s", config.FORMAT), config.FORMAT_NOOUT,})
clusterCommand.Cmd.SilenceErrors = true
err := clusterCommand.Cmd.Execute()
return clusterCommand.Result, err
}