func runApp()

in cmd/schedulerclient/client.go [44:112]


func runApp() error {
	// Set up a connection to the server.
	conn, err := grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := si.NewSchedulerClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), time.Hour*100000)
	defer cancel()
	_, err = c.RegisterResourceManager(ctx, &si.RegisterResourceManagerRequest{})
	if err != nil {
		return fmt.Errorf("could not greet: %v", err)
	}
	log.Printf("Responded")

	stream, err := c.UpdateAllocation(ctx)
	if err != nil {
		return fmt.Errorf("error on update: %v", err)
	}
	done := make(chan bool)

	// Connect to server and send streaming
	// first goroutine sends requests
	go func() {
		for i := 1; i <= 10; i++ {
			req := si.AllocationRequest{}
			if err := stream.Send(&req); err != nil {
				log.Fatalf("can not send %v", err)
			}

			log.Print("Send request")
			time.Sleep(time.Millisecond * 100)
		}
	}()

	// second goroutine receives data from stream
	// and saves result in max variable
	//
	// if stream is finished it closes done channel
	go func() {
		for {
			_, err := stream.Recv()
			if err == io.EOF {
				close(done)
				return
			}
			if err != nil {
				log.Fatalf("can not receive %v", err)
			}
			log.Printf("Responded by server")
		}
	}()

	// third goroutine closes done channel
	// if context is done
	go func() {
		<-ctx.Done()
		if err := ctx.Err(); err != nil {
			log.Println(err)
		}
		close(done)
	}()

	<-done
	log.Printf("Finished")
	return nil
}