Skip to content

Commit c6ef3c3

Browse files
adupaysLucasMrqes
andauthored
feat(terraformrun): passing extra args to init plan and apply cmd (#417)
Co-authored-by: Lucas Marques <[email protected]>
1 parent 69d7033 commit c6ef3c3

13 files changed

+232
-0
lines changed

api/v1alpha1/common.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ const (
99
DefaultRunRetention int = 10
1010
)
1111

12+
type ExtraArgs []string
13+
1214
type OverrideRunnerSpec struct {
1315
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
1416
Image string `json:"image,omitempty"`
@@ -22,6 +24,9 @@ type OverrideRunnerSpec struct {
2224
Volumes []corev1.Volume `json:"volumes,omitempty"`
2325
VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`
2426
Metadata MetadataOverride `json:"metadata,omitempty"`
27+
ExtraInitArgs ExtraArgs `json:"extraInitArgs,omitempty"`
28+
ExtraPlanArgs ExtraArgs `json:"extraPlanArgs,omitempty"`
29+
ExtraApplyArgs ExtraArgs `json:"extraApplyArgs,omitempty"`
2530
}
2631

2732
type MetadataOverride struct {
@@ -105,6 +110,9 @@ func GetOverrideRunnerSpec(repository *TerraformRepository, layer *TerraformLaye
105110
ImagePullPolicy: chooseImagePullPolicy(repository.Spec.OverrideRunnerSpec.ImagePullPolicy, layer.Spec.OverrideRunnerSpec.ImagePullPolicy),
106111
ServiceAccountName: chooseString(repository.Spec.OverrideRunnerSpec.ServiceAccountName, layer.Spec.OverrideRunnerSpec.ServiceAccountName),
107112
ImagePullSecrets: mergeImagePullSecrets(repository.Spec.OverrideRunnerSpec.ImagePullSecrets, layer.Spec.OverrideRunnerSpec.ImagePullSecrets),
113+
ExtraInitArgs: overrideExtraArgs(repository.Spec.OverrideRunnerSpec.ExtraInitArgs, layer.Spec.OverrideRunnerSpec.ExtraInitArgs),
114+
ExtraPlanArgs: overrideExtraArgs(repository.Spec.OverrideRunnerSpec.ExtraPlanArgs, layer.Spec.OverrideRunnerSpec.ExtraPlanArgs),
115+
ExtraApplyArgs: overrideExtraArgs(repository.Spec.OverrideRunnerSpec.ExtraApplyArgs, layer.Spec.OverrideRunnerSpec.ExtraApplyArgs),
108116
}
109117
}
110118

@@ -313,3 +321,13 @@ func mergeMaps(a, b map[string]string) map[string]string {
313321
}
314322
return result
315323
}
324+
325+
func overrideExtraArgs(a, b ExtraArgs) ExtraArgs {
326+
result := b
327+
328+
if len(result) == 0 {
329+
result = a
330+
}
331+
332+
return result
333+
}

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/controllers/terraformrun/pod.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package terraformrun
33
import (
44
"context"
55
"fmt"
6+
"strings"
67

78
configv1alpha1 "github.com/padok-team/burrito/api/v1alpha1"
89
"github.com/padok-team/burrito/internal/burrito/config"
@@ -215,6 +216,26 @@ func (r *Reconciler) getPod(run *configv1alpha1.TerraformRun, layer *configv1alp
215216
if len(overrideSpec.Image) > 0 {
216217
defaultSpec.Containers[0].Image = overrideSpec.Image
217218
}
219+
220+
if len(overrideSpec.ExtraInitArgs) > 0 {
221+
defaultSpec.Containers[0].Env = append(defaultSpec.Containers[0].Env, corev1.EnvVar{
222+
Name: "TF_CLI_ARGS_init",
223+
Value: strings.Join(overrideSpec.ExtraInitArgs, " "),
224+
})
225+
}
226+
if len(overrideSpec.ExtraPlanArgs) > 0 {
227+
defaultSpec.Containers[0].Env = append(defaultSpec.Containers[0].Env, corev1.EnvVar{
228+
Name: "TF_CLI_ARGS_plan",
229+
Value: strings.Join(overrideSpec.ExtraPlanArgs, " "),
230+
})
231+
}
232+
if len(overrideSpec.ExtraApplyArgs) > 0 {
233+
defaultSpec.Containers[0].Env = append(defaultSpec.Containers[0].Env, corev1.EnvVar{
234+
Name: "TF_CLI_ARGS_apply",
235+
Value: strings.Join(overrideSpec.ExtraApplyArgs, " "),
236+
})
237+
}
238+
218239
pod := corev1.Pod{
219240
Spec: defaultSpec,
220241
ObjectMeta: metav1.ObjectMeta{
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package terraformrun_test
2+
3+
import (
4+
"context"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
9+
configv1alpha1 "github.com/padok-team/burrito/api/v1alpha1"
10+
"github.com/padok-team/burrito/internal/lock"
11+
corev1 "k8s.io/api/core/v1"
12+
"k8s.io/apimachinery/pkg/types"
13+
)
14+
15+
var _ = Describe("Pod", func() {
16+
var run *configv1alpha1.TerraformRun
17+
var reconcileError error
18+
var err error
19+
var name types.NamespacedName
20+
Describe("Nominal Case", func() {
21+
Describe("When a TerraformRun is created with overridden TF args", Ordered, func() {
22+
BeforeAll(func() {
23+
name = types.NamespacedName{
24+
Name: "nominal-case-extra-args-plan",
25+
Namespace: "default",
26+
}
27+
_, run, reconcileError, err = getResult(name)
28+
})
29+
It("should still exists", func() {
30+
Expect(err).NotTo(HaveOccurred())
31+
})
32+
It("should not return an error", func() {
33+
Expect(reconcileError).NotTo(HaveOccurred())
34+
})
35+
It("should end in Initial state", func() {
36+
Expect(run.Status.State).To(Equal("Initial"))
37+
})
38+
It("should have an associated pod", func() {
39+
Expect(run.Status.RunnerPod).To(Not(BeEmpty()))
40+
})
41+
It("should have created a lock on the layer", func() {
42+
layer := &configv1alpha1.TerraformLayer{}
43+
err := k8sClient.Get(context.TODO(), types.NamespacedName{
44+
Name: run.Spec.Layer.Name,
45+
Namespace: run.Namespace,
46+
}, layer)
47+
Expect(err).NotTo(HaveOccurred())
48+
Expect(lock.IsLayerLocked(context.TODO(), k8sClient, layer)).To(BeTrue())
49+
})
50+
It("should have created a pod", func() {
51+
pods, err := reconciler.GetLinkedPods(run)
52+
Expect(err).NotTo(HaveOccurred())
53+
Expect(len(pods.Items)).To(Equal(1))
54+
})
55+
It("should have passed the extra args env variables to the pod", func() {
56+
pods, err := reconciler.GetLinkedPods(run)
57+
Expect(err).NotTo(HaveOccurred())
58+
Expect(pods.Items[0].Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
59+
Name: "TF_CLI_ARGS_plan",
60+
Value: "--target 'module.this.random_pet.this[\"first\"]'",
61+
}))
62+
Expect(pods.Items[0].Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
63+
Name: "TF_CLI_ARGS_apply",
64+
Value: "--target 'module.this.random_pet.this[\"first\"]'",
65+
}))
66+
Expect(pods.Items[0].Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
67+
Name: "TF_CLI_ARGS_init",
68+
Value: "--upgrade",
69+
}))
70+
71+
})
72+
})
73+
})
74+
})
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: config.terraform.padok.cloud/v1alpha1
2+
kind: TerraformRun
3+
metadata:
4+
name: nominal-case-extra-args-plan
5+
namespace: default
6+
spec:
7+
action: plan
8+
layer:
9+
name: pod-nominal-case-extra-args
10+
namespace: default
11+
---
12+
apiVersion: config.terraform.padok.cloud/v1alpha1
13+
kind: TerraformRun
14+
metadata:
15+
name: nominal-case-extra-args-apply
16+
namespace: default
17+
spec:
18+
action: apply
19+
layer:
20+
name: pod-nominal-case-extra-args
21+
namespace: default
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
apiVersion: config.terraform.padok.cloud/v1alpha1
3+
kind: TerraformLayer
4+
metadata:
5+
name: pod-nominal-case-extra-args
6+
namespace: default
7+
spec:
8+
branch: main
9+
path: terraform/
10+
repository:
11+
name: burrito
12+
namespace: default
13+
overrideRunnerSpec:
14+
extraPlanArgs: ["--target", "'module.this.random_pet.this[\"first\"]'"]
15+
extraApplyArgs: ["--target", "'module.this.random_pet.this[\"first\"]'"]
16+
extraInitArgs: ["--upgrade"]

0 commit comments

Comments
 (0)