forked from rancher/kontainer-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
update.go
105 lines (96 loc) · 2.66 KB
/
update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package cmd
import (
"errors"
"fmt"
"os"
generic "github.com/rancher/kontainer-engine/driver"
"github.com/rancher/kontainer-engine/store"
"github.com/urfave/cli"
)
var updateHelpTmeplate = `{{.Usage}}
{{if .Description}}{{.Description}}{{end}}
Usage: kontainer-engine [global option] {{.Name}} {{if .Flags}}[OPTIONS] {{end}}{{if ne "None" .ArgsUsage}}{{if ne "" .ArgsUsage}}{{.ArgsUsage}}{{else}}[cluster-name]{{end}}{{end}}
{{if .Flags}}Options:{{range .Flags}}
{{.}}{{end}}{{end}}
`
// UpdateCommand defines the update command
func UpdateCommand() cli.Command {
return cli.Command{
Name: "update",
Usage: "update kubernetes clusters",
Action: updateWrapper,
SkipFlagParsing: true,
CustomHelpTemplate: updateHelpTmeplate,
}
}
func updateWrapper(ctx *cli.Context) error {
name := ctx.Args().Get(len(ctx.Args()) - 1)
if name == "--help" {
if len(ctx.Args())-2 >= 0 {
name = ctx.Args().Get(len(ctx.Args()) - 2)
} else {
return cli.ShowCommandHelp(ctx, "update")
}
}
clusters, err := store.GetAllClusterFromStore()
if err != nil {
return err
}
cluster, ok := clusters[name]
if !ok {
return fmt.Errorf("cluster %v can't be found", name)
}
rpcClient, addr, err := runRPCDriver(cluster.DriverName)
if err != nil {
return err
}
driverFlags, err := rpcClient.GetDriverUpdateOptions()
if err != nil {
return err
}
flags := getDriverFlags(driverFlags)
for i, command := range ctx.App.Commands {
if command.Name == "update" {
updateCmd := &ctx.App.Commands[i]
updateCmd.SkipFlagParsing = false
updateCmd.Flags = append(updateCmd.Flags, flags...)
updateCmd.Action = updateCluster
}
}
if len(os.Args) > 1 && addr != "" {
args := []string{os.Args[0], "--plugin-listen-addr", addr}
args = append(args, os.Args[1:len(os.Args)]...)
return ctx.App.Run(args)
}
return ctx.App.Run(os.Args)
}
func updateCluster(ctx *cli.Context) error {
name := ctx.Args().Get(0)
if name == "" {
return errors.New("name is required when inspecting cluster")
} else if name == "--help" {
// in case of `./kontainer-engine update cluster1 --help`
return cli.ShowCommandHelp(ctx, "update")
}
clusters, err := store.GetAllClusterFromStore()
if err != nil {
return err
}
cluster, ok := clusters[name]
if !ok {
return fmt.Errorf("cluster %v can't be found", name)
}
addr := ctx.GlobalString("plugin-listen-addr")
rpcClient, err := generic.NewClient(cluster.DriverName, addr)
if err != nil {
return err
}
configGetter := cliConfigGetter{
name: name,
ctx: ctx,
}
cluster.ConfigGetter = configGetter
cluster.PersistStore = cliPersistStore{}
cluster.Driver = rpcClient
return cluster.Update()
}