github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/scheduler/algorithm/individual_resolver.go (about)

     1  package algorithm
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/pf-qiu/concourse/v6/atc/db"
     7  	"github.com/pf-qiu/concourse/v6/tracing"
     8  	"go.opentelemetry.io/otel/codes"
     9  	"go.opentelemetry.io/otel/label"
    10  )
    11  
    12  type individualResolver struct {
    13  	vdb         db.VersionsDB
    14  	inputConfig db.InputConfig
    15  }
    16  
    17  func NewIndividualResolver(vdb db.VersionsDB, inputConfig db.InputConfig) Resolver {
    18  	return &individualResolver{
    19  		vdb:         vdb,
    20  		inputConfig: inputConfig,
    21  	}
    22  }
    23  
    24  func (r *individualResolver) InputConfigs() db.InputConfigs {
    25  	return db.InputConfigs{r.inputConfig}
    26  }
    27  
    28  // Handles two different configurations of a resource without passed
    29  // constraints: every and latest
    30  func (r *individualResolver) Resolve(ctx context.Context) (map[string]*versionCandidate, db.ResolutionFailure, error) {
    31  	ctx, span := tracing.StartSpan(ctx, "individualResolver.Resolve", tracing.Attrs{
    32  		"input": r.inputConfig.Name,
    33  	})
    34  	defer span.End()
    35  
    36  	var version db.ResourceVersion
    37  	var hasNext bool
    38  	if r.inputConfig.UseEveryVersion {
    39  		var found bool
    40  		var err error
    41  		version, hasNext, found, err = r.vdb.NextEveryVersion(ctx, r.inputConfig.JobID, r.inputConfig.ResourceID)
    42  		if err != nil {
    43  			tracing.End(span, err)
    44  			return nil, "", err
    45  		}
    46  
    47  		if !found {
    48  			span.AddEvent(ctx, "next every version not found")
    49  			span.SetStatus(codes.NotFound, "next every version not found")
    50  			return nil, db.VersionNotFound, nil
    51  		}
    52  
    53  		span.AddEvent(ctx, "found via every", label.String("version", string(version)))
    54  	} else {
    55  		// there are no passed constraints, so just take the latest version
    56  		var err error
    57  		var found bool
    58  		version, found, err = r.vdb.LatestVersionOfResource(ctx, r.inputConfig.ResourceID)
    59  		if err != nil {
    60  			tracing.End(span, err)
    61  			return nil, "", err
    62  		}
    63  
    64  		if !found {
    65  			span.AddEvent(ctx, "latest version not found")
    66  			span.SetStatus(codes.NotFound, "latest version not found")
    67  			return nil, db.LatestVersionNotFound, nil
    68  		}
    69  
    70  		span.AddEvent(ctx, "found via latest", label.String("version", string(version)))
    71  	}
    72  
    73  	candidate := newCandidateVersion(version)
    74  	candidate.HasNextEveryVersion = hasNext
    75  
    76  	versionCandidates := map[string]*versionCandidate{
    77  		r.inputConfig.Name: candidate,
    78  	}
    79  
    80  	span.SetStatus(codes.OK, "")
    81  	return versionCandidates, "", nil
    82  }