Skip to content

Commit b395b6e

Browse files
committed
fix: make probe enabled defaults explicit
1 parent bc1405b commit b395b6e

6 files changed

Lines changed: 48 additions & 12 deletions

File tree

api/v1alpha1/types_shared.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ type TLSSpec struct {
6969
// ProbeSpec configures a Kubernetes probe with an enable toggle.
7070
type ProbeSpec struct {
7171
// Enabled toggles the probe on or off.
72-
// +kubebuilder:default=true
73-
Enabled bool `json:"enabled,omitempty"`
72+
// When omitted, readiness defaults to enabled while liveness defaults to disabled.
73+
Enabled *bool `json:"enabled,omitempty"`
7474
// InitialDelaySeconds is the delay before the probe starts.
7575
// +kubebuilder:default=0
7676
InitialDelaySeconds int32 `json:"initialDelaySeconds,omitempty"`

api/v1alpha1/zz_generated.deepcopy.go

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

config/crd/bases/coder.com_codercontrolplanes.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,7 @@ spec:
958958
secrets:
959959
description: |-
960960
Secrets lists Secret key selectors for CA certificates.
961-
Each is mounted at /etc/ssl/certs/<name>.crt.
961+
Each is mounted at `/etc/ssl/certs/{name}.crt`.
962962
items:
963963
description: CertSecretSelector identifies a key within a Secret
964964
for CA cert mounting.
@@ -1312,8 +1312,9 @@ spec:
13121312
plane container.
13131313
properties:
13141314
enabled:
1315-
default: true
1316-
description: Enabled toggles the probe on or off.
1315+
description: |-
1316+
Enabled toggles the probe on or off.
1317+
When omitted, readiness defaults to enabled while liveness defaults to disabled.
13171318
type: boolean
13181319
failureThreshold:
13191320
description: FailureThreshold is the minimum consecutive failures
@@ -1673,8 +1674,9 @@ spec:
16731674
control plane container.
16741675
properties:
16751676
enabled:
1676-
default: true
1677-
description: Enabled toggles the probe on or off.
1677+
description: |-
1678+
Enabled toggles the probe on or off.
1679+
When omitted, readiness defaults to enabled while liveness defaults to disabled.
16781680
type: boolean
16791681
failureThreshold:
16801682
description: FailureThreshold is the minimum consecutive failures

docs/reference/api/codercontrolplane.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ ProbeSpec configures a Kubernetes probe with an enable toggle.
143143

144144
| Field | Type | Description |
145145
| --- | --- | --- |
146-
| `enabled` | boolean | Enabled toggles the probe on or off. |
146+
| `enabled` | boolean | Enabled toggles the probe on or off. When omitted, readiness defaults to enabled while liveness defaults to disabled. |
147147
| `initialDelaySeconds` | integer | InitialDelaySeconds is the delay before the probe starts. |
148148
| `periodSeconds` | integer | PeriodSeconds controls how often the probe is performed. |
149149
| `timeoutSeconds` | integer | TimeoutSeconds is the probe timeout. |

internal/controller/codercontrolplane_controller.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,14 @@ func (r *CoderControlPlaneReconciler) cleanupManagedWorkspaceRBAC(
721721
return nil
722722
}
723723

724+
func probeEnabled(explicit *bool, defaultEnabled bool) bool {
725+
if explicit == nil {
726+
return defaultEnabled
727+
}
728+
729+
return *explicit
730+
}
731+
724732
func buildProbe(spec coderv1alpha1.ProbeSpec, path, portName string) *corev1.Probe {
725733
probe := &corev1.Probe{
726734
ProbeHandler: corev1.ProbeHandler{
@@ -930,10 +938,10 @@ func (r *CoderControlPlaneReconciler) reconcileDeployment(ctx context.Context, c
930938
if coderControlPlane.Spec.Resources != nil {
931939
container.Resources = *coderControlPlane.Spec.Resources
932940
}
933-
if coderControlPlane.Spec.ReadinessProbe.Enabled {
941+
if probeEnabled(coderControlPlane.Spec.ReadinessProbe.Enabled, true) {
934942
container.ReadinessProbe = buildProbe(coderControlPlane.Spec.ReadinessProbe, "/healthz", "http")
935943
}
936-
if coderControlPlane.Spec.LivenessProbe.Enabled {
944+
if probeEnabled(coderControlPlane.Spec.LivenessProbe.Enabled, false) {
937945
container.LivenessProbe = buildProbe(coderControlPlane.Spec.LivenessProbe, "/healthz", "http")
938946
}
939947

internal/controller/codercontrolplane_controller_test.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3005,21 +3005,42 @@ func TestReconcile_ProbeConfiguration(t *testing.T) {
30053005
}
30063006
})
30073007

3008+
t.Run("LivenessProbeEmptyObjectRemainsDisabled", func(t *testing.T) {
3009+
cp := createCoderControlPlaneUnstructured(ctx, t, "test-probe-liveness-empty-object", "default", map[string]any{
3010+
"image": "test-probes:latest",
3011+
"livenessProbe": map[string]any{},
3012+
})
3013+
3014+
r := &controller.CoderControlPlaneReconciler{Client: k8sClient, Scheme: scheme}
3015+
if _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{Name: cp.Name, Namespace: cp.Namespace}}); err != nil {
3016+
t.Fatalf("reconcile control plane: %v", err)
3017+
}
3018+
3019+
deployment := &appsv1.Deployment{}
3020+
if err := k8sClient.Get(ctx, types.NamespacedName{Name: cp.Name, Namespace: cp.Namespace}, deployment); err != nil {
3021+
t.Fatalf("get deployment: %v", err)
3022+
}
3023+
container := deployment.Spec.Template.Spec.Containers[0]
3024+
if container.LivenessProbe != nil {
3025+
t.Fatalf("expected liveness probe to stay disabled for empty object, got %#v", container.LivenessProbe)
3026+
}
3027+
})
3028+
30083029
t.Run("BothProbesEnabledWithCustomTiming", func(t *testing.T) {
30093030
cp := &coderv1alpha1.CoderControlPlane{
30103031
ObjectMeta: metav1.ObjectMeta{Name: "test-probe-custom", Namespace: "default"},
30113032
Spec: coderv1alpha1.CoderControlPlaneSpec{
30123033
Image: "test-probes:latest",
30133034
ReadinessProbe: coderv1alpha1.ProbeSpec{
3014-
Enabled: true,
3035+
Enabled: ptrTo(true),
30153036
InitialDelaySeconds: 3,
30163037
PeriodSeconds: ptrTo(int32(7)),
30173038
TimeoutSeconds: ptrTo(int32(2)),
30183039
SuccessThreshold: ptrTo(int32(2)),
30193040
FailureThreshold: ptrTo(int32(5)),
30203041
},
30213042
LivenessProbe: coderv1alpha1.ProbeSpec{
3022-
Enabled: true,
3043+
Enabled: ptrTo(true),
30233044
InitialDelaySeconds: 11,
30243045
PeriodSeconds: ptrTo(int32(13)),
30253046
TimeoutSeconds: ptrTo(int32(4)),

0 commit comments

Comments
 (0)