in internal/controller/deployment_to_pdb_controller.go [50:117]
func (r *DeploymentToPDBReconciler) handleDeploymentReconcile(ctx context.Context, deployment *v1.Deployment) (reconcile.Result, error) {
log := log.FromContext(ctx)
// Check if PDB already exists for this Deployment
var pdbList policyv1.PodDisruptionBudgetList
err := r.List(ctx, &pdbList, &client.ListOptions{
Namespace: deployment.Namespace,
})
if err != nil {
return ctrl.Result{}, err
}
for _, pdb := range pdbList.Items {
selector, err := metav1.LabelSelectorAsSelector(pdb.Spec.Selector)
if err != nil {
return ctrl.Result{}, fmt.Errorf("error converting label selector: %w", err)
}
if selector.Matches(labels.Set(deployment.Spec.Template.Labels)) {
// PDB already exists, nothing to do
log.Info("PodDisruptionBudget already exists", "namespace", pdb.Namespace, "name", pdb.Name)
EvictionAutoScaler := &myappsv1.EvictionAutoScaler{}
e := r.Get(ctx, types.NamespacedName{Name: pdb.Name, Namespace: pdb.Namespace}, EvictionAutoScaler)
if e == nil {
// if pdb exists get EvictionAutoScaler --> compare targetGeneration field for deployment if both not same deployment was not changed by pdb watcher
// update pdb minReplicas to current deployment replicas
return r.updateMinAvailableAsNecessary(ctx, deployment, EvictionAutoScaler, pdb)
}
return reconcile.Result{}, nil
}
}
//variables
controller := true
blockOwnerDeletion := true
// Create a new PDB for the Deployment
pdb := &policyv1.PodDisruptionBudget{
ObjectMeta: metav1.ObjectMeta{
Name: r.generatePDBName(deployment.Name),
Namespace: deployment.Namespace,
Annotations: map[string]string{
"createdBy": "DeploymentToPDBController",
"target": deployment.Name,
},
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: "apps/v1",
Kind: "Deployment",
Name: deployment.Name,
UID: deployment.UID,
Controller: &controller, // Mark as managed by this controller
BlockOwnerDeletion: &blockOwnerDeletion, // Prevent deletion of the PDB until the deployment is deleted
},
},
},
Spec: policyv1.PodDisruptionBudgetSpec{
MinAvailable: &intstr.IntOrString{IntVal: *deployment.Spec.Replicas},
Selector: &metav1.LabelSelector{MatchLabels: deployment.Spec.Selector.MatchLabels},
},
}
if err := r.Create(ctx, pdb); err != nil {
return reconcile.Result{}, err
}
log.Info("Created PodDisruptionBudget", "namespace", pdb.Namespace, "name", pdb.Name)
return reconcile.Result{}, nil
}