func SetControllerReference()

in pkg/util/platform/platform.go [149:196]


func SetControllerReference(owner, object metav1.Object, scheme *runtime.Scheme, isController bool) error {
	runtimeObject, ok := owner.(runtime.Object)
	if !ok {
		return fmt.Errorf("failed to call SetControllerReference: owner of type %T, should be of type runtime.Object", owner)
	}

	groupVersionKind, err := apiutil.GVKForObject(runtimeObject, scheme)
	if err != nil {
		return fmt.Errorf("failed to get Group Version Kind for object: %w", err)
	}

	// Create a new ref
	ref := *newControllerRef(
		owner,
		schema.GroupVersionKind{
			Group:   groupVersionKind.Group,
			Version: groupVersionKind.Version,
			Kind:    groupVersionKind.Kind,
		},
		isController,
	)

	existingRefs := object.GetOwnerReferences()
	foundIndex := -1

	for i := 0; i < len(existingRefs); i++ {
		if referSameObject(&ref, &existingRefs[i]) {
			foundIndex = i

			break
		}

		if existingRefs[i].Controller != nil && *existingRefs[i].Controller {
			return newAlreadyOwnedError(object, &existingRefs[i])
		}
	}

	if foundIndex == -1 {
		existingRefs = append(existingRefs, ref)
	} else {
		existingRefs[foundIndex] = ref
	}

	// Update owner references
	object.SetOwnerReferences(existingRefs)

	return nil
}