|
|
|
|
@ -46,11 +46,9 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
@@ -46,11 +46,9 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
|
|
|
|
|
if err := json.NewDecoder(buf).Decode(&index); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if index.SchemaVersion != 2 { |
|
|
|
|
return "", errUnsupported.WithMessage("Schema version is not supported") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if _, err := buf.Seek(0, io.SeekStart); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
@ -77,24 +75,41 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
@@ -77,24 +75,41 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
|
|
|
|
|
return "", errManifestInvalid |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf *packages_module.HashedBuffer) (string, error) { |
|
|
|
|
manifestDigest := "" |
|
|
|
|
type processManifestTxRet struct { |
|
|
|
|
pv *packages_model.PackageVersion |
|
|
|
|
pb *packages_model.PackageBlob |
|
|
|
|
created bool |
|
|
|
|
digest string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err := func() error { |
|
|
|
|
manifest, configDescriptor, metadata, err := container_service.ParseManifestMetadata(ctx, buf, mci.Owner.ID, mci.Image) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if _, err = buf.Seek(0, io.SeekStart); err != nil { |
|
|
|
|
return err |
|
|
|
|
func handleCreateManifestResult(ctx context.Context, err error, mci *manifestCreationInfo, contentStore *packages_module.ContentStore, txRet *processManifestTxRet) (string, error) { |
|
|
|
|
if err != nil && txRet.created && txRet.pb != nil { |
|
|
|
|
if err := contentStore.Delete(packages_module.BlobHash256Key(txRet.pb.HashSHA256)); err != nil { |
|
|
|
|
log.Error("Error deleting package blob from content store: %v", err) |
|
|
|
|
} |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
pd, err := packages_model.GetPackageDescriptor(ctx, txRet.pv) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error("Error getting package descriptor: %v", err) // ignore this error
|
|
|
|
|
} else { |
|
|
|
|
notify_service.PackageCreate(ctx, mci.Creator, pd) |
|
|
|
|
} |
|
|
|
|
return txRet.digest, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx, committer, err := db.TxContext(ctx) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
defer committer.Close() |
|
|
|
|
func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf *packages_module.HashedBuffer) (manifestDigest string, errRet error) { |
|
|
|
|
manifest, configDescriptor, metadata, err := container_service.ParseManifestMetadata(ctx, buf, mci.Owner.ID, mci.Image) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
if _, err = buf.Seek(0, io.SeekStart); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
contentStore := packages_module.NewContentStore() |
|
|
|
|
var txRet processManifestTxRet |
|
|
|
|
err = db.WithTx(ctx, func(ctx context.Context) (err error) { |
|
|
|
|
blobReferences := make([]*blobReference, 0, 1+len(manifest.Layers)) |
|
|
|
|
blobReferences = append(blobReferences, &blobReference{ |
|
|
|
|
Digest: manifest.Config.Digest, |
|
|
|
|
@ -127,7 +142,7 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
@@ -127,7 +142,7 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uploadVersion, err := packages_model.GetInternalVersionByNameAndVersion(ctx, mci.Owner.ID, packages_model.TypeContainer, mci.Image, container_module.UploadVersion) |
|
|
|
|
if err != nil && err != packages_model.ErrPackageNotExist { |
|
|
|
|
if err != nil && !errors.Is(err, packages_model.ErrPackageNotExist) { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -136,61 +151,26 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
@@ -136,61 +151,26 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
|
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
txRet.pv = pv |
|
|
|
|
txRet.pb, txRet.created, txRet.digest, err = createManifestBlob(ctx, contentStore, mci, pv, buf) |
|
|
|
|
return err |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
pb, created, digest, err := createManifestBlob(ctx, mci, pv, buf) |
|
|
|
|
removeBlob := false |
|
|
|
|
defer func() { |
|
|
|
|
if removeBlob { |
|
|
|
|
contentStore := packages_module.NewContentStore() |
|
|
|
|
if err := contentStore.Delete(packages_module.BlobHash256Key(pb.HashSHA256)); err != nil { |
|
|
|
|
log.Error("Error deleting package blob from content store: %v", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
if err != nil { |
|
|
|
|
removeBlob = created |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := committer.Commit(); err != nil { |
|
|
|
|
removeBlob = created |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := notifyPackageCreate(ctx, mci.Creator, pv); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
manifestDigest = digest |
|
|
|
|
return handleCreateManifestResult(ctx, err, mci, contentStore, &txRet) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
}() |
|
|
|
|
if err != nil { |
|
|
|
|
func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *packages_module.HashedBuffer) (manifestDigest string, errRet error) { |
|
|
|
|
var index oci.Index |
|
|
|
|
if err := json.NewDecoder(buf).Decode(&index); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
if _, err := buf.Seek(0, io.SeekStart); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return manifestDigest, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *packages_module.HashedBuffer) (string, error) { |
|
|
|
|
manifestDigest := "" |
|
|
|
|
|
|
|
|
|
err := func() error { |
|
|
|
|
var index oci.Index |
|
|
|
|
if err := json.NewDecoder(buf).Decode(&index); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if _, err := buf.Seek(0, io.SeekStart); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx, committer, err := db.TxContext(ctx) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
defer committer.Close() |
|
|
|
|
|
|
|
|
|
contentStore := packages_module.NewContentStore() |
|
|
|
|
var txRet processManifestTxRet |
|
|
|
|
err := db.WithTx(ctx, func(ctx context.Context) (err error) { |
|
|
|
|
metadata := &container_module.Metadata{ |
|
|
|
|
Type: container_module.TypeOCI, |
|
|
|
|
Manifests: make([]*container_module.Manifest, 0, len(index.Manifests)), |
|
|
|
|
@ -241,50 +221,12 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
@@ -241,50 +221,12 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
|
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pb, created, digest, err := createManifestBlob(ctx, mci, pv, buf) |
|
|
|
|
removeBlob := false |
|
|
|
|
defer func() { |
|
|
|
|
if removeBlob { |
|
|
|
|
contentStore := packages_module.NewContentStore() |
|
|
|
|
if err := contentStore.Delete(packages_module.BlobHash256Key(pb.HashSHA256)); err != nil { |
|
|
|
|
log.Error("Error deleting package blob from content store: %v", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
if err != nil { |
|
|
|
|
removeBlob = created |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := committer.Commit(); err != nil { |
|
|
|
|
removeBlob = created |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := notifyPackageCreate(ctx, mci.Creator, pv); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
manifestDigest = digest |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
}() |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return manifestDigest, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func notifyPackageCreate(ctx context.Context, doer *user_model.User, pv *packages_model.PackageVersion) error { |
|
|
|
|
pd, err := packages_model.GetPackageDescriptor(ctx, pv) |
|
|
|
|
if err != nil { |
|
|
|
|
txRet.pv = pv |
|
|
|
|
txRet.pb, txRet.created, txRet.digest, err = createManifestBlob(ctx, contentStore, mci, pv, buf) |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
notify_service.PackageCreate(ctx, doer, pd) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
return handleCreateManifestResult(ctx, err, mci, contentStore, &txRet) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func createPackageAndVersion(ctx context.Context, mci *manifestCreationInfo, metadata *container_module.Metadata) (*packages_model.PackageVersion, error) { |
|
|
|
|
@ -437,7 +379,7 @@ func createFileFromBlobReference(ctx context.Context, pv, uploadVersion *package
@@ -437,7 +379,7 @@ func createFileFromBlobReference(ctx context.Context, pv, uploadVersion *package
|
|
|
|
|
return pf, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *packages_model.PackageVersion, buf *packages_module.HashedBuffer) (*packages_model.PackageBlob, bool, string, error) { |
|
|
|
|
func createManifestBlob(ctx context.Context, contentStore *packages_module.ContentStore, mci *manifestCreationInfo, pv *packages_model.PackageVersion, buf *packages_module.HashedBuffer) (_ *packages_model.PackageBlob, created bool, manifestDigest string, _ error) { |
|
|
|
|
pb, exists, err := packages_model.GetOrInsertBlob(ctx, packages_service.NewPackageBlob(buf)) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error("Error inserting package blob: %v", err) |
|
|
|
|
@ -446,21 +388,20 @@ func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *pack
@@ -446,21 +388,20 @@ func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *pack
|
|
|
|
|
// FIXME: Workaround to be removed in v1.20
|
|
|
|
|
// https://github.com/go-gitea/gitea/issues/19586
|
|
|
|
|
if exists { |
|
|
|
|
err = packages_module.NewContentStore().Has(packages_module.BlobHash256Key(pb.HashSHA256)) |
|
|
|
|
err = contentStore.Has(packages_module.BlobHash256Key(pb.HashSHA256)) |
|
|
|
|
if err != nil && (errors.Is(err, util.ErrNotExist) || errors.Is(err, os.ErrNotExist)) { |
|
|
|
|
log.Debug("Package registry inconsistent: blob %s does not exist on file system", pb.HashSHA256) |
|
|
|
|
exists = false |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if !exists { |
|
|
|
|
contentStore := packages_module.NewContentStore() |
|
|
|
|
if err := contentStore.Save(packages_module.BlobHash256Key(pb.HashSHA256), buf, buf.Size()); err != nil { |
|
|
|
|
log.Error("Error saving package blob in content store: %v", err) |
|
|
|
|
return nil, false, "", err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
manifestDigest := digestFromHashSummer(buf) |
|
|
|
|
manifestDigest = digestFromHashSummer(buf) |
|
|
|
|
pf, err := createFileFromBlobReference(ctx, pv, nil, &blobReference{ |
|
|
|
|
Digest: digest.Digest(manifestDigest), |
|
|
|
|
MediaType: mci.MediaType, |
|
|
|
|
|