refactor: move reusable bits in preparation for edit set commands

* Move configmapSecretFlagsAndArgs.go to the internal/util folder so it can be
  reused by the edit set commands.
This commit is contained in:
Mauren Berti
2023-10-09 17:34:36 -04:00
parent 0f2618b21d
commit a5a2db577f
7 changed files with 93 additions and 90 deletions

View File

@@ -202,6 +202,7 @@ go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
@@ -210,6 +211,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -221,8 +223,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=

View File

@@ -11,6 +11,7 @@ import (
"sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/resource"
"sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util"
"sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/filesys"
) )
@@ -20,7 +21,7 @@ func newCmdAddConfigMap(
ldr ifc.KvLoader, ldr ifc.KvLoader,
rf *resource.Factory, rf *resource.Factory,
) *cobra.Command { ) *cobra.Command {
var flags configmapSecretFlagsAndArgs var flags util.ConfigMapSecretFlagsAndArgs
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "configmap NAME [--namespace=namespace-name] [--behavior={create|merge|replace}] [--from-file=[key=]source] [--from-literal=key1=value1]", Use: "configmap NAME [--namespace=namespace-name] [--behavior={create|merge|replace}] [--from-file=[key=]source] [--from-literal=key1=value1]",
Short: "Adds a configmap to the kustomization file", Short: "Adds a configmap to the kustomization file",
@@ -48,36 +49,36 @@ func newCmdAddConfigMap(
cmd.Flags().StringSliceVar( cmd.Flags().StringSliceVar(
&flags.FileSources, &flags.FileSources,
fromFileFlag, util.FromFileFlag,
[]string{}, []string{},
"Key file can be specified using its file path, in which case file basename will be used as configmap "+ "Key file can be specified using its file path, in which case file basename will be used as configmap "+
"key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+ "key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+
"directory will iterate each named file in the directory whose basename is a valid configmap key.") "directory will iterate each named file in the directory whose basename is a valid configmap key.")
cmd.Flags().StringArrayVar( cmd.Flags().StringArrayVar(
&flags.LiteralSources, &flags.LiteralSources,
fromLiteralFlag, util.FromLiteralFlag,
[]string{}, []string{},
"Specify a key and literal value to insert in configmap (i.e. mykey=somevalue)") "Specify a key and literal value to insert in configmap (i.e. mykey=somevalue)")
cmd.Flags().StringVar( cmd.Flags().StringVar(
&flags.EnvFileSource, &flags.EnvFileSource,
fromEnvFileFlag, util.FromEnvFileFlag,
"", "",
"Specify the path to a file to read lines of key=val pairs to create a configmap (i.e. a Docker .env file).") "Specify the path to a file to read lines of key=val pairs to create a configmap (i.e. a Docker .env file).")
cmd.Flags().BoolVar( cmd.Flags().BoolVar(
&flags.DisableNameSuffixHash, &flags.DisableNameSuffixHash,
disableNameSuffixHashFlag, util.DisableNameSuffixHashFlag,
false, false,
"Disable the name suffix for the configmap") "Disable the name suffix for the configmap")
cmd.Flags().StringVar( cmd.Flags().StringVar(
&flags.Behavior, &flags.Behavior,
behaviorFlag, util.BehaviorFlag,
"", "",
"Specify the behavior for config map generation, i.e whether to create a new configmap (the default), "+ "Specify the behavior for config map generation, i.e whether to create a new configmap (the default), "+
"to merge with a previously defined one, or to replace an existing one. Merge and replace should be used only "+ "to merge with a previously defined one, or to replace an existing one. Merge and replace should be used only "+
" when overriding an existing configmap defined in a base") " when overriding an existing configmap defined in a base")
cmd.Flags().StringVar( cmd.Flags().StringVar(
&flags.Namespace, &flags.Namespace,
namespaceFlag, util.NamespaceFlag,
"", "",
"Specify the namespace of the ConfigMap") "Specify the namespace of the ConfigMap")
@@ -85,7 +86,7 @@ func newCmdAddConfigMap(
} }
func runEditAddConfigMap( func runEditAddConfigMap(
flags configmapSecretFlagsAndArgs, flags util.ConfigMapSecretFlagsAndArgs,
fSys filesys.FileSystem, fSys filesys.FileSystem,
args []string, args []string,
ldr ifc.KvLoader, ldr ifc.KvLoader,
@@ -133,11 +134,11 @@ func runEditAddConfigMap(
func addConfigMap( func addConfigMap(
ldr ifc.KvLoader, ldr ifc.KvLoader,
k *types.Kustomization, k *types.Kustomization,
flags configmapSecretFlagsAndArgs, flags util.ConfigMapSecretFlagsAndArgs,
rf *resource.Factory, rf *resource.Factory,
) error { ) error {
args := findOrMakeConfigMapArgs(k, flags.Name, flags.Namespace) args := findOrMakeConfigMapArgs(k, flags.Name, flags.Namespace)
mergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags) util.MergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags)
// Validate by trying to create corev1.configmap. // Validate by trying to create corev1.configmap.
args.Options = types.MergeGlobalOptionsIntoLocal( args.Options = types.MergeGlobalOptionsIntoLocal(
args.Options, k.GeneratorOptions) args.Options, k.GeneratorOptions)

View File

@@ -16,6 +16,7 @@ import (
"sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile"
testutils_test "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/testutils" testutils_test "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/testutils"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util"
"sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/filesys"
) )
@@ -54,12 +55,12 @@ func TestMakeConfigMapArgs(t *testing.T) {
func TestMergeFlagsIntoConfigMapArgs_LiteralSources(t *testing.T) { func TestMergeFlagsIntoConfigMapArgs_LiteralSources(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace) args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace)
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{LiteralSources: []string{"k1=v1"}}) util.ConfigMapSecretFlagsAndArgs{LiteralSources: []string{"k1=v1"}})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{LiteralSources: []string{"k2=v2"}}) util.ConfigMapSecretFlagsAndArgs{LiteralSources: []string{"k2=v2"}})
assert.Equal(t, "k1=v1", k.ConfigMapGenerator[0].LiteralSources[0]) assert.Equal(t, "k1=v1", k.ConfigMapGenerator[0].LiteralSources[0])
assert.Equal(t, "k2=v2", k.ConfigMapGenerator[0].LiteralSources[1]) assert.Equal(t, "k2=v2", k.ConfigMapGenerator[0].LiteralSources[1])
} }
@@ -67,12 +68,12 @@ func TestMergeFlagsIntoConfigMapArgs_LiteralSources(t *testing.T) {
func TestMergeFlagsIntoConfigMapArgs_FileSources(t *testing.T) { func TestMergeFlagsIntoConfigMapArgs_FileSources(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace) args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace)
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{FileSources: []string{"file1"}}) util.ConfigMapSecretFlagsAndArgs{FileSources: []string{"file1"}})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{FileSources: []string{"file2"}}) util.ConfigMapSecretFlagsAndArgs{FileSources: []string{"file2"}})
assert.Equal(t, "file1", k.ConfigMapGenerator[0].FileSources[0]) assert.Equal(t, "file1", k.ConfigMapGenerator[0].FileSources[0])
assert.Equal(t, "file2", k.ConfigMapGenerator[0].FileSources[1]) assert.Equal(t, "file2", k.ConfigMapGenerator[0].FileSources[1])
} }
@@ -80,12 +81,12 @@ func TestMergeFlagsIntoConfigMapArgs_FileSources(t *testing.T) {
func TestMergeFlagsIntoConfigMapArgs_EnvSource(t *testing.T) { func TestMergeFlagsIntoConfigMapArgs_EnvSource(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace) args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace)
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{EnvFileSource: "env1"}) util.ConfigMapSecretFlagsAndArgs{EnvFileSource: "env1"})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{EnvFileSource: "env2"}) util.ConfigMapSecretFlagsAndArgs{EnvFileSource: "env2"})
assert.Equal(t, "env1", k.ConfigMapGenerator[0].EnvSources[0]) assert.Equal(t, "env1", k.ConfigMapGenerator[0].EnvSources[0])
assert.Equal(t, "env2", k.ConfigMapGenerator[0].EnvSources[1]) assert.Equal(t, "env2", k.ConfigMapGenerator[0].EnvSources[1])
} }
@@ -94,31 +95,31 @@ func TestMergeFlagsIntoConfigMapArgs_Behavior(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace) args := findOrMakeConfigMapArgs(k, "foo", configMapNamespace)
createBehaviorFlags := configmapSecretFlagsAndArgs{ createBehaviorFlags := util.ConfigMapSecretFlagsAndArgs{
Behavior: "create", Behavior: "create",
EnvFileSource: "env1", EnvFileSource: "env1",
} }
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
createBehaviorFlags) createBehaviorFlags)
require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace) require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace)
assert.Equal(t, "create", k.ConfigMapGenerator[0].Behavior) assert.Equal(t, "create", k.ConfigMapGenerator[0].Behavior)
mergeBehaviorFlags := configmapSecretFlagsAndArgs{ mergeBehaviorFlags := util.ConfigMapSecretFlagsAndArgs{
Behavior: "merge", Behavior: "merge",
EnvFileSource: "env1", EnvFileSource: "env1",
} }
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
mergeBehaviorFlags) mergeBehaviorFlags)
require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace) require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace)
assert.Equal(t, "merge", k.ConfigMapGenerator[0].Behavior) assert.Equal(t, "merge", k.ConfigMapGenerator[0].Behavior)
replaceBehaviorFlags := configmapSecretFlagsAndArgs{ replaceBehaviorFlags := util.ConfigMapSecretFlagsAndArgs{
Behavior: "replace", Behavior: "replace",
EnvFileSource: "env1", EnvFileSource: "env1",
} }
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
replaceBehaviorFlags) replaceBehaviorFlags)
require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace) require.Equal(t, configMapNamespace, k.ConfigMapGenerator[0].Namespace)
@@ -162,8 +163,8 @@ func TestEditAddConfigMapWithLiteralSource(t *testing.T) {
args := []string{ args := []string{
tc.configMapName, tc.configMapName,
fmt.Sprintf(flagFormat, fromLiteralFlag, tc.literalSource), fmt.Sprintf(util.FlagFormat, util.FromLiteralFlag, tc.literalSource),
fmt.Sprintf(flagFormat, namespaceFlag, tc.configMapNamespace), fmt.Sprintf(util.FlagFormat, util.NamespaceFlag, tc.configMapNamespace),
} }
cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)
@@ -243,8 +244,8 @@ func TestEditAddConfigMapWithEnvSource(t *testing.T) {
args := []string{ args := []string{
tc.configMapName, tc.configMapName,
fmt.Sprintf(flagFormat, fromEnvFileFlag, tc.envSource), fmt.Sprintf(util.FlagFormat, util.FromEnvFileFlag, tc.envSource),
fmt.Sprintf(flagFormat, namespaceFlag, tc.configMapNamespace), fmt.Sprintf(util.FlagFormat, util.NamespaceFlag, tc.configMapNamespace),
} }
cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)
@@ -323,8 +324,8 @@ func TestEditAddConfigMapWithFileSource(t *testing.T) {
args := []string{ args := []string{
tc.configMapName, tc.configMapName,
fmt.Sprintf(flagFormat, fromFileFlag, tc.fileSource), fmt.Sprintf(util.FlagFormat, util.FromFileFlag, tc.fileSource),
fmt.Sprintf(flagFormat, namespaceFlag, tc.configMapNamespace), fmt.Sprintf(util.FlagFormat, util.NamespaceFlag, tc.configMapNamespace),
} }
cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddConfigMap(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)

View File

@@ -11,6 +11,7 @@ import (
"sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/resource"
"sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util"
"sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/filesys"
) )
@@ -20,7 +21,7 @@ func newCmdAddSecret(
ldr ifc.KvLoader, ldr ifc.KvLoader,
rf *resource.Factory, rf *resource.Factory,
) *cobra.Command { ) *cobra.Command {
var flags configmapSecretFlagsAndArgs var flags util.ConfigMapSecretFlagsAndArgs
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "secret NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--type=Opaque|kubernetes.io/tls]", Use: "secret NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--type=Opaque|kubernetes.io/tls]",
Short: "Adds a secret to the kustomization file.", Short: "Adds a secret to the kustomization file.",
@@ -42,19 +43,19 @@ func newCmdAddSecret(
cmd.Flags().StringSliceVar( cmd.Flags().StringSliceVar(
&flags.FileSources, &flags.FileSources,
fromFileFlag, util.FromFileFlag,
[]string{}, []string{},
"Key file can be specified using its file path, in which case file basename will be used as secret "+ "Key file can be specified using its file path, in which case file basename will be used as secret "+
"key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+ "key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+
"directory will iterate each named file in the directory whose basename is a valid secret key.") "directory will iterate each named file in the directory whose basename is a valid secret key.")
cmd.Flags().StringArrayVar( cmd.Flags().StringArrayVar(
&flags.LiteralSources, &flags.LiteralSources,
fromLiteralFlag, util.FromLiteralFlag,
[]string{}, []string{},
"Specify a key and literal value to insert in secret (i.e. mykey=somevalue)") "Specify a key and literal value to insert in secret (i.e. mykey=somevalue)")
cmd.Flags().StringVar( cmd.Flags().StringVar(
&flags.EnvFileSource, &flags.EnvFileSource,
fromEnvFileFlag, util.FromEnvFileFlag,
"", "",
"Specify the path to a file to read lines of key=val pairs to create a secret (i.e. a Docker .env file).") "Specify the path to a file to read lines of key=val pairs to create a secret (i.e. a Docker .env file).")
cmd.Flags().StringVar( cmd.Flags().StringVar(
@@ -64,12 +65,12 @@ func newCmdAddSecret(
"Specify the secret type this can be 'Opaque' (default), or 'kubernetes.io/tls'") "Specify the secret type this can be 'Opaque' (default), or 'kubernetes.io/tls'")
cmd.Flags().StringVar( cmd.Flags().StringVar(
&flags.Namespace, &flags.Namespace,
namespaceFlag, util.NamespaceFlag,
"", "",
"Specify the namespace of the secret") "Specify the namespace of the secret")
cmd.Flags().BoolVar( cmd.Flags().BoolVar(
&flags.DisableNameSuffixHash, &flags.DisableNameSuffixHash,
disableNameSuffixHashFlag, util.DisableNameSuffixHashFlag,
false, false,
"Disable the name suffix for the secret") "Disable the name suffix for the secret")
@@ -77,7 +78,7 @@ func newCmdAddSecret(
} }
func runEditAddSecret( func runEditAddSecret(
flags configmapSecretFlagsAndArgs, flags util.ConfigMapSecretFlagsAndArgs,
fSys filesys.FileSystem, fSys filesys.FileSystem,
args []string, args []string,
ldr ifc.KvLoader, ldr ifc.KvLoader,
@@ -125,11 +126,11 @@ func runEditAddSecret(
func addSecret( func addSecret(
ldr ifc.KvLoader, ldr ifc.KvLoader,
k *types.Kustomization, k *types.Kustomization,
flags configmapSecretFlagsAndArgs, flags util.ConfigMapSecretFlagsAndArgs,
rf *resource.Factory, rf *resource.Factory,
) error { ) error {
args := findOrMakeSecretArgs(k, flags.Name, flags.Namespace, flags.Type) args := findOrMakeSecretArgs(k, flags.Name, flags.Namespace, flags.Type)
mergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags) util.MergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags)
// Validate by trying to create corev1.secret. // Validate by trying to create corev1.secret.
args.Options = types.MergeGlobalOptionsIntoLocal( args.Options = types.MergeGlobalOptionsIntoLocal(
args.Options, k.GeneratorOptions) args.Options, k.GeneratorOptions)

View File

@@ -16,6 +16,7 @@ import (
"sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile"
testutils_test "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/testutils" testutils_test "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/testutils"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util"
"sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/filesys"
) )
@@ -51,12 +52,12 @@ func TestMakeSecretArgs(t *testing.T) {
func TestMergeFlagsIntoSecretArgs_LiteralSources(t *testing.T) { func TestMergeFlagsIntoSecretArgs_LiteralSources(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden") args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden")
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{LiteralSources: []string{"k1=v1"}}) util.ConfigMapSecretFlagsAndArgs{LiteralSources: []string{"k1=v1"}})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{LiteralSources: []string{"k2=v2"}}) util.ConfigMapSecretFlagsAndArgs{LiteralSources: []string{"k2=v2"}})
assert.Equal(t, "k1=v1", k.SecretGenerator[0].LiteralSources[0]) assert.Equal(t, "k1=v1", k.SecretGenerator[0].LiteralSources[0])
assert.Equal(t, "k2=v2", k.SecretGenerator[0].LiteralSources[1]) assert.Equal(t, "k2=v2", k.SecretGenerator[0].LiteralSources[1])
} }
@@ -64,12 +65,12 @@ func TestMergeFlagsIntoSecretArgs_LiteralSources(t *testing.T) {
func TestMergeFlagsIntoSecretArgs_FileSources(t *testing.T) { func TestMergeFlagsIntoSecretArgs_FileSources(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden") args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden")
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{FileSources: []string{"file1"}}) util.ConfigMapSecretFlagsAndArgs{FileSources: []string{"file1"}})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{FileSources: []string{"file2"}}) util.ConfigMapSecretFlagsAndArgs{FileSources: []string{"file2"}})
assert.Equal(t, "file1", k.SecretGenerator[0].FileSources[0]) assert.Equal(t, "file1", k.SecretGenerator[0].FileSources[0])
assert.Equal(t, "file2", k.SecretGenerator[0].FileSources[1]) assert.Equal(t, "file2", k.SecretGenerator[0].FileSources[1])
} }
@@ -77,12 +78,12 @@ func TestMergeFlagsIntoSecretArgs_FileSources(t *testing.T) {
func TestMergeFlagsIntoSecretArgs_EnvSource(t *testing.T) { func TestMergeFlagsIntoSecretArgs_EnvSource(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden") args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden")
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{EnvFileSource: "env1"}) util.ConfigMapSecretFlagsAndArgs{EnvFileSource: "env1"})
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{EnvFileSource: "env2"}) util.ConfigMapSecretFlagsAndArgs{EnvFileSource: "env2"})
assert.Equal(t, "env1", k.SecretGenerator[0].EnvSources[0]) assert.Equal(t, "env1", k.SecretGenerator[0].EnvSources[0])
assert.Equal(t, "env2", k.SecretGenerator[0].EnvSources[1]) assert.Equal(t, "env2", k.SecretGenerator[0].EnvSources[1])
} }
@@ -90,9 +91,9 @@ func TestMergeFlagsIntoSecretArgs_EnvSource(t *testing.T) {
func TestMergeFlagsIntoSecretArgs_DisableNameSuffixHash(t *testing.T) { func TestMergeFlagsIntoSecretArgs_DisableNameSuffixHash(t *testing.T) {
k := &types.Kustomization{} k := &types.Kustomization{}
args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden") args := findOrMakeSecretArgs(k, "foo", "bar", "forbidden")
mergeFlagsIntoGeneratorArgs( util.MergeFlagsIntoGeneratorArgs(
&args.GeneratorArgs, &args.GeneratorArgs,
configmapSecretFlagsAndArgs{DisableNameSuffixHash: true}) util.ConfigMapSecretFlagsAndArgs{DisableNameSuffixHash: true})
assert.True(t, k.SecretGenerator[0].Options.DisableNameSuffixHash) assert.True(t, k.SecretGenerator[0].Options.DisableNameSuffixHash)
} }
@@ -112,7 +113,7 @@ func TestEditAddSecretWithLiteralSource(t *testing.T) {
args := []string{ args := []string{
secretName, secretName,
fmt.Sprintf(flagFormat, fromLiteralFlag, literalSource), fmt.Sprintf(util.FlagFormat, util.FromLiteralFlag, literalSource),
} }
cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)
@@ -162,7 +163,7 @@ func TestEditAddSecretWithEnvSource(t *testing.T) {
args := []string{ args := []string{
secretName, secretName,
fmt.Sprintf(flagFormat, fromEnvFileFlag, envSource), fmt.Sprintf(util.FlagFormat, util.FromEnvFileFlag, envSource),
} }
cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)
@@ -212,7 +213,7 @@ func TestEditAddSecretWithFileSource(t *testing.T) {
args := []string{ args := []string{
secretName, secretName,
fmt.Sprintf(flagFormat, fromFileFlag, fileSource), fmt.Sprintf(util.FlagFormat, util.FromFileFlag, fileSource),
} }
cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory()) cmd := newCmdAddSecret(fSys, ldr, pvd.GetResourceFactory())
cmd.SetArgs(args) cmd.SetArgs(args)

View File

@@ -1,29 +1,28 @@
// Copyright 2019 The Kubernetes Authors. // Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
package add package util
import ( import (
"fmt" "fmt"
"strings" "strings"
"sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util"
"sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/filesys"
) )
const ( const (
fromFileFlag = "from-file" FromFileFlag = "from-file"
fromLiteralFlag = "from-literal" FromLiteralFlag = "from-literal"
fromEnvFileFlag = "from-env-file" FromEnvFileFlag = "from-env-file"
disableNameSuffixHashFlag = "disableNameSuffixHash" DisableNameSuffixHashFlag = "disableNameSuffixHash"
behaviorFlag = "behavior" BehaviorFlag = "behavior"
namespaceFlag = "namespace" NamespaceFlag = "namespace"
flagFormat = "--%s=%s" FlagFormat = "--%s=%s"
) )
// configmapSecretFlagsAndArgs encapsulates the options for add secret/configmap commands. // ConfigMapSecretFlagsAndArgs encapsulates the options for add secret/configmap commands.
type configmapSecretFlagsAndArgs struct { type ConfigMapSecretFlagsAndArgs struct {
// Name of configMap/Secret (required) // Name of configMap/Secret (required)
Name string Name string
// FileSources to derive the configMap/Secret from (optional) // FileSources to derive the configMap/Secret from (optional)
@@ -44,7 +43,7 @@ type configmapSecretFlagsAndArgs struct {
} }
// Validate validates required fields are set to support structured generation. // Validate validates required fields are set to support structured generation.
func (a *configmapSecretFlagsAndArgs) Validate(args []string) error { func (a *ConfigMapSecretFlagsAndArgs) Validate(args []string) error {
if len(args) != 1 { if len(args) != 1 {
return fmt.Errorf("name must be specified once") return fmt.Errorf("name must be specified once")
} }
@@ -80,7 +79,7 @@ func (a *configmapSecretFlagsAndArgs) Validate(args []string) error {
// and the key, if missing, is the same as the value. // and the key, if missing, is the same as the value.
// In the case where the key is explicitly declared, // In the case where the key is explicitly declared,
// the globbing, if present, must have exactly one match. // the globbing, if present, must have exactly one match.
func (a *configmapSecretFlagsAndArgs) ExpandFileSource(fSys filesys.FileSystem) error { func (a *ConfigMapSecretFlagsAndArgs) ExpandFileSource(fSys filesys.FileSystem) error {
var results []string var results []string
for _, pattern := range a.FileSources { for _, pattern := range a.FileSources {
var patterns []string var patterns []string
@@ -94,7 +93,7 @@ func (a *configmapSecretFlagsAndArgs) ExpandFileSource(fSys filesys.FileSystem)
} else { } else {
patterns = append(patterns, s[0]) patterns = append(patterns, s[0])
} }
result, err := util.GlobPatterns(fSys, patterns) result, err := GlobPatterns(fSys, patterns)
if err != nil { if err != nil {
return err return err
} }
@@ -115,7 +114,7 @@ func (a *configmapSecretFlagsAndArgs) ExpandFileSource(fSys filesys.FileSystem)
return nil return nil
} }
func mergeFlagsIntoGeneratorArgs(args *types.GeneratorArgs, flags configmapSecretFlagsAndArgs) { func MergeFlagsIntoGeneratorArgs(args *types.GeneratorArgs, flags ConfigMapSecretFlagsAndArgs) {
if len(flags.LiteralSources) > 0 { if len(flags.LiteralSources) > 0 {
args.LiteralSources = append( args.LiteralSources = append(
args.LiteralSources, flags.LiteralSources...) args.LiteralSources, flags.LiteralSources...)

View File

@@ -1,7 +1,7 @@
// Copyright 2019 The Kubernetes Authors. // Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
package add package util
import ( import (
"reflect" "reflect"
@@ -12,12 +12,12 @@ import (
) )
func TestDataValidation_NoName(t *testing.T) { func TestDataValidation_NoName(t *testing.T) {
fa := configmapSecretFlagsAndArgs{} fa := ConfigMapSecretFlagsAndArgs{}
require.Error(t, fa.Validate([]string{})) require.Error(t, fa.Validate([]string{}))
} }
func TestDataValidation_MoreThanOneName(t *testing.T) { func TestDataValidation_MoreThanOneName(t *testing.T) {
fa := configmapSecretFlagsAndArgs{} fa := ConfigMapSecretFlagsAndArgs{}
require.Error(t, fa.Validate([]string{"name", "othername"})) require.Error(t, fa.Validate([]string{"name", "othername"}))
} }
@@ -25,12 +25,12 @@ func TestDataValidation_MoreThanOneName(t *testing.T) {
func TestDataConfigValidation_Flags(t *testing.T) { func TestDataConfigValidation_Flags(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
fa configmapSecretFlagsAndArgs fa ConfigMapSecretFlagsAndArgs
shouldFail bool shouldFail bool
}{ }{
{ {
name: "env-file-source and literal are both set", name: "env-file-source and literal are both set",
fa: configmapSecretFlagsAndArgs{ fa: ConfigMapSecretFlagsAndArgs{
LiteralSources: []string{"one", "two"}, LiteralSources: []string{"one", "two"},
EnvFileSource: "three", EnvFileSource: "three",
}, },
@@ -38,7 +38,7 @@ func TestDataConfigValidation_Flags(t *testing.T) {
}, },
{ {
name: "env-file-source and from-file are both set", name: "env-file-source and from-file are both set",
fa: configmapSecretFlagsAndArgs{ fa: ConfigMapSecretFlagsAndArgs{
FileSources: []string{"one", "two"}, FileSources: []string{"one", "two"},
EnvFileSource: "three", EnvFileSource: "three",
}, },
@@ -46,12 +46,12 @@ func TestDataConfigValidation_Flags(t *testing.T) {
}, },
{ {
name: "we don't have any option set", name: "we don't have any option set",
fa: configmapSecretFlagsAndArgs{}, fa: ConfigMapSecretFlagsAndArgs{},
shouldFail: true, shouldFail: true,
}, },
{ {
name: "we have from-file and literal ", name: "we have from-file and literal ",
fa: configmapSecretFlagsAndArgs{ fa: ConfigMapSecretFlagsAndArgs{
LiteralSources: []string{"one", "two"}, LiteralSources: []string{"one", "two"},
FileSources: []string{"three", "four"}, FileSources: []string{"three", "four"},
}, },
@@ -59,7 +59,7 @@ func TestDataConfigValidation_Flags(t *testing.T) {
}, },
{ {
name: "correct behavior", name: "correct behavior",
fa: configmapSecretFlagsAndArgs{ fa: ConfigMapSecretFlagsAndArgs{
EnvFileSource: "foo", EnvFileSource: "foo",
Behavior: "merge", Behavior: "merge",
}, },
@@ -67,7 +67,7 @@ func TestDataConfigValidation_Flags(t *testing.T) {
}, },
{ {
name: "incorrect behavior", name: "incorrect behavior",
fa: configmapSecretFlagsAndArgs{ fa: ConfigMapSecretFlagsAndArgs{
EnvFileSource: "foo", EnvFileSource: "foo",
Behavior: "merge-unknown", Behavior: "merge-unknown",
}, },
@@ -93,7 +93,7 @@ func TestExpandFileSource(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
_, err = fSys.Create("dir/readme") _, err = fSys.Create("dir/readme")
require.NoError(t, err) require.NoError(t, err)
fa := configmapSecretFlagsAndArgs{ fa := ConfigMapSecretFlagsAndArgs{
FileSources: []string{"dir/fa*"}, FileSources: []string{"dir/fa*"},
} }
err = fa.ExpandFileSource(fSys) err = fa.ExpandFileSource(fSys)
@@ -117,7 +117,7 @@ func TestExpandFileSourceWithKey(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
_, err = fSys.Create("dir/readme") _, err = fSys.Create("dir/readme")
require.NoError(t, err) require.NoError(t, err)
fa := configmapSecretFlagsAndArgs{ fa := ConfigMapSecretFlagsAndArgs{
FileSources: []string{"foo-key=dir/fa*", "bar-key=dir/foobar", "dir/simplebar"}, FileSources: []string{"foo-key=dir/fa*", "bar-key=dir/foobar", "dir/simplebar"},
} }
err = fa.ExpandFileSource(fSys) err = fa.ExpandFileSource(fSys)
@@ -140,7 +140,7 @@ func TestExpandFileSourceWithKeyAndError(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
_, err = fSys.Create("dir/readme") _, err = fSys.Create("dir/readme")
require.NoError(t, err) require.NoError(t, err)
fa := configmapSecretFlagsAndArgs{ fa := ConfigMapSecretFlagsAndArgs{
FileSources: []string{"foo-key=dir/fa*"}, FileSources: []string{"foo-key=dir/fa*"},
} }
err = fa.ExpandFileSource(fSys) err = fa.ExpandFileSource(fSys)