@@ -23,36 +23,44 @@ func (cdp *ConsulDataplane) setupGRPCServer() error {
2323 cdp .logger .Error ("failed to create gRPC/TCP listener: %v" , err )
2424 return err
2525 }
26- cdp .gRPCListener = lis
2726
2827 // create gRPC server
2928 // one main role of this gRPC server in consul-dataplane is to proxy envoy ADS requests
3029 // to the connected Consul server.
3130 director := func (ctx context.Context , fullMethodName string ) (context.Context , * grpc.ClientConn , error ) {
31+ if ! strings .Contains (fullMethodName , "envoy.service.discovery.v3.AggregatedDiscoveryService/DeltaAggregatedResources" ) {
32+ return ctx , nil , status .Errorf (codes .Unimplemented , fmt .Sprintf ("Unknown method %s" , fullMethodName ))
33+ }
34+
3235 md , _ := metadata .FromIncomingContext (ctx )
3336 mdCopy := md .Copy ()
3437 // TODO (NET-148): Inject the ACL token acquired from the server discovery library
3538 mdCopy [metadataKeyToken ] = []string {cdp .cfg .Consul .Credentials .Static .Token }
3639 outCtx := metadata .NewOutgoingContext (ctx , mdCopy )
37- if ! strings .Contains (fullMethodName , "envoy.service.discovery.v3.AggregatedDiscoveryService/DeltaAggregatedResources" ) {
38- return outCtx , nil , status .Errorf (codes .Unimplemented , fmt .Sprintf ("Unknown method %s" , fullMethodName ))
39- }
40- // TODO (NET-148): Ensure the server connection here is the one acquired via the server discovery library
4140 return outCtx , cdp .consulServer .grpcClientConn , nil
4241 }
43- gRPCServer := grpc .NewServer (grpc .UnknownServiceHandler (proxy .TransparentHandler (director )))
44- cdp .gRPCServer = gRPCServer
42+ newGRPCServer := grpc .NewServer (grpc .UnknownServiceHandler (proxy .TransparentHandler (director )))
4543
46- cdp .logger .Info ("created gRPC server" , "address" , lis .Addr ().String ())
44+ cdp .gRPCServer = & gRPCServer {listener : lis , server : newGRPCServer , exitedCh : make (chan struct {})}
45+ cdp .logger .Trace ("created gRPC server" , "address" , lis .Addr ().String ())
4746 return nil
4847}
4948
5049func (cdp * ConsulDataplane ) startGRPCServer () {
51- cdp .logger .Trace ("starting gRPC server" )
50+ cdp .logger .Info ("starting gRPC server" , "address" , cdp . gRPCServer . listener . Addr (). String () )
5251
53- if err := cdp .gRPCServer .Serve (cdp .gRPCListener ); err != nil {
54- cdp .logger .Error ("failed to serve gRPC requests: %v " , err )
55- cdp .gRPCListener .Close ()
56- // TODO: gracefully exit
52+ if err := cdp .gRPCServer .server . Serve (cdp .gRPCServer . listener ); err != nil {
53+ cdp .logger .Error ("failed to serve gRPC requests" , "error " , err )
54+ cdp .gRPCServer . listener .Close ()
55+ close ( cdp . gRPCServer . exitedCh )
5756 }
5857}
58+
59+ func (cdp * ConsulDataplane ) stopGRPCServer () {
60+ if cdp .gRPCServer != nil {
61+ cdp .logger .Debug ("stopping gRPC server" )
62+ cdp .gRPCServer .server .Stop ()
63+ }
64+ }
65+
66+ func (cdp * ConsulDataplane ) gRPCServerExited () chan struct {} { return cdp .gRPCServer .exitedCh }
0 commit comments