@@ -21,11 +21,13 @@ import (
21
21
"fmt"
22
22
23
23
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
24
+ "github.com/kubernetes-sigs/kernel-module-management/internal/auth"
24
25
"github.com/kubernetes-sigs/kernel-module-management/internal/build"
25
26
"github.com/kubernetes-sigs/kernel-module-management/internal/daemonset"
26
27
"github.com/kubernetes-sigs/kernel-module-management/internal/filter"
27
28
"github.com/kubernetes-sigs/kernel-module-management/internal/metrics"
28
29
"github.com/kubernetes-sigs/kernel-module-management/internal/module"
30
+ "github.com/kubernetes-sigs/kernel-module-management/internal/registry"
29
31
"github.com/kubernetes-sigs/kernel-module-management/internal/statusupdater"
30
32
appsv1 "k8s.io/api/apps/v1"
31
33
batchv1 "k8s.io/api/batch/v1"
@@ -52,6 +54,7 @@ type ModuleReconciler struct {
52
54
daemonAPI daemonset.DaemonSetCreator
53
55
kernelAPI module.KernelMapper
54
56
metricsAPI metrics.Metrics
57
+ registry registry.Registry
55
58
filter * filter.Filter
56
59
statusUpdaterAPI statusupdater.ModuleStatusUpdater
57
60
}
@@ -63,6 +66,7 @@ func NewModuleReconciler(
63
66
kernelAPI module.KernelMapper ,
64
67
metricsAPI metrics.Metrics ,
65
68
filter * filter.Filter ,
69
+ registry registry.Registry ,
66
70
statusUpdaterAPI statusupdater.ModuleStatusUpdater ) * ModuleReconciler {
67
71
return & ModuleReconciler {
68
72
Client : client ,
@@ -71,6 +75,7 @@ func NewModuleReconciler(
71
75
kernelAPI : kernelAPI ,
72
76
metricsAPI : metricsAPI ,
73
77
filter : filter ,
78
+ registry : registry ,
74
79
statusUpdaterAPI : statusUpdaterAPI ,
75
80
}
76
81
}
@@ -229,8 +234,14 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
229
234
if mod .Spec .ModuleLoader .Container .Build == nil && km .Build == nil {
230
235
return false , nil
231
236
}
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
+ }
232
244
233
- // [TODO] check access to the image - execute build only if needed (image is inaccessible)
234
245
logger := log .FromContext (ctx ).WithValues ("kernel version" , kernelVersion , "image" , km .ContainerImage )
235
246
buildCtx := log .IntoContext (ctx , logger )
236
247
@@ -249,6 +260,23 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
249
260
return buildRes .Requeue , nil
250
261
}
251
262
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
+
252
280
func (r * ModuleReconciler ) handleDriverContainer (ctx context.Context ,
253
281
mod * kmmv1beta1.Module ,
254
282
km * kmmv1beta1.KernelMapping ,
0 commit comments