create artifact store in the libpod runtime

Instead of duplicating the NewArtifactStore() call in many places and
having to make sure we always pass the same path to it define it as
function on the runtime. This allows any caller with access to the
libpod runtime to create the store easily.

This is suing a sync.OnceValues() function so the store is initialized
only once and only when actually needed.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger 2025-02-25 11:49:31 +01:00
parent 7c200a5f4c
commit b232ea3d18
No known key found for this signature in database
GPG Key ID: EB145DD938A3CAF2
2 changed files with 16 additions and 13 deletions

View File

@ -34,6 +34,7 @@ import (
"github.com/containers/podman/v5/libpod/shutdown" "github.com/containers/podman/v5/libpod/shutdown"
"github.com/containers/podman/v5/pkg/domain/entities" "github.com/containers/podman/v5/pkg/domain/entities"
"github.com/containers/podman/v5/pkg/domain/entities/reports" "github.com/containers/podman/v5/pkg/domain/entities/reports"
artStore "github.com/containers/podman/v5/pkg/libartifact/store"
"github.com/containers/podman/v5/pkg/rootless" "github.com/containers/podman/v5/pkg/rootless"
"github.com/containers/podman/v5/pkg/systemd" "github.com/containers/podman/v5/pkg/systemd"
"github.com/containers/podman/v5/pkg/util" "github.com/containers/podman/v5/pkg/util"
@ -83,6 +84,9 @@ type Runtime struct {
libimageEventsShutdown chan bool libimageEventsShutdown chan bool
lockManager lock.Manager lockManager lock.Manager
// ArtifactStore returns the artifact store created from the runtime.
ArtifactStore func() (*artStore.ArtifactStore, error)
// Worker // Worker
workerChannel chan func() workerChannel chan func()
workerGroup sync.WaitGroup workerGroup sync.WaitGroup
@ -533,6 +537,11 @@ func makeRuntime(ctx context.Context, runtime *Runtime) (retErr error) {
} }
runtime.config.Network.NetworkBackend = string(netBackend) runtime.config.Network.NetworkBackend = string(netBackend)
runtime.network = netInterface runtime.network = netInterface
// Using sync once value to only init the store exactly once and only when it will be actually be used.
runtime.ArtifactStore = sync.OnceValues(func() (*artStore.ArtifactStore, error) {
return artStore.NewArtifactStore(filepath.Join(runtime.storageConfig.GraphRoot, "artifacts"), runtime.SystemContext())
})
} }
// We now need to see if the system has restarted // We now need to see if the system has restarted

View File

@ -5,22 +5,16 @@ package abi
import ( import (
"context" "context"
"os" "os"
"path/filepath"
"time" "time"
"github.com/containers/common/libimage" "github.com/containers/common/libimage"
"github.com/containers/podman/v5/pkg/domain/entities" "github.com/containers/podman/v5/pkg/domain/entities"
"github.com/containers/podman/v5/pkg/libartifact/store"
"github.com/containers/podman/v5/pkg/libartifact/types" "github.com/containers/podman/v5/pkg/libartifact/types"
"github.com/opencontainers/go-digest" "github.com/opencontainers/go-digest"
) )
func getDefaultArtifactStore(ir *ImageEngine) string {
return filepath.Join(ir.Libpod.StorageConfig().GraphRoot, "artifacts")
}
func (ir *ImageEngine) ArtifactInspect(ctx context.Context, name string, _ entities.ArtifactInspectOptions) (*entities.ArtifactInspectReport, error) { func (ir *ImageEngine) ArtifactInspect(ctx context.Context, name string, _ entities.ArtifactInspectOptions) (*entities.ArtifactInspectReport, error) {
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -41,7 +35,7 @@ func (ir *ImageEngine) ArtifactInspect(ctx context.Context, name string, _ entit
func (ir *ImageEngine) ArtifactList(ctx context.Context, _ entities.ArtifactListOptions) ([]*entities.ArtifactListReport, error) { func (ir *ImageEngine) ArtifactList(ctx context.Context, _ entities.ArtifactListOptions) ([]*entities.ArtifactListReport, error) {
reports := make([]*entities.ArtifactListReport, 0) reports := make([]*entities.ArtifactListReport, 0)
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -80,7 +74,7 @@ func (ir *ImageEngine) ArtifactPull(ctx context.Context, name string, opts entit
if !opts.Quiet && pullOptions.Writer == nil { if !opts.Quiet && pullOptions.Writer == nil {
pullOptions.Writer = os.Stderr pullOptions.Writer = os.Stderr
} }
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -92,7 +86,7 @@ func (ir *ImageEngine) ArtifactRm(ctx context.Context, name string, opts entitie
namesOrDigests []string namesOrDigests []string
) )
artifactDigests := make([]*digest.Digest, 0, len(namesOrDigests)) artifactDigests := make([]*digest.Digest, 0, len(namesOrDigests))
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -133,7 +127,7 @@ func (ir *ImageEngine) ArtifactRm(ctx context.Context, name string, opts entitie
func (ir *ImageEngine) ArtifactPush(ctx context.Context, name string, opts entities.ArtifactPushOptions) (*entities.ArtifactPushReport, error) { func (ir *ImageEngine) ArtifactPush(ctx context.Context, name string, opts entities.ArtifactPushOptions) (*entities.ArtifactPushReport, error) {
var retryDelay *time.Duration var retryDelay *time.Duration
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -189,7 +183,7 @@ func (ir *ImageEngine) ArtifactPush(ctx context.Context, name string, opts entit
return &entities.ArtifactPushReport{}, err return &entities.ArtifactPushReport{}, err
} }
func (ir *ImageEngine) ArtifactAdd(ctx context.Context, name string, paths []string, opts *entities.ArtifactAddOptions) (*entities.ArtifactAddReport, error) { func (ir *ImageEngine) ArtifactAdd(ctx context.Context, name string, paths []string, opts *entities.ArtifactAddOptions) (*entities.ArtifactAddReport, error) {
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -210,7 +204,7 @@ func (ir *ImageEngine) ArtifactAdd(ctx context.Context, name string, paths []str
} }
func (ir *ImageEngine) ArtifactExtract(ctx context.Context, name string, target string, opts *entities.ArtifactExtractOptions) error { func (ir *ImageEngine) ArtifactExtract(ctx context.Context, name string, target string, opts *entities.ArtifactExtractOptions) error {
artStore, err := store.NewArtifactStore(getDefaultArtifactStore(ir), ir.Libpod.SystemContext()) artStore, err := ir.Libpod.ArtifactStore()
if err != nil { if err != nil {
return err return err
} }