refvars.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package transformers
  2. import (
  3. "fmt"
  4. "sigs.k8s.io/kustomize/pkg/expansion"
  5. "sigs.k8s.io/kustomize/pkg/resmap"
  6. "sigs.k8s.io/kustomize/pkg/transformers/config"
  7. )
  8. type RefVarTransformer struct {
  9. varMap map[string]string
  10. replacementCounts map[string]int
  11. fieldSpecs []config.FieldSpec
  12. mappingFunc func(string) string
  13. }
  14. // NewRefVarTransformer returns a new RefVarTransformer
  15. // that replaces $(VAR) style variables with values.
  16. // The fieldSpecs are the places to look for occurrences of $(VAR).
  17. func NewRefVarTransformer(
  18. varMap map[string]string, fs []config.FieldSpec) *RefVarTransformer {
  19. return &RefVarTransformer{
  20. varMap: varMap,
  21. fieldSpecs: fs,
  22. }
  23. }
  24. // replaceVars accepts as 'in' a string, or string array, which can have
  25. // embedded instances of $VAR style variables, e.g. a container command string.
  26. // The function returns the string with the variables expanded to their final
  27. // values.
  28. func (rv *RefVarTransformer) replaceVars(in interface{}) (interface{}, error) {
  29. switch vt := in.(type) {
  30. case []interface{}:
  31. var xs []string
  32. for _, a := range in.([]interface{}) {
  33. xs = append(xs, expansion.Expand(a.(string), rv.mappingFunc))
  34. }
  35. return xs, nil
  36. case map[string]interface{}:
  37. inMap := in.(map[string]interface{})
  38. xs := make(map[string]interface{}, len(inMap))
  39. for k, v := range inMap {
  40. s, ok := v.(string)
  41. if !ok {
  42. return nil, fmt.Errorf("%#v is expected to be %T", v, s)
  43. }
  44. xs[k] = expansion.Expand(s, rv.mappingFunc)
  45. }
  46. return xs, nil
  47. case interface{}:
  48. s, ok := in.(string)
  49. if !ok {
  50. return nil, fmt.Errorf("%#v is expected to be %T", in, s)
  51. }
  52. return expansion.Expand(s, rv.mappingFunc), nil
  53. case nil:
  54. return nil, nil
  55. default:
  56. return "", fmt.Errorf("invalid type encountered %T", vt)
  57. }
  58. }
  59. // UnusedVars returns slice of Var names that were unused
  60. // after a Transform run.
  61. func (rv *RefVarTransformer) UnusedVars() []string {
  62. var unused []string
  63. for k := range rv.varMap {
  64. _, ok := rv.replacementCounts[k]
  65. if !ok {
  66. unused = append(unused, k)
  67. }
  68. }
  69. return unused
  70. }
  71. // Transform replaces $(VAR) style variables with values.
  72. func (rv *RefVarTransformer) Transform(m resmap.ResMap) error {
  73. rv.replacementCounts = make(map[string]int)
  74. rv.mappingFunc = expansion.MappingFuncFor(
  75. rv.replacementCounts, rv.varMap)
  76. for id, res := range m {
  77. for _, fieldSpec := range rv.fieldSpecs {
  78. if id.Gvk().IsSelected(&fieldSpec.Gvk) {
  79. if err := mutateField(
  80. res.Map(), fieldSpec.PathSlice(),
  81. false, rv.replaceVars); err != nil {
  82. return err
  83. }
  84. }
  85. }
  86. }
  87. return nil
  88. }