Skip to content

Commit 001e0ba

Browse files
ybettank8s-ci-robot
authored andcommitted
Generating ModuleConfigImages objects during Module reconciliation.
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. For this reason, the `Module` controller isn't checking the `MIC`'s status but instead keep checking if images exists using direct HTTP calls. Signed-off-by: Yoni Bettan <[email protected]>
1 parent ff106f6 commit 001e0ba

File tree

6 files changed

+185
-16
lines changed

6 files changed

+185
-16
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:

internal/controllers/mock_module_reconciler.go

Lines changed: 14 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: 49 additions & 1 deletion
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.MIC
5558
}
5659

5760
func 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

159168
type 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+
318366
func (mrh *moduleReconcilerHelper) enableModuleOnNode(ctx context.Context, mld *api.ModuleLoaderData, node *v1.Node) error {
319367
logger := log.FromContext(ctx)
320368

0 commit comments

Comments
 (0)