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))
}