Skip to content

Commit 5e4f7c2

Browse files
Refactor operator code, split it to innetrnal packages (kubernetes-sigs#82)
This PR refactors the code base so that the repo will have 2 main directories: 1) controllers - will contain almost exclusively controller code 2) internal - will contain all the packages used by the controllers' code MGMT-10621
1 parent a3d7cb8 commit 5e4f7c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+631
-745
lines changed

Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ RUN go mod download
1515
COPY main.go main.go
1616
COPY api api
1717
COPY controllers controllers
18+
COPY internal internal
1819
COPY pkg pkg
1920

2021
# Copy Makefile

controllers/build/mock_modulehelper.go

-68
This file was deleted.

controllers/build/modulehelper_test.go

-117
This file was deleted.

controllers/module_reconciler.go

+35-45
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ import (
2121
"fmt"
2222

2323
ootov1alpha1 "github.com/qbarrand/oot-operator/api/v1alpha1"
24-
"github.com/qbarrand/oot-operator/controllers/build"
25-
"github.com/qbarrand/oot-operator/controllers/module"
26-
"github.com/qbarrand/oot-operator/controllers/predicates"
27-
"github.com/qbarrand/oot-operator/pkg/metrics"
24+
"github.com/qbarrand/oot-operator/internal/build"
25+
"github.com/qbarrand/oot-operator/internal/daemonset"
26+
"github.com/qbarrand/oot-operator/internal/filter"
27+
"github.com/qbarrand/oot-operator/internal/metrics"
28+
"github.com/qbarrand/oot-operator/internal/module"
2829
appsv1 "k8s.io/api/apps/v1"
2930
batchv1 "k8s.io/api/batch/v1"
3031
v1 "k8s.io/api/core/v1"
@@ -38,35 +39,37 @@ import (
3839
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3940
"sigs.k8s.io/controller-runtime/pkg/handler"
4041
"sigs.k8s.io/controller-runtime/pkg/log"
41-
"sigs.k8s.io/controller-runtime/pkg/predicate"
4242
"sigs.k8s.io/controller-runtime/pkg/source"
4343
)
4444

4545
// ModuleReconciler reconciles a Module object
4646
type ModuleReconciler struct {
4747
client.Client
4848

49-
bm build.Manager
50-
dc DaemonSetCreator
51-
km module.KernelMapper
52-
su module.ConditionsUpdater
53-
metrics metrics.Metrics
49+
buildAPI build.Manager
50+
daemonAPI daemonset.DaemonSetCreator
51+
kernelAPI module.KernelMapper
52+
conditionsAPI module.ConditionsUpdater
53+
metricsAPI metrics.Metrics
54+
filter *filter.Filter
5455
}
5556

5657
func NewModuleReconciler(
5758
client client.Client,
58-
bm build.Manager,
59-
dg DaemonSetCreator,
60-
km module.KernelMapper,
61-
su module.ConditionsUpdater,
62-
metrics metrics.Metrics) *ModuleReconciler {
59+
buildAPI build.Manager,
60+
daemonAPI daemonset.DaemonSetCreator,
61+
kernelAPI module.KernelMapper,
62+
conditionsAPI module.ConditionsUpdater,
63+
metricsAPI metrics.Metrics,
64+
filter *filter.Filter) *ModuleReconciler {
6365
return &ModuleReconciler{
64-
Client: client,
65-
bm: bm,
66-
dc: dg,
67-
km: km,
68-
su: su,
69-
metrics: metrics,
66+
Client: client,
67+
buildAPI: buildAPI,
68+
daemonAPI: daemonAPI,
69+
kernelAPI: kernelAPI,
70+
conditionsAPI: conditionsAPI,
71+
metricsAPI: metricsAPI,
72+
filter: filter,
7073
}
7174
}
7275

@@ -105,7 +108,7 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
105108

106109
mappings := r.getKernelMappings(ctx, nodes, mod)
107110

108-
dsByKernelVersion, err := r.dc.ModuleDaemonSetsByKernelVersion(ctx, mod.Name, mod.Namespace)
111+
dsByKernelVersion, err := r.daemonAPI.ModuleDaemonSetsByKernelVersion(ctx, mod.Name, mod.Namespace)
109112
if err != nil {
110113
return res, fmt.Errorf("could get DaemonSets for module %s: %v", mod.Name, err)
111114
}
@@ -143,7 +146,7 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
143146
// Garbage collect old DaemonSets for which there are no nodes.
144147
validKernels := sets.StringKeySet(mappings)
145148

146-
deleted, err := r.dc.GarbageCollect(ctx, dsByKernelVersion, validKernels)
149+
deleted, err := r.daemonAPI.GarbageCollect(ctx, dsByKernelVersion, validKernels)
147150
if err != nil {
148151
return res, fmt.Errorf("could not garbage collect DaemonSets: %v", err)
149152
}
@@ -158,7 +161,7 @@ func (r *ModuleReconciler) getKernelMappings(ctx context.Context, nodes v1.NodeL
158161
logger := log.FromContext(ctx)
159162

160163
for _, node := range nodes.Items {
161-
osConfig := r.km.GetNodeOSConfig(&node)
164+
osConfig := r.kernelAPI.GetNodeOSConfig(&node)
162165
kernelVersion := node.Status.NodeInfo.KernelVersion
163166

164167
nodeLogger := logger.WithValues(
@@ -171,13 +174,13 @@ func (r *ModuleReconciler) getKernelMappings(ctx context.Context, nodes v1.NodeL
171174
continue
172175
}
173176

174-
m, err := r.km.FindMappingForKernel(mod.Spec.KernelMappings, kernelVersion)
177+
m, err := r.kernelAPI.FindMappingForKernel(mod.Spec.KernelMappings, kernelVersion)
175178
if err != nil {
176179
nodeLogger.Info("no suitable container image found; skipping node")
177180
continue
178181
}
179182

180-
m, err = r.km.PrepareKernelMapping(m, osConfig)
183+
m, err = r.kernelAPI.PrepareKernelMapping(m, osConfig)
181184
if err != nil {
182185
nodeLogger.Info("failed to substitute the template variables in the mapping", "error", err)
183186
continue
@@ -205,7 +208,7 @@ func (r *ModuleReconciler) handleBuild(ctx context.Context,
205208
logger := log.FromContext(ctx).WithValues("kernel version", kernelVersion, "image", km.ContainerImage)
206209
buildCtx := log.IntoContext(ctx, logger)
207210

208-
buildRes, err := r.bm.Sync(buildCtx, *mod, *km, kernelVersion)
211+
buildRes, err := r.buildAPI.Sync(buildCtx, *mod, *km, kernelVersion)
209212
if err != nil {
210213
return false, fmt.Errorf("could not synchronize the build: %w", err)
211214
}
@@ -232,7 +235,7 @@ func (r *ModuleReconciler) handleDriverContainer(ctx context.Context,
232235
}
233236

234237
_, err := controllerutil.CreateOrPatch(ctx, r.Client, ds, func() error {
235-
return r.dc.SetDriverContainerAsDesired(ctx, ds, km.ContainerImage, *mod, kernelVersion)
238+
return r.daemonAPI.SetDriverContainerAsDesired(ctx, ds, km.ContainerImage, *mod, kernelVersion)
236239
})
237240

238241
return err
@@ -255,7 +258,7 @@ func (r *ModuleReconciler) handleDevicePlugin(ctx context.Context, mod *ootov1al
255258
}
256259

257260
opRes, err := controllerutil.CreateOrPatch(ctx, r.Client, ds, func() error {
258-
return r.dc.SetDevicePluginAsDesired(ctx, ds, mod)
261+
return r.daemonAPI.SetDevicePluginAsDesired(ctx, ds, mod)
259262
})
260263

261264
if err == nil {
@@ -274,7 +277,7 @@ func (r *ModuleReconciler) setKMMOMetrics(ctx context.Context) {
274277
logger.V(1).Info("failed to list KMMomodules for metrics", "error", err)
275278
}
276279

277-
r.metrics.SetExistingKMMOModules(len(mods.Items))
280+
r.metricsAPI.SetExistingKMMOModules(len(mods.Items))
278281
}
279282

280283
func (r *ModuleReconciler) getRequestedModule(ctx context.Context, namespacedName types.NamespacedName) (*ootov1alpha1.Module, error) {
@@ -288,30 +291,17 @@ func (r *ModuleReconciler) getRequestedModule(ctx context.Context, namespacedNam
288291

289292
// SetupWithManager sets up the controller with the Manager.
290293
func (r *ModuleReconciler) SetupWithManager(mgr ctrl.Manager, kernelLabel string) error {
291-
nmm := NewNodeModuleMapper(
292-
r.Client,
293-
mgr.GetLogger().WithName("controller/module/node-module-mapper"),
294-
)
295-
296294
return ctrl.NewControllerManagedBy(mgr).
297295
For(&ootov1alpha1.Module{}).
298296
Owns(&appsv1.DaemonSet{}).
299297
Owns(&batchv1.Job{}).
300298
Watches(
301299
&source.Kind{Type: &v1.Node{}},
302-
handler.EnqueueRequestsFromMapFunc(nmm.FindModulesForNode),
300+
handler.EnqueueRequestsFromMapFunc(r.filter.FindModulesForNode),
303301
builder.WithPredicates(
304-
ModuleReconcilerNodePredicate(kernelLabel),
302+
r.filter.ModuleReconcilerNodePredicate(kernelLabel),
305303
),
306304
).
307305
Named("module").
308306
Complete(r)
309307
}
310-
311-
func ModuleReconcilerNodePredicate(kernelLabel string) predicate.Predicate {
312-
return predicate.And(
313-
predicates.SkipDeletions,
314-
predicates.HasLabel(kernelLabel),
315-
predicate.LabelChangedPredicate{},
316-
)
317-
}

0 commit comments

Comments
 (0)