Skip to content

Commit 35b77cb

Browse files
yevgeny-shnaidmank8s-ci-robot
authored andcommitted
Introducing buildsign package
In the current implementation of the build and sign flow, build_sign controller uses 2 packages, build and sign, to verify whether build/sign must be executed, to actually create build/sign pod and to run garbage collector on he successfull pods. In many cases, those 2 packages are very much the same, especially in where the package manager must decide what to do (build pod, delete pod, etc) With the introduction of the MBSC controller, the flow is changing and it makes sense to unify those packages into one package. There is not need to decide if the build/sign should be executed, since that decision is taken by the MIC controller This PR starts with creating the buildsing package and unifying Helper interfaces both in sign and build package into one Helper interface: 1) create Helper interface and implementation for buildsign package 2) move the existing code that was previously using build.Helper and sign.Helper interface to start using unified interface
1 parent 28b37af commit 35b77cb

File tree

8 files changed

+455
-36
lines changed

8 files changed

+455
-36
lines changed

cmd/manager-hub/main.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ import (
3636
_ "k8s.io/client-go/plugin/pkg/client/auth"
3737

3838
"github.com/kubernetes-sigs/kernel-module-management/api-hub/v1beta1"
39-
"github.com/kubernetes-sigs/kernel-module-management/internal/build"
4039
buildpod "github.com/kubernetes-sigs/kernel-module-management/internal/build/pod"
40+
"github.com/kubernetes-sigs/kernel-module-management/internal/buildsign"
4141
"github.com/kubernetes-sigs/kernel-module-management/internal/cluster"
4242
"github.com/kubernetes-sigs/kernel-module-management/internal/cmd"
4343
"github.com/kubernetes-sigs/kernel-module-management/internal/constants"
@@ -48,7 +48,6 @@ import (
4848
"github.com/kubernetes-sigs/kernel-module-management/internal/module"
4949
"github.com/kubernetes-sigs/kernel-module-management/internal/nmc"
5050
"github.com/kubernetes-sigs/kernel-module-management/internal/registry"
51-
"github.com/kubernetes-sigs/kernel-module-management/internal/sign"
5251
signpod "github.com/kubernetes-sigs/kernel-module-management/internal/sign/pod"
5352
"github.com/kubernetes-sigs/kernel-module-management/internal/statusupdater"
5453
//+kubebuilder:scaffold:imports
@@ -111,11 +110,11 @@ func main() {
111110

112111
registryAPI := registry.NewRegistry()
113112
buildSignPodAPI := pod.NewBuildSignPodManager(client)
114-
buildHelper := build.NewHelper()
113+
buildSignHelper := buildsign.NewHelper()
115114

116115
buildAPI := buildpod.NewBuildManager(
117116
client,
118-
buildpod.NewMaker(client, buildHelper, buildSignPodAPI, scheme),
117+
buildpod.NewMaker(client, buildSignHelper, buildSignPodAPI, scheme),
119118
buildSignPodAPI,
120119
registryAPI,
121120
)
@@ -127,7 +126,7 @@ func main() {
127126
registryAPI,
128127
)
129128

130-
kernelAPI := module.NewKernelMapper(buildHelper, sign.NewSignerHelper())
129+
kernelAPI := module.NewKernelMapper(buildSignHelper)
131130

132131
ctrlLogger := setupLogger.WithValues("name", hub.ManagedClusterModuleReconcilerName)
133132
ctrlLogger.Info("Adding controller")

cmd/manager/main.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ import (
2828

2929
"github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
3030
"github.com/kubernetes-sigs/kernel-module-management/api/v1beta2"
31-
"github.com/kubernetes-sigs/kernel-module-management/internal/build"
3231
buildpod "github.com/kubernetes-sigs/kernel-module-management/internal/build/pod"
32+
"github.com/kubernetes-sigs/kernel-module-management/internal/buildsign"
3333
"github.com/kubernetes-sigs/kernel-module-management/internal/cmd"
3434
"github.com/kubernetes-sigs/kernel-module-management/internal/config"
3535
"github.com/kubernetes-sigs/kernel-module-management/internal/constants"
@@ -40,7 +40,6 @@ import (
4040
"github.com/kubernetes-sigs/kernel-module-management/internal/nmc"
4141
"github.com/kubernetes-sigs/kernel-module-management/internal/preflight"
4242
"github.com/kubernetes-sigs/kernel-module-management/internal/registry"
43-
"github.com/kubernetes-sigs/kernel-module-management/internal/sign"
4443
signpod "github.com/kubernetes-sigs/kernel-module-management/internal/sign/pod"
4544

4645
"k8s.io/apimachinery/pkg/runtime"
@@ -120,9 +119,9 @@ func main() {
120119
metricsAPI.Register()
121120

122121
registryAPI := registry.NewRegistry()
123-
buildHelperAPI := build.NewHelper()
122+
buildSignHelperAPI := buildsign.NewHelper()
124123
nodeAPI := node.NewNode(client)
125-
kernelAPI := module.NewKernelMapper(buildHelperAPI, sign.NewSignerHelper())
124+
kernelAPI := module.NewKernelMapper(buildSignHelperAPI)
126125
micAPI := mic.New(client, scheme)
127126

128127
dpc := controllers.NewDevicePluginReconciler(
@@ -183,7 +182,7 @@ func main() {
183182

184183
buildAPI := buildpod.NewBuildManager(
185184
client,
186-
buildpod.NewMaker(client, buildHelperAPI, buildSignPodAPI, scheme),
185+
buildpod.NewMaker(client, buildSignHelperAPI, buildSignPodAPI, scheme),
187186
buildSignPodAPI,
188187
registryAPI,
189188
)

internal/buildsign/helper.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package buildsign
2+
3+
import (
4+
"k8s.io/apimachinery/pkg/util/sets"
5+
6+
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
7+
"github.com/kubernetes-sigs/kernel-module-management/internal/kernel"
8+
"github.com/kubernetes-sigs/kernel-module-management/internal/utils"
9+
)
10+
11+
//go:generate mockgen -source=helper.go -package=buildsign -destination=mock_helper.go
12+
13+
type Helper interface {
14+
ApplyBuildArgOverrides(args []kmmv1beta1.BuildArg, overrides ...kmmv1beta1.BuildArg) []kmmv1beta1.BuildArg
15+
GetRelevantBuild(moduleBuild *kmmv1beta1.Build, mappingBuild *kmmv1beta1.Build) *kmmv1beta1.Build
16+
GetRelevantSign(moduleSign *kmmv1beta1.Sign, mappingSign *kmmv1beta1.Sign, kernel string) (*kmmv1beta1.Sign, error)
17+
}
18+
19+
type helper struct{}
20+
21+
func NewHelper() Helper {
22+
return &helper{}
23+
}
24+
25+
func (m *helper) ApplyBuildArgOverrides(args []kmmv1beta1.BuildArg, overrides ...kmmv1beta1.BuildArg) []kmmv1beta1.BuildArg {
26+
overridesMap := make(map[string]kmmv1beta1.BuildArg, len(overrides))
27+
28+
for _, o := range overrides {
29+
overridesMap[o.Name] = o
30+
}
31+
32+
unusedOverrides := sets.StringKeySet(overridesMap)
33+
34+
for i := 0; i < len(args); i++ {
35+
argName := args[i].Name
36+
37+
if o, ok := overridesMap[argName]; ok {
38+
args[i] = o
39+
unusedOverrides.Delete(argName)
40+
}
41+
}
42+
43+
for _, overrideName := range unusedOverrides.List() {
44+
args = append(args, overridesMap[overrideName])
45+
}
46+
47+
return args
48+
}
49+
50+
func (m *helper) GetRelevantBuild(moduleBuild *kmmv1beta1.Build, mappingBuild *kmmv1beta1.Build) *kmmv1beta1.Build {
51+
if moduleBuild == nil {
52+
return mappingBuild.DeepCopy()
53+
}
54+
55+
if mappingBuild == nil {
56+
return moduleBuild.DeepCopy()
57+
}
58+
59+
buildConfig := moduleBuild.DeepCopy()
60+
if mappingBuild.DockerfileConfigMap != nil {
61+
buildConfig.DockerfileConfigMap = mappingBuild.DockerfileConfigMap
62+
}
63+
64+
buildConfig.BuildArgs = m.ApplyBuildArgOverrides(buildConfig.BuildArgs, mappingBuild.BuildArgs...)
65+
66+
buildConfig.Secrets = append(buildConfig.Secrets, mappingBuild.Secrets...)
67+
return buildConfig
68+
}
69+
70+
func (m *helper) GetRelevantSign(moduleSign *kmmv1beta1.Sign, mappingSign *kmmv1beta1.Sign, kernelVersion string) (*kmmv1beta1.Sign, error) {
71+
var signConfig *kmmv1beta1.Sign
72+
if moduleSign == nil {
73+
// km.Sign cannot be nil in case mod.Sign is nil, checked above
74+
signConfig = mappingSign.DeepCopy()
75+
} else if mappingSign == nil {
76+
signConfig = moduleSign.DeepCopy()
77+
} else {
78+
signConfig = moduleSign.DeepCopy()
79+
80+
if mappingSign.UnsignedImage != "" {
81+
signConfig.UnsignedImage = mappingSign.UnsignedImage
82+
}
83+
84+
if mappingSign.KeySecret != nil {
85+
signConfig.KeySecret = mappingSign.KeySecret
86+
}
87+
if mappingSign.CertSecret != nil {
88+
signConfig.CertSecret = mappingSign.CertSecret
89+
}
90+
//append (not overwrite) any files in the km to the defaults
91+
signConfig.FilesToSign = append(signConfig.FilesToSign, mappingSign.FilesToSign...)
92+
}
93+
94+
osConfigEnvVars := utils.KernelComponentsAsEnvVars(
95+
kernel.NormalizeVersion(kernelVersion),
96+
)
97+
unsignedImage, err := utils.ReplaceInTemplates(osConfigEnvVars, signConfig.UnsignedImage)
98+
if err != nil {
99+
return nil, err
100+
}
101+
signConfig.UnsignedImage = unsignedImage[0]
102+
filesToSign, err := utils.ReplaceInTemplates(osConfigEnvVars, signConfig.FilesToSign...)
103+
if err != nil {
104+
return nil, err
105+
}
106+
signConfig.FilesToSign = filesToSign
107+
108+
return signConfig, nil
109+
}

internal/buildsign/helper_test.go

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
package buildsign
2+
3+
import (
4+
"strings"
5+
6+
"github.com/google/go-cmp/cmp"
7+
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
8+
. "github.com/onsi/ginkgo/v2"
9+
. "github.com/onsi/gomega"
10+
v1 "k8s.io/api/core/v1"
11+
)
12+
13+
var _ = Describe("GetRelevantBuild", func() {
14+
15+
var nh Helper
16+
17+
BeforeEach(func() {
18+
nh = NewHelper()
19+
})
20+
21+
It("kernel mapping build present, module loader build absent", func() {
22+
mappingBuild := &kmmv1beta1.Build{
23+
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some kernel mapping build name"},
24+
}
25+
26+
res := nh.GetRelevantBuild(nil, mappingBuild)
27+
Expect(res).To(Equal(mappingBuild))
28+
})
29+
30+
It("kernel mapping build absent, module loader build present", func() {
31+
moduleBuild := &kmmv1beta1.Build{
32+
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some load module build name"},
33+
}
34+
35+
res := nh.GetRelevantBuild(moduleBuild, nil)
36+
37+
Expect(res).To(Equal(moduleBuild))
38+
})
39+
40+
It("kernel mapping and module loader builds are present, overrides", func() {
41+
moduleBuild := &kmmv1beta1.Build{
42+
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some load module build name"},
43+
BaseImageRegistryTLS: kmmv1beta1.TLSOptions{
44+
Insecure: true,
45+
InsecureSkipTLSVerify: true,
46+
},
47+
}
48+
mappingBuild := &kmmv1beta1.Build{
49+
DockerfileConfigMap: &v1.LocalObjectReference{Name: "some kernel mapping build name"},
50+
}
51+
52+
res := nh.GetRelevantBuild(moduleBuild, mappingBuild)
53+
Expect(res.DockerfileConfigMap).To(Equal(mappingBuild.DockerfileConfigMap))
54+
Expect(res.BaseImageRegistryTLS).To(Equal(moduleBuild.BaseImageRegistryTLS))
55+
})
56+
})
57+
58+
var _ = Describe("ApplyBuildArgOverrides", func() {
59+
60+
var nh Helper
61+
62+
BeforeEach(func() {
63+
nh = NewHelper()
64+
})
65+
66+
It("apply overrides", func() {
67+
args := []kmmv1beta1.BuildArg{
68+
{
69+
Name: "name1",
70+
Value: "value1",
71+
},
72+
{
73+
Name: "name2",
74+
Value: "value2",
75+
},
76+
}
77+
overrides := []kmmv1beta1.BuildArg{
78+
{
79+
Name: "name1",
80+
Value: "valueOverride1",
81+
},
82+
{
83+
Name: "overrideName2",
84+
Value: "overrideValue2",
85+
},
86+
}
87+
88+
expected := []kmmv1beta1.BuildArg{
89+
{
90+
Name: "name1",
91+
Value: "valueOverride1",
92+
},
93+
{
94+
Name: "name2",
95+
Value: "value2",
96+
},
97+
{
98+
Name: "overrideName2",
99+
Value: "overrideValue2",
100+
},
101+
}
102+
103+
res := nh.ApplyBuildArgOverrides(args, overrides...)
104+
Expect(res).To(Equal(expected))
105+
})
106+
})
107+
108+
var _ = Describe("GetRelevantSign", func() {
109+
110+
const (
111+
unsignedImage = "my.registry/my/image"
112+
keySecret = "securebootkey"
113+
certSecret = "securebootcert"
114+
filesToSign = "/modules/simple-kmod.ko:/modules/simple-procfs-kmod.ko"
115+
kernelVersion = "1.2.3"
116+
)
117+
118+
var (
119+
h Helper
120+
)
121+
122+
BeforeEach(func() {
123+
h = NewHelper()
124+
})
125+
126+
expected := &kmmv1beta1.Sign{
127+
UnsignedImage: unsignedImage,
128+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
129+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
130+
FilesToSign: strings.Split(filesToSign, ":"),
131+
}
132+
133+
DescribeTable("should set fields correctly", func(moduleSign *kmmv1beta1.Sign, mappingSign *kmmv1beta1.Sign) {
134+
actual, err := h.GetRelevantSign(moduleSign, mappingSign, kernelVersion)
135+
Expect(err).NotTo(HaveOccurred())
136+
Expect(
137+
cmp.Diff(expected, actual),
138+
).To(
139+
BeEmpty(),
140+
)
141+
},
142+
Entry(
143+
"no km.Sign",
144+
&kmmv1beta1.Sign{
145+
UnsignedImage: unsignedImage,
146+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
147+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
148+
FilesToSign: strings.Split(filesToSign, ":"),
149+
},
150+
nil,
151+
),
152+
Entry(
153+
"no container.Sign",
154+
nil,
155+
&kmmv1beta1.Sign{
156+
UnsignedImage: unsignedImage,
157+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
158+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
159+
FilesToSign: strings.Split(filesToSign, ":"),
160+
},
161+
),
162+
Entry(
163+
"default UnsignedImage",
164+
&kmmv1beta1.Sign{
165+
UnsignedImage: unsignedImage,
166+
},
167+
&kmmv1beta1.Sign{
168+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
169+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
170+
FilesToSign: strings.Split(filesToSign, ":"),
171+
},
172+
),
173+
Entry(
174+
"default UnsignedImage and KeySecret",
175+
&kmmv1beta1.Sign{
176+
UnsignedImage: unsignedImage,
177+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
178+
},
179+
&kmmv1beta1.Sign{
180+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
181+
FilesToSign: strings.Split(filesToSign, ":"),
182+
},
183+
),
184+
Entry(
185+
"default UnsignedImage, KeySecret, and CertSecret",
186+
&kmmv1beta1.Sign{
187+
UnsignedImage: unsignedImage,
188+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
189+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
190+
},
191+
&kmmv1beta1.Sign{
192+
FilesToSign: strings.Split(filesToSign, ":"),
193+
},
194+
),
195+
Entry(
196+
"default FilesToSign only",
197+
&kmmv1beta1.Sign{
198+
FilesToSign: strings.Split(filesToSign, ":"),
199+
},
200+
&kmmv1beta1.Sign{
201+
UnsignedImage: unsignedImage,
202+
KeySecret: &v1.LocalObjectReference{Name: keySecret},
203+
CertSecret: &v1.LocalObjectReference{Name: certSecret},
204+
},
205+
),
206+
)
207+
208+
})

0 commit comments

Comments
 (0)