mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
82 lines
2.5 KiB
Go
82 lines
2.5 KiB
Go
package transformers
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/kubernetes-sigs/kustomize/pkg/expansion"
|
|
"github.com/kubernetes-sigs/kustomize/pkg/resmap"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
)
|
|
|
|
type refvarTransformer struct {
|
|
pathConfigs []PathConfig
|
|
vars map[string]string
|
|
}
|
|
|
|
// NewRefVarTransformer returns a Trasformer that replaces $(VAR) style variables with values.
|
|
func NewRefVarTransformer(vars map[string]string) (Transformer, error) {
|
|
return &refvarTransformer{
|
|
vars: vars,
|
|
pathConfigs: []PathConfig{
|
|
{
|
|
GroupVersionKind: &schema.GroupVersionKind{Kind: "StatefulSet"},
|
|
Path: []string{"spec", "template", "spec", "initContainers", "command"},
|
|
},
|
|
{
|
|
GroupVersionKind: &schema.GroupVersionKind{Kind: "StatefulSet"},
|
|
Path: []string{"spec", "template", "spec", "containers", "command"},
|
|
},
|
|
{
|
|
GroupVersionKind: &schema.GroupVersionKind{Kind: "Job"},
|
|
Path: []string{"spec", "template", "spec", "containers", "command"},
|
|
},
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
// Transform determines the final values of variables:
|
|
//
|
|
// 1. Determine the final value of each variable:
|
|
// a. If the variable's Value is set, expand the `$(var)` references to other
|
|
// variables in the .Value field; the sources of variables are the declared
|
|
// variables of the container and the service environment variables
|
|
// b. If a source is defined for an environment variable, resolve the source
|
|
// 2. Create the container's environment in the order variables are declared
|
|
// 3. Add remaining service environment vars
|
|
func (rv *refvarTransformer) Transform(resources resmap.ResMap) error {
|
|
for GVKn := range resources {
|
|
objMap := resources[GVKn].UnstructuredContent()
|
|
for _, pc := range rv.pathConfigs {
|
|
if !selectByGVK(GVKn.Gvk(), pc.GroupVersionKind) {
|
|
continue
|
|
}
|
|
err := mutateField(objMap, pc.Path, false, func(in interface{}) (interface{}, error) {
|
|
var (
|
|
mappingFunc = expansion.MappingFuncFor(rv.vars)
|
|
)
|
|
switch vt := in.(type) {
|
|
case []interface{}:
|
|
var xs []string
|
|
for _, a := range in.([]interface{}) {
|
|
xs = append(xs, expansion.Expand(a.(string), mappingFunc))
|
|
}
|
|
return xs, nil
|
|
case interface{}:
|
|
s, ok := in.(string)
|
|
if !ok {
|
|
return nil, fmt.Errorf("%#v is expectd to be %T", in, s)
|
|
}
|
|
runtimeVal := expansion.Expand(s, mappingFunc)
|
|
return runtimeVal, nil
|
|
default:
|
|
return "", fmt.Errorf("invalid type encountered %T", vt)
|
|
}
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|