@@ -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.ModuleImagesConfigAPI
5558}
5659
5760func NewModuleReconciler (client client.Client ,
@@ -60,13 +63,15 @@ func NewModuleReconciler(client client.Client,
6063 nmcHelper nmc.Helper ,
6164 filter * filter.Filter ,
6265 nodeAPI node.Node ,
66+ micAPI mic.ModuleImagesConfigAPI ,
6367 scheme * runtime.Scheme ) * ModuleReconciler {
6468 reconHelper := newModuleReconcilerHelper (client , kernelAPI , registryAPI , nmcHelper , scheme )
6569 return & ModuleReconciler {
6670 filter : filter ,
6771 nsLabeler : newNamespaceLabeler (client ),
6872 reconHelper : reconHelper ,
6973 nodeAPI : nodeAPI ,
74+ micAPI : micAPI ,
7075 }
7176}
7277
@@ -103,6 +108,18 @@ func (mr *ModuleReconciler) Reconcile(ctx context.Context, mod *kmmv1beta1.Modul
103108 return ctrl.Result {}, fmt .Errorf ("failed to get list of nodes by selector: %v" , err )
104109 }
105110
111+ images , err := mr .reconHelper .prepareImages (ctx , mod , targetedNodes )
112+ if err != nil {
113+ return ctrl.Result {}, fmt .Errorf ("failed to prepare moduleImagesConfig's images for module %s/%s: %v" ,
114+ mod .Namespace , mod .Name , err )
115+ }
116+
117+ if err := mr .micAPI .HandleModuleImagesConfig (ctx , mod .Name , mod .Namespace , images ,
118+ mod .Spec .ImageRepoSecret , mod ); err != nil {
119+
120+ return ctrl.Result {}, fmt .Errorf ("failed to handle moduleImagesConfig for module %s/%s: %v" , mod .Namespace , mod .Name , err )
121+ }
122+
106123 currentNMCs , err := mr .reconHelper .getNMCsByModuleSet (ctx , mod )
107124 if err != nil {
108125 return ctrl.Result {}, fmt .Errorf ("failed to get NMCs for Module %s/%s: %v" , mod .Namespace , mod .Name , err )
@@ -137,6 +154,7 @@ func (mr *ModuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
137154 NewControllerManagedBy (mgr ).
138155 For (& kmmv1beta1.Module {}).
139156 Owns (& v1.Pod {}, builder .WithPredicates (filter .ModuleReconcilePodPredicate ())).
157+ Owns (& kmmv1beta1.ModuleImagesConfig {}, builder .WithPredicates (filter .ModuleReconcileMICPredicate ())).
140158 Watches (
141159 & v1.Node {},
142160 handler .EnqueueRequestsFromMapFunc (mr .filter .FindModulesForNMCNodeChange ),
@@ -161,6 +179,7 @@ type moduleReconcilerHelperAPI interface {
161179 finalizeModule (ctx context.Context , mod * kmmv1beta1.Module ) error
162180 getNMCsByModuleSet (ctx context.Context , mod * kmmv1beta1.Module ) (sets.Set [string ], error )
163181 prepareSchedulingData (ctx context.Context , mod * kmmv1beta1.Module , targetedNodes []v1.Node , currentNMCs sets.Set [string ]) (map [string ]schedulingData , []error )
182+ prepareImages (ctx context.Context , mod * kmmv1beta1.Module , targetedNodes []v1.Node ) ([]kmmv1beta1.ModuleImageSpec , error )
164183 enableModuleOnNode (ctx context.Context , mld * api.ModuleLoaderData , node * v1.Node ) error
165184 disableModuleOnNode (ctx context.Context , modNamespace , modName , nodeName string ) error
166185 moduleUpdateWorkerPodsStatus (ctx context.Context , mod * kmmv1beta1.Module , targetedNodes []v1.Node ) error
@@ -315,6 +334,37 @@ func (mrh *moduleReconcilerHelper) prepareSchedulingData(ctx context.Context,
315334 return result , errs
316335}
317336
337+ func (mrh * moduleReconcilerHelper ) prepareImages (ctx context.Context , mod * kmmv1beta1.Module ,
338+ targetedNodes []v1.Node ) ([]kmmv1beta1.ModuleImageSpec , error ) {
339+
340+ var (
341+ res []kmmv1beta1.ModuleImageSpec
342+ errs []error
343+ logger = log .FromContext (ctx )
344+ )
345+ for _ , node := range targetedNodes {
346+ kernelVersion := strings .TrimSuffix (node .Status .NodeInfo .KernelVersion , "+" )
347+ mld , err := mrh .kernelAPI .GetModuleLoaderDataForKernel (mod , kernelVersion )
348+ if err != nil {
349+ if ! errors .Is (err , module .ErrNoMatchingKernelMapping ) {
350+ logger .Info (utils .WarnString (fmt .Sprintf ("internal errors while fetching kernel mapping for kernel %s: %v" ,
351+ kernelVersion , err )))
352+ errs = append (errs , fmt .Errorf ("failed to get moduleLoaderData for kernel %s: %v" , kernelVersion , err ))
353+ }
354+ // node is not targeted by module
355+ continue
356+ }
357+ mis := kmmv1beta1.ModuleImageSpec {
358+ Image : mld .ContainerImage ,
359+ Build : mld .Build ,
360+ Sign : mld .Sign ,
361+ }
362+ res = append (res , mis )
363+ }
364+
365+ return res , errors .Join (errs ... )
366+ }
367+
318368func (mrh * moduleReconcilerHelper ) enableModuleOnNode (ctx context.Context , mld * api.ModuleLoaderData , node * v1.Node ) error {
319369 logger := log .FromContext (ctx )
320370
0 commit comments