mirror of
https://github.com/project-zot/zot.git
synced 2024-12-23 22:27:35 -05:00
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
|
//go:build sync
|
||
|
// +build sync
|
||
|
|
||
|
package sync
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"path"
|
||
|
|
||
|
"github.com/containers/image/v5/oci/layout"
|
||
|
"github.com/containers/image/v5/types"
|
||
|
"github.com/gofrs/uuid"
|
||
|
|
||
|
"zotregistry.io/zot/pkg/storage"
|
||
|
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||
|
"zotregistry.io/zot/pkg/test/inject"
|
||
|
)
|
||
|
|
||
|
type OciLayoutStorageImpl struct {
|
||
|
storeController storage.StoreController
|
||
|
context *types.SystemContext
|
||
|
}
|
||
|
|
||
|
func NewOciLayoutStorage(storeController storage.StoreController) OciLayoutStorage {
|
||
|
context := &types.SystemContext{}
|
||
|
// preserve compression
|
||
|
context.OCIAcceptUncompressedLayers = true
|
||
|
|
||
|
return OciLayoutStorageImpl{
|
||
|
storeController: storeController,
|
||
|
context: context,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (oci OciLayoutStorageImpl) GetContext() *types.SystemContext {
|
||
|
return oci.context
|
||
|
}
|
||
|
|
||
|
func (oci OciLayoutStorageImpl) GetImageReference(repo string, reference string) (types.ImageReference, error) {
|
||
|
localImageStore := oci.storeController.GetImageStore(repo)
|
||
|
tempSyncPath := path.Join(localImageStore.RootDir(), repo, SyncBlobUploadDir)
|
||
|
|
||
|
// create session folder
|
||
|
uuid, err := uuid.NewV4()
|
||
|
// hard to reach test case, injected error, see pkg/test/dev.go
|
||
|
if err := inject.Error(err); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
sessionRepoPath := path.Join(tempSyncPath, uuid.String())
|
||
|
|
||
|
localRepo := path.Join(sessionRepoPath, repo)
|
||
|
if err := os.MkdirAll(localRepo, storageConstants.DefaultDirPerms); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
_, refIsDigest := parseReference(reference)
|
||
|
|
||
|
if !refIsDigest {
|
||
|
localRepo = fmt.Sprintf("%s:%s", localRepo, reference)
|
||
|
}
|
||
|
|
||
|
localImageRef, err := layout.ParseReference(localRepo)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return localImageRef, nil
|
||
|
}
|