Skip to content

Commit 51011fa

Browse files
committed
Reconcile on all events that may affect webhook services
1 parent 469d330 commit 51011fa

File tree

6 files changed

+253
-2
lines changed

6 files changed

+253
-2
lines changed

src/mapper/cmd/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ func main() {
260260
}
261261

262262
webhookServicesHandler := webhook_traffic.NewWebhookServicesHandler(mgr.GetClient(), cloudClient, kubeFinder)
263-
validatingWebhooksReconciler := webhook_traffic.NewValidatingWebhookReconciler(webhookServicesHandler)
264-
if err = validatingWebhooksReconciler.SetupWithManager(mgr); err != nil {
263+
webhookTrafficReconcilerManager := webhook_traffic.NewWebhookTrafficReconcilerManager(mgr.GetClient(), webhookServicesHandler)
264+
if err = webhookTrafficReconcilerManager.SetupWithManager(mgr); err != nil {
265265
logrus.WithError(err).Panic("unable to create validating webhooks reconciler")
266266
}
267267

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package webhook_traffic
2+
3+
import (
4+
"context"
5+
"github.com/otterize/intents-operator/src/shared/errors"
6+
"github.com/otterize/intents-operator/src/shared/injectablerecorder"
7+
"github.com/samber/lo"
8+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
9+
"k8s.io/client-go/tools/record"
10+
ctrl "sigs.k8s.io/controller-runtime"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
12+
"sigs.k8s.io/controller-runtime/pkg/controller"
13+
)
14+
15+
//+kubebuilder:rbac:groups="apiextensions.k8s.io",resources=customresourcedefinitions,verbs=get;list;watch;update;create;patch
16+
17+
type ConversionWebhookReconciler struct {
18+
client.Client
19+
injectablerecorder.InjectableRecorder
20+
handler *WebhookServicesHandler
21+
}
22+
23+
func NewConversionWebhookReconciler(handler *WebhookServicesHandler) *ConversionWebhookReconciler {
24+
return &ConversionWebhookReconciler{handler: handler}
25+
}
26+
27+
func (r *ConversionWebhookReconciler) SetupWithManager(mgr ctrl.Manager) error {
28+
recorder := mgr.GetEventRecorderFor("intents-operator")
29+
r.InjectRecorder(recorder)
30+
31+
return ctrl.NewControllerManagedBy(mgr).
32+
For(&apiextensionsv1.CustomResourceDefinition{}).
33+
WithOptions(controller.Options{RecoverPanic: lo.ToPtr(true)}).
34+
Complete(r)
35+
}
36+
37+
func (r *ConversionWebhookReconciler) InjectRecorder(recorder record.EventRecorder) {
38+
r.Recorder = recorder
39+
}
40+
41+
func (r *ConversionWebhookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
42+
err := r.handler.HandleAll(ctx)
43+
44+
if err != nil {
45+
return ctrl.Result{}, errors.Wrap(err)
46+
}
47+
48+
return ctrl.Result{}, nil
49+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package webhook_traffic
2+
3+
import (
4+
"context"
5+
"github.com/otterize/intents-operator/src/shared/injectablerecorder"
6+
"github.com/samber/lo"
7+
corev1 "k8s.io/api/core/v1"
8+
"k8s.io/client-go/tools/record"
9+
ctrl "sigs.k8s.io/controller-runtime"
10+
"sigs.k8s.io/controller-runtime/pkg/client"
11+
"sigs.k8s.io/controller-runtime/pkg/controller"
12+
)
13+
14+
// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=endpoints,verbs=get;list;watch
15+
16+
type EndpointsReconciler struct {
17+
client.Client
18+
injectablerecorder.InjectableRecorder
19+
handler *WebhookServicesHandler
20+
}
21+
22+
func NewEndpointsReconciler(handler *WebhookServicesHandler) *EndpointsReconciler {
23+
return &EndpointsReconciler{
24+
handler: handler,
25+
}
26+
}
27+
28+
func (r *EndpointsReconciler) SetupWithManager(mgr ctrl.Manager) error {
29+
recorder := mgr.GetEventRecorderFor("intents-operator")
30+
r.InjectRecorder(recorder)
31+
32+
return ctrl.NewControllerManagedBy(mgr).
33+
For(&corev1.Service{}).
34+
WithOptions(controller.Options{RecoverPanic: lo.ToPtr(true)}).
35+
Complete(r)
36+
}
37+
38+
func (r *EndpointsReconciler) InjectRecorder(recorder record.EventRecorder) {
39+
r.Recorder = recorder
40+
}
41+
42+
func (r *EndpointsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
43+
err := r.handler.HandleAll(ctx)
44+
if err != nil {
45+
return ctrl.Result{}, err
46+
}
47+
48+
return ctrl.Result{}, nil
49+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package webhook_traffic
2+
3+
import (
4+
"context"
5+
"github.com/otterize/intents-operator/src/shared/errors"
6+
"github.com/otterize/intents-operator/src/shared/injectablerecorder"
7+
"github.com/samber/lo"
8+
admissionv1 "k8s.io/api/admissionregistration/v1"
9+
"k8s.io/client-go/tools/record"
10+
ctrl "sigs.k8s.io/controller-runtime"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
12+
"sigs.k8s.io/controller-runtime/pkg/controller"
13+
)
14+
15+
// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=mutatinghookconfigurations,verbs=get;list;watch
16+
17+
type MutatingWebhookReconciler struct {
18+
client.Client
19+
injectablerecorder.InjectableRecorder
20+
handler *WebhookServicesHandler
21+
}
22+
23+
func NewMutatingWebhookReconciler(handler *WebhookServicesHandler) *MutatingWebhookReconciler {
24+
return &MutatingWebhookReconciler{handler: handler}
25+
}
26+
27+
func (r *MutatingWebhookReconciler) SetupWithManager(mgr ctrl.Manager) error {
28+
recorder := mgr.GetEventRecorderFor("intents-operator")
29+
r.InjectRecorder(recorder)
30+
31+
return ctrl.NewControllerManagedBy(mgr).
32+
For(&admissionv1.MutatingWebhookConfiguration{}).
33+
WithOptions(controller.Options{RecoverPanic: lo.ToPtr(true)}).
34+
Complete(r)
35+
}
36+
37+
func (r *MutatingWebhookReconciler) InjectRecorder(recorder record.EventRecorder) {
38+
r.Recorder = recorder
39+
}
40+
41+
func (r *MutatingWebhookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
42+
err := r.handler.HandleAll(ctx)
43+
44+
if err != nil {
45+
return ctrl.Result{}, errors.Wrap(err)
46+
}
47+
48+
return ctrl.Result{}, nil
49+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package webhook_traffic
2+
3+
import (
4+
"context"
5+
"github.com/otterize/intents-operator/src/shared/injectablerecorder"
6+
"github.com/samber/lo"
7+
corev1 "k8s.io/api/core/v1"
8+
"k8s.io/client-go/tools/record"
9+
ctrl "sigs.k8s.io/controller-runtime"
10+
"sigs.k8s.io/controller-runtime/pkg/client"
11+
"sigs.k8s.io/controller-runtime/pkg/controller"
12+
)
13+
14+
// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=services,verbs=get;list;watch
15+
16+
type ServicesReconciler struct {
17+
client.Client
18+
19+
injectablerecorder.InjectableRecorder
20+
handler *WebhookServicesHandler
21+
}
22+
23+
func NewServicesReconciler(handler *WebhookServicesHandler) *ServicesReconciler {
24+
return &ServicesReconciler{
25+
handler: handler,
26+
}
27+
}
28+
29+
func (r *ServicesReconciler) SetupWithManager(mgr ctrl.Manager) error {
30+
recorder := mgr.GetEventRecorderFor("intents-operator")
31+
r.InjectRecorder(recorder)
32+
33+
return ctrl.NewControllerManagedBy(mgr).
34+
For(&corev1.Service{}).
35+
WithOptions(controller.Options{RecoverPanic: lo.ToPtr(true)}).
36+
Complete(r)
37+
}
38+
39+
func (r *ServicesReconciler) InjectRecorder(recorder record.EventRecorder) {
40+
r.Recorder = recorder
41+
}
42+
43+
func (r *ServicesReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
44+
err := r.handler.HandleAll(ctx)
45+
if err != nil {
46+
return ctrl.Result{}, err
47+
}
48+
49+
return ctrl.Result{}, nil
50+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package webhook_traffic
2+
3+
import (
4+
"context"
5+
"github.com/otterize/intents-operator/src/shared/errors"
6+
"github.com/otterize/intents-operator/src/shared/injectablerecorder"
7+
"k8s.io/client-go/tools/record"
8+
ctrl "sigs.k8s.io/controller-runtime"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
)
11+
12+
type WebhookTrafficReconciler interface {
13+
SetupWithManager(mgr ctrl.Manager) error
14+
InjectRecorder(recorder record.EventRecorder)
15+
Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error)
16+
}
17+
18+
type WebhookTrafficReconcilerManager struct {
19+
client.Client
20+
injectablerecorder.InjectableRecorder
21+
handler *WebhookServicesHandler
22+
reconcilers []WebhookTrafficReconciler
23+
}
24+
25+
func NewWebhookTrafficReconcilerManager(client client.Client, handler *WebhookServicesHandler) *WebhookTrafficReconcilerManager {
26+
return &WebhookTrafficReconcilerManager{
27+
Client: client,
28+
handler: handler,
29+
reconcilers: []WebhookTrafficReconciler{
30+
NewValidatingWebhookReconciler(handler),
31+
NewMutatingWebhookReconciler(handler),
32+
NewConversionWebhookReconciler(handler),
33+
NewServicesReconciler(handler), // We need the service itself when reporting to Otterize cloud (for name resolution)
34+
NewEndpointsReconciler(handler), // We need the service itself when reporting to Otterize cloud (for name resolution)
35+
},
36+
}
37+
}
38+
39+
func (r *WebhookTrafficReconcilerManager) SetupWithManager(mgr ctrl.Manager) error {
40+
recorder := mgr.GetEventRecorderFor("intents-operator")
41+
r.InjectRecorder(recorder)
42+
43+
for _, reconciler := range r.reconcilers {
44+
if err := reconciler.SetupWithManager(mgr); err != nil {
45+
return errors.Wrap(err)
46+
}
47+
}
48+
49+
return nil
50+
}
51+
52+
func (r *WebhookTrafficReconcilerManager) InjectRecorder(recorder record.EventRecorder) {
53+
r.Recorder = recorder
54+
}

0 commit comments

Comments
 (0)