diff --git a/modules/mesh-delivery-indexer/internal/index/seed_steps.go b/modules/mesh-delivery-indexer/internal/index/seed_steps.go index adbe12b8..934fbe62 100644 --- a/modules/mesh-delivery-indexer/internal/index/seed_steps.go +++ b/modules/mesh-delivery-indexer/internal/index/seed_steps.go @@ -13,6 +13,7 @@ import ( mcc "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/keys" "git.novox.be/novox/mesh-sdk/go/seatdef" ) @@ -77,7 +78,7 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. unbuilt := map[string][]string{} // module -> each artifact of it no build seat builds, with its language or kind for _, e := range entries { for _, a := range e.Artifacts { - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { continue } seat, err := buildSeatOf(defs, a) @@ -103,7 +104,7 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. } for _, a := range e.Artifacts { name := artifactName(a.Ref) - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { // The builder packs or fetches it: no steps call, and its lint, unit and integration are bypass (A-324). m.Artifacts = append(m.Artifacts, SeedArtifact{Name: name, Answered: true}) continue @@ -135,12 +136,6 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. return out, nil } -// packedOrFetched says the artifact is one the builder packs or fetches itself, of kind archive or upstream with no -// language: it has no lint, unit or integration step, so no build seat's steps is called for it (design 47 G A-324). -func packedOrFetched(a meshcatalog.Artifact) bool { - return a.Language == "" && (a.Kind == "archive" || a.Kind == "upstream") -} - // unbuiltWords names an artifact no build seat builds, with its language, else its kind. func unbuiltWords(a meshcatalog.Artifact) string { if a.Language != "" { diff --git a/modules/mesh-delivery-pipeline/internal/pipeline/place.go b/modules/mesh-delivery-pipeline/internal/pipeline/place.go index 48feee34..b4037762 100644 --- a/modules/mesh-delivery-pipeline/internal/pipeline/place.go +++ b/modules/mesh-delivery-pipeline/internal/pipeline/place.go @@ -16,6 +16,7 @@ import ( nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" nodebuildimage "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" nodebuildnode "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/seatdef" ) @@ -96,7 +97,7 @@ func Place(p seat.Pipeline, reg catalog.Registration, entries map[string]catalog for _, step := range buildSteps { status := Status(reg, name, step) why := "bypassed by the module's policy" - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { status, why = seat.StepResultStatusBypass, fmt.Sprintf("an artifact of kind %s has no %s step: the builder packs or fetches it", a.Kind, step) } s := seat.StepResult{Step: step, Artifact: a.Ref, Status: status, Fingerprint: p.Fingerprint} @@ -147,13 +148,6 @@ func Place(p seat.Pipeline, reg catalog.Registration, entries map[string]catalog return steps, asks } -// packedOrFetched says the artifact is one the builder packs or fetches itself, of kind archive or upstream with no language: -// it has no lint, unit or integration step, so those are bypass whatever the policy says and no build seat is asked -// (design 47 G A-324, A-325). -func packedOrFetched(a catalog.Artifact) bool { - return a.Language == "" && (a.Kind == "archive" || a.Kind == "upstream") -} - // Asked is one ask to put on a build seat's work queue. type Asked struct { Seat string diff --git a/modules/mesh-delivery-sdk/buildstep/packed.go b/modules/mesh-delivery-sdk/buildstep/packed.go new file mode 100644 index 00000000..807ca36c --- /dev/null +++ b/modules/mesh-delivery-sdk/buildstep/packed.go @@ -0,0 +1,9 @@ +package buildstep + +// PackedOrFetched says an artifact of language and kind (its catalog entry's) is one the builder packs or fetches itself, +// of kind archive or upstream with no language: it has no lint, unit or integration step, so the seed calls no build seat's +// steps for it and the runner places those steps bypassed, whatever the policy says (design 47 G A-324, A-325). The +// indexer's seed and the runner read this one rule. +func PackedOrFetched(language, kind string) bool { + return language == "" && (kind == "archive" || kind == "upstream") +} diff --git a/modules/mesh-delivery-sdk/buildstep/step_test.go b/modules/mesh-delivery-sdk/buildstep/step_test.go index bc93f2b0..284e6290 100644 --- a/modules/mesh-delivery-sdk/buildstep/step_test.go +++ b/modules/mesh-delivery-sdk/buildstep/step_test.go @@ -87,3 +87,17 @@ func TestParseStepKeyReadsBothFormsAndRefusesAThird(t *testing.T) { } } } + +// Design 47 G A-324, A-325: only an artifact of kind archive or upstream with no language is packed or fetched by the builder. +func TestPackedOrFetchedIsAnArchiveOrUpstreamWithNoLanguage(t *testing.T) { + for _, c := range []struct { + language, kind string + want bool + }{ + {"", "archive", true}, {"", "upstream", true}, {"go", "archive", false}, {"", "image", false}, {"go", "", false}, {"", "", false}, + } { + if got := PackedOrFetched(c.language, c.kind); got != c.want { + t.Errorf("PackedOrFetched(%q, %q) = %v, want %v", c.language, c.kind, got, c.want) + } + } +}