check clusters parameter of addon will uninstall from clusters

Signed-off-by: 楚岳 <wangyike.wyk@alibaba-inc.com>
This commit is contained in:
楚岳
2022-12-09 12:18:10 +08:00
parent b9e7c710d8
commit fd2962f90a
3 changed files with 75 additions and 13 deletions

2
go.mod
View File

@@ -255,6 +255,7 @@ require (
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b // indirect
github.com/r3labs/diff/v3 v3.0.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc // indirect
github.com/russross/blackfriday v1.6.0 // indirect
@@ -267,6 +268,7 @@ require (
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tjfoc/gmsm v1.3.2 // indirect
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect

4
go.sum
View File

@@ -1779,6 +1779,8 @@ github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQ
github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc=
github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50=
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
github.com/r3labs/diff/v3 v3.0.0 h1:ZhPwNxn9gW5WLPBV9GCYaVbMdLOSmJ0DeKdCiSbOLUI=
github.com/r3labs/diff/v3 v3.0.0/go.mod h1:wCkTySAiDnZao1sZrVTDIzuzgLZ+cNPGn3LC8DlIg5g=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
@@ -1989,6 +1991,8 @@ github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmF
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=

View File

@@ -70,18 +70,16 @@ const (
var enabledAddonColor = color.New(color.Bold, color.FgGreen)
var forceDisable bool
var addonVersion string
var addonClusters string
var verboseStatus bool
var skipValidate bool
var overrideDefs bool
var dryRun bool
var (
forceDisable bool
addonVersion string
addonClusters string
verboseStatus bool
skipValidate bool
overrideDefs bool
dryRun bool
skipCheckUninstallFromClusters bool
)
// NewAddonCommand create `addon` command
func NewAddonCommand(c common.Args, order string, ioStreams cmdutil.IOStreams) *cobra.Command {
@@ -189,6 +187,11 @@ func NewAddonEnableCommand(c common.Args, ioStream cmdutil.IOStreams) *cobra.Com
return errors.Wrapf(err, "directory %s is invalid", addonOrDir)
}
name = filepath.Base(abs)
if !skipCheckUninstallFromClusters {
if err := checkUninstallFromClusters(ctx, k8sClient, name, addonArgs); err != nil {
return err
}
}
err = enableAddonByLocal(ctx, name, addonOrDir, k8sClient, dc, config, addonArgs)
if err != nil {
return err
@@ -197,7 +200,11 @@ func NewAddonEnableCommand(c common.Args, ioStream cmdutil.IOStreams) *cobra.Com
if filepath.IsAbs(addonOrDir) || strings.HasPrefix(addonOrDir, ".") || strings.HasSuffix(addonOrDir, "/") {
return fmt.Errorf("addon directory %s not found in local", addonOrDir)
}
if !skipCheckUninstallFromClusters {
if err := checkUninstallFromClusters(ctx, k8sClient, name, addonArgs); err != nil {
return err
}
}
err = enableAddon(ctx, k8sClient, dc, config, name, addonVersion, addonArgs)
if err != nil {
return err
@@ -217,6 +224,7 @@ func NewAddonEnableCommand(c common.Args, ioStream cmdutil.IOStreams) *cobra.Com
cmd.Flags().BoolVarP(&skipValidate, "skip-version-validating", "s", false, "skip validating system version requirement")
cmd.Flags().BoolVarP(&overrideDefs, "override-definitions", "", false, "override existing definitions if conflict with those contained in this addon")
cmd.Flags().BoolVarP(&dryRun, FlagDryRun, "", false, "render all yaml files out without real execute it")
cmd.Flags().BoolVarP(&skipCheckUninstallFromClusters, "skip-check-uninstall-clusters", "", false, "skip check 'clusters' parameters whether uninstall addon from clusters")
return cmd
}
@@ -1201,3 +1209,51 @@ func splitSpecifyRegistry(name string) (string, string, error) {
return "", "", fmt.Errorf("invalid addon name, you should specify name only <addonName> or with registry as prefix <registryName>/<addonName>")
}
}
func checkUninstallFromClusters(ctx context.Context, k8sClient client.Client, addonName string, args map[string]interface{}) error {
status, err := pkgaddon.GetAddonStatus(ctx, k8sClient, addonName)
if err != nil {
return fmt.Errorf("failed to check addon is enabled err: %w", err)
}
if status.AddonPhase == statusDisabled {
return nil
}
if _, ok := args["clusters"]; !ok {
return nil
}
cList, ok := args["clusters"].([]interface{})
if !ok {
return fmt.Errorf("clusters parameter must be a list of string")
}
clusters := map[string]struct{}{}
for _, c := range cList {
clusterName := c.(string)
clusters[clusterName] = struct{}{}
}
var disableClusters, installedClusters []string
for c := range status.Clusters {
if _, ok := clusters[c]; !ok {
disableClusters = append(disableClusters, c)
}
installedClusters = append(installedClusters, c)
}
fmt.Println(color.New(color.FgRed).Sprintf("Previously, the addon was installed on clusters %s, but this operation will disable the addon from clusters: %s \n", generateClustersInfo(installedClusters), generateClustersInfo(disableClusters)))
input := NewUserInput()
if !input.AskBool("Do you want continue?", &UserInputOptions{AssumeYes: false}) {
return fmt.Errorf("operation abort")
}
return nil
}
func generateClustersInfo(clusters []string) string {
ret := "["
for i, cluster := range clusters {
ret += cluster
if i < len(clusters)-1 {
ret += ","
}
}
ret += "]"
return ret
}