Skip to content

Commit 058e80c

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 ee64914 commit 058e80c

9 files changed

+664
-601
lines changed

controllers/module_reconciler.go

+29-1
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,8 +234,14 @@ 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

233-
// [TODO] check access to the image - execute build only if needed (image is inaccessible)
234245
logger := log.FromContext(ctx).WithValues("kernel version", kernelVersion, "image", km.ContainerImage)
235246
buildCtx := log.IntoContext(ctx, logger)
236247

@@ -249,6 +260,23 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
249260
return buildRes.Requeue, nil
250261
}
251262

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

0 commit comments

Comments
 (0)