...

Source file src/edge-infra.dev/pkg/edge/k8objectsutils/ownerref/owner_ref.go

Documentation: edge-infra.dev/pkg/edge/k8objectsutils/ownerref

     1  package ownerref
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"reflect"
     7  
     8  	appsv1 "k8s.io/api/apps/v1"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	"k8s.io/apimachinery/pkg/types"
    11  	"sigs.k8s.io/controller-runtime/pkg/client"
    12  
    13  	"edge-infra.dev/pkg/edge/apis/meta"
    14  )
    15  
    16  var (
    17  	deployment = metav1.TypeMeta{
    18  		APIVersion: appsv1.SchemeGroupVersion.String(),
    19  		Kind:       reflect.TypeOf(appsv1.Deployment{}).Name(),
    20  	}
    21  	daemonSet = metav1.TypeMeta{
    22  		APIVersion: appsv1.SchemeGroupVersion.String(),
    23  		Kind:       reflect.TypeOf(appsv1.DaemonSet{}).Name(),
    24  	}
    25  	statefulSet = metav1.TypeMeta{
    26  		APIVersion: appsv1.SchemeGroupVersion.String(),
    27  		Kind:       reflect.TypeOf(appsv1.StatefulSet{}).Name(),
    28  	}
    29  
    30  	validOwnerRefs = []metav1.TypeMeta{deployment, daemonSet, statefulSet}
    31  
    32  	// has valid parent
    33  	replicaSet = metav1.TypeMeta{
    34  		APIVersion: appsv1.SchemeGroupVersion.String(),
    35  		Kind:       reflect.TypeOf(appsv1.ReplicaSet{}).Name(),
    36  	}
    37  )
    38  
    39  func GetOwnerRef(ctx context.Context, cl client.Client, pod client.Object) (*metav1.OwnerReference, error) {
    40  	for _, ref := range pod.GetOwnerReferences() {
    41  		if isValidOwnerRef(ref) {
    42  			return &ref, nil
    43  		}
    44  		if isSameResource(replicaSet, ref) {
    45  			set := &appsv1.ReplicaSet{}
    46  			nn := types.NamespacedName{Namespace: pod.GetNamespace(), Name: ref.Name}
    47  			if err := cl.Get(ctx, nn, set); err != nil {
    48  				return nil, err
    49  			}
    50  			return GetOwnerRef(ctx, cl, set)
    51  		}
    52  	}
    53  	return nil, fmt.Errorf("invalid owner reference for pod")
    54  }
    55  
    56  func isValidOwnerRef(ref metav1.OwnerReference) bool {
    57  	for _, resource := range validOwnerRefs {
    58  		if isSameResource(resource, ref) {
    59  			return true
    60  		}
    61  	}
    62  	return false
    63  }
    64  
    65  func isSameResource(resource metav1.TypeMeta, ref metav1.OwnerReference) bool {
    66  	return resource.APIVersion == ref.APIVersion && resource.Kind == ref.Kind
    67  }
    68  
    69  // ResourceName hash for a resource created based on owner ref and node name if needed
    70  func ResourceName(resource string, ref metav1.OwnerReference, ns string, nodeName string, isTouchPoint bool) string {
    71  	var hash string
    72  	if isTouchPoint {
    73  		hash = meta.Hash(fmt.Sprintf("%s-%s-%s", ns, ref.Name, nodeName))
    74  	} else {
    75  		hash = meta.Hash(fmt.Sprintf("%s-%s", ns, ref.Name))
    76  	}
    77  	return fmt.Sprintf("%s-%s", resource, hash)
    78  }
    79  

View as plain text