Skip to content

Commit 071840d

Browse files
Separate in-cluster build and image existence verification (#33)
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 071840d

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)