github.com/dean7474/operator-registry@v1.21.1-0.20220418203638-d4717f98c2e5/pkg/image/mock.go (about)

     1  package image
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"io/fs"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"sync"
    11  )
    12  
    13  var _ Registry = &MockRegistry{}
    14  
    15  type MockRegistry struct {
    16  	RemoteImages map[Reference]*MockImage
    17  	localImages  map[Reference]*MockImage
    18  	m            sync.RWMutex
    19  }
    20  
    21  type MockImage struct {
    22  	Labels map[string]string
    23  	FS     fs.FS
    24  }
    25  
    26  func (i *MockImage) unpack(dir string) error {
    27  	return fs.WalkDir(i.FS, ".", func(path string, entry fs.DirEntry, err error) error {
    28  		if err != nil {
    29  			return err
    30  		}
    31  		if entry.IsDir() {
    32  			return nil
    33  		}
    34  		data, err := fs.ReadFile(i.FS, path)
    35  		if err != nil {
    36  			return err
    37  		}
    38  		path = filepath.Join(dir, path)
    39  		pathDir := filepath.Dir(path)
    40  		if err := os.MkdirAll(pathDir, 0777); err != nil {
    41  			return err
    42  		}
    43  		return ioutil.WriteFile(path, data, 0666)
    44  	})
    45  }
    46  
    47  func (m *MockRegistry) Pull(_ context.Context, ref Reference) error {
    48  	image, ok := m.RemoteImages[ref]
    49  	if !ok {
    50  		return errors.New("not found")
    51  	}
    52  	m.m.Lock()
    53  	defer m.m.Unlock()
    54  	if m.localImages == nil {
    55  		m.localImages = map[Reference]*MockImage{}
    56  	}
    57  	m.localImages[ref] = image
    58  	return nil
    59  }
    60  
    61  func (m *MockRegistry) Unpack(_ context.Context, ref Reference, dir string) error {
    62  	m.m.RLock()
    63  	defer m.m.RUnlock()
    64  	image, ok := m.localImages[ref]
    65  	if !ok {
    66  		return errors.New("not found")
    67  	}
    68  	return image.unpack(dir)
    69  }
    70  
    71  func (m *MockRegistry) Labels(_ context.Context, ref Reference) (map[string]string, error) {
    72  	m.m.RLock()
    73  	defer m.m.RUnlock()
    74  	image, ok := m.localImages[ref]
    75  	if !ok {
    76  		return nil, errors.New("not found")
    77  	}
    78  	return image.Labels, nil
    79  }
    80  
    81  func (m *MockRegistry) Destroy() error {
    82  	m.m.Lock()
    83  	defer m.m.Unlock()
    84  	m.localImages = nil
    85  	return nil
    86  }