Skip to content

Commit ca365de

Browse files
committed
Updated the MCM controller to work with the new MIC implementation.
The MCM controller doesn't have to create build/sign pods manually anymore, all it needs to do is to create 1 MIC object in the cluster per MCM object per managed cluster. If all images in an MIC are ready, then the controller can proceed with creating the manifestWork because it guarantees that the targeted managed cluster can pull all kmod images successfully. Signed-off-by: Yoni Bettan <yonibettan@gmail.com>
1 parent 3613be4 commit ca365de

File tree

11 files changed

+608
-866
lines changed

11 files changed

+608
-866
lines changed

cmd/manager-hub/main.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121

2222
"github.com/kubernetes-sigs/kernel-module-management/internal/config"
2323
"github.com/kubernetes-sigs/kernel-module-management/internal/controllers"
24+
"github.com/kubernetes-sigs/kernel-module-management/internal/mbsc"
25+
"github.com/kubernetes-sigs/kernel-module-management/internal/mic"
26+
"github.com/kubernetes-sigs/kernel-module-management/internal/pod"
2427
"k8s.io/apimachinery/pkg/runtime"
2528
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2629
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -35,7 +38,6 @@ import (
3538
_ "k8s.io/client-go/plugin/pkg/client/auth"
3639

3740
"github.com/kubernetes-sigs/kernel-module-management/api-hub/v1beta1"
38-
buildpod "github.com/kubernetes-sigs/kernel-module-management/internal/build/pod"
3941
buildsignpod "github.com/kubernetes-sigs/kernel-module-management/internal/buildsign/pod"
4042
"github.com/kubernetes-sigs/kernel-module-management/internal/cluster"
4143
"github.com/kubernetes-sigs/kernel-module-management/internal/cmd"
@@ -47,7 +49,6 @@ import (
4749
"github.com/kubernetes-sigs/kernel-module-management/internal/module"
4850
"github.com/kubernetes-sigs/kernel-module-management/internal/nmc"
4951
"github.com/kubernetes-sigs/kernel-module-management/internal/registry"
50-
signpod "github.com/kubernetes-sigs/kernel-module-management/internal/sign/pod"
5152
"github.com/kubernetes-sigs/kernel-module-management/internal/statusupdater"
5253
//+kubebuilder:scaffold:imports
5354
)
@@ -109,21 +110,11 @@ func main() {
109110

110111
registryAPI := registry.NewRegistry()
111112
buildSignCombiner := module.NewCombiner()
112-
buildSignPodAPI := buildsignpod.NewBuildSignPodManager(client, buildSignCombiner, scheme)
113113

114-
buildAPI := buildpod.NewBuildManager(
115-
client,
116-
buildpod.NewMaker(client, buildSignCombiner, buildSignPodAPI, scheme),
117-
buildSignPodAPI,
118-
registryAPI,
119-
)
120-
121-
signAPI := signpod.NewSignPodManager(
122-
client,
123-
signpod.NewSigner(client, scheme, buildSignPodAPI),
124-
buildSignPodAPI,
125-
registryAPI,
126-
)
114+
micAPI := mic.New(client, scheme)
115+
mbscAPI := mbsc.New(client, scheme)
116+
imagePullerAPI := pod.NewImagePuller(client, scheme)
117+
builSignAPI := buildsignpod.NewManager(client, buildSignCombiner, scheme)
127118

128119
kernelAPI := module.NewKernelMapper(buildSignCombiner)
129120

@@ -135,11 +126,20 @@ func main() {
135126
mcmr := hub.NewManagedClusterModuleReconciler(
136127
client,
137128
manifestwork.NewCreator(client, scheme, kernelAPI, registryAPI, operatorNamespace),
138-
cluster.NewClusterAPI(client, kernelAPI, buildAPI, signAPI, operatorNamespace),
129+
cluster.NewClusterAPI(client, kernelAPI, operatorNamespace),
139130
statusupdater.NewManagedClusterModuleStatusUpdater(client),
140131
filterAPI,
132+
micAPI,
141133
)
142134

135+
if err = controllers.NewMICReconciler(client, micAPI, mbscAPI, imagePullerAPI, scheme).SetupWithManager(mgr); err != nil {
136+
cmd.FatalError(setupLogger, err, "unable to create controller", "name", controllers.MICReconcilerName)
137+
}
138+
139+
if err = controllers.NewMBSCReconciler(client, builSignAPI, mbscAPI).SetupWithManager(mgr); err != nil {
140+
cmd.FatalError(setupLogger, err, "unable to create controller", "name", controllers.MBSCReconcilerName)
141+
}
142+
143143
if err = mcmr.SetupWithManager(mgr); err != nil {
144144
cmd.FatalError(ctrlLogger, err, "unable to create controller")
145145
}

config/crd-hub/kustomization.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ kind: Kustomization
33

44
resources:
55
- bases/hub.kmm.sigs.x-k8s.io_managedclustermodules.yaml
6+
- bases/kmm.sigs.x-k8s.io_moduleimagesconfigs.yaml
7+
- bases/kmm.sigs.x-k8s.io_modulebuildsignconfigs.yaml
68

79
patches: []
810
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix.

internal/cluster/cluster.go

Lines changed: 10 additions & 199 deletions
Original file line numberDiff line numberDiff line change
@@ -3,71 +3,46 @@ package cluster
33
import (
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

2923
type 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

3729
type clusterAPI struct {
3830
client client.Client
3931
kernelAPI module.KernelMapper
40-
buildAPI build.Manager
41-
signAPI sign.SignManager
4232
namespace string
4333
}
4434

4535
func 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-
7146
func (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-
15863
func (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

Comments
 (0)