forked from rancher/wrangler
/
condition.go
102 lines (83 loc) · 2.33 KB
/
condition.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package summary
import (
"encoding/json"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"github.com/kubernot/wrangler/pkg/data"
)
func GetUnstructuredConditions(obj map[string]interface{}) []Condition {
return getConditions(obj)
}
func getRawConditions(obj data.Object) []data.Object {
statusAnn := obj.String("metadata", "annotations", "cattle.io/status")
if statusAnn != "" {
status := data.Object{}
if err := json.Unmarshal([]byte(statusAnn), &status); err == nil {
return append(obj.Slice("status", "conditions"), status.Slice("conditions")...)
}
}
return obj.Slice("status", "conditions")
}
func getConditions(obj data.Object) (result []Condition) {
for _, condition := range getRawConditions(obj) {
result = append(result, Condition{Object: condition})
}
return
}
type Condition struct {
data.Object
}
func NewCondition(conditionType, status, reason, message string) Condition {
return Condition{
Object: map[string]interface{}{
"type": conditionType,
"status": status,
"reason": reason,
"message": message,
},
}
}
func (c Condition) Type() string {
return c.String("type")
}
func (c Condition) Status() string {
return c.String("status")
}
func (c Condition) Reason() string {
return c.String("reason")
}
func (c Condition) Message() string {
return c.String("message")
}
func (c Condition) Equals(other Condition) bool {
return c.Type() == other.Type() &&
c.Status() == other.Status() &&
c.Reason() == other.Reason() &&
c.Message() == other.Message()
}
func NormalizeConditions(runtimeObj runtime.Object) {
var (
obj data.Object
newConditions []map[string]interface{}
)
unstr, ok := runtimeObj.(*unstructured.Unstructured)
if !ok {
return
}
obj = unstr.Object
for _, condition := range obj.Slice("status", "conditions") {
var summary Summary
for _, summarizer := range ConditionSummarizers {
summary = summarizer(obj, []Condition{{Object: condition}}, summary)
}
condition.Set("error", summary.Error)
condition.Set("transitioning", summary.Transitioning)
if condition.String("lastUpdateTime") == "" {
condition.Set("lastUpdateTime", condition.String("lastTransitionTime"))
}
newConditions = append(newConditions, condition)
}
if len(newConditions) > 0 {
obj.SetNested(newConditions, "status", "conditions")
}
}