...
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/errors"
14 "golang.conradwood.net/go-easyops/server"
15 "golang.conradwood.net/go-easyops/sql"
16 "golang.conradwood.net/go-easyops/utils"
17 "google.golang.org/grpc"
18 )
19
20
30
31 const (
32 INTERVAL = time.Duration(300) * time.Millisecond
33 )
34
35 var (
36 port = flag.Int("port", 4106, "The grpc server port")
37 ping = flag.Bool("ping", false, "ping continously")
38 ping_once = flag.Bool("ping_once", false, "ping once")
39 tag = flag.String("tag", "", "key=value tag optional")
40 ctr = 0
41 dbcon *sql.DB
42 )
43
44
45 type echoServer struct {
46 }
47
48 func main() {
49 flag.Parse()
50 var err error
51 dbcon, err = sql.Open()
52 utils.Bail("failed to open db: %s", err)
53 fmt.Printf("GO-EASYOPS Echo test server/client\n")
54 if *ping || *ping_once {
55 for {
56 do_ping()
57 time.Sleep(INTERVAL)
58 fmt.Printf("Successes: %d out of %d. Failures: %d out of %d\n",
59 dbcon.GetFailureCounter().GetCounter(0),
60 dbcon.GetFailureCounter().GetCounts(0),
61 dbcon.GetFailureCounter().GetCounter(1),
62 dbcon.GetFailureCounter().GetCounts(1),
63 )
64 }
65
66 }
67
68 sd := server.NewServerDef()
69
70 if *tag != "" {
71 kv := strings.SplitN(*tag, "=", 2)
72 if len(kv) != 2 {
73 fmt.Printf("tags not a key=value line\n")
74 os.Exit(10)
75 }
76 sd.AddTag(kv[0], kv[1])
77 fmt.Printf("Added tag \"%s\" with value \"%s\"\n", kv[0], kv[1])
78 }
79
80 p := *port
81 p = p + utils.RandomInt(50)
82 sd.AddTag("foo", "bar")
83 sd.SetPort(p)
84 sd.SetRegister(server.Register(
85 func(g *grpc.Server) error {
86 pb.RegisterEchoServiceServer(g, &echoServer{})
87 return nil
88 },
89 ))
90 err = server.ServerStartup(sd)
91
92 utils.Bail("Unable to start server", err)
93 }
94
95 func (e *echoServer) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
96 u := auth.GetUser(ctx)
97 fmt.Printf(" %d Pinged by %s\n", ctr, auth.Description(u))
98 ctr++
99 i := utils.RandomInt(10)
100 if i > 3 {
101 return nil, errors.Unavailable(ctx, "Ping()")
102 }
103 return &pb.PingResponse{}, nil
104 }
105
106 func do_ping() {
107 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(10)*time.Second)
108 defer cancel()
109 var now time.Time
110 rows, err := dbcon.QueryContext(ctx, "nowquery", "SELECT NOW() as now")
111 if err != nil {
112 fmt.Printf("Query Error: %v\n", err)
113 return
114 }
115 if !rows.Next() {
116 fmt.Printf("Next error (no rows)\n")
117 return
118 }
119 err = rows.Scan(&now)
120 if err != nil {
121 fmt.Printf("Scan Error: %v\n", err)
122 return
123 }
124 rows.Close()
125
126 fmt.Printf("Result: %v\n", now)
127
128 }
129
View as plain text