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 }