@@ -12,15 +12,19 @@ import (
12
12
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
13
"k8s.io/apimachinery/pkg/types"
14
14
"k8s.io/apimachinery/pkg/util/wait"
15
+ "k8s.io/client-go/informers"
15
16
corev1listers "k8s.io/client-go/listers/core/v1"
16
17
"k8s.io/klog/v2"
17
18
18
19
configv1 "github.com/openshift/api/config/v1"
19
20
routev1 "github.com/openshift/api/route/v1"
20
21
applyconfigv1 "github.com/openshift/client-go/config/applyconfigurations/config/v1"
21
22
configsetterv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
22
- configinformers "github.com/openshift/client-go/config/informers/externalversions/config/v1"
23
+ configinformers "github.com/openshift/client-go/config/informers/externalversions"
24
+ configinformersv1 "github.com/openshift/client-go/config/informers/externalversions/config/v1"
23
25
configlistersv1 "github.com/openshift/client-go/config/listers/config/v1"
26
+ operatorv1informers "github.com/openshift/client-go/operator/informers/externalversions/operator/v1"
27
+ operatorv1listers "github.com/openshift/client-go/operator/listers/operator/v1"
24
28
routeclient "github.com/openshift/client-go/route/clientset/versioned/typed/route/v1"
25
29
routeinformer "github.com/openshift/client-go/route/informers/externalversions/route/v1"
26
30
routev1lister "github.com/openshift/client-go/route/listers/route/v1"
@@ -51,18 +55,25 @@ type customRouteController struct {
51
55
secretLister corev1listers.SecretLister
52
56
resourceSyncer resourcesynccontroller.ResourceSyncer
53
57
operatorClient v1helpers.OperatorClient
58
+
59
+ authLister configlistersv1.AuthenticationLister
60
+ kasLister operatorv1listers.KubeAPIServerLister
61
+ kasConfigMapLister corev1listers.ConfigMapLister
54
62
}
55
63
56
64
func NewCustomRouteController (
57
65
componentRouteNamespace string ,
58
66
componentRouteName string ,
59
67
destSecretNamespace string ,
60
68
destSecretName string ,
61
- ingressInformer configinformers .IngressInformer ,
69
+ ingressInformer configinformersv1 .IngressInformer ,
62
70
ingressClient configsetterv1.IngressInterface ,
63
71
routeInformer routeinformer.RouteInformer ,
64
72
routeClient routeclient.RouteInterface ,
65
73
kubeInformersForNamespaces v1helpers.KubeInformersForNamespaces ,
74
+ operatorConfigInformers configinformers.SharedInformerFactory ,
75
+ kasInformer operatorv1informers.KubeAPIServerInformer ,
76
+ kasConfigMapInformer informers.SharedInformerFactory ,
66
77
operatorClient v1helpers.OperatorClient ,
67
78
eventRecorder events.Recorder ,
68
79
resourceSyncer resourcesynccontroller.ResourceSyncer ,
@@ -83,6 +94,10 @@ func NewCustomRouteController(
83
94
secretLister : kubeInformersForNamespaces .SecretLister (),
84
95
operatorClient : operatorClient ,
85
96
resourceSyncer : resourceSyncer ,
97
+
98
+ authLister : operatorConfigInformers .Config ().V1 ().Authentications ().Lister (),
99
+ kasLister : kasInformer .Lister (),
100
+ kasConfigMapLister : kasConfigMapInformer .Core ().V1 ().ConfigMaps ().Lister (),
86
101
}
87
102
88
103
return factory .New ().
@@ -91,6 +106,8 @@ func NewCustomRouteController(
91
106
routeInformer .Informer (),
92
107
kubeInformersForNamespaces .InformersFor ("openshift-config" ).Core ().V1 ().Secrets ().Informer (),
93
108
kubeInformersForNamespaces .InformersFor ("openshift-authentication" ).Core ().V1 ().Secrets ().Informer (),
109
+ operatorConfigInformers .Config ().V1 ().Authentications ().Informer (),
110
+ kasInformer .Informer (),
94
111
).
95
112
WithSyncDegradedOnError (operatorClient ).
96
113
WithSync (controller .sync ).
@@ -116,6 +133,12 @@ func (c *customRouteController) sync(ctx context.Context, syncCtx factory.SyncCo
116
133
return fmt .Errorf ("custom route configuration failed verification: %v" , errors )
117
134
}
118
135
136
+ if oidcAvailable , err := common .ExternalOIDCConfigAvailable (c .authLister , c .kasLister , c .kasConfigMapLister ); err != nil {
137
+ return err
138
+ } else if oidcAvailable {
139
+ return c .removeOperands (ctx , ingressConfigCopy , secretName )
140
+ }
141
+
119
142
// create or modify the existing route
120
143
if err = c .applyRoute (ctx , expectedRoute ); err != nil {
121
144
return err
@@ -289,3 +312,46 @@ func (c *customRouteController) getFieldManager() string {
289
312
// TODO find a way to get the client name and combine it with the controller name automatically
290
313
return "AuthenticationCustomRouteController"
291
314
}
315
+
316
+ func (c * customRouteController ) removeOperands (ctx context.Context , ingressConfig * configv1.Ingress , secretName string ) error {
317
+ if _ , err := c .routeLister .Routes (c .componentRoute .Namespace ).Get (c .componentRoute .Name ); err != nil && ! errors .IsNotFound (err ) {
318
+ return err
319
+ } else if ! errors .IsNotFound (err ) {
320
+ if err := c .routeClient .Delete (ctx , c .componentRoute .Name , metav1.DeleteOptions {}); err != nil && ! errors .IsNotFound (err ) {
321
+ return err
322
+ }
323
+ }
324
+
325
+ ingressStatus , err := applyconfigv1 .ExtractIngressStatus (ingressConfig , c .getFieldManager ())
326
+ if err != nil {
327
+ return err
328
+ }
329
+
330
+ if ingressStatus != nil && ingressStatus .Status != nil {
331
+ componentRoutes := make ([]applyconfigv1.ComponentRouteStatusApplyConfiguration , 0 )
332
+ routeFound := false
333
+ for _ , cr := range ingressStatus .Status .ComponentRoutes {
334
+ if * cr .Name == c .componentRoute .Name && * cr .Namespace == c .componentRoute .Namespace {
335
+ routeFound = true
336
+ continue
337
+ }
338
+
339
+ componentRoutes = append (componentRoutes , cr )
340
+ }
341
+
342
+ if routeFound {
343
+ ingressStatus .Status .ComponentRoutes = componentRoutes
344
+ ingress := applyconfigv1 .Ingress (ingressConfig .Name ).WithStatus (ingressStatus .Status )
345
+ if _ , err := c .ingressClient .ApplyStatus (ctx , ingress , c .forceApply ()); err != nil {
346
+ return err
347
+ }
348
+ }
349
+ }
350
+
351
+ // delete secret by syncing an empty source
352
+ if err := c .syncSecret ("" ); err != nil {
353
+ return err
354
+ }
355
+
356
+ return nil
357
+ }
0 commit comments