...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package remote
16
17 import (
18 "bytes"
19 "context"
20 "encoding/json"
21
22 "github.com/google/go-containerregistry/pkg/name"
23 v1 "github.com/google/go-containerregistry/pkg/v1"
24 "github.com/google/go-containerregistry/pkg/v1/partial"
25 "github.com/google/go-containerregistry/pkg/v1/types"
26 )
27
28 type schema1 struct {
29 ref name.Reference
30 ctx context.Context
31 fetcher fetcher
32 manifest []byte
33 mediaType types.MediaType
34 descriptor *v1.Descriptor
35 }
36
37 func (s *schema1) Layers() ([]v1.Layer, error) {
38 m := schema1Manifest{}
39 if err := json.NewDecoder(bytes.NewReader(s.manifest)).Decode(&m); err != nil {
40 return nil, err
41 }
42
43 layers := []v1.Layer{}
44 for i := len(m.FSLayers) - 1; i >= 0; i-- {
45 fsl := m.FSLayers[i]
46
47 h, err := v1.NewHash(fsl.BlobSum)
48 if err != nil {
49 return nil, err
50 }
51 l, err := s.LayerByDigest(h)
52 if err != nil {
53 return nil, err
54 }
55 layers = append(layers, l)
56 }
57
58 return layers, nil
59 }
60
61 func (s *schema1) MediaType() (types.MediaType, error) {
62 return s.mediaType, nil
63 }
64
65 func (s *schema1) Size() (int64, error) {
66 return s.descriptor.Size, nil
67 }
68
69 func (s *schema1) ConfigName() (v1.Hash, error) {
70 return partial.ConfigName(s)
71 }
72
73 func (s *schema1) ConfigFile() (*v1.ConfigFile, error) {
74 return nil, newErrSchema1(s.mediaType)
75 }
76
77 func (s *schema1) RawConfigFile() ([]byte, error) {
78 return []byte("{}"), nil
79 }
80
81 func (s *schema1) Digest() (v1.Hash, error) {
82 return s.descriptor.Digest, nil
83 }
84
85 func (s *schema1) Manifest() (*v1.Manifest, error) {
86 return nil, newErrSchema1(s.mediaType)
87 }
88
89 func (s *schema1) RawManifest() ([]byte, error) {
90 return s.manifest, nil
91 }
92
93 func (s *schema1) LayerByDigest(h v1.Hash) (v1.Layer, error) {
94 l, err := partial.CompressedToLayer(&remoteLayer{
95 fetcher: s.fetcher,
96 ctx: s.ctx,
97 digest: h,
98 })
99 if err != nil {
100 return nil, err
101 }
102 return &MountableLayer{
103 Layer: l,
104 Reference: s.ref.Context().Digest(h.String()),
105 }, nil
106 }
107
108 func (s *schema1) LayerByDiffID(v1.Hash) (v1.Layer, error) {
109 return nil, newErrSchema1(s.mediaType)
110 }
111
112 type fslayer struct {
113 BlobSum string `json:"blobSum"`
114 }
115
116 type schema1Manifest struct {
117 FSLayers []fslayer `json:"fsLayers"`
118 }
119
View as plain text