Skip to content

Commit eb72de2

Browse files
authored
fix(api): override envVar instead of merging them and keep valueFrom (#419)
1 parent 0aee2c5 commit eb72de2

File tree

3 files changed

+150
-21
lines changed

3 files changed

+150
-21
lines changed

api/v1alpha1/common.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -293,22 +293,13 @@ func overrideTolerations(a, b []corev1.Toleration) []corev1.Toleration {
293293
}
294294

295295
func mergeEnvVars(a, b []corev1.EnvVar) []corev1.EnvVar {
296-
result := []corev1.EnvVar{}
297-
tempMap := map[string]string{}
298-
299-
for _, elt := range a {
300-
tempMap[elt.Name] = elt.Value
301-
}
302-
for _, elt := range b {
303-
tempMap[elt.Name] = elt.Value
304-
}
296+
result := b
305297

306-
for k, v := range tempMap {
307-
result = append(result, corev1.EnvVar{Name: k, Value: v})
298+
if len(result) == 0 {
299+
result = a
308300
}
309301

310302
return result
311-
312303
}
313304

314305
func mergeMaps(a, b map[string]string) map[string]string {

api/v1alpha1/common_test.go

Lines changed: 139 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package v1alpha1_test
22

33
import (
4+
"reflect"
45
"testing"
56

67
corev1 "k8s.io/api/core/v1"
@@ -1265,16 +1266,139 @@ func TestOverrideRunnerSpec(t *testing.T) {
12651266
configv1alpha1.OverrideRunnerSpec{
12661267
Env: []corev1.EnvVar{
12671268
{
1268-
Name: "ONLY_REPO",
1269+
Name: "ONLY_LAYER",
12691270
Value: "1",
12701271
},
12711272
{
12721273
Name: "IN_BOTH",
12731274
Value: "1",
12741275
},
1276+
},
1277+
},
1278+
},
1279+
{
1280+
"EnvValueFromOnlyInRepo",
1281+
&configv1alpha1.TerraformRepository{
1282+
Spec: configv1alpha1.TerraformRepositorySpec{
1283+
OverrideRunnerSpec: configv1alpha1.OverrideRunnerSpec{
1284+
Env: []corev1.EnvVar{
1285+
{
1286+
Name: "NODE_NAME",
1287+
ValueFrom: &corev1.EnvVarSource{
1288+
FieldRef: &corev1.ObjectFieldSelector{
1289+
FieldPath: "spec.nodeName",
1290+
},
1291+
},
1292+
},
1293+
},
1294+
},
1295+
},
1296+
},
1297+
&configv1alpha1.TerraformLayer{},
1298+
configv1alpha1.OverrideRunnerSpec{
1299+
Env: []corev1.EnvVar{
12751300
{
1276-
Name: "ONLY_LAYER",
1277-
Value: "1",
1301+
Name: "NODE_NAME",
1302+
ValueFrom: &corev1.EnvVarSource{
1303+
FieldRef: &corev1.ObjectFieldSelector{
1304+
FieldPath: "spec.nodeName",
1305+
},
1306+
},
1307+
},
1308+
},
1309+
},
1310+
},
1311+
{
1312+
"EnvValueFromOnlyInLayer",
1313+
&configv1alpha1.TerraformRepository{},
1314+
&configv1alpha1.TerraformLayer{
1315+
Spec: configv1alpha1.TerraformLayerSpec{
1316+
OverrideRunnerSpec: configv1alpha1.OverrideRunnerSpec{
1317+
Env: []corev1.EnvVar{
1318+
{
1319+
Name: "NODE_NAME",
1320+
ValueFrom: &corev1.EnvVarSource{
1321+
FieldRef: &corev1.ObjectFieldSelector{
1322+
FieldPath: "spec.nodeName",
1323+
},
1324+
},
1325+
},
1326+
},
1327+
},
1328+
},
1329+
},
1330+
configv1alpha1.OverrideRunnerSpec{
1331+
Env: []corev1.EnvVar{
1332+
{
1333+
Name: "NODE_NAME",
1334+
ValueFrom: &corev1.EnvVarSource{
1335+
FieldRef: &corev1.ObjectFieldSelector{
1336+
FieldPath: "spec.nodeName",
1337+
},
1338+
},
1339+
},
1340+
},
1341+
},
1342+
},
1343+
{
1344+
"EnvValueFromInBoth",
1345+
&configv1alpha1.TerraformRepository{
1346+
Spec: configv1alpha1.TerraformRepositorySpec{
1347+
OverrideRunnerSpec: configv1alpha1.OverrideRunnerSpec{
1348+
Env: []corev1.EnvVar{
1349+
{
1350+
Name: "NODE_NAME",
1351+
ValueFrom: &corev1.EnvVarSource{
1352+
FieldRef: &corev1.ObjectFieldSelector{
1353+
FieldPath: "spec.nodeName",
1354+
},
1355+
},
1356+
},
1357+
},
1358+
},
1359+
},
1360+
},
1361+
&configv1alpha1.TerraformLayer{
1362+
Spec: configv1alpha1.TerraformLayerSpec{
1363+
OverrideRunnerSpec: configv1alpha1.OverrideRunnerSpec{
1364+
Env: []corev1.EnvVar{
1365+
{
1366+
Name: "POD_NAME",
1367+
ValueFrom: &corev1.EnvVarSource{
1368+
FieldRef: &corev1.ObjectFieldSelector{
1369+
FieldPath: "metadata.name",
1370+
},
1371+
},
1372+
},
1373+
{
1374+
Name: "POD_IP",
1375+
ValueFrom: &corev1.EnvVarSource{
1376+
FieldRef: &corev1.ObjectFieldSelector{
1377+
FieldPath: "status.podIP",
1378+
},
1379+
},
1380+
},
1381+
},
1382+
},
1383+
},
1384+
},
1385+
configv1alpha1.OverrideRunnerSpec{
1386+
Env: []corev1.EnvVar{
1387+
{
1388+
Name: "POD_NAME",
1389+
ValueFrom: &corev1.EnvVarSource{
1390+
FieldRef: &corev1.ObjectFieldSelector{
1391+
FieldPath: "metadata.name",
1392+
},
1393+
},
1394+
},
1395+
{
1396+
Name: "POD_IP",
1397+
ValueFrom: &corev1.EnvVarSource{
1398+
FieldRef: &corev1.ObjectFieldSelector{
1399+
FieldPath: "status.podIP",
1400+
},
1401+
},
12781402
},
12791403
},
12801404
},
@@ -1785,15 +1909,22 @@ func TestOverrideRunnerSpec(t *testing.T) {
17851909
if len(result.Env) != len(tc.expectedSpec.Env) {
17861910
t.Errorf("differents env size: got %d expected %d", len(result.Env), len(tc.expectedSpec.Env))
17871911
}
1788-
for _, env := range result.Env {
1912+
for _, expectedEnv := range tc.expectedSpec.Env {
17891913
found := false
1790-
for _, expected := range tc.expectedSpec.Env {
1791-
if env.Name == expected.Name && env.Value == expected.Value {
1792-
found = true
1914+
for _, givenEnv := range result.Env {
1915+
if givenEnv.Name == expectedEnv.Name {
1916+
if expectedEnv.ValueFrom != nil {
1917+
if reflect.DeepEqual(givenEnv.ValueFrom, expectedEnv.ValueFrom) {
1918+
found = true
1919+
}
1920+
} else if givenEnv.Value == expectedEnv.Value {
1921+
found = true
1922+
}
1923+
17931924
}
17941925
}
17951926
if !found {
1796-
t.Errorf("env %v not found in expected list %v", env, tc.expectedSpec.Env)
1927+
t.Errorf("env %v not found in given list %v", expectedEnv, result.Env)
17971928
}
17981929
}
17991930

docs/user-guide/override-runner.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ If the field is specified for a given `TerraformRepository` it will be applied b
66

77
If the field is specified for a given `TerraformLayer` it will take precedence over the `TerraformRepository` configuration.
88

9+
!!! info
10+
- Maps (dictionaries): A deep merge is performed. Keys in `TerraformLayer` overwrite those in `TerraformRepository`, but unmatched keys are preserved.
11+
- Arrays (lists): Arrays are not merged; they are fully replaced.
12+
913
Available overrides are:
1014

1115
| Fields |
@@ -22,6 +26,9 @@ Available overrides are:
2226
| `VolumeMounts` |
2327
| `Metadata.Annotations` |
2428
| `Metadata.Labels` |
29+
| `ExtraInitArgs` |
30+
| `ExtraPlanArgs` |
31+
| `ExtraApplyArgs` |
2532

2633
For instance with the following configuration, all the runner pods will have the specifications described inside the `TerraformRepository`:
2734

@@ -62,7 +69,7 @@ spec:
6269
namespace: burrito
6370
```
6471
65-
In the following case, `tolerations` and `nodeSelector` will be merged:
72+
In the following case, `nodeSelector` will be merged and `tolerations` will be replaced:
6673

6774
```yaml
6875
apiVersion: config.terraform.padok.cloud/v1alpha1

0 commit comments

Comments
 (0)