|
9 | 9 |
|
10 | 10 | corev1 "k8s.io/api/core/v1" |
11 | 11 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| 12 | + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" |
12 | 13 | clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" |
| 14 | + "sigs.k8s.io/cluster-api/controllers/external" |
13 | 15 | "sigs.k8s.io/cluster-api/controllers/remote" |
14 | 16 | ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" |
15 | 17 | "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" |
@@ -64,30 +66,62 @@ func CopySecretToRemoteCluster( |
64 | 66 | return nil |
65 | 67 | } |
66 | 68 |
|
67 | | -// EnsureOwnerReferenceForSecret will ensure that the secretName Secret has an OwnerReference of the cluster. |
68 | | -func EnsureOwnerReferenceForSecret( |
| 69 | +// EnsureClusterOwnerReferenceForObject ensures that OwnerReference of the cluster is added on provided object. |
| 70 | +func EnsureClusterOwnerReferenceForObject( |
69 | 71 | ctx context.Context, |
70 | 72 | cl ctrlclient.Client, |
71 | | - secretName string, |
| 73 | + objectRef corev1.TypedLocalObjectReference, |
72 | 74 | cluster *clusterv1.Cluster, |
73 | 75 | ) error { |
74 | | - secret, err := getSecretForCluster(ctx, cl, secretName, cluster) |
| 76 | + targetObj, err := GetResourceFromTypedLocalObjectReference( |
| 77 | + ctx, |
| 78 | + cl, |
| 79 | + objectRef, |
| 80 | + cluster.Namespace, |
| 81 | + ) |
75 | 82 | if err != nil { |
76 | 83 | return err |
77 | 84 | } |
78 | 85 |
|
79 | | - err = controllerutil.SetOwnerReference(cluster, secret, cl.Scheme()) |
| 86 | + err = controllerutil.SetOwnerReference(cluster, targetObj, cl.Scheme()) |
80 | 87 | if err != nil { |
81 | | - return fmt.Errorf("failed to set owner reference on Secret: %w", err) |
| 88 | + return fmt.Errorf("failed to set cluster's owner reference on object: %w", err) |
82 | 89 | } |
83 | 90 |
|
84 | | - err = cl.Update(ctx, secret) |
| 91 | + err = cl.Update(ctx, targetObj) |
85 | 92 | if err != nil { |
86 | | - return fmt.Errorf("failed to update Secret with owner references: %w", err) |
| 93 | + return fmt.Errorf("failed to update object with cluster's owner reference: %w", err) |
87 | 94 | } |
88 | 95 | return nil |
89 | 96 | } |
90 | 97 |
|
| 98 | +// GetResourceFromTypedLocalObjectReference gets the resource from the provided TypedLocalObjectReference. |
| 99 | +func GetResourceFromTypedLocalObjectReference( |
| 100 | + ctx context.Context, |
| 101 | + cl ctrlclient.Client, |
| 102 | + typedLocalObjectRef corev1.TypedLocalObjectReference, |
| 103 | + ns string, |
| 104 | +) (*unstructured.Unstructured, error) { |
| 105 | + apiVersion := corev1.SchemeGroupVersion.String() |
| 106 | + if typedLocalObjectRef.APIGroup != nil { |
| 107 | + apiVersion = *typedLocalObjectRef.APIGroup |
| 108 | + } |
| 109 | + |
| 110 | + objectRef := &corev1.ObjectReference{ |
| 111 | + APIVersion: apiVersion, |
| 112 | + Kind: typedLocalObjectRef.Kind, |
| 113 | + Name: typedLocalObjectRef.Name, |
| 114 | + Namespace: ns, |
| 115 | + } |
| 116 | + |
| 117 | + targetObj, err := external.Get(ctx, cl, objectRef) |
| 118 | + if err != nil { |
| 119 | + return nil, fmt.Errorf("failed to get resource from object reference: %w", err) |
| 120 | + } |
| 121 | + |
| 122 | + return targetObj, nil |
| 123 | +} |
| 124 | + |
91 | 125 | func getSecretForCluster( |
92 | 126 | ctx context.Context, |
93 | 127 | c ctrlclient.Client, |
|
0 commit comments