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
}