in internal/controller/pdb_to_evictionautoscaler_controller.go [126:185]
func (r *PDBToEvictionAutoScalerReconciler) discoverDeployment(ctx context.Context, pdb *policyv1.PodDisruptionBudget) (string, error) {
logger := log.FromContext(ctx)
// Convert PDB label selector to Kubernetes selector
selector, err := metav1.LabelSelectorAsSelector(pdb.Spec.Selector)
if err != nil {
return "", fmt.Errorf("error converting label selector: %v", err)
}
logger.Info("PDB Selector", "selector", pdb.Spec.Selector)
podList := &corev1.PodList{}
err = r.List(ctx, podList, &client.ListOptions{Namespace: pdb.Namespace, LabelSelector: selector})
if err != nil {
return "", fmt.Errorf("error listing pods: %v", err)
}
logger.Info("Number of pods found", "count", len(podList.Items))
if len(podList.Items) == 0 {
return "", fmt.Errorf("no pods found matching the PDB selector %s; leaky pdb(?!)", pdb.Name)
}
// Iterate through each pod
for _, pod := range podList.Items {
// Check the OwnerReferences of each pod
for _, ownerRef := range pod.OwnerReferences {
if ownerRef.Kind == "ReplicaSet" {
replicaSet := &appsv1.ReplicaSet{}
err = r.Get(ctx, k8s_types.NamespacedName{Name: ownerRef.Name, Namespace: pdb.Namespace}, replicaSet)
if apierrors.IsNotFound(err) {
return "", fmt.Errorf("error fetching ReplicaSet: %v", err)
}
// Log ReplicaSet details
logger.Info("Found ReplicaSet", "replicaSet", replicaSet.Name)
// Look for the Deployment owner of the ReplicaSet
for _, rsOwnerRef := range replicaSet.OwnerReferences {
if rsOwnerRef.Kind == "Deployment" {
logger.Info("Found Deployment owner", "deployment", rsOwnerRef.Name)
return rsOwnerRef.Name, nil
}
}
// no replicaset owner just move on and see if any other pods have have something.
}
//// Optional: Handle StatefulSets if necessary
//if ownerRef.Kind == "StatefulSet" {
// statefulSet := &appsv1.StatefulSet{}
// err = r.Get(ctx, k8s_types.NamespacedName{Name: ownerRef.Name, Namespace: pdb.Namespace}, statefulSet)
// if apierrors.IsNotFound(err) {
// return "", fmt.Errorf("error fetching StatefulSet: %v", err)
// }
// logger.Info("Found StatefulSet owner", "statefulSet", statefulSet.Name)
// // Handle StatefulSet logic if required
//}
}
}
logger.Info("No Deployment owner found")
return "", errOwnerNotFound
}