@@ -33,7 +33,8 @@ import (
33
33
"text/template"
34
34
35
35
operatorv1alpha1 "github.com/IBM/ibm-iam-operator/api/operator/v1alpha1"
36
- ctrlcommon "github.com/IBM/ibm-iam-operator/internal/controller/common"
36
+ "github.com/IBM/ibm-iam-operator/internal/controller/common"
37
+ dbconn "github.com/IBM/ibm-iam-operator/internal/database/connectors"
37
38
"github.com/opdev/subreconciler"
38
39
routev1 "github.com/openshift/api/route/v1"
39
40
batchv1 "k8s.io/api/batch/v1"
@@ -71,27 +72,27 @@ func (r *AuthenticationReconciler) handleConfigMaps(ctx context.Context, req ctr
71
72
return subreconciler .RequeueWithDelay (defaultLowerWait )
72
73
}
73
74
74
- builders := []* ctrlcommon .SecondaryReconcilerBuilder [* corev1.ConfigMap ]{
75
- ctrlcommon .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
75
+ builders := []* common .SecondaryReconcilerBuilder [* corev1.ConfigMap ]{
76
+ common .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
76
77
WithName ("platform-auth-idp" ).
77
- WithGenerateFns (generateAuthIdpConfigMap (ibmCloudClusterInfoCM )).
78
+ WithGenerateFns (r . generateAuthIdpConfigMap (ibmCloudClusterInfoCM )).
78
79
WithModifyFns (updatePlatformAuthIDP ).
79
80
WithOnWriteFns (signalNeedRolloutFn [* corev1.ConfigMap ](r )),
80
- ctrlcommon .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
81
+ common .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
81
82
WithName ("registration-json" ).
82
83
WithGenerateFns (generateRegistrationJsonConfigMap (ibmCloudClusterInfoCM )).
83
84
WithModifyFns (updateRegistrationJSON ).
84
85
WithOnWriteFns (replaceOIDCClientRegistrationJob ),
85
- ctrlcommon .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
86
+ common .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
86
87
WithName ("oauth-client-map" ).
87
88
WithGenerateFns (generateOAuthClientConfigMap (ibmCloudClusterInfoCM )).
88
89
WithModifyFns (updateOAuthClientConfigMap ),
89
- ctrlcommon .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
90
+ common .NewSecondaryReconcilerBuilder [* corev1.ConfigMap ]().
90
91
WithName ("registration-script" ).
91
92
WithGenerateFns (generateRegistrationScriptConfigMap ()),
92
93
}
93
94
94
- subRecs := []ctrlcommon .SecondaryReconciler {}
95
+ subRecs := []common .SecondaryReconciler {}
95
96
for i := range builders {
96
97
subRecs = append (subRecs , builders [i ].
97
98
WithNamespace (authCR .Namespace ).
@@ -108,7 +109,7 @@ func (r *AuthenticationReconciler) handleConfigMaps(ctx context.Context, req ctr
108
109
errs = append (errs , err )
109
110
}
110
111
111
- return ctrlcommon .ReduceSubreconcilerResultsAndErrors (subresults , errs )
112
+ return common .ReduceSubreconcilerResultsAndErrors (subresults , errs )
112
113
}
113
114
114
115
// getConfigMapDataSHA1Sum calculates the SHA1 of the `.data` field.
@@ -130,7 +131,7 @@ func getConfigMapDataSHA1Sum(cm *corev1.ConfigMap) (sha string, err error) {
130
131
// set.
131
132
func getCNCFDomain (ctx context.Context , cl client.Client , authCR * operatorv1alpha1.Authentication ) (domainName string , err error ) {
132
133
logger := logf .FromContext (ctx )
133
- cmName := ctrlcommon .GlobalConfigMapName
134
+ cmName := common .GlobalConfigMapName
134
135
cmNs := authCR .Namespace
135
136
cm := & corev1.ConfigMap {}
136
137
err = cl .Get (ctx , types.NamespacedName {Name : cmName , Namespace : cmNs }, cm )
@@ -151,12 +152,12 @@ func getCNCFDomain(ctx context.Context, cl client.Client, authCR *operatorv1alph
151
152
152
153
// handleIBMCloudClusterInfo creates the ibmcloud-cluster-info configmap if not created already
153
154
func (r * AuthenticationReconciler ) handleIBMCloudClusterInfo (ctx context.Context , authCR * operatorv1alpha1.Authentication , observed * corev1.ConfigMap ) (result * ctrl.Result , err error ) {
154
- reqLogger := logf .FromContext (ctx ).WithValues ("ConfigMap.Namespace" , authCR .Namespace , "ConfigMap.Name" , ctrlcommon .IBMCloudClusterInfoCMName )
155
+ reqLogger := logf .FromContext (ctx ).WithValues ("ConfigMap.Namespace" , authCR .Namespace , "ConfigMap.Name" , common .IBMCloudClusterInfoCMName )
155
156
generated := & corev1.ConfigMap {}
156
157
if err = r .generateIBMCloudClusterInfoConfigMap (ctx , authCR , generated ); err != nil {
157
158
return subreconciler .RequeueWithError (err )
158
159
}
159
- cmKey := types.NamespacedName {Name : ctrlcommon .IBMCloudClusterInfoCMName , Namespace : authCR .Namespace }
160
+ cmKey := types.NamespacedName {Name : common .IBMCloudClusterInfoCMName , Namespace : authCR .Namespace }
160
161
if err = r .Client .Get (ctx , cmKey , observed ); k8sErrors .IsNotFound (err ) {
161
162
reqLogger .Info ("Create new ConfigMap" )
162
163
if err = r .Client .Create (ctx , generated ); err != nil {
@@ -171,7 +172,7 @@ func (r *AuthenticationReconciler) handleIBMCloudClusterInfo(ctx context.Context
171
172
}
172
173
173
174
updated := false
174
- controllerKind := ctrlcommon .GetControllerKind (observed )
175
+ controllerKind := common .GetControllerKind (observed )
175
176
if controllerKind == "ManagementIngress" {
176
177
reqLogger .Info ("Configmap is already created by managementingress, IM installation may not proceed further until the configmap is removed" )
177
178
return subreconciler .RequeueWithDelay (defaultLowerWait )
@@ -220,7 +221,7 @@ func (r *AuthenticationReconciler) handleIBMCloudClusterInfo(ctx context.Context
220
221
return subreconciler .RequeueWithDelay (defaultLowerWait )
221
222
}
222
223
223
- func replaceOIDCClientRegistrationJob (s ctrlcommon .SecondaryReconciler , ctx context.Context ) (err error ) {
224
+ func replaceOIDCClientRegistrationJob (s common .SecondaryReconciler , ctx context.Context ) (err error ) {
224
225
job := & batchv1.Job {
225
226
ObjectMeta : metav1.ObjectMeta {
226
227
Name : "oidc-client-registration" ,
@@ -233,7 +234,7 @@ func replaceOIDCClientRegistrationJob(s ctrlcommon.SecondaryReconciler, ctx cont
233
234
return
234
235
}
235
236
236
- func updateRegistrationJSON (_ ctrlcommon .SecondaryReconciler , ctx context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
237
+ func updateRegistrationJSON (_ common .SecondaryReconciler , ctx context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
237
238
observedJSON := & registrationJSONData {}
238
239
if err = json .Unmarshal ([]byte (observed .Data ["platform-oidc-registration.json" ]), observedJSON ); err != nil {
239
240
return
@@ -258,7 +259,7 @@ func updateRegistrationJSON(_ ctrlcommon.SecondaryReconciler, ctx context.Contex
258
259
return
259
260
}
260
261
261
- func updateOAuthClientConfigMap (_ ctrlcommon .SecondaryReconciler , _ context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
262
+ func updateOAuthClientConfigMap (_ common .SecondaryReconciler , _ context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
262
263
updateFns := []func (* corev1.ConfigMap , * corev1.ConfigMap ) bool {
263
264
updatesValuesWhen (not (observedKeyValueSetTo [* corev1.ConfigMap ]("MASTER_IP" , generated .Data ["MASTER_IP" ])),
264
265
"MASTER_IP" ,
@@ -275,7 +276,7 @@ func updateOAuthClientConfigMap(_ ctrlcommon.SecondaryReconciler, _ context.Cont
275
276
return
276
277
}
277
278
278
- func updatePlatformAuthIDP (_ ctrlcommon .SecondaryReconciler , _ context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
279
+ func updatePlatformAuthIDP (_ common .SecondaryReconciler , _ context.Context , observed , generated * corev1.ConfigMap ) (updated bool , err error ) {
279
280
updateFns := []func (* corev1.ConfigMap , * corev1.ConfigMap ) bool {
280
281
updatesAlways [* corev1.ConfigMap ](
281
282
"ROKS_URL" ,
@@ -342,6 +343,8 @@ func updatePlatformAuthIDP(_ ctrlcommon.SecondaryReconciler, _ context.Context,
342
343
"LDAP_CTX_POOL_TIMEOUT" ,
343
344
"LDAP_CTX_POOL_WAITTIME" ,
344
345
"LDAP_CTX_POOL_PREFERREDSIZE" ),
346
+ updatesValuesWhen (not (observedKeySet [* corev1.ConfigMap ]("MASTER_PATH" )),
347
+ "MASTER_PATH" ),
345
348
}
346
349
347
350
if v , ok := generated .Data ["IS_OPENSHIFT_ENV" ]; ok {
@@ -391,8 +394,8 @@ type registrationJSONData struct {
391
394
RedirectURIs []string `json:"redirect_uris"`
392
395
}
393
396
394
- func generateAuthIdpConfigMap (clusterInfo * corev1.ConfigMap ) ctrlcommon .GenerateFn [* corev1.ConfigMap ] {
395
- return func (s ctrlcommon .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
397
+ func ( r * AuthenticationReconciler ) generateAuthIdpConfigMap (clusterInfo * corev1.ConfigMap ) common .GenerateFn [* corev1.ConfigMap ] {
398
+ return func (s common .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
396
399
reqLogger := logf .FromContext (ctx )
397
400
authCR , ok := s .GetPrimary ().(* operatorv1alpha1.Authentication )
398
401
if ! ok {
@@ -434,6 +437,14 @@ func generateAuthIdpConfigMap(clusterInfo *corev1.ConfigMap) ctrlcommon.Generate
434
437
}
435
438
}
436
439
440
+ // Set the path for SAML connections
441
+ var masterPath string
442
+ if masterPath , err = r .getMasterPath (ctx , ctrl.Request {NamespacedName : common .GetObjectKey (s .GetPrimary ())}); err != nil {
443
+ reqLogger .Error (err , "Failed to determine whether a preexisting SAML exists" )
444
+ err = fmt .Errorf ("could not set MASTER_PATH" )
445
+ return
446
+ }
447
+
437
448
* generated = corev1.ConfigMap {
438
449
ObjectMeta : metav1.ObjectMeta {
439
450
Name : s .GetName (),
@@ -449,6 +460,7 @@ func generateAuthIdpConfigMap(clusterInfo *corev1.ConfigMap) ctrlcommon.Generate
449
460
"IDENTITY_PROVIDER_URL" : "https://platform-identity-provider:4300" ,
450
461
"IDENTITY_MGMT_URL" : "https://platform-identity-management:4500" ,
451
462
"MASTER_HOST" : clusterInfo .Data ["cluster_address" ],
463
+ "MASTER_PATH" : masterPath ,
452
464
"NODE_ENV" : "production" ,
453
465
"ENABLE_JIT_EXTRA_ATTR" : "false" ,
454
466
"AUDIT_ENABLED_IDPROVIDER" : "false" ,
@@ -536,8 +548,8 @@ func generateAuthIdpConfigMap(clusterInfo *corev1.ConfigMap) ctrlcommon.Generate
536
548
}
537
549
}
538
550
539
- func generateRegistrationJsonConfigMap (clusterInfo * corev1.ConfigMap ) ctrlcommon .GenerateFn [* corev1.ConfigMap ] {
540
- return func (s ctrlcommon .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
551
+ func generateRegistrationJsonConfigMap (clusterInfo * corev1.ConfigMap ) common .GenerateFn [* corev1.ConfigMap ] {
552
+ return func (s common .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
541
553
reqLogger := logf .FromContext (ctx )
542
554
authCR , ok := s .GetPrimary ().(* operatorv1alpha1.Authentication )
543
555
if ! ok {
@@ -602,8 +614,8 @@ func generateRegistrationJsonConfigMap(clusterInfo *corev1.ConfigMap) ctrlcommon
602
614
}
603
615
}
604
616
605
- func generateRegistrationScriptConfigMap () ctrlcommon .GenerateFn [* corev1.ConfigMap ] {
606
- return func (s ctrlcommon .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
617
+ func generateRegistrationScriptConfigMap () common .GenerateFn [* corev1.ConfigMap ] {
618
+ return func (s common .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
607
619
reqLogger := logf .FromContext (ctx )
608
620
609
621
* generated = corev1.ConfigMap {
@@ -626,8 +638,8 @@ func generateRegistrationScriptConfigMap() ctrlcommon.GenerateFn[*corev1.ConfigM
626
638
627
639
}
628
640
629
- func generateOAuthClientConfigMap (clusterInfo * corev1.ConfigMap ) ctrlcommon .GenerateFn [* corev1.ConfigMap ] {
630
- return func (s ctrlcommon .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
641
+ func generateOAuthClientConfigMap (clusterInfo * corev1.ConfigMap ) common .GenerateFn [* corev1.ConfigMap ] {
642
+ return func (s common .SecondaryReconciler , ctx context.Context , generated * corev1.ConfigMap ) (err error ) {
631
643
reqLogger := logf .FromContext (ctx )
632
644
icpConsoleURL := clusterInfo .Data ["cluster_address" ]
633
645
icpProxyURL := clusterInfo .Data ["proxy_address" ]
@@ -697,7 +709,7 @@ func (r *AuthenticationReconciler) getDomain(ctx context.Context, authCR *operat
697
709
reqLogger := logf .FromContext (ctx )
698
710
699
711
commonLabel := map [string ]string {"app" : "im" }
700
- routeLabels := ctrlcommon .MergeMap (commonLabel , authCR .Spec .Labels )
712
+ routeLabels := common .MergeMap (commonLabel , authCR .Spec .Labels )
701
713
702
714
imRoutes := & routev1.RouteList {}
703
715
listOpts := []client.ListOption {
@@ -775,7 +787,7 @@ func (r *AuthenticationReconciler) generateCNCFClusterInfo(ctx context.Context,
775
787
776
788
* generated = corev1.ConfigMap {
777
789
ObjectMeta : metav1.ObjectMeta {
778
- Name : ctrlcommon .IBMCloudClusterInfoCMName ,
790
+ Name : common .IBMCloudClusterInfoCMName ,
779
791
Namespace : authCR .Namespace ,
780
792
Labels : map [string ]string {"app" : "auth-idp" },
781
793
},
@@ -838,7 +850,7 @@ func (r *AuthenticationReconciler) generateOCPClusterInfo(ctx context.Context, a
838
850
839
851
* generated = corev1.ConfigMap {
840
852
ObjectMeta : metav1.ObjectMeta {
841
- Name : ctrlcommon .IBMCloudClusterInfoCMName ,
853
+ Name : common .IBMCloudClusterInfoCMName ,
842
854
Namespace : authCR .Namespace ,
843
855
Labels : map [string ]string {"app" : "auth-idp" },
844
856
},
@@ -932,7 +944,7 @@ func (r *AuthenticationReconciler) generateIBMCloudClusterInfoConfigMap(ctx cont
932
944
// isHostedOnIBMCloud checks the
933
945
func isHostedOnIBMCloud (ctx context.Context , cl client.Client , namespace string ) (isPublicCloud bool , err error ) {
934
946
reqLogger := logf .FromContext (ctx ).V (1 )
935
- cmName := ctrlcommon .IBMCloudClusterInfoCMName
947
+ cmName := common .IBMCloudClusterInfoCMName
936
948
cm := & corev1.ConfigMap {}
937
949
if err = cl .Get (ctx , types.NamespacedName {Name : cmName , Namespace : namespace }, cm ); err != nil {
938
950
reqLogger .Info ("Error getting ConfigMap" , "ConfigMap.Name" , cmName , "ConfigMap.Namespace" , namespace , "msg" , err .Error ())
@@ -992,3 +1004,26 @@ func readROKSURL(ctx context.Context) (issuer string, err error) {
992
1004
993
1005
return issuer , nil
994
1006
}
1007
+
1008
+ func (r * AuthenticationReconciler ) getMasterPath (ctx context.Context , req ctrl.Request ) (path string , err error ) {
1009
+ p , err := r .GetPostgresDB (r .Client , ctx , req )
1010
+ if err != nil {
1011
+ return
1012
+ }
1013
+ var has bool
1014
+ if err = p .Connect (ctx ); err != nil {
1015
+ return
1016
+ }
1017
+ defer p .Disconnect (ctx )
1018
+
1019
+ samlChecker , ok := p .(dbconn.SAMLChecker )
1020
+ if ! ok {
1021
+ return "" , fmt .Errorf ("DB unable to check for SAML connection" )
1022
+ }
1023
+ if has , err = samlChecker .HasSAML (ctx ); err != nil {
1024
+ return
1025
+ } else if has {
1026
+ return "" , err
1027
+ }
1028
+ return "/idauth" , nil
1029
+ }
0 commit comments