func Connect(ipAddr string, port int) (*OvsdbClient, error) { if ipAddr == "" { ipAddr = DEFAULT_ADDR } if port <= 0 { port = DEFAULT_PORT } target := fmt.Sprintf("%s:%d", ipAddr, port) conn, err := net.Dial("tcp", target) if err != nil { return nil, err } c := rpc2.NewClientWithCodec(jsonrpc.NewJSONCodec(conn)) c.Handle("echo", echo) c.Handle("update", update) go c.Run() go handleDisconnectNotification(c) ovs := newOvsdbClient(c) // Process Async Notifications dbs, err := ovs.ListDbs() if err == nil { for _, db := range dbs { schema, err := ovs.GetSchema(db) if err == nil { ovs.Schema[db] = *schema } else { return nil, err } } } return ovs, nil }
func configureConnection(conn net.Conn) (*OvsdbClient, error) { c := rpc2.NewClientWithCodec(jsonrpc.NewJSONCodec(conn)) c.Handle("echo", echo) c.Handle("update", update) go c.Run() go handleDisconnectNotification(c) ovs := newOvsdbClient(c) // Process Async Notifications dbs, err := ovs.ListDbs() if err == nil { for _, db := range dbs { schema, err := ovs.GetSchema(db) if err == nil { ovs.Schema[db] = *schema } else { return nil, err } } } return ovs, nil }
func TestJSONRPC(t *testing.T) { type Args struct{ A, B int } type Reply int lis, err := net.Listen(network, addr) if err != nil { t.Fatal(err) } srv := rpc2.NewServer() srv.Handle("add", func(client *rpc2.Client, args *Args, reply *Reply) error { *reply = Reply(args.A + args.B) var rep Reply err := client.Call("mult", Args{2, 3}, &rep) if err != nil { t.Fatal(err) } if rep != 6 { t.Fatalf("not expected: %d", rep) } return nil }) srv.Handle("addPos", func(client *rpc2.Client, args []interface{}, result *float64) error { *result = args[0].(float64) + args[1].(float64) return nil }) number := make(chan int, 1) srv.Handle("set", func(client *rpc2.Client, i int, _ *struct{}) error { number <- i return nil }) go func() { conn, err := lis.Accept() if err != nil { t.Fatal(err) } srv.ServeCodec(NewJSONCodec(conn)) }() conn, err := net.Dial(network, addr) if err != nil { t.Fatal(err) } clt := rpc2.NewClientWithCodec(NewJSONCodec(conn)) clt.Handle("mult", func(client *rpc2.Client, args *Args, reply *Reply) error { *reply = Reply(args.A * args.B) return nil }) go clt.Run() // Test Call. var rep Reply err = clt.Call("add", Args{1, 2}, &rep) if err != nil { t.Fatal(err) } if rep != 3 { t.Fatalf("not expected: %d", rep) } // Test notification. err = clt.Notify("set", 6) if err != nil { t.Fatal(err) } select { case i := <-number: if i != 6 { t.Fatalf("unexpected number: %d", i) } case <-time.After(time.Second): t.Fatal("did not get notification") } // Test undefined method. err = clt.Call("foo", 1, &rep) if err.Error() != "rpc2: can't find method foo" { t.Fatal(err) } // Test Positional arguments. var result float64 err = clt.Call("addPos", []interface{}{1, 2}, &result) if err != nil { t.Fatal(err) } if result != 3 { t.Fatalf("not expected: %d", result) } }