mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-11 17:12:51 +00:00
Support for enum mappings in setters
This commit is contained in:
@@ -104,6 +104,10 @@ type SetterDefinition struct {
|
|||||||
|
|
||||||
// Count is the number of fields set by this setter.
|
// Count is the number of fields set by this setter.
|
||||||
Count int `yaml:"count,omitempty"`
|
Count int `yaml:"count,omitempty"`
|
||||||
|
|
||||||
|
// EnumValues is a map of possible setter values to actual field values.
|
||||||
|
// May be used for t-shirt sizing values -- e.g. set cpu to small, medium, large
|
||||||
|
EnumValues map[string]string `yaml:"enumValues,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sd SetterDefinition) AddToFile(path string) error {
|
func (sd SetterDefinition) AddToFile(path string) error {
|
||||||
|
|||||||
@@ -86,8 +86,14 @@ func (s *Set) substitute(field *yaml.RNode, ext *cliExtension) (bool, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrap(err)
|
return false, errors.Wrap(err)
|
||||||
}
|
}
|
||||||
// substitute the setters current value into the substitution pattern
|
|
||||||
p = strings.ReplaceAll(p, v.Marker, subSetter.Setter.Value)
|
if val, found := subSetter.Setter.EnumValues[subSetter.Setter.Value]; found {
|
||||||
|
// resolve enum for substitution
|
||||||
|
p = strings.ReplaceAll(p, v.Marker, val)
|
||||||
|
} else {
|
||||||
|
// substitute the setters current value into the substitution pattern
|
||||||
|
p = strings.ReplaceAll(p, v.Marker, subSetter.Setter.Value)
|
||||||
|
}
|
||||||
|
|
||||||
if subSetter.Setter.Name == s.Name {
|
if subSetter.Setter.Name == s.Name {
|
||||||
// the substitution depends on the specified setter
|
// the substitution depends on the specified setter
|
||||||
@@ -114,6 +120,11 @@ func (s *Set) set(field *yaml.RNode, ext *cliExtension) bool {
|
|||||||
|
|
||||||
// TODO(pwittrock): validate the field value
|
// TODO(pwittrock): validate the field value
|
||||||
|
|
||||||
|
if val, found := ext.Setter.EnumValues[ext.Setter.Value]; found {
|
||||||
|
field.YNode().Value = val
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// this has a full setter, set its value
|
// this has a full setter, set its value
|
||||||
field.YNode().Value = ext.Setter.Value
|
field.YNode().Value = ext.Setter.Value
|
||||||
return true
|
return true
|
||||||
@@ -146,6 +157,28 @@ func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) {
|
|||||||
if def == nil {
|
if def == nil {
|
||||||
return nil, errors.Errorf("no setter %s found", s.Name)
|
return nil, errors.Errorf("no setter %s found", s.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the setter is an enumeration, then make sure the value matches
|
||||||
|
if values, err := def.Pipe(yaml.Lookup("enumValues")); err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else if values != nil {
|
||||||
|
fields, err := values.Fields()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var match bool
|
||||||
|
for i := range fields {
|
||||||
|
if fields[i] == s.Value {
|
||||||
|
match = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !match {
|
||||||
|
return nil, errors.Errorf("%s does not match the possible values for %s: [%s]",
|
||||||
|
s.Value, s.Name, strings.Join(fields, ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := def.PipeE(&yaml.FieldSetter{Name: "value", StringValue: s.Value}); err != nil {
|
if err := def.PipeE(&yaml.FieldSetter{Name: "value", StringValue: s.Value}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,92 @@ metadata:
|
|||||||
name: nginx-deployment
|
name: nginx-deployment
|
||||||
spec:
|
spec:
|
||||||
replicas: 4 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
replicas: 4 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "set-replicas-enum",
|
||||||
|
setter: "replicas",
|
||||||
|
openapi: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.no-match-1':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-1
|
||||||
|
value: "1"
|
||||||
|
io.k8s.cli.setters.replicas:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: replicas
|
||||||
|
value: "medium"
|
||||||
|
enumValues:
|
||||||
|
small: "1"
|
||||||
|
medium: "5"
|
||||||
|
large: "50"
|
||||||
|
io.k8s.cli.setters.no-match-2':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-2
|
||||||
|
value: "2"
|
||||||
|
`,
|
||||||
|
input: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 1 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
||||||
|
`,
|
||||||
|
expected: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 5 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "set-replicas-enum-large",
|
||||||
|
setter: "replicas",
|
||||||
|
openapi: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.no-match-1':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-1
|
||||||
|
value: "1"
|
||||||
|
io.k8s.cli.setters.replicas:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: replicas
|
||||||
|
value: "large"
|
||||||
|
enumValues:
|
||||||
|
small: "1"
|
||||||
|
medium: "5"
|
||||||
|
large: "50"
|
||||||
|
io.k8s.cli.setters.no-match-2':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-2
|
||||||
|
value: "2"
|
||||||
|
`,
|
||||||
|
input: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 1 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
||||||
|
`,
|
||||||
|
expected: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 50 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"}
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -155,6 +241,61 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: nginx
|
- name: nginx
|
||||||
image: nginx:1.8.1 # {"$ref": "#/definitions/io.k8s.cli.substitutions.image"}
|
image: nginx:1.8.1 # {"$ref": "#/definitions/io.k8s.cli.substitutions.image"}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "substitute-image-name-enum",
|
||||||
|
setter: "image-tag",
|
||||||
|
openapi: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.image-name:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: image-name
|
||||||
|
value: "helloworld"
|
||||||
|
enumValues:
|
||||||
|
nginx: gcr.io/nginx
|
||||||
|
helloworld: us.gcr.io/helloworld
|
||||||
|
io.k8s.cli.setters.image-tag:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: image-tag
|
||||||
|
value: "1.8.1"
|
||||||
|
io.k8s.cli.substitutions.image:
|
||||||
|
x-k8s-cli:
|
||||||
|
substitution:
|
||||||
|
name: image
|
||||||
|
pattern: IMAGE_NAME:IMAGE_TAG
|
||||||
|
values:
|
||||||
|
- marker: "IMAGE_NAME"
|
||||||
|
ref: "#/definitions/io.k8s.cli.setters.image-name"
|
||||||
|
- marker: "IMAGE_TAG"
|
||||||
|
ref: "#/definitions/io.k8s.cli.setters.image-tag"
|
||||||
|
`,
|
||||||
|
input: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.7.9 # {"$ref": "#/definitions/io.k8s.cli.substitutions.image"}
|
||||||
|
`,
|
||||||
|
expected: `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: us.gcr.io/helloworld:1.8.1 # {"$ref": "#/definitions/io.k8s.cli.substitutions.image"}
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -631,6 +772,89 @@ openAPI:
|
|||||||
setBy: "package-default"
|
setBy: "package-default"
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "set-replicas-with-enum",
|
||||||
|
setter: "replicas",
|
||||||
|
value: "baz",
|
||||||
|
input: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.no-match-1':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-1
|
||||||
|
value: "1"
|
||||||
|
setBy: "package-default"
|
||||||
|
io.k8s.cli.setters.replicas:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: replicas
|
||||||
|
value: "foo"
|
||||||
|
enumValues:
|
||||||
|
foo: bar
|
||||||
|
baz: biz
|
||||||
|
io.k8s.cli.setters.no-match-2':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-2
|
||||||
|
value: "2"
|
||||||
|
setBy: "package-default"
|
||||||
|
`,
|
||||||
|
expected: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.no-match-1':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-1
|
||||||
|
value: "1"
|
||||||
|
setBy: "package-default"
|
||||||
|
io.k8s.cli.setters.replicas:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: replicas
|
||||||
|
value: "baz"
|
||||||
|
enumValues:
|
||||||
|
foo: bar
|
||||||
|
baz: biz
|
||||||
|
io.k8s.cli.setters.no-match-2':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-2
|
||||||
|
value: "2"
|
||||||
|
setBy: "package-default"
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "set-replicas-fail",
|
||||||
|
setter: "replicas",
|
||||||
|
value: "hello",
|
||||||
|
input: `
|
||||||
|
openAPI:
|
||||||
|
definitions:
|
||||||
|
io.k8s.cli.setters.no-match-1':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-1
|
||||||
|
value: "1"
|
||||||
|
setBy: "package-default"
|
||||||
|
io.k8s.cli.setters.replicas:
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: replicas
|
||||||
|
value: "foo"
|
||||||
|
enumValues:
|
||||||
|
foo: bar
|
||||||
|
baz: biz
|
||||||
|
io.k8s.cli.setters.no-match-2':
|
||||||
|
x-k8s-cli:
|
||||||
|
setter:
|
||||||
|
name: no-match-2
|
||||||
|
value: "2"
|
||||||
|
setBy: "package-default"
|
||||||
|
`,
|
||||||
|
err: "hello does not match the possible values for replicas: [foo,baz]",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "error",
|
name: "error",
|
||||||
setter: "replicas",
|
setter: "replicas",
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ type cliExtension struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type setter struct {
|
type setter struct {
|
||||||
Name string `yaml:"name,omitempty" json:"name,omitempty"`
|
Name string `yaml:"name,omitempty" json:"name,omitempty"`
|
||||||
Value string `yaml:"value,omitempty" json:"value,omitempty"`
|
Value string `yaml:"value,omitempty" json:"value,omitempty"`
|
||||||
|
EnumValues map[string]string `yaml:"enumValues,omitempty" json:"enumValues,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type substitution struct {
|
type substitution struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user