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:
parent
beef44840e
commit
3f2bc09231
6 changed files with 94 additions and 54 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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" != "" ]
|
||||||
|
|
Loading…
Reference in a new issue