...
1
16
17 package reference
18
19 import (
20 "errors"
21 "fmt"
22
23 "k8s.io/api/core/v1"
24 "k8s.io/apimachinery/pkg/api/meta"
25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26 "k8s.io/apimachinery/pkg/runtime"
27 )
28
29 var (
30
31 ErrNilObject = errors.New("can't reference a nil object")
32 )
33
34
35
36
37
38 func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReference, error) {
39 if obj == nil {
40 return nil, ErrNilObject
41 }
42 if ref, ok := obj.(*v1.ObjectReference); ok {
43
44 return ref, nil
45 }
46
47
48 var listMeta metav1.Common
49 objectMeta, err := meta.Accessor(obj)
50 if err != nil {
51 listMeta, err = meta.CommonAccessor(obj)
52 if err != nil {
53 return nil, err
54 }
55 } else {
56 listMeta = objectMeta
57 }
58
59 gvk := obj.GetObjectKind().GroupVersionKind()
60
61
62
63
64
65 if gvk.Empty() {
66 gvks, _, err := scheme.ObjectKinds(obj)
67 if err != nil {
68 return nil, err
69 }
70 if len(gvks) == 0 || gvks[0].Empty() {
71 return nil, fmt.Errorf("unexpected gvks registered for object %T: %v", obj, gvks)
72 }
73
74
75
76 gvk = gvks[0]
77 }
78
79 kind := gvk.Kind
80 version := gvk.GroupVersion().String()
81
82
83 if objectMeta == nil {
84 return &v1.ObjectReference{
85 Kind: kind,
86 APIVersion: version,
87 ResourceVersion: listMeta.GetResourceVersion(),
88 }, nil
89 }
90
91 return &v1.ObjectReference{
92 Kind: kind,
93 APIVersion: version,
94 Name: objectMeta.GetName(),
95 Namespace: objectMeta.GetNamespace(),
96 UID: objectMeta.GetUID(),
97 ResourceVersion: objectMeta.GetResourceVersion(),
98 }, nil
99 }
100
101
102 func GetPartialReference(scheme *runtime.Scheme, obj runtime.Object, fieldPath string) (*v1.ObjectReference, error) {
103 ref, err := GetReference(scheme, obj)
104 if err != nil {
105 return nil, err
106 }
107 ref.FieldPath = fieldPath
108 return ref, nil
109 }
110
View as plain text