func()

in operator/pkg/controllers/controller.go [44:76]


func (c *GenericController) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
	// 1. Read Spec
	resource := c.For()
	if err := c.Get(ctx, req.NamespacedName, resource); err != nil {
		if errors.IsNotFound(err) {
			return reconcile.Result{}, nil
		}
		return *results.Failed, err
	}
	/*
		Need to set this for tests to pass, in testing the client.Client used
		doesn't populate GVK due at a bug in client-go. We can remove this if check,
		once this bug is fixed https://github.com/kubernetes/client-go/issues/1004
	*/
	if resource.GetObjectKind().GroupVersionKind().Empty() {
		resource.GetObjectKind().SetGroupVersionKind(v1alpha1.SchemeGroupVersion.WithKind(v1alpha1.ControlPlaneKind))
	}
	// 2. Copy object for merge patch base
	persisted := resource.DeepCopyObject()
	// 3. Reconcile else finalize if object is deleted
	result, reconcileErr := c.reconcile(ctx, resource, persisted)
	// 4. Update Status using a merge patch, we want to set status even when reconcile errored
	if err := c.Status().Patch(ctx, resource, client.MergeFrom(persisted)); err != nil && !errors.IsNotFound(err) {
		return *results.Failed, fmt.Errorf("status patch for %s, %w,", req.NamespacedName, err)
	}
	if reconcileErr != nil {
		if errors.IsWaitingForSubResource(reconcileErr) {
			return *results.Waiting, nil
		}
		return *results.Failed, reconcileErr
	}
	return result, nil
}