From 4b60f70a79394bae73833d829df93e5923fa1ed0 Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Wed, 19 Jun 2024 23:02:04 +0200 Subject: [PATCH] Replace mock OCI client with working local client --- pkg/oci/local.go | 101 ++++++++++++++++++++++++++++++++++++++++ pkg/oci/mock.go | 56 ---------------------- pkg/oci/oci_test.go | 5 +- pkg/state/state_test.go | 2 +- 4 files changed, 106 insertions(+), 58 deletions(-) create mode 100644 pkg/oci/local.go delete mode 100644 pkg/oci/mock.go diff --git a/pkg/oci/local.go b/pkg/oci/local.go new file mode 100644 index 00000000..1494a6ee --- /dev/null +++ b/pkg/oci/local.go @@ -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()) +} diff --git a/pkg/oci/mock.go b/pkg/oci/mock.go deleted file mode 100644 index 424239a8..00000000 --- a/pkg/oci/mock.go +++ /dev/null @@ -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 -} diff --git a/pkg/oci/oci_test.go b/pkg/oci/oci_test.go index 305c0ad9..d84c8607 100644 --- a/pkg/oci/oci_test.go +++ b/pkg/oci/oci_test.go @@ -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() diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 62771ee6..bce23614 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -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())