@@ -25,6 +25,7 @@ import (
25
25
"github.com/go-logr/logr"
26
26
appsv1 "k8s.io/api/apps/v1"
27
27
v1 "k8s.io/api/core/v1"
28
+ policyv1 "k8s.io/api/policy/v1"
28
29
"k8s.io/apimachinery/pkg/api/errors"
29
30
"k8s.io/apimachinery/pkg/types"
30
31
ctrl "sigs.k8s.io/controller-runtime"
@@ -45,6 +46,7 @@ type LimitadorReconciler struct {
45
46
//+kubebuilder:rbac:groups=limitador.kuadrant.io,resources=limitadors/status,verbs=get;update;patch
46
47
//+kubebuilder:rbac:groups=limitador.kuadrant.io,resources=limitadors/finalizers,verbs=update
47
48
//+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;delete
49
+ //+kubebuilder:rbac:groups=policy,resources=poddisruptionbudgets,verbs=get;list;watch;create;update;delete
48
50
//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;delete
49
51
//+kubebuilder:rbac:groups="",resources=configmaps;secrets,verbs=get;list;watch;create;update;delete
50
52
@@ -116,9 +118,55 @@ func (r *LimitadorReconciler) reconcileSpec(ctx context.Context, limitadorObj *l
116
118
return ctrl.Result {}, err
117
119
}
118
120
121
+ if err := r .reconcilePdb (ctx , limitadorObj ); err != nil {
122
+ return ctrl.Result {}, err
123
+ }
124
+
119
125
return ctrl.Result {}, nil
120
126
}
121
127
128
+ func (r * LimitadorReconciler ) reconcilePdb (ctx context.Context , limitadorObj * limitadorv1alpha1.Limitador ) error {
129
+ logger , err := logr .FromContext (ctx )
130
+ if err != nil {
131
+ return err
132
+ }
133
+ if limitadorObj .Spec .PodDisruptionBudget == nil {
134
+ pdb := & policyv1.PodDisruptionBudget {}
135
+ if err := r .GetResource (ctx ,
136
+ types.NamespacedName {
137
+ Namespace : limitadorObj .Namespace ,
138
+ Name : limitador .PodDisruptionBudgetName (limitadorObj ),
139
+ }, pdb ); err != nil {
140
+ if errors .IsNotFound (err ) {
141
+ return nil
142
+ }
143
+ return err
144
+ }
145
+ if pdb .ObjectMeta .DeletionTimestamp == nil {
146
+ if err = r .DeleteResource (ctx , pdb ); err != nil {
147
+ return err
148
+ }
149
+ }
150
+ return nil
151
+ }
152
+
153
+ pdb := limitador .PodDisruptionBudget (limitadorObj )
154
+ if err := limitador .ValidatePDB (pdb ); err != nil {
155
+ return err
156
+ }
157
+
158
+ // controller reference
159
+ if err := r .SetOwnerReference (limitadorObj , pdb ); err != nil {
160
+ return err
161
+ }
162
+ err = r .ReconcilePodDisruptionBudget (ctx , pdb , reconcilers .PodDisruptionBudgetMutator )
163
+ logger .V (1 ).Info ("reconcile pdb" , "error" , err )
164
+ if err != nil {
165
+ return err
166
+ }
167
+ return nil
168
+ }
169
+
122
170
func (r * LimitadorReconciler ) reconcileDeployment (ctx context.Context , limitadorObj * limitadorv1alpha1.Limitador ) error {
123
171
logger , err := logr .FromContext (ctx )
124
172
if err != nil {
@@ -213,6 +261,7 @@ func (r *LimitadorReconciler) SetupWithManager(mgr ctrl.Manager) error {
213
261
For (& limitadorv1alpha1.Limitador {}).
214
262
Owns (& appsv1.Deployment {}).
215
263
Owns (& v1.ConfigMap {}).
264
+ Owns (& policyv1.PodDisruptionBudget {}).
216
265
Complete (r )
217
266
}
218
267
0 commit comments