layerInfoForCopy returns a possibly-updated version of info for LayerInfosForCopy
(info types.BlobInfo)
| 119 | |
| 120 | // layerInfoForCopy returns a possibly-updated version of info for LayerInfosForCopy |
| 121 | func (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 | |
| 177 | func (s *blobCacheSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) { |
| 178 | signatures, err := s.source.GetSignaturesWithFormat(ctx, instanceDigest) |
no test coverage detected