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 }