zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/extensions/sync/oci_layout.go (about)

     1  //go:build sync
     2  // +build sync
     3  
     4  package sync
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path"
    10  
    11  	"github.com/containers/image/v5/oci/layout"
    12  	"github.com/containers/image/v5/types"
    13  	"github.com/gofrs/uuid"
    14  
    15  	"zotregistry.dev/zot/pkg/extensions/sync/constants"
    16  	"zotregistry.dev/zot/pkg/storage"
    17  	storageConstants "zotregistry.dev/zot/pkg/storage/constants"
    18  	"zotregistry.dev/zot/pkg/test/inject"
    19  )
    20  
    21  type OciLayoutStorageImpl struct {
    22  	storeController storage.StoreController
    23  	context         *types.SystemContext
    24  }
    25  
    26  func NewOciLayoutStorage(storeController storage.StoreController) OciLayoutStorage {
    27  	context := &types.SystemContext{}
    28  	// preserve compression
    29  	context.OCIAcceptUncompressedLayers = true
    30  
    31  	return OciLayoutStorageImpl{
    32  		storeController: storeController,
    33  		context:         context,
    34  	}
    35  }
    36  
    37  func (oci OciLayoutStorageImpl) GetContext() *types.SystemContext {
    38  	return oci.context
    39  }
    40  
    41  func (oci OciLayoutStorageImpl) GetImageReference(repo string, reference string) (types.ImageReference, error) {
    42  	localImageStore := oci.storeController.GetImageStore(repo)
    43  	tempSyncPath := path.Join(localImageStore.RootDir(), repo, constants.SyncBlobUploadDir)
    44  
    45  	// create session folder
    46  	uuid, err := uuid.NewV4()
    47  	// hard to reach test case, injected error, see pkg/test/dev.go
    48  	if err := inject.Error(err); err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	sessionRepoPath := path.Join(tempSyncPath, uuid.String())
    53  
    54  	localRepo := path.Join(sessionRepoPath, repo)
    55  	if err := os.MkdirAll(localRepo, storageConstants.DefaultDirPerms); err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	_, refIsDigest := parseReference(reference)
    60  
    61  	if !refIsDigest {
    62  		localRepo = fmt.Sprintf("%s:%s", localRepo, reference)
    63  	}
    64  
    65  	localImageRef, err := layout.ParseReference(localRepo)
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	return localImageRef, nil
    71  }