Replace mock OCI client with working local client

This commit is contained in:
Philip Laine 2024-06-19 23:02:04 +02:00
parent 6b2c51407f
commit 4b60f70a79
No known key found for this signature in database
GPG Key ID: F6D0B743CA3EFF33
4 changed files with 106 additions and 58 deletions

101
pkg/oci/local.go Normal file
View File

@ -0,0 +1,101 @@
package oci
import (
"context"
"io"
"os"
"path/filepath"
"sync"
"github.com/opencontainers/go-digest"
)
var _ Client = &LocalClient{}
type LocalClient struct {
mx sync.RWMutex
rootDir string
imageEventCh chan ImageEvent
errCh chan error
}
func NewLocalClient(rootDir string) *LocalClient {
return &LocalClient{
rootDir: rootDir,
}
}
func (m *LocalClient) Add() error {
return nil
}
func (m *LocalClient) Name() string {
return "local"
}
func (m *LocalClient) Verify(ctx context.Context) error {
_, err := os.Stat(m.rootDir)
if err != nil {
return err
}
return nil
}
func (m *LocalClient) Subscribe(ctx context.Context) (<-chan ImageEvent, <-chan error, error) {
return nil, nil, nil
}
func (m *LocalClient) ListImages(ctx context.Context) ([]Image, error) {
m.mx.RLock()
defer m.mx.RUnlock()
return nil, nil
}
func (m *LocalClient) AllIdentifiers(ctx context.Context, img Image) ([]string, error) {
return []string{img.Digest.String()}, nil
}
func (m *LocalClient) Resolve(ctx context.Context, ref string) (digest.Digest, error) {
return "", nil
}
func (m *LocalClient) Size(ctx context.Context, dgst digest.Digest) (int64, error) {
m.mx.RLock()
defer m.mx.RUnlock()
p := m.pathForDigest(dgst)
fi, err := os.Stat(p)
if err != nil {
return 0, err
}
return fi.Size(), nil
}
func (m *LocalClient) GetManifest(ctx context.Context, dgst digest.Digest) ([]byte, string, error) {
m.mx.RLock()
defer m.mx.RUnlock()
p := m.pathForDigest(dgst)
b, err := os.ReadFile(p)
if err != nil {
return nil, "", err
}
return b, "", nil
}
func (m *LocalClient) GetBlob(ctx context.Context, dgst digest.Digest) (io.ReadCloser, error) {
m.mx.RLock()
defer m.mx.RUnlock()
p := m.pathForDigest(dgst)
f, err := os.Open(p)
if err != nil {
return nil, err
}
return f, nil
}
func (m *LocalClient) pathForDigest(dgst digest.Digest) string {
return filepath.Join(m.rootDir, "blobs", dgst.Algorithm().String(), dgst.Encoded())
}

View File

@ -1,56 +0,0 @@
package oci
import (
"context"
"io"
"github.com/opencontainers/go-digest"
)
var _ Client = &MockClient{}
type MockClient struct {
images []Image
}
func NewMockClient(images []Image) *MockClient {
return &MockClient{
images: images,
}
}
func (m *MockClient) Name() string {
return "mock"
}
func (m *MockClient) Verify(ctx context.Context) error {
return nil
}
func (m *MockClient) Subscribe(ctx context.Context) (<-chan ImageEvent, <-chan error, error) {
return nil, nil, nil
}
func (m *MockClient) ListImages(ctx context.Context) ([]Image, error) {
return m.images, nil
}
func (m *MockClient) AllIdentifiers(ctx context.Context, img Image) ([]string, error) {
return []string{img.Digest.String()}, nil
}
func (m *MockClient) Resolve(ctx context.Context, ref string) (digest.Digest, error) {
return "", nil
}
func (m *MockClient) Size(ctx context.Context, dgst digest.Digest) (int64, error) {
return 0, nil
}
func (m *MockClient) GetManifest(ctx context.Context, dgst digest.Digest) ([]byte, string, error) {
return nil, "", nil
}
func (m *MockClient) GetBlob(ctx context.Context, dgst digest.Digest) (io.ReadCloser, error) {
return nil, nil
}

View File

@ -84,7 +84,10 @@ func TestOCIClient(t *testing.T) {
client: containerdClient,
}
for _, ociClient := range []Client{remoteContainerd, localContainerd} {
localClient := NewLocalClient(t.TempDir())
ociClients := []Client{remoteContainerd, localContainerd, localClient}
for _, ociClient := range ociClients {
t.Run(ociClient.Name(), func(t *testing.T) {
t.Parallel()

View File

@ -45,7 +45,7 @@ func TestBasic(t *testing.T) {
require.NoError(t, err)
imgs = append(imgs, img)
}
ociClient := oci.NewMockClient(imgs)
ociClient := oci.NewLocalClient(imgs)
router := routing.NewMemoryRouter(map[string][]netip.AddrPort{}, netip.MustParseAddrPort("127.0.0.1:5000"))
ctx, cancel := context.WithCancel(context.TODO())