@@ -9,19 +9,53 @@ import (
99 "github.com/rancher/wrangler/v3/pkg/data"
1010)
1111
12+ const capiAPIVersionV1Beta2 = "cluster.x-k8s.io/v1beta2"
13+
1214func GetUnstructuredConditions (obj map [string ]interface {}) []Condition {
1315 return getConditions (obj )
1416}
1517
1618func getRawConditions (obj data.Object ) []data.Object {
19+ // For CAPI v1beta2 resources, use the deprecated v1beta1 conditions if they exist
20+ // Otherwise, use standard status.conditions
21+ conditions := getDeprecatedV1beta1Conditions (obj )
22+ if len (conditions ) == 0 {
23+ conditions = obj .Slice ("status" , "conditions" )
24+ }
25+
26+ // Append conditions from cattle.io/status annotation
27+ conditions = append (conditions , getAnnotationConditions (obj )... )
28+
29+ return conditions
30+ }
31+
32+ // getDeprecatedV1beta1Conditions returns the deprecated v1beta1 conditions for CAPI v1beta2 resources.
33+ // Returns nil if not a CAPI v1beta2 resource or if no deprecated conditions exist.
34+ func getDeprecatedV1beta1Conditions (obj data.Object ) []data.Object {
35+ if obj .String ("apiVersion" ) != capiAPIVersionV1Beta2 {
36+ return nil
37+ }
38+ return obj .Slice ("status" , "deprecated" , "v1beta1" , "conditions" )
39+ }
40+
41+ // getAnnotationConditions extracts conditions from the cattle.io/status annotation.
42+ // Returns an empty slice if the annotation doesn't exist or cannot be parsed.
43+ func getAnnotationConditions (obj data.Object ) []data.Object {
1744 statusAnn := obj .String ("metadata" , "annotations" , "cattle.io/status" )
18- if statusAnn != "" {
19- status := data.Object {}
20- if err := json .Unmarshal ([]byte (statusAnn ), & status ); err == nil {
21- return append (obj .Slice ("status" , "conditions" ), status .Slice ("conditions" )... )
22- }
45+ if statusAnn == "" {
46+ return []data.Object {}
47+ }
48+
49+ var status data.Object
50+ if err := json .Unmarshal ([]byte (statusAnn ), & status ); err != nil {
51+ return []data.Object {}
2352 }
24- return obj .Slice ("status" , "conditions" )
53+
54+ conditions := status .Slice ("conditions" )
55+ if conditions == nil {
56+ return []data.Object {}
57+ }
58+ return conditions
2559}
2660
2761func getConditions (obj data.Object ) (result []Condition ) {
@@ -70,18 +104,31 @@ func (c Condition) Equals(other Condition) bool {
70104}
71105
72106func NormalizeConditions (runtimeObj runtime.Object ) {
73- var (
74- obj data.Object
75- newConditions []map [string ]interface {}
76- )
107+ if runtimeObj == nil {
108+ return
109+ }
77110
78111 unstr , ok := runtimeObj .(* unstructured.Unstructured )
79112 if ! ok {
80113 return
81114 }
82115
83- obj = unstr .Object
84- for _ , condition := range obj .Slice ("status" , "conditions" ) {
116+ obj := data .Object (unstr .Object )
117+
118+ // For CAPI v1beta2 resources, normalize the deprecated v1beta1 conditions if they exist
119+ if deprecatedConditions := getDeprecatedV1beta1Conditions (obj ); len (deprecatedConditions ) > 0 {
120+ normalizeAndSetConditions (obj , deprecatedConditions , "status" , "deprecated" , "v1beta1" , "conditions" )
121+ }
122+
123+ // For all resources, normalize the standard status.conditions
124+ if conditions := obj .Slice ("status" , "conditions" ); len (conditions ) > 0 {
125+ normalizeAndSetConditions (obj , conditions , "status" , "conditions" )
126+ }
127+ }
128+
129+ func normalizeAndSetConditions (obj data.Object , conditions []data.Object , path ... string ) {
130+ var newConditions []interface {}
131+ for _ , condition := range conditions {
85132 var summary Summary
86133 for _ , summarizer := range ConditionSummarizers {
87134 summary = summarizer (obj , []Condition {{Object : condition }}, summary )
@@ -92,11 +139,10 @@ func NormalizeConditions(runtimeObj runtime.Object) {
92139 if condition .String ("lastUpdateTime" ) == "" {
93140 condition .Set ("lastUpdateTime" , condition .String ("lastTransitionTime" ))
94141 }
95- newConditions = append (newConditions , condition )
142+ newConditions = append (newConditions , map [ string ] interface {}( condition ) )
96143 }
97144
98145 if len (newConditions ) > 0 {
99- obj .SetNested (newConditions , "status" , "conditions" )
146+ obj .SetNested (newConditions , path ... )
100147 }
101-
102148}
0 commit comments