@@ -22,6 +22,7 @@ import (
22
22
routeapi "github.com/openshift/origin/pkg/route/api"
23
23
"github.com/openshift/origin/pkg/router"
24
24
"github.com/openshift/origin/pkg/router/controller"
25
+ "k8s.io/kubernetes/pkg/api/meta"
25
26
)
26
27
27
28
// RouterControllerFactory initializes and manages the watches that drive a router
@@ -56,25 +57,39 @@ func NewDefaultRouterControllerFactory(oc osclient.RoutesNamespacer, kc kclients
56
57
}
57
58
}
58
59
60
+ func routerKeyFn (obj interface {}) (string , error ) {
61
+ if key , ok := obj .(cache.ExplicitKey ); ok {
62
+ return string (key ), nil
63
+ }
64
+ meta , err := meta .Accessor (obj )
65
+ if err != nil {
66
+ return "" , fmt .Errorf ("object has no meta: %v" , err )
67
+ }
68
+ if len (meta .GetNamespace ()) > 0 {
69
+ return meta .GetNamespace () + "/" + meta .GetName () + "/" + string (meta .GetUID ()), nil
70
+ }
71
+ return meta .GetName () + "/" + string (meta .GetUID ()), nil
72
+ }
73
+
59
74
// Create begins listing and watching against the API server for the desired route and endpoint
60
75
// resources. It spawns child goroutines that cannot be terminated.
61
76
func (factory * RouterControllerFactory ) Create (plugin router.Plugin , watchNodes , enableIngress bool ) * controller.RouterController {
62
- routeEventQueue := oscache .NewEventQueue (cache . MetaNamespaceKeyFunc )
77
+ routeEventQueue := oscache .NewEventQueue (routerKeyFn )
63
78
cache .NewReflector (& routeLW {
64
79
client : factory .OSClient ,
65
80
namespace : factory .Namespace ,
66
81
field : factory .Fields ,
67
82
label : factory .Labels ,
68
83
}, & routeapi.Route {}, routeEventQueue , factory .ResyncInterval ).Run ()
69
84
70
- endpointsEventQueue := oscache .NewEventQueue (cache . MetaNamespaceKeyFunc )
85
+ endpointsEventQueue := oscache .NewEventQueue (routerKeyFn )
71
86
cache .NewReflector (& endpointsLW {
72
87
client : factory .KClient ,
73
88
namespace : factory .Namespace ,
74
89
// we do not scope endpoints by labels or fields because the route labels != endpoints labels
75
90
}, & kapi.Endpoints {}, endpointsEventQueue , factory .ResyncInterval ).Run ()
76
91
77
- nodeEventQueue := oscache .NewEventQueue (cache . MetaNamespaceKeyFunc )
92
+ nodeEventQueue := oscache .NewEventQueue (routerKeyFn )
78
93
if watchNodes {
79
94
cache .NewReflector (& nodeLW {
80
95
client : factory .NodeClient ,
@@ -83,8 +98,8 @@ func (factory *RouterControllerFactory) Create(plugin router.Plugin, watchNodes,
83
98
}, & kapi.Node {}, nodeEventQueue , factory .ResyncInterval ).Run ()
84
99
}
85
100
86
- ingressEventQueue := oscache .NewEventQueue (cache . MetaNamespaceKeyFunc )
87
- secretEventQueue := oscache .NewEventQueue (cache . MetaNamespaceKeyFunc )
101
+ ingressEventQueue := oscache .NewEventQueue (routerKeyFn )
102
+ secretEventQueue := oscache .NewEventQueue (routerKeyFn )
88
103
var ingressTranslator * controller.IngressTranslator
89
104
if enableIngress {
90
105
ingressTranslator = controller .NewIngressTranslator (factory .SecretClient )
@@ -195,7 +210,7 @@ func (factory *RouterControllerFactory) Create(plugin router.Plugin, watchNodes,
195
210
// resources. It spawns child goroutines that cannot be terminated. It is a more efficient store of a
196
211
// route system.
197
212
func (factory * RouterControllerFactory ) CreateNotifier (changed func ()) RoutesByHost {
198
- keyFn := cache . MetaNamespaceKeyFunc
213
+ keyFn := routerKeyFn
199
214
routeStore := cache .NewIndexer (keyFn , cache.Indexers {"host" : hostIndexFunc })
200
215
routeEventQueue := oscache .NewEventQueueForStore (keyFn , routeStore )
201
216
cache .NewReflector (& routeLW {
0 commit comments