Skip to content

Commit 19408a6

Browse files
ybettank8s-ci-robot
authored andcommitted
Start using MIC status to check if an image exists.
Now that the MIC object is being reconciled correctly then we can start using the MIC.status in order to check if an image exists instead of using an explicit HTTP request from the controller container. Signed-off-by: Yoni Bettan <[email protected]>
1 parent 4e618b5 commit 19408a6

File tree

5 files changed

+104
-27
lines changed

5 files changed

+104
-27
lines changed

internal/controllers/module_reconciler.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -365,18 +365,19 @@ func (mrh *moduleReconcilerHelper) handleMIC(ctx context.Context, mod *kmmv1beta
365365
}
366366

367367
func (mrh *moduleReconcilerHelper) enableModuleOnNode(ctx context.Context, mld *api.ModuleLoaderData, node *v1.Node) error {
368+
368369
logger := log.FromContext(ctx)
369370

370-
if module.ShouldBeBuilt(mld) || module.ShouldBeSigned(mld) {
371-
exists, err := module.ImageExists(ctx, mrh.client, mrh.registryAPI, mld, mld.Namespace, mld.ContainerImage)
372-
if err != nil {
373-
return fmt.Errorf("failed to verify that image %s exists: %v", mld.ContainerImage, err)
374-
}
375-
if !exists {
376-
// skip updating NMC, reconciliation will kick in once the build pod is completed
377-
logger.V(1).Info("Image does not exist, not adding to NMC", "nmc name", node.Name, "container image", mld.ContainerImage)
378-
return nil
379-
}
371+
micObj, err := mrh.micAPI.Get(ctx, mld.Name, mld.Namespace)
372+
if err != nil {
373+
return fmt.Errorf("failed to get moduleImagesConfig %s: %v", mld.Name, err)
374+
}
375+
376+
imageStatus := mrh.micAPI.GetImageState(micObj, mld.ContainerImage)
377+
if imageStatus != kmmv1beta1.ImageExists {
378+
// skip updating NMC, reconciliation will kick in once the build pod is completed
379+
logger.V(1).Info("Image does not exist, not adding to NMC", "nmc name", node.Name, "container image", mld.ContainerImage)
380+
return nil
380381
}
381382

382383
moduleConfig := kmmv1beta1.ModuleConfig{

internal/controllers/module_reconciler_test.go

+22-16
Original file line numberDiff line numberDiff line change
@@ -717,13 +717,15 @@ var _ = Describe("enableModuleOnNode", func() {
717717
const (
718718
moduleNamespace = "moduleNamespace"
719719
moduleName = "moduleName"
720+
containerImage = "containerImage"
720721
)
721722

722723
var (
723724
ctx context.Context
724725
ctrl *gomock.Controller
725726
clnt *client.MockClient
726727
rgst *registry.MockRegistry
728+
mockMIC *mic.MockMIC
727729
mrh moduleReconcilerHelperAPI
728730
helper *nmc.MockHelper
729731
mld *api.ModuleLoaderData
@@ -737,7 +739,8 @@ var _ = Describe("enableModuleOnNode", func() {
737739
clnt = client.NewMockClient(ctrl)
738740
helper = nmc.NewMockHelper(ctrl)
739741
rgst = registry.NewMockRegistry(ctrl)
740-
mrh = newModuleReconcilerHelper(clnt, nil, rgst, nil, helper, scheme)
742+
mockMIC = mic.NewMockMIC(ctrl)
743+
mrh = newModuleReconcilerHelper(clnt, nil, rgst, mockMIC, helper, scheme)
741744
node = v1.Node{
742745
ObjectMeta: metav1.ObjectMeta{Name: "nodeName"},
743746
}
@@ -748,7 +751,7 @@ var _ = Describe("enableModuleOnNode", func() {
748751
Name: moduleName,
749752
Namespace: moduleNamespace,
750753
InTreeModulesToRemove: []string{"InTreeModuleToRemove"},
751-
ContainerImage: "containerImage",
754+
ContainerImage: containerImage,
752755
}
753756

754757
expectedModuleConfig = &kmmv1beta1.ModuleConfig{
@@ -759,25 +762,24 @@ var _ = Describe("enableModuleOnNode", func() {
759762
}
760763
})
761764

762-
It("Build configured and image does not exist", func() {
763-
mld.Build = &kmmv1beta1.Build{}
764-
rgst.EXPECT().ImageExists(ctx, mld.ContainerImage, gomock.Any(), gomock.Any()).Return(false, nil)
765-
err := mrh.enableModuleOnNode(ctx, mld, &node)
766-
Expect(err).NotTo(HaveOccurred())
767-
})
765+
It("should fail if we failed to get MIC", func() {
766+
767+
mockMIC.EXPECT().Get(ctx, moduleName, moduleNamespace).Return(nil, errors.New("some error"))
768768

769-
It("Sign configured and image does not exist", func() {
770-
mld.Sign = &kmmv1beta1.Sign{}
771-
rgst.EXPECT().ImageExists(ctx, mld.ContainerImage, gomock.Any(), gomock.Any()).Return(false, nil)
772769
err := mrh.enableModuleOnNode(ctx, mld, &node)
773-
Expect(err).NotTo(HaveOccurred())
770+
Expect(err).To(HaveOccurred())
771+
Expect(err.Error()).To(ContainSubstring("failed to get moduleImagesConfig"))
774772
})
775773

776-
It("Build configured and failed to check if image exists", func() {
777-
mld.Build = &kmmv1beta1.Build{}
778-
rgst.EXPECT().ImageExists(ctx, mld.ContainerImage, gomock.Any(), gomock.Any()).Return(false, fmt.Errorf("some error"))
774+
It("should do nothing if the image doesn't exist", func() {
775+
776+
gomock.InOrder(
777+
mockMIC.EXPECT().Get(ctx, moduleName, moduleNamespace).Return(&kmmv1beta1.ModuleImagesConfig{}, nil),
778+
mockMIC.EXPECT().GetImageState(gomock.Any(), containerImage).Return(kmmv1beta1.ImageDoesNotExist),
779+
)
780+
779781
err := mrh.enableModuleOnNode(ctx, mld, &node)
780-
Expect(err).To(HaveOccurred())
782+
Expect(err).NotTo(HaveOccurred())
781783
})
782784

783785
It("NMC does not exists", func() {
@@ -786,6 +788,8 @@ var _ = Describe("enableModuleOnNode", func() {
786788
}
787789

788790
gomock.InOrder(
791+
mockMIC.EXPECT().Get(ctx, moduleName, moduleNamespace).Return(&kmmv1beta1.ModuleImagesConfig{}, nil),
792+
mockMIC.EXPECT().GetImageState(gomock.Any(), containerImage).Return(kmmv1beta1.ImageExists),
789793
clnt.EXPECT().Get(ctx, gomock.Any(), gomock.Any()).Return(apierrors.NewNotFound(schema.GroupResource{}, "whatever")),
790794
helper.EXPECT().SetModuleConfig(nmc, mld, expectedModuleConfig).Return(nil),
791795
clnt.EXPECT().Create(ctx, gomock.Any()).Return(nil),
@@ -813,6 +817,8 @@ var _ = Describe("enableModuleOnNode", func() {
813817
)
814818

815819
gomock.InOrder(
820+
mockMIC.EXPECT().Get(ctx, moduleName, moduleNamespace).Return(&kmmv1beta1.ModuleImagesConfig{}, nil),
821+
mockMIC.EXPECT().GetImageState(gomock.Any(), containerImage).Return(kmmv1beta1.ImageExists),
816822
clnt.EXPECT().Get(ctx, gomock.Any(), gomock.Any()).DoAndReturn(
817823
func(_ interface{}, _ interface{}, nmc *kmmv1beta1.NodeModulesConfig, _ ...ctrlclient.GetOption) error {
818824
nmc.SetName(node.Name)

internal/mic/mic.go

+12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
v1 "k8s.io/api/core/v1"
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1010
"k8s.io/apimachinery/pkg/runtime"
11+
"k8s.io/apimachinery/pkg/types"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
1213
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1314
"sigs.k8s.io/controller-runtime/pkg/log"
@@ -18,6 +19,7 @@ import (
1819
type MIC interface {
1920
CreateOrPatch(ctx context.Context, name, ns string, images []kmmv1beta1.ModuleImageSpec,
2021
imageRepoSecret *v1.LocalObjectReference, owner metav1.Object) error
22+
Get(ctx context.Context, name, ns string) (*kmmv1beta1.ModuleImagesConfig, error)
2123
GetModuleImageSpec(micObj *kmmv1beta1.ModuleImagesConfig, image string) *kmmv1beta1.ModuleImageSpec
2224
SetImageStatus(micObj *kmmv1beta1.ModuleImagesConfig, image string, status kmmv1beta1.ImageState)
2325
GetImageState(micObj *kmmv1beta1.ModuleImagesConfig, image string) kmmv1beta1.ImageState
@@ -65,6 +67,16 @@ func (mici *micImpl) CreateOrPatch(ctx context.Context, name, ns string, images
6567
return nil
6668
}
6769

70+
func (mici *micImpl) Get(ctx context.Context, name, ns string) (*kmmv1beta1.ModuleImagesConfig, error) {
71+
72+
var micObj kmmv1beta1.ModuleImagesConfig
73+
if err := mici.client.Get(ctx, types.NamespacedName{Namespace: ns, Name: name}, &micObj); err != nil {
74+
return nil, fmt.Errorf("could not get ModuleImagesConfig %s: %v", name, err)
75+
}
76+
77+
return &micObj, nil
78+
}
79+
6880
func (mici *micImpl) GetModuleImageSpec(micObj *kmmv1beta1.ModuleImagesConfig, image string) *kmmv1beta1.ModuleImageSpec {
6981
for _, imageSpec := range micObj.Spec.Images {
7082
if imageSpec.Image == image {

internal/mic/mic_test.go

+44-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
2020
)
2121

22-
var _ = Describe("ApplyMIC", func() {
22+
var _ = Describe("CreateOrPatch", func() {
2323

2424
const (
2525
micName = "my-name"
@@ -133,6 +133,49 @@ var _ = Describe("ApplyMIC", func() {
133133
})
134134
})
135135

136+
var _ = Describe("Get", func() {
137+
138+
const (
139+
micName = "my-name"
140+
micNamespace = "my-namespace"
141+
)
142+
143+
var (
144+
ctx context.Context
145+
ctrl *gomock.Controller
146+
mockClient *client.MockClient
147+
micAPI MIC
148+
)
149+
150+
BeforeEach(func() {
151+
ctx = context.Background()
152+
ctrl = gomock.NewController(GinkgoT())
153+
mockClient = client.NewMockClient(ctrl)
154+
micAPI = New(mockClient, scheme)
155+
utilruntime.Must(v1beta1.AddToScheme(scheme))
156+
})
157+
158+
It("should fail if we failed to get the MIC", func() {
159+
160+
mockClient.EXPECT().Get(ctx, gomock.Any(), gomock.Any()).Return(fmt.Errorf("some error"))
161+
162+
_, err := micAPI.Get(ctx, micName, micNamespace)
163+
164+
Expect(err).To(HaveOccurred())
165+
Expect(err.Error()).To(ContainSubstring("could not get ModuleImagesConfig"))
166+
})
167+
168+
It("should work as expected", func() {
169+
170+
mockClient.EXPECT().Get(ctx, gomock.Any(), gomock.Any()).Return(nil)
171+
172+
_, err := micAPI.Get(ctx, micName, micNamespace)
173+
174+
Expect(err).NotTo(HaveOccurred())
175+
})
176+
177+
})
178+
136179
var _ = Describe("GetModuleImageSpec", func() {
137180
var (
138181
micAPI MIC

internal/mic/mock_mic.go

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)