github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/scheduler/algorithm/pinned_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 pinnedResolver struct {
    13  	vdb         db.VersionsDB
    14  	inputConfig db.InputConfig
    15  }
    16  
    17  func NewPinnedResolver(vdb db.VersionsDB, inputConfig db.InputConfig) Resolver {
    18  	return &pinnedResolver{
    19  		vdb:         vdb,
    20  		inputConfig: inputConfig,
    21  	}
    22  }
    23  
    24  func (r *pinnedResolver) InputConfigs() db.InputConfigs {
    25  	return db.InputConfigs{r.inputConfig}
    26  }
    27  
    28  func (r *pinnedResolver) Resolve(ctx context.Context) (map[string]*versionCandidate, db.ResolutionFailure, error) {
    29  	ctx, span := tracing.StartSpan(ctx, "pinnedResolver.Resolve", tracing.Attrs{
    30  		"input": r.inputConfig.Name,
    31  	})
    32  	defer span.End()
    33  
    34  	version, found, err := r.vdb.FindVersionOfResource(ctx, r.inputConfig.ResourceID, r.inputConfig.PinnedVersion)
    35  	if err != nil {
    36  		tracing.End(span, err)
    37  		return nil, "", err
    38  	}
    39  
    40  	if !found {
    41  		span.AddEvent(ctx, "pinned version not found")
    42  		span.SetStatus(codes.NotFound, "pinned version not found")
    43  		return nil, db.PinnedVersionNotFound{PinnedVersion: r.inputConfig.PinnedVersion}.String(), nil
    44  	}
    45  
    46  	span.AddEvent(ctx, "found via pin", label.String("version", string(version)))
    47  
    48  	versionCandidate := map[string]*versionCandidate{
    49  		r.inputConfig.Name: newCandidateVersion(version),
    50  	}
    51  
    52  	span.SetStatus(codes.OK, "found via pin")
    53  	return versionCandidate, "", nil
    54  }