diff --git a/libkpod/container_server.go b/libkpod/container_server.go index a1d85ea3..68d1a8b1 100644 --- a/libkpod/container_server.go +++ b/libkpod/container_server.go @@ -361,6 +361,7 @@ func (c *ContainerServer) LoadSandbox(id string) error { if err != nil { return err } + scontainer.SetMountPoint(m.Annotations[annotations.MountPoint]) if m.Annotations[annotations.Volumes] != "" { containerVolumes := []oci.ContainerVolume{} @@ -483,6 +484,7 @@ func (c *ContainerServer) LoadContainer(id string) error { if err != nil { return err } + ctr.SetMountPoint(m.Annotations[annotations.MountPoint]) c.ContainerStateFromDisk(ctr) diff --git a/oci/container.go b/oci/container.go index 31bcb185..09ee0aa1 100644 --- a/oci/container.go +++ b/oci/container.go @@ -46,6 +46,7 @@ type Container struct { imageName string imageRef string volumes []ContainerVolume + mountPoint string } // ContainerVolume is a bind mount for the container. @@ -222,3 +223,13 @@ func (c *Container) Volumes() []ContainerVolume { return c.volumes } + +// SetMountPoint sets the container mount point +func (c *Container) SetMountPoint(mp string) { + c.mountPoint = mp +} + +// MountPoint returns the container mount point +func (c *Container) MountPoint() string { + return c.mountPoint +} diff --git a/pkg/annotations/annotations.go b/pkg/annotations/annotations.go index 0b8a5ea1..63cc126d 100644 --- a/pkg/annotations/annotations.go +++ b/pkg/annotations/annotations.go @@ -58,6 +58,9 @@ const ( // ShmPath is the shared memory path annotation ShmPath = "io.kubernetes.cri-o.ShmPath" + // MountPoint is the mount point of the container rootfs + MountPoint = "io.kubernetes.cri-o.MountPoint" + // TrustedSandbox is the annotation for trusted sandboxes TrustedSandbox = "io.kubernetes.cri-o.TrustedSandbox" diff --git a/pkg/storage/image.go b/pkg/storage/image.go index f3948fb4..d03527a2 100644 --- a/pkg/storage/image.go +++ b/pkg/storage/image.go @@ -41,7 +41,7 @@ type imageService struct { // implementation. type ImageServer interface { // ListImages returns list of all images which match the filter. - ListImages(filter string) ([]ImageResult, error) + ListImages(systemContext *types.SystemContext, filter string) ([]ImageResult, error) // ImageStatus returns status of an image which matches the filter. ImageStatus(systemContext *types.SystemContext, filter string) (*ImageResult, error) // PullImage imports an image from the specified location. @@ -59,25 +59,38 @@ type ImageServer interface { ResolveNames(imageName string) ([]string, error) } -func (svc *imageService) ListImages(filter string) ([]ImageResult, error) { +func (svc *imageService) getRef(name string) (types.ImageReference, error) { + ref, err := alltransports.ParseImageName(name) + if err != nil { + ref2, err2 := istorage.Transport.ParseStoreReference(svc.store, "@"+name) + if err2 != nil { + ref3, err3 := istorage.Transport.ParseStoreReference(svc.store, name) + if err3 != nil { + return nil, err + } + ref2 = ref3 + } + ref = ref2 + } + return ref, nil +} + +func (svc *imageService) ListImages(systemContext *types.SystemContext, filter string) ([]ImageResult, error) { results := []ImageResult{} if filter != "" { - ref, err := alltransports.ParseImageName(filter) + ref, err := svc.getRef(filter) if err != nil { - ref2, err2 := istorage.Transport.ParseStoreReference(svc.store, "@"+filter) - if err2 != nil { - ref3, err3 := istorage.Transport.ParseStoreReference(svc.store, filter) - if err3 != nil { - return nil, err - } - ref2 = ref3 - } - ref = ref2 + return nil, err } if image, err := istorage.Transport.GetStoreImage(svc.store, ref); err == nil { + img, err := ref.NewImage(systemContext) + if err != nil { + return nil, err + } results = append(results, ImageResult{ ID: image.ID, Names: image.Names, + Size: imageSize(img), }) } } else { @@ -86,9 +99,18 @@ func (svc *imageService) ListImages(filter string) ([]ImageResult, error) { return nil, err } for _, image := range images { + ref, err := svc.getRef(image.Names[0]) + if err != nil { + return nil, err + } + img, err := ref.NewImage(systemContext) + if err != nil { + return nil, err + } results = append(results, ImageResult{ ID: image.ID, Names: image.Names, + Size: imageSize(img), }) } } diff --git a/server/container_create.go b/server/container_create.go index 8b2a940a..55a58407 100644 --- a/server/container_create.go +++ b/server/container_create.go @@ -698,6 +698,7 @@ func (s *Server) createSandboxContainer(ctx context.Context, containerID string, if err != nil { return nil, fmt.Errorf("failed to mount container %s(%s): %v", containerName, containerID, err) } + specgen.AddAnnotation(annotations.MountPoint, mountPoint) containerImageConfig := containerInfo.Config if containerImageConfig == nil { @@ -789,6 +790,7 @@ func (s *Server) createSandboxContainer(ctx context.Context, containerID string, if err != nil { return nil, err } + container.SetMountPoint(mountPoint) for _, cv := range containerVolumes { container.AddVolume(cv) diff --git a/server/image_list.go b/server/image_list.go index e2b69670..ebcc6f6a 100644 --- a/server/image_list.go +++ b/server/image_list.go @@ -17,7 +17,7 @@ func (s *Server) ListImages(ctx context.Context, req *pb.ListImagesRequest) (*pb filter = filterImage.Image } } - results, err := s.StorageImageServer().ListImages(filter) + results, err := s.StorageImageServer().ListImages(s.ImageContext(), filter) if err != nil { return nil, err } diff --git a/server/inspect.go b/server/inspect.go index 377d821c..b132c9e6 100644 --- a/server/inspect.go +++ b/server/inspect.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "path/filepath" "github.com/go-zoo/bone" ) @@ -15,6 +16,8 @@ type ContainerInfo struct { CreatedTime int64 `json:"created_time"` Labels map[string]string `json:"labels"` Annotations map[string]string `json:"annotations"` + LogPath string `json:"log_path"` + Root string `json:"root"` } // CrioInfo stores information about the crio daemon @@ -61,6 +64,8 @@ func (s *Server) StartInfoEndpoints() error { CreatedTime: ctrState.Created.UnixNano(), Labels: ctr.Labels(), Annotations: ctr.Annotations(), + Root: ctr.MountPoint(), + LogPath: filepath.Dir(ctr.LogPath()), } js, err := json.Marshal(ci) if err != nil { diff --git a/server/sandbox_run.go b/server/sandbox_run.go index 375ff082..1bd02942 100644 --- a/server/sandbox_run.go +++ b/server/sandbox_run.go @@ -442,6 +442,7 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest if err != nil { return nil, fmt.Errorf("failed to mount container %s in pod sandbox %s(%s): %v", containerName, sb.Name(), id, err) } + g.AddAnnotation(annotations.MountPoint, mountPoint) g.SetRootPath(mountPoint) err = g.SaveToFile(filepath.Join(podContainer.Dir, "config.json"), saveOptions) if err != nil { @@ -455,6 +456,7 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest if err != nil { return nil, err } + container.SetMountPoint(mountPoint) sb.SetInfraContainer(container)