Return image references in ImageStatus()

The image's canonical reference is a name with a digest of the image's
manifest, so compute and return that value as the image's reference in
ImageStatus() and in ContainerStatus().

We don't auto-store a name based on the image digest when we pull one by
tag, but then CRI doesn't need us to do that.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
This commit is contained in:
Nalin Dahyabhai 2017-07-12 12:41:38 -04:00
parent beef44840e
commit 3f2bc09231
6 changed files with 94 additions and 54 deletions

View file

@ -472,10 +472,7 @@ func ContainerStatus(client pb.RuntimeServiceClient, ID string) error {
if r.Status.Image != nil { if r.Status.Image != nil {
fmt.Printf("Image: %v\n", r.Status.Image.Image) fmt.Printf("Image: %v\n", r.Status.Image.Image)
} }
// fmt.Printf("ImageRef: %v\n", r.Status.ImageRef)
// TODO: https://github.com/kubernetes-incubator/cri-o/issues/531
//
//fmt.Printf("ImageRef: %v\n", r.Status.ImageRef)
return nil return nil
} }

View file

@ -24,7 +24,9 @@ import (
type ImageResult struct { type ImageResult struct {
ID string ID string
Names []string Names []string
Digests []string
Size *uint64 Size *uint64
ImageRef string
} }
type indexInfo struct { type indexInfo struct {
@ -149,11 +151,21 @@ func (svc *imageService) ImageStatus(systemContext *types.SystemContext, nameOrI
size := imageSize(img) size := imageSize(img)
img.Close() img.Close()
return &ImageResult{ result := ImageResult{
ID: image.ID, ID: image.ID,
Names: image.Names, Names: image.Names,
Size: size, Size: size,
}, nil }
if len(image.Names) > 0 {
result.ImageRef = image.Names[0]
if ref2, err2 := istorage.Transport.ParseStoreReference(svc.store, image.Names[0]); err2 == nil {
if dref := ref2.DockerReference(); dref != nil {
result.ImageRef = reference.FamiliarString(dref)
}
}
}
return &result, nil
} }
func imageSize(img types.Image) *uint64 { func imageSize(img types.Image) *uint64 {

View file

@ -46,6 +46,14 @@ func (s *Server) ContainerStatus(ctx context.Context, req *pb.ContainerStatusReq
cState := s.Runtime().ContainerStatus(c) cState := s.Runtime().ContainerStatus(c)
rStatus := pb.ContainerState_CONTAINER_UNKNOWN rStatus := pb.ContainerState_CONTAINER_UNKNOWN
imageName := c.Image()
status, err := s.StorageImageServer().ImageStatus(s.ImageContext(), imageName)
if err != nil {
return nil, err
}
resp.Status.ImageRef = status.ImageRef
// If we defaulted to exit code -1 earlier then we attempt to // If we defaulted to exit code -1 earlier then we attempt to
// get the exit code from the exit file again. // get the exit code from the exit file again.
if cState.ExitCode == -1 { if cState.ExitCode == -1 {

View file

@ -44,8 +44,8 @@ func (s *Server) ImageStatus(ctx context.Context, req *pb.ImageStatusRequest) (*
Image: &pb.Image{ Image: &pb.Image{
Id: status.ID, Id: status.ID,
RepoTags: status.Names, RepoTags: status.Names,
RepoDigests: status.Digests,
Size_: *status.Size, Size_: *status.Size,
// TODO: https://github.com/kubernetes-incubator/cri-o/issues/531
}, },
} }
logrus.Debugf("ImageStatusResponse: %+v", resp) logrus.Debugf("ImageStatusResponse: %+v", resp)

View file

@ -105,7 +105,7 @@ cp "$CONMON_BINARY" "$TESTDIR/conmon"
PATH=$PATH:$TESTDIR PATH=$PATH:$TESTDIR
# Make sure we have a copy of the redis:latest image. # Make sure we have a copy of the redis:alpine image.
if ! [ -d "$ARTIFACTS_PATH"/redis-image ]; then if ! [ -d "$ARTIFACTS_PATH"/redis-image ]; then
mkdir -p "$ARTIFACTS_PATH"/redis-image mkdir -p "$ARTIFACTS_PATH"/redis-image
if ! "$COPYIMG_BINARY" --import-from=docker://redis:alpine --export-to=dir:"$ARTIFACTS_PATH"/redis-image --signature-policy="$INTEGRATION_ROOT"/policy.json ; then if ! "$COPYIMG_BINARY" --import-from=docker://redis:alpine --export-to=dir:"$ARTIFACTS_PATH"/redis-image --signature-policy="$INTEGRATION_ROOT"/policy.json ; then
@ -115,10 +115,10 @@ if ! [ -d "$ARTIFACTS_PATH"/redis-image ]; then
fi fi
fi fi
# TODO: remove the code below for redis digested image id when # TODO: remove the code below for pulling redis:alpine using a canonical reference once
# https://github.com/kubernetes-incubator/cri-o/issues/531 is complete # https://github.com/kubernetes-incubator/cri-o/issues/531 is complete and we can
# as the digested reference will be auto-stored when pulling the tag # pull the image using a tagged reference and then subsequently find the image without
# above # having to explicitly record the canonical reference as one of the image's names
if ! [ -d "$ARTIFACTS_PATH"/redis-image-digest ]; then if ! [ -d "$ARTIFACTS_PATH"/redis-image-digest ]; then
mkdir -p "$ARTIFACTS_PATH"/redis-image-digest mkdir -p "$ARTIFACTS_PATH"/redis-image-digest
if ! "$COPYIMG_BINARY" --import-from=docker://redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b --export-to=dir:"$ARTIFACTS_PATH"/redis-image-digest --signature-policy="$INTEGRATION_ROOT"/policy.json ; then if ! "$COPYIMG_BINARY" --import-from=docker://redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b --export-to=dir:"$ARTIFACTS_PATH"/redis-image-digest --signature-policy="$INTEGRATION_ROOT"/policy.json ; then
@ -235,11 +235,11 @@ function start_crio() {
"$BIN2IMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --source-binary "$PAUSE_BINARY" "$BIN2IMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --source-binary "$PAUSE_BINARY"
fi fi
"$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --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 "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --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
# TODO: remove the code below for redis:alpine digested image id when # TODO: remove the code below for copying redis:alpine in using a canonical reference once
# https://github.com/kubernetes-incubator/cri-o/issues/531 is complete # https://github.com/kubernetes-incubator/cri-o/issues/531 is complete and we can
# as the digested reference will be auto-stored when pulling the tag # copy the image using a tagged reference and then subsequently find the image without
# above # having to explicitly record the canonical reference as one of the image's names
"$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b --import-from=dir:"$ARTIFACTS_PATH"/redis-image-digest --add-name=docker.io/library/redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b --signature-policy="$INTEGRATION_ROOT"/policy.json "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b --import-from=dir:"$ARTIFACTS_PATH"/redis-image-digest --signature-policy="$INTEGRATION_ROOT"/policy.json
"$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=mrunalp/oom --import-from=dir:"$ARTIFACTS_PATH"/oom-image --add-name=docker.io/library/mrunalp/oom --signature-policy="$INTEGRATION_ROOT"/policy.json "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=mrunalp/oom --import-from=dir:"$ARTIFACTS_PATH"/oom-image --add-name=docker.io/library/mrunalp/oom --signature-policy="$INTEGRATION_ROOT"/policy.json
"$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=mrunalp/image-volume-test --import-from=dir:"$ARTIFACTS_PATH"/image-volume-test-image --add-name=docker.io/library/mrunalp/image-volume-test --signature-policy="$INTEGRATION_ROOT"/policy.json "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=mrunalp/image-volume-test --import-from=dir:"$ARTIFACTS_PATH"/image-volume-test-image --add-name=docker.io/library/mrunalp/image-volume-test --signature-policy="$INTEGRATION_ROOT"/policy.json
"$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=busybox:latest --import-from=dir:"$ARTIFACTS_PATH"/busybox-image --add-name=docker.io/library/busybox:latest --signature-policy="$INTEGRATION_ROOT"/policy.json "$COPYIMG_BINARY" --root "$TESTDIR/crio" $STORAGE_OPTIONS --runroot "$TESTDIR/crio-run" --image-name=busybox:latest --import-from=dir:"$ARTIFACTS_PATH"/busybox-image --add-name=docker.io/library/busybox:latest --signature-policy="$INTEGRATION_ROOT"/policy.json
@ -262,29 +262,17 @@ function start_crio() {
crictl pull redis:alpine crictl pull redis:alpine
fi fi
REDIS_IMAGEID=$(crictl inspecti redis:alpine | head -1 | sed -e "s/ID: //g") REDIS_IMAGEID=$(crictl inspecti redis:alpine | head -1 | sed -e "s/ID: //g")
run crictl inspecti redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b
if [ "$status" -ne 0 ] ; then
crictl pull redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b
fi
REDIS_IMAGEID_DIGESTED=$(crictl inspecti redis@sha256:03789f402b2ecfb98184bf128d180f398f81c63364948ff1454583b02442f73b | head -1 | sed -e "s/ID: //g")
run crictl inspecti mrunalp/oom run crictl inspecti mrunalp/oom
if [ "$status" -ne 0 ] ; then if [ "$status" -ne 0 ] ; then
crictl pull mrunalp/oom crictl pull mrunalp/oom
fi fi
# OOM_IMAGEID=$(crictl inspecti mrunalp/oom | head -1 | sed -e "s/ID: //g")
# run crioctl image status --id=runcom/stderr-test
#
# 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 crictl inspecti $REDIS_IMAGEID_DIGESTED
if [ "$status" -ne 0 ]; then
crictl pull $REDIS_IMAGEID_DIGESTED
fi
#
#
#
run crictl inspecti runcom/stderr-test
if [ "$status" -ne 0 ] ; then if [ "$status" -ne 0 ] ; then
crictl pull runcom/stderr-test:latest crictl pull runcom/stderr-test:latest
fi fi

View file

@ -50,9 +50,7 @@ function teardown() {
stop_crio stop_crio
} }
@test "container status return image@digest if created by image ID and digest available" { @test "container status return image@digest if created by image ID" {
skip "depends on https://github.com/kubernetes-incubator/cri-o/issues/531"
start_crio start_crio
run crioctl pod run --config "$TESTDATA"/sandbox_config.json run crioctl pod run --config "$TESTDATA"/sandbox_config.json
@ -77,11 +75,27 @@ function teardown() {
stop_crio stop_crio
} }
@test "image pull" { @test "image pull and list" {
start_crio "" "" --no-pause-image start_crio "" "" --no-pause-image
run crioctl image pull "$IMAGE" run crioctl image pull "$IMAGE"
echo "$output" echo "$output"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
run crioctl image list --quiet "$IMAGE"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
imageid="$output"
run crioctl image list --quiet @"$imageid"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
run crioctl image list --quiet "$imageid"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
cleanup_images cleanup_images
stop_crio stop_crio
} }
@ -104,7 +118,32 @@ function teardown() {
stop_crio stop_crio
} }
@test "image pull and list by digest" { @test "image pull and list by tag and ID" {
start_crio "" "" --no-pause-image
run crioctl image pull "$IMAGE:go"
echo "$output"
[ "$status" -eq 0 ]
run crioctl image list --quiet "$IMAGE:go"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
imageid="$output"
run crioctl image list --quiet @"$imageid"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
run crioctl image list --quiet "$imageid"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
cleanup_images
stop_crio
}
@test "image pull and list by digest and ID" {
start_crio "" "" --no-pause-image start_crio "" "" --no-pause-image
run crioctl image pull nginx@sha256:33eb1ed1e802d4f71e52421f56af028cdf12bb3bfff5affeaf5bf0e328ffa1bc run crioctl image pull nginx@sha256:33eb1ed1e802d4f71e52421f56af028cdf12bb3bfff5affeaf5bf0e328ffa1bc
echo "$output" echo "$output"
@ -114,18 +153,14 @@ function teardown() {
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
echo "$output" echo "$output"
[ "$output" != "" ] [ "$output" != "" ]
imageid="$output"
run crioctl image list --quiet nginx@33eb1ed1e802d4f71e52421f56af028cdf12bb3bfff5affeaf5bf0e328ffa1bc run crioctl image list --quiet @"$imageid"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
echo "$output" echo "$output"
[ "$output" != "" ] [ "$output" != "" ]
run crioctl image list --quiet @33eb1ed1e802d4f71e52421f56af028cdf12bb3bfff5affeaf5bf0e328ffa1bc run crioctl image list --quiet "$imageid"
[ "$status" -eq 0 ]
echo "$output"
[ "$output" != "" ]
run crioctl image list --quiet 33eb1ed1e802d4f71e52421f56af028cdf12bb3bfff5affeaf5bf0e328ffa1bc
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
echo "$output" echo "$output"
[ "$output" != "" ] [ "$output" != "" ]