Skip to content

Commit a3f17aa

Browse files
authored
Merge pull request #1877 from officialasishkumar/issues/1876
fix: restore TLSPolicy reconciliation on issuer readiness changes
2 parents b1bfee3 + 2127c44 commit a3f17aa

2 files changed

Lines changed: 119 additions & 14 deletions

File tree

internal/controller/state_of_the_world.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -785,25 +785,13 @@ func certManagerControllerOpts() []controller.ControllerOption {
785785
&certmanagerv1.Issuer{},
786786
CertManagerIssuersResource,
787787
metav1.NamespaceAll,
788-
controller.WithPredicates(ctrlruntimepredicate.TypedFuncs[*certmanagerv1.Issuer]{
789-
UpdateFunc: func(e event.TypedUpdateEvent[*certmanagerv1.Issuer]) bool {
790-
oldStatus := e.ObjectOld.GetStatus()
791-
newStatus := e.ObjectOld.GetStatus()
792-
return !reflect.DeepEqual(oldStatus, newStatus)
793-
},
794-
})),
788+
controller.WithPredicates(issuerStatusChangedPredicate())),
795789
),
796790
controller.WithRunnable("clusterissuers watcher", controller.Watch(
797791
&certmanagerv1.ClusterIssuer{},
798792
CertMangerClusterIssuersResource,
799793
metav1.NamespaceAll,
800-
controller.WithPredicates(ctrlruntimepredicate.TypedFuncs[*certmanagerv1.ClusterIssuer]{
801-
UpdateFunc: func(e event.TypedUpdateEvent[*certmanagerv1.ClusterIssuer]) bool {
802-
oldStatus := e.ObjectOld.GetStatus()
803-
newStatus := e.ObjectOld.GetStatus()
804-
return !reflect.DeepEqual(oldStatus, newStatus)
805-
},
806-
})),
794+
controller.WithPredicates(clusterIssuerStatusChangedPredicate())),
807795
),
808796
controller.WithObjectKinds(
809797
CertManagerCertificateKind,
@@ -818,6 +806,22 @@ func certManagerControllerOpts() []controller.ControllerOption {
818806
}
819807
}
820808

809+
func issuerStatusChangedPredicate() ctrlruntimepredicate.TypedPredicate[*certmanagerv1.Issuer] {
810+
return ctrlruntimepredicate.TypedFuncs[*certmanagerv1.Issuer]{
811+
UpdateFunc: func(e event.TypedUpdateEvent[*certmanagerv1.Issuer]) bool {
812+
return !reflect.DeepEqual(e.ObjectOld.GetStatus(), e.ObjectNew.GetStatus())
813+
},
814+
}
815+
}
816+
817+
func clusterIssuerStatusChangedPredicate() ctrlruntimepredicate.TypedPredicate[*certmanagerv1.ClusterIssuer] {
818+
return ctrlruntimepredicate.TypedFuncs[*certmanagerv1.ClusterIssuer]{
819+
UpdateFunc: func(e event.TypedUpdateEvent[*certmanagerv1.ClusterIssuer]) bool {
820+
return !reflect.DeepEqual(e.ObjectOld.GetStatus(), e.ObjectNew.GetStatus())
821+
},
822+
}
823+
}
824+
821825
func initWorkflow(client *dynamic.DynamicClient) *controller.Workflow {
822826
return &controller.Workflow{
823827
Precondition: traceReconcileFunc("init.event_logger", NewEventLogger().Log),

internal/controller/state_of_the_world_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ import (
77
"testing"
88
"time"
99

10+
certmanagerv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
11+
certmanmetav1 "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
1012
"github.com/kuadrant/policy-machinery/machinery"
1113
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"sigs.k8s.io/controller-runtime/pkg/event"
1215

1316
kuadrantv1beta1 "github.com/kuadrant/kuadrant-operator/api/v1beta1"
1417
)
@@ -109,3 +112,101 @@ func TestGetKuadrant(t *testing.T) {
109112
})
110113
}
111114
}
115+
116+
func TestIssuerStatusChangedPredicate(t *testing.T) {
117+
ready := certmanagerv1.IssuerStatus{
118+
Conditions: []certmanagerv1.IssuerCondition{{
119+
Type: certmanagerv1.IssuerConditionReady,
120+
Status: certmanmetav1.ConditionTrue,
121+
}},
122+
}
123+
notReady := certmanagerv1.IssuerStatus{
124+
Conditions: []certmanagerv1.IssuerCondition{{
125+
Type: certmanagerv1.IssuerConditionReady,
126+
Status: certmanmetav1.ConditionFalse,
127+
}},
128+
}
129+
130+
predicate := issuerStatusChangedPredicate()
131+
132+
tests := []struct {
133+
name string
134+
old certmanagerv1.IssuerStatus
135+
new certmanagerv1.IssuerStatus
136+
want bool
137+
}{
138+
{
139+
name: "status change triggers reconciliation",
140+
old: notReady,
141+
new: ready,
142+
want: true,
143+
},
144+
{
145+
name: "unchanged status is ignored",
146+
old: ready,
147+
new: ready,
148+
want: false,
149+
},
150+
}
151+
152+
for _, tt := range tests {
153+
t.Run(tt.name, func(t *testing.T) {
154+
got := predicate.Update(event.TypedUpdateEvent[*certmanagerv1.Issuer]{
155+
ObjectOld: &certmanagerv1.Issuer{Status: tt.old},
156+
ObjectNew: &certmanagerv1.Issuer{Status: tt.new},
157+
})
158+
if got != tt.want {
159+
t.Fatalf("issuerStatusChangedPredicate().Update() = %v, want %v", got, tt.want)
160+
}
161+
})
162+
}
163+
}
164+
165+
func TestClusterIssuerStatusChangedPredicate(t *testing.T) {
166+
ready := certmanagerv1.IssuerStatus{
167+
Conditions: []certmanagerv1.IssuerCondition{{
168+
Type: certmanagerv1.IssuerConditionReady,
169+
Status: certmanmetav1.ConditionTrue,
170+
}},
171+
}
172+
notReady := certmanagerv1.IssuerStatus{
173+
Conditions: []certmanagerv1.IssuerCondition{{
174+
Type: certmanagerv1.IssuerConditionReady,
175+
Status: certmanmetav1.ConditionFalse,
176+
}},
177+
}
178+
179+
predicate := clusterIssuerStatusChangedPredicate()
180+
181+
tests := []struct {
182+
name string
183+
old certmanagerv1.IssuerStatus
184+
new certmanagerv1.IssuerStatus
185+
want bool
186+
}{
187+
{
188+
name: "status change triggers reconciliation",
189+
old: notReady,
190+
new: ready,
191+
want: true,
192+
},
193+
{
194+
name: "unchanged status is ignored",
195+
old: ready,
196+
new: ready,
197+
want: false,
198+
},
199+
}
200+
201+
for _, tt := range tests {
202+
t.Run(tt.name, func(t *testing.T) {
203+
got := predicate.Update(event.TypedUpdateEvent[*certmanagerv1.ClusterIssuer]{
204+
ObjectOld: &certmanagerv1.ClusterIssuer{Status: tt.old},
205+
ObjectNew: &certmanagerv1.ClusterIssuer{Status: tt.new},
206+
})
207+
if got != tt.want {
208+
t.Fatalf("clusterIssuerStatusChangedPredicate().Update() = %v, want %v", got, tt.want)
209+
}
210+
})
211+
}
212+
}

0 commit comments

Comments
 (0)