Skip to content

Commit

Permalink
add export cmd for export the yaml that tools-v2 used
Browse files Browse the repository at this point in the history
  • Loading branch information
youarefree123 committed Dec 9, 2023
1 parent e362387 commit a58f65a
Show file tree
Hide file tree
Showing 10 changed files with 202 additions and 11 deletions.
1 change: 1 addition & 0 deletions cli/command/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ func addSubCommands(cmd *cobra.Command, curveadm *cli.CurveAdm) {
NewStopCommand(curveadm), // curveadm stop
NewSupportCommand(curveadm), // curveadm support
NewUpgradeCommand(curveadm), // curveadm upgrade
NewExportCommand(curveadm), // curveadm export
// commonly used shorthands
hosts.NewSSHCommand(curveadm), // curveadm ssh
hosts.NewPlaybookCommand(curveadm), // curveadm playbook
Expand Down
122 changes: 122 additions & 0 deletions cli/command/export.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
* 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: CurveAdm
* Created Date: 2023-11-9
* Author: Jiang Jun (youarefree123)
*/

// __SIGN_BY_YOUAREFREE123__

package command

import (
"path"
"strings"

"github.com/fatih/color"
"github.com/opencurve/curveadm/cli/cli"
comm "github.com/opencurve/curveadm/internal/common"
"github.com/opencurve/curveadm/internal/configure/topology"
"github.com/opencurve/curveadm/internal/errno"
"github.com/opencurve/curveadm/internal/playbook"
cliutil "github.com/opencurve/curveadm/internal/utils"
"github.com/spf13/cobra"
)

var (
GET_EXPORT_PLAYBOOK_STEPS = []int{
playbook.EXPORT_TOOLSV2_CONF,
}
)

type exportOptions struct {
output string
}

func checkExportOptions(curveadm *cli.CurveAdm, options exportOptions) error {
if !strings.HasPrefix(options.output, "/") {
return errno.ERR_EXPORT_TOOLSV2_CONF_REQUIRE_ABSOLUTE_PATH.
F("/path/to/curve.yaml: %s", options.output)
}
return nil
}

func NewExportCommand(curveadm *cli.CurveAdm) *cobra.Command {
var options exportOptions

cmd := &cobra.Command{
Use: "export [OPTIONS]",
Short: "Export curve.yaml",
Args: cliutil.NoArgs,
PreRunE: func(cmd *cobra.Command, args []string) error {
return checkExportOptions(curveadm, options)
},
RunE: func(cmd *cobra.Command, args []string) error {
return runExport(curveadm, options)
},
DisableFlagsInUseLine: true,
}

flags := cmd.Flags()
flags.StringVarP(&options.output, "path", "p", path.Join(curveadm.PluginDir(), "curve.yaml"), "Path where the exported YAML is stored")
return cmd
}

func genExportPlaybook(curveadm *cli.CurveAdm,
dcs []*topology.DeployConfig,
options exportOptions) (*playbook.Playbook, error) {

steps := GET_EXPORT_PLAYBOOK_STEPS
pb := playbook.NewPlaybook(curveadm)
for _, step := range steps {
pb.AddStep(&playbook.PlaybookStep{
Type: step,
Configs: dcs[:1],
Options: map[string]interface{}{
comm.KEY_TOOLSV2_CONF_PATH: options.output,
},
})
}

return pb, nil
}

func runExport(curveadm *cli.CurveAdm, options exportOptions) error {
// 1) parse cluster topology
dcs, err := curveadm.ParseTopology()
if err != nil {
return err
}

// 2) generate get export playbook
pb, err := genExportPlaybook(curveadm, dcs, options)
if err != nil {
return err
}

// 3) run playground
err = pb.Run()
if err != nil {
return err
}

// 4) print success prompt
curveadm.WriteOutln("")
curveadm.WriteOutln(color.GreenString("Export curve.yaml to %s success ^_^"), options.output)
return err
}
1 change: 1 addition & 0 deletions internal/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ const (
POOLSET = "poolset"
POOLSET_DISK_TYPE = "poolset-disktype"
KEY_NUMBER_OF_CHUNKSERVER = "NUMBER_OF_CHUNKSERVER"
KEY_TOOLSV2_CONF_PATH = "TOOLSV2_CONF_PATH"

// format
KEY_ALL_FORMAT_STATUS = "ALL_FORMAT_STATUS"
Expand Down
6 changes: 4 additions & 2 deletions internal/errno/errno.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,8 +253,8 @@ var (
ERR_UNSUPPORT_CLEAN_ITEM = EC(210005, "unsupport clean item")
ERR_NO_SERVICES_MATCHED = EC(210006, "no services matched")
// TODO: please check pool set disk type
ERR_INVALID_DISK_TYPE = EC(210007, "poolset disk type must be lowercase and can only be one of ssd, hdd and nvme")
ERR_UNSUPPORT_DEPLOY_TYPE = EC(210008, "unknown deploy type")
ERR_INVALID_DISK_TYPE = EC(210007, "poolset disk type must be lowercase and can only be one of ssd, hdd and nvme")
ERR_UNSUPPORT_DEPLOY_TYPE = EC(210008, "unknown deploy type")
// 220: commad options (client common)
ERR_UNSUPPORT_CLIENT_KIND = EC(220000, "unsupport client kind")
// 221: command options (client/bs)
Expand All @@ -272,6 +272,8 @@ var (
ERR_VOLUME_BLOCKSIZE_BE_MULTIPLE_OF_512 = EC(221011, "volume block size be a multiple of 512B, like 1KiB, 2KiB, 3KiB...")
// 222: command options (client/fs)
ERR_FS_MOUNTPOINT_REQUIRE_ABSOLUTE_PATH = EC(222000, "mount point must be an absolute path")
// 223: command options (export)
ERR_EXPORT_TOOLSV2_CONF_REQUIRE_ABSOLUTE_PATH = EC(223000, "/path/to/curve.yaml must be an absolute path")

// 230: command options (playground)
ERR_UNSUPPORT_PLAYGROUND_KIND = EC(230000, "unsupport playground kind")
Expand Down
3 changes: 3 additions & 0 deletions internal/playbook/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ const (
GET_CLIENT_STATUS
INSTALL_CLIENT
UNINSTALL_CLIENT
EXPORT_TOOLSV2_CONF

// bs
FORMAT_CHUNKFILE_POOL
Expand Down Expand Up @@ -247,6 +248,8 @@ func (p *Playbook) createTasks(step *PlaybookStep) (*tasks.Tasks, error) {
t, err = comm.NewInstallClientTask(curveadm, config.GetCC(i))
case UNINSTALL_CLIENT:
t, err = comm.NewUninstallClientTask(curveadm, nil)
case EXPORT_TOOLSV2_CONF:
t, err = comm.NewExportToolsV2ConfTask(curveadm, config.GetDC(i))
// bs
case FORMAT_CHUNKFILE_POOL:
t, err = bs.NewFormatChunkfilePoolTask(curveadm, config.GetFC(i))
Expand Down
2 changes: 1 addition & 1 deletion internal/task/task/bs/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import (
)

const (
TOOLS_V2_CONFIG_DELIMITER = ": "
TOOLS_V2_CONFIG_DELIMITER = ":"
TOOLS_V2_CONFIG_SRC_PATH = "/curvebs/conf/curve.yaml"
TOOLS_V2_CONFIG_DEST_PATH = "/etc/curve/curve.yaml"
)
Expand Down
66 changes: 66 additions & 0 deletions internal/task/task/common/export_toolsv2_conf.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* 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: CurveAdm
* Created Date: 2023-11-12
* Author: Jiang Jun (youarefree123)
*/

package common

import (
"fmt"

"github.com/opencurve/curveadm/cli/cli"
comm "github.com/opencurve/curveadm/internal/common"
"github.com/opencurve/curveadm/internal/configure/topology"
"github.com/opencurve/curveadm/internal/task/step"
"github.com/opencurve/curveadm/internal/task/task"
)

func NewExportToolsV2ConfTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig) (*task.Task, error) {
serviceId := curveadm.GetServiceId(dc.GetId())
containerId, err := curveadm.Storage().GetContainerId(serviceId)
if err != nil {
return nil, err
}

hc, err := curveadm.GetHost(dc.GetHost())
if err != nil {
return nil, err
}

var ToolsV2Conf string
localPath := curveadm.MemStorage().Get(comm.KEY_TOOLSV2_CONF_PATH).(string)
subname := fmt.Sprintf("output=%s", localPath)
t := task.NewTask("Export curve.yaml", subname, hc.GetSSHConfig())

t.AddStep(&step.ReadFile{
ContainerId: containerId,
ContainerSrcPath: dc.GetProjectLayout().ToolsV2ConfSystemPath,
Content: &ToolsV2Conf,
ExecOptions: curveadm.ExecOptions(),
})

t.AddStep(&step.InstallFile{
Content: &ToolsV2Conf,
HostDestPath: localPath,
ExecOptions: curveadm.ExecOptions(),
})

return t, nil
}
2 changes: 1 addition & 1 deletion internal/task/task/common/sync_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import (
const (
DEFAULT_CONFIG_DELIMITER = "="
ETCD_CONFIG_DELIMITER = ": "
TOOLS_V2_CONFIG_DELIMITER = ": "
TOOLS_V2_CONFIG_DELIMITER = ":"

CURVE_CRONTAB_FILE = "/tmp/curve_crontab"
)
Expand Down
2 changes: 1 addition & 1 deletion internal/task/task/fs/mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const (
FORMAT_MOUNT_OPTION = "type=bind,source=%s,target=%s,bind-propagation=rshared"

CLIENT_CONFIG_DELIMITER = "="
TOOLS_V2_CONFIG_DELIMITER = ": "
TOOLS_V2_CONFIG_DELIMITER = ":"

KEY_CURVEBS_CLUSTER = "curvebs.cluster"

Expand Down
8 changes: 2 additions & 6 deletions pkg/variable/variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,11 @@ func (vars *Variables) Rendering(s string) (string, error) {
return s, nil
}

var err error
value := vars.r.ReplaceAllStringFunc(s, func(name string) string {
val, e := vars.Get(name[2 : len(name)-1])
if e != nil && err == nil {
err = e
}
val, _ := vars.Get(name[2 : len(name)-1])
return val
})
return value, err
return value, nil
}

func (vars *Variables) Debug() {
Expand Down

0 comments on commit a58f65a

Please sign in to comment.