From 05bbadfceb3bdc5ee54e7cd2f9d7adba8d959a32 Mon Sep 17 00:00:00 2001 From: kelly-gao Date: Fri, 6 Feb 2026 02:00:38 -0500 Subject: [PATCH 1/4] Updated ready-status-priority logic with sorting --- api/v1/runtimecomponent_types.go | 15 +++++++++++++++ utils/reconciler_test.go | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/api/v1/runtimecomponent_types.go b/api/v1/runtimecomponent_types.go index 9c875478..cb6a3a22 100644 --- a/api/v1/runtimecomponent_types.go +++ b/api/v1/runtimecomponent_types.go @@ -17,6 +17,8 @@ limitations under the License. package v1 import ( + "fmt" + "sort" "time" "github.com/application-stacks/runtime-component-operator/common" @@ -1278,6 +1280,19 @@ func (s *RuntimeComponentStatus) SetCondition(c common.StatusCondition) { if !found { s.Conditions = append(s.Conditions, *condition) } + + // Re-sort conditions to prioritize 'Ready' condition + sort.Slice(s.Conditions, func(i, j int) bool { + if s.Conditions[i].GetType() == common.StatusConditionTypeReady { + return true + } + if s.Conditions[j].GetType() == common.StatusConditionTypeReady { + return false + } + return s.Conditions[i].GetType() < s.Conditions[j].GetType() + }) + + fmt.Printf("DEBUG: First condition is now: %s\n", s.Conditions[0].GetType()) } func (s *RuntimeComponentStatus) UnsetCondition(c common.StatusCondition) { diff --git a/utils/reconciler_test.go b/utils/reconciler_test.go index 35acf8f0..5cb68b0d 100644 --- a/utils/reconciler_test.go +++ b/utils/reconciler_test.go @@ -299,7 +299,7 @@ func TestManageError(t *testing.T) { testME := []Test{ {"ManageError Requeue", true, rec.Requeue}, - {"ManageError New Condition Status", corev1.ConditionFalse, runtimecomponent.Status.Conditions[0].Status}, + {"ManageError New Condition Status", corev1.ConditionFalse, runtimecomponent.Status.GetCondition(common.StatusConditionTypeReconciled).GetStatus()}, } verifyTests(testME, t) } @@ -318,7 +318,7 @@ func TestManageSuccess(t *testing.T) { r.ManageSuccess(common.StatusConditionTypeReconciled, runtimecomponent) testMS := []Test{ - {"ManageSuccess New Condition Status", corev1.ConditionTrue, runtimecomponent.Status.Conditions[0].Status}, + {"ManageSuccess New Condition Status", corev1.ConditionTrue, runtimecomponent.Status.GetCondition(common.StatusConditionTypeReconciled).GetStatus()}, } verifyTests(testMS, t) } From f7918505d63dd34947600f3bdf50c4829f2cad65 Mon Sep 17 00:00:00 2001 From: kelly-gao Date: Fri, 6 Feb 2026 02:10:37 -0500 Subject: [PATCH 2/4] Remove debug line --- api/v1/runtimecomponent_types.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/v1/runtimecomponent_types.go b/api/v1/runtimecomponent_types.go index cb6a3a22..b23541d4 100644 --- a/api/v1/runtimecomponent_types.go +++ b/api/v1/runtimecomponent_types.go @@ -17,7 +17,6 @@ limitations under the License. package v1 import ( - "fmt" "sort" "time" @@ -1291,8 +1290,6 @@ func (s *RuntimeComponentStatus) SetCondition(c common.StatusCondition) { } return s.Conditions[i].GetType() < s.Conditions[j].GetType() }) - - fmt.Printf("DEBUG: First condition is now: %s\n", s.Conditions[0].GetType()) } func (s *RuntimeComponentStatus) UnsetCondition(c common.StatusCondition) { From 0edcf301a7eef808b137af2aca15b63e23b9c283 Mon Sep 17 00:00:00 2001 From: kelly-gao Date: Fri, 6 Feb 2026 18:28:38 -0500 Subject: [PATCH 3/4] Updated setcondition v1beta2 --- api/v1beta2/runtimecomponent_types.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/api/v1beta2/runtimecomponent_types.go b/api/v1beta2/runtimecomponent_types.go index 6411a77b..62048ccc 100644 --- a/api/v1beta2/runtimecomponent_types.go +++ b/api/v1beta2/runtimecomponent_types.go @@ -17,6 +17,7 @@ limitations under the License. package v1beta2 import ( + "sort" "time" "github.com/application-stacks/runtime-component-operator/common" @@ -1026,6 +1027,16 @@ func (s *RuntimeComponentStatus) SetCondition(c common.StatusCondition) { if !found { s.Conditions = append(s.Conditions, *condition) } + // Re-sort conditions to prioritize 'Ready' condition + sort.Slice(s.Conditions, func(i, j int) bool { + if s.Conditions[i].GetType() == common.StatusConditionTypeReady { + return true + } + if s.Conditions[j].GetType() == common.StatusConditionTypeReady { + return false + } + return s.Conditions[i].GetType() < s.Conditions[j].GetType() + }) } func convertToCommonStatusConditionType(c StatusConditionType) common.StatusConditionType { From 940bb3c03cc461acb0b69ddc90062955088e9f59 Mon Sep 17 00:00:00 2001 From: kelly-gao Date: Wed, 11 Mar 2026 09:54:59 -0400 Subject: [PATCH 4/4] Update status_test.go with unit tests for SetCondition to check Ready condition sort order --- utils/status_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/utils/status_test.go b/utils/status_test.go index f781f58e..cb4faf24 100644 --- a/utils/status_test.go +++ b/utils/status_test.go @@ -294,6 +294,52 @@ func TestKnativeReady(t *testing.T) { verifyTests(testKS, t) } +func TestReadyConditionSorting(t *testing.T) { + // Setup fake client and reconciler base + spec := appstacksv1.RuntimeComponentSpec{Replicas: &st_replicas} + _, runtimecomponent := setupFakeClientWithRC(spec) + s := runtimecomponent.GetStatus() + + // Add conditions in worst-case order, Ready adeed last + reconciled := s.NewCondition(common.StatusConditionTypeReconciled) + reconciled.SetStatus(v1.ConditionTrue) + s.SetCondition(reconciled) + + resourcesReady := s.NewCondition(common.StatusConditionTypeResourcesReady) + resourcesReady.SetStatus(v1.ConditionTrue) + s.SetCondition(resourcesReady) + + ready := s.NewCondition(common.StatusConditionTypeReady) + ready.SetStatus(v1.ConditionTrue) + s.SetCondition(ready) + + conditions := s.GetConditions() + readyTrueFirst := conditions[0].GetType() + + // Set Ready to False and call SetCondition again + ready.SetStatus(v1.ConditionFalse) + s.SetCondition(ready) + + conditions = s.GetConditions() + readyFalseFirst := conditions[0].GetType() + + // Adding a fourth condition- warning + warning := s.NewCondition(common.StatusConditionTypeWarning) + warning.SetStatus(v1.ConditionTrue) + s.SetCondition(warning) + + conditions = s.GetConditions() + readyWithWarningFirst := conditions[0].GetType() + + testCases := []Test{ + {test: "Ready is first condition", expected: common.StatusConditionTypeReady, actual: readyTrueFirst}, + {test: "Ready is first condition with False status", expected: common.StatusConditionTypeReady, actual: readyFalseFirst}, + {test: "Ready is first condition with additional warning condition", expected: common.StatusConditionTypeReady, actual: readyWithWarningFirst}, + } + + verifyTests(testCases, t) +} + // Setup fake client with RuntimeComponent kind // Creates a RuntimeComponent object with input spec func setupFakeClientWithRC(spec appstacksv1.RuntimeComponentSpec) (ReconcilerBase, *appstacksv1.RuntimeComponent) {