Skip to content

Commit f7eb97f

Browse files
authored
Add liveness and startup probe helpers (elastic#8634)
Extend the PodTemplateBuilder with the methods WithLivenessProbe and WithStartupProbe.
1 parent 87a9350 commit f7eb97f

File tree

3 files changed

+169
-1
lines changed

3 files changed

+169
-1
lines changed

pkg/controller/common/container/defaulter.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ func (d Defaulter) From(other corev1.Container) Defaulter {
4040
WithEnv(other.Env).
4141
WithResources(other.Resources).
4242
WithVolumeMounts(other.VolumeMounts).
43-
WithReadinessProbe(other.ReadinessProbe)
43+
WithReadinessProbe(other.ReadinessProbe).
44+
WithLivenessProbe(other.LivenessProbe).
45+
WithStartupProbe(other.StartupProbe)
4446
}
4547

4648
func (d Defaulter) WithCommand(command []string) Defaulter {
@@ -96,6 +98,20 @@ func (d Defaulter) WithReadinessProbe(readinessProbe *corev1.Probe) Defaulter {
9698
return d
9799
}
98100

101+
func (d Defaulter) WithLivenessProbe(livenessProbe *corev1.Probe) Defaulter {
102+
if d.base.LivenessProbe == nil {
103+
d.base.LivenessProbe = livenessProbe
104+
}
105+
return d
106+
}
107+
108+
func (d Defaulter) WithStartupProbe(startupProbe *corev1.Probe) Defaulter {
109+
if d.base.StartupProbe == nil {
110+
d.base.StartupProbe = startupProbe
111+
}
112+
return d
113+
}
114+
99115
// envExists checks if an env var with the given name already exists in the provided slice.
100116
func (d Defaulter) envExists(name string) bool {
101117
for _, v := range d.base.Env {

pkg/controller/common/defaults/pod_template.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ func (b *PodTemplateBuilder) WithReadinessProbe(readinessProbe corev1.Probe) *Po
121121
return b
122122
}
123123

124+
// WithLivenessProbe sets up the given liveness probe, unless already provided in the template.
125+
func (b *PodTemplateBuilder) WithLivenessProbe(livenessProbe corev1.Probe) *PodTemplateBuilder {
126+
b.containerDefaulter.WithLivenessProbe(&livenessProbe)
127+
return b
128+
}
129+
130+
// WithStartupProbe sets up the given startup probe, unless already provided in the template.
131+
func (b *PodTemplateBuilder) WithStartupProbe(startupProbe corev1.Probe) *PodTemplateBuilder {
132+
b.containerDefaulter.WithStartupProbe(&startupProbe)
133+
return b
134+
}
135+
124136
// WithAffinity sets a default affinity, unless already provided in the template.
125137
// An empty affinity in the spec is not overridden.
126138
func (b *PodTemplateBuilder) WithAffinity(affinity *corev1.Affinity) *PodTemplateBuilder {

pkg/controller/common/defaults/pod_template_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,146 @@ func TestPodTemplateBuilder_WithReadinessProbe(t *testing.T) {
274274
}
275275
}
276276

277+
func TestPodTemplateBuilder_WithLivenessProbe(t *testing.T) {
278+
containerName := "mycontainer"
279+
tests := []struct {
280+
name string
281+
PodTemplate corev1.PodTemplateSpec
282+
livenessProbe corev1.Probe
283+
want *corev1.Probe
284+
}{
285+
{
286+
name: "no liveness probe in pod template: use default one",
287+
PodTemplate: corev1.PodTemplateSpec{},
288+
livenessProbe: corev1.Probe{
289+
ProbeHandler: corev1.ProbeHandler{
290+
HTTPGet: &corev1.HTTPGetAction{
291+
Path: "/probe",
292+
},
293+
},
294+
},
295+
want: &corev1.Probe{
296+
ProbeHandler: corev1.ProbeHandler{
297+
HTTPGet: &corev1.HTTPGetAction{
298+
Path: "/probe",
299+
},
300+
},
301+
},
302+
},
303+
{
304+
name: "don't override pod template liveness probe",
305+
PodTemplate: corev1.PodTemplateSpec{
306+
Spec: corev1.PodSpec{
307+
Containers: []corev1.Container{
308+
{
309+
Name: containerName,
310+
LivenessProbe: &corev1.Probe{
311+
ProbeHandler: corev1.ProbeHandler{
312+
HTTPGet: &corev1.HTTPGetAction{
313+
Path: "/user-provided",
314+
},
315+
},
316+
},
317+
},
318+
},
319+
},
320+
},
321+
livenessProbe: corev1.Probe{
322+
ProbeHandler: corev1.ProbeHandler{
323+
HTTPGet: &corev1.HTTPGetAction{
324+
Path: "/probe",
325+
},
326+
},
327+
},
328+
want: &corev1.Probe{
329+
ProbeHandler: corev1.ProbeHandler{
330+
HTTPGet: &corev1.HTTPGetAction{
331+
Path: "/user-provided",
332+
},
333+
},
334+
},
335+
},
336+
}
337+
for _, tt := range tests {
338+
t.Run(tt.name, func(t *testing.T) {
339+
b := NewPodTemplateBuilder(tt.PodTemplate, containerName)
340+
if got := b.WithLivenessProbe(tt.livenessProbe).containerDefaulter.Container().LivenessProbe; !reflect.DeepEqual(got, tt.want) {
341+
t.Errorf("PodTemplateBuilder.WithLivenessProbe() = %v, want %v", got, tt.want)
342+
}
343+
})
344+
}
345+
}
346+
347+
func TestPodTemplateBuilder_WithStartupProbe(t *testing.T) {
348+
containerName := "mycontainer"
349+
tests := []struct {
350+
name string
351+
PodTemplate corev1.PodTemplateSpec
352+
startupProbe corev1.Probe
353+
want *corev1.Probe
354+
}{
355+
{
356+
name: "no startup probe in pod template: use default one",
357+
PodTemplate: corev1.PodTemplateSpec{},
358+
startupProbe: corev1.Probe{
359+
ProbeHandler: corev1.ProbeHandler{
360+
HTTPGet: &corev1.HTTPGetAction{
361+
Path: "/probe",
362+
},
363+
},
364+
},
365+
want: &corev1.Probe{
366+
ProbeHandler: corev1.ProbeHandler{
367+
HTTPGet: &corev1.HTTPGetAction{
368+
Path: "/probe",
369+
},
370+
},
371+
},
372+
},
373+
{
374+
name: "don't override pod template startup probe",
375+
PodTemplate: corev1.PodTemplateSpec{
376+
Spec: corev1.PodSpec{
377+
Containers: []corev1.Container{
378+
{
379+
Name: containerName,
380+
StartupProbe: &corev1.Probe{
381+
ProbeHandler: corev1.ProbeHandler{
382+
HTTPGet: &corev1.HTTPGetAction{
383+
Path: "/user-provided",
384+
},
385+
},
386+
},
387+
},
388+
},
389+
},
390+
},
391+
startupProbe: corev1.Probe{
392+
ProbeHandler: corev1.ProbeHandler{
393+
HTTPGet: &corev1.HTTPGetAction{
394+
Path: "/probe",
395+
},
396+
},
397+
},
398+
want: &corev1.Probe{
399+
ProbeHandler: corev1.ProbeHandler{
400+
HTTPGet: &corev1.HTTPGetAction{
401+
Path: "/user-provided",
402+
},
403+
},
404+
},
405+
},
406+
}
407+
for _, tt := range tests {
408+
t.Run(tt.name, func(t *testing.T) {
409+
b := NewPodTemplateBuilder(tt.PodTemplate, containerName)
410+
if got := b.WithStartupProbe(tt.startupProbe).containerDefaulter.Container().StartupProbe; !reflect.DeepEqual(got, tt.want) {
411+
t.Errorf("PodTemplateBuilder.WithStartupProbe() = %v, want %v", got, tt.want)
412+
}
413+
})
414+
}
415+
}
416+
277417
func TestPodTemplateBuilder_WithAffinity(t *testing.T) {
278418
defaultAffinity := &corev1.Affinity{
279419
NodeAffinity: &corev1.NodeAffinity{},

0 commit comments

Comments
 (0)