Skip to content

Commit 345bc44

Browse files
authored
Rework Authentication status writes (#1028)
Originating issue: [IBMPrivateCloud/roadmap#66484](https://github.ibm.com/IBMPrivateCloud/roadmap/issues/66484) * Simplify to one deferred function that writes out status changes to the Authentication CR Signed-off-by: Rob Hundley <[email protected]>
1 parent 3fd5bce commit 345bc44

File tree

3 files changed

+58
-110
lines changed

3 files changed

+58
-110
lines changed

controllers/operator/authentication_controller.go

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ package operator
1818

1919
import (
2020
"context"
21+
"reflect"
2122

2223
"fmt"
23-
"reflect"
2424
"sync"
2525
"time"
2626

@@ -218,14 +218,6 @@ func (r *AuthenticationReconciler) Reconcile(ctx context.Context, req ctrl.Reque
218218
needToRequeue := false
219219

220220
reconcileCtx := logf.IntoContext(ctx, reqLogger)
221-
// Set default result
222-
result = ctrl.Result{}
223-
// Set Requeue to true if requeue is needed at end of reconcile loop
224-
defer func() {
225-
if needToRequeue {
226-
result.Requeue = true
227-
}
228-
}()
229221

230222
reqLogger.Info("Reconciling Authentication")
231223

@@ -262,63 +254,44 @@ func (r *AuthenticationReconciler) Reconcile(ctx context.Context, req ctrl.Reque
262254
return
263255
}
264256

257+
originalAuthCR := instance.DeepCopy()
265258
// Be sure to update status before returning if Authentication is found (but only if the Authentication hasn't
266259
// already been updated, e.g. finalizer update
267260
defer func() {
268-
reqLogger.Info("Update status before finishing loop.")
269-
if reflect.DeepEqual(instance.Status, operatorv1alpha1.AuthenticationStatus{}) {
270-
instance.Status = operatorv1alpha1.AuthenticationStatus{
271-
Nodes: []string{},
272-
}
261+
if needToRequeue {
262+
result.Requeue = true
273263
}
274-
currentServiceStatus := r.getCurrentServiceStatus(ctx, r.Client, instance)
275-
if !reflect.DeepEqual(currentServiceStatus, instance.Status.Service) {
276-
instance.Status.Service = currentServiceStatus
277-
reqLogger.Info("Current status does not reflect current state; updating")
264+
err = r.setAuthenticationStatus(ctx, instance)
265+
if reflect.DeepEqual(originalAuthCR.Status, instance.Status) {
266+
goto statuslog
278267
}
279-
statusUpdateErr := r.Client.Status().Update(ctx, instance)
280-
if statusUpdateErr != nil {
281-
reqLogger.Error(statusUpdateErr, "Failed to update status; trying again")
282-
currentInstance := &operatorv1alpha1.Authentication{}
283-
r.Client.Get(ctx, req.NamespacedName, currentInstance)
284-
currentInstance.Status.Service = currentServiceStatus
285-
statusUpdateErr = r.Client.Status().Update(ctx, currentInstance)
286-
if statusUpdateErr != nil {
287-
reqLogger.Error(statusUpdateErr, "Retry failed; returning error")
288-
return
289-
}
268+
reqLogger.Info("Update status before finishing loop.")
269+
if err = r.Client.Status().Update(ctx, instance); err != nil {
270+
reqLogger.Error(err, "Failed to update status")
290271
} else {
291272
reqLogger.Info("Updated status")
292273
}
293-
reqLogger.V(1).Info("Final result", "result", result, "err", err)
274+
statuslog:
275+
reqLogger.Info("Reconciliation complete")
294276
}()
295277

296278
var subResult *ctrl.Result
297279
if subResult, err = r.addMongoMigrationFinalizers(reconcileCtx, req); subreconciler.ShouldHaltOrRequeue(subResult, err) {
298-
reqLogger.V(1).Info("Should halt or requeue after addMongoMigrationFinalizers", "result", result, "err", err)
299-
result, err = subreconciler.Evaluate(subResult, err)
300-
return
280+
return subreconciler.Evaluate(subResult, err)
301281
}
302282

303283
if subResult, err = r.overrideMongoDBBootstrap(reconcileCtx, req); subreconciler.ShouldHaltOrRequeue(subResult, err) {
304-
reqLogger.V(1).Info("Should halt or requeue after overrideMongoDBBootstrap", "result", result, "err", err)
305-
result, err = subreconciler.Evaluate(subResult, err)
306-
return
284+
return subreconciler.Evaluate(subResult, err)
307285
}
308286

309287
if subResult, err = r.handleOperandRequest(reconcileCtx, req); subreconciler.ShouldHaltOrRequeue(subResult, err) {
310-
reqLogger.V(1).Info("Should halt or requeue after handleOperandRequest", "result", result, "err", err)
311-
result, err = subreconciler.Evaluate(subResult, err)
312-
return
288+
return subreconciler.Evaluate(subResult, err)
313289
}
314290

315291
if subResult, err = r.createEDBShareClaim(reconcileCtx, req); subreconciler.ShouldHaltOrRequeue(subResult, err) {
316-
reqLogger.V(1).Info("Should halt or requeue after createEDBShareClaim", "result", result, "err", err)
317-
result, err = subreconciler.Evaluate(subResult, err)
318-
return
292+
return subreconciler.Evaluate(subResult, err)
319293
}
320294

321-
// Check if this Certificate already exists and create it if it doesn't
322295
reqLogger.Info("Creating ibm-iam-operand-restricted serviceaccount")
323296
currentSA := &corev1.ServiceAccount{}
324297
err = r.createSA(instance, currentSA, &needToRequeue)
@@ -389,7 +362,6 @@ func (r *AuthenticationReconciler) Reconcile(ctx context.Context, req ctrl.Reque
389362
}
390363

391364
if result, err := r.handleMongoDBCleanup(reconcileCtx, req); subreconciler.ShouldHaltOrRequeue(result, err) {
392-
reqLogger.V(1).Info("Should halt or requeue after handleMongoDBCleanup", "result", result, "err", err)
393365
return subreconciler.Evaluate(result, err)
394366
}
395367

@@ -418,7 +390,7 @@ func (r *AuthenticationReconciler) Reconcile(ctx context.Context, req ctrl.Reque
418390
return subreconciler.Evaluate(subResult, err)
419391
}
420392

421-
return
393+
return subreconciler.Evaluate(subreconciler.DoNotRequeue())
422394
}
423395

424396
// SetupWithManager sets up the controller with the Manager.

controllers/operator/deployment.go

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package operator
1919
import (
2020
"context"
2121
"os"
22-
"reflect"
2322

2423
operatorv1alpha1 "github.com/IBM/ibm-iam-operator/apis/operator/v1alpha1"
2524
"github.com/IBM/ibm-iam-operator/controllers/common"
@@ -30,7 +29,6 @@ import (
3029
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3130
"k8s.io/apimachinery/pkg/runtime"
3231
"k8s.io/apimachinery/pkg/types"
33-
"sigs.k8s.io/controller-runtime/pkg/client"
3432
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3533
)
3634

@@ -165,18 +163,6 @@ func (r *AuthenticationReconciler) handleDeployment(instance *operatorv1alpha1.A
165163
}
166164
}
167165

168-
podList := &corev1.PodList{}
169-
listOpts := []client.ListOption{
170-
client.InNamespace(instance.Namespace),
171-
client.MatchingLabels(map[string]string{"k8s-app": deployment}),
172-
}
173-
if err = r.Client.List(context.TODO(), podList, listOpts...); err != nil {
174-
reqLogger.Error(err, "Failed to list pods", "Authentication.Namespace", instance.Namespace, "Authentication.Name", deployment)
175-
return err
176-
}
177-
reqLogger.Info("CS??? get pod names")
178-
podNames := getPodNames(podList.Items)
179-
180166
// Deployment already exists - don't requeue
181167
reqLogger.Info("Skip reconcile: Deployment already exists", "Deployment.Namespace", instance.Namespace, "Deployment.Name", deployment)
182168

@@ -229,21 +215,6 @@ func (r *AuthenticationReconciler) handleDeployment(instance *operatorv1alpha1.A
229215
}
230216
}
231217

232-
podListMgr := &corev1.PodList{}
233-
listOptsMgr := []client.ListOption{
234-
client.InNamespace(instance.Namespace),
235-
client.MatchingLabels(map[string]string{"k8s-app": managerDeployment}),
236-
}
237-
if err = r.Client.List(context.TODO(), podListMgr, listOptsMgr...); err != nil {
238-
reqLogger.Error(err, "Failed to list pods", "Authentication.Namespace", instance.Namespace, "Authentication.Name", managerDeployment)
239-
return err
240-
}
241-
reqLogger.Info("CS??? get pod names")
242-
podNamesMgr := getPodNames(podListMgr.Items)
243-
for _, pod := range podNamesMgr {
244-
podNames = append(podNames, pod)
245-
}
246-
247218
// Deployment already exists - don't requeue
248219
reqLogger.Info("Skip reconcile: Manager deployment already exists", "Deployment.Namespace", instance.Namespace, "Deployment.Name", managerDeployment)
249220
// reconcile provider
@@ -295,48 +266,12 @@ func (r *AuthenticationReconciler) handleDeployment(instance *operatorv1alpha1.A
295266
}
296267
}
297268

298-
podListProv := &corev1.PodList{}
299-
listOptsProv := []client.ListOption{
300-
client.InNamespace(instance.Namespace),
301-
client.MatchingLabels(map[string]string{"k8s-app": providerDeployment}),
302-
}
303-
if err = r.Client.List(context.TODO(), podListProv, listOptsProv...); err != nil {
304-
reqLogger.Error(err, "Failed to list pods", "Authentication.Namespace", instance.Namespace, "Authentication.Name", providerDeployment)
305-
return err
306-
}
307-
reqLogger.Info("CS??? get pod names")
308-
podNamesProv := getPodNames(podListProv.Items)
309-
for _, pod := range podNamesProv {
310-
podNames = append(podNames, pod)
311-
}
312-
// Deployment already exists - don't requeue
313-
reqLogger.Info("Final pod names", "Pod names:", podNames)
314-
// Update status.Nodes if needed
315-
if !reflect.DeepEqual(podNames, instance.Status.Nodes) {
316-
instance.Status.Nodes = podNames
317-
reqLogger.Info("CS??? put pod names in status")
318-
err := r.Client.Status().Update(context.TODO(), instance)
319-
if err != nil {
320-
reqLogger.Error(err, "Failed to update Authentication status")
321-
return err
322-
}
323-
}
324269
// Deployment already exists - don't requeue
325270
reqLogger.Info("Skip reconcile: Provider deployment already exists", "Deployment.Namespace", instance.Namespace, "Deployment.Name", providerDeployment)
326271
return nil
327272

328273
}
329274

330-
func getPodNames(pods []corev1.Pod) []string {
331-
reqLogger := log.WithValues("Request.Namespace", "CS??? namespace", "Request.Name", "CS???")
332-
var podNames []string
333-
for _, pod := range pods {
334-
podNames = append(podNames, pod.Name)
335-
reqLogger.Info("CS??? pod name=" + pod.Name)
336-
}
337-
return podNames
338-
}
339-
340275
func generateDeploymentObject(instance *operatorv1alpha1.Authentication, scheme *runtime.Scheme, deployment string, icpConsoleURL string, saasCrnId string, imagePullSecret string) *appsv1.Deployment {
341276

342277
reqLogger := log.WithValues("deploymentForAuthentication", "Entry", "instance.Name", instance.Name)

controllers/operator/resourcestatus.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package operator
1818

1919
import (
2020
"context"
21+
"slices"
2122

2223
operatorv1alpha1 "github.com/IBM/ibm-iam-operator/apis/operator/v1alpha1"
2324
zenv1 "github.com/IBM/ibm-iam-operator/apis/zen.cpd.ibm.com/v1"
@@ -41,6 +42,46 @@ const (
4142
ResourceNotReadyState string = "NotReady"
4243
)
4344

45+
func (r *AuthenticationReconciler) setAuthenticationStatus(ctx context.Context, authCR *operatorv1alpha1.Authentication) (err error) {
46+
nodes, err := r.getNodesStatus(ctx, authCR)
47+
if len(authCR.Status.Nodes) == 0 || !slices.Equal(authCR.Status.Nodes, nodes) {
48+
authCR.Status.Nodes = nodes
49+
}
50+
authCR.Status.Service = r.getCurrentServiceStatus(ctx, r.Client, authCR)
51+
return
52+
}
53+
54+
// getNodesStatus returns a sorted list of IM Pods that is written to the Authentication CR's .status.nodes.
55+
func (r *AuthenticationReconciler) getNodesStatus(ctx context.Context, authCR *operatorv1alpha1.Authentication) (nodes []string, err error) {
56+
log := logf.FromContext(ctx)
57+
appNames := []string{"platform-auth-service", "platform-identity-management", "platform-identity-provider"}
58+
nodes = []string{}
59+
for _, appName := range appNames {
60+
podList := &corev1.PodList{}
61+
listOptsProv := []client.ListOption{
62+
client.InNamespace(authCR.Namespace),
63+
client.MatchingLabels(map[string]string{"k8s-app": appName}),
64+
}
65+
if err = r.Client.List(ctx, podList, listOptsProv...); err != nil {
66+
log.Info("Failed to list pods by label and namespace", "k8s-app", appName, "namespace", authCR.Namespace)
67+
return
68+
}
69+
nodes = append(nodes, getPodNames(podList.Items)...)
70+
}
71+
slices.Sort(nodes)
72+
return
73+
}
74+
75+
func getPodNames(pods []corev1.Pod) []string {
76+
reqLogger := log.WithValues("Request.Namespace", "CS??? namespace", "Request.Name", "CS???")
77+
var podNames []string
78+
for _, pod := range pods {
79+
podNames = append(podNames, pod.Name)
80+
reqLogger.Info("CS??? pod name=" + pod.Name)
81+
}
82+
return podNames
83+
}
84+
4485
func getServiceStatus(ctx context.Context, k8sClient client.Client, namespacedName types.NamespacedName) (status operatorv1alpha1.ManagedResourceStatus) {
4586
reqLogger := logf.FromContext(ctx).WithName("getServiceStatus").V(1)
4687
kind := "Service"

0 commit comments

Comments
 (0)