@@ -35,6 +35,9 @@ const (
3535
3636 // ClusterNameLabel is the label used to identify the cluster name
3737 ClusterNameLabel = "cluster.x-k8s.io/cluster-name"
38+
39+ // ControllerVersion indicates the running version of the CAPTCluster controller
40+ ControllerVersion = "v0.4.2"
3841)
3942
4043// Reconciler reconciles a CAPTCluster object
@@ -108,6 +111,27 @@ func (r *Reconciler) ensureClusterLabels(ctx context.Context, captCluster *infra
108111 return nil
109112}
110113
114+ // setOwnerReference sets the owner reference to the parent Cluster
115+ func (r * Reconciler ) setOwnerReference (ctx context.Context , captCluster * infrastructurev1beta1.CAPTCluster , cluster * clusterv1.Cluster ) error {
116+ if cluster == nil {
117+ return nil
118+ }
119+
120+ // Check if owner reference already exists
121+ for _ , ref := range captCluster .OwnerReferences {
122+ if ref .Kind == "Cluster" && ref .APIVersion == clusterv1 .GroupVersion .String () {
123+ return nil
124+ }
125+ }
126+
127+ // Set owner reference
128+ if err := controllerutil .SetControllerReference (cluster , captCluster , r .Scheme ); err != nil {
129+ return err
130+ }
131+
132+ return r .Update (ctx , captCluster )
133+ }
134+
111135func (r * Reconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (Result , error ) {
112136 logger := log .FromContext (ctx )
113137 logger .Info ("Reconciling CAPTCluster" )
@@ -140,6 +164,15 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (Result, e
140164 return r .reconcileDelete (ctx , captCluster )
141165 }
142166
167+ // Add finalizer if it doesn't exist
168+ if ! controllerutil .ContainsFinalizer (captCluster , CAPTClusterFinalizer ) {
169+ controllerutil .AddFinalizer (captCluster , CAPTClusterFinalizer )
170+ if err := r .Update (ctx , captCluster ); err != nil {
171+ logger .Error (err , "Failed to add finalizer" )
172+ return Result {}, err
173+ }
174+ }
175+
143176 // Ensure required labels are set. This is done before the topology check
144177 // to ensure that the cluster name label is always present, which is used
145178 // by other parts of the system.
@@ -148,17 +181,15 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (Result, e
148181 return Result {}, err
149182 }
150183
151- if cluster .Spec .Topology == nil {
152- // Set owner reference if cluster exists
153- if err := controllerutil .SetControllerReference (cluster , captCluster , r .Scheme ); err != nil {
154- logger .Error (err , "Failed to set owner reference" )
155- return Result {}, err
156- }
157-
158- // Clear WaitingForCluster condition if it exists
159- meta .RemoveStatusCondition (& captCluster .Status .Conditions , WaitingForClusterCondition )
184+ // Set owner reference if cluster exists (Topology有無に関わらず)
185+ if err := r .setOwnerReference (ctx , captCluster , cluster ); err != nil {
186+ logger .Error (err , "Failed to set owner reference" )
187+ return Result {}, err
160188 }
161189
190+ // Clear WaitingForCluster condition if it exists
191+ meta .RemoveStatusCondition (& captCluster .Status .Conditions , WaitingForClusterCondition )
192+
162193 // Validate VPC configuration
163194 if err := captCluster .Spec .ValidateVPCConfiguration (); err != nil {
164195 logger .Error (err , "Invalid VPC configuration" )
@@ -256,6 +287,8 @@ func (r *Reconciler) cleanupWorkspaceTemplateApply(ctx context.Context, captClus
256287
257288// SetupWithManager sets up the controller with the Manager.
258289func (r * Reconciler ) SetupWithManager (mgr ctrl.Manager ) error {
290+ // Log controller version at startup
291+ log .Log .WithName ("captcluster" ).Info ("Starting CAPTCluster controller" , "version" , ControllerVersion )
259292 return ctrl .NewControllerManagedBy (mgr ).
260293 For (& infrastructurev1beta1.CAPTCluster {}, builder .WithPredicates (predicate.GenerationChangedPredicate {})).
261294 Owns (& infrastructurev1beta1.WorkspaceTemplateApply {}).
0 commit comments