diff --git a/cmd/crioctl/container.go b/cmd/crioctl/container.go index 693804d0..7788d547 100644 --- a/cmd/crioctl/container.go +++ b/cmd/crioctl/container.go @@ -460,6 +460,13 @@ func ContainerStatus(client pb.RuntimeServiceClient, ID string) error { ftm := time.Unix(0, r.Status.FinishedAt) fmt.Printf("Finished: %v\n", ftm) fmt.Printf("Exit Code: %v\n", r.Status.ExitCode) + if r.Status.Image != nil { + fmt.Printf("Image: %v\n", r.Status.Image.Image) + } + // + // TODO: https://github.com/kubernetes-incubator/cri-o/issues/531 + // + //fmt.Printf("ImageRef: %v\n", r.Status.ImageRef) return nil } diff --git a/server/container_status.go b/server/container_status.go index febe7060..d2a500d3 100644 --- a/server/container_status.go +++ b/server/container_status.go @@ -2,8 +2,10 @@ package server import ( "encoding/json" + "fmt" "github.com/Sirupsen/logrus" + "github.com/docker/distribution/reference" "github.com/kubernetes-incubator/cri-o/oci" rspec "github.com/opencontainers/runtime-spec/specs-go" "golang.org/x/net/context" @@ -24,14 +26,12 @@ func (s *Server) ContainerStatus(ctx context.Context, req *pb.ContainerStatusReq s.containerStateToDisk(c) containerID := c.ID() - image := c.Image() resp := &pb.ContainerStatusResponse{ Status: &pb.ContainerStatus{ Id: containerID, Metadata: c.Metadata(), Labels: c.Labels(), Annotations: c.Annotations(), - Image: image, }, } @@ -41,12 +41,39 @@ func (s *Server) ContainerStatus(ctx context.Context, req *pb.ContainerStatusReq } resp.Status.Mounts = mounts - status, err := s.storageImageServer.ImageStatus(s.imageContext, image.Image) + imageName := c.Image().Image + status, err := s.storageImageServer.ImageStatus(s.imageContext, imageName) if err != nil { return nil, err } - resp.Status.ImageRef = status.ID + imageRef := status.ID + // + // TODO: https://github.com/kubernetes-incubator/cri-o/issues/531 + // + //for _, n := range status.Names { + //r, err := reference.ParseNormalizedNamed(n) + //if err != nil { + //return nil, fmt.Errorf("failed to normalize image name for ImageRef: %v", err) + //} + //if digested, isDigested := r.(reference.Canonical); isDigested { + //imageRef = reference.FamiliarString(digested) + //break + //} + //} + resp.Status.ImageRef = imageRef + + for _, n := range status.Names { + r, err := reference.ParseNormalizedNamed(n) + if err != nil { + return nil, fmt.Errorf("failed to normalize image name for Image: %v", err) + } + if tagged, isTagged := r.(reference.Tagged); isTagged { + imageName = reference.FamiliarString(tagged) + break + } + } + resp.Status.Image = &pb.ImageSpec{Image: imageName} cState := s.runtime.ContainerStatus(c) rStatus := pb.ContainerState_CONTAINER_UNKNOWN diff --git a/server/image_status.go b/server/image_status.go index d2cf9d4f..0841c702 100644 --- a/server/image_status.go +++ b/server/image_status.go @@ -32,6 +32,7 @@ func (s *Server) ImageStatus(ctx context.Context, req *pb.ImageStatusRequest) (* Id: status.ID, RepoTags: status.Names, Size_: *status.Size, + // TODO: https://github.com/kubernetes-incubator/cri-o/issues/531 }, } logrus.Debugf("ImageStatusResponse: %+v", resp) diff --git a/server/sandbox_remove.go b/server/sandbox_remove.go index b4a5b66e..6f23b9ed 100644 --- a/server/sandbox_remove.go +++ b/server/sandbox_remove.go @@ -21,6 +21,10 @@ func (s *Server) RemovePodSandbox(ctx context.Context, req *pb.RemovePodSandboxR return nil, err } + // If the sandbox isn't found we just return an empty response to adhere + // the the CRI interface which expects to not error out in not found + // cases. + resp := &pb.RemovePodSandboxResponse{} logrus.Warnf("could not get sandbox %s, it's probably been removed already: %v", req.PodSandboxId, err) return resp, nil diff --git a/server/sandbox_stop.go b/server/sandbox_stop.go index d18cf51f..fb998b1d 100644 --- a/server/sandbox_stop.go +++ b/server/sandbox_stop.go @@ -16,7 +16,17 @@ func (s *Server) StopPodSandbox(ctx context.Context, req *pb.StopPodSandboxReque logrus.Debugf("StopPodSandboxRequest %+v", req) sb, err := s.getPodSandboxFromRequest(req.PodSandboxId) if err != nil { - return nil, err + if err == errSandboxIDEmpty { + return nil, err + } + + // If the sandbox isn't found we just return an empty response to adhere + // the the CRI interface which expects to not error out in not found + // cases. + + resp := &pb.StopPodSandboxResponse{} + logrus.Warnf("could not get sandbox %s, it's probably been stopped already: %v", req.PodSandboxId, err) + return resp, nil } podInfraContainer := sb.infraContainer diff --git a/test/helpers.bash b/test/helpers.bash index 873c2f67..7658357a 100644 --- a/test/helpers.bash +++ b/test/helpers.bash @@ -147,7 +147,7 @@ function start_crio() { if ! [ "$3" = "--no-pause-image" ] ; then "$BIN2IMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTS --runroot "$TESTDIR/crio-run" --source-binary "$PAUSE_BINARY" fi - "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTS --runroot "$TESTDIR/crio-run" --image-name=redis:alpine --import-from=dir:"$ARTIFACTS_PATH"/redis-image --add-name=docker://docker.io/library/redis:alpine --signature-policy="$INTEGRATION_ROOT"/policy.json + "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTS --runroot "$TESTDIR/crio-run" --image-name=redis:alpine --import-from=dir:"$ARTIFACTS_PATH"/redis-image --add-name=docker.io/library/redis:alpine --signature-policy="$INTEGRATION_ROOT"/policy.json "$CRIO_BINARY" --conmon "$CONMON_BINARY" --listen "$CRIO_SOCKET" --cgroup-manager "$CGROUP_MANAGER" --runtime "$RUNTIME_BINARY" --root "$TESTDIR/crio" --runroot "$TESTDIR/crio-run" $STORAGE_OPTS --seccomp-profile "$seccomp" --apparmor-profile "$apparmor" --cni-config-dir "$CRIO_CNI_CONFIG" --signature-policy "$INTEGRATION_ROOT"/policy.json --config /dev/null config >$CRIO_CONFIG # Prepare the CNI configuration files, we're running with non host networking by default @@ -170,6 +170,24 @@ function start_crio() { if [ "$status" -ne 0 ] ; then crioctl image pull busybox:latest fi + # + # + # + # TODO: remove the code below for redis digested image id when + # https://github.com/kubernetes-incubator/cri-o/issues/531 is complete + # as the digested reference will be auto-stored when pulling the tag + # above + # + # + # + REDIS_IMAGEID_DIGESTED="redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b" + run crioctl image status --id $REDIS_IMAGEID_DIGESTED + if [ "$status" -ne 0 ]; then + crioctl image pull $REDIS_IMAGEID_DIGESTED + fi + # + # + # BUSYBOX_IMAGEID=$(crioctl image status --id=busybox | head -1 | sed -e "s/ID: //g") } diff --git a/test/image.bats b/test/image.bats index ebad58fc..cb2bc155 100644 --- a/test/image.bats +++ b/test/image.bats @@ -23,6 +23,58 @@ function teardown() { stop_crio } +@test "container status return image:tag if created by image ID" { + start_crio + + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + + sed -e "s/%VALUE%/$REDIS_IMAGEID/g" "$TESTDATA"/container_config_by_imageid.json > "$TESTDIR"/ctr_by_imageid.json + + run crioctl ctr create --config "$TESTDIR"/ctr_by_imageid.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + + run crioctl ctr status --id "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + [[ "$output" =~ "Image: redis:alpine" ]] + + cleanup_ctrs + cleanup_pods + stop_crio +} + +@test "container status return image@digest if created by image ID and digest available" { + skip "depends on https://github.com/kubernetes-incubator/cri-o/issues/531" + + start_crio + + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + + sed -e "s/%VALUE%/$REDIS_IMAGEID_DIGESTED/g" "$TESTDATA"/container_config_by_imageid.json > "$TESTDIR"/ctr_by_imageid.json + + run crioctl ctr create --config "$TESTDIR"/ctr_by_imageid.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + + run crioctl ctr status --id "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + [[ "$output" =~ "ImageRef: redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b" ]] + + cleanup_ctrs + cleanup_pods + stop_crio +} + @test "image pull" { start_crio "" "" --no-pause-image run crioctl image pull "$IMAGE" diff --git a/test/pod.bats b/test/pod.bats index 4a4ce3f4..0ab7fb77 100644 --- a/test/pod.bats +++ b/test/pod.bats @@ -56,6 +56,29 @@ function teardown() { stop_crio } +@test "pod stop ignores not found sandboxes" { + start_crio + + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl pod stop --id "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + run crioctl pod remove --id "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + + run crioctl pod stop --id "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + + cleanup_ctrs + cleanup_pods + stop_crio +} + @test "pod list filtering" { start_crio run crioctl pod run --config "$TESTDATA"/sandbox_config.json -name pod1 --label "a=b" --label "c=d" --label "e=f"