Files
Steven Kang 2406d67bfc feat(fcm): initial release (#1153)
Co-authored-by: Ali <83188384+testA113@users.noreply.github.com>
Co-authored-by: James Player <james.player@portainer.io>
Co-authored-by: Cara Ryan <cara.ryan@portainer.io>
Co-authored-by: testA113 <aliharriss1995@gmail.com>
Co-authored-by: Viktor Pettersson <viktor.pettersson@portainer.io>
Co-authored-by: Viktor Pettersson <viktor.grasljunga@gmail.com>
Co-authored-by: Malcolm Lockyer <segfault88@users.noreply.github.com>
Co-authored-by: RHCowan <50324595+RHCowan@users.noreply.github.com>
Co-authored-by: Robbie Cowan <robert.cowan@portainer.io>
2025-12-09 08:05:38 +09:00

69 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
}