Files
capsule/pkg/api/meta/ownerreference.go
Oliver Bähler 0abc77b56a feat: diverse performance improvements (#1861)
Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>
2026-02-03 22:05:00 +01:00

115 lines
2.6 KiB
Go

// Copyright 2020-2026 Project Capsule Authors
// SPDX-License-Identifier: Apache-2.0
package meta
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// Adds an ownerreferences, which does not delete the object when the owner is deleted.
func SetLooseOwnerReference(obj client.Object, owner metav1.OwnerReference) error {
if obj == nil {
return nil
}
ownerRefs := obj.GetOwnerReferences()
// Overwrite existing entry with same UID
for i := range ownerRefs {
if ownerRefs[i].UID == owner.UID {
ownerRefs[i] = owner
obj.SetOwnerReferences(ownerRefs)
return nil
}
}
ownerRefs = append(ownerRefs, owner)
obj.SetOwnerReferences(ownerRefs)
return nil
}
// Removes a Loose Ownerreference based on UID.
func RemoveLooseOwnerReference(
obj client.Object,
owner metav1.OwnerReference,
) {
refs := []metav1.OwnerReference{}
for _, ownerRef := range obj.GetOwnerReferences() {
if ownerRef.UID == owner.UID {
continue
}
refs = append(refs, ownerRef)
}
obj.SetOwnerReferences(refs)
}
// RemoveLooseOwnerReferenceForKindExceptGiven removes all ownerReferences that have the same
// APIVersion and Kind as the given owner, except the given owner itself (matched by UID).
// OwnerReferences with different APIVersion/Kind are preserved.
//
// If the given owner is not present on the object, all ownerReferences with that APIVersion/Kind
// are removed.
func RemoveLooseOwnerReferenceForKindExceptGiven(
obj client.Object,
owner metav1.OwnerReference,
) {
in := obj.GetOwnerReferences()
out := make([]metav1.OwnerReference, 0, len(in))
for _, ref := range in {
sameKind := ref.Kind == owner.Kind
sameAPIVersion := ref.APIVersion == owner.APIVersion
if !sameKind || !sameAPIVersion {
out = append(out, ref)
continue
}
if ref.UID == owner.UID {
out = append(out, ref)
}
}
obj.SetOwnerReferences(out)
}
// If not returns false.
func HasLooseOwnerReference(
obj client.Object,
owner metav1.OwnerReference,
) bool {
for _, ownerRef := range obj.GetOwnerReferences() {
if ownerRef.UID == owner.UID {
return true
}
}
return false
}
func GetLooseOwnerReference(
obj client.Object,
) metav1.OwnerReference {
return metav1.OwnerReference{
APIVersion: obj.GetObjectKind().GroupVersionKind().GroupVersion().String(),
Kind: obj.GetObjectKind().GroupVersionKind().Kind,
Name: obj.GetName(),
UID: obj.GetUID(),
}
}
func LooseOwnerReferenceEqual(a, b metav1.OwnerReference) bool {
return a.APIVersion == b.APIVersion &&
a.Kind == b.Kind &&
a.Name == b.Name &&
a.UID == b.UID
}