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

[feat]curveadm: add install tool command #332

Closed
wants to merge 6 commits into from
Closed
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
3 changes: 2 additions & 1 deletion cli/command/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ package command

import (
"fmt"

"github.com/opencurve/curveadm/cli/cli"
"github.com/opencurve/curveadm/cli/command/client"
"github.com/opencurve/curveadm/cli/command/cluster"
"github.com/opencurve/curveadm/cli/command/config"
"github.com/opencurve/curveadm/cli/command/disks"
"github.com/opencurve/curveadm/cli/command/hosts"
"github.com/opencurve/curveadm/cli/command/http"
"github.com/opencurve/curveadm/cli/command/install"
"github.com/opencurve/curveadm/cli/command/monitor"
"github.com/opencurve/curveadm/cli/command/pfs"
"github.com/opencurve/curveadm/cli/command/playground"
Expand Down Expand Up @@ -72,6 +72,7 @@ func addSubCommands(cmd *cobra.Command, curveadm *cli.CurveAdm) {
monitor.NewMonitorCommand(curveadm), // curveadm monitor ...
http.NewHttpCommand(curveadm), // curveadm http
website.NewWebsiteCommand(curveadm), // curveadm website ...
install.NewInstallCommand(curveadm), // curveadm install

NewAuditCommand(curveadm), // curveadm audit
NewCleanCommand(curveadm), // curveadm clean
Expand Down
21 changes: 21 additions & 0 deletions cli/command/install/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package install

import (
"github.com/opencurve/curveadm/cli/cli"
cliutil "github.com/opencurve/curveadm/internal/utils"
"github.com/spf13/cobra"
)

func NewInstallCommand(curveadm *cli.CurveAdm) *cobra.Command {
cmd := &cobra.Command{
Use: "install",
Short: "Manage install",
Args: cliutil.NoArgs,
RunE: cliutil.ShowHelp(curveadm.Err()),
}

cmd.AddCommand(
NewInstallToolCommand(curveadm),
)
return cmd
}
89 changes: 89 additions & 0 deletions cli/command/install/tool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package install

import (
"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 (
INSTALL_TOOL_PLAYBOOK_STEPS = []int{
playbook.INSTALL_TOOL,
}
)

type installOptions struct {
host string
path string
confPath string
}

func NewInstallToolCommand(curveadm *cli.CurveAdm) *cobra.Command {
var options installOptions

cmd := &cobra.Command{
Use: "tool [OPTIONS]",
Short: "Install tool v2 on the specified host",
Args: cliutil.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
return runInstallTool(curveadm, options)
},
DisableFlagsInUseLine: true,
}

flags := cmd.Flags()
flags.StringVar(&options.host, "host", "localhost", "Specify target host")
flags.StringVar(&options.path, "path", "/usr/local/bin/curve", "Specify target install path of tool v2")
flags.StringVar(&options.confPath, "confPath", "~/.curve/curve.yaml", "Specify target config path of tool v2")
Copy link
Contributor

Choose a reason for hiding this comment

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

The defaule value of confPath is /etc/curve/curve.yaml


return cmd
}

func genInstallToolPlaybook(curveadm *cli.CurveAdm,
dcs []*topology.DeployConfig,
options installOptions,
) (*playbook.Playbook, error) {
configs := curveadm.FilterDeployConfig(dcs, topology.FilterOption{Id: "*", Role: topology.ROLE_MDS, Host: options.host})[:1]
Copy link
Contributor

Choose a reason for hiding this comment

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

Any one service container is ok on the host. ROLE_MDS is not necessary.

if len(configs) == 0 {
return nil, errno.ERR_NO_SERVICES_MATCHED
}
steps := INSTALL_TOOL_PLAYBOOK_STEPS
pb := playbook.NewPlaybook(curveadm)
for _, step := range steps {
pb.AddStep(&playbook.PlaybookStep{
Type: step,
Configs: configs,
Options: map[string]interface{}{
comm.KEY_INSTALL_PATH: options.path,
comm.KEY_INSTALL_CONF_PATH: options.confPath,
},
})
}
return pb, nil
}

func runInstallTool(curveadm *cli.CurveAdm, options installOptions) error {
dcs, err := curveadm.ParseTopology()
if err != nil {
return err
}

pb, err := genInstallToolPlaybook(curveadm, dcs, options)
if err != nil {
return err
}

err = pb.Run()
if err != nil {
return err
}

curveadm.WriteOutln(color.GreenString("Install %s to %s success."),
"curve tool v2", options.host)
return nil
}
4 changes: 4 additions & 0 deletions internal/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ const (

// website
KEY_WEBSITE_STATUS = "WEBSITE_STATUS"

// install
KEY_INSTALL_PATH = "INSTALL_PATH"
KEY_INSTALL_CONF_PATH = "INSTALL_CONF_PATH"
)

// others
Expand Down
4 changes: 4 additions & 0 deletions internal/playbook/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/opencurve/curveadm/internal/task/task/checker"
comm "github.com/opencurve/curveadm/internal/task/task/common"
"github.com/opencurve/curveadm/internal/task/task/fs"
"github.com/opencurve/curveadm/internal/task/task/install"
"github.com/opencurve/curveadm/internal/task/task/monitor"
pg "github.com/opencurve/curveadm/internal/task/task/playground"
"github.com/opencurve/curveadm/internal/task/task/website"
Expand Down Expand Up @@ -84,6 +85,7 @@ const (
GET_CLIENT_STATUS
INSTALL_CLIENT
UNINSTALL_CLIENT
INSTALL_TOOL

// bs
FORMAT_CHUNKFILE_POOL
Expand Down Expand Up @@ -260,6 +262,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 INSTALL_TOOL:
t, err = install.NewInstallToolTask(curveadm, config.GetDC(i))
// bs
case FORMAT_CHUNKFILE_POOL:
t, err = bs.NewFormatChunkfilePoolTask(curveadm, config.GetFC(i))
Expand Down
79 changes: 79 additions & 0 deletions internal/task/task/install/install_tool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package install

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/errno"
"github.com/opencurve/curveadm/internal/task/step"
"github.com/opencurve/curveadm/internal/task/task"
tui "github.com/opencurve/curveadm/internal/tui/common"
"github.com/opencurve/curveadm/pkg/module"
"path/filepath"
)

func checkPathExist(path string, sshConfig *module.SSHConfig, curveadm *cli.CurveAdm) error {
sshClient, err := module.NewSSHClient(*sshConfig)
if err != nil {
return errno.ERR_SSH_CONNECT_FAILED.E(err)
}

module := module.NewModule(sshClient)
cmd := module.Shell().Stat(path)
if _, err := cmd.Execute(curveadm.ExecOptions()); err == nil {
if pass := tui.ConfirmYes(tui.PromptPathExist(path)); !pass {
return errno.ERR_CANCEL_OPERATION
}
}
return nil
}

func NewInstallToolTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig) (*task.Task, error) {
layout := dc.GetProjectLayout()
path := curveadm.MemStorage().Get(comm.KEY_INSTALL_PATH).(string)
confPath := curveadm.MemStorage().Get(comm.KEY_INSTALL_CONF_PATH).(string)
hc, err := curveadm.GetHost(dc.GetHost())
if err != nil {
return nil, err
}

serviceId := curveadm.GetServiceId(dc.GetId())
0fatal marked this conversation as resolved.
Show resolved Hide resolved
containerId, err := curveadm.GetContainerId(serviceId)
if err != nil {
return nil, err
}

if err = checkPathExist(path, hc.GetSSHConfig(), curveadm); err != nil {
return nil, err
}
if err = checkPathExist(confPath, hc.GetSSHConfig(), curveadm); err != nil {
return nil, err
}

subname := fmt.Sprintf("host=%s", dc.GetHost())
t := task.NewTask("Install tool v2", subname, hc.GetSSHConfig())

t.AddStep(&step.CreateDirectory{
Paths: []string{filepath.Dir(path)},
ExecOptions: curveadm.ExecOptions(),
})
t.AddStep(&step.CopyFromContainer{
ContainerSrcPath: layout.ToolsV2BinaryPath,
ContainerId: containerId,
HostDestPath: path,
ExecOptions: curveadm.ExecOptions(),
})
t.AddStep(&step.CreateDirectory{
Paths: []string{filepath.Dir(confPath)},
ExecOptions: curveadm.ExecOptions(),
})
t.AddStep(&step.CopyFromContainer{
ContainerSrcPath: layout.ToolsV2ConfSystemPath,
ContainerId: containerId,
HostDestPath: confPath,
ExecOptions: curveadm.ExecOptions(),
})

return t, nil
}
9 changes: 9 additions & 0 deletions internal/tui/common/prompt.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ to watch the formatting progress.
`
PROMPT_CANCEL_OPERATION = `[x] {{.operation}} canceled`

PROMPT_PATH_EXIST = `{{.path}} already exists.
`

DEFAULT_CONFIRM_PROMPT = "Do you want to continue?"
)

Expand Down Expand Up @@ -236,3 +239,9 @@ func PromptAutoUpgrade(version string) string {
prompt.data["version"] = version
return prompt.Build()
}

func PromptPathExist(path string) string {
prompt := NewPrompt(color.YellowString(PROMPT_PATH_EXIST) + DEFAULT_CONFIRM_PROMPT)
prompt.data["path"] = path
return prompt.Build()
}