blob: c3410be3e05345343566f24a2d539bfd0086f5ed [file] [log] [blame]
giolekva892a4e22020-04-27 16:46:22 +04001package testing
2
3import (
4 "context"
5 "fmt"
6 "net"
7 "syscall"
8 "time"
9
10 "google.golang.org/grpc"
11
12 "github.com/giolekva/pcloud/pfs/api"
13 "github.com/giolekva/pcloud/pfs/chunk"
14 "github.com/giolekva/pcloud/pfs/controller"
15)
16
17type InMemoryEnv struct {
18 m *grpc.Server
19 c []*grpc.Server
20 controllerConn *grpc.ClientConn
21}
22
23func NewInMemoryEnv(numChunkServers int) (*InMemoryEnv, error) {
24 env := new(InMemoryEnv)
25 syscall.Unlink("/tmp/pcloud/controller")
26 lis, err := net.Listen("unix", "/tmp/pcloud/controller")
27 if err != nil {
28 return nil, err
29 }
30 server := grpc.NewServer()
31 api.RegisterMetadataStorageServer(server, controller.NewMasterServer())
32 go server.Serve(lis)
33
34 var opts []grpc.DialOption
35 opts = append(opts, grpc.WithInsecure())
36 opts = append(opts, grpc.WithBlock())
37 conn, err := grpc.Dial("unix:/tmp/pcloud/controller", opts...)
38 if err != nil {
39 return nil, err
40 }
41 env.controllerConn = conn
42 client := api.NewMetadataStorageClient(conn)
43
44 env.c = make([]*grpc.Server, numChunkServers)
45 for i := 0; i < numChunkServers; i++ {
46 unixSocket := fmt.Sprintf("/tmp/pcloud/chunk-%d", i)
47 syscall.Unlink(unixSocket)
48 lis, err := net.Listen("unix", unixSocket)
49 if err != nil {
50 return nil, err
51 }
52 server := grpc.NewServer()
53 api.RegisterChunkStorageServer(server, chunk.NewChunkServer(
54 &chunk.InMemoryChunkFactory{},
55 &chunk.NonChangingReplicaAssignment{}))
56 go server.Serve(lis)
57 env.c[i] = server
58 }
59
60 for i := 0; i < numChunkServers; i++ {
61 ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
62 _, err = client.AddChunkServer(
63 ctx,
64 &api.AddChunkServerRequest{Address: fmt.Sprintf("unix:///tmp/pcloud/chunk-%d", i)})
65 if err != nil {
66 return nil, err
67 }
68 }
69 return env, nil
70}
71
72func (e *InMemoryEnv) Stop() {
73 if e.controllerConn != nil {
74 e.controllerConn.Close()
75 }
76 for _, s := range e.c {
77 if s != nil {
78 s.GracefulStop()
79 }
80 }
81 if e.m != nil {
82 e.m.GracefulStop()
83 }
84}