portainer/pkg/liboras/manifest.go

68 lines
1.8 KiB
Go

package liboras
import (
"bytes"
"context"
"fmt"
"github.com/opencontainers/go-digest"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
"oras.land/oras-go/v2/registry/remote"
)
// DeleteManifestByDigest deletes a manifest by its digest
func DeleteManifestByDigest(registryClient *remote.Registry, repository, digestStr string) error {
ctx := context.Background()
// Get repository handle
repo, err := registryClient.Repository(ctx, repository)
if err != nil {
return fmt.Errorf("failed to get repository handle: %w", err)
}
// Delete the manifest by digest
manifestDigest, err := digest.Parse(digestStr)
if err != nil {
return fmt.Errorf("failed to parse digest: %w", err)
}
err = repo.Manifests().Delete(ctx, ocispec.Descriptor{
Digest: manifestDigest,
})
if err != nil {
return fmt.Errorf("failed to delete manifest: %w", err)
}
return nil
}
// AddTagToManifest creates a new tag pointing to an existing manifest
func AddTagToManifest(registryClient *remote.Registry, repository, tagName, targetDigest string, manifestBytes []byte) error {
ctx := context.Background()
// Get repository handle
repo, err := registryClient.Repository(ctx, repository)
if err != nil {
return fmt.Errorf("failed to get repository handle: %w", err)
}
// Parse the target digest
parsedDigest, err := digest.Parse(targetDigest)
if err != nil {
return fmt.Errorf("failed to parse digest: %w", err)
}
// Create descriptor for the manifest
manifestDescriptor := ocispec.Descriptor{
MediaType: "application/vnd.oci.image.manifest.v1+json",
Size: int64(len(manifestBytes)),
Digest: parsedDigest,
}
err = repo.Manifests().PushReference(ctx, manifestDescriptor, bytes.NewReader(manifestBytes), tagName)
if err != nil {
return fmt.Errorf("failed to tag manifest: %w", err)
}
return nil
}