in internal/controller/pod_controller.go [144:186]
func listOwners(ctx context.Context, c client.Client, object client.Object) ([]workload.Workload, error) {
l := logf.FromContext(ctx)
var owners []workload.Workload
for _, r := range object.GetOwnerReferences() {
key := client.ObjectKey{Namespace: object.GetNamespace(), Name: r.Name}
var owner client.Object
wl, err := workload.WorkloadForKind(r.Kind)
if err != nil {
// If the operator doesn't recognize the owner's Kind, then ignore
// that owner.
continue
}
owners = append(owners, wl)
owner = wl.Object()
err = c.Get(ctx, key, owner)
if err != nil {
switch t := err.(type) {
case *apierrors.StatusError:
// Ignore when the owner is not found. Sometimes owners no longer exist.
if t.ErrStatus.Reason == metav1.StatusReasonNotFound {
continue
}
}
l.Info("could not get owner ", "owner", r.String(), "err", err)
return nil, err
}
// Recursively call for the owners of the owner, and append those.
// So that we reach Pod --> ReplicaSet --> Deployment
ownerOwners, err := listOwners(ctx, c, owner)
if err != nil {
return nil, err
}
owners = append(owners, ownerOwners...)
}
return owners, nil
}