...
1
2
3
4 package event
5
6 import (
7 "fmt"
8
9 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
10 "sigs.k8s.io/cli-utils/pkg/kstatus/status"
11 "sigs.k8s.io/cli-utils/pkg/object"
12 )
13
14
15
16
17
18 type Type int
19
20 const (
21
22 ResourceUpdateEvent Type = iota
23
24
25 ErrorEvent
26
27
28
29 SyncEvent
30 )
31
32
33
34 type Event struct {
35
36 Type Type
37
38
39
40 Resource *ResourceStatus
41
42
43
44 Error error
45 }
46
47
48 func (e Event) String() string {
49 if e.Error != nil {
50 return fmt.Sprintf("Event{ Type: %q, Resource: %v, Error: %q }",
51 e.Type, e.Resource, e.Error)
52 }
53 return fmt.Sprintf("Event{ Type: %q, Resource: %v }",
54 e.Type, e.Resource)
55 }
56
57
58
59 type ResourceStatus struct {
60
61
62 Identifier object.ObjMetadata
63
64
65 Status status.Status
66
67
68
69 Resource *unstructured.Unstructured
70
71
72
73 Error error
74
75
76 Message string
77
78
79
80
81 GeneratedResources ResourceStatuses
82 }
83
84
85 func (rs ResourceStatus) String() string {
86 if rs.Error != nil {
87 return fmt.Sprintf("ResourceStatus{ Identifier: %q, Status: %q, Message: %q, Resource: %v, GeneratedResources: %v, Error: %q }",
88 rs.Identifier, rs.Status, rs.Message, rs.Resource, rs.GeneratedResources, rs.Error)
89 }
90 return fmt.Sprintf("ResourceStatus{ Identifier: %q, Status: %q, Message: %q, Resource: %v, GeneratedResources: %v }",
91 rs.Identifier, rs.Status, rs.Message, rs.Resource, rs.GeneratedResources)
92 }
93
94 type ResourceStatuses []*ResourceStatus
95
96 func (g ResourceStatuses) Len() int {
97 return len(g)
98 }
99
100 func (g ResourceStatuses) Less(i, j int) bool {
101 idI := g[i].Identifier
102 idJ := g[j].Identifier
103
104 if idI.Namespace != idJ.Namespace {
105 return idI.Namespace < idJ.Namespace
106 }
107 if idI.GroupKind.Group != idJ.GroupKind.Group {
108 return idI.GroupKind.Group < idJ.GroupKind.Group
109 }
110 if idI.GroupKind.Kind != idJ.GroupKind.Kind {
111 return idI.GroupKind.Kind < idJ.GroupKind.Kind
112 }
113 return idI.Name < idJ.Name
114 }
115
116 func (g ResourceStatuses) Swap(i, j int) {
117 g[i], g[j] = g[j], g[i]
118 }
119
120
121
122
123
124
125
126
127 func ResourceStatusEqual(or1, or2 *ResourceStatus) bool {
128 if or1.Identifier != or2.Identifier ||
129 or1.Status != or2.Status ||
130 or1.Message != or2.Message {
131 return false
132 }
133
134
135
136
137 if getGeneration(or1) != getGeneration(or2) {
138 return false
139 }
140
141 if or1.Error != nil && or2.Error != nil && or1.Error.Error() != or2.Error.Error() {
142 return false
143 }
144 if (or1.Error == nil && or2.Error != nil) || (or1.Error != nil && or2.Error == nil) {
145 return false
146 }
147
148 if len(or1.GeneratedResources) != len(or2.GeneratedResources) {
149 return false
150 }
151
152 for i := range or1.GeneratedResources {
153 if !ResourceStatusEqual(or1.GeneratedResources[i], or2.GeneratedResources[i]) {
154 return false
155 }
156 }
157 return true
158 }
159
160 func getGeneration(r *ResourceStatus) int64 {
161 if r.Resource == nil {
162 return 0
163 }
164 return r.Resource.GetGeneration()
165 }
166
View as plain text