Merge pull request #2757 from phanimarupaka/revert-2738-ListSettersRecursively

Revert "List and set setters in folders recursively"
This commit is contained in:
Jeff Regan
2020-07-22 14:56:26 -07:00
committed by GitHub
9 changed files with 60 additions and 153 deletions

View File

@@ -13,10 +13,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"sigs.k8s.io/kustomize/cmd/config/ext" "sigs.k8s.io/kustomize/cmd/config/ext"
"sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands"
"sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/fieldmeta" "sigs.k8s.io/kustomize/kyaml/fieldmeta"
"sigs.k8s.io/kustomize/kyaml/pathutil"
"sigs.k8s.io/kustomize/kyaml/printutil"
"sigs.k8s.io/kustomize/kyaml/setters" "sigs.k8s.io/kustomize/kyaml/setters"
"sigs.k8s.io/kustomize/kyaml/setters2" "sigs.k8s.io/kustomize/kyaml/setters2"
) )
@@ -66,28 +63,11 @@ func (r *ListSettersRunner) preRunE(c *cobra.Command, args []string) error {
func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error { func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error {
if setterVersion == "v2" { if setterVersion == "v2" {
openAPIFileName, err := ext.GetOpenAPIFile([]string{"."}) if err := r.ListSetters(c, args); err != nil {
if err != nil {
return err
}
openAPIPaths, err := pathutil.SubDirsWithFile(args[0], openAPIFileName)
if err != nil {
return err
}
if len(openAPIPaths) == 0 {
return errors.Errorf("unable to find %s in %s", openAPIFileName, args[0])
}
for _, openAPIPath := range openAPIPaths {
resourcePath := strings.TrimSuffix(openAPIPath, openAPIFileName)
printutil.GreenPrintf(c.OutOrStdout(), "\nsetters in package: %s\n", resourcePath)
if err := r.ListSetters(c, openAPIPath, resourcePath); err != nil {
return err return err
} }
if r.IncludeSubst { if r.IncludeSubst {
if err := r.ListSubstitutions(c, openAPIPath); err != nil { return r.ListSubstitutions(c, args)
return err
}
}
} }
return nil return nil
} }
@@ -95,9 +75,13 @@ func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error {
return handleError(c, lookup(r.Lookup, c, args)) return handleError(c, lookup(r.Lookup, c, args))
} }
func (r *ListSettersRunner) ListSetters(c *cobra.Command, openAPIPath, resourcePath string) error { func (r *ListSettersRunner) ListSetters(c *cobra.Command, args []string) error {
// use setters v2 // use setters v2
if err := r.List.ListSetters(openAPIPath, resourcePath); err != nil { path, err := ext.GetOpenAPIFile(args)
if err != nil {
return err
}
if err := r.List.ListSetters(path, args[0]); err != nil {
return err return err
} }
table := newTable(c.OutOrStdout(), r.Markdown) table := newTable(c.OutOrStdout(), r.Markdown)
@@ -128,13 +112,16 @@ func (r *ListSettersRunner) ListSetters(c *cobra.Command, openAPIPath, resourceP
os.Exit(1) os.Exit(1)
} }
} }
r.List.Setters = r.List.Setters[:0]
return nil return nil
} }
func (r *ListSettersRunner) ListSubstitutions(c *cobra.Command, openAPIPath string) error { func (r *ListSettersRunner) ListSubstitutions(c *cobra.Command, args []string) error {
// use setters v2 // use setters v2
if err := r.List.ListSubst(openAPIPath); err != nil { path, err := ext.GetOpenAPIFile(args)
if err != nil {
return err
}
if err := r.List.ListSubst(path); err != nil {
return err return err
} }
table := newTable(c.OutOrStdout(), r.Markdown) table := newTable(c.OutOrStdout(), r.Markdown)
@@ -160,7 +147,6 @@ func (r *ListSettersRunner) ListSubstitutions(c *cobra.Command, openAPIPath stri
return nil return nil
} }
table.Render() table.Render()
r.List.Substitutions = r.List.Substitutions[:0]
return nil return nil
} }

