@@ -39,33 +39,30 @@ func (r *StackitClusterReconciler) reconcileBastion(
3939 cloudClient cloud.Client ,
4040 clusterScope * scope.ClusterScope ,
4141) (ctrl.Result , bool , error ) {
42- cluster := clusterScope .StackitCluster
43- input := bastionservice .Input (cluster , nil )
42+ stackitCluster := clusterScope .StackitCluster
43+ input := bastionservice .Input (stackitCluster , nil )
4444 status := cloud.Bastion {
45- ServerID : cluster .Status .Bastion .ServerID ,
46- PublicIPID : cluster .Status .Bastion .PublicIPID ,
47- PublicIP : cluster .Status .Bastion .PublicIP ,
48- SecurityGroupID : cluster .Status .Bastion .SecurityGroupID ,
49- }
50-
51- if ! cluster .Spec .Bastion .Enabled {
52- // The condition carries this reason only after a cleanup has succeeded,
53- // so anything else means we may still own bastion resources — including
54- // the case where EnsureBastion succeeded but its status patch was lost.
55- // Keying on it instead of on the status keeps the tag-based cleanup to
56- // once per cluster rather than once per reconcile, which matters because
57- // this path runs for every cluster without a bastion.
58- condition := meta .FindStatusCondition (cluster .Status .Conditions , infrav1 .ClusterBastionReadyCondition )
45+ ServerID : stackitCluster .Status .Bastion .ServerID ,
46+ PublicIPID : stackitCluster .Status .Bastion .PublicIPID ,
47+ PublicIP : stackitCluster .Status .Bastion .PublicIP ,
48+ SecurityGroupID : stackitCluster .Status .Bastion .SecurityGroupID ,
49+ }
50+
51+ if ! stackitCluster .Spec .Bastion .Enabled {
52+ // The reason is set only after a cleanup has succeeded, so anything else
53+ // means bastion resources may still exist. Keying on it rather than on
54+ // the status keeps the tag-based cleanup to once per cluster.
55+ condition := meta .FindStatusCondition (stackitCluster .Status .Conditions , infrav1 .ClusterBastionReadyCondition )
5956 if condition == nil || condition .Reason != bastionDisabledReason {
60- if err := cloudClient .DeleteNodeSSHAccess (ctx , bastionservice .NodeSSHAccessTags (cluster )); err != nil {
57+ if err := cloudClient .DeleteNodeSSHAccess (ctx , bastionservice .NodeSSHAccessTags (stackitCluster )); err != nil {
6158 return ctrl.Result {}, false , err
6259 }
6360 if err := cloudClient .DeleteBastion (ctx , input , status ); err != nil {
6461 return ctrl.Result {}, false , err
6562 }
6663 clusterScope .ClearBastionStatus ()
6764 if r .Recorder != nil {
68- r .Recorder .Eventf (cluster , nil , corev1 .EventTypeNormal , "BastionDeleted" , "Delete" , "Deleted bastion" )
65+ r .Recorder .Eventf (stackitCluster , nil , corev1 .EventTypeNormal , "BastionDeleted" , "Delete" , "Deleted bastion" )
6966 }
7067 }
7168 clusterScope .SetConditions (
@@ -77,7 +74,7 @@ func (r *StackitClusterReconciler) reconcileBastion(
7774 return ctrl.Result {}, true , nil
7875 }
7976
80- if err := validateBastionSpec (cluster .Spec .Bastion ); err != nil {
77+ if err := validateBastionSpec (stackitCluster .Spec .Bastion ); err != nil {
8178 clusterScope .SetNotReady (
8279 "InvalidBastionSpec" ,
8380 err .Error (),
@@ -87,7 +84,7 @@ func (r *StackitClusterReconciler) reconcileBastion(
8784 return ctrl.Result {}, false , nil
8885 }
8986
90- cloudInit , err := r .resolveBastionCloudInit (ctx , cluster )
87+ cloudInit , err := r .resolveBastionCloudInit (ctx , stackitCluster )
9188 if err != nil {
9289 clusterScope .SetNotReady (
9390 "CloudInitRefError" ,
@@ -99,33 +96,38 @@ func (r *StackitClusterReconciler) reconcileBastion(
9996 }
10097 input .CloudInit = cloudInit
10198
102- if bastionNeedsRecreate (cluster , cloudInit ) {
103- if err := cloudClient .DeleteNodeSSHAccess (ctx , bastionservice .NodeSSHAccessTags (cluster )); err != nil && ! cloud .IsNotFound (err ) {
99+ if bastionNeedsRecreate (stackitCluster , cloudInit ) {
100+ if err := cloudClient .DeleteNodeSSHAccess (ctx , bastionservice .NodeSSHAccessTags (stackitCluster )); err != nil && ! cloud .IsNotFound (err ) {
104101 return ctrl.Result {}, false , err
105102 }
106103 if err := cloudClient .DeleteBastion (ctx , input , status ); err != nil && ! cloud .IsNotFound (err ) {
107104 return ctrl.Result {}, false , err
108105 }
109106 clusterScope .ClearBastionStatus ()
110- clusterScope .SetNotReady ("Recreating" , "recreating bastion because cloudInitRef content changed" , infrav1 .ClusterBastionReadyCondition , infrav1 .ClusterReadyCondition )
107+ clusterScope .SetNotReady (
108+ "Recreating" ,
109+ "recreating bastion because cloudInitRef content changed" ,
110+ infrav1 .ClusterBastionReadyCondition ,
111+ infrav1 .ClusterReadyCondition ,
112+ )
111113 if r .Recorder != nil {
112114 r .Recorder .Eventf (
113- cluster , nil , corev1 .EventTypeNormal , "BastionRecreating" , "Recreate" ,
115+ stackitCluster , nil , corev1 .EventTypeNormal , "BastionRecreating" , "Recreate" ,
114116 "Recreating bastion because cloudInitRef content changed" ,
115117 )
116118 }
117119 return ctrl.Result {RequeueAfter : retryableErrorRequeueAfter }, false , nil
118120 }
119121
120- hadBastionStatus := hasBastionStatus (cluster .Status .Bastion )
122+ hadBastionStatus := hasBastionStatus (stackitCluster .Status .Bastion )
121123 bastion , err := cloudClient .EnsureBastion (ctx , input )
122124 if err != nil {
123125 return ctrl.Result {}, false , err
124126 }
125127 clusterScope .SetBastionStatus (bastion , bastionCloudInitHash (cloudInit ))
126128 if ! hadBastionStatus && r .Recorder != nil {
127129 r .Recorder .Eventf (
128- cluster , nil , corev1 .EventTypeNormal , "BastionCreated" , "Create" , "Created bastion %s" , bastion .ServerID ,
130+ stackitCluster , nil , corev1 .EventTypeNormal , "BastionCreated" , "Create" , "Created bastion %s" , bastion .ServerID ,
129131 )
130132 }
131133 if bastion .ServerState != "" && bastion .ServerState != "ACTIVE" {
@@ -180,11 +182,11 @@ func hasBastionStatus(status infrav1.StackitBastionStatus) bool {
180182 return status .ServerID != "" || status .PublicIPID != "" || status .PublicIP != "" || status .SecurityGroupID != ""
181183}
182184
183- func bastionNeedsRecreate (sc * infrav1.StackitCluster , cloudInit []byte ) bool {
184- if ! hasBastionStatus (sc .Status .Bastion ) {
185+ func bastionNeedsRecreate (stackitCluster * infrav1.StackitCluster , cloudInit []byte ) bool {
186+ if ! hasBastionStatus (stackitCluster .Status .Bastion ) {
185187 return false
186188 }
187- return sc .Status .Bastion .CloudInitHash != bastionCloudInitHash (cloudInit )
189+ return stackitCluster .Status .Bastion .CloudInitHash != bastionCloudInitHash (cloudInit )
188190}
189191
190192func bastionCloudInitHash (cloudInit []byte ) string {
@@ -194,12 +196,12 @@ func bastionCloudInitHash(cloudInit []byte) string {
194196 return fmt .Sprintf ("%x" , sha256 .Sum256 (cloudInit ))
195197}
196198
197- func (r * StackitClusterReconciler ) resolveBastionCloudInit (ctx context.Context , sc * infrav1.StackitCluster ) ([]byte , error ) {
198- ref := sc .Spec .Bastion .CloudInitRef
199+ func (r * StackitClusterReconciler ) resolveBastionCloudInit (ctx context.Context , stackitCluster * infrav1.StackitCluster ) ([]byte , error ) {
200+ ref := stackitCluster .Spec .Bastion .CloudInitRef
199201 if ref == nil {
200202 return nil , nil
201203 }
202- key := types.NamespacedName {Namespace : sc .Namespace , Name : ref .Name }
204+ key := types.NamespacedName {Namespace : stackitCluster .Namespace , Name : ref .Name }
203205 switch ref .Kind {
204206 case "ConfigMap" :
205207 configMap := & corev1.ConfigMap {}
0 commit comments