From a1dcf3386b924a600274d6e40e7aed27e936ebd3 Mon Sep 17 00:00:00 2001 From: guineveresaenger Date: Fri, 8 Jun 2018 15:51:57 -0700 Subject: [PATCH 1/2] Adds kustomize edit add base command This pull request adds support for editing the kustomization.yaml in the current directory with a base. --- pkg/commands/addbase.go | 95 ++++++++++++++++++++++++++++++++++++ pkg/commands/addbase_test.go | 85 ++++++++++++++++++++++++++++++++ pkg/commands/commands.go | 6 ++- 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 pkg/commands/addbase.go create mode 100644 pkg/commands/addbase_test.go diff --git a/pkg/commands/addbase.go b/pkg/commands/addbase.go new file mode 100644 index 000000000..f7486be11 --- /dev/null +++ b/pkg/commands/addbase.go @@ -0,0 +1,95 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package commands + +import ( + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/kubernetes-sigs/kustomize/pkg/constants" + "github.com/kubernetes-sigs/kustomize/pkg/fs" +) + +type addBaseOptions struct { + baseDirectoryPath string +} + +// newCmdAddBase adds the file path of the kustomize base to the kustomization file. +func newCmdAddBase(fsys fs.FileSystem) *cobra.Command { + var o addBaseOptions + + cmd := &cobra.Command{ + Use: "base", + Short: "Adds a directory path to a base kustomization to the current directory's kustomization file.", + Example: ` + add base {filepath}`, + RunE: func(cmd *cobra.Command, args []string) error { + err := o.Validate(args) + if err != nil { + return err + } + err = o.Complete(cmd, args) + if err != nil { + return err + } + return o.RunAddBase(fsys) + }, + } + return cmd +} + +// Validate validates addBase command. +func (o *addBaseOptions) Validate(args []string) error { + if len(args) != 1 { + return errors.New("must specify a base directory") + } + o.baseDirectoryPath = args[0] + return nil +} + +// Complete completes addBase command. +func (o *addBaseOptions) Complete(cmd *cobra.Command, args []string) error { + return nil +} + +// RunAddBase runs addBase command (do real work). +func (o *addBaseOptions) RunAddBase(fsys fs.FileSystem) error { + _, err := fsys.Stat(o.baseDirectoryPath) + if err != nil { + return err + } + + mf, err := newKustomizationFile(constants.KustomizationFileName, fsys) + if err != nil { + return err + } + + m, err := mf.read() + if err != nil { + return err + } + + if stringInSlice(o.baseDirectoryPath, m.Bases) { + return fmt.Errorf("base %s already in kustomization file", o.baseDirectoryPath) + } + + m.Bases = append(m.Bases, o.baseDirectoryPath) + + return mf.write(m) +} diff --git a/pkg/commands/addbase_test.go b/pkg/commands/addbase_test.go new file mode 100644 index 000000000..e9cab2b5d --- /dev/null +++ b/pkg/commands/addbase_test.go @@ -0,0 +1,85 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package commands + +import ( + "testing" + + "strings" + + "github.com/kubernetes-sigs/kustomize/pkg/constants" + "github.com/kubernetes-sigs/kustomize/pkg/fs" +) + +const ( + baseDirectoryPath = "my/path/to/wonderful/base" +) + +func TestAddBaseHappyPath(t *testing.T) { + fakeFS := fs.MakeFakeFS() + fakeFS.Mkdir(baseDirectoryPath, 0777) + fakeFS.WriteFile(constants.KustomizationFileName, []byte(kustomizationContent)) + + cmd := newCmdAddBase(fakeFS) + args := []string{baseDirectoryPath} + err := cmd.RunE(cmd, args) + if err != nil { + t.Errorf("unexpected cmd error: %v", err) + } + content, err := fakeFS.ReadFile(constants.KustomizationFileName) + if err != nil { + t.Errorf("unexpected read error: %v", err) + } + if !strings.Contains(string(content), baseDirectoryPath) { + t.Errorf("expected patch name in kustomization") + } +} + +func TestAddBaseAlreadyThere(t *testing.T) { + fakeFS := fs.MakeFakeFS() + // Create fake directory + fakeFS.Mkdir(baseDirectoryPath, 0777) + fakeFS.WriteFile(constants.KustomizationFileName, []byte(kustomizationContent)) + + cmd := newCmdAddBase(fakeFS) + args := []string{baseDirectoryPath} + err := cmd.RunE(cmd, args) + if err != nil { + t.Fatalf("unexpected cmd error: %v", err) + } + // adding an existing base should return an error + err = cmd.RunE(cmd, args) + if err == nil { + t.Errorf("expected already there problem") + } + if err.Error() != "base "+baseDirectoryPath+" already in kustomization file" { + t.Errorf("unexpected error %v", err) + } +} + +func TestAddBaseNoArgs(t *testing.T) { + fakeFS := fs.MakeFakeFS() + + cmd := newCmdAddBase(fakeFS) + err := cmd.Execute() + if err == nil { + t.Errorf("expected error: %v", err) + } + if err.Error() != "must specify a base directory" { + t.Errorf("incorrect error: %v", err.Error()) + } +} diff --git a/pkg/commands/commands.go b/pkg/commands/commands.go index 1405e668e..b0a1ccdca 100644 --- a/pkg/commands/commands.go +++ b/pkg/commands/commands.go @@ -81,7 +81,7 @@ func newCmdEdit(fsys fs.FileSystem) *cobra.Command { func newCmdAdd(fsys fs.FileSystem) *cobra.Command { c := &cobra.Command{ Use: "add", - Short: "Adds configmap/resource/patch to the kustomization file.", + Short: "Adds configmap/resource/patch/base to the kustomization file.", Long: "", Example: ` # Adds a configmap to the kustomization file @@ -92,6 +92,9 @@ func newCmdAdd(fsys fs.FileSystem) *cobra.Command { # Adds a patch to the kustomization kustomize edit add patch + + # Adds a base directory to the kustomization + kustomize edit add base `, Args: cobra.MinimumNArgs(1), } @@ -99,6 +102,7 @@ func newCmdAdd(fsys fs.FileSystem) *cobra.Command { newCmdAddResource(fsys), newCmdAddPatch(fsys), newCmdAddConfigMap(fsys), + newCmdAddBase(fsys), ) return c } From 37489ec2e906fb69056c67958331480c229dbf7d Mon Sep 17 00:00:00 2001 From: guineveresaenger Date: Tue, 19 Jun 2018 17:00:25 -0700 Subject: [PATCH 2/2] Adds ability to add multiple base directories to kustomization --- pkg/commands/addbase.go | 32 +++++++++++++++++-------------- pkg/commands/addbase_test.go | 37 +++++++++++++++++++++++++----------- pkg/commands/commands.go | 3 ++- 3 files changed, 46 insertions(+), 26 deletions(-) diff --git a/pkg/commands/addbase.go b/pkg/commands/addbase.go index f7486be11..deca221c5 100644 --- a/pkg/commands/addbase.go +++ b/pkg/commands/addbase.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package commands import ( "errors" "fmt" + "strings" "github.com/spf13/cobra" @@ -27,7 +28,7 @@ import ( ) type addBaseOptions struct { - baseDirectoryPath string + baseDirectoryPaths string } // newCmdAddBase adds the file path of the kustomize base to the kustomization file. @@ -36,9 +37,9 @@ func newCmdAddBase(fsys fs.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "base", - Short: "Adds a directory path to a base kustomization to the current directory's kustomization file.", + Short: "Adds one or more bases to the kustomization.yaml in current directory", Example: ` - add base {filepath}`, + add base {filepath1},{filepath2}`, RunE: func(cmd *cobra.Command, args []string) error { err := o.Validate(args) if err != nil { @@ -59,7 +60,7 @@ func (o *addBaseOptions) Validate(args []string) error { if len(args) != 1 { return errors.New("must specify a base directory") } - o.baseDirectoryPath = args[0] + o.baseDirectoryPaths = args[0] return nil } @@ -70,11 +71,6 @@ func (o *addBaseOptions) Complete(cmd *cobra.Command, args []string) error { // RunAddBase runs addBase command (do real work). func (o *addBaseOptions) RunAddBase(fsys fs.FileSystem) error { - _, err := fsys.Stat(o.baseDirectoryPath) - if err != nil { - return err - } - mf, err := newKustomizationFile(constants.KustomizationFileName, fsys) if err != nil { return err @@ -85,11 +81,19 @@ func (o *addBaseOptions) RunAddBase(fsys fs.FileSystem) error { return err } - if stringInSlice(o.baseDirectoryPath, m.Bases) { - return fmt.Errorf("base %s already in kustomization file", o.baseDirectoryPath) - } + // split directory paths + paths := strings.Split(o.baseDirectoryPaths, ",") + for _, path := range paths { + _, err := fsys.Stat(path) + if err != nil { + return err + } + if stringInSlice(path, m.Bases) { + return fmt.Errorf("base %s already in kustomization file", path) + } + m.Bases = append(m.Bases, path) - m.Bases = append(m.Bases, o.baseDirectoryPath) + } return mf.write(m) } diff --git a/pkg/commands/addbase_test.go b/pkg/commands/addbase_test.go index e9cab2b5d..17dadd7df 100644 --- a/pkg/commands/addbase_test.go +++ b/pkg/commands/addbase_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,16 +26,19 @@ import ( ) const ( - baseDirectoryPath = "my/path/to/wonderful/base" + baseDirectoryPaths = "my/path/to/wonderful/base,other/path/to/even/more/wonderful/base" ) func TestAddBaseHappyPath(t *testing.T) { fakeFS := fs.MakeFakeFS() - fakeFS.Mkdir(baseDirectoryPath, 0777) + bases := strings.Split(baseDirectoryPaths, ",") + for _, base := range bases { + fakeFS.Mkdir(base, 0777) + } fakeFS.WriteFile(constants.KustomizationFileName, []byte(kustomizationContent)) cmd := newCmdAddBase(fakeFS) - args := []string{baseDirectoryPath} + args := []string{baseDirectoryPaths} err := cmd.RunE(cmd, args) if err != nil { t.Errorf("unexpected cmd error: %v", err) @@ -44,19 +47,25 @@ func TestAddBaseHappyPath(t *testing.T) { if err != nil { t.Errorf("unexpected read error: %v", err) } - if !strings.Contains(string(content), baseDirectoryPath) { - t.Errorf("expected patch name in kustomization") + + for _, base := range bases { + if !strings.Contains(string(content), base) { + t.Errorf("expected base name in kustomization") + } } } func TestAddBaseAlreadyThere(t *testing.T) { fakeFS := fs.MakeFakeFS() - // Create fake directory - fakeFS.Mkdir(baseDirectoryPath, 0777) + // Create fake directories + bases := strings.Split(baseDirectoryPaths, ",") + for _, base := range bases { + fakeFS.Mkdir(base, 0777) + } fakeFS.WriteFile(constants.KustomizationFileName, []byte(kustomizationContent)) cmd := newCmdAddBase(fakeFS) - args := []string{baseDirectoryPath} + args := []string{baseDirectoryPaths} err := cmd.RunE(cmd, args) if err != nil { t.Fatalf("unexpected cmd error: %v", err) @@ -66,9 +75,15 @@ func TestAddBaseAlreadyThere(t *testing.T) { if err == nil { t.Errorf("expected already there problem") } - if err.Error() != "base "+baseDirectoryPath+" already in kustomization file" { - t.Errorf("unexpected error %v", err) + var expectedErrors []string + for _, base := range bases { + error := "base " + base + " already in kustomization file" + expectedErrors = append(expectedErrors, error) + if !stringInSlice(error, expectedErrors) { + t.Errorf("unexpected error %v", err) + } } + } func TestAddBaseNoArgs(t *testing.T) { diff --git a/pkg/commands/commands.go b/pkg/commands/commands.go index b0a1ccdca..9c7b2c36e 100644 --- a/pkg/commands/commands.go +++ b/pkg/commands/commands.go @@ -93,8 +93,9 @@ func newCmdAdd(fsys fs.FileSystem) *cobra.Command { # Adds a patch to the kustomization kustomize edit add patch - # Adds a base directory to the kustomization + # Adds one or more base directories to the kustomization kustomize edit add base + kustomize edit add base ,, `, Args: cobra.MinimumNArgs(1), }