From 965da9bc9b9d3961b51b04673c35644425f33504 Mon Sep 17 00:00:00 2001 From: ChengyuZhu6 Date: Fri, 24 Nov 2023 00:06:57 +0800 Subject: [PATCH] runtime: support to pass image information to guest by KataVirtualVolume support to pass image information to guest by KataVirtualVolumeImageGuestPullType in KataVirtualVolume, which will be used to pull image on the guest. Signed-off-by: ChengyuZhu6 --- src/runtime/virtcontainers/fs_share_linux.go | 8 ++-- src/runtime/virtcontainers/kata_agent.go | 43 +++++++++++++++++++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/runtime/virtcontainers/fs_share_linux.go b/src/runtime/virtcontainers/fs_share_linux.go index e80c9e8260..6d0518714d 100644 --- a/src/runtime/virtcontainers/fs_share_linux.go +++ b/src/runtime/virtcontainers/fs_share_linux.go @@ -486,9 +486,11 @@ func handleVirtualVolume(c *Container) ([]*grpc.Storage, string, error) { volumeType = virtVolume.VolumeType var vol *grpc.Storage - vol, err = handleVirtualVolumeStorageObject(c, "", virtVolume) - if err != nil { - return nil, "", err + if volumeType == types.KataVirtualVolumeImageGuestPullType { + vol, err = handleVirtualVolumeStorageObject(c, "", virtVolume) + if err != nil { + return nil, "", err + } } if vol != nil { diff --git a/src/runtime/virtcontainers/kata_agent.go b/src/runtime/virtcontainers/kata_agent.go index 476c6d1779..59e7bed65d 100644 --- a/src/runtime/virtcontainers/kata_agent.go +++ b/src/runtime/virtcontainers/kata_agent.go @@ -1580,9 +1580,50 @@ func handleBlockVolume(c *Container, device api.Device) (*grpc.Storage, error) { return vol, nil } +func handleImageGuestPullBlockVolume(c *Container, virtualVolumeInfo *types.KataVirtualVolume, vol *grpc.Storage) (*grpc.Storage, error) { + container_annotations := c.GetAnnotations() + container_type := container_annotations["io.kubernetes.cri.container-type"] + if virtualVolumeInfo.Source == "" { + var image_ref string + if container_type == "sandbox" { + image_ref = "pause" + } else { + image_ref = container_annotations["io.kubernetes.cri.image-name"] + if image_ref == "" { + return nil, fmt.Errorf("Failed to get image name from annotations") + } + } + virtualVolumeInfo.Source = image_ref + + //merge virtualVolumeInfo.ImagePull.Metadata and container_annotations + for k, v := range container_annotations { + virtualVolumeInfo.ImagePull.Metadata[k] = v + } + } + + no, err := json.Marshal(virtualVolumeInfo.ImagePull) + if err != nil { + return nil, err + } + vol.Driver = types.KataVirtualVolumeImageGuestPullType + vol.DriverOptions = append(vol.DriverOptions, types.KataVirtualVolumeImageGuestPullType+"="+string(no)) + vol.Source = virtualVolumeInfo.Source + vol.Fstype = typeOverlayFS + return vol, nil +} + // handleVirtualVolumeStorageObject handles KataVirtualVolume that is block device file. func handleVirtualVolumeStorageObject(c *Container, blockDeviceId string, virtVolume *types.KataVirtualVolume) (*grpc.Storage, error) { - var vol *grpc.Storage = &grpc.Storage{} + var vol *grpc.Storage + if virtVolume.VolumeType == types.KataVirtualVolumeImageGuestPullType { + var err error + vol = &grpc.Storage{} + vol, err = handleImageGuestPullBlockVolume(c, virtVolume, vol) + if err != nil { + return nil, err + } + vol.MountPoint = filepath.Join("/run/kata-containers/", c.id, c.rootfsSuffix) + } return vol, nil }