diff --git a/controllers/monitoring/monitoring_controller.go b/controllers/monitoring/monitoring_controller.go index e931d4bfc..12e31dcb2 100644 --- a/controllers/monitoring/monitoring_controller.go +++ b/controllers/monitoring/monitoring_controller.go @@ -102,7 +102,7 @@ func (r *Reconciler) reconcile(ctx context.Context, clh *helper.Client, desired if err != nil { return err } - } else if !helper.IsSubSet(nsExist.ObjectMeta.Labels, desiredNs.ObjectMeta.Labels) { + } else if !helper.SkipOwnership(nsExist) && !helper.IsSubSet(nsExist.ObjectMeta.Labels, desiredNs.ObjectMeta.Labels) { err = r.Update(ctx, desiredNs) if err != nil { return err diff --git a/pkg/helper/client_helper.go b/pkg/helper/client_helper.go index 3233282c6..ac8f17854 100644 --- a/pkg/helper/client_helper.go +++ b/pkg/helper/client_helper.go @@ -47,6 +47,7 @@ func (c *Client) CreateOwned(ctx context.Context, obj client.Object) error { log.Error(err, "Failed to set controller reference") return err } + AddOwnedLabel(obj) kind := reflect.TypeOf(obj).String() log.Info("CREATING a new "+kind, "Namespace", obj.GetNamespace(), "Name", obj.GetName()) err = c.Create(ctx, obj) @@ -86,7 +87,7 @@ func (c *Client) UpdateOwned(ctx context.Context, old, obj client.Object) error return nil } -// UpdateIfOwned is an helper function that updates an object if currently owned by the operator +// UpdateIfOwned is an helper function that updates an object if currently owned and managed by the operator func (c *Client) UpdateIfOwned(ctx context.Context, old, obj client.Object) error { log := log.FromContext(ctx) diff --git a/pkg/helper/flowcollector.go b/pkg/helper/flowcollector.go index 05c6023fd..90c8072ee 100644 --- a/pkg/helper/flowcollector.go +++ b/pkg/helper/flowcollector.go @@ -12,6 +12,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +const ( + netobservManagedLabel = "netobserv-managed" +) + func GetSampling(spec *flowslatest.FlowCollectorSpec) int { if spec.Agent.EBPF.Sampling == nil { return 50 @@ -173,7 +177,26 @@ func PtrInt32(i *int32) int32 { return *i } +func AddOwnedLabel(obj client.Object) { + // set netobserv-managed label to true so users can easily switch to false if they want to skip ownership + labels := obj.GetLabels() + if labels == nil { + labels = make(map[string]string) + } + labels[netobservManagedLabel] = "true" + obj.SetLabels(labels) +} + +func SkipOwnership(obj client.Object) bool { + // ownership is ignored if netobserv-managed label is explicitly set to false + labels := obj.GetLabels() + return labels != nil && labels[netobservManagedLabel] == "false" +} + func IsOwned(obj client.Object) bool { + if SkipOwnership(obj) { + return false + } refs := obj.GetOwnerReferences() return len(refs) > 0 && strings.HasPrefix(refs[0].APIVersion, flowslatest.GroupVersion.Group) }