forked from projectsveltos/ui-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpredicates.go
More file actions
123 lines (97 loc) · 3.97 KB
/
predicates.go
File metadata and controls
123 lines (97 loc) · 3.97 KB
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
/*
Copyright 2025. projectsveltos.io. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package controller
import (
"reflect"
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // SA1019: We are unable to update the dependency at this time.
//nolint:staticcheck // Compatible with core/v1beta1 Conditions
"sigs.k8s.io/cluster-api/util/deprecated/v1beta1/conditions"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
libsveltosv1beta1 "github.com/projectsveltos/libsveltos/api/v1beta1"
)
// SveltosClusterPredicate is a custom predicate that triggers reconciliation on generation changes
// or when the SveltosCluster's Status.Ready field changes.
type SveltosClusterPredicate struct {
predicate.GenerationChangedPredicate
}
// Update implements Predicate.
func (p SveltosClusterPredicate) Update(e event.UpdateEvent) bool {
// Check for generation changes first, as that's the primary trigger for spec updates.
if p.GenerationChangedPredicate.Update(e) {
return true
}
// Now, check for status changes, specifically the Ready field.
// It's important to type-assert the objects to the correct type.
oldSveltosCluster, ok := e.ObjectOld.(*libsveltosv1beta1.SveltosCluster)
if !ok {
// If the old object is not a SveltosCluster, we can't compare statuses.
return false
}
newSveltosCluster, ok := e.ObjectNew.(*libsveltosv1beta1.SveltosCluster)
if !ok {
// If the new object is not a SveltosCluster, we can't compare statuses.
return false
}
if oldSveltosCluster.Spec.Paused != newSveltosCluster.Spec.Paused {
return true
}
// Trigger reconciliation if the Ready status has changed.
if oldSveltosCluster.Status.Ready != newSveltosCluster.Status.Ready {
return true
}
if oldSveltosCluster.Status.Version != newSveltosCluster.Status.Version {
return true
}
// Since FailureMessage is a pointer, you need a nil-safe comparison.
// You can use reflect.DeepEqual for a more robust check on the pointers.
if !reflect.DeepEqual(oldSveltosCluster.Status.FailureMessage, newSveltosCluster.Status.FailureMessage) {
return true
}
// If none of the monitored fields have changed, do not trigger a reconciliation.
return false
}
// ClusterStatusPredicate is a custom predicate that triggers reconciliation on generation changes
// or when the Cluster's status.conditions or status.initialization fields change.
type ClusterStatusPredicate struct {
predicate.GenerationChangedPredicate
}
// Update implements Predicate.
func (p ClusterStatusPredicate) Update(e event.UpdateEvent) bool {
// A generation change indicates a change in the spec, which should always trigger a reconcile.
if p.GenerationChangedPredicate.Update(e) {
return true
}
// Type-assert the old and new objects to the Cluster type.
oldCluster, ok := e.ObjectOld.(*clusterv1.Cluster)
if !ok {
return false
}
newCluster, ok := e.ObjectNew.(*clusterv1.Cluster)
if !ok {
return false
}
// return true if Cluster.Status.Conditions.ControlPlaneInitialized has changed
if !conditions.IsTrue(oldCluster, clusterv1.ControlPlaneInitializedCondition) &&
conditions.IsTrue(newCluster, clusterv1.ControlPlaneInitializedCondition) {
return true
}
// return true if Cluster.Status.ControlPlaneReady has changed
if oldCluster.Status.ControlPlaneReady != newCluster.Status.ControlPlaneReady {
return true
}
if oldCluster.Status.InfrastructureReady != newCluster.Status.InfrastructureReady {
return true
}
return oldCluster.Spec.Paused != newCluster.Spec.Paused
}