Delete v1 setters code

This commit is contained in:
Phani Teja Marupaka
2020-11-12 15:29:07 -08:00
parent eddd872eca
commit 2278e01b7f
12 changed files with 100 additions and 852 deletions

View File

@@ -17,8 +17,6 @@ import (
"sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands"
"sigs.k8s.io/kustomize/cmd/config/runner" "sigs.k8s.io/kustomize/cmd/config/runner"
"sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/setters"
"sigs.k8s.io/kustomize/kyaml/setters2/settersutil" "sigs.k8s.io/kustomize/kyaml/setters2/settersutil"
) )
@@ -34,34 +32,23 @@ func NewCreateSetterRunner(parent string) *CreateSetterRunner {
PreRunE: r.preRunE, PreRunE: r.preRunE,
RunE: r.runE, RunE: r.runE,
} }
set.Flags().StringVar(&r.Set.SetPartialField.Setter.Value, "value", "", set.Flags().StringVar(&r.FieldValue, "value", "",
"optional flag, alternative to specifying the value as an argument. e.g. used to specify values that start with '-'") "optional flag, alternative to specifying the value as an argument. e.g. used to specify values that start with '-'")
set.Flags().StringVar(&r.Set.SetPartialField.SetBy, "set-by", "", set.Flags().StringVar(&r.SetBy, "set-by", "",
"record who the field was default by.") "record who the field was default by.")
set.Flags().StringVar(&r.Set.SetPartialField.Description, "description", "", set.Flags().StringVar(&r.Description, "description", "",
"record a description for the current setter value.") "record a description for the current setter value.")
set.Flags().StringVar(&r.Set.SetPartialField.Field, "field", "", set.Flags().StringVar(&r.FieldName, "field", "",
"name of the field to set, a suffix of the path to the field, or the full"+ "name of the field to set, a suffix of the path to the field, or the full"+
" path to the field. Default is to match all fields.") " path to the field. Default is to match all fields.")
set.Flags().StringVar(&r.Set.ResourceMeta.Name, "name", "", set.Flags().StringVar(&r.Type, "type", "",
"name of the Resource on which to create the setter.")
set.Flags().MarkHidden("name")
set.Flags().StringVar(&r.Set.ResourceMeta.Kind, "kind", "",
"kind of the Resource on which to create the setter.")
set.Flags().MarkHidden("kind")
set.Flags().StringVar(&r.Set.SetPartialField.Type, "type", "",
"OpenAPI field type for the setter -- e.g. integer,boolean,string.") "OpenAPI field type for the setter -- e.g. integer,boolean,string.")
set.Flags().BoolVar(&r.Set.SetPartialField.Partial, "partial", false, set.Flags().BoolVar(&r.Required, "required", false,
"create a partial setter for only part of the field value.")
set.Flags().MarkHidden("partial")
set.Flags().StringVar(&setterVersion, "version", "",
"use this version of the setter format")
set.Flags().BoolVar(&r.CreateSetter.Required, "required", false,
"indicates that this setter must be set by package consumer before live apply/preview") "indicates that this setter must be set by package consumer before live apply/preview")
set.Flags().StringVar(&r.SchemaPath, "schema-path", "", set.Flags().StringVar(&r.SchemaPath, "schema-path", "",
`openAPI schema file path for setter constraints -- file content `+ `openAPI schema file path for setter constraints -- file content `+
`e.g. {"type": "string", "maxLength": 15, "enum": ["allowedValue1", "allowedValue2"]}`) `e.g. {"type": "string", "maxLength": 15, "enum": ["allowedValue1", "allowedValue2"]}`)
set.Flags().BoolVarP(&r.CreateSetter.RecurseSubPackages, "recurse-subpackages", "R", false, set.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false,
"creates setter recursively in all the nested subpackages") "creates setter recursively in all the nested subpackages")
set.Flags().MarkHidden("version") set.Flags().MarkHidden("version")
runner.FixDocs(parent, set) runner.FixDocs(parent, set)
@@ -75,10 +62,18 @@ func CreateSetterCommand(parent string) *cobra.Command {
type CreateSetterRunner struct { type CreateSetterRunner struct {
Command *cobra.Command Command *cobra.Command
Set setters.CreateSetter
CreateSetter settersutil.SetterCreator CreateSetter settersutil.SetterCreator
OpenAPIFile string OpenAPIFile string
SchemaPath string SchemaPath string
FieldValue string
SetBy string
Description string
SetterName string
Type string
FieldName string
Schema string
Required bool
RecurseSubPackages bool
} }
func (r *CreateSetterRunner) runE(c *cobra.Command, args []string) error { func (r *CreateSetterRunner) runE(c *cobra.Command, args []string) error {
@@ -86,50 +81,31 @@ func (r *CreateSetterRunner) runE(c *cobra.Command, args []string) error {
} }
func (r *CreateSetterRunner) preRunE(c *cobra.Command, args []string) error { func (r *CreateSetterRunner) preRunE(c *cobra.Command, args []string) error {
valueSetFromFlag := c.Flag("value").Changed
var err error var err error
r.Set.SetPartialField.Setter.Name = args[1] r.SetterName = args[1]
r.CreateSetter.Name = args[1] if len(args) > 2 {
if valueSetFromFlag { r.FieldValue = args[2]
r.CreateSetter.FieldValue = r.Set.SetPartialField.Setter.Value
} else if len(args) > 2 {
r.Set.SetPartialField.Setter.Value = args[2]
r.CreateSetter.FieldValue = args[2]
} }
r.CreateSetter.FieldName, err = c.Flags().GetString("field") r.FieldName, err = c.Flags().GetString("field")
if err != nil { if err != nil {
return err return err
} }
if setterVersion == "" { if r.Type != "array" && !c.Flag("value").Changed && len(args) < 3 {
if len(args) == 2 && r.Set.SetPartialField.Type == "array" && c.Flag("field").Changed {
setterVersion = "v2"
} else if err := initSetterVersion(c, args); err != nil {
return err
}
}
if r.Set.SetPartialField.Type != "array" && !c.Flag("value").Changed && len(args) < 3 {
return errors.Errorf("setter name and value must be provided, " + return errors.Errorf("setter name and value must be provided, " +
"value can either be an argument or can be passed as a flag --value") "value can either be an argument or can be passed as a flag --value")
} }
if setterVersion == "v2" {
r.CreateSetter.Description = r.Set.SetPartialField.Description
r.CreateSetter.SetBy = r.Set.SetPartialField.SetBy
r.CreateSetter.Type = r.Set.SetPartialField.Type
err = r.processSchema() err = r.processSchema()
if err != nil { if err != nil {
return err return err
} }
if r.CreateSetter.Type == "array" { if r.Type == "array" {
if !c.Flag("field").Changed { if !c.Flag("field").Changed {
return errors.Errorf("field flag must be set for array type setters") return errors.Errorf("field flag must be set for array type setters")
} }
} }
}
return nil return nil
} }
@@ -139,7 +115,7 @@ func (r *CreateSetterRunner) processSchema() error {
return err return err
} }
flagType := r.CreateSetter.Type flagType := r.Type
var schemaType string var schemaType string
switch { switch {
// json schema allows more than one type to be specified, but openapi // json schema allows more than one type to be specified, but openapi
@@ -156,13 +132,13 @@ func (r *CreateSetterRunner) processSchema() error {
// are both set with different values, we return an error. // are both set with different values, we return an error.
switch { switch {
case flagType == "" && schemaType != "": case flagType == "" && schemaType != "":
r.CreateSetter.Type = schemaType r.Type = schemaType
case flagType != "" && schemaType == "": case flagType != "" && schemaType == "":
sc.Type = []string{flagType} sc.Type = []string{flagType}
case flagType != "" && schemaType != "": case flagType != "" && schemaType != "":
if flagType != schemaType { if flagType != schemaType {
return errors.Errorf("type provided in type flag (%s) and in schema (%s) doesn't match", return errors.Errorf("type provided in type flag (%s) and in schema (%s) doesn't match",
r.CreateSetter.Type, sc.Type[0]) r.Type, sc.Type[0])
} }
} }
@@ -174,17 +150,16 @@ func (r *CreateSetterRunner) processSchema() error {
if err != nil { if err != nil {
return errors.Errorf("error marshalling schema: %v", err) return errors.Errorf("error marshalling schema: %v", err)
} }
r.CreateSetter.Schema = string(b) r.Schema = string(b)
return nil return nil
} }
func (r *CreateSetterRunner) createSetter(c *cobra.Command, args []string) error { func (r *CreateSetterRunner) createSetter(c *cobra.Command, args []string) error {
if setterVersion == "v2" {
e := runner.ExecuteCmdOnPkgs{ e := runner.ExecuteCmdOnPkgs{
NeedOpenAPI: true, NeedOpenAPI: true,
Writer: c.OutOrStdout(), Writer: c.OutOrStdout(),
RootPkgPath: args[0], RootPkgPath: args[0],
RecurseSubPackages: r.CreateSetter.RecurseSubPackages, RecurseSubPackages: r.RecurseSubPackages,
CmdRunner: r, CmdRunner: r,
} }
err := e.Execute() err := e.Execute()
@@ -194,28 +169,17 @@ func (r *CreateSetterRunner) createSetter(c *cobra.Command, args []string) error
return nil return nil
} }
rw := &kio.LocalPackageReadWriter{PackagePath: args[0]}
err := kio.Pipeline{
Inputs: []kio.Reader{rw},
Filters: []kio.Filter{&r.Set},
Outputs: []kio.Writer{rw}}.Execute()
if err != nil {
return err
}
return nil
}
func (r *CreateSetterRunner) ExecuteCmd(w io.Writer, pkgPath string) error { func (r *CreateSetterRunner) ExecuteCmd(w io.Writer, pkgPath string) error {
r.CreateSetter = settersutil.SetterCreator{ r.CreateSetter = settersutil.SetterCreator{
Name: r.CreateSetter.Name, Name: r.SetterName,
SetBy: r.CreateSetter.SetBy, SetBy: r.SetBy,
Description: r.CreateSetter.Description, Description: r.Description,
Type: r.CreateSetter.Type, Type: r.Type,
Schema: r.CreateSetter.Schema, Schema: r.Schema,
FieldName: r.CreateSetter.FieldName, FieldName: r.FieldName,
FieldValue: r.CreateSetter.FieldValue, FieldValue: r.FieldValue,
Required: r.CreateSetter.Required, Required: r.Required,
RecurseSubPackages: r.CreateSetter.RecurseSubPackages, RecurseSubPackages: r.RecurseSubPackages,
OpenAPIFileName: ext.KRMFileName(), OpenAPIFileName: ext.KRMFileName(),
OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()),
ResourcesPath: pkgPath, ResourcesPath: pkgPath,

View File

@@ -466,60 +466,6 @@ spec:
replicas: 3 # {"$openapi":"foo.bar"} replicas: 3 # {"$openapi":"foo.bar"}
`, `,
}, },
{
name: "create setter v1",
args: []string{"hubsetter", "my-hub"},
inputOpenAPI: `
`,
input: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name"
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub: my-hub
`,
expectedOpenAPI: `
`,
expectedResources: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name"
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub: my-hub # {"type":"","x-kustomize":{"setter":{"name":"hubsetter","value":"my-hub"}}}
`,
},
{
name: "create partial setter v1",
args: []string{"regionsetter", "us-east1-d", "--partial"},
inputOpenAPI: `
`,
input: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name" # {"type":"","x-kustomize":{"partialSetters":[{"name":"projectsetter","value":"project-id"}]}}
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub: my-hub # {"type":"","x-kustomize":{"setter":{"name":"hubsetter","value":"my-hub"}}}
`,
expectedOpenAPI: `
`,
expectedResources: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name" # {"type":"","x-kustomize":{"partialSetters":[{"name":"projectsetter","value":"project-id"},{"name":"regionsetter","value":"us-east1-d"}]}}
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub: my-hub # {"type":"","x-kustomize":{"setter":{"name":"hubsetter","value":"my-hub"}}}
`,
},
{ {
name: "provide different type values in schema and with flag", name: "provide different type values in schema and with flag",
args: []string{"replicas", "3", "--description", "hello world", "--type", "string"}, args: []string{"replicas", "3", "--description", "hello world", "--type", "string"},

View File

@@ -16,7 +16,6 @@ import (
"sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands"
"sigs.k8s.io/kustomize/cmd/config/runner" "sigs.k8s.io/kustomize/cmd/config/runner"
"sigs.k8s.io/kustomize/kyaml/fieldmeta" "sigs.k8s.io/kustomize/kyaml/fieldmeta"
"sigs.k8s.io/kustomize/kyaml/setters"
"sigs.k8s.io/kustomize/kyaml/setters2" "sigs.k8s.io/kustomize/kyaml/setters2"
) )
@@ -49,25 +48,22 @@ func ListSettersCommand(parent string) *cobra.Command {
type ListSettersRunner struct { type ListSettersRunner struct {
Command *cobra.Command Command *cobra.Command
Lookup setters.LookupSetters
List setters2.List List setters2.List
Markdown bool Markdown bool
IncludeSubst bool IncludeSubst bool
RecurseSubPackages bool RecurseSubPackages bool
Name string
} }
func (r *ListSettersRunner) preRunE(c *cobra.Command, args []string) error { func (r *ListSettersRunner) preRunE(c *cobra.Command, args []string) error {
if len(args) > 1 { if len(args) > 1 {
r.Lookup.Name = args[1] r.Name = args[1]
r.List.Name = args[1]
} }
initSetterVersion(c, args)
return nil return nil
} }
func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error { func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error {
if setterVersion == "v2" {
e := runner.ExecuteCmdOnPkgs{ e := runner.ExecuteCmdOnPkgs{
NeedOpenAPI: true, NeedOpenAPI: true,
Writer: c.OutOrStdout(), Writer: c.OutOrStdout(),
@@ -82,12 +78,10 @@ func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error {
} }
return nil return nil
} }
return runner.HandleError(c, lookup(r.Lookup, c, args))
}
func (r *ListSettersRunner) ExecuteCmd(w io.Writer, pkgPath string) error { func (r *ListSettersRunner) ExecuteCmd(w io.Writer, pkgPath string) error {
r.List = setters2.List{ r.List = setters2.List{
Name: r.List.Name, Name: r.Name,
OpenAPIFileName: ext.KRMFileName(), OpenAPIFileName: ext.KRMFileName(),
} }
openAPIPath := filepath.Join(pkgPath, ext.KRMFileName()) openAPIPath := filepath.Join(pkgPath, ext.KRMFileName())

View File

@@ -6,17 +6,13 @@ package commands
import ( import (
"fmt" "fmt"
"io" "io"
"os"
"path/filepath" "path/filepath"
"github.com/olekukonko/tablewriter"
"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/cmd/config/runner" "sigs.k8s.io/kustomize/cmd/config/runner"
"sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/setters"
"sigs.k8s.io/kustomize/kyaml/setters2/settersutil" "sigs.k8s.io/kustomize/kyaml/setters2/settersutil"
) )
@@ -36,13 +32,13 @@ func NewSetRunner(parent string) *SetRunner {
r.Command = c r.Command = c
c.Flags().StringArrayVar(&r.Values, "values", []string{}, c.Flags().StringArrayVar(&r.Values, "values", []string{},
"optional flag, the values of the setter to be set to") "optional flag, the values of the setter to be set to")
c.Flags().StringVar(&r.Perform.SetBy, "set-by", "", c.Flags().StringVar(&r.SetBy, "set-by", "",
"annotate the field with who set it") "annotate the field with who set it")
c.Flags().StringVar(&r.Perform.Description, "description", "", c.Flags().StringVar(&r.Description, "description", "",
"annotate the field with a description of its value") "annotate the field with a description of its value")
c.Flags().StringVar(&setterVersion, "version", "", c.Flags().StringVar(&setterVersion, "version", "",
"use this version of the setter format") "use this version of the setter format")
c.Flags().BoolVarP(&r.Set.RecurseSubPackages, "recurse-subpackages", "R", false, c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false,
"sets recursively in all the nested subpackages") "sets recursively in all the nested subpackages")
c.Flags().MarkHidden("version") c.Flags().MarkHidden("version")
@@ -57,30 +53,15 @@ func SetCommand(parent string) *cobra.Command {
type SetRunner struct { type SetRunner struct {
Command *cobra.Command Command *cobra.Command
Lookup setters.LookupSetters
Perform setters.PerformSetters
Set settersutil.FieldSetter Set settersutil.FieldSetter
OpenAPIFile string OpenAPIFile string
Values []string Values []string
} SetBy string
Description string
func initSetterVersion(c *cobra.Command, args []string) error { Name string
setterVersion = "v2" Value string
l := setters.LookupSetters{} ListValues []string
RecurseSubPackages bool
// backwards compatibility for resources with setter v1
err := kio.Pipeline{
Inputs: []kio.Reader{&kio.LocalPackageReader{PackagePath: args[0]}},
Filters: []kio.Filter{&l},
}.Execute()
if err != nil {
return err
}
if len(l.SetterCounts) > 0 {
setterVersion = "v1"
}
return nil
} }
func (r *SetRunner) preRunE(c *cobra.Command, args []string) error { func (r *SetRunner) preRunE(c *cobra.Command, args []string) error {
@@ -90,53 +71,30 @@ func (r *SetRunner) preRunE(c *cobra.Command, args []string) error {
return errors.Errorf("value should set either from flag or arg") return errors.Errorf("value should set either from flag or arg")
} }
if len(args) > 1 { r.Name = args[1]
r.Perform.Name = args[1]
r.Lookup.Name = args[1]
}
if valueFlagSet { if valueFlagSet {
r.Perform.Value = r.Values[0] r.Value = r.Values[0]
} else if len(args) > 2 {
r.Perform.Value = args[2]
}
if setterVersion == "" {
if len(args) < 2 || len(args) < 3 && !valueFlagSet {
setterVersion = "v1"
} else if err := initSetterVersion(c, args); err != nil {
return err
}
}
if setterVersion == "v2" {
r.Set.Name = args[1]
if valueFlagSet {
r.Set.Value = r.Values[0]
} else { } else {
r.Set.Value = args[2] r.Value = args[2]
} }
// set remaining values as list values // set remaining values as list values
if valueFlagSet && len(r.Values) > 1 { if valueFlagSet && len(r.Values) > 1 {
r.Set.ListValues = r.Values[1:] r.ListValues = r.Values[1:]
} else if !valueFlagSet && len(args) > 3 { } else if !valueFlagSet && len(args) > 3 {
r.Set.ListValues = args[3:] r.ListValues = args[3:]
} }
r.Set.Description = r.Perform.Description
r.Set.SetBy = r.Perform.SetBy
r.OpenAPIFile = filepath.Join(args[0], ext.KRMFileName()) r.OpenAPIFile = filepath.Join(args[0], ext.KRMFileName())
}
return nil return nil
} }
func (r *SetRunner) runE(c *cobra.Command, args []string) error { func (r *SetRunner) runE(c *cobra.Command, args []string) error {
if setterVersion == "v2" {
e := runner.ExecuteCmdOnPkgs{ e := runner.ExecuteCmdOnPkgs{
NeedOpenAPI: true, NeedOpenAPI: true,
Writer: c.OutOrStdout(), Writer: c.OutOrStdout(),
RootPkgPath: args[0], RootPkgPath: args[0],
RecurseSubPackages: r.Set.RecurseSubPackages, RecurseSubPackages: r.RecurseSubPackages,
CmdRunner: r, CmdRunner: r,
} }
err := e.Execute() err := e.Execute()
@@ -145,24 +103,19 @@ func (r *SetRunner) runE(c *cobra.Command, args []string) error {
} }
return nil return nil
} }
if len(args) > 2 || c.Flag("values").Changed {
return runner.HandleError(c, r.perform(c, args))
}
return runner.HandleError(c, lookup(r.Lookup, c, args))
}
func (r *SetRunner) ExecuteCmd(w io.Writer, pkgPath string) error { func (r *SetRunner) ExecuteCmd(w io.Writer, pkgPath string) error {
r.Set = settersutil.FieldSetter{ r.Set = settersutil.FieldSetter{
Name: r.Set.Name, Name: r.Name,
Value: r.Set.Value, Value: r.Value,
ListValues: r.Set.ListValues, ListValues: r.ListValues,
Description: r.Set.Description, Description: r.Description,
SetBy: r.Set.SetBy, SetBy: r.SetBy,
Count: 0, Count: 0,
OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()),
OpenAPIFileName: ext.KRMFileName(), OpenAPIFileName: ext.KRMFileName(),
ResourcesPath: pkgPath, ResourcesPath: pkgPath,
RecurseSubPackages: r.Set.RecurseSubPackages, RecurseSubPackages: r.RecurseSubPackages,
IsSet: true, IsSet: true,
} }
count, err := r.Set.Set() count, err := r.Set.Set()
@@ -179,65 +132,3 @@ func (r *SetRunner) ExecuteCmd(w io.Writer, pkgPath string) error {
} }
return nil return nil
} }
func lookup(l setters.LookupSetters, c *cobra.Command, args []string) error {
// lookup the setters
err := kio.Pipeline{
Inputs: []kio.Reader{&kio.LocalPackageReader{PackagePath: args[0]}},
Filters: []kio.Filter{&l},
}.Execute()
if err != nil {
return err
}
table := tablewriter.NewWriter(c.OutOrStdout())
table.SetRowLine(false)
table.SetBorder(false)
table.SetHeaderLine(false)
table.SetColumnSeparator(" ")
table.SetCenterSeparator(" ")
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.SetHeader([]string{
"NAME", "DESCRIPTION", "VALUE", "TYPE", "COUNT", "SETBY",
})
for i := range l.SetterCounts {
s := l.SetterCounts[i]
v := s.Value
if s.Value == "" {
v = s.Value
}
table.Append([]string{
s.Name,
"'" + s.Description + "'",
v,
fmt.Sprintf("%v", s.Type),
fmt.Sprintf("%d", s.Count),
s.SetBy,
})
}
table.Render()
if len(l.SetterCounts) == 0 {
// exit non-0 if no matching setters are found
os.Exit(1)
}
return nil
}
// perform the setters
func (r *SetRunner) perform(c *cobra.Command, args []string) error {
rw := &kio.LocalPackageReadWriter{
PackagePath: args[0],
}
// perform the setters in the package
err := kio.Pipeline{
Inputs: []kio.Reader{rw},
Filters: []kio.Filter{&r.Perform},
Outputs: []kio.Writer{rw},
}.Execute()
if err != nil {
return err
}
fmt.Fprintf(c.OutOrStdout(), "set %d fields\n", r.Perform.Count)
return nil
}

View File

@@ -942,70 +942,6 @@ spec:
`, `,
errMsg: "cyclic substitution detected with name my-nested-subst", errMsg: "cyclic substitution detected with name my-nested-subst",
}, },
{
name: "set v1 setter asm",
args: []string{"profilesetter", "my-asm"},
out: "set 1 fields\n",
inputOpenAPI: `
`,
input: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name"
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub:
- --gcr.io/asm-testing
- --gcr.io/asm-testing2
`,
expectedOpenAPI: `
`,
expectedResources: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name"
spec:
profile: my-asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"my-asm"}}}
hub:
- --gcr.io/asm-testing
- --gcr.io/asm-testing2
`,
},
{
name: "set v1 partial setter",
args: []string{"gcloud.core.project", "my-project"},
out: "set 1 fields\n",
inputOpenAPI: `
`,
input: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "project-id/us-east1-d/cluster-name" # {"type":"string","x-kustomize":{"partialSetters":[{"name":"gcloud.core.project","value":"project-id"},{"name":"cluster-name","value":"cluster-name"},{"name":"gcloud.compute.zone","value":"us-east1-d"}]}}
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub:
- --gcr.io/asm-testing
- --gcr.io/asm-testing2
`,
expectedOpenAPI: `
`,
expectedResources: `
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
metadata:
clusterName: "my-project/us-east1-d/cluster-name" # {"type":"string","x-kustomize":{"partialSetters":[{"name":"gcloud.core.project","value":"my-project"},{"name":"cluster-name","value":"cluster-name"},{"name":"gcloud.compute.zone","value":"us-east1-d"}]}}
spec:
profile: asm # {"type":"string","x-kustomize":{"setter":{"name":"profilesetter","value":"asm"}}}
hub:
- --gcr.io/asm-testing
- --gcr.io/asm-testing2
`,
},
} }
for i := range tests { for i := range tests {
test := tests[i] test := tests[i]

View File

@@ -1,39 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package setters
import (
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ kio.Filter = &CreateSetter{}
// CreateSetter creates a custom setter as an OpenAPI property through a comment
type CreateSetter struct {
// customFieldSetter is the marker to set
SetPartialField customFieldSetter
// ResourceMeta defines the Resource to set the marker on
ResourceMeta yaml.ResourceMeta
}
func (s *CreateSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
for i := range input {
m, err := input[i].GetMeta()
if err != nil {
return nil, err
}
if s.ResourceMeta.Name != "" && m.Name != s.ResourceMeta.Name {
continue
}
if s.ResourceMeta.Kind != "" && m.Kind != s.ResourceMeta.Kind {
continue
}
if err := input[i].PipeE(&s.SetPartialField); err != nil {
return nil, err
}
}
return input, nil
}

View File

@@ -1,118 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package setters
import (
"strings"
"sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/fieldmeta"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ yaml.Filter = &customFieldSetter{}
// customFieldSetter creates a new custom field setter
type customFieldSetter struct {
// Path is the path of the field to add the setter for
Field string
// Setter is the setter to add
Setter fieldmeta.PartialFieldSetter
// Description is the description to add to the OpenAPI
Description string
// SetBy is the setBy to add to the OpenAPI extension
SetBy string
Type string
// Partial will create a partial setter if set to true
Partial bool
// currentFieldName is the name of the current field being processed
currentFieldName string
}
// Filter performs the setter for a single object
func (m *customFieldSetter) Filter(object *yaml.RNode) (*yaml.RNode, error) {
switch object.YNode().Kind {
case yaml.DocumentNode:
return m.Filter(yaml.NewRNode(object.YNode().Content[0]))
case yaml.MappingNode:
return object, object.VisitFields(func(node *yaml.MapNode) error {
// record the current field name, resetting it back to its original value
// when done
n := m.currentFieldName
defer func() { m.currentFieldName = n }()
m.currentFieldName = node.Key.YNode().Value
return node.Value.PipeE(m)
})
case yaml.SequenceNode:
return object, object.VisitElements(func(node *yaml.RNode) error {
return node.PipeE(m)
})
case yaml.ScalarNode:
// if filed is empty, create the setter for all fields with given value
// else only create the setter for given field and value combination, with given name
if m.Field != "" && m.currentFieldName != m.Field {
return object, nil
}
if err := m.create(object); err != nil {
return nil, err
}
return object, nil
default:
return object, nil
}
}
func (m *customFieldSetter) create(field *yaml.RNode) error {
fm := fieldmeta.FieldMeta{}
if err := fm.Read(field); err != nil {
return errors.Wrap(err)
}
if m.Description != "" {
fm.Schema.Description = m.Description
}
fm.Extensions.SetBy = m.SetBy
fm.Schema.Type = []string{m.Type}
if !m.Partial {
// doesn't match the supplied value
if field.YNode().Value != m.Setter.Value {
return nil
}
// full setter
fm.Extensions.FieldSetter = &m.Setter
fm.Extensions.PartialFieldSetters = nil
} else {
// doesn't match the supplied value
if !strings.Contains(field.YNode().Value, m.Setter.Value) {
return nil
}
found := false
for i := range fm.Extensions.PartialFieldSetters {
s := fm.Extensions.PartialFieldSetters[i]
if s.Name == m.Setter.Name {
// update the setter if we find it
found = true
fm.Extensions.PartialFieldSetters[i] = m.Setter
break
}
}
if !found {
// add the setter if it wasn't found
fm.Extensions.PartialFieldSetters = append(fm.Extensions.PartialFieldSetters, m.Setter)
}
}
if err := fm.Write(field); err != nil {
return errors.Wrap(err)
}
return nil
}

View File

@@ -1,45 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package setters
import (
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ kio.Filter = &PerformSetters{}
// PerformSetters sets field values
type PerformSetters struct {
// Name is the name of the setter to perform
Name string
// Value is the value to set
Value string
// Description, if set will annotate the field with a description.
Description string
// SetBy, if set will annotate the field with who set it.
SetBy string
// Count is set by Filter and is the number of fields modified.
Count int
}
func (s *PerformSetters) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
for i := range input {
p := &fieldSetter{
Name: s.Name,
Value: s.Value,
Description: s.Description,
SetBy: s.SetBy,
}
if err := input[i].PipeE(p); err != nil {
return nil, err
}
s.Count += p.Count
}
return input, nil
}

View File

@@ -1,130 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
// Package sub substitutes strings in fields
package setters
import (
"strings"
"sigs.k8s.io/kustomize/kyaml/fieldmeta"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ yaml.Filter = &fieldSetter{}
// fieldSetter sets part or all of a field value.
type fieldSetter struct {
// Name is the name of the setter to perform.
Name string
// Value is the value to set.
Value string
// Description, if specified will set 'description' for the field. Optional.
Description string
// SetBy, if specified will set 'setBy' for the field. Optional.
SetBy string
// Count is incremented by Filter for each field that is set.
Count int
}
// Filter implements yaml.Filter
func (fs *fieldSetter) Filter(object *yaml.RNode) (*yaml.RNode, error) {
switch object.YNode().Kind {
case yaml.DocumentNode:
// Document is the root of the object and always contains 1 node
return fs.Filter(yaml.NewRNode(object.YNode().Content[0]))
case yaml.MappingNode:
return object, object.VisitFields(func(node *yaml.MapNode) error {
// Traverse each field value
return node.Value.PipeE(fs)
})
case yaml.SequenceNode:
return object, object.VisitElements(func(node *yaml.RNode) error {
// Traverse each list element
return node.PipeE(fs)
})
case yaml.ScalarNode:
// Check if there is a setter matching the name
s, f, partial, err := fs.findSetter(object)
if err != nil {
return nil, err
}
if s == nil {
// no matching setter
return object, nil
}
// set the field value
return object, fs.set(object, s, f, partial)
default:
return object, nil
}
}
// findPartialSetter finds the setter matching the name if one exists
func (fs *fieldSetter) findSetter(field *yaml.RNode) (
*fieldmeta.PartialFieldSetter, *fieldmeta.FieldMeta, bool, error) {
// check if there are any substitutions for this field
var fm = &fieldmeta.FieldMeta{}
if err := fm.Read(field); err != nil {
return nil, nil, false, err
}
if fs.SetBy != "" {
fm.Extensions.SetBy = fs.SetBy
}
if fs.Description != "" {
fm.Schema.Description = fs.Description
}
if fm.Extensions.FieldSetter != nil && fm.Extensions.FieldSetter.Name == fs.Name {
return fm.Extensions.FieldSetter, fm, false, nil
}
// check if there is a matching substitution
for i := range fm.Extensions.PartialFieldSetters {
if fm.Extensions.PartialFieldSetters[i].Name == fs.Name {
return &fm.Extensions.PartialFieldSetters[i], fm, true, nil
}
}
return nil, nil, false, nil
}
// set performs the substitution for the given field, substitution, and metadata
func (fs *fieldSetter) set(
field *yaml.RNode, s *fieldmeta.PartialFieldSetter,
f *fieldmeta.FieldMeta, partial bool) error {
if s.Value == fs.Value || !strings.Contains(field.YNode().Value, s.Value) {
// no substitutions necessary -- already substituted or doesn't have the set value
// which acts as a marker
return nil
}
// record that the config has been modified
fs.Count++
if !partial {
// full setter
field.YNode().Value = fs.Value
} else {
// replace the current value with the new value
field.YNode().Value = strings.ReplaceAll(field.YNode().Value, s.Value, fs.Value)
}
// be sure to set the tag to the matching type so the yaml doesn't incorrectly quote
// integers or booleans as strings
fType := fieldmeta.FieldValueType(f.Schema.Type[0])
if err := fType.Validate(field.YNode().Value); err != nil {
return err
}
field.YNode().Tag = fType.Tag()
// update the comment on the field
s.Value = fs.Value
if err := f.Write(field); err != nil {
return err
}
return nil
}

View File

@@ -1,65 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package setters
import (
"sort"
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ kio.Filter = &LookupSetters{}
// LookupSetters identifies setters for a collection of Resources
type LookupSetters struct {
// Name is the name of the setter to match. Optional.
Name string
// SetterCounts is populated by Filter and contains the count of fields matching each setter.
SetterCounts []setterCount
}
// setterCount records the identified setters and number of fields matching those setters
type setterCount struct {
// Count is the number of substitutions possible to perform
Count int
// setter is the substitution found
setter
}
// Filter implements kio.Filter
func (l *LookupSetters) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
setters := map[string]*setterCount{}
for i := range input {
// lookup substitutions for this object
ls := &lookupSetters{Name: l.Name}
if err := input[i].PipeE(ls); err != nil {
return nil, err
}
// aggregate counts for each setter by name. takes the description and value from
// the first setter for each name encountered.
for j := range ls.Setters {
setter := ls.Setters[j]
curr, found := setters[setter.Name]
if !found {
curr = &setterCount{setter: setter}
setters[setter.Name] = curr
}
curr.Count++
}
}
// pull out and sort the results by setter name
for _, v := range setters {
l.SetterCounts = append(l.SetterCounts, *v)
}
sort.Slice(l.SetterCounts, func(i, j int) bool {
return l.SetterCounts[i].Name < l.SetterCounts[j].Name
})
return input, nil
}

View File

@@ -1,86 +0,0 @@
// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package setters
import (
"sigs.k8s.io/kustomize/kyaml/fieldmeta"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
var _ yaml.Filter = &lookupSetters{}
// lookupSetters looks up setters for a Resource
type lookupSetters struct {
// Name of the setter to lookup. Optional
Name string
// Setters is a list of setters that were found
Setters []setter
}
type setter struct {
fieldmeta.PartialFieldSetter
Description string
Type string
SetBy string
}
func (ls *lookupSetters) Filter(object *yaml.RNode) (*yaml.RNode, error) {
switch object.YNode().Kind {
case yaml.DocumentNode:
// skip the document node
return ls.Filter(yaml.NewRNode(object.YNode().Content[0]))
case yaml.MappingNode:
return object, object.VisitFields(func(node *yaml.MapNode) error {
return node.Value.PipeE(ls)
})
case yaml.SequenceNode:
return object, object.VisitElements(func(node *yaml.RNode) error {
return node.PipeE(ls)
})
case yaml.ScalarNode:
return object, ls.lookup(object)
default:
return object, nil
}
}
// lookup finds any setters for a field
func (ls *lookupSetters) lookup(field *yaml.RNode) error {
// check if there is a substitution for this field
var fm = &fieldmeta.FieldMeta{}
if err := fm.Read(field); err != nil {
return err
}
if fm.Extensions.FieldSetter != nil {
if ls.Name != "" && ls.Name != fm.Extensions.FieldSetter.Name {
// skip this setter, it doesn't match the specified setter
return nil
}
// full setter
ls.Setters = append(ls.Setters, setter{
PartialFieldSetter: *fm.Extensions.FieldSetter,
Description: fm.Schema.Description,
Type: fm.Schema.Type[0],
SetBy: fm.Extensions.SetBy,
})
return nil
}
// partial setters
for i := range fm.Extensions.PartialFieldSetters {
if ls.Name != "" && ls.Name != fm.Extensions.PartialFieldSetters[i].Name {
// skip this setter
continue
}
ls.Setters = append(ls.Setters, setter{
PartialFieldSetter: fm.Extensions.PartialFieldSetters[i],
Description: fm.Schema.Description,
Type: fm.Schema.Type[0],
SetBy: fm.Extensions.SetBy,
})
}
return nil
}