Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Moving Build Dockerfile to be defined in the ConfigMap #160

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@ jobs:
run: kubectl get all -n kube-system
if: ${{ failure() }}

- name: Add a configmap that contain the kernel module build dockerfile
run: kubectl apply -f ci/kmm-kmod-dockerfile.yaml

- name: Add an kmm-ci Module that contains a valid mapping
run: |
sed -e "s/KVER_CHANGEME/$(uname -r)/g" ci/module-kmm-ci-build.template.yaml | tee module-kmm-ci.yaml
Expand All @@ -374,7 +377,7 @@ jobs:
- name: Wait for the job to be created
run: |
until kubectl get job -l kmm.node.kubernetes.io/module.name | grep kmm; do
sleep 3
sleep 1
done
timeout-minutes: 1

Expand Down
3 changes: 2 additions & 1 deletion api/v1beta1/module_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ type Build struct {
// BuildArgs is an array of build variables that are provided to the image building backend.
BuildArgs []BuildArg `json:"buildArgs"`

Dockerfile string `json:"dockerfile"`
// ConfigMap that holds Dockerfile contents
DockerfileConfigMap *v1.LocalObjectReference `json:"dockerfileConfigMap"`

// +optional
// Pull contains settings determining how to pull the base images of the build process.
Expand Down
5 changes: 5 additions & 0 deletions api/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions ci/kmm-kmod-dockerfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: kmm-kmod-dockerfile
data:
dockerfile: |
FROM registry.minikube/kmm-base:local

ARG CI_BUILD_ARG
ARG KERNEL_VERSION
ARG WITH_DEFAULT_VALUE=default-value

RUN cat /run/secrets/build-secret/ci-build-secret > /ci-build-secret
RUN echo $CI_BUILD_ARG > /build-arg
RUN echo $KERNEL_VERSION > /kernel-version
RUN echo $WITH_DEFAULT_VALUE > /default-value
15 changes: 3 additions & 12 deletions ci/module-kmm-ci-build.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,9 @@ spec:
insecure: true
secrets:
- name: build-secret
dockerfile: |
FROM registry.minikube/kmm-base:local

ARG CI_BUILD_ARG
ARG KERNEL_VERSION
ARG WITH_DEFAULT_VALUE=default-value

RUN cat /run/secrets/build-secret/ci-build-secret > /ci-build-secret
RUN echo $CI_BUILD_ARG > /build-arg
RUN echo $KERNEL_VERSION > /kernel-version
RUN echo $WITH_DEFAULT_VALUE > /default-value

dockerfileConfigMap:
name: kmm-kmod-dockerfile

# Optional. If kanikoParams.tag is empty, the default value will be: 'latest'
kanikoParams:
tag: "debug"
Expand Down
31 changes: 25 additions & 6 deletions config/crd/bases/kmm.sigs.k8s.io_managedclustermodules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1974,8 +1974,17 @@ spec:
- value
type: object
type: array
dockerfile:
type: string
dockerfileConfigMap:
description: ConfigMap that holds Dockerfile contents
properties:
name:
description: 'Name of the referent. More info:
https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
TODO: Add other useful fields. apiVersion, kind,
uid?'
type: string
type: object
x-kubernetes-map-type: atomic
kanikoParams:
description: KanikoParams is used to customize the
building process of the image.
Expand Down Expand Up @@ -2034,7 +2043,7 @@ spec:
x-kubernetes-map-type: atomic
type: array
required:
- dockerfile
- dockerfileConfigMap
type: object
containerImage:
description: ContainerImage is a top-level field
Expand Down Expand Up @@ -2078,8 +2087,18 @@ spec:
- value
type: object
type: array
dockerfile:
type: string
dockerfileConfigMap:
description: ConfigMap that holds Dockerfile
contents
properties:
name:
description: 'Name of the referent. More
info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
TODO: Add other useful fields. apiVersion,
kind, uid?'
type: string
type: object
x-kubernetes-map-type: atomic
kanikoParams:
description: KanikoParams is used to customize
the building process of the image.
Expand Down Expand Up @@ -2141,7 +2160,7 @@ spec:
x-kubernetes-map-type: atomic
type: array
required:
- dockerfile
- dockerfileConfigMap
type: object
containerImage:
description: ContainerImage is the name of the DriverContainer
Expand Down
29 changes: 23 additions & 6 deletions config/crd/bases/kmm.sigs.k8s.io_modules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1890,8 +1890,16 @@ spec:
- value
type: object
type: array
dockerfile:
type: string
dockerfileConfigMap:
description: ConfigMap that holds Dockerfile contents
properties:
name:
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
TODO: Add other useful fields. apiVersion, kind,
uid?'
type: string
type: object
x-kubernetes-map-type: atomic
kanikoParams:
description: KanikoParams is used to customize the building
process of the image.
Expand Down Expand Up @@ -1947,7 +1955,7 @@ spec:
x-kubernetes-map-type: atomic
type: array
required:
- dockerfile
- dockerfileConfigMap
type: object
containerImage:
description: ContainerImage is a top-level field
Expand Down Expand Up @@ -1988,8 +1996,17 @@ spec:
- value
type: object
type: array
dockerfile:
type: string
dockerfileConfigMap:
description: ConfigMap that holds Dockerfile contents
properties:
name:
description: 'Name of the referent. More info:
https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
TODO: Add other useful fields. apiVersion,
kind, uid?'
type: string
type: object
x-kubernetes-map-type: atomic
kanikoParams:
description: KanikoParams is used to customize the
building process of the image.
Expand Down Expand Up @@ -2049,7 +2066,7 @@ spec:
x-kubernetes-map-type: atomic
type: array
required:
- dockerfile
- dockerfileConfigMap
type: object
containerImage:
description: ContainerImage is the name of the DriverContainer
Expand Down
7 changes: 7 additions & 0 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ rules:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- apiGroups:
- ""
resources:
Expand Down
1 change: 1 addition & 0 deletions controllers/module_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ func NewModuleReconciler(
//+kubebuilder:rbac:groups=apps,resources=daemonsets,verbs=create;delete;get;list;patch;watch
//+kubebuilder:rbac:groups="core",resources=nodes,verbs=get;list;watch
//+kubebuilder:rbac:groups="core",resources=secrets,verbs=get;list;watch
//+kubebuilder:rbac:groups="core",resources=configmaps,verbs=get;list
qbarrand marked this conversation as resolved.
Show resolved Hide resolved
//+kubebuilder:rbac:groups="core",resources=serviceaccounts,verbs=create;delete;get;list;patch;watch
//+kubebuilder:rbac:groups="batch",resources=jobs,verbs=create;list;watch;delete

Expand Down
5 changes: 1 addition & 4 deletions internal/build/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ func (m *helper) ApplyBuildArgOverrides(args []v1beta1.BuildArg, overrides ...v1

func (m *helper) GetRelevantBuild(mod kmmv1beta1.Module, km kmmv1beta1.KernelMapping) *kmmv1beta1.Build {
if mod.Spec.ModuleLoader.Container.Build == nil {
// km.Build cannot be nil in case mod.Build is nil, checked above
return km.Build.DeepCopy()
}

Expand All @@ -56,9 +55,7 @@ func (m *helper) GetRelevantBuild(mod kmmv1beta1.Module, km kmmv1beta1.KernelMap
}

buildConfig := mod.Spec.ModuleLoader.Container.Build.DeepCopy()
if km.Build.Dockerfile != "" {
buildConfig.Dockerfile = km.Build.Dockerfile
}
buildConfig.DockerfileConfigMap = km.Build.DockerfileConfigMap

buildConfig.BuildArgs = m.ApplyBuildArgOverrides(buildConfig.BuildArgs, km.Build.BuildArgs...)

Expand Down
134 changes: 134 additions & 0 deletions internal/build/helper_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package build

import (
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
v1 "k8s.io/api/core/v1"
)

var _ = Describe("GetRelevantBuild", func() {

var nh Helper

BeforeEach(func() {
nh = NewHelper()
})

It("kernel mapping build present, module loader build absent", func() {
mod := kmmv1beta1.Module{
Spec: kmmv1beta1.ModuleSpec{
ModuleLoader: kmmv1beta1.ModuleLoaderSpec{
Container: kmmv1beta1.ModuleLoaderContainerSpec{
Build: nil,
},
},
},
}
km := kmmv1beta1.KernelMapping{
Build: &kmmv1beta1.Build{
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some kernel mapping build name"},
},
}

res := nh.GetRelevantBuild(mod, km)
Expect(res).To(Equal(km.Build))
})

It("kernel mapping build absent, module loader build present", func() {
mod := kmmv1beta1.Module{
Spec: kmmv1beta1.ModuleSpec{
ModuleLoader: kmmv1beta1.ModuleLoaderSpec{
Container: kmmv1beta1.ModuleLoaderContainerSpec{
Build: &kmmv1beta1.Build{
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some load module build name"},
},
},
},
},
}
km := kmmv1beta1.KernelMapping{
Build: nil,
}

res := nh.GetRelevantBuild(mod, km)
Expect(res).To(Equal(mod.Spec.ModuleLoader.Container.Build))
})

It("kernel mapping and module loader builds are present, overrides", func() {
mod := kmmv1beta1.Module{
Spec: kmmv1beta1.ModuleSpec{
ModuleLoader: kmmv1beta1.ModuleLoaderSpec{
Container: kmmv1beta1.ModuleLoaderContainerSpec{
Build: &kmmv1beta1.Build{
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some load module build name"},
Pull: kmmv1beta1.PullOptions{
Insecure: true,
InsecureSkipTLSVerify: true,
},
},
},
},
},
}
km := kmmv1beta1.KernelMapping{
Build: &kmmv1beta1.Build{
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some kernel mapping build name"},
},
}

res := nh.GetRelevantBuild(mod, km)
Expect(res.DockerfileConfigMap).To(Equal(km.Build.DockerfileConfigMap))
Expect(res.Pull).To(Equal(mod.Spec.ModuleLoader.Container.Build.Pull))
})
})

var _ = Describe("ApplyBuildArgOverrides", func() {

var nh Helper

BeforeEach(func() {
nh = NewHelper()
})

It("apply overrides", func() {
args := []kmmv1beta1.BuildArg{
{
Name: "name1",
Value: "value1",
},
{
Name: "name2",
Value: "value2",
},
}
overrides := []kmmv1beta1.BuildArg{
{
Name: "name1",
Value: "valueOverride1",
},
{
Name: "overrideName2",
Value: "overrideValue2",
},
}

expected := []kmmv1beta1.BuildArg{
{
Name: "name1",
Value: "valueOverride1",
},
{
Name: "name2",
Value: "value2",
},
{
Name: "overrideName2",
Value: "overrideValue2",
},
}

res := nh.ApplyBuildArgOverrides(args, overrides...)
Expect(res).To(Equal(expected))
})
})
Loading