From 3f842e5e92adad0f8237c737ff86a91004f2f318 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Fri, 24 Jul 2020 09:04:11 -0700 Subject: [PATCH] add kustomize edit add component command --- .../commands/edit/add/addcomponent.go | 79 +++++++++++++++++++ .../commands/edit/add/addcomponent_test.go | 76 ++++++++++++++++++ kustomize/internal/commands/edit/add/all.go | 4 + 3 files changed, 159 insertions(+) create mode 100644 kustomize/internal/commands/edit/add/addcomponent.go create mode 100644 kustomize/internal/commands/edit/add/addcomponent_test.go diff --git a/kustomize/internal/commands/edit/add/addcomponent.go b/kustomize/internal/commands/edit/add/addcomponent.go new file mode 100644 index 000000000..b0de4e863 --- /dev/null +++ b/kustomize/internal/commands/edit/add/addcomponent.go @@ -0,0 +1,79 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package add + +import ( + "errors" + "log" + + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/loader" + "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/kustfile" + "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/util" +) + +type addComponentOptions struct { + componentFilePaths []string +} + +// newCmdAddComponent adds the name of a file containing a component to the kustomization file. +func newCmdAddComponent(fSys filesys.FileSystem) *cobra.Command { + var o addComponentOptions + + cmd := &cobra.Command{ + Use: "component", + Short: "Add the name of a file containing a component to the kustomization file.", + Example: ` + add component {filepath}`, + RunE: func(cmd *cobra.Command, args []string) error { + err := o.Validate(args) + if err != nil { + return err + } + return o.RunAddComponent(fSys) + }, + } + return cmd +} + +// Validate validates addComponent command. +func (o *addComponentOptions) Validate(args []string) error { + if len(args) == 0 { + return errors.New("must specify a component file") + } + o.componentFilePaths = args + return nil +} + +// RunAddComponent runs addComponent command (do real work). +func (o *addComponentOptions) RunAddComponent(fSys filesys.FileSystem) error { + components, err := util.GlobPatternsWithLoader(fSys, loader.NewFileLoaderAtCwd(fSys), o.componentFilePaths) + if err != nil { + return err + } + if len(components) == 0 { + return nil + } + + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return err + } + + m, err := mf.Read() + if err != nil { + return err + } + + for _, component := range components { + if kustfile.StringInSlice(component, m.Components) { + log.Printf("component %s already in kustomization file", component) + continue + } + m.Components = append(m.Components, component) + } + + return mf.Write(m) +} diff --git a/kustomize/internal/commands/edit/add/addcomponent_test.go b/kustomize/internal/commands/edit/add/addcomponent_test.go new file mode 100644 index 000000000..3f4c42fba --- /dev/null +++ b/kustomize/internal/commands/edit/add/addcomponent_test.go @@ -0,0 +1,76 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package add + +import ( + "strings" + "testing" + + "sigs.k8s.io/kustomize/api/filesys" + testutils_test "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/testutils" +) + +const ( + componentFileName = "myWonderfulComponent.yaml" + componentFileContent = ` +Lorem ipsum dolor sit amet, consectetur adipiscing elit, +sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +` +) + +func TestAddComponentHappyPath(t *testing.T) { + fSys := filesys.MakeEmptyDirInMemory() + fSys.WriteFile(componentFileName, []byte(componentFileContent)) + fSys.WriteFile(componentFileName+"another", []byte(componentFileContent)) + testutils_test.WriteTestKustomization(fSys) + + cmd := newCmdAddComponent(fSys) + args := []string{componentFileName + "*"} + err := cmd.RunE(cmd, args) + if err != nil { + t.Errorf("unexpected cmd error: %v", err) + } + content, err := testutils_test.ReadTestKustomization(fSys) + if err != nil { + t.Errorf("unexpected read error: %v", err) + } + if !strings.Contains(string(content), componentFileName) { + t.Errorf("expected component name in kustomization") + } + if !strings.Contains(string(content), componentFileName+"another") { + t.Errorf("expected component name in kustomization") + } +} + +func TestAddComponentAlreadyThere(t *testing.T) { + fSys := filesys.MakeFsInMemory() + fSys.WriteFile(componentFileName, []byte(componentFileContent)) + testutils_test.WriteTestKustomization(fSys) + + cmd := newCmdAddComponent(fSys) + args := []string{componentFileName} + err := cmd.RunE(cmd, args) + if err != nil { + t.Fatalf("unexpected cmd error: %v", err) + } + + // adding an existing component doesn't return an error + err = cmd.RunE(cmd, args) + if err != nil { + t.Errorf("unexpected cmd error :%v", err) + } +} + +func TestAddComponentNoArgs(t *testing.T) { + fSys := filesys.MakeFsInMemory() + + cmd := newCmdAddComponent(fSys) + err := cmd.Execute() + if err == nil { + t.Errorf("expected error: %v", err) + } + if err.Error() != "must specify a component file" { + t.Errorf("incorrect error: %v", err.Error()) + } +} diff --git a/kustomize/internal/commands/edit/add/all.go b/kustomize/internal/commands/edit/add/all.go index 477aa3b75..f5190acb5 100644 --- a/kustomize/internal/commands/edit/add/all.go +++ b/kustomize/internal/commands/edit/add/all.go @@ -31,6 +31,9 @@ func NewCmdAdd( # Adds a patch to the kustomization kustomize edit add patch + # Adds a component to the kustomization + kustomize edit add component + # Adds one or more base directories to the kustomization kustomize edit add base kustomize edit add base ,, @@ -46,6 +49,7 @@ func NewCmdAdd( c.AddCommand( newCmdAddResource(fSys), newCmdAddPatch(fSys), + newCmdAddComponent(fSys), newCmdAddSecret(fSys, ldr, kf), newCmdAddConfigMap(fSys, ldr, kf), newCmdAddBase(fSys),