github.com/Mirantis/virtlet@v1.5.2-0.20191204181327-1659b8a48e9b/pkg/manager/image.go (about) 1 /* 2 Copyright 2016-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 manager 18 19 import ( 20 "github.com/jonboulle/clockwork" 21 "golang.org/x/net/context" 22 kubeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" 23 24 "github.com/Mirantis/virtlet/pkg/image" 25 ) 26 27 // VirtletImageService handles CRI image service calls. 28 type VirtletImageService struct { 29 imageStore image.Store 30 imageTranslator image.Translator 31 clock clockwork.Clock 32 } 33 34 // NewVirtletImageService returns a new instance of VirtletImageService. 35 func NewVirtletImageService(imageStore image.Store, imageTranslator image.Translator, clock clockwork.Clock) *VirtletImageService { 36 if clock == nil { 37 clock = clockwork.NewRealClock() 38 } 39 return &VirtletImageService{ 40 imageStore: imageStore, 41 imageTranslator: imageTranslator, 42 clock: clock, 43 } 44 } 45 46 // ListImages method implements ListImages from CRI. 47 func (v *VirtletImageService) ListImages(ctx context.Context, in *kubeapi.ListImagesRequest) (*kubeapi.ListImagesResponse, error) { 48 images, err := v.imageStore.ListImages(in.GetFilter().GetImage().GetImage()) 49 if err != nil { 50 return nil, err 51 } 52 53 response := &kubeapi.ListImagesResponse{Images: make([]*kubeapi.Image, len(images))} 54 for n, image := range images { 55 response.Images[n] = imageToKubeapi(image) 56 } 57 58 return response, err 59 } 60 61 // ImageStatus method implements ImageStatus from CRI. 62 func (v *VirtletImageService) ImageStatus(ctx context.Context, in *kubeapi.ImageStatusRequest) (*kubeapi.ImageStatusResponse, error) { 63 img, err := v.imageStore.ImageStatus(in.GetImage().GetImage()) 64 if err != nil { 65 return nil, err 66 } 67 response := &kubeapi.ImageStatusResponse{Image: imageToKubeapi(img)} 68 return response, err 69 } 70 71 // PullImage method implements PullImage from CRI. 72 func (v *VirtletImageService) PullImage(ctx context.Context, in *kubeapi.PullImageRequest) (*kubeapi.PullImageResponse, error) { 73 imageName := in.GetImage().GetImage() 74 75 ref, err := v.imageStore.PullImage(ctx, imageName, v.imageTranslator) 76 if err != nil { 77 return nil, err 78 } 79 80 response := &kubeapi.PullImageResponse{ImageRef: ref} 81 return response, nil 82 } 83 84 // RemoveImage method implements RemoveImage from CRI. 85 func (v *VirtletImageService) RemoveImage(ctx context.Context, in *kubeapi.RemoveImageRequest) (*kubeapi.RemoveImageResponse, error) { 86 imageName := in.GetImage().GetImage() 87 if err := v.imageStore.RemoveImage(imageName); err != nil { 88 return nil, err 89 } 90 return &kubeapi.RemoveImageResponse{}, nil 91 } 92 93 // ImageFsInfo returns an info about filesystem used by images service 94 func (v *VirtletImageService) ImageFsInfo(ctx context.Context, in *kubeapi.ImageFsInfoRequest) (*kubeapi.ImageFsInfoResponse, error) { 95 stats, err := v.imageStore.FilesystemStats() 96 if err != nil { 97 return nil, err 98 } 99 return &kubeapi.ImageFsInfoResponse{ 100 ImageFilesystems: []*kubeapi.FilesystemUsage{ 101 { 102 Timestamp: v.clock.Now().UnixNano(), 103 FsId: &kubeapi.FilesystemIdentifier{ 104 Mountpoint: stats.Mountpoint, 105 }, 106 UsedBytes: &kubeapi.UInt64Value{Value: stats.UsedBytes}, 107 InodesUsed: &kubeapi.UInt64Value{Value: stats.UsedInodes}, 108 }, 109 }, 110 }, nil 111 } 112 113 func imageToKubeapi(img *image.Image) *kubeapi.Image { 114 if img == nil { 115 return nil 116 } 117 return &kubeapi.Image{ 118 Id: img.Digest, 119 RepoTags: []string{img.Name}, 120 Size_: img.Size, 121 } 122 }