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  }