Skip to content

Commit f64093c

Browse files
feat(api): added oci-subject header when pushing an image with subject field
- as requested by the latest version of the oci distribution spec Signed-off-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
1 parent 60a375a commit f64093c

20 files changed

Lines changed: 173 additions & 137 deletions

pkg/api/constants/consts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const (
77
Uploads = "uploads"
88
DistAPIVersion = "Docker-Distribution-API-Version"
99
DistContentDigestKey = "Docker-Content-Digest"
10+
SubjectDigestKey = "OCI-Subject"
1011
BlobUploadUUID = "Blob-Upload-UUID"
1112
DefaultMediaType = "application/json"
1213
BinaryMediaType = "application/octet-stream"

pkg/api/routes.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ func (rh *RouteHandler) UpdateManifest(response http.ResponseWriter, request *ht
571571
return
572572
}
573573

574-
digest, err := imgStore.PutImageManifest(name, reference, mediaType, body)
574+
digest, subjectDigest, err := imgStore.PutImageManifest(name, reference, mediaType, body)
575575
if err != nil {
576576
if errors.Is(err, zerr.ErrRepoNotFound) { //nolint:gocritic // errorslint conflicts with gocritic:IfElseChain
577577
WriteJSON(response, http.StatusNotFound,
@@ -621,6 +621,10 @@ func (rh *RouteHandler) UpdateManifest(response http.ResponseWriter, request *ht
621621
}
622622
}
623623

624+
if subjectDigest.String() != "" {
625+
response.Header().Set(constants.SubjectDigestKey, subjectDigest.String())
626+
}
627+
624628
response.Header().Set("Location", fmt.Sprintf("/v2/%s/manifests/%s", name, digest))
625629
response.Header().Set(constants.DistContentDigestKey, digest.String())
626630
response.WriteHeader(http.StatusCreated)

pkg/api/routes_test.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,10 @@ func TestRoutes(t *testing.T) {
148148
"reference": "reference",
149149
},
150150
&mocks.MockedImageStore{
151-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
152-
return "", zerr.ErrRepoNotFound
151+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
152+
godigest.Digest, error,
153+
) {
154+
return "", "", zerr.ErrRepoNotFound
153155
},
154156
})
155157
So(statusCode, ShouldEqual, http.StatusNotFound)
@@ -161,8 +163,10 @@ func TestRoutes(t *testing.T) {
161163
},
162164

163165
&mocks.MockedImageStore{
164-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
165-
return "", zerr.ErrManifestNotFound
166+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
167+
godigest.Digest, error,
168+
) {
169+
return "", "", zerr.ErrManifestNotFound
166170
},
167171
})
168172
So(statusCode, ShouldEqual, http.StatusNotFound)
@@ -173,8 +177,10 @@ func TestRoutes(t *testing.T) {
173177
"reference": "reference",
174178
},
175179
&mocks.MockedImageStore{
176-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
177-
return "", zerr.ErrBadManifest
180+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
181+
godigest.Digest, error,
182+
) {
183+
return "", "", zerr.ErrBadManifest
178184
},
179185
})
180186
So(statusCode, ShouldEqual, http.StatusBadRequest)
@@ -185,8 +191,10 @@ func TestRoutes(t *testing.T) {
185191
"reference": "reference",
186192
},
187193
&mocks.MockedImageStore{
188-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
189-
return "", zerr.ErrBlobNotFound
194+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
195+
godigest.Digest, error,
196+
) {
197+
return "", "", zerr.ErrBlobNotFound
190198
},
191199
})
192200
So(statusCode, ShouldEqual, http.StatusBadRequest)
@@ -198,8 +206,10 @@ func TestRoutes(t *testing.T) {
198206
"reference": "reference",
199207
},
200208
&mocks.MockedImageStore{
201-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
202-
return "", zerr.ErrRepoBadVersion
209+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
210+
godigest.Digest, error,
211+
) {
212+
return "", "", zerr.ErrRepoBadVersion
203213
},
204214
})
205215
So(statusCode, ShouldEqual, http.StatusInternalServerError)

pkg/extensions/search/cve/trivy/scanner_internal_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func generateTestImage(storeController storage.StoreController, image string) {
5252

5353
manifestBlob, err := json.Marshal(manifest)
5454
So(err, ShouldBeNil)
55-
_, err = store.PutImageManifest(repoName, tag, ispec.MediaTypeImageManifest, manifestBlob)
55+
_, _, err = store.PutImageManifest(repoName, tag, ispec.MediaTypeImageManifest, manifestBlob)
5656
So(err, ShouldBeNil)
5757
}
5858

