MCPcopy Create free account
hub / github.com/containers/image / layerInfoForCopy

Method layerInfoForCopy

pkg/blobcache/src.go:121–175  ·  view source on GitHub ↗

layerInfoForCopy returns a possibly-updated version of info for LayerInfosForCopy

(info types.BlobInfo)

Source from the content-addressed store, hash-verified

119
120// layerInfoForCopy returns a possibly-updated version of info for LayerInfosForCopy
121func (s *blobCacheSource) layerInfoForCopy(info types.BlobInfo) (types.BlobInfo, error) {
122 var replaceDigestBytes []byte
123 blobFile, err := s.reference.blobPath(info.Digest, false)
124 if err != nil {
125 return types.BlobInfo{}, err
126 }
127 switch s.reference.compress {
128 case types.Compress:
129 replaceDigestBytes, err = os.ReadFile(blobFile + compressedNote)
130 case types.Decompress:
131 replaceDigestBytes, err = os.ReadFile(blobFile + decompressedNote)
132 }
133 if err != nil {
134 return info, nil
135 }
136 replaceDigest, err := digest.Parse(string(replaceDigestBytes))
137 if err != nil {
138 return info, nil
139 }
140 alternate, err := s.reference.blobPath(replaceDigest, false)
141 if err != nil {
142 return types.BlobInfo{}, err
143 }
144 fileInfo, err := os.Stat(alternate)
145 if err != nil {
146 return info, nil
147 }
148
149 switch info.MediaType {
150 case v1.MediaTypeImageLayer, v1.MediaTypeImageLayerGzip:
151 switch s.reference.compress {
152 case types.Compress:
153 info.MediaType = v1.MediaTypeImageLayerGzip
154 info.CompressionAlgorithm = &compression.Gzip
155 case types.Decompress: // FIXME: This should remove zstd:chunked annotations (but those annotations being left with incorrect values should not break pulls)
156 info.MediaType = v1.MediaTypeImageLayer
157 info.CompressionAlgorithm = nil
158 }
159 case manifest.DockerV2SchemaLayerMediaTypeUncompressed, manifest.DockerV2Schema2LayerMediaType:
160 switch s.reference.compress {
161 case types.Compress:
162 info.MediaType = manifest.DockerV2Schema2LayerMediaType
163 info.CompressionAlgorithm = &compression.Gzip
164 case types.Decompress:
165 // nope, not going to suggest anything, it's not allowed by the spec
166 return info, nil
167 }
168 }
169 logrus.Debugf("suggesting cached blob with digest %q, type %q, and compression %v in place of blob with digest %q", replaceDigest.String(), info.MediaType, s.reference.compress, info.Digest.String())
170 info.CompressionOperation = s.reference.compress
171 info.Digest = replaceDigest
172 info.Size = fileInfo.Size()
173 logrus.Debugf("info = %#v", info)
174 return info, nil
175}
176
177func (s *blobCacheSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) {
178 signatures, err := s.source.GetSignaturesWithFormat(ctx, instanceDigest)

Callers 1

LayerInfosForCopyMethod · 0.95

Calls 3

StringMethod · 0.65
SizeMethod · 0.65
blobPathMethod · 0.45

Tested by

no test coverage detected