...

Source file src/edge-infra.dev/pkg/f8n/warehouse/oci/cache/index.go

Documentation: edge-infra.dev/pkg/f8n/warehouse/oci/cache

     1  package cache
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	v1 "github.com/google/go-containerregistry/pkg/v1"
     8  )
     9  
    10  // cachingIndex wraps access to v1.ImageIndex with a [Cache]. Implements v1.ImageIndex
    11  type cachingIndex struct {
    12  	wrappedIndex
    13  	cache *LazyCache
    14  }
    15  
    16  // wrappedIndex lets us call index.wrappedIndex to delegate to the embedded
    17  // field's method without colliding with the interface func ImageIndex
    18  type wrappedIndex v1.ImageIndex
    19  
    20  // ImageIndex returns a new v1.ImageIndex backed by a cachingIndex. OCI interface methods will
    21  // read from the cache c, falling back to wrapped inner implementation if missing. Typically, the
    22  // inner Index will be a github.com/google/go-containerregistry/pkg/v1/remote/remoteIndex
    23  func ImageIndex(ii v1.ImageIndex, c *LazyCache) v1.ImageIndex {
    24  	return &cachingIndex{
    25  		wrappedIndex: ii,
    26  		cache:        c,
    27  	}
    28  }
    29  
    30  // Image returns a v1.Image that this ImageIndex references.
    31  func (c *cachingIndex) Image(h v1.Hash) (v1.Image, error) {
    32  	if cached, err := c.cache.getImage(h); err == nil {
    33  		return cached, nil
    34  	} else if !errors.Is(err, ErrNotFound) {
    35  		return nil, err
    36  	}
    37  	img, err := c.wrappedIndex.Image(h)
    38  	if err != nil {
    39  		return nil, fmt.Errorf("failed to get uncached Image: %v", err)
    40  	}
    41  	return c.cache.putImage(img)
    42  }
    43  
    44  // ImageIndex returns a v1.ImageIndex that this ImageIndex references.
    45  func (c *cachingIndex) ImageIndex(h v1.Hash) (v1.ImageIndex, error) {
    46  	if cached, err := c.cache.getIndex(h); err == nil {
    47  		return cached, nil
    48  	} else if !errors.Is(err, ErrNotFound) {
    49  		return nil, err
    50  	}
    51  	ii, err := c.wrappedIndex.ImageIndex(h)
    52  	if err != nil {
    53  		return nil, fmt.Errorf("failed to get uncached ImageIndex: %v", err)
    54  	}
    55  
    56  	return c.cache.putIndex(ii)
    57  }
    58  

View as plain text