diff --git a/pkg/app/application.go b/pkg/app/application.go index 42b1ba507..6c4bffc5b 100644 --- a/pkg/app/application.go +++ b/pkg/app/application.go @@ -347,7 +347,10 @@ func (a *applicationImpl) Vars() ([]types.Var, error) { } vars = append(vars, subAppVars...) } - vars = append(vars, a.kustomization.Vars...) + for _, v := range a.kustomization.Vars { + v.Defaulting() + vars = append(vars, v) + } if len(errs.Get()) > 0 { return nil, errs } diff --git a/pkg/app/var.go b/pkg/app/var.go index 71d06748f..4444c9cef 100644 --- a/pkg/app/var.go +++ b/pkg/app/var.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package app import ( diff --git a/pkg/app/var_test.go b/pkg/app/var_test.go new file mode 100644 index 000000000..e16c24f14 --- /dev/null +++ b/pkg/app/var_test.go @@ -0,0 +1,51 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "strings" + "testing" +) + +func TestGetFieldAsString(t *testing.T) { + m := map[string]interface{}{ + "Kind": "Service", + "metadata": map[string]interface{}{ + "labels": map[string]string{ + "app": "application-name", + }, + "name": "service-name", + }, + } + p := []string{"Kind"} + s, _ := getFieldAsString(m, p) + if s != "Service" { + t.Errorf("Expected to get Service, but actually got %s", s) + } + + p = []string{"metadata", "name"} + s, _ = getFieldAsString(m, p) + if s != "service-name" { + t.Errorf("Expected to get service-name, but actually got %s", s) + } + + p = []string{"metadata", "non-existing-field"} + s, err := getFieldAsString(m, p) + if !strings.HasSuffix(err.Error(), "field at given fieldpath does not exist") { + t.Errorf("Unexpected failure due to incorrect error message %s", err.Error()) + } +} diff --git a/pkg/commands/testdata/testcase-variable-ref/test.yaml b/pkg/commands/testdata/testcase-variable-ref/test.yaml index 7c54440a5..0c94b121e 100644 --- a/pkg/commands/testdata/testcase-variable-ref/test.yaml +++ b/pkg/commands/testdata/testcase-variable-ref/test.yaml @@ -1,4 +1,4 @@ -description: varialbe reference and substitution +description: variable reference and substitution args: [] filename: testdata/testcase-variable-ref/in/overlay/ expectedStdout: testdata/testcase-variable-ref/expected.yaml diff --git a/pkg/transformers/refvars.go b/pkg/transformers/refvars.go index 1418713b9..9a885467b 100644 --- a/pkg/transformers/refvars.go +++ b/pkg/transformers/refvars.go @@ -72,7 +72,6 @@ func (rv *refvarTransformer) Transform(resources resmap.ResMap) error { default: return "", fmt.Errorf("invalid type encountered %T", vt) } - return "", fmt.Errorf("invalid type encountered") }) if err != nil { return err diff --git a/pkg/types/defaulting.go b/pkg/types/defaulting.go new file mode 100644 index 000000000..6f49240f0 --- /dev/null +++ b/pkg/types/defaulting.go @@ -0,0 +1,27 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + corev1 "k8s.io/api/core/v1" +) + +func (v *Var) Defaulting() { + if (corev1.ObjectFieldSelector{}) == v.FieldRef { + v.FieldRef = corev1.ObjectFieldSelector{FieldPath: "metadata.name"} + } +} diff --git a/pkg/types/kustomization.go b/pkg/types/kustomization.go index 29f6b3e7b..da3ca4982 100644 --- a/pkg/types/kustomization.go +++ b/pkg/types/kustomization.go @@ -137,16 +137,22 @@ type DataSources struct { EnvSource string `json:"env,omitempty" yaml:"env,omitempty"` } -// Var represents a variable whose value will be source'd from a Kubernetes object -// and will be substituted at runtime. +// Var represents a variable whose value will be sourced +// from a field in a Kubernetes object. type Var struct { // Value of identifier name e.g. FOO used in container args, annotations // Appears in pod template as $(FOO) Name string `json:"name" yaml:"name"` - // ObjRef refers to a Kubernetes Resource + // ObjRef must refer to a Kubernetes resource under the + // purview of this kustomization. ObjRef should use the + // raw name of the object (the name specified in its YAML, + // before addition of a namePrefix). ObjRef corev1.ObjectReference `json:"objref" yaml:"objref"` - // FieldRef refers to the fieldpath to extract value from a Kubernetes Object - FieldRef corev1.ObjectFieldSelector `json:"fieldref" yaml:"objref"` + // FieldRef refers to the field of the object referred to by + // ObjRef whose value will be extracted for use in + // replacing $(FOO). + // If unspecified, this defaults to fieldpath: metadata.name + FieldRef corev1.ObjectFieldSelector `json:"fieldref,omitempty" yaml:"objref,omitempty"` }