View File

@@ -7,11 +7,11 @@ import (
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath"
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sigs.k8s.io/kustomize/cmd/config/ext"
"sigs.k8s.io/kustomize/cmd/config/internal/commands" "sigs.k8s.io/kustomize/cmd/config/internal/commands"
"sigs.k8s.io/kustomize/kyaml/openapi" "sigs.k8s.io/kustomize/kyaml/openapi"
) )
@@ -408,19 +408,27 @@ openAPI:
openapi.ResetOpenAPI() openapi.ResetOpenAPI()
defer openapi.ResetOpenAPI() defer openapi.ResetOpenAPI()
dir, err := ioutil.TempDir("", "") f, err := ioutil.TempFile("", "k8s-cli-")
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
defer os.Remove(f.Name())
defer os.RemoveAll(dir) old := ext.GetOpenAPIFile
defer func() { ext.GetOpenAPIFile = old }()
err = ioutil.WriteFile(filepath.Join(dir, "Krmfile"), []byte(test.openapi), 0600) ext.GetOpenAPIFile = func(args []string) (s string, err error) {
err = ioutil.WriteFile(f.Name(), []byte(test.openapi), 0600)
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
return f.Name(), nil
}
err = ioutil.WriteFile(filepath.Join(dir, "deployment.yaml"), []byte(test.input), 0600) r, err := ioutil.TempFile("", "k8s-cli-*.yaml")
if !assert.NoError(t, err) {
t.FailNow()
}
defer os.Remove(r.Name())
err = ioutil.WriteFile(r.Name(), []byte(test.input), 0600)
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
@@ -428,18 +436,18 @@ openAPI:
runner := commands.NewListSettersRunner("") runner := commands.NewListSettersRunner("")
actual := &bytes.Buffer{} actual := &bytes.Buffer{}
runner.Command.SetOut(actual) runner.Command.SetOut(actual)
runner.Command.SetArgs(append([]string{dir}, test.args...)) runner.Command.SetArgs(append([]string{r.Name()}, test.args...))
err = runner.Command.Execute() err = runner.Command.Execute()
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
if !assert.Contains(t, actual.String(), test.expected) { if !assert.Equal(t, test.expected, actual.String()) {
t.FailNow() t.FailNow()
} }
// make sure that the resources are not altered // make sure that the resources are not altered
actualResources, err := ioutil.ReadFile(filepath.Join(dir, "deployment.yaml")) actualResources, err := ioutil.ReadFile(r.Name())
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
@@ -449,7 +457,7 @@ openAPI:
t.FailNow() t.FailNow()
} }
actualOpenAPI, err := ioutil.ReadFile(filepath.Join(dir, "Krmfile")) actualOpenAPI, err := ioutil.ReadFile(f.Name())
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }

View File

