Skip to content

Commit 9fb4be5

Browse files
authored
[2.14] use CAPI deprecated v1beta1 conditions if they exist (#618)
* use CAPI deprecated v1beta1 conditions if they exist * check CAPI apiVersion * rename variable
1 parent 54c0f6d commit 9fb4be5

2 files changed

Lines changed: 729 additions & 15 deletions

File tree

pkg/summary/condition.go

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,53 @@ import (
99
"github.com/rancher/wrangler/v3/pkg/data"
1010
)
1111

12+
const capiAPIVersionV1Beta2 = "cluster.x-k8s.io/v1beta2"
13+
1214
func GetUnstructuredConditions(obj map[string]interface{}) []Condition {
1315
return getConditions(obj)
1416
}
1517

1618
func 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

2761
func getConditions(obj data.Object) (result []Condition) {
@@ -70,18 +104,31 @@ func (c Condition) Equals(other Condition) bool {
70104
}
71105

72106
func 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

Comments
 (0)