@@ -18,9 +18,10 @@ package webhook
1818
1919import (
2020 "context"
21- v1 "k8s.io/api/core/v1"
2221 "strings"
2322
23+ v1 "k8s.io/api/core/v1"
24+
2425 kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
2526 "github.com/kubernetes-sigs/kernel-module-management/internal/utils"
2627 . "github.com/onsi/ginkgo/v2"
@@ -232,6 +233,25 @@ var _ = Describe("validateModuleLoaderContainerSpec", func() {
232233 )
233234 })
234235
236+ It ("should fail when a kernel-mapping has invalid Build specification" , func () {
237+ containerSpec := kmmv1beta1.ModuleLoaderContainerSpec {
238+ KernelMappings : []kmmv1beta1.KernelMapping {
239+ {
240+ Regexp : "^valid-regexp$" ,
241+ ContainerImage : "image-url" ,
242+ Build : & kmmv1beta1.Build {
243+ DockerfileOCIArtifact : "registry.example.com/dockerfile:latest" ,
244+ DockerfileConfigMap : & v1.LocalObjectReference {Name : "dockerfile-configmap" },
245+ },
246+ },
247+ },
248+ }
249+
250+ Expect (
251+ validateModuleLoaderContainerSpec (containerSpec ),
252+ ).To (HaveOccurred ())
253+ })
254+
235255 DescribeTable ("should fail when InTreeModulesToRemove and InTreeModuleToRemove both defined" ,
236256 func (inTreeModulesInContainer , inTreeModuleInContainer , inTreeModulesInKM , inTreeModuleInKM bool ) {
237257 containerSpec := kmmv1beta1.ModuleLoaderContainerSpec {}
@@ -262,6 +282,80 @@ var _ = Describe("validateModuleLoaderContainerSpec", func() {
262282
263283})
264284
285+ var _ = Describe ("validateModuleLoaderContainerBuildSpec" , func () {
286+ It ("should return nil when build is nil" , func () {
287+ Expect (validateModuleLoaderContainerBuildSpec (nil )).NotTo (HaveOccurred ())
288+ })
289+
290+ It ("should pass when only DockerfileOCIArtifact is set with valid image format" , func () {
291+ build := & kmmv1beta1.Build {
292+ DockerfileOCIArtifact : "registry.example.com/dockerfile:latest" ,
293+ }
294+ Expect (validateModuleLoaderContainerBuildSpec (build )).NotTo (HaveOccurred ())
295+ })
296+
297+ It ("should pass when only DockerfileConfigMap is set" , func () {
298+ build := & kmmv1beta1.Build {
299+ DockerfileConfigMap : & v1.LocalObjectReference {
300+ Name : "dockerfile-configmap" ,
301+ },
302+ }
303+ Expect (validateModuleLoaderContainerBuildSpec (build )).NotTo (HaveOccurred ())
304+ })
305+
306+ It ("should fail when both DockerfileOCIArtifact and DockerfileConfigMap are set" , func () {
307+ build := & kmmv1beta1.Build {
308+ DockerfileOCIArtifact : "registry.example.com/dockerfile:latest" ,
309+ DockerfileConfigMap : & v1.LocalObjectReference {
310+ Name : "dockerfile-configmap" ,
311+ },
312+ }
313+ Expect (validateModuleLoaderContainerBuildSpec (build )).To (
314+ MatchError (ContainSubstring ("only one of the Dockerfile fields: DockerfileOCIArtifact or DockerfileConfigMap can be defined" )),
315+ )
316+ })
317+
318+ It ("should fail when neither DockerfileOCIArtifact nor DockerfileConfigMap is set" , func () {
319+ build := & kmmv1beta1.Build {}
320+ Expect (validateModuleLoaderContainerBuildSpec (build )).To (
321+ MatchError (ContainSubstring ("one of the Dockerfile fields: DockerfileOCIArtifact or DockerfileConfigMap must be defined" )),
322+ )
323+ })
324+
325+ It ("should fail when DockerfileOCIArtifact has invalid image format" , func () {
326+ build := & kmmv1beta1.Build {
327+ DockerfileOCIArtifact : "invalid-image-format" ,
328+ }
329+ Expect (validateModuleLoaderContainerBuildSpec (build )).To (
330+ MatchError (ContainSubstring ("container image must explicitely set a tag or digest" )),
331+ )
332+ })
333+
334+ It ("should pass when DockerfileOCIArtifact has valid image format with tag" , func () {
335+ build := & kmmv1beta1.Build {
336+ DockerfileOCIArtifact : "registry.example.com/dockerfile:v1.0.0" ,
337+ }
338+ Expect (validateModuleLoaderContainerBuildSpec (build )).NotTo (HaveOccurred ())
339+ })
340+
341+ It ("should pass when DockerfileOCIArtifact has valid image format with digest" , func () {
342+ build := & kmmv1beta1.Build {
343+ DockerfileOCIArtifact : "registry.example.com/dockerfile@sha256:1234567890abcdef" ,
344+ }
345+ Expect (validateModuleLoaderContainerBuildSpec (build )).NotTo (HaveOccurred ())
346+ })
347+
348+ It ("should fail when DockerfileOCIArtifact is empty string and DockerfileConfigMap is nil" , func () {
349+ build := & kmmv1beta1.Build {
350+ DockerfileOCIArtifact : "" ,
351+ DockerfileConfigMap : nil ,
352+ }
353+ Expect (validateModuleLoaderContainerBuildSpec (build )).To (
354+ MatchError (ContainSubstring ("one of the Dockerfile fields: DockerfileOCIArtifact or DockerfileConfigMap must be defined" )),
355+ )
356+ })
357+ })
358+
265359var _ = Describe ("validateModprobe" , func () {
266360 It ("should fail when moduleName and rawArgs are missing" , func () {
267361 Expect (
0 commit comments