@@ -25,11 +25,8 @@ import (
2525 "google.golang.org/grpc/xds/internal/xdsclient/xdsresource"
2626)
2727
28- type edsResourceWatcher interface {
29- WatchEndpoints (string , func (xdsresource.EndpointsUpdate , error )) func ()
30- }
31-
3228type edsDiscoveryMechanism struct {
29+ nameToWatch string
3330 cancelWatch func ()
3431 topLevelResolver topLevelResolver
3532 stopped * grpcsync.Event
@@ -64,31 +61,44 @@ func (er *edsDiscoveryMechanism) stop() {
6461 er .cancelWatch ()
6562}
6663
67- func (er * edsDiscoveryMechanism ) handleEndpointsUpdate (update xdsresource.EndpointsUpdate , err error ) {
68- if er .stopped .HasFired () {
69- return
64+ // newEDSResolver returns an implementation of the endpointsResolver interface
65+ // that uses EDS to resolve the given name to endpoints.
66+ func newEDSResolver (nameToWatch string , producer xdsresource.Producer , topLevelResolver topLevelResolver ) * edsDiscoveryMechanism {
67+ ret := & edsDiscoveryMechanism {
68+ nameToWatch : nameToWatch ,
69+ topLevelResolver : topLevelResolver ,
70+ stopped : grpcsync .NewEvent (),
7071 }
72+ ret .cancelWatch = xdsresource .WatchEndpoints (producer , nameToWatch , ret )
73+ return ret
74+ }
7175
72- if err != nil {
73- er .topLevelResolver .onError (err )
76+ // OnUpdate is invoked to report an update for the resource being watched.
77+ func (er * edsDiscoveryMechanism ) OnUpdate (update * xdsresource.EndpointsResourceData ) {
78+ if er .stopped .HasFired () {
7479 return
7580 }
7681
7782 er .mu .Lock ()
78- er .update = update
83+ er .update = update . Resource
7984 er .updateReceived = true
8085 er .mu .Unlock ()
8186
8287 er .topLevelResolver .onUpdate ()
8388}
8489
85- // newEDSResolver returns an implementation of the endpointsResolver interface
86- // that uses EDS to resolve the given name to endpoints.
87- func newEDSResolver (nameToWatch string , watcher edsResourceWatcher , topLevelResolver topLevelResolver ) * edsDiscoveryMechanism {
88- ret := & edsDiscoveryMechanism {
89- topLevelResolver : topLevelResolver ,
90- stopped : grpcsync .NewEvent (),
90+ func (er * edsDiscoveryMechanism ) OnError (err error ) {
91+ if er .stopped .HasFired () {
92+ return
9193 }
92- ret .cancelWatch = watcher .WatchEndpoints (nameToWatch , ret .handleEndpointsUpdate )
93- return ret
94+
95+ er .topLevelResolver .onError (err )
96+ }
97+
98+ func (er * edsDiscoveryMechanism ) OnResourceDoesNotExist () {
99+ if er .stopped .HasFired () {
100+ return
101+ }
102+
103+ er .topLevelResolver .onError (xdsresource .NewErrorf (xdsresource .ErrorTypeResourceNotFound , "resource name %q of type Endpoints not found in received response" , er .nameToWatch ))
94104}
0 commit comments