Skip to content

Commit c6522af

Browse files
yevgeny-shnaidmank8s-ci-robot
authored andcommitted
Skip waiting for missing image in case the flag is set
This commit implements skipping waiting for missing image using image puller pod in case the SkipWaitMissingImage is set in MIC The changes are: 1. In case SkipWaitMissingImage is set, the image puller pod is created with pullPodTypeLabel set to "one-time-pull" 2. The when the pod is in pending state due to a missing image, GetPullPodStatus will return PodFailed, since pullPodTypeLabel is set to "one-time-pull" 3. When updating image status in MIC based on puller pod, in case the puller pod status is failed and the SkipWaitMissingImage is set, then the status is set to ImageDoesNotExists
1 parent 0d6a98b commit c6522af

File tree

2 files changed

+73
-82
lines changed

2 files changed

+73
-82
lines changed

internal/controllers/mic_reconciler.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ func (mrhi *micReconcilerHelperImpl) updateStatusByPullPods(ctx context.Context,
153153
case imageSpec.Sign != nil:
154154
logger.Info("pull pod failed, build does not exist, sign exists, setting status to kmmv1beta1.ImageNeedsSigning")
155155
mrhi.micHelper.SetImageStatus(micObj, image, kmmv1beta1.ImageNeedsSigning)
156+
case imageSpec.SkipWaitMissingImage:
157+
logger.Info("pull pod failed, SkipWaitMissingImage was set, setting status to kmmv1beta1.ImageDoesNotExist")
158+
mrhi.micHelper.SetImageStatus(micObj, image, kmmv1beta1.ImageDoesNotExist)
156159
default:
157160
logger.Info(utils.WarnString("failed pod without build or sign spec, shoud not have happened"))
158161
}
@@ -237,11 +240,12 @@ func (mrhi *micReconcilerHelperImpl) processImagesSpecs(ctx context.Context, mic
237240
// image State is not set: either new image or pull pod is still running
238241
if mrhi.imagePullerAPI.GetPullPodForImage(pullPods, imageSpec.Image) == nil {
239242
// no pull pod- create it, otherwise we wait for it to finish
243+
oneTimePod := imageSpec.Build != nil || imageSpec.Sign != nil || imageSpec.SkipWaitMissingImage
240244
err := mrhi.imagePullerAPI.CreatePullPod(ctx,
241245
micObj.Name,
242246
micObj.Namespace,
243247
imageSpec.Image,
244-
(imageSpec.Build != nil || imageSpec.Sign != nil),
248+
oneTimePod,
245249
micObj.Spec.ImageRepoSecret,
246250
micObj)
247251
errs = append(errs, err)

internal/controllers/mic_reconciler_test.go

Lines changed: 68 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -110,25 +110,7 @@ var _ = Describe("updateStatusByPullPods", func() {
110110
})
111111

112112
ctx := context.Background()
113-
testMic := kmmv1beta1.ModuleImagesConfig{
114-
Spec: kmmv1beta1.ModuleImagesConfigSpec{
115-
Images: []kmmv1beta1.ModuleImageSpec{
116-
{
117-
Image: "image 1",
118-
Build: &kmmv1beta1.Build{},
119-
},
120-
{
121-
122-
Image: "image 2",
123-
Sign: &kmmv1beta1.Sign{},
124-
},
125-
{
126-
127-
Image: "image 3",
128-
},
129-
},
130-
},
131-
}
113+
testMic := kmmv1beta1.ModuleImagesConfig{}
132114

133115
It("zero pull pods", func() {
134116
pullPods := []v1.Pod{}
@@ -139,24 +121,8 @@ var _ = Describe("updateStatusByPullPods", func() {
139121
It("pod's image is not in spec", func() {
140122
pullPod := v1.Pod{}
141123
gomock.InOrder(
142-
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("image 3"),
143-
micHelper.EXPECT().GetModuleImageSpec(&testMic, "image 3").Return(nil),
144-
clnt.EXPECT().Status().Return(statusWriter),
145-
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
146-
mockImagePuller.EXPECT().DeletePod(ctx, &pullPod).Return(nil),
147-
)
148-
err := mrh.updateStatusByPullPods(ctx, &testMic, []v1.Pod{pullPod})
149-
Expect(err).To(BeNil())
150-
})
151-
152-
It("pod failed, build config present", func() {
153-
pullPod := v1.Pod{}
154-
155-
gomock.InOrder(
156-
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("image 1"),
157-
micHelper.EXPECT().GetModuleImageSpec(&testMic, "image 1").Return(&testMic.Spec.Images[0]),
158-
mockImagePuller.EXPECT().GetPullPodStatus(&pullPod).Return(pod.PullImageFailed),
159-
micHelper.EXPECT().SetImageStatus(&testMic, "image 1", kmmv1beta1.ImageNeedsBuilding),
124+
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("missing image"),
125+
micHelper.EXPECT().GetModuleImageSpec(&testMic, "missing image").Return(nil),
160126
clnt.EXPECT().Status().Return(statusWriter),
161127
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
162128
mockImagePuller.EXPECT().DeletePod(ctx, &pullPod).Return(nil),
@@ -165,28 +131,45 @@ var _ = Describe("updateStatusByPullPods", func() {
165131
Expect(err).To(BeNil())
166132
})
167133

168-
It("pod failed, build config not present, sign config present", func() {
169-
pullPod := v1.Pod{}
170-
171-
gomock.InOrder(
172-
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("image 2"),
173-
micHelper.EXPECT().GetModuleImageSpec(&testMic, "image 2").Return(&testMic.Spec.Images[1]),
174-
mockImagePuller.EXPECT().GetPullPodStatus(&pullPod).Return(pod.PullImageFailed),
175-
micHelper.EXPECT().SetImageStatus(&testMic, "image 2", kmmv1beta1.ImageNeedsSigning),
176-
clnt.EXPECT().Status().Return(statusWriter),
177-
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
178-
mockImagePuller.EXPECT().DeletePod(ctx, &pullPod).Return(nil),
179-
)
180-
err := mrh.updateStatusByPullPods(ctx, &testMic, []v1.Pod{pullPod})
181-
Expect(err).To(BeNil())
182-
})
134+
DescribeTable("pod failed scenarios",
135+
func(buildExists, signExists, skipWaitMissingImage bool, stateToSet kmmv1beta1.ImageState) {
136+
pullPod := v1.Pod{}
137+
micSpec := kmmv1beta1.ModuleImageSpec{
138+
Image: "some test image",
139+
}
140+
if buildExists {
141+
micSpec.Build = &kmmv1beta1.Build{}
142+
}
143+
if signExists {
144+
micSpec.Sign = &kmmv1beta1.Sign{}
145+
}
146+
micSpec.SkipWaitMissingImage = skipWaitMissingImage
147+
gomock.InOrder(
148+
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("some test image"),
149+
micHelper.EXPECT().GetModuleImageSpec(&testMic, "some test image").Return(&micSpec),
150+
mockImagePuller.EXPECT().GetPullPodStatus(&pullPod).Return(pod.PullImageFailed),
151+
micHelper.EXPECT().SetImageStatus(&testMic, "some test image", stateToSet),
152+
clnt.EXPECT().Status().Return(statusWriter),
153+
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
154+
mockImagePuller.EXPECT().DeletePod(ctx, &pullPod).Return(nil),
155+
)
156+
err := mrh.updateStatusByPullPods(ctx, &testMic, []v1.Pod{pullPod})
157+
Expect(err).To(BeNil())
158+
},
159+
Entry("build exists, sign missing, skipWait false, state ImageNeedsBuilding", true, false, false, kmmv1beta1.ImageNeedsBuilding),
160+
Entry("build missing, sign exists, skipWait false, state ImageNeedsSigning", false, true, false, kmmv1beta1.ImageNeedsSigning),
161+
Entry("build missing, sign missing, skipWait true, state ImageDoesNotExist", false, false, true, kmmv1beta1.ImageDoesNotExist),
162+
)
183163

184-
It("pod failed, build or sign configs are not present", func() {
164+
It("pod failed, build or sign configs are not present, skipWait is false", func() {
185165
pullPod := v1.Pod{}
166+
micSpec := kmmv1beta1.ModuleImageSpec{
167+
Image: "some test image",
168+
}
186169

187170
gomock.InOrder(
188-
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("image 3"),
189-
micHelper.EXPECT().GetModuleImageSpec(&testMic, "image 3").Return(&testMic.Spec.Images[2]),
171+
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("some test image"),
172+
micHelper.EXPECT().GetModuleImageSpec(&testMic, "some test image").Return(&micSpec),
190173
mockImagePuller.EXPECT().GetPullPodStatus(&pullPod).Return(pod.PullImageFailed),
191174
clnt.EXPECT().Status().Return(statusWriter),
192175
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
@@ -198,12 +181,15 @@ var _ = Describe("updateStatusByPullPods", func() {
198181

199182
It("pod succeeded", func() {
200183
pullPod := v1.Pod{}
184+
micSpec := kmmv1beta1.ModuleImageSpec{
185+
Image: "some test image",
186+
}
201187

202188
gomock.InOrder(
203-
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("image 2"),
204-
micHelper.EXPECT().GetModuleImageSpec(&testMic, "image 2").Return(&testMic.Spec.Images[1]),
189+
mockImagePuller.EXPECT().GetPullPodImage(pullPod).Return("some test image"),
190+
micHelper.EXPECT().GetModuleImageSpec(&testMic, "some test image").Return(&micSpec),
205191
mockImagePuller.EXPECT().GetPullPodStatus(&pullPod).Return(pod.PullImageSuccess),
206-
micHelper.EXPECT().SetImageStatus(&testMic, "image 2", kmmv1beta1.ImageExists),
192+
micHelper.EXPECT().SetImageStatus(&testMic, "some test image", kmmv1beta1.ImageExists),
207193
clnt.EXPECT().Status().Return(statusWriter),
208194
statusWriter.EXPECT().Patch(ctx, &testMic, gomock.Any()),
209195
mockImagePuller.EXPECT().DeletePod(ctx, &pullPod).Return(nil),
@@ -351,7 +337,6 @@ var _ = Describe("processImagesSpecs", func() {
351337
Images: []kmmv1beta1.ModuleImageSpec{
352338
{
353339
Image: "image 1",
354-
Build: &kmmv1beta1.Build{},
355340
},
356341
},
357342
},
@@ -361,29 +346,31 @@ var _ = Describe("processImagesSpecs", func() {
361346

362347
ctx := context.Background()
363348
pullPods := []v1.Pod{}
364-
testMic = kmmv1beta1.ModuleImagesConfig{
365-
ObjectMeta: metav1.ObjectMeta{
366-
Name: "some name",
367-
Namespace: "some namespace",
368-
},
369-
Spec: kmmv1beta1.ModuleImagesConfigSpec{
370-
Images: []kmmv1beta1.ModuleImageSpec{
371-
{
372-
Image: "image 1",
373-
},
374-
},
375-
},
376-
}
377349

378-
It("image status empty, pull pod does not exists, need to create a pull pod", func() {
379-
gomock.InOrder(
380-
micHelper.EXPECT().GetImageState(&testMic, "image 1").Return(kmmv1beta1.ImageState("")),
381-
mockImagePuller.EXPECT().GetPullPodForImage(pullPods, "image 1").Return(nil),
382-
mockImagePuller.EXPECT().CreatePullPod(ctx, "some name", "some namespace", "image 1", true, nil, &testMic).Return(nil),
383-
)
384-
err := mrh.processImagesSpecs(ctx, &testMic, pullPods)
385-
Expect(err).To(BeNil())
386-
})
350+
DescribeTable("image status empty, pull pod does not exists, create a pull pod",
351+
func(buildExists, signExists, skipWaitMissingImage, expectedOneTimePodFlag bool) {
352+
if buildExists {
353+
testMic.Spec.Images[0].Build = &kmmv1beta1.Build{}
354+
}
355+
if signExists {
356+
testMic.Spec.Images[0].Sign = &kmmv1beta1.Sign{}
357+
}
358+
testMic.Spec.Images[0].SkipWaitMissingImage = skipWaitMissingImage
359+
gomock.InOrder(
360+
micHelper.EXPECT().GetImageState(&testMic, "image 1").Return(kmmv1beta1.ImageState("")),
361+
mockImagePuller.EXPECT().GetPullPodForImage(pullPods, "image 1").Return(nil),
362+
mockImagePuller.EXPECT().CreatePullPod(ctx, "some name", "some namespace", "image 1", expectedOneTimePodFlag, nil, &testMic).Return(nil),
363+
)
364+
err := mrh.processImagesSpecs(ctx, &testMic, pullPods)
365+
Expect(err).To(BeNil())
366+
},
367+
Entry("build exists, sign missing, skipWait false, expectedFlag true", true, false, false, true),
368+
Entry("build missing, sign exists, skipWait false, expectedFlag true", false, true, false, true),
369+
Entry("build missing, sign missing, skipWait true, expectedFlag true", false, false, true, true),
370+
Entry("build exists, sign exists, skipWait false, expectedFlag true", true, true, false, true),
371+
Entry("build exists, sign exists, skipWait true, expectedFlag true", true, true, true, true),
372+
Entry("build missing, sign missing, skipWait false, expectedFlag false", false, false, false, false),
373+
)
387374

388375
It("image status empty, pull pod exists, nothing to do", func() {
389376
gomock.InOrder(

0 commit comments

Comments
 (0)