...
1 package main
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 "os"
8 "strings"
9 "time"
10
11 pb "golang.conradwood.net/apis/getestservice"
12 "golang.conradwood.net/go-easyops/auth"
13 "golang.conradwood.net/go-easyops/authremote"
14 "golang.conradwood.net/go-easyops/errors"
15 "golang.conradwood.net/go-easyops/server"
16 "golang.conradwood.net/go-easyops/utils"
17 "google.golang.org/grpc"
18 )
19
20 var (
21 rand_port = flag.Bool("random_port", true, "if true, add random number to port")
22 port = flag.Int("port", 4106, "The grpc server port")
23 ping = flag.Bool("ping", false, "ping continously")
24 ping_once = flag.Bool("ping_once", false, "ping once")
25 ping_self = flag.Bool("ping_self", false, "start server and ping self")
26 inject_errors = flag.Bool("inject_errors", false, "inject errors")
27 tag = flag.String("tag", "", "key=value tag optional")
28 ctr = 0
29 )
30
31
32 type echoServer struct {
33 }
34
35 func main() {
36 flag.Parse()
37 fmt.Printf("GO-EASYOPS Echo test server/client\n")
38
48 if *ping || *ping_once {
49 c := pb.GetEchoClient()
50 for {
51 now := time.Now()
52 ctx := authremote.Context()
53 ctx = authremote.Context()
54 ctx = authremote.Context()
55 u := auth.GetUser(ctx)
56 fmt.Printf(" pinging as %s\n", auth.Description(u))
57 _, err := c.Ping(ctx, &pb.PingRequest{})
58 s := "Pinged"
59 if err != nil {
60 fmt.Printf("Error :%s\n", utils.ErrorString(err))
61 s = "failed"
62 }
63 dur := time.Since(now).Milliseconds()
64 fmt.Printf("%d %s (%d milliseconds)\n", ctr, s, dur)
65 ctr++
66 if !*ping {
67 return
68 }
69 time.Sleep(time.Duration(300) * time.Millisecond)
70 }
71 }
72
73
74 sd := server.NewServerDef()
75
76
77 if *tag != "" {
78 kv := strings.SplitN(*tag, "=", 2)
79 if len(kv) != 2 {
80 fmt.Printf("tags not a key=value line\n")
81 os.Exit(10)
82 }
83 sd.AddTag(kv[0], kv[1])
84 fmt.Printf("Added tag \"%s\" with value \"%s\"\n", kv[0], kv[1])
85 }
86
87 p := *port
88 if *rand_port {
89 p = p + utils.RandomInt(50)
90 }
91 if *ping_self {
92 go PingSelf()
93 }
94
95 sd.SetPort(p)
96 sd.SetRegister(server.Register(
97 func(g *grpc.Server) error {
98 pb.RegisterEchoServiceServer(g, &echoServer{})
99 return nil
100 },
101 ))
102 err := server.ServerStartup(sd)
103
104 utils.Bail("Unable to start server", err)
105 }
106 func PingSelf() {
107 for {
108 time.Sleep(time.Duration(1) * time.Second)
109 ctx := authremote.Context()
110 u := auth.GetUser(ctx)
111 fmt.Printf("pinging as %s\n", auth.Description(u))
112 c := pb.GetEchoClient()
113 _, err := c.Ping(ctx, &pb.PingRequest{})
114 if err != nil {
115 fmt.Printf("Error :%s\n", utils.ErrorString(err))
116 } else {
117 fmt.Printf("Pinged\n")
118 }
119
120 }
121 }
122 func (e *echoServer) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
123 u := auth.GetUser(ctx)
124 s := auth.GetService(ctx)
125 fmt.Printf(" %03d Pinged by user %s, service %s\n", ctr, auth.Description(u), auth.Description(s))
126 ctr++
127 if *inject_errors {
128 i := utils.RandomInt(10)
129 if i > 3 {
130 return nil, errors.Unavailable(ctx, "Ping()")
131 }
132 }
133 return &pb.PingResponse{}, nil
134 }
135
View as plain text