github.com/mirantis/virtlet@v1.5.2-0.20191204181327-1659b8a48e9b/pkg/image/fake/store.go (about) 1 /* 2 Copyright 2018 Mirantis 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package image 18 19 import ( 20 "context" 21 "fmt" 22 "sort" 23 24 "github.com/docker/distribution/reference" 25 digest "github.com/opencontainers/go-digest" 26 27 "github.com/Mirantis/virtlet/pkg/image" 28 "github.com/Mirantis/virtlet/pkg/metadata/types" 29 testutils "github.com/Mirantis/virtlet/pkg/utils/testing" 30 ) 31 32 const ( 33 fakeStoreMountpoint = "/var/lib/virtlet" 34 fakeUsedBytes = 1024 * 1024 * 1024 35 fakeUsedInodes = 1024 36 ) 37 38 // FakeStore is a fake implementation of Store interface for testing. 39 type FakeStore struct { 40 rec testutils.Recorder 41 images map[string]*image.Image 42 refGetter image.RefGetter 43 } 44 45 var _ image.Store = &FakeStore{} 46 47 // NewFakeStore creates a new FakeStore. 48 func NewFakeStore(rec testutils.Recorder) *FakeStore { 49 return &FakeStore{ 50 rec: rec, 51 images: make(map[string]*image.Image), 52 } 53 } 54 55 // ListImages implements ListImages method of ImageStore interface. 56 func (s *FakeStore) ListImages(filter string) ([]*image.Image, error) { 57 r := make([]*image.Image, 0, len(s.images)) 58 for _, img := range s.images { 59 if filter == "" || img.Name == filter { 60 r = append(r, img) 61 } 62 } 63 sort.Slice(r, func(i, j int) bool { return r[i].Name < r[j].Name }) 64 return r, nil 65 } 66 67 // ImageStatus implements ImageStatus method of Store interface. 68 func (s *FakeStore) ImageStatus(name string) (*image.Image, error) { 69 name, _ = image.SplitImageName(name) 70 return s.images[name], nil 71 } 72 73 // PullImage implements PullImage method of Store interface. 74 func (s *FakeStore) PullImage(ctx context.Context, name string, translator image.Translator) (string, error) { 75 name, _ = image.SplitImageName(name) 76 ep := translator(ctx, name) 77 d := digest.FromString(name) 78 named, err := reference.WithName(name) 79 if err != nil { 80 return "", err 81 } 82 withDigest, err := reference.WithDigest(named, d) 83 if err != nil { 84 return "", err 85 } 86 s.images[name] = &image.Image{ 87 Digest: d.String(), 88 Name: name, 89 Path: "/fake/volume/" + name, 90 Size: uint64(len(name)), 91 } 92 s.rec.Rec("PullImage", map[string]interface{}{ 93 "url": ep.URL, 94 "image": s.images[name], 95 }) 96 return withDigest.String(), nil 97 } 98 99 // RemoveImage implements RemoveImage method of Store interface. 100 func (s *FakeStore) RemoveImage(name string) error { 101 delete(s.images, name) 102 s.rec.Rec("RemoveImage", name) 103 return nil 104 } 105 106 // GC implements GC method of Store interface. 107 func (s *FakeStore) GC() error { 108 var err error 109 var refSet map[string]bool 110 if s.refGetter != nil { 111 refSet, err = s.refGetter() 112 if err != nil { 113 return err 114 } 115 } 116 s.rec.Rec("GC", map[string]interface{}{ 117 "refSet": refSet, 118 }) 119 return nil 120 } 121 122 // GetImagePathDigestAndVirtualSize implements GetImagePathDigestAndVirtualSize method of Store interface. 123 func (s *FakeStore) GetImagePathDigestAndVirtualSize(imageName string) (string, digest.Digest, uint64, error) { 124 img, found := s.images[imageName] 125 if !found { 126 return "", "", 0, fmt.Errorf("image not found: %q", imageName) 127 } 128 return img.Path, digest.Digest(img.Digest), img.Size, nil 129 } 130 131 // SetRefGetter implements SetRefGetter method of Store interface. 132 func (s *FakeStore) SetRefGetter(imageRefGetter image.RefGetter) { 133 s.refGetter = imageRefGetter 134 } 135 136 // FilesystemStats implements FilesystemStats method from Store interface. 137 func (s *FakeStore) FilesystemStats() (*types.FilesystemStats, error) { 138 return &types.FilesystemStats{ 139 Mountpoint: fakeStoreMountpoint, 140 UsedBytes: fakeUsedBytes, 141 UsedInodes: fakeUsedInodes, 142 }, nil 143 } 144 145 // BytesUsedBy implements BytesUsedBy method from Store interface. 146 func (s *FakeStore) BytesUsedBy(path string) (uint64, error) { 147 return fakeUsedBytes, nil 148 }