in grpc-xds/control-plane-go/pkg/server/server.go [74:125]
func Run(ctx context.Context, servingPort int, healthPort int, kubecontexts []informers.Kubecontext, xdsFeatures *xds.Features, authority string) error {
logger := logging.FromContext(ctx)
serverCredentials, err := createServerCredentials(logger, xdsFeatures)
if err != nil {
return fmt.Errorf("could not create server-side transport credentials: %w", err)
}
defer serverCredentials.Close()
grpcOptions := serverOptions(logger, serverCredentials)
server := grpc.NewServer(grpcOptions...)
healthGRPCServer := grpc.NewServer()
healthServer := health.NewServer()
addServerStopBehavior(ctx, logger, server, healthGRPCServer, healthServer)
healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
healthpb.RegisterHealthServer(server, healthServer)
healthpb.RegisterHealthServer(healthGRPCServer, healthServer)
cleanup, err := registerAdminServers(server, healthGRPCServer)
if err != nil {
return fmt.Errorf("could not register gRPC Channelz and CSDS admin services: %w", err)
}
defer cleanup()
reflection.Register(server)
reflection.Register(healthGRPCServer)
xdsCache := xds.NewSnapshotCache(ctx, true, xds.ZoneHash{}, eds.LocalityPriorityByZone{}, xdsFeatures, authority)
xdsServer := serverv3.NewServer(ctx, xdsCache, xdsServerCallbackFuncs(logger))
registerXDSServices(server, xdsServer)
if err := createInformers(ctx, logger, kubecontexts, xdsCache); err != nil {
return fmt.Errorf("could not create Kubernetes informer managers: %w", err)
}
tcpListener, err := net.Listen("tcp", fmt.Sprintf(":%d", servingPort))
if err != nil {
return fmt.Errorf("could not create TCP listener on port=%d: %w", servingPort, err)
}
healthTCPListener, err := net.Listen("tcp", fmt.Sprintf(":%d", healthPort))
if err != nil {
return fmt.Errorf("could not create TCP listener on port=%d: %w", healthPort, err)
}
logger.V(1).Info("xDS control plane management server listening", "port", servingPort, "healthPort", healthPort)
go func() {
err := server.Serve(tcpListener)
if err != nil {
healthServer.SetServingStatus("", healthpb.HealthCheckResponse_NOT_SERVING)
}
}()
return healthGRPCServer.Serve(healthTCPListener)
}