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  }