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 }