Currently artifact revision (i.e. digest) is obtain here:
|
// Get the upstream revision from the artifact digest |
|
revision, err := r.getRevision(url, opts.craneOpts) |
It is also observed as a condition here:
|
message := fmt.Sprintf("new revision '%s' for '%s'", revision, url) |
|
if obj.GetArtifact() != nil { |
|
conditions.MarkTrue(obj, sourcev1.ArtifactOutdatedCondition, "NewRevision", message) |
|
} |
|
rreconcile.ProgressiveStatus(true, obj, meta.ProgressingReason, "building artifact: %s", message) |
|
if err := sp.Patch(ctx, obj, r.patchOptions...); err != nil { |
|
ctrl.LoggerFrom(ctx).Error(err, "failed to patch") |
|
return |
|
} |
|
} |
However, verification and fetching is only done by URL, and it's possible there is an update in registry in between all of these calls:
|
err := r.verifySignature(ctx, obj, url, opts.verifyOpts...) |
|
// Pull artifact from the remote container registry |
|
img, err := crane.Pull(url, opts.craneOpts...) |
There maybe other race coditions. It will be easy enough to address this and reinfoce use of the same digest for all of the registry API calls.
Currently artifact revision (i.e. digest) is obtain here:
source-controller/internal/controller/ocirepository_controller.go
Lines 392 to 393 in 53ee3a3
It is also observed as a condition here:
source-controller/internal/controller/ocirepository_controller.go
Lines 408 to 417 in 53ee3a3
However, verification and fetching is only done by URL, and it's possible there is an update in registry in between all of these calls:
source-controller/internal/controller/ocirepository_controller.go
Line 431 in 53ee3a3
source-controller/internal/controller/ocirepository_controller.go
Lines 455 to 456 in 53ee3a3
There maybe other race coditions. It will be easy enough to address this and reinfoce use of the same digest for all of the registry API calls.