func Run()

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)
}