Skip to content

Commit d940da2

Browse files
committed
Drop support for image manifest schema 1
1 parent 08d9c6d commit d940da2

File tree

16 files changed

+812
-838
lines changed

16 files changed

+812
-838
lines changed

pkg/image/apis/image/docker10/types.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,6 @@ type DockerImageManifest struct {
2828
SchemaVersion int `json:"schemaVersion"`
2929
MediaType string `json:"mediaType,omitempty"`
3030

31-
// schema1
32-
Name string `json:"name"`
33-
Tag string `json:"tag"`
34-
Architecture string `json:"architecture"`
35-
FSLayers []DockerFSLayer `json:"fsLayers"`
36-
History []DockerHistory `json:"history"`
37-
3831
// schema2
3932
Layers []Descriptor `json:"layers"`
4033
Config Descriptor `json:"config"`

pkg/image/apiserver/admission/limitrange/admission_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
imagev1 "github.com/openshift/api/image/v1"
2020
"github.com/openshift/openshift-apiserver/pkg/api/legacy"
2121
imageapi "github.com/openshift/openshift-apiserver/pkg/image/apis/image"
22-
"github.com/openshift/openshift-apiserver/pkg/image/apiserver/testutil"
22+
"github.com/openshift/openshift-apiserver/pkg/image/apiserver/internal/testutil"
2323
)
2424

2525
func TestAdmitImageStreamMapping(t *testing.T) {
@@ -36,7 +36,7 @@ func TestAdmitImageStreamMapping(t *testing.T) {
3636
},
3737
"new ism, under limit range": {
3838
imageStreamMapping: getImageStreamMapping(),
39-
limitRange: getLimitRange("1Ki"),
39+
limitRange: getLimitRange("2Mi"),
4040
operation: admission.Create,
4141
shouldAdmit: true,
4242
},
@@ -246,6 +246,7 @@ func getBaseImageWith1Layer() imageapi.Image {
246246
},
247247
DockerImageReference: fmt.Sprintf("registry.example.org/%s/%s", "test", testutil.BaseImageWith1LayerDigest),
248248
DockerImageManifest: testutil.BaseImageWith1Layer,
249+
DockerImageConfig: testutil.BaseImageWith1LayerConfig,
249250
}
250251
}
251252

pkg/image/apiserver/admission/limitrange/imagestream_limits_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/openshift/library-go/pkg/quota/quotautil"
1414

1515
imageapi "github.com/openshift/openshift-apiserver/pkg/image/apis/image"
16-
imagetest "github.com/openshift/openshift-apiserver/pkg/image/apiserver/testutil"
16+
imagetest "github.com/openshift/openshift-apiserver/pkg/image/apiserver/internal/testutil"
1717
)
1818

1919
func TestGetMaxLimits(t *testing.T) {

pkg/image/apiserver/admission/limitrange/usage_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
imagev1 "github.com/openshift/api/image/v1"
1414
"github.com/openshift/library-go/pkg/image/imageutil"
1515
imageapi "github.com/openshift/openshift-apiserver/pkg/image/apis/image"
16-
imagetest "github.com/openshift/openshift-apiserver/pkg/image/apiserver/testutil"
16+
imagetest "github.com/openshift/openshift-apiserver/pkg/image/apiserver/internal/testutil"
1717
)
1818

1919
func TestGetImageReferenceForObjectReference(t *testing.T) {

pkg/image/apiserver/importer/image.go

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
"github.com/distribution/distribution/v3"
88
"github.com/distribution/distribution/v3/manifest/manifestlist"
9-
"github.com/distribution/distribution/v3/manifest/schema1"
109
"github.com/distribution/distribution/v3/registry/api/errcode"
1110
godigest "github.com/opencontainers/go-digest"
1211

@@ -18,41 +17,6 @@ import (
1817
imagedockerpre012 "github.com/openshift/openshift-apiserver/pkg/image/apis/image/dockerpre012"
1918
)
2019

21-
func schema1ToImage(manifest *schema1.SignedManifest, d godigest.Digest) (*imageapi.Image, error) {
22-
if len(manifest.History) == 0 {
23-
return nil, fmt.Errorf("image has no v1Compatibility history and cannot be used")
24-
}
25-
dockerImage, err := unmarshalDockerImage([]byte(manifest.History[0].V1Compatibility))
26-
if err != nil {
27-
return nil, err
28-
}
29-
mediatype, payload, err := manifest.Payload()
30-
if err != nil {
31-
return nil, err
32-
}
33-
34-
if len(manifest.Canonical) == 0 {
35-
return nil, fmt.Errorf("unable to load canonical representation from schema1 manifest")
36-
}
37-
payloadDigest := godigest.FromBytes(manifest.Canonical)
38-
if len(d) > 0 && payloadDigest != d {
39-
return nil, fmt.Errorf("content integrity error: the schema 1 manifest retrieved with digest %s does not match the digest calculated from the content %s", d, payloadDigest)
40-
}
41-
dockerImage.ID = payloadDigest.String()
42-
43-
image := &imageapi.Image{
44-
ObjectMeta: metav1.ObjectMeta{
45-
Name: dockerImage.ID,
46-
},
47-
DockerImageMetadata: *dockerImage,
48-
DockerImageManifest: string(payload),
49-
DockerImageManifestMediaType: mediatype,
50-
DockerImageMetadataVersion: "1.0",
51-
}
52-
53-
return image, nil
54-
}
55-
5620
// schema2OrOCIToImage converts a docker schema 2 or an oci schema manifest into an Image.
5721
func schema2OrOCIToImage(manifest distribution.Manifest, imageConfig []byte, d godigest.Digest) (*imageapi.Image, error) {
5822
mediatype, payload, err := manifest.Payload()

pkg/image/apiserver/importer/importer.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/distribution/distribution/v3"
1313
"github.com/distribution/distribution/v3/manifest/manifestlist"
1414
"github.com/distribution/distribution/v3/manifest/ocischema"
15-
"github.com/distribution/distribution/v3/manifest/schema1"
1615
"github.com/distribution/distribution/v3/manifest/schema2"
1716
"github.com/distribution/distribution/v3/reference"
1817
"github.com/distribution/distribution/v3/registry/api/errcode"
@@ -743,8 +742,6 @@ func (imp *ImageStreamImporter) importManifest(
743742
if isManifestList && !legacyManifestListImport {
744743
image, err = manifestListToImage(manifestList, d)
745744
return
746-
} else if signedManifest, isSchema1 := manifest.(*schema1.SignedManifest); isSchema1 {
747-
image, err = schema1ToImage(signedManifest, d)
748745
} else if deserializedManifest, isSchema2 := manifest.(*schema2.DeserializedManifest); isSchema2 {
749746
imageConfig, getImportConfigErr := b.Get(ctx, deserializedManifest.Config.Digest)
750747
if getImportConfigErr != nil {

pkg/image/apiserver/importer/importer_test.go

Lines changed: 30 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package importer
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
76
"net/http"
87
"net/url"
@@ -11,7 +10,6 @@ import (
1110

1211
"github.com/containers/image/v5/pkg/sysregistriesv2"
1312
"github.com/distribution/distribution/v3"
14-
"github.com/distribution/distribution/v3/manifest/schema1"
1513
"github.com/distribution/distribution/v3/manifest/schema2"
1614
"github.com/distribution/distribution/v3/reference"
1715
godigest "github.com/opencontainers/go-digest"
@@ -169,20 +167,6 @@ func (r *mockTagService) Lookup(ctx context.Context, digest distribution.Descrip
169167
return nil, fmt.Errorf("not implemented")
170168
}
171169

172-
func TestSchema1ToImage(t *testing.T) {
173-
m := &schema1.SignedManifest{}
174-
if err := json.Unmarshal([]byte(etcdManifest), m); err != nil {
175-
t.Fatal(err)
176-
}
177-
image, err := schema1ToImage(m, godigest.Digest("sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238"))
178-
if err != nil {
179-
t.Fatal(err)
180-
}
181-
if image.DockerImageMetadata.ID != "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238" {
182-
t.Errorf("unexpected image: %#v", image.DockerImageMetadata.ID)
183-
}
184-
}
185-
186170
func TestImportNothing(t *testing.T) {
187171
ctx := NewStaticCredentialsContext(
188172
http.DefaultTransport, http.DefaultTransport, nil,
@@ -202,11 +186,6 @@ func expectStatusError(status metav1.Status, message string) bool {
202186
}
203187

204188
func TestImport(t *testing.T) {
205-
etcdManifestSchema1 := &schema1.SignedManifest{}
206-
if err := json.Unmarshal([]byte(etcdManifest), etcdManifestSchema1); err != nil {
207-
t.Fatal(err)
208-
}
209-
t.Logf("etcd manifest schema 1 digest: %q", godigest.FromBytes([]byte(etcdManifest)))
210189
busyboxManifestSchema2 := &schema2.DeserializedManifest{}
211190
if err := busyboxManifestSchema2.UnmarshalJSON([]byte(busyboxManifest)); err != nil {
212191
t.Fatal(err)
@@ -312,12 +291,21 @@ func TestImport(t *testing.T) {
312291
},
313292
},
314293
{
315-
name: "successfull import by tag and digest",
316-
retriever: &mockRetriever{repo: &mockRepository{manifest: etcdManifestSchema1}},
294+
name: "successful import by tag and digest",
295+
retriever: &mockRetriever{
296+
repo: &mockRepository{
297+
blobs: &mockBlobStore{
298+
blobs: map[godigest.Digest][]byte{
299+
busyboxConfigDigest: []byte(busyboxManifestConfig),
300+
},
301+
},
302+
manifest: busyboxManifestSchema2,
303+
},
304+
},
317305
isi: imageapi.ImageStreamImport{
318306
Spec: imageapi.ImageStreamImportSpec{
319307
Images: []imageapi.ImageImportSpec{
320-
{From: kapi.ObjectReference{Kind: "DockerImage", Name: "test@sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238"}},
308+
{From: kapi.ObjectReference{Kind: "DockerImage", Name: "test@" + busyboxDigest}},
321309
{From: kapi.ObjectReference{Kind: "DockerImage", Name: "test:tag"}},
322310
},
323311
},
@@ -331,13 +319,17 @@ func TestImport(t *testing.T) {
331319
if image.Status.Status != metav1.StatusSuccess {
332320
t.Errorf("unexpected status %d: %#v", i, image.Status)
333321
}
334-
// the image name is always the sha256, and size is calculated
335-
if image.Image == nil || image.Image.Name != "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238" || image.Image.DockerImageMetadata.Size != 28643712 {
336-
t.Errorf("unexpected image %d: %#v", i, image.Image.Name)
337-
}
338-
// the most specific reference is returned
339-
if image.Image.DockerImageReference != "test@sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238" {
340-
t.Errorf("unexpected ref %d: %#v", i, image.Image.DockerImageReference)
322+
if image.Image == nil {
323+
t.Errorf("unexpected nil image: %#v", image)
324+
} else {
325+
// the image name is always the sha256, and size is calculated
326+
if image.Image.Name != busyboxDigest || image.Image.DockerImageMetadata.Size != 669049 {
327+
t.Errorf("unexpected image %d: %#v (size %d)", i, image.Image.Name, image.Image.DockerImageMetadata.Size)
328+
}
329+
// the most specific reference is returned
330+
if image.Image.DockerImageReference != "test@"+busyboxDigest {
331+
t.Errorf("unexpected ref %d: %#v", i, image.Image.DockerImageReference)
332+
}
341333
}
342334
if image.Tag != expectedTags[i] {
343335
t.Errorf("unexpected tag of status %d (%s != %s)", i, image.Tag, expectedTags[i])
@@ -392,14 +384,14 @@ func TestImport(t *testing.T) {
392384
name: "import repository with additional tags",
393385
retriever: &mockRetriever{
394386
repo: &mockRepository{
395-
manifest: etcdManifestSchema1,
387+
manifest: busyboxManifestSchema2,
396388
tags: map[string]string{
397-
"v1": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
398-
"other": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
399-
"v2": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
400-
"3": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
401-
"3.1": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
402-
"abc": "sha256:958608f8ecc1dc62c93b6c610f3a834dae4220c9642e6e8b4e0f2b3ad7cbd238",
389+
"v1": busyboxDigest,
390+
"other": busyboxDigest,
391+
"v2": busyboxDigest,
392+
"3": busyboxDigest,
393+
"3.1": busyboxDigest,
394+
"abc": busyboxDigest,
403395
},
404396
getTagErr: fmt.Errorf("no such tag"),
405397
getByTagErr: fmt.Errorf("no such manifest tag"),
@@ -640,56 +632,6 @@ func TestImportFromMirror(t *testing.T) {
640632
})
641633
}
642634

643-
const etcdManifest = `
644-
{
645-
"schemaVersion": 1,
646-
"tag": "latest",
647-
"name": "coreos/etcd",
648-
"architecture": "amd64",
649-
"fsLayers": [
650-
{
651-
"blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
652-
},
653-
{
654-
"blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
655-
},
656-
{
657-
"blobSum": "sha256:2560187847cadddef806eaf244b7755af247a9dbabb90ca953dd2703cf423766"
658-
},
659-
{
660-
"blobSum": "sha256:744b46d0ac8636c45870a03830d8d82c20b75fbfb9bc937d5e61005d23ad4cfe"
661-
}
662-
],
663-
"history": [
664-
{
665-
"v1Compatibility": "{\"id\":\"fe50ac14986497fa6b5d2cc24feb4a561d01767bc64413752c0988cb70b0b8b9\",\"parent\":\"a5a18474fa96a3c6e240bc88e41de2afd236520caf904356ad9d5f8d875c3481\",\"created\":\"2015-12-30T22:29:13.967754365Z\",\"container\":\"c8d0f1a274b5f52fa5beb280775ef07cf18ec0f95e5ae42fbad01157e2614d42\",\"container_config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"ExposedPorts\":{\"2379/tcp\":{},\"2380/tcp\":{},\"4001/tcp\":{},\"7001/tcp\":{}},\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT \\u0026{[\\\"/etcd\\\"]}\"],\"Image\":\"a5a18474fa96a3c6e240bc88e41de2afd236520caf904356ad9d5f8d875c3481\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":[\"/etcd\"],\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.9.1\",\"config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"ExposedPorts\":{\"2379/tcp\":{},\"2380/tcp\":{},\"4001/tcp\":{},\"7001/tcp\":{}},\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"a5a18474fa96a3c6e240bc88e41de2afd236520caf904356ad9d5f8d875c3481\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":[\"/etcd\"],\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\"}"
666-
},
667-
{
668-
"v1Compatibility": "{\"id\":\"a5a18474fa96a3c6e240bc88e41de2afd236520caf904356ad9d5f8d875c3481\",\"parent\":\"796d581500e960cc02095dcdeccf55db215b8e54c57e3a0b11392145ffe60cf6\",\"created\":\"2015-12-30T22:29:13.504159783Z\",\"container\":\"080708d544f85052a46fab72e701b4358c1b96cb4b805a5b2d66276fc2aaf85d\",\"container_config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"ExposedPorts\":{\"2379/tcp\":{},\"2380/tcp\":{},\"4001/tcp\":{},\"7001/tcp\":{}},\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) EXPOSE 2379/tcp 2380/tcp 4001/tcp 7001/tcp\"],\"Image\":\"796d581500e960cc02095dcdeccf55db215b8e54c57e3a0b11392145ffe60cf6\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.9.1\",\"config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"ExposedPorts\":{\"2379/tcp\":{},\"2380/tcp\":{},\"4001/tcp\":{},\"7001/tcp\":{}},\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"796d581500e960cc02095dcdeccf55db215b8e54c57e3a0b11392145ffe60cf6\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\"}"
669-
},
670-
{
671-
"v1Compatibility": "{\"id\":\"796d581500e960cc02095dcdeccf55db215b8e54c57e3a0b11392145ffe60cf6\",\"parent\":\"309c960c7f875411ae2ee2bfb97b86eee5058f3dad77206dd0df4f97df8a77fa\",\"created\":\"2015-12-30T22:29:12.912813629Z\",\"container\":\"f28be899c9b8680d4cf8585e663ad20b35019db062526844e7cfef117ce9037f\",\"container_config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ADD file:e330b1da49d993059975e46560b3bd360691498b0f2f6e00f39fc160cf8d4ec3 in /\"],\"Image\":\"309c960c7f875411ae2ee2bfb97b86eee5058f3dad77206dd0df4f97df8a77fa\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.9.1\",\"config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"309c960c7f875411ae2ee2bfb97b86eee5058f3dad77206dd0df4f97df8a77fa\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":13502144}"
672-
},
673-
{
674-
"v1Compatibility": "{\"id\":\"309c960c7f875411ae2ee2bfb97b86eee5058f3dad77206dd0df4f97df8a77fa\",\"created\":\"2015-12-30T22:29:12.346834862Z\",\"container\":\"1b97abade59e4b5b935aede236980a54fb500cd9ee5bd4323c832c6d7b3ffc6e\",\"container_config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ADD file:74912593c6783292c4520514f5cc9313acbd1da0f46edee0fdbed2a24a264d6f in /\"],\"Image\":\"\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"docker_version\":\"1.9.1\",\"config\":{\"Hostname\":\"1b97abade59e\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":15141568}"
675-
}
676-
],
677-
"signatures": [
678-
{
679-
"header": {
680-
"alg": "RS256",
681-
"jwk": {
682-
"e": "AQAB",
683-
"kty": "RSA",
684-
"n": "yB40ou1GMvIxYs1jhxWaeoDiw3oa0_Q2UJThUPtArvO0tRzaun9FnSphhOEHIGcezfq95jy-3MN-FIjmsWgbPHY8lVDS38fF75aCw6qkholwqjmMtUIgPNYoMrg0rLUE5RRyJ84-hKf9Fk7V3fItp1mvCTGKaS3ze-y5dTTrfbNGE7qG638Dla2Fuz-9CNgRQj0JH54o547WkKJC-pG-j0jTDr8lzsXhrZC7lJas4yc-vpt3D60iG4cW_mkdtIj52ZFEgHZ56sUj7AhnNVly0ZP9W1hmw4xEHDn9WLjlt7ivwARVeb2qzsNdguUitcI5hUQNwpOVZ_O3f1rUIL_kRw"
685-
}
686-
},
687-
"protected": "eyJmb3JtYXRUYWlsIjogIkNuMCIsICJmb3JtYXRMZW5ndGgiOiA1OTI2LCAidGltZSI6ICIyMDE2LTAxLTAyVDAyOjAxOjMzWiJ9",
688-
"signature": "DrQ43UWeit-thDoRGTCP0Gd2wL5K2ecyPhHo_au0FoXwuKODja0tfwHexB9ypvFWngk-ijXuwO02x3aRIZqkWpvKLxxzxwkrZnPSje4o_VrFU4z5zwmN8sJw52ODkQlW38PURIVksOxCrb0zRl87yTAAsUAJ_4UUPNltZSLnhwy-qPb2NQ8ghgsONcBxRQrhPFiWNkxDKZ3kjvzYyrXDxTcvwK3Kk_YagZ4rCOhH1B7mAdVSiSHIvvNV5grPshw_ipAoqL2iNMsxWxLjYZl9xSJQI2asaq3fvh8G8cZ7T-OahDUos_GyhnIj39C-9ouqdJqMUYFETqbzRCR6d36CpQ"
689-
}
690-
]
691-
}`
692-
693635
const busyboxDigest = "sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6"
694636

695637
const busyboxManifest = `{

0 commit comments

Comments
 (0)