-
Notifications
You must be signed in to change notification settings - Fork 19
/
sks_nodepool_scale.go
90 lines (70 loc) · 2.37 KB
/
sks_nodepool_scale.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
package cmd
import (
"errors"
"fmt"
"strings"
exov2 "github.com/exoscale/egoscale/v2"
exoapi "github.com/exoscale/egoscale/v2/api"
"github.com/spf13/cobra"
)
type sksNodepoolScaleCmd struct {
_ bool `cli-cmd:"scale"`
Cluster string `cli-arg:"#" cli-usage:"CLUSTER-NAME|ID"`
Nodepool string `cli-arg:"#" cli-usage:"NODEPOOL-NAME|ID"`
Size int64 `cli-arg:"#"`
Force bool `cli-short:"f" cli-usage:"don't prompt for confirmation"`
Zone string `cli-short:"z" cli-usage:"SKS cluster zone"`
}
func (c *sksNodepoolScaleCmd) cmdAliases() []string { return nil }
func (c *sksNodepoolScaleCmd) cmdShort() string { return "Scale an SKS cluster Nodepool size" }
func (c *sksNodepoolScaleCmd) cmdLong() string {
return fmt.Sprintf(`This command scales an SKS cluster Nodepool size up (growing) or down
(shrinking).
In case of a scale-down, operators should use the "exo sks nodepool evict"
variant, allowing them to specify which specific Nodes should be evicted from
the pool rather than leaving the decision to the SKS manager.
Supported output template annotations: %s`,
strings.Join(outputterTemplateAnnotations(&sksNodepoolShowOutput{}), ", "))
}
func (c *sksNodepoolScaleCmd) cmdPreRun(cmd *cobra.Command, args []string) error {
cmdSetZoneFlagFromDefault(cmd)
return cliCommandDefaultPreRun(c, cmd, args)
}
func (c *sksNodepoolScaleCmd) cmdRun(_ *cobra.Command, _ []string) error {
if c.Size <= 0 {
return errors.New("minimum Nodepool size is 1")
}
if !c.Force {
if !askQuestion(fmt.Sprintf("Are you sure you want to scale Nodepool %q to %d?", c.Nodepool, c.Size)) {
return nil
}
}
ctx := exoapi.WithEndpoint(gContext, exoapi.NewReqEndpoint(gCurrentAccount.Environment, c.Zone))
cluster, err := cs.FindSKSCluster(ctx, c.Zone, c.Cluster)
if err != nil {
return err
}
var nodepool *exov2.SKSNodepool
for _, n := range cluster.Nodepools {
if *n.ID == c.Nodepool || *n.Name == c.Nodepool {
nodepool = n
break
}
}
if nodepool == nil {
return errors.New("Nodepool not found") // nolint:golint
}
decorateAsyncOperation(fmt.Sprintf("Scaling Nodepool %q...", c.Nodepool), func() {
err = cluster.ScaleNodepool(ctx, nodepool, c.Size)
})
if err != nil {
return err
}
if !gQuiet {
return output(showSKSNodepool(c.Zone, *cluster.ID, *nodepool.ID))
}
return nil
}
func init() {
cobra.CheckErr(registerCLICommand(sksNodepoolCmd, &sksNodepoolScaleCmd{}))
}