From 69a2bebc706af0cfdcaa8f6f11b4b1d13510f1b8 Mon Sep 17 00:00:00 2001 From: SataQiu Date: Thu, 11 Jul 2024 22:42:40 +0800 Subject: [PATCH] kubeadm: fix a bug that ImageExists check returns true when the image isn't in the local storage --- cmd/kubeadm/app/util/runtime/runtime.go | 11 +++++++++-- cmd/kubeadm/app/util/runtime/runtime_test.go | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cmd/kubeadm/app/util/runtime/runtime.go b/cmd/kubeadm/app/util/runtime/runtime.go index 4b6800e583f..3f833e9b6de 100644 --- a/cmd/kubeadm/app/util/runtime/runtime.go +++ b/cmd/kubeadm/app/util/runtime/runtime.go @@ -229,8 +229,15 @@ func pullImagesInParallelImpl(images []string, ifNotPresent bool, func (runtime *CRIRuntime) ImageExists(image string) bool { ctx, cancel := defaultContext() defer cancel() - _, err := runtime.impl.ImageStatus(ctx, runtime.imageService, &runtimeapi.ImageSpec{Image: image}, false) - return err == nil + resp, err := runtime.impl.ImageStatus(ctx, runtime.imageService, &runtimeapi.ImageSpec{Image: image}, false) + if err != nil { + klog.Warningf("Failed to get image status, image: %q, error: %v", image, err) + return false + } + if resp == nil || resp.Image == nil { + return false + } + return true } // detectCRISocketImpl is separated out only for test purposes, DON'T call it directly, use DetectCRISocket instead diff --git a/cmd/kubeadm/app/util/runtime/runtime_test.go b/cmd/kubeadm/app/util/runtime/runtime_test.go index e7c2652662e..aa9de6e0c63 100644 --- a/cmd/kubeadm/app/util/runtime/runtime_test.go +++ b/cmd/kubeadm/app/util/runtime/runtime_test.go @@ -319,7 +319,12 @@ func TestImageExists(t *testing.T) { prepare func(*fakeImpl) }{ { - name: "valid", + name: "valid", + prepare: func(mock *fakeImpl) { + mock.ImageStatusReturns(&v1.ImageStatusResponse{ + Image: &v1.Image{}, + }, nil) + }, expected: true, }, {