pkg/extensions/search/search_test.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4515,8 +4515,10 @@ func TestRepoDBWhenSigningImages(t *testing.T) {
45154515
Convey("imageIsSignature fails", func() {
45164516
// make image store ignore the wrong format of the input
45174517
ctlr.StoreController.DefaultStore = mocks.MockedImageStore{
4518-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
4519-
return "", nil
4518+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
4519+
godigest.Digest, error,
4520+
) {
4521+
return "", "", nil
45204522
},
45214523
DeleteImageManifestFn: func(repo, reference string, dc bool) error {
45224524
return ErrTestError
@@ -5783,8 +5785,10 @@ func TestRepoDBWhenDeletingImages(t *testing.T) {
57835785

57845786
Convey("imageIsSignature fails", func() {
57855787
ctlr.StoreController.DefaultStore = mocks.MockedImageStore{
5786-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
5787-
return "", nil
5788+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
5789+
godigest.Digest, error,
5790+
) {
5791+
return "", "", nil
57885792
},
57895793
DeleteImageManifestFn: func(repo, reference string, dc bool) error {
57905794
return nil
@@ -5807,8 +5811,10 @@ func TestRepoDBWhenDeletingImages(t *testing.T) {
58075811

58085812
return configBlob, nil
58095813
},
5810-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
5811-
return "", nil
5814+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
5815+
godigest.Digest, error,
5816+
) {
5817+
return "", "", nil
58125818
},
58135819
DeleteImageManifestFn: func(repo, reference string, dc bool) error {
58145820
return nil
@@ -5835,8 +5841,10 @@ func TestRepoDBWhenDeletingImages(t *testing.T) {
58355841

58365842
return configBlob, nil
58375843
},
5838-
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
5839-
return "", ErrTestError
5844+
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest,
5845+
godigest.Digest, error,
5846+
) {
5847+
return "", "", ErrTestError
58405848
},
58415849
DeleteImageManifestFn: func(repo, reference string, dc bool) error {
58425850
return nil

pkg/extensions/sync/signatures.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func (sig *signaturesCopier) syncCosignSignature(localRepo, remoteRepo, digestSt
180180
}
181181

182182
// push manifest
183-
_, err = imageStore.PutImageManifest(localRepo, cosignTag,
183+
_, _, err = imageStore.PutImageManifest(localRepo, cosignTag,
184184
ispec.MediaTypeImageManifest, cosignManifestBuf)
185185
if err != nil {
186186
sig.log.Error().Str("errorType", common.TypeOf(err)).
@@ -258,7 +258,7 @@ func (sig *signaturesCopier) syncORASRefs(localRepo, remoteRepo, digestStr strin
258258
}
259259
}
260260

261-
_, err = imageStore.PutImageManifest(localRepo, ref.Digest.String(),
261+
_, _, err = imageStore.PutImageManifest(localRepo, ref.Digest.String(),
262262
oras.MediaTypeArtifactManifest, body)
263263
if err != nil {
264264
sig.log.Error().Str("errorType", common.TypeOf(err)).
@@ -359,7 +359,7 @@ func (sig *signaturesCopier) syncOCIRefs(localRepo, remoteRepo, digestStr string
359359
continue
360360
}
361361

362-
digest, err := imageStore.PutImageManifest(localRepo, ref.Digest.String(),
362+
digest, _, err := imageStore.PutImageManifest(localRepo, ref.Digest.String(),
363363
ref.MediaType, OCIRefBody)
364364
if err != nil {
365365
sig.log.Error().Str("errorType", common.TypeOf(err)).

pkg/extensions/sync/sync_internal_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ func TestSyncInternal(t *testing.T) {
698698

699699
manifestDigest := godigest.FromBytes(manifestContent)
700700

701-
_, err = testImageStore.PutImageManifest(repo, manifestDigest.String(),
701+
_, _, err = testImageStore.PutImageManifest(repo, manifestDigest.String(),
702702
ispec.MediaTypeImageManifest, manifestContent)
703703
So(err, ShouldBeNil)
704704

@@ -715,7 +715,7 @@ func TestSyncInternal(t *testing.T) {
715715
So(digest, ShouldNotBeNil)
716716

717717
// upload index image
718-
_, err = testImageStore.PutImageManifest(repo, "latest", ispec.MediaTypeImageIndex, content)
718+
_, _, err = testImageStore.PutImageManifest(repo, "latest", ispec.MediaTypeImageIndex, content)
719719
So(err, ShouldBeNil)
720720

721721
err = pushSyncedLocalImage(repo, "latest", testRootDir, nil, imageStore, log)

pkg/extensions/sync/utils.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ func pushSyncedLocalImage(localRepo, reference, localCachePath string,
337337
}
338338
}
339339

340-
_, err = imageStore.PutImageManifest(localRepo, reference, mediaType, manifestBlob)
340+
_, _, err = imageStore.PutImageManifest(localRepo, reference, mediaType, manifestBlob)
341341
if err != nil {
342342
log.Error().Str("errorType", common.TypeOf(err)).
343343
Err(err).Msg("couldn't upload manifest")
@@ -389,7 +389,7 @@ func copyManifest(localRepo string, manifestContent []byte, reference string, re
389389
return err
390390
}
391391

392-
digest, err := imageStore.PutImageManifest(localRepo, reference,
392+
digest, _, err := imageStore.PutImageManifest(localRepo, reference,
393393
ispec.MediaTypeImageManifest, manifestContent)
394394
if err != nil {
395395
log.Error().Str("errorType", common.TypeOf(err)).

pkg/meta/update.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func OnDeleteManifest(repo, reference, mediaType string, digest godigest.Digest,
115115
log.Info().Msg("repodb: restoring image store")
116116

117117
// restore image store
118-
_, err := imgStore.PutImageManifest(repo, reference, mediaType, manifestBlob)
118+
_, _, err := imgStore.PutImageManifest(repo, reference, mediaType, manifestBlob)
119119
if err != nil {
120120
log.Error().Err(err).Msg("repodb: error while restoring image store, database is not consistent")
121121
}

pkg/storage/common_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func TestValidateManifest(t *testing.T) {
7171
body, err := json.Marshal(manifest)
7272
So(err, ShouldBeNil)
7373

74-
_, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
74+
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
7575
So(err, ShouldNotBeNil)
7676
})
7777

@@ -101,7 +101,7 @@ func TestValidateManifest(t *testing.T) {
101101
body, err := json.Marshal(manifest)
102102
So(err, ShouldBeNil)
103103

104-
_, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
104+
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
105105
So(err, ShouldNotBeNil)
106106
})
107107

@@ -130,7 +130,7 @@ func TestValidateManifest(t *testing.T) {
130130
body, err := json.Marshal(manifest)
131131
So(err, ShouldBeNil)
132132

133-
_, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
133+
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
134134
So(err, ShouldBeNil)
135135
})
136136
})

0 commit comments

Comments
 (0)