Skip to content

Commit f977dfb

Browse files
committed
fix: accept events from global DWOC only
Signed-off-by: Oleksii Kurinnyi <[email protected]>
1 parent 3218747 commit f977dfb

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

controllers/pruner/pruner_controller.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ import (
2727
"sigs.k8s.io/controller-runtime/pkg/client"
2828
"sigs.k8s.io/controller-runtime/pkg/controller"
2929
"sigs.k8s.io/controller-runtime/pkg/event"
30+
"sigs.k8s.io/controller-runtime/pkg/handler"
3031
"sigs.k8s.io/controller-runtime/pkg/predicate"
32+
"sigs.k8s.io/controller-runtime/pkg/source"
3133

3234
dwv2 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
3335
controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1"
3436
"github.com/devfile/devworkspace-operator/pkg/conditions"
3537
"github.com/devfile/devworkspace-operator/pkg/config"
38+
"github.com/devfile/devworkspace-operator/pkg/infrastructure"
3639

3740
"github.com/operator-framework/operator-lib/prune"
3841
"github.com/robfig/cron/v3"
@@ -126,7 +129,28 @@ func (r *DevWorkspacePrunerReconciler) SetupWithManager(mgr ctrl.Manager) error
126129

127130
return ctrl.NewControllerManagedBy(mgr).
128131
WithOptions(controller.Options{MaxConcurrentReconciles: maxConcurrentReconciles}).
129-
For(&controllerv1alpha1.DevWorkspaceOperatorConfig{}).
132+
Named("DevWorkspacePruner").
133+
Watches(&source.Kind{Type: &controllerv1alpha1.DevWorkspaceOperatorConfig{}},
134+
handler.EnqueueRequestsFromMapFunc(func(object client.Object) []ctrl.Request {
135+
objectNamespace := object.GetNamespace()
136+
operatorNamespace, err := infrastructure.GetNamespace()
137+
138+
// Ignore events from other namespaces
139+
if err != nil || objectNamespace != operatorNamespace {
140+
log.Info("Received event from different namespace, ignoring", "namespace", objectNamespace)
141+
return []ctrl.Request{}
142+
}
143+
144+
return []ctrl.Request{
145+
{
146+
NamespacedName: client.ObjectKey{
147+
Name: object.GetName(),
148+
Namespace: object.GetNamespace(),
149+
},
150+
},
151+
}
152+
}),
153+
).
130154
WithEventFilter(configPredicate).
131155
Complete(r)
132156
}

controllers/pruner/pruner_controller_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,28 @@ var _ = Describe("DevWorkspacePrunerReconciler", func() {
148148
Expect(reconciler.cron.Entries()).To(BeEmpty())
149149
})
150150

151+
It("Should not start cron if received event from different namespace", func() {
152+
dwoc := &controllerv1alpha1.DevWorkspaceOperatorConfig{
153+
ObjectMeta: metav1.ObjectMeta{Name: nameNamespace.Name, Namespace: "other-namespace"},
154+
Config: &controllerv1alpha1.OperatorConfiguration{
155+
Workspace: &controllerv1alpha1.WorkspaceConfig{
156+
CleanupCronJob: &controllerv1alpha1.CleanupCronJobConfig{
157+
Enable: pointer.Bool(true),
158+
Schedule: "* * * * *",
159+
},
160+
},
161+
},
162+
}
163+
Expect(fakeClient.Create(ctx, dwoc)).To(Succeed())
164+
result, err := reconciler.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{
165+
Name: nameNamespace.Name,
166+
Namespace: nameNamespace.Namespace,
167+
}})
168+
Expect(err).ToNot(HaveOccurred())
169+
Expect(result).To(Equal(ctrl.Result{}))
170+
Expect(reconciler.cron.Entries()).To(BeEmpty())
171+
})
172+
151173
It("Should not start cron if CleanupCronJob is nil", func() {
152174
dwoc := &controllerv1alpha1.DevWorkspaceOperatorConfig{
153175
ObjectMeta: metav1.ObjectMeta{Name: nameNamespace.Name, Namespace: nameNamespace.Namespace},

0 commit comments

Comments
 (0)