...
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
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
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