func()

in internal/handler/requirement.go [185:224]


func (r *RequirementHandler) EnsureCachedOperationAcquired(ctx context.Context) (reconciler.OperationResult, error) {
	if !r.phaseIn(v1alpha1.RequirementPhaseCacheChecking) {
		return reconciler.ContinueProcessing()
	}
	r.logger.V(1).Info("operation: EnsureCachedOperationAcquired")
	if len(r.requirement.Status.OperationName) == 0 {
		r.logger.V(1).Info("no cached operation available")
		r.setCacheMissStatus()
		return reconciler.RequeueOnErrorOrContinue(r.client.Status().Update(ctx, r.requirement))
	}
	operation := &v1alpha1.Operation{}
	if err := r.client.Get(ctx, types.NamespacedName{Name: r.requirement.Status.OperationName, Namespace: r.requirement.Namespace}, operation); err != nil {
		r.setCacheMissStatus()
		return reconciler.RequeueOnErrorOrContinue(fmt.Errorf("failed to get operation %s: %w", r.requirement.Status.OperationName, err))
	}
	// already acquired
	if _, ok := operation.Annotations[v1alpha1.OperationAcquiredAnnotationKey]; ok {
		if len(operation.OwnerReferences) != 0 {
			if operation.OwnerReferences[0].UID != r.requirement.UID {
				// return error if owner is not this requirement
				r.logger.V(1).Info("operation already acquired by other requirement", "operation", r.requirement.Status.OperationName)
				r.setCacheMissStatus()
				return reconciler.RequeueOnErrorOrContinue(r.client.Status().Update(ctx, r.requirement))
			} else {
				// set to ready status if the operation already acquired by this requirement
				r.logger.V(1).Info("operation already acquired by this requirement", "operation", r.requirement.Status.OperationName)
				r.setCacheHitStatus()
				return reconciler.RequeueOnErrorOrStop(r.client.Status().Update(ctx, r.requirement))
			}
		}
	}
	// if operation not acquired, acquire it
	if err := r.acquireCachedOperation(ctx, operation); err != nil {
		r.setCacheMissStatus()
		return reconciler.RequeueOnErrorOrContinue(fmt.Errorf("failed to update operation %s: %w", r.requirement.Status.OperationName, err))
	}
	// set to ready status if the operation acquired
	r.setCacheHitStatus()
	return reconciler.RequeueOnErrorOrContinue(r.client.Status().Update(ctx, r.requirement))
}