Skip to content

Commit ca0794e

Browse files
authored
fix: requeue mcp if not ready (#184)
1 parent a6b9f94 commit ca0794e

File tree

9 files changed

+193
-1
lines changed

9 files changed

+193
-1
lines changed

internal/controllers/managedcontrolplane/controller.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,13 @@ func (r *ManagedControlPlaneReconciler) Reconcile(ctx context.Context, req recon
9191
}).
9292
WithConditionUpdater(false).
9393
WithConditionEvents(r.eventRecorder, conditions.EventPerChange).
94-
WithSmartRequeue(r.sr).
94+
WithSmartRequeue(r.sr, func(rr ReconcileResult) ctrlutils.SmartRequeueAction {
95+
if rr.SmartRequeue == ctrlutils.SR_NO_REQUEUE && rr.Object.Status.Phase != commonapi.StatusPhaseReady {
96+
// requeue if the phase is not 'Ready' if a requeue is not already planned
97+
return ctrlutils.SR_BACKOFF
98+
}
99+
return rr.SmartRequeue
100+
}).
95101
Build().
96102
UpdateStatus(ctx, r.OnboardingCluster.Client(), rr)
97103
}

internal/controllers/managedcontrolplane/controller_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ var _ = Describe("ManagedControlPlane Controller", func() {
284284
Expect(env.Client(platform).Create(env.Ctx, sec)).To(Succeed())
285285
}
286286

287+
// remove non-ready cluster condition because it will prevent the MCP from becoming ready
288+
cluster.Status.Conditions[1].Status = metav1.ConditionTrue
289+
Expect(env.Client(platform).Status().Update(env.Ctx, cluster)).To(Succeed())
290+
287291
// reconcile the MCP again
288292
// expected outcome:
289293
// - the mcp has conditions that reflect that all access requests are ready
@@ -867,4 +871,29 @@ var _ = Describe("ManagedControlPlane Controller", func() {
867871
env.ShouldReconcile(mcpRec, testutils.RequestFromObject(mcp))
868872
})
869873

874+
It("should requeue the MCP if its phase is not 'Ready', even if all accesses are ready", func() {
875+
_, env := defaultTestSetup("testdata", "test-02")
876+
877+
mcp := &corev2alpha1.ManagedControlPlaneV2{}
878+
mcp.SetName("mcp-01")
879+
mcp.SetNamespace("test")
880+
Expect(env.Client(onboarding).Get(env.Ctx, client.ObjectKeyFromObject(mcp), mcp)).To(Succeed())
881+
882+
res := env.ShouldReconcile(mcpRec, testutils.RequestFromObject(mcp))
883+
Expect(env.Client(onboarding).Get(env.Ctx, client.ObjectKeyFromObject(mcp), mcp)).To(Succeed())
884+
Expect(mcp.Status.Conditions).To(ContainElements(
885+
MatchCondition(TestCondition().
886+
WithType("Cluster.Ready").
887+
WithStatus(metav1.ConditionFalse)),
888+
MatchCondition(TestCondition().
889+
WithType(corev2alpha1.ConditionAllAccessReady).
890+
WithStatus(metav1.ConditionTrue)),
891+
MatchCondition(TestCondition().
892+
WithType("AccessReady.token_viewer").
893+
WithStatus(metav1.ConditionTrue)),
894+
))
895+
Expect(res.RequeueAfter).To(BeNumerically(">", 0))
896+
Expect(res.RequeueAfter).To(BeNumerically("<", 1*time.Minute), "MCP has not been requeued")
897+
})
898+
870899
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
managedControlPlane:
2+
mcpClusterPurpose: mcp
3+
reconcileMCPEveryXDays: 7
4+
defaultOIDCProvider:
5+
issuer: https://example.com/oidc
6+
groupsPrefix: 'mygroups:'
7+
usernamePrefix: 'myuser:'
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: core.openmcp.cloud/v2alpha1
2+
kind: ManagedControlPlaneV2
3+
metadata:
4+
name: mcp-01
5+
namespace: test
6+
uid: 6aa4f8e1-a590-4fd7-b751-0b93f9f38bde
7+
spec:
8+
iam:
9+
tokens:
10+
- name: viewer
11+
permissions:
12+
- rules:
13+
- apiGroups: [ '' ]
14+
resources: [ 'pods', 'services' ]
15+
verbs: [ 'get', 'list', 'watch' ]
16+
status:
17+
access:
18+
token_viewer:
19+
name: 6nilzexg
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: v1
2+
data:
3+
kubeconfig: ZmFrZQ==
4+
kind: Secret
5+
metadata:
6+
labels:
7+
core.openmcp.cloud/mcp-name: mcp-01
8+
core.openmcp.cloud/mcp-namespace: test
9+
core.openmcp.cloud/token-provider: viewer
10+
openmcp.cloud/managed-by: ManagedControlPlane
11+
name: 6nilzexg
12+
namespace: test
13+
ownerReferences:
14+
- apiVersion: core.openmcp.cloud/v2alpha1
15+
blockOwnerDeletion: true
16+
controller: true
17+
kind: ManagedControlPlaneV2
18+
name: mcp-01
19+
uid: 6aa4f8e1-a590-4fd7-b751-0b93f9f38bde
20+
type: Opaque
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
apiVersion: clusters.openmcp.cloud/v1alpha1
2+
kind: AccessRequest
3+
metadata:
4+
finalizers:
5+
- clusters.openmcp.cloud/finalizer
6+
labels:
7+
clusters.openmcp.cloud/profile: kind
8+
clusters.openmcp.cloud/provider: kind
9+
core.openmcp.cloud/mcp-name: mcp-01
10+
core.openmcp.cloud/mcp-namespace: test
11+
core.openmcp.cloud/token-provider: viewer
12+
openmcp.cloud/managed-by: ManagedControlPlane
13+
name: c73jfgp2
14+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
15+
uid: 5ebc81b8-8d5a-4e57-9d7e-7ea4b915fcaf
16+
spec:
17+
clusterRef:
18+
name: mcp-12345
19+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
20+
requestRef:
21+
name: mcp-01
22+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
23+
token:
24+
permissions:
25+
- rules:
26+
- apiGroups:
27+
- ""
28+
resources:
29+
- pods
30+
- services
31+
verbs:
32+
- get
33+
- list
34+
- watch
35+
status:
36+
observedGeneration: 2
37+
phase: Granted
38+
secretRef:
39+
name: c73jfgp2.kubeconfig
40+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
creationTimestamp: "2025-10-14T11:02:07Z"
5+
name: c73jfgp2.kubeconfig
6+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
7+
ownerReferences:
8+
- apiVersion: clusters.openmcp.cloud/v1alpha1
9+
kind: AccessRequest
10+
name: c73jfgp2
11+
uid: 5ebc81b8-8d5a-4e57-9d7e-7ea4b915fcaf
12+
resourceVersion: "629926"
13+
uid: b7c4bf8e-442f-4c54-8eff-b7b5e4a41a4d
14+
type: Opaque
15+
data:
16+
kubeconfig: ZmFrZQ==
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
apiVersion: clusters.openmcp.cloud/v1alpha1
2+
kind: Cluster
3+
metadata:
4+
finalizers:
5+
- request.clusters.openmcp.cloud/24143a57-be40-495e-96e2-4623e563a066
6+
- clusters.openmcp.cloud/finalizer
7+
generation: 1
8+
labels:
9+
clusters.openmcp.cloud/delete-without-requests: "true"
10+
name: mcp-12345
11+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
12+
spec:
13+
kubernetes: {}
14+
profile: kind
15+
purposes:
16+
- mcp
17+
tenancy: Exclusive
18+
status:
19+
conditions:
20+
- lastTransitionTime: "2025-09-22T08:23:32Z"
21+
message: ""
22+
reason: ClusterExists
23+
status: "True"
24+
type: KindReady
25+
- lastTransitionTime: "2025-09-22T08:24:02Z"
26+
message: ""
27+
reason: AllPodsReady
28+
status: "True"
29+
type: MetalLBReady
30+
- lastTransitionTime: "2025-09-22T08:24:02Z"
31+
message: ""
32+
reason: ClusterAndMetalLBReady
33+
status: "False"
34+
type: Ready
35+
observedGeneration: 0
36+
phase: Progressing
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: clusters.openmcp.cloud/v1alpha1
2+
kind: ClusterRequest
3+
metadata:
4+
labels:
5+
core.openmcp.cloud/mcp-name: mcp-01
6+
core.openmcp.cloud/mcp-namespace: test
7+
openmcp.cloud/managed-by: ManagedControlPlane
8+
name: mcp-01
9+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
10+
uid: 24143a57-be40-495e-96e2-4623e563a066
11+
spec:
12+
purpose: mcp
13+
waitForClusterDeletion: true
14+
status:
15+
cluster:
16+
name: mcp-12345
17+
namespace: mcp--ac6294ed-3227-8926-b364-f791fabdb843
18+
observedGeneration: 1
19+
phase: Granted

0 commit comments

Comments
 (0)