...
1 package main
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 pb "golang.conradwood.net/apis/getestservice"
8 "golang.conradwood.net/go-easyops/auth"
9
10 "golang.conradwood.net/go-easyops/errors"
11 "golang.conradwood.net/go-easyops/server"
12 "golang.conradwood.net/go-easyops/utils"
13 "google.golang.org/grpc"
14 "os"
15 "strings"
16 )
17
18 var (
19 port = flag.Int("port", 4106, "The grpc server port")
20 ping = flag.Bool("ping", false, "ping continously")
21 ping_once = flag.Bool("ping_once", false, "ping once")
22 tag = flag.String("tag", "", "key=value tag optional")
23 fallback = flag.Bool("fallback", true, "if true, fallback allowed (for client)")
24 inject_errors = flag.Bool("inject_errors", false, "if true inject some errors in the rpc")
25 ttl = flag.Int("ttl", 0, "if >0 the server will ping itself until ttl is 0")
26 ctr = 0
27 )
28
29
30 type echoServer struct {
31 }
32
33 func main() {
34 flag.Parse()
35 fmt.Printf("GO-EASYOPS Echo test server/client\n")
36 if *ping || *ping_once {
37 utils.Bail("failed", do_client())
38 os.Exit(0)
39 }
40
41 sd := server.NewServerDef()
42
43 if *tag != "" {
44 kv := strings.SplitN(*tag, "=", 2)
45 if len(kv) != 2 {
46 fmt.Printf("tags not a key=value line\n")
47 os.Exit(10)
48 }
49 sd.AddTag(kv[0], kv[1])
50 fmt.Printf("Added tag \"%s\" with value \"%s\"\n", kv[0], kv[1])
51 }
52
53 p := *port
54 p = p + utils.RandomInt(50)
55
56 sd.SetPort(p)
57 sd.SetRegister(server.Register(
58 func(g *grpc.Server) error {
59 pb.RegisterEchoServiceServer(g, &echoServer{})
60 return nil
61 },
62 ))
63 err := server.ServerStartup(sd)
64
65 utils.Bail("Unable to start server", err)
66 }
67
68 func (e *echoServer) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
69 u := auth.GetUser(ctx)
70 fmt.Printf(" tagserver %s: %d Pinged SEQ=%d, by %s (TTL:%d)\n", printTags(), ctr, req.SequenceNumber, auth.Description(u), req.TTL)
71 if req.TTL > 0 {
72 req.TTL--
73 _, err := pb.GetEchoClient().Ping(ctx, req)
74 if err != nil {
75 return nil, err
76 }
77
78 }
79 ctr++
80 if *inject_errors {
81 i := utils.RandomInt(10)
82 if i > 3 {
83 return nil, errors.Unavailable(ctx, "Ping()")
84 }
85 }
86 return &pb.PingResponse{ServerTags: parse_tags()}, nil
87 }
88
89 func parse_tags() map[string]string {
90 res := make(map[string]string)
91 if *tag == "" {
92 return res
93 }
94 kv := strings.SplitN(*tag, "=", 2)
95 if len(kv) != 2 {
96 fmt.Printf("tags not a key=value line\n")
97 os.Exit(10)
98 }
99 res[kv[0]] = kv[1]
100
101 return res
102 }
103
View as plain text