@@ -12,6 +12,7 @@ import (
1212 "github.com/kubernetes-sigs/kernel-module-management/internal/constants"
1313 "github.com/kubernetes-sigs/kernel-module-management/internal/filter"
1414 "github.com/kubernetes-sigs/kernel-module-management/internal/meta"
15+ "github.com/kubernetes-sigs/kernel-module-management/internal/mic"
1516 "github.com/kubernetes-sigs/kernel-module-management/internal/module"
1617 "github.com/kubernetes-sigs/kernel-module-management/internal/nmc"
1718 "github.com/kubernetes-sigs/kernel-module-management/internal/node"
@@ -34,6 +35,7 @@ import (
3435//+kubebuilder:rbac:groups="core",resources=namespaces,verbs=get;list;patch;watch
3536//+kubebuilder:rbac:groups="core",resources=nodes,verbs=get;watch
3637//+kubebuilder:rbac:groups=kmm.sigs.x-k8s.io,resources=nodemodulesconfigs,verbs=get;list;watch;patch;create;delete
38+ //+kubebuilder:rbac:groups=kmm.sigs.x-k8s.io,resources=moduleimagesconfigs,verbs=get;list;watch;patch;create;delete
3739
3840const (
3941 ModuleReconcilerName = "ModuleReconciler"
@@ -52,6 +54,7 @@ type ModuleReconciler struct {
5254 nsLabeler namespaceLabeler
5355 reconHelper moduleReconcilerHelperAPI
5456 nodeAPI node.Node
57+ micAPI mic.MIC
5558}
5659
5760func NewModuleReconciler (client client.Client ,
@@ -60,8 +63,9 @@ func NewModuleReconciler(client client.Client,
6063 nmcHelper nmc.Helper ,
6164 filter * filter.Filter ,
6265 nodeAPI node.Node ,
66+ micAPI mic.MIC ,
6367 scheme * runtime.Scheme ) * ModuleReconciler {
64- reconHelper := newModuleReconcilerHelper (client , kernelAPI , registryAPI , nmcHelper , scheme )
68+ reconHelper := newModuleReconcilerHelper (client , kernelAPI , registryAPI , micAPI , nmcHelper , scheme )
6569 return & ModuleReconciler {
6670 filter : filter ,
6771 nsLabeler : newNamespaceLabeler (client ),
@@ -103,6 +107,10 @@ func (mr *ModuleReconciler) Reconcile(ctx context.Context, mod *kmmv1beta1.Modul
103107 return ctrl.Result {}, fmt .Errorf ("failed to get list of nodes by selector: %v" , err )
104108 }
105109
110+ if err := mr .reconHelper .handleMIC (ctx , mod , targetedNodes ); err != nil {
111+ return ctrl.Result {}, fmt .Errorf ("failed to handle MIC: %v" , err )
112+ }
113+
106114 currentNMCs , err := mr .reconHelper .getNMCsByModuleSet (ctx , mod )
107115 if err != nil {
108116 return ctrl.Result {}, fmt .Errorf ("failed to get NMCs for Module %s/%s: %v" , mod .Namespace , mod .Name , err )
@@ -137,6 +145,7 @@ func (mr *ModuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
137145 NewControllerManagedBy (mgr ).
138146 For (& kmmv1beta1.Module {}).
139147 Owns (& v1.Pod {}, builder .WithPredicates (filter .ModuleReconcilePodPredicate ())).
148+ Owns (& kmmv1beta1.ModuleImagesConfig {}, builder .WithPredicates (filter .ModuleReconcileMICPredicate ())).
140149 Watches (
141150 & v1.Node {},
142151 handler .EnqueueRequestsFromMapFunc (mr .filter .FindModulesForNMCNodeChange ),
@@ -157,6 +166,7 @@ func (mr *ModuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
157166//go:generate mockgen -source=module_reconciler.go -package=controllers -destination=mock_module_reconciler.go moduleReconcilerHelperAPI,namespaceLabeler
158167
159168type moduleReconcilerHelperAPI interface {
169+ handleMIC (ctx context.Context , mod * kmmv1beta1.Module , nodes []v1.Node ) error
160170 setFinalizerAndStatus (ctx context.Context , mod * kmmv1beta1.Module ) error
161171 finalizeModule (ctx context.Context , mod * kmmv1beta1.Module ) error
162172 getNMCsByModuleSet (ctx context.Context , mod * kmmv1beta1.Module ) (sets.Set [string ], error )
@@ -170,6 +180,7 @@ type moduleReconcilerHelper struct {
170180 client client.Client
171181 kernelAPI module.KernelMapper
172182 registryAPI registry.Registry
183+ micAPI mic.MIC
173184 nmcHelper nmc.Helper
174185 scheme * runtime.Scheme
175186}
@@ -178,12 +189,14 @@ func newModuleReconcilerHelper(
178189 client client.Client ,
179190 kernelAPI module.KernelMapper ,
180191 registryAPI registry.Registry ,
192+ micAPI mic.MIC ,
181193 nmcHelper nmc.Helper ,
182194 scheme * runtime.Scheme ) moduleReconcilerHelperAPI {
183195 return & moduleReconcilerHelper {
184196 client : client ,
185197 kernelAPI : kernelAPI ,
186198 registryAPI : registryAPI ,
199+ micAPI : micAPI ,
187200 nmcHelper : nmcHelper ,
188201 scheme : scheme ,
189202 }
@@ -315,6 +328,41 @@ func (mrh *moduleReconcilerHelper) prepareSchedulingData(ctx context.Context,
315328 return result , errs
316329}
317330
331+ func (mrh * moduleReconcilerHelper ) handleMIC (ctx context.Context , mod * kmmv1beta1.Module , targetedNodes []v1.Node ) error {
332+
333+ var (
334+ logger = log .FromContext (ctx )
335+ images []kmmv1beta1.ModuleImageSpec
336+ errs []error
337+ )
338+
339+ for _ , node := range targetedNodes {
340+ kernelVersion := strings .TrimSuffix (node .Status .NodeInfo .KernelVersion , "+" )
341+ mld , err := mrh .kernelAPI .GetModuleLoaderDataForKernel (mod , kernelVersion )
342+ if err != nil {
343+ if ! errors .Is (err , module .ErrNoMatchingKernelMapping ) {
344+ logger .Info (utils .WarnString (fmt .Sprintf ("internal errors while fetching kernel mapping for kernel %s: %v" ,
345+ kernelVersion , err )))
346+ errs = append (errs , fmt .Errorf ("failed to get moduleLoaderData for kernel %s: %v" , kernelVersion , err ))
347+ }
348+ // node is not targeted by module
349+ continue
350+ }
351+ mis := kmmv1beta1.ModuleImageSpec {
352+ Image : mld .ContainerImage ,
353+ Build : mld .Build ,
354+ Sign : mld .Sign ,
355+ }
356+ images = append (images , mis )
357+ }
358+
359+ if err := mrh .micAPI .ApplyMIC (ctx , mod .Name , mod .Namespace , images , mod .Spec .ImageRepoSecret , mod ); err != nil {
360+ errs = append (errs , fmt .Errorf ("failed to apply %s/%s MIC: %v" , mod .Namespace , mod .Name , err ))
361+ }
362+
363+ return errors .Join (errs ... )
364+ }
365+
318366func (mrh * moduleReconcilerHelper ) enableModuleOnNode (ctx context.Context , mld * api.ModuleLoaderData , node * v1.Node ) error {
319367 logger := log .FromContext (ctx )
320368
0 commit comments