@@ -6,7 +6,6 @@ package commands
import ( import (
"fmt" "fmt"
"os" "os"
"strings"
"github.com/olekukonko/tablewriter" "github.com/olekukonko/tablewriter"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -14,10 +13,7 @@ import (
"sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands"
"sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/pathutil"
"sigs.k8s.io/kustomize/kyaml/printutil"
"sigs.k8s.io/kustomize/kyaml/setters" "sigs.k8s.io/kustomize/kyaml/setters"
"sigs.k8s.io/kustomize/kyaml/setters2"
"sigs.k8s.io/kustomize/kyaml/setters2/settersutil" "sigs.k8s.io/kustomize/kyaml/setters2/settersutil"
) )
@@ -136,27 +132,9 @@ func (r *SetRunner) preRunE(c *cobra.Command, args []string) error {
func (r *SetRunner) runE(c *cobra.Command, args []string) error { func (r *SetRunner) runE(c *cobra.Command, args []string) error {
if setterVersion == "v2" { if setterVersion == "v2" {
openAPIFileName, err := ext.GetOpenAPIFile([]string{"."}) count, err := r.Set.Set(r.OpenAPIFile, args[0])
if err != nil { fmt.Fprintf(c.OutOrStdout(), "set %d fields\n", count)
return err return handleError(c, err)
}
openAPIPaths, err := pathutil.SubDirsWithFile(args[0], openAPIFileName)
if err != nil {
return err
}
if len(openAPIPaths) == 0 {
return errors.Errorf("unable to find %s in %s", openAPIFileName, args[0])
}
for _, openAPIPath := range openAPIPaths {
resourcePath := strings.TrimSuffix(openAPIPath, openAPIFileName)
fmt.Fprintf(c.OutOrStdout(), "\nfinding %s setter in package %s\n", r.Set.Name, resourcePath)
count, err := r.Set.Set(openAPIPath, resourcePath)
if setErr := handleSetError(c, err); setErr != nil {
return setErr
}
fmt.Fprintf(c.OutOrStdout(), "set %d fields in package %s\n", count, resourcePath)
}
return nil
} }
if len(args) > 2 || c.Flag("values").Changed { if len(args) > 2 || c.Flag("values").Changed {
return handleError(c, r.perform(c, args)) return handleError(c, r.perform(c, args))
@@ -164,17 +142,6 @@ func (r *SetRunner) runE(c *cobra.Command, args []string) error {
return handleError(c, lookup(r.Lookup, c, args)) return handleError(c, lookup(r.Lookup, c, args))
} }
func handleSetError(c *cobra.Command, err error) error {
if err == nil {
return nil
}
if strings.Contains(err.Error(), setters2.SetterNotFoundWarn) {
printutil.WarnPrintf(c.OutOrStdout(), "%s\n", err.Error())
return nil
}
return handleError(c, err)
}
func lookup(l setters.LookupSetters, c *cobra.Command, args []string) error { func lookup(l setters.LookupSetters, c *cobra.Command, args []string) error {
// lookup the setters // lookup the setters
err := kio.Pipeline{ err := kio.Pipeline{

View File

@@ -7,11 +7,11 @@ import (
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath"
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"sigs.k8s.io/kustomize/cmd/config/ext"
"sigs.k8s.io/kustomize/cmd/config/internal/commands" "sigs.k8s.io/kustomize/cmd/config/internal/commands"
"sigs.k8s.io/kustomize/kyaml/openapi" "sigs.k8s.io/kustomize/kyaml/openapi"
) )
@@ -1013,19 +1013,27 @@ spec:
openapi.ResetOpenAPI() openapi.ResetOpenAPI()
defer openapi.ResetOpenAPI() defer openapi.ResetOpenAPI()
dir, err := ioutil.TempDir("", "") f, err := ioutil.TempFile("", "k8s-cli-")
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
defer os.Remove(f.Name())
defer os.RemoveAll(dir) err = ioutil.WriteFile(f.Name(), []byte(test.inputOpenAPI), 0600)
err = ioutil.WriteFile(filepath.Join(dir, "Krmfile"), []byte(test.inputOpenAPI), 0600)
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
old := ext.GetOpenAPIFile
defer func() { ext.GetOpenAPIFile = old }()
ext.GetOpenAPIFile = func(args []string) (s string, err error) {
return f.Name(), nil
}
err = ioutil.WriteFile(filepath.Join(dir, "deployment.yaml"), []byte(test.input), 0600) r, err := ioutil.TempFile("", "k8s-cli-*.yaml")
if !assert.NoError(t, err) {
t.FailNow()
}
defer os.Remove(r.Name())
err = ioutil.WriteFile(r.Name(), []byte(test.input), 0600)
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
@@ -1033,7 +1041,7 @@ spec:
runner := commands.NewSetRunner("") runner := commands.NewSetRunner("")
out := &bytes.Buffer{} out := &bytes.Buffer{}
runner.Command.SetOut(out) runner.Command.SetOut(out)
runner.Command.SetArgs(append([]string{dir}, test.args...)) runner.Command.SetArgs(append([]string{r.Name()}, test.args...))
err = runner.Command.Execute() err = runner.Command.Execute()
if test.errMsg != "" { if test.errMsg != "" {
if !assert.NotNil(t, err) { if !assert.NotNil(t, err) {
@@ -1048,11 +1056,11 @@ spec:
t.FailNow() t.FailNow()
} }
if test.errMsg == "" && !assert.Contains(t, out.String(), strings.Trim(test.out, "\n")) { if test.errMsg == "" && !assert.Equal(t, test.out, out.String()) {
t.FailNow() t.FailNow()
} }
actualResources, err := ioutil.ReadFile(filepath.Join(dir, "deployment.yaml")) actualResources, err := ioutil.ReadFile(r.Name())
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
@@ -1062,7 +1070,7 @@ spec:
t.FailNow() t.FailNow()
} }
actualOpenAPI, err := ioutil.ReadFile(filepath.Join(dir, "Krmfile")) actualOpenAPI, err := ioutil.ReadFile(f.Name())
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }

View File

@@ -34,9 +34,7 @@ openAPI:
`, `,
}, },
expectedStdOut: ` expectedStdOut: `
 NAME VALUE SET BY DESCRIPTION COUNT REQUIRED
setters in package: [./]
 NAME VALUE SET BY DESCRIPTION COUNT REQUIRED
replicas 3 1 No replicas 3 1 No
`, `,
}, },

View File

@@ -1,35 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package pathutil
import (
"os"
"path/filepath"
"strings"
"sigs.k8s.io/kustomize/kyaml/errors"
)
// SubDirsWithFile takes the root directory path and returns all the paths of
// sub-directories which contain file with input fileName including itself
func SubDirsWithFile(root, fileName string) ([]string, error) {
var res []string
err := filepath.Walk(root,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if strings.HasSuffix(path, fileName) {
if root == "." {
path = root + "/" + path
}
res = append(res, path)
}
return nil
})
if err != nil {
return res, errors.Wrap(err)
}
return res, nil
}

View File

@@ -1,23 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package printutil
import (
"fmt"
"io"
)
// GreenPrintf formats according to a format specifier and prints the resulting string
// in green color to the writer
func GreenPrintf(w io.Writer, format string, args ...string) {
msg := fmt.Sprintf(format, args)
fmt.Fprintf(w, "\033[1;32m%s\033[0m", msg)
}
// WarnPrintf formats according to a format specifier and prints the resulting string
// in yellow color to the writer
func WarnPrintf(w io.Writer, format string, args ...string) {
msg := fmt.Sprintf(format, args)
fmt.Fprintf(w, "\033[1;33m%s\033[0m", msg)
}

View File

@@ -34,8 +34,6 @@ type Set struct {
SetAll bool SetAll bool
} }
const SetterNotFoundWarn = "unable to find setter with name "
// Filter implements Set as a yaml.Filter // Filter implements Set as a yaml.Filter
func (s *Set) Filter(object *yaml.RNode) (*yaml.RNode, error) { func (s *Set) Filter(object *yaml.RNode) (*yaml.RNode, error) {
return object, accept(s, object) return object, accept(s, object)
@@ -330,14 +328,14 @@ func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) {
return nil, err return nil, err
} }
if oa == nil { if oa == nil {
return nil, errors.Errorf(SetterNotFoundWarn + s.Name) return nil, errors.Errorf("no setter %s found", s.Name)
} }
def, err := oa.Pipe(yaml.Lookup("x-k8s-cli", "setter")) def, err := oa.Pipe(yaml.Lookup("x-k8s-cli", "setter"))
if err != nil { if err != nil {
return nil, err return nil, err
} }
if def == nil { if def == nil {
return nil, errors.Errorf(SetterNotFoundWarn + s.Name) return nil, errors.Errorf("no setter %s found", s.Name)
} }
// record the OpenAPI type for the setter // record the OpenAPI type for the setter

View File

@@ -1209,7 +1209,7 @@ openAPI:
{ {
name: "error", name: "error",
setter: "replicas", setter: "replicas",
err: "unable to find setter with name replicas", err: "no setter replicas found",
input: ` input: `
openAPI: openAPI:
definitions: definitions: