Skip to content
This repository was archived by the owner on Sep 28, 2022. It is now read-only.

Commit 22db027

Browse files
committedSep 23, 2022
feat: Support OCI Artifact Manifest (#2)
Signed-off-by: Lixia (Sylvia) Lei <lixlei@microsoft.com>
1 parent c739292 commit 22db027

File tree

9 files changed

+141
-190
lines changed

9 files changed

+141
-190
lines changed
 

‎content/file/file_test.go

+4-8
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434

3535
"github.com/opencontainers/go-digest"
3636
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
37-
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
3837
"golang.org/x/sync/errgroup"
3938
"oras.land/oras-go/v2"
4039
"oras.land/oras-go/v2/content"
@@ -2126,17 +2125,14 @@ func TestStore_Predecessors(t *testing.T) {
21262125
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
21272126
}
21282127
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
2129-
var manifest artifactspec.Manifest
2130-
artifactSubject := descriptor.OCIToArtifact(subject)
2131-
manifest.Subject = &artifactSubject
2132-
for _, blob := range blobs {
2133-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
2134-
}
2128+
var manifest ocispec.Artifact
2129+
manifest.Subject = &subject
2130+
manifest.Blobs = append(manifest.Blobs, blobs...)
21352131
manifestJSON, err := json.Marshal(manifest)
21362132
if err != nil {
21372133
t.Fatal(err)
21382134
}
2139-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
2135+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
21402136
}
21412137

21422138
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0

‎content/graph.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func Successors(ctx context.Context, fetcher Fetcher, node ocispec.Descriptor) (
7474
return nil, err
7575
}
7676
return index.Manifests, nil
77-
case artifactspec.MediaTypeArtifactManifest:
77+
case artifactspec.MediaTypeArtifactManifest: // TODO: deprecate
7878
content, err := FetchAll(ctx, fetcher, node)
7979
if err != nil {
8080
return nil, err
@@ -92,6 +92,21 @@ func Successors(ctx context.Context, fetcher Fetcher, node ocispec.Descriptor) (
9292
nodes = append(nodes, descriptor.ArtifactToOCI(blob))
9393
}
9494
return nodes, nil
95+
case ocispec.MediaTypeArtifactManifest:
96+
content, err := FetchAll(ctx, fetcher, node)
97+
if err != nil {
98+
return nil, err
99+
}
100+
101+
var manifest ocispec.Artifact
102+
if err := json.Unmarshal(content, &manifest); err != nil {
103+
return nil, err
104+
}
105+
var nodes []ocispec.Descriptor
106+
if manifest.Subject != nil {
107+
nodes = append(nodes, *manifest.Subject)
108+
}
109+
return append(nodes, manifest.Blobs...), nil
95110
}
96111
return nil, nil
97112
}

‎content/memory/memory_test.go

+4-9
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,11 @@ import (
2929

3030
"github.com/opencontainers/go-digest"
3131
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
32-
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
3332
"golang.org/x/sync/errgroup"
3433
"oras.land/oras-go/v2"
3534
"oras.land/oras-go/v2/content"
3635
"oras.land/oras-go/v2/errdef"
3736
"oras.land/oras-go/v2/internal/cas"
38-
"oras.land/oras-go/v2/internal/descriptor"
3937
"oras.land/oras-go/v2/internal/resolver"
4038
)
4139

@@ -332,17 +330,14 @@ func TestStorePredecessors(t *testing.T) {
332330
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
333331
}
334332
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
335-
var manifest artifactspec.Manifest
336-
artifactSubject := descriptor.OCIToArtifact(subject)
337-
manifest.Subject = &artifactSubject
338-
for _, blob := range blobs {
339-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
340-
}
333+
var manifest ocispec.Artifact
334+
manifest.Subject = &subject
335+
manifest.Blobs = append(manifest.Blobs, blobs...)
341336
manifestJSON, err := json.Marshal(manifest)
342337
if err != nil {
343338
t.Fatal(err)
344339
}
345-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
340+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
346341
}
347342

348343
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0

‎content/oci/oci_test.go

+8-16
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,12 @@ import (
3333

3434
"github.com/opencontainers/go-digest"
3535
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
36-
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
3736
"golang.org/x/sync/errgroup"
3837
"oras.land/oras-go/v2"
3938
"oras.land/oras-go/v2/content"
4039
"oras.land/oras-go/v2/content/memory"
4140
"oras.land/oras-go/v2/errdef"
4241
"oras.land/oras-go/v2/internal/cas"
43-
"oras.land/oras-go/v2/internal/descriptor"
4442
)
4543

4644
// storageTracker tracks storage API counts.
@@ -671,17 +669,14 @@ func TestStore_Predecessors(t *testing.T) {
671669
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
672670
}
673671
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
674-
var manifest artifactspec.Manifest
675-
artifactSubject := descriptor.OCIToArtifact(subject)
676-
manifest.Subject = &artifactSubject
677-
for _, blob := range blobs {
678-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
679-
}
672+
var manifest ocispec.Artifact
673+
manifest.Subject = &subject
674+
manifest.Blobs = append(manifest.Blobs, blobs...)
680675
manifestJSON, err := json.Marshal(manifest)
681676
if err != nil {
682677
t.Fatal(err)
683678
}
684-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
679+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
685680
}
686681

687682
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0
@@ -786,17 +781,14 @@ func TestStore_ExistingStore(t *testing.T) {
786781
}
787782

788783
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
789-
var manifest artifactspec.Manifest
790-
artifactSubject := descriptor.OCIToArtifact(subject)
791-
manifest.Subject = &artifactSubject
792-
for _, blob := range blobs {
793-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
794-
}
784+
var manifest ocispec.Artifact
785+
manifest.Subject = &subject
786+
manifest.Blobs = append(manifest.Blobs, blobs...)
795787
manifestJSON, err := json.Marshal(manifest)
796788
if err != nil {
797789
t.Fatal(err)
798790
}
799-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
791+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
800792
}
801793

802794
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0

‎example_test.go

+11-16
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
"github.com/opencontainers/go-digest"
3232
specs "github.com/opencontainers/image-spec/specs-go"
3333
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
34-
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
3534
"oras.land/oras-go/v2"
3635
"oras.land/oras-go/v2/content/memory"
3736
"oras.land/oras-go/v2/content/oci"
@@ -41,23 +40,19 @@ import (
4140
var exampleMemoryStore oras.Target
4241
var remoteHost string
4342
var (
44-
exampleManifest, _ = json.Marshal(artifactspec.Manifest{
45-
MediaType: artifactspec.MediaTypeArtifactManifest,
43+
exampleManifest, _ = json.Marshal(ocispec.Artifact{
44+
MediaType: ocispec.MediaTypeArtifactManifest,
4645
ArtifactType: "example/content"})
4746
exampleManifestDescriptor = ocispec.Descriptor{
48-
MediaType: artifactspec.MediaTypeArtifactManifest,
47+
MediaType: ocispec.MediaTypeArtifactManifest,
4948
Digest: digest.Digest(digest.FromBytes(exampleManifest)),
5049
Size: int64(len(exampleManifest))}
51-
exampleManifestDescriptorArtifactspec = artifactspec.Descriptor{
52-
MediaType: exampleManifestDescriptor.MediaType,
53-
Digest: exampleManifestDescriptor.Digest,
54-
Size: exampleManifestDescriptor.Size}
55-
exampleSignatureManifest, _ = json.Marshal(artifactspec.Manifest{
56-
MediaType: artifactspec.MediaTypeArtifactManifest,
50+
exampleSignatureManifest, _ = json.Marshal(ocispec.Artifact{
51+
MediaType: ocispec.MediaTypeArtifactManifest,
5752
ArtifactType: "example/signature",
58-
Subject: &exampleManifestDescriptorArtifactspec})
53+
Subject: &exampleManifestDescriptor})
5954
exampleSignatureManifestDescriptor = ocispec.Descriptor{
60-
MediaType: artifactspec.MediaTypeArtifactManifest,
55+
MediaType: ocispec.MediaTypeArtifactManifest,
6156
Digest: digest.FromBytes(exampleSignatureManifest),
6257
Size: int64(len(exampleSignatureManifest))}
6358
)
@@ -122,15 +117,15 @@ func TestMain(m *testing.M) {
122117
case strings.Contains(p, "/blobs/uploads/"+exampleUploadUUid) && m == "GET":
123118
w.WriteHeader(http.StatusCreated)
124119
case strings.Contains(p, "/manifests/"+string(exampleSignatureManifestDescriptor.Digest)):
125-
w.Header().Set("Content-Type", artifactspec.MediaTypeArtifactManifest)
120+
w.Header().Set("Content-Type", ocispec.MediaTypeArtifactManifest)
126121
w.Header().Set("Docker-Content-Digest", string(exampleSignatureManifestDescriptor.Digest))
127122
w.Header().Set("Content-Length", strconv.Itoa(len(exampleSignatureManifest)))
128123
w.Write(exampleSignatureManifest)
129124
case strings.Contains(p, "/manifests/latest") && m == "PUT":
130125
w.WriteHeader(http.StatusCreated)
131126
case strings.Contains(p, "/manifests/"+string(exampleManifestDescriptor.Digest)),
132127
strings.Contains(p, "/manifests/latest") && m == "HEAD":
133-
w.Header().Set("Content-Type", artifactspec.MediaTypeArtifactManifest)
128+
w.Header().Set("Content-Type", ocispec.MediaTypeArtifactManifest)
134129
w.Header().Set("Docker-Content-Digest", string(exampleManifestDescriptor.Digest))
135130
w.Header().Set("Content-Length", strconv.Itoa(len(exampleManifest)))
136131
if m == "GET" {
@@ -317,7 +312,7 @@ func Example_copyArtifactManifestRemoteToLocal() {
317312
dst := memory.New()
318313
ctx := context.Background()
319314

320-
exampleDigest := "sha256:f9308ac4616a808210c12d049b4eb684754a5acf2c3c8d353a9fa2b3c47c274a"
315+
exampleDigest := "sha256:70c29a81e235dda5c2cebb8ec06eafd3cca346cbd91f15ac74cefd98681c5b3d"
321316
descriptor, err := src.Resolve(ctx, exampleDigest)
322317
if err != nil {
323318
panic(err)
@@ -358,5 +353,5 @@ func Example_extendedCopyArtifactAndReferrersRemoteToLocal() {
358353

359354
fmt.Println(desc.Digest)
360355
// Output:
361-
// sha256:1f3e679d4fc05dca20a699ae5af5fb2b7d481d5694aff929165d1c8b0f4c8598
356+
// sha256:f396bc4d300934a39ca28ab0d5ac8a3573336d7d63c654d783a68cd1e2057662
362357
}

‎extendedcopy_test.go

+17-29
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,14 @@ func TestExtendedCopy_FullCopy(t *testing.T) {
6868
appendBlob(ocispec.MediaTypeImageManifest, manifestJSON)
6969
}
7070
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
71-
var manifest artifactspec.Manifest
72-
artifactSubject := descriptor.OCIToArtifact(subject)
73-
manifest.Subject = &artifactSubject
74-
for _, blob := range blobs {
75-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
76-
}
71+
var manifest ocispec.Artifact
72+
manifest.Subject = &subject
73+
manifest.Blobs = append(manifest.Blobs, blobs...)
7774
manifestJSON, err := json.Marshal(manifest)
7875
if err != nil {
7976
t.Fatal(err)
8077
}
81-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
78+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
8279
}
8380

8481
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0
@@ -169,17 +166,14 @@ func TestExtendedCopyGraph_FullCopy(t *testing.T) {
169166
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
170167
}
171168
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
172-
var manifest artifactspec.Manifest
173-
artifactSubject := descriptor.OCIToArtifact(subject)
174-
manifest.Subject = &artifactSubject
175-
for _, blob := range blobs {
176-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
177-
}
169+
var manifest ocispec.Artifact
170+
manifest.Subject = &subject
171+
manifest.Blobs = append(manifest.Blobs, blobs...)
178172
manifestJSON, err := json.Marshal(manifest)
179173
if err != nil {
180174
t.Fatal(err)
181175
}
182-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
176+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
183177
}
184178

185179
appendBlob(ocispec.MediaTypeImageConfig, []byte("config_1")) // Blob 0
@@ -377,17 +371,14 @@ func TestExtendedCopyGraph_WithDepthOption(t *testing.T) {
377371
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
378372
}
379373
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
380-
var manifest artifactspec.Manifest
381-
artifactSubject := descriptor.OCIToArtifact(subject)
382-
manifest.Subject = &artifactSubject
383-
for _, blob := range blobs {
384-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
385-
}
374+
var manifest ocispec.Artifact
375+
manifest.Subject = &subject
376+
manifest.Blobs = append(manifest.Blobs, blobs...)
386377
manifestJSON, err := json.Marshal(manifest)
387378
if err != nil {
388379
t.Fatal(err)
389380
}
390-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
381+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
391382
}
392383

393384
appendBlob(ocispec.MediaTypeImageConfig, []byte("config_1")) // Blob 0
@@ -512,17 +503,14 @@ func TestExtendedCopyGraph_WithFindPredecessorsOption(t *testing.T) {
512503
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
513504
}
514505
generateArtifactManifest := func(subject ocispec.Descriptor, blobs ...ocispec.Descriptor) {
515-
var manifest artifactspec.Manifest
516-
artifactSubject := descriptor.OCIToArtifact(subject)
517-
manifest.Subject = &artifactSubject
518-
for _, blob := range blobs {
519-
manifest.Blobs = append(manifest.Blobs, descriptor.OCIToArtifact(blob))
520-
}
506+
var manifest ocispec.Artifact
507+
manifest.Subject = &subject
508+
manifest.Blobs = append(manifest.Blobs, blobs...)
521509
manifestJSON, err := json.Marshal(manifest)
522510
if err != nil {
523511
t.Fatal(err)
524512
}
525-
appendBlob(artifactspec.MediaTypeArtifactManifest, manifestJSON)
513+
appendBlob(ocispec.MediaTypeArtifactManifest, manifestJSON)
526514
}
527515

528516
appendBlob(ocispec.MediaTypeImageConfig, []byte("config_1")) // Blob 0
@@ -577,7 +565,7 @@ func TestExtendedCopyGraph_WithFindPredecessorsOption(t *testing.T) {
577565
for _, p := range predecessors {
578566
// filter media type
579567
switch p.MediaType {
580-
case artifactspec.MediaTypeArtifactManifest:
568+
case ocispec.MediaTypeArtifactManifest:
581569
filtered = append(filtered, p)
582570
}
583571
}

0 commit comments

Comments
 (0)