This repository has been archived by the owner on Jan 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 20
/
predicate.go
129 lines (111 loc) · 2.57 KB
/
predicate.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package host
import (
libcnd "github.com/konveyor/controller/pkg/condition"
libref "github.com/konveyor/controller/pkg/ref"
api "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1"
"github.com/konveyor/forklift-controller/pkg/controller/host/handler"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
)
type HostPredicate struct {
predicate.Funcs
}
func (r HostPredicate) Create(e event.CreateEvent) bool {
_, cast := e.Object.(*api.Host)
if cast {
libref.Mapper.Create(e)
return true
}
return false
}
func (r HostPredicate) Update(e event.UpdateEvent) bool {
object, cast := e.ObjectNew.(*api.Host)
if !cast {
return false
}
changed := object.Status.ObservedGeneration < object.Generation
if changed {
libref.Mapper.Update(e)
}
return changed
}
func (r HostPredicate) Delete(e event.DeleteEvent) bool {
_, cast := e.Object.(*api.Host)
if cast {
libref.Mapper.Delete(e)
return true
}
return false
}
//
// Provider watch predicate.
// Also ensures an inventory watch is created and
// associated with the channel source.
type ProviderPredicate struct {
handler.WatchManager
predicate.Funcs
channel chan event.GenericEvent
client client.Client
}
//
// Provider created event.
func (r *ProviderPredicate) Create(e event.CreateEvent) bool {
p, cast := e.Object.(*api.Provider)
if cast {
reconciled := p.Status.ObservedGeneration == p.Generation
return reconciled
}
return false
}
//
// Provider updated event.
func (r *ProviderPredicate) Update(e event.UpdateEvent) bool {
p, cast := e.ObjectNew.(*api.Provider)
if cast {
reconciled := p.Status.ObservedGeneration == p.Generation
if reconciled {
r.ensureWatch(p)
return true
}
}
return false
}
//
// Provider deleted event.
func (r *ProviderPredicate) Delete(e event.DeleteEvent) bool {
p, cast := e.Object.(*api.Provider)
if cast {
r.WatchManager.Deleted(p)
return true
}
return false
}
//
// Generic provider watch event.
func (r *ProviderPredicate) Generic(e event.GenericEvent) bool {
p, cast := e.Object.(*api.Provider)
if cast {
reconciled := p.Status.ObservedGeneration == p.Generation
return reconciled
}
return false
}
//
// Ensure there is a watch for the provider
// and inventory API kinds.
func (r *ProviderPredicate) ensureWatch(p *api.Provider) {
if !p.Status.HasCondition(libcnd.Ready) {
return
}
h, err := handler.New(r.client, r.channel, p)
if err != nil {
log.Trace(err)
return
}
err = h.Watch(&r.WatchManager)
if err != nil {
log.Trace(err)
return
}
}