@@ -34,11 +34,13 @@ import (
3434 "k8s.io/apimachinery/pkg/api/errors"
3535 "k8s.io/apimachinery/pkg/api/meta"
3636 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37+ "k8s.io/apimachinery/pkg/runtime"
3738 "k8s.io/apimachinery/pkg/types"
3839 "k8s.io/apimachinery/pkg/util/wait"
3940 "k8s.io/client-go/discovery"
4041 "k8s.io/client-go/rest"
4142 "sigs.k8s.io/controller-runtime/pkg/client"
43+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4244 "sigs.k8s.io/yaml"
4345
4446 "github.com/kagenti/operator/internal/mlflow"
@@ -76,6 +78,7 @@ type OtelBootstrapRunnable struct {
7678 Client client.Client
7779 APIReader client.Reader
7880 Config * rest.Config
81+ Scheme * runtime.Scheme
7982 Namespace string
8083 Log logr.Logger
8184
@@ -93,27 +96,61 @@ type OtelBootstrapRunnable struct {
9396 EnsureExperiment func (ctx context.Context , baseURL , workspace string ) (string , error )
9497}
9598
99+ // operatorDeploymentNames lists possible Deployment names for the operator itself,
100+ // used to set OwnerReferences on bootstrap-created resources.
101+ var operatorDeploymentNames = []string {
102+ "kagenti-controller-manager" ,
103+ "controller-manager" ,
104+ }
105+
106+ // getOperatorOwner looks up the operator's own Deployment to use as an OwnerReference.
107+ // Returns nil if the deployment cannot be found (best-effort).
108+ func (r * OtelBootstrapRunnable ) getOperatorOwner (ctx context.Context , log logr.Logger ) * appsv1.Deployment {
109+ for _ , name := range operatorDeploymentNames {
110+ deploy := & appsv1.Deployment {}
111+ key := types.NamespacedName {Name : name , Namespace : r .Namespace }
112+ if err := r .Client .Get (ctx , key , deploy ); err == nil {
113+ return deploy
114+ }
115+ }
116+ log .Info ("Could not find operator Deployment for OwnerReference, ConfigMaps will be unowned" )
117+ return nil
118+ }
119+
120+ // setOwnerIfAvailable sets an OwnerReference on the given object if an owner is available.
121+ func (r * OtelBootstrapRunnable ) setOwnerIfAvailable (owner * appsv1.Deployment , obj client.Object , log logr.Logger ) {
122+ if owner == nil || r .Scheme == nil {
123+ return
124+ }
125+ if err := controllerutil .SetOwnerReference (owner , obj , r .Scheme ); err != nil {
126+ log .Error (err , "Failed to set OwnerReference on resource" , "name" , obj .GetName ())
127+ }
128+ }
129+
96130// Start runs the bootstrap sequence. Called by the manager after leader election
97131// and cache sync, before controllers start processing events.
98132func (r * OtelBootstrapRunnable ) Start (ctx context.Context ) error {
99133 log := r .Log .WithName ("otel-bootstrap" )
100134 log .Info ("Starting OTel collector bootstrap" )
101135
136+ // Look up operator Deployment once for OwnerReference on created resources.
137+ owner := r .getOperatorOwner (ctx , log )
138+
102139 isOCP , err := r .detectOpenShift (ctx )
103140 if err != nil {
104141 return fmt .Errorf ("detecting OpenShift: %w" , err )
105142 }
106143
107144 if isOCP {
108145 log .Info ("OpenShift detected, reconciling ingress CA trust" )
109- if err := r .reconcileIngressCA (ctx , log ); err != nil {
146+ if err := r .reconcileIngressCA (ctx , log , owner ); err != nil {
110147 return fmt .Errorf ("ingress CA bootstrap: %w" , err )
111148 }
112149 } else {
113150 log .Info ("Not running on OpenShift, skipping ingress CA trust" )
114151 }
115152
116- if err := r .reconcileCollectorConfig (ctx , log , isOCP ); err != nil {
153+ if err := r .reconcileCollectorConfig (ctx , log , isOCP , owner ); err != nil {
117154 return fmt .Errorf ("collector config bootstrap: %w" , err )
118155 }
119156
@@ -156,7 +193,7 @@ func (r *OtelBootstrapRunnable) detectOpenShift(ctx context.Context) (bool, erro
156193
157194// reconcileIngressCA reads the OpenShift ingress CA and root CA, then creates
158195// or updates the otel-ingress-ca ConfigMap in the operator namespace.
159- func (r * OtelBootstrapRunnable ) reconcileIngressCA (ctx context.Context , log logr.Logger ) error {
196+ func (r * OtelBootstrapRunnable ) reconcileIngressCA (ctx context.Context , log logr.Logger , owner * appsv1. Deployment ) error {
160197 ingressCert := & corev1.ConfigMap {}
161198 key := types.NamespacedName {Name : ingressCertConfigMap , Namespace : ingressCertNamespace }
162199 if err := r .APIReader .Get (ctx , key , ingressCert ); err != nil {
@@ -197,6 +234,7 @@ func (r *OtelBootstrapRunnable) reconcileIngressCA(ctx context.Context, log logr
197234 },
198235 Data : map [string ]string {caBundleKey : caBundle },
199236 }
237+ r .setOwnerIfAvailable (owner , cm , log )
200238 if err := r .Client .Create (ctx , cm ); err != nil {
201239 if ! errors .IsAlreadyExists (err ) {
202240 return fmt .Errorf ("creating %s ConfigMap: %w" , ingressCAConfigMap , err )
@@ -231,7 +269,7 @@ func (r *OtelBootstrapRunnable) reconcileIngressCA(ctx context.Context, log logr
231269
232270// reconcileCollectorConfig discovers available components and assembles the
233271// OTel collector ConfigMap from preset configurations.
234- func (r * OtelBootstrapRunnable ) reconcileCollectorConfig (ctx context.Context , log logr.Logger , isOCP bool ) error {
272+ func (r * OtelBootstrapRunnable ) reconcileCollectorConfig (ctx context.Context , log logr.Logger , isOCP bool , owner * appsv1. Deployment ) error {
235273 mf , err := r .discoverMLflow (ctx , log )
236274 if err != nil {
237275 return err
@@ -291,6 +329,7 @@ func (r *OtelBootstrapRunnable) reconcileCollectorConfig(ctx context.Context, lo
291329 },
292330 Data : map [string ]string {configMapDataKey : configStr },
293331 }
332+ r .setOwnerIfAvailable (owner , cm , log )
294333 if err := r .Client .Create (ctx , cm ); err != nil {
295334 if ! errors .IsAlreadyExists (err ) {
296335 return fmt .Errorf ("creating collector ConfigMap: %w" , err )
0 commit comments