mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-12 01:14:22 +00:00
Delete v1 setters code
This commit is contained in:
@@ -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()
|
||||||
@@ -192,30 +167,19 @@ func (r *CreateSetterRunner) createSetter(c *cobra.Command, args []string) error
|
|||||||
return runner.HandleError(c, err)
|
return runner.HandleError(c, err)
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
|||||||
@@ -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"},
|
||||||
|
|||||||
@@ -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(),
|
||||||
@@ -81,13 +77,11 @@ func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error {
|
|||||||
return runner.HandleError(c, err)
|
return runner.HandleError(c, err)
|
||||||
}
|
}
|
||||||
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())
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -144,25 +102,20 @@ func (r *SetRunner) runE(c *cobra.Command, args []string) error {
|
|||||||
return runner.HandleError(c, err)
|
return runner.HandleError(c, err)
|
||||||
}
|
}
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ func (rs *ResourceSchema) PatchStrategyAndKeyList() (string, []string) {
|
|||||||
|
|
||||||
mkList, found := rs.Schema.Extensions[kubernetesMergeKeyMapList]
|
mkList, found := rs.Schema.Extensions[kubernetesMergeKeyMapList]
|
||||||
if found {
|
if found {
|
||||||
//mkList is []interface, convert to []string
|
// mkList is []interface, convert to []string
|
||||||
mkListStr := make([]string, len(mkList.([]interface{})))
|
mkListStr := make([]string, len(mkList.([]interface{})))
|
||||||
|
|
||||||
for i, v := range mkList.([]interface{}) {
|
for i, v := range mkList.([]interface{}) {
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user