cuelabs.dev/go/oci/ociregistry@v0.0.0-20240906074133-82eb438dd565/ocimem/reader.go (about) 1 // Copyright 2023 CUE Labs AG 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package ocimem 16 17 import ( 18 "context" 19 "fmt" 20 21 "cuelabs.dev/go/oci/ociregistry" 22 ) 23 24 // This file implements the ociregistry.Reader methods. 25 26 func (r *Registry) GetBlob(ctx context.Context, repoName string, dig ociregistry.Digest) (ociregistry.BlobReader, error) { 27 r.mu.Lock() 28 defer r.mu.Unlock() 29 b, err := r.blobForDigest(repoName, dig) 30 if err != nil { 31 return nil, err 32 } 33 return NewBytesReader(b.data, b.descriptor()), nil 34 } 35 36 func (r *Registry) GetBlobRange(ctx context.Context, repoName string, dig ociregistry.Digest, o0, o1 int64) (ociregistry.BlobReader, error) { 37 r.mu.Lock() 38 defer r.mu.Unlock() 39 b, err := r.blobForDigest(repoName, dig) 40 if err != nil { 41 return nil, err 42 } 43 if o1 < 0 || o1 > int64(len(b.data)) { 44 o1 = int64(len(b.data)) 45 } 46 if o0 < 0 || o0 > o1 { 47 return nil, fmt.Errorf("invalid range [%d, %d]; have [%d, %d]", o0, o1, 0, len(b.data)) 48 } 49 return NewBytesReader(b.data[o0:o1], b.descriptor()), nil 50 } 51 52 func (r *Registry) GetManifest(ctx context.Context, repoName string, dig ociregistry.Digest) (ociregistry.BlobReader, error) { 53 r.mu.Lock() 54 defer r.mu.Unlock() 55 b, err := r.manifestForDigest(repoName, dig) 56 if err != nil { 57 return nil, err 58 } 59 return NewBytesReader(b.data, b.descriptor()), nil 60 } 61 62 func (r *Registry) GetTag(ctx context.Context, repoName string, tagName string) (ociregistry.BlobReader, error) { 63 desc, err := r.ResolveTag(ctx, repoName, tagName) 64 if err != nil { 65 return nil, err 66 } 67 return r.GetManifest(ctx, repoName, desc.Digest) 68 } 69 70 func (r *Registry) ResolveTag(ctx context.Context, repoName string, tagName string) (ociregistry.Descriptor, error) { 71 r.mu.Lock() 72 defer r.mu.Unlock() 73 repo, err := r.repo(repoName) 74 if err != nil { 75 return ociregistry.Descriptor{}, err 76 } 77 desc, ok := repo.tags[tagName] 78 if !ok { 79 return ociregistry.Descriptor{}, ociregistry.ErrManifestUnknown 80 } 81 return desc, nil 82 } 83 84 func (r *Registry) ResolveBlob(ctx context.Context, repoName string, digest ociregistry.Digest) (ociregistry.Descriptor, error) { 85 r.mu.Lock() 86 defer r.mu.Unlock() 87 b, err := r.blobForDigest(repoName, digest) 88 if err != nil { 89 return ociregistry.Descriptor{}, err 90 } 91 return b.descriptor(), nil 92 } 93 94 func (r *Registry) ResolveManifest(ctx context.Context, repoName string, digest ociregistry.Digest) (ociregistry.Descriptor, error) { 95 r.mu.Lock() 96 defer r.mu.Unlock() 97 b, err := r.manifestForDigest(repoName, digest) 98 if err != nil { 99 return ociregistry.Descriptor{}, err 100 } 101 return b.descriptor(), nil 102 }