Skip to content

Commit 8a5bb61

Browse files
Copilotbritaniar
andauthored
fix: add missing Message field in member cluster conditions (#92)
--------- Signed-off-by: Zhiying Lin <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: britaniar <[email protected]>
1 parent 1874289 commit 8a5bb61

File tree

3 files changed

+37
-40
lines changed

3 files changed

+37
-40
lines changed

pkg/controllers/membercluster/v1beta1/membercluster_controller.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -548,8 +548,10 @@ func (r *Reconciler) updateMemberClusterStatus(ctx context.Context, mc *clusterv
548548
// aggregateJoinedCondition is used to calculate and mark the joined or left status for member cluster based on join conditions from all agents.
549549
func (r *Reconciler) aggregateJoinedCondition(mc *clusterv1beta1.MemberCluster) {
550550
klog.V(2).InfoS("Aggregate joined condition from all agents", "memberCluster", klog.KObj(mc))
551+
var unknownMessage string
551552
if len(mc.Status.AgentStatus) < len(r.agents) {
552-
markMemberClusterUnknown(r.recorder, mc)
553+
unknownMessage = fmt.Sprintf("Member cluster %s has not reported all the expected agents, expected %d, got %d", mc.Name, len(r.agents), len(mc.Status.AgentStatus))
554+
markMemberClusterUnknown(r.recorder, mc, unknownMessage)
553555
return
554556
}
555557
joined := true
@@ -562,7 +564,8 @@ func (r *Reconciler) aggregateJoinedCondition(mc *clusterv1beta1.MemberCluster)
562564
}
563565
condition := meta.FindStatusCondition(agentStatus.Conditions, string(clusterv1beta1.AgentJoined))
564566
if condition == nil {
565-
markMemberClusterUnknown(r.recorder, mc)
567+
unknownMessage = fmt.Sprintf("Member cluster %s has not reported the join condition for agent %s", mc.Name, agentStatus.Type)
568+
markMemberClusterUnknown(r.recorder, mc, unknownMessage)
566569
return
567570
}
568571

@@ -572,7 +575,8 @@ func (r *Reconciler) aggregateJoinedCondition(mc *clusterv1beta1.MemberCluster)
572575
}
573576

574577
if len(reportedAgents) < len(r.agents) {
575-
markMemberClusterUnknown(r.recorder, mc)
578+
unknownMessage = fmt.Sprintf("Member cluster %s has not reported all the expected agents, expected %d, got %d", mc.Name, len(r.agents), len(reportedAgents))
579+
markMemberClusterUnknown(r.recorder, mc, unknownMessage)
576580
return
577581
}
578582

@@ -581,7 +585,8 @@ func (r *Reconciler) aggregateJoinedCondition(mc *clusterv1beta1.MemberCluster)
581585
} else if !joined && left {
582586
markMemberClusterLeft(r.recorder, mc)
583587
} else {
584-
markMemberClusterUnknown(r.recorder, mc)
588+
unknownMessage = "Member agents are not in a consistent state"
589+
markMemberClusterUnknown(r.recorder, mc, unknownMessage)
585590
}
586591
}
587592

@@ -592,6 +597,7 @@ func markMemberClusterReadyToJoin(recorder record.EventRecorder, mc apis.Conditi
592597
Type: string(clusterv1beta1.ConditionTypeMemberClusterReadyToJoin),
593598
Status: metav1.ConditionTrue,
594599
Reason: reasonMemberClusterReadyToJoin,
600+
Message: "Member cluster is ready to join the fleet",
595601
ObservedGeneration: mc.GetGeneration(),
596602
}
597603

@@ -612,6 +618,7 @@ func markMemberClusterJoined(recorder record.EventRecorder, mc apis.ConditionedO
612618
Type: string(clusterv1beta1.ConditionTypeMemberClusterJoined),
613619
Status: metav1.ConditionTrue,
614620
Reason: reasonMemberClusterJoined,
621+
Message: "Member cluster has successfully joined the fleet",
615622
ObservedGeneration: mc.GetGeneration(),
616623
}
617624

@@ -633,12 +640,14 @@ func markMemberClusterLeft(recorder record.EventRecorder, mc apis.ConditionedObj
633640
Type: string(clusterv1beta1.ConditionTypeMemberClusterJoined),
634641
Status: metav1.ConditionFalse,
635642
Reason: reasonMemberClusterLeft,
643+
Message: "Member cluster has left the fleet",
636644
ObservedGeneration: mc.GetGeneration(),
637645
}
638646
notReadyCondition := metav1.Condition{
639647
Type: string(clusterv1beta1.ConditionTypeMemberClusterReadyToJoin),
640648
Status: metav1.ConditionFalse,
641649
Reason: reasonMemberClusterNotReadyToJoin,
650+
Message: "Member cluster is not ready to join the fleet",
642651
ObservedGeneration: mc.GetGeneration(),
643652
}
644653

@@ -654,12 +663,13 @@ func markMemberClusterLeft(recorder record.EventRecorder, mc apis.ConditionedObj
654663
}
655664

656665
// markMemberClusterUnknown is used to update the status of the member cluster to have the left condition.
657-
func markMemberClusterUnknown(recorder record.EventRecorder, mc apis.ConditionedObj) {
666+
func markMemberClusterUnknown(recorder record.EventRecorder, mc apis.ConditionedObj, unknownMessage string) {
658667
klog.V(2).InfoS("Mark the member cluster join condition unknown", "memberCluster", klog.KObj(mc))
659668
newCondition := metav1.Condition{
660669
Type: string(clusterv1beta1.ConditionTypeMemberClusterJoined),
661670
Status: metav1.ConditionUnknown,
662671
Reason: reasonMemberClusterUnknown,
672+
Message: unknownMessage,
663673
ObservedGeneration: mc.GetGeneration(),
664674
}
665675

pkg/controllers/membercluster/v1beta1/membercluster_controller_integration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const (
4444
)
4545

4646
var (
47-
ignoreOption = cmpopts.IgnoreFields(metav1.Condition{}, "LastTransitionTime")
47+
ignoreOption = cmpopts.IgnoreFields(metav1.Condition{}, "LastTransitionTime", "Message")
4848
)
4949

5050
var _ = Describe("Test MemberCluster Controller", func() {
@@ -502,7 +502,7 @@ var _ = Describe("Test MemberCluster Controller", func() {
502502
ResourceUsage: imc.Status.ResourceUsage,
503503
AgentStatus: imc.Status.AgentStatus,
504504
}
505-
options := cmpopts.IgnoreFields(metav1.Condition{}, "LastTransitionTime", "ObservedGeneration")
505+
options := cmpopts.IgnoreFields(metav1.Condition{}, "LastTransitionTime", "ObservedGeneration", "Message")
506506
// ignore the ObservedGeneration here cause controller won't update the ReadyToJoin condition.
507507
Expect(cmp.Diff(wantMC, mc.Status, options)).Should(BeEmpty(), "mc status mismatch, (-want, +got)")
508508

pkg/controllers/membercluster/v1beta1/membercluster_controller_test.go

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ func TestMarkMemberClusterJoined(t *testing.T) {
695695

696696
// Check expected conditions.
697697
expectedConditions := []metav1.Condition{
698-
{Type: string(clusterv1beta1.ConditionTypeMemberClusterJoined), Status: metav1.ConditionTrue, Reason: reasonMemberClusterJoined},
698+
{Type: string(clusterv1beta1.ConditionTypeMemberClusterJoined), Status: metav1.ConditionTrue, Reason: reasonMemberClusterJoined, Message: "Member cluster has successfully joined the fleet"},
699699
}
700700

701701
for i := range expectedConditions {
@@ -799,16 +799,14 @@ func TestSyncInternalMemberClusterStatus(t *testing.T) {
799799
Reason: reasonMemberClusterJoined,
800800
},
801801
{
802-
Type: propertyProviderConditionType1,
803-
Status: propertyProviderConditionStatus1,
804-
Reason: propertyProviderConditionReason1,
805-
Message: propertyProviderConditionMessage1,
802+
Type: propertyProviderConditionType1,
803+
Status: propertyProviderConditionStatus1,
804+
Reason: propertyProviderConditionReason1,
806805
},
807806
{
808-
Type: propertyProviderConditionType2,
809-
Status: propertyProviderConditionStatus2,
810-
Reason: propertyProviderConditionReason2,
811-
Message: propertyProviderConditionMessage2,
807+
Type: propertyProviderConditionType2,
808+
Status: propertyProviderConditionStatus2,
809+
Reason: propertyProviderConditionReason2,
812810
},
813811
},
814812
Properties: map[clusterv1beta1.PropertyName]clusterv1beta1.PropertyValue{
@@ -1444,30 +1442,19 @@ func TestSyncInternalMemberClusterStatus(t *testing.T) {
14441442
for testName, tt := range tests {
14451443
t.Run(testName, func(t *testing.T) {
14461444
tt.r.syncInternalMemberClusterStatus(tt.internalMemberCluster, tt.memberCluster)
1447-
1448-
// Compare the Joined condition.
1449-
diff := cmp.Diff(tt.wantedMemberCluster.GetCondition(string(clusterv1beta1.ConditionTypeMemberClusterJoined)),
1450-
tt.memberCluster.GetCondition(string(clusterv1beta1.ConditionTypeMemberClusterJoined)),
1451-
cmpopts.IgnoreTypes(time.Time{}))
1452-
assert.Equal(t, "", diff)
1453-
1454-
// Compare the property provider conditions (if present).
1455-
diff = cmp.Diff(tt.wantedMemberCluster.GetCondition(propertyProviderConditionType1),
1456-
tt.memberCluster.GetCondition(propertyProviderConditionType1),
1457-
cmpopts.IgnoreTypes(time.Time{}))
1458-
assert.Equal(t, "", diff)
1459-
1460-
diff = cmp.Diff(tt.wantedMemberCluster.GetCondition(propertyProviderConditionType2),
1461-
tt.memberCluster.GetCondition(propertyProviderConditionType2),
1462-
cmpopts.IgnoreTypes(time.Time{}))
1463-
assert.Equal(t, "", diff)
1464-
1465-
// Compare the properties (if present).
1466-
assert.Equal(t, tt.wantedMemberCluster.Status.Properties, tt.memberCluster.Status.Properties)
1467-
// Compare the resource usage.
1468-
assert.Equal(t, tt.wantedMemberCluster.Status.ResourceUsage, tt.memberCluster.Status.ResourceUsage)
1469-
// Compare the agent status.
1470-
assert.Equal(t, tt.wantedMemberCluster.Status.AgentStatus, tt.memberCluster.Status.AgentStatus)
1445+
// Compare the entire MemberCluster status struct, ignoring time.Time fields.
1446+
cmpOptions := cmp.Options{
1447+
cmpopts.IgnoreFields(metav1.Condition{}, "Message", "LastTransitionTime"),
1448+
cmpopts.SortSlices(func(c1, c2 metav1.Condition) bool {
1449+
return c1.Type < c2.Type
1450+
}),
1451+
cmpopts.SortSlices(func(a1, a2 clusterv1beta1.AgentStatus) bool {
1452+
return a1.Type < a2.Type
1453+
}),
1454+
}
1455+
if diff := cmp.Diff(tt.wantedMemberCluster.Status, tt.memberCluster.Status, cmpOptions); diff != "" {
1456+
t.Errorf("syncInternalMemberClusterStatus() mismatch (-want +got):\n%s", diff)
1457+
}
14711458
})
14721459
}
14731460
}

0 commit comments

Comments
 (0)