Skip to content

Commit 02a50fb

Browse files
Separate in-cluster build and image existence verification
This PR removes the image existance verification from Sync API of the build package and moves it into the handleBuild function of the module reconcilier(prior to calling the Sync API)
1 parent 1b7f0b3 commit 02a50fb

File tree

7 files changed

+663
-575
lines changed

7 files changed

+663
-575
lines changed

controllers/module_reconciler.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ import (
2121
"fmt"
2222

2323
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
24+
"github.com/kubernetes-sigs/kernel-module-management/internal/auth"
2425
"github.com/kubernetes-sigs/kernel-module-management/internal/build"
2526
"github.com/kubernetes-sigs/kernel-module-management/internal/daemonset"
2627
"github.com/kubernetes-sigs/kernel-module-management/internal/filter"
2728
"github.com/kubernetes-sigs/kernel-module-management/internal/metrics"
2829
"github.com/kubernetes-sigs/kernel-module-management/internal/module"
30+
"github.com/kubernetes-sigs/kernel-module-management/internal/registry"
2931
"github.com/kubernetes-sigs/kernel-module-management/internal/statusupdater"
3032
appsv1 "k8s.io/api/apps/v1"
3133
batchv1 "k8s.io/api/batch/v1"
@@ -52,6 +54,7 @@ type ModuleReconciler struct {
5254
daemonAPI daemonset.DaemonSetCreator
5355
kernelAPI module.KernelMapper
5456
metricsAPI metrics.Metrics
57+
registry registry.Registry
5558
filter *filter.Filter
5659
statusUpdaterAPI statusupdater.ModuleStatusUpdater
5760
}
@@ -63,6 +66,7 @@ func NewModuleReconciler(
6366
kernelAPI module.KernelMapper,
6467
metricsAPI metrics.Metrics,
6568
filter *filter.Filter,
69+
registry registry.Registry,
6670
statusUpdaterAPI statusupdater.ModuleStatusUpdater) *ModuleReconciler {
6771
return &ModuleReconciler{
6872
Client: client,
@@ -71,6 +75,7 @@ func NewModuleReconciler(
7175
kernelAPI: kernelAPI,
7276
metricsAPI: metricsAPI,
7377
filter: filter,
78+
registry: registry,
7479
statusUpdaterAPI: statusUpdaterAPI,
7580
}
7681
}
@@ -229,6 +234,13 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
229234
if mod.Spec.ModuleLoader.Container.Build == nil && km.Build == nil {
230235
return false, nil
231236
}
237+
exists, err := r.checkImageExists(ctx, mod, km)
238+
if err != nil {
239+
return false, fmt.Errorf("failed to check image existence for kernel %s: %w", kernelVersion, err)
240+
}
241+
if exists {
242+
return false, nil
243+
}
232244

233245
// [TODO] check access to the image - execute build only if needed (image is inaccessible)
234246
logger := log.FromContext(ctx).WithValues("kernel version", kernelVersion, "image", km.ContainerImage)
@@ -249,6 +261,23 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
249261
return buildRes.Requeue, nil
250262
}
251263

264+
func (r *ModuleReconciler) checkImageExists(ctx context.Context, mod *kmmv1beta1.Module, km *kmmv1beta1.KernelMapping) (bool, error) {
265+
var registryAuthGetter auth.RegistryAuthGetter
266+
if irs := mod.Spec.ImageRepoSecret; irs != nil {
267+
namespacedName := types.NamespacedName{
268+
Name: irs.Name,
269+
Namespace: mod.Namespace,
270+
}
271+
registryAuthGetter = auth.NewRegistryAuthGetter(r.Client, namespacedName)
272+
}
273+
pullOptions := module.GetRelevantPullOptions(mod, km)
274+
imageAvailable, err := r.registry.ImageExists(ctx, km.ContainerImage, pullOptions, registryAuthGetter)
275+
if err != nil {
276+
return false, fmt.Errorf("could not check if the image is available: %v", err)
277+
}
278+
return imageAvailable, nil
279+
}
280+
252281
func (r *ModuleReconciler) handleDriverContainer(ctx context.Context,
253282
mod *kmmv1beta1.Module,
254283
km *kmmv1beta1.KernelMapping,

0 commit comments

Comments
 (0)