Files
Memoh/internal/containerd/factory.go
T

62 lines
1.5 KiB
Go

package containerd
import (
"context"
"fmt"
"log/slog"
containerd "github.com/containerd/containerd/v2/client"
"github.com/memohai/memoh/internal/config"
)
const (
DefaultSocketPath = "/run/containerd/containerd.sock"
DefaultNamespace = "default"
BackendContainerd = "containerd"
BackendApple = "apple"
)
type ClientFactory interface {
New(ctx context.Context) (*containerd.Client, error)
}
type DefaultClientFactory struct {
SocketPath string
}
func (f DefaultClientFactory) New(_ context.Context) (*containerd.Client, error) {
socket := f.SocketPath
if socket == "" {
socket = DefaultSocketPath
}
return containerd.New(socket)
}
// ProvideService creates the appropriate Service based on the backend type.
func ProvideService(ctx context.Context, log *slog.Logger, cfg config.Config, backend string) (Service, func(), error) {
switch backend {
case BackendApple:
svc, err := NewAppleService(ctx, log, AppleServiceConfig{
SocketPath: cfg.Containerd.Socktainer.SocketPath,
BinaryPath: cfg.Containerd.Socktainer.BinaryPath,
})
if err != nil {
return nil, nil, fmt.Errorf("create apple container service: %w", err)
}
cleanup := func() { _ = svc.Close() }
return svc, cleanup, nil
default:
factory := DefaultClientFactory{SocketPath: cfg.Containerd.SocketPath}
client, err := factory.New(ctx)
if err != nil {
return nil, nil, fmt.Errorf("connect containerd: %w", err)
}
svc := NewDefaultService(log, client, cfg)
cleanup := func() { _ = client.Close() }
return svc, cleanup, nil
}
}