...

Source file src/golang.conradwood.net/tests/db/testsql-server.go

Documentation: golang.conradwood.net/tests/db

     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  /*
    21  tests:
    22  1) restart postgresql - should reconnect
    23  2) stop postgresql for >5 minutes - should reconnect
    24  3) "blackhole" traffic"
    25  ip addr add 172.29.1.235/24 dev br0
    26  ip addr del 172.29.1.235/24 dev br0
    27  
    28  
    29  */
    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  // create a simple standard server
    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  	//	err := create.NewEchoServiceServer(&echoServer{}, p)
    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