Skip to content

Commit 7077d9a

Browse files
committed
Adding ModuleImagesConfig funtionality.
The `Module` reconciler will now generate and update `ModuleImagesConfig`s objects in the cluster. At this point, those objects aren't reconciled by any controller but they will in the upcoming commits. Signed-off-by: Yoni Bettan <yonibettan@gmail.com>
1 parent 82f26bf commit 7077d9a

File tree

12 files changed

+612
-17
lines changed

12 files changed

+612
-17
lines changed

cmd/manager/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"os"
2323
"strconv"
2424

25+
"github.com/kubernetes-sigs/kernel-module-management/internal/mic"
2526
"github.com/kubernetes-sigs/kernel-module-management/internal/node"
2627

2728
"github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
@@ -122,6 +123,7 @@ func main() {
122123
buildHelperAPI := build.NewHelper()
123124
nodeAPI := node.NewNode(client)
124125
kernelAPI := module.NewKernelMapper(buildHelperAPI, sign.NewSignerHelper())
126+
micAPI := mic.NewModuleImagesConfigAPI(client, scheme)
125127

126128
dpc := controllers.NewDevicePluginReconciler(
127129
client,
@@ -140,6 +142,7 @@ func main() {
140142
nmcHelper,
141143
filterAPI,
142144
nodeAPI,
145+
micAPI,
143146
scheme,
144147
)
145148
if err = mnc.SetupWithManager(mgr); err != nil {

config/rbac/role.yaml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,33 +68,34 @@ rules:
6868
- apiGroups:
6969
- kmm.sigs.x-k8s.io
7070
resources:
71-
- modules
71+
- moduleimagesconfigs
72+
- nodemodulesconfigs
7273
verbs:
74+
- create
75+
- delete
7376
- get
7477
- list
7578
- patch
76-
- update
7779
- watch
7880
- apiGroups:
7981
- kmm.sigs.x-k8s.io
8082
resources:
81-
- modules/status
82-
- preflightvalidations/status
83+
- modules
8384
verbs:
8485
- get
86+
- list
8587
- patch
8688
- update
89+
- watch
8790
- apiGroups:
8891
- kmm.sigs.x-k8s.io
8992
resources:
90-
- nodemodulesconfigs
93+
- modules/status
94+
- preflightvalidations/status
9195
verbs:
92-
- create
93-
- delete
9496
- get
95-
- list
9697
- patch
97-
- watch
98+
- update
9899
- apiGroups:
99100
- kmm.sigs.x-k8s.io
100101
resources:

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ toolchain go1.23.4
66

77
require (
88
github.com/a8m/envsubst v1.4.2
9+
github.com/apex/log v1.9.0
910
github.com/budougumi0617/cmpmock v0.1.1
1011
github.com/go-logr/logr v1.4.2
1112
github.com/google/go-cmp v0.6.0

go.sum

Lines changed: 51 additions & 0 deletions
Large diffs are not rendered by default.

internal/controllers/mock_module_reconciler.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/controllers/module_reconciler.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3840
const (
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

5760
func 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+
318368
func (mrh *moduleReconcilerHelper) enableModuleOnNode(ctx context.Context, mld *api.ModuleLoaderData, node *v1.Node) error {
319369
logger := log.FromContext(ctx)
320370

0 commit comments

Comments
 (0)