diff --git a/kustomize/commands/edit/remove/all.go b/kustomize/commands/edit/remove/all.go index b86f2541b..016ace963 100644 --- a/kustomize/commands/edit/remove/all.go +++ b/kustomize/commands/edit/remove/all.go @@ -22,6 +22,9 @@ func NewCmdRemove( kustomize edit remove resource {filepath} {filepath} kustomize edit remove resource {pattern} + # Removes one or more configmap from the kustomization file + kustomize edit remove configmap {name1},{name2} + # Removes one or more patches from the kustomization file kustomize edit remove patch --path {filepath} --group {target group name} --version {target version} @@ -37,6 +40,7 @@ func NewCmdRemove( Args: cobra.MinimumNArgs(1), } c.AddCommand( + newCmdRemoveConfigMap(fSys), newCmdRemoveResource(fSys), newCmdRemoveLabel(fSys, v.MakeLabelNameValidator()), newCmdRemoveAnnotation(fSys, v.MakeAnnotationNameValidator()), diff --git a/kustomize/commands/edit/remove/removeconfigmap.go b/kustomize/commands/edit/remove/removeconfigmap.go new file mode 100644 index 000000000..e39bf3ba7 --- /dev/null +++ b/kustomize/commands/edit/remove/removeconfigmap.go @@ -0,0 +1,92 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package remove + +import ( + "errors" + "fmt" + "log" + "strings" + + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +type removeConfigMapOptions struct { + configMapNamesToRemove []string +} + +// newCmdRemoveResource remove the name of a file containing a resource to the kustomization file. +func newCmdRemoveConfigMap(fSys filesys.FileSystem) *cobra.Command { + var o removeConfigMapOptions + + cmd := &cobra.Command{ + Use: "configmap", + Short: "Removes specified configmap" + + konfig.DefaultKustomizationFileName(), + Example: ` + remove configmap my-configmap + `, + RunE: func(cmd *cobra.Command, args []string) error { + err := o.Validate(args) + if err != nil { + return err + } + return o.RunRemoveConfigMap(fSys) + }, + } + return cmd +} + +// Validate validates removeConfigMap command. +func (o *removeConfigMapOptions) Validate(args []string) error { + if len(args) == 0 { + return errors.New("must specify a ConfigMap name") + } + if len(args) > 1 { + return fmt.Errorf("too many arguments: %s; to provide multiple ConfigMaps to remove, please separate ConfigMap names by commas", args) + } + o.configMapNamesToRemove = strings.Split(args[0], ",") + return nil +} + +// RunRemoveConfigMap runs ConfigMap command (do real work). +func (o *removeConfigMapOptions) RunRemoveConfigMap(fSys filesys.FileSystem) error { + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("could not read kustomization file: %w", err) + } + + m, err := mf.Read() + if err != nil { + return fmt.Errorf("could not read kustomization file: %w", err) + } + + foundConfigMaps := make(map[string]struct{}) + + newConfigMaps := make([]types.ConfigMapArgs, 0, len(m.ConfigMapGenerator)) + for _, currentConfigMap := range m.ConfigMapGenerator { + if kustfile.StringInSlice(currentConfigMap.Name, o.configMapNamesToRemove) { + foundConfigMaps[currentConfigMap.Name] = struct{}{} + continue + } + newConfigMaps = append(newConfigMaps, currentConfigMap) + } + + for _, name := range o.configMapNamesToRemove { + if _, found := foundConfigMaps[name]; !found { + log.Printf("configmap %s doesn't exist in kustomization file", name) + } + } + + m.ConfigMapGenerator = newConfigMaps + err = mf.Write(m) + if err != nil { + return fmt.Errorf("configmap cannot write back to file, got %w", err) + } + return nil +} diff --git a/kustomize/commands/edit/remove/removeconfigmap_test.go b/kustomize/commands/edit/remove/removeconfigmap_test.go new file mode 100644 index 000000000..d44829f75 --- /dev/null +++ b/kustomize/commands/edit/remove/removeconfigmap_test.go @@ -0,0 +1,84 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package remove //nolint:testpackage + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + testutils_test "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/testutils" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +func TestRemoveConfigMap(t *testing.T) { + const configMapName01 = "example-configmap-01" + const configMapName02 = "example-configmap-02" + + tests := map[string]struct { + input string + args []string + expectedErr string + }{ + "happy path": { + input: fmt.Sprintf(` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: +- name: %s + files: + - application.properties +`, configMapName01), + args: []string{configMapName01}, + }, + "multiple": { + input: fmt.Sprintf(` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: +- name: %s + files: + - application.properties +- name: %s + files: + - application.properties +`, configMapName01, configMapName02), + args: []string{ + fmt.Sprintf("%s,%s", configMapName01, configMapName02), + }, + }, + "miss": { + input: fmt.Sprintf(` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: +- name: %s + files: + - application.properties +`, configMapName01), + args: []string{"foo"}, + }, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + fSys := filesys.MakeFsInMemory() + testutils_test.WriteTestKustomizationWith(fSys, []byte(tc.input)) + cmd := newCmdRemoveConfigMap(fSys) + err := cmd.RunE(cmd, tc.args) + if tc.expectedErr != "" { + assert.Error(t, err) + assert.Contains(t, err.Error(), tc.expectedErr) + } else { + assert.NoError(t, err) + content, err := testutils_test.ReadTestKustomization(fSys) + assert.NoError(t, err) + for _, opt := range strings.Split(tc.args[0], ",") { + assert.NotContains(t, string(content), opt) + } + } + }) + } +}