@@ -3,71 +3,46 @@ package cluster
33import (
44 "context"
55 "errors"
6- "fmt"
76 "sort"
87 "strings"
98
109 hubv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api-hub/v1beta1"
1110 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1211 "k8s.io/apimachinery/pkg/labels"
13- "k8s.io/apimachinery/pkg/types"
1412 clusterv1 "open-cluster-management.io/api/cluster/v1"
1513 "sigs.k8s.io/controller-runtime/pkg/client"
16- "sigs.k8s.io/controller-runtime/pkg/log"
1714
1815 kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
1916 "github.com/kubernetes-sigs/kernel-module-management/internal/api"
20- "github.com/kubernetes-sigs/kernel-module-management/internal/build"
21- "github.com/kubernetes-sigs/kernel-module-management/internal/buildsign/pod"
2217 "github.com/kubernetes-sigs/kernel-module-management/internal/constants"
2318 "github.com/kubernetes-sigs/kernel-module-management/internal/module"
24- "github.com/kubernetes-sigs/kernel-module-management/internal/sign"
2519)
2620
2721//go:generate mockgen -source=cluster.go -package=cluster -destination=mock_cluster.go
2822
2923type ClusterAPI interface {
30- RequestedManagedClusterModule (ctx context.Context , namespacedName types.NamespacedName ) (* hubv1beta1.ManagedClusterModule , error )
3124 SelectedManagedClusters (ctx context.Context , mcm * hubv1beta1.ManagedClusterModule ) (* clusterv1.ManagedClusterList , error )
32- BuildAndSign (ctx context.Context , mcm hubv1beta1.ManagedClusterModule , cluster clusterv1.ManagedCluster ) (bool , error )
33- GarbageCollectBuildsAndSigns (ctx context.Context , mcm hubv1beta1.ManagedClusterModule ) ([]string , error )
3425 KernelVersions (cluster clusterv1.ManagedCluster ) ([]string , error )
26+ GetModuleLoaderDataForKernel (mcm * hubv1beta1.ManagedClusterModule , kernelVersion string ) (* api.ModuleLoaderData , error )
3527}
3628
3729type clusterAPI struct {
3830 client client.Client
3931 kernelAPI module.KernelMapper
40- buildAPI build.Manager
41- signAPI sign.SignManager
4232 namespace string
4333}
4434
4535func NewClusterAPI (
4636 client client.Client ,
4737 kernelAPI module.KernelMapper ,
48- buildAPI build.Manager ,
49- signAPI sign.SignManager ,
5038 defaultPodNamespace string ) ClusterAPI {
5139 return & clusterAPI {
5240 client : client ,
5341 kernelAPI : kernelAPI ,
54- buildAPI : buildAPI ,
55- signAPI : signAPI ,
5642 namespace : defaultPodNamespace ,
5743 }
5844}
5945
60- func (c * clusterAPI ) RequestedManagedClusterModule (
61- ctx context.Context ,
62- namespacedName types.NamespacedName ) (* hubv1beta1.ManagedClusterModule , error ) {
63-
64- mcm := hubv1beta1.ManagedClusterModule {}
65- if err := c .client .Get (ctx , namespacedName , & mcm ); err != nil {
66- return nil , fmt .Errorf ("failed to get the ManagedClusterModule %s: %w" , namespacedName , err )
67- }
68- return & mcm , nil
69- }
70-
7146func (c * clusterAPI ) SelectedManagedClusters (
7247 ctx context.Context ,
7348 mcm * hubv1beta1.ManagedClusterModule ) (* clusterv1.ManagedClusterList , error ) {
@@ -85,76 +60,6 @@ func (c *clusterAPI) SelectedManagedClusters(
8560 return clusterList , err
8661}
8762
88- func (c * clusterAPI ) BuildAndSign (
89- ctx context.Context ,
90- mcm hubv1beta1.ManagedClusterModule ,
91- cluster clusterv1.ManagedCluster ) (bool , error ) {
92-
93- modSpec := mcm .Spec .ModuleSpec
94- mod := kmmv1beta1.Module {
95- ObjectMeta : metav1.ObjectMeta {
96- Name : mcm .Name ,
97- Namespace : c .namespace ,
98- },
99- Spec : modSpec ,
100- }
101- mldMappings , err := c .kernelMappingsByKernelVersion (ctx , & mod , cluster )
102- if err != nil {
103- return false , err
104- }
105-
106- // if no mappings were found, return not completed
107- if len (mldMappings ) == 0 {
108- return false , nil
109- }
110-
111- logger := log .FromContext (ctx )
112-
113- completedSuccessfully := true
114- for kernelVersion , mld := range mldMappings {
115- buildCompleted , err := c .build (ctx , mld , & mcm )
116- if err != nil {
117- return false , err
118- }
119-
120- kernelVersionLogger := logger .WithValues (
121- "kernel version" , kernelVersion ,
122- )
123-
124- if ! buildCompleted {
125- kernelVersionLogger .Info ("Build for mapping has not completed yet, skipping Sign" )
126- completedSuccessfully = false
127- continue
128- }
129-
130- signCompleted , err := c .sign (ctx , mld , & mcm )
131- if err != nil {
132- return false , err
133- }
134-
135- if ! signCompleted {
136- kernelVersionLogger .Info ("Sign for mapping has not completed yet" )
137- completedSuccessfully = false
138- continue
139- }
140- }
141-
142- return completedSuccessfully , nil
143- }
144-
145- func (c * clusterAPI ) GarbageCollectBuildsAndSigns (ctx context.Context , mcm hubv1beta1.ManagedClusterModule ) ([]string , error ) {
146- deletedBuilds , err := c .buildAPI .GarbageCollect (ctx , mcm .Name , c .namespace , & mcm )
147- if err != nil {
148- return nil , fmt .Errorf ("failed to garbage collect build object: %v" , err )
149- }
150-
151- deletedSigns , err := c .signAPI .GarbageCollect (ctx , mcm .Name , c .namespace , & mcm )
152- if err != nil {
153- return nil , fmt .Errorf ("failed to garbage collect sign object: %v" , err )
154- }
155- return append (deletedBuilds , deletedSigns ... ), nil
156- }
157-
15863func (c * clusterAPI ) KernelVersions (cluster clusterv1.ManagedCluster ) ([]string , error ) {
15964 for _ , clusterClaim := range cluster .Status .ClusterClaims {
16065 if clusterClaim .Name != constants .KernelVersionsClusterClaimName {
@@ -169,109 +74,15 @@ func (c *clusterAPI) KernelVersions(cluster clusterv1.ManagedCluster) ([]string,
16974 return nil , errors .New ("KMM kernel version ClusterClaim not found" )
17075}
17176
172- func (c * clusterAPI ) kernelMappingsByKernelVersion (
173- ctx context.Context ,
174- mod * kmmv1beta1.Module ,
175- cluster clusterv1.ManagedCluster ) (map [string ]* api.ModuleLoaderData , error ) {
176-
177- kernelVersions , err := c .KernelVersions (cluster )
178- if err != nil {
179- return nil , err
180- }
181-
182- mldMappings := make (map [string ]* api.ModuleLoaderData )
183- logger := log .FromContext (ctx )
184-
185- for _ , kernelVersion := range kernelVersions {
186- kernelVersion := strings .TrimSuffix (kernelVersion , "+" )
187-
188- kernelVersionLogger := logger .WithValues (
189- "kernel version" , kernelVersion ,
190- )
191-
192- if mld , ok := mldMappings [kernelVersion ]; ok {
193- kernelVersionLogger .V (1 ).Info ("Using cached mld mapping" , "mld" , mld )
194- continue
195- }
196-
197- mld , err := c .kernelAPI .GetModuleLoaderDataForKernel (mod , kernelVersion )
198- if err != nil {
199- kernelVersionLogger .Info ("no suitable container image found; skipping kernel version" )
200- continue
201- }
202-
203- kernelVersionLogger .V (1 ).Info ("Found a valid mapping" ,
204- "image" , mld .ContainerImage ,
205- "build" , mld .Build != nil ,
206- )
207-
208- mldMappings [kernelVersion ] = mld
209- }
210-
211- return mldMappings , nil
212- }
213-
214- func (c * clusterAPI ) build (
215- ctx context.Context ,
216- mld * api.ModuleLoaderData ,
217- mcm * hubv1beta1.ManagedClusterModule ) (bool , error ) {
218-
219- shouldSync , err := c .buildAPI .ShouldSync (ctx , mld )
220- if err != nil {
221- return false , fmt .Errorf ("could not check if build synchronization is needed: %v" , err )
222- }
223- if ! shouldSync {
224- return true , nil
225- }
226-
227- logger := log .FromContext (ctx ).WithValues (
228- "kernel version" , mld .KernelVersion ,
229- "image" , mld .ContainerImage )
230- buildCtx := log .IntoContext (ctx , logger )
231-
232- buildStatus , err := c .buildAPI .Sync (buildCtx , mld , true , mcm )
233- if err != nil {
234- return false , fmt .Errorf ("could not synchronize the build: %w" , err )
235- }
236-
237- if buildStatus == pod .StatusCompleted {
238- return true , nil
239- }
240- return false , nil
241- }
242-
243- func (c * clusterAPI ) sign (
244- ctx context.Context ,
245- mld * api.ModuleLoaderData ,
246- mcm * hubv1beta1.ManagedClusterModule ) (bool , error ) {
77+ func (c * clusterAPI ) GetModuleLoaderDataForKernel (mcm * hubv1beta1.ManagedClusterModule ,
78+ kernelVersion string ) (* api.ModuleLoaderData , error ) {
24779
248- shouldSync , err := c .signAPI .ShouldSync (ctx , mld )
249- if err != nil {
250- return false , fmt .Errorf ("could not check if signing synchronization is needed: %v" , err )
251- }
252- if ! shouldSync {
253- return true , nil
254- }
255-
256- // if we need to sign AND we've built, then we must have built
257- // the intermediate image so must figure out its name
258- previousImage := ""
259- if module .ShouldBeBuilt (mld ) {
260- previousImage = module .IntermediateImageName (mld .Name , mld .Namespace , mld .ContainerImage )
261- }
262-
263- logger := log .FromContext (ctx ).WithValues (
264- "kernel version" , mld .KernelVersion ,
265- "image" , mld .ContainerImage )
266- signCtx := log .IntoContext (ctx , logger )
267-
268- signStatus , err := c .signAPI .Sync (signCtx , mld , previousImage , true , mcm )
269- if err != nil {
270- return false , fmt .Errorf ("could not synchronize the signing: %w" , err )
271- }
272-
273- if signStatus == pod .StatusCompleted {
274- return true , nil
80+ mod := & kmmv1beta1.Module {
81+ ObjectMeta : metav1.ObjectMeta {
82+ Name : mcm .Name ,
83+ Namespace : mcm .Namespace ,
84+ },
85+ Spec : mcm .Spec .ModuleSpec ,
27586 }
276- return false , nil
87+ return c . kernelAPI . GetModuleLoaderDataForKernel ( mod , kernelVersion )
27788}
0 commit comments