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 }