mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-11 17:12:51 +00:00
Merge pull request #2769 from kzwang/add-component
add kustomize edit add component command
This commit is contained in:
79
kustomize/internal/commands/edit/add/addcomponent.go
Normal file
79
kustomize/internal/commands/edit/add/addcomponent.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
76
kustomize/internal/commands/edit/add/addcomponent_test.go
Normal file
76
kustomize/internal/commands/edit/add/addcomponent_test.go
Normal file
@@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,6 +31,9 @@ func NewCmdAdd(
|
|||||||
# Adds a patch to the kustomization
|
# Adds a patch to the kustomization
|
||||||
kustomize edit add patch <filepath>
|
kustomize edit add patch <filepath>
|
||||||
|
|
||||||
|
# Adds a component to the kustomization
|
||||||
|
kustomize edit add component <filepath>
|
||||||
|
|
||||||
# Adds one or more base directories to the kustomization
|
# Adds one or more base directories to the kustomization
|
||||||
kustomize edit add base <filepath>
|
kustomize edit add base <filepath>
|
||||||
kustomize edit add base <filepath1>,<filepath2>,<filepath3>
|
kustomize edit add base <filepath1>,<filepath2>,<filepath3>
|
||||||
@@ -46,6 +49,7 @@ func NewCmdAdd(
|
|||||||
c.AddCommand(
|
c.AddCommand(
|
||||||
newCmdAddResource(fSys),
|
newCmdAddResource(fSys),
|
||||||
newCmdAddPatch(fSys),
|
newCmdAddPatch(fSys),
|
||||||
|
newCmdAddComponent(fSys),
|
||||||
newCmdAddSecret(fSys, ldr, kf),
|
newCmdAddSecret(fSys, ldr, kf),
|
||||||
newCmdAddConfigMap(fSys, ldr, kf),
|
newCmdAddConfigMap(fSys, ldr, kf),
|
||||||
newCmdAddBase(fSys),
|
newCmdAddBase(fSys),
|
||||||
|
|||||||
Reference in New Issue
Block a user