Commit afe42f9b authored by Janos Guljas's avatar Janos Guljas

add bootnode cli option and adjust pingpong api

parent c29012e8
...@@ -15,26 +15,24 @@ Docker image `janos/bee`. ...@@ -15,26 +15,24 @@ Docker image `janos/bee`.
## Usage (experimental api) ## Usage (experimental api)
Execute the commands in two terminals to start `node 1` and `node 2`: Execute the command terminals to start `node 1`:
```sh ```sh
bee start --api-addr :8501 --p2p-addr :30401 bee start --api-addr :8501 --p2p-addr :30401
``` ```
Use one of the multiaddresses as bootnode for `node 2` in order to connect them:
```sh ```sh
bee start --api-addr :8502 --p2p-addr :30402 bee start --api-addr :8502 --p2p-addr :30402 --bootnode /ip4/127.0.0.1/tcp/30401/p2p/QmT4TNB4cKYanUjdYodw1Cns8cuVaRVo24hHNYcT7JjkTB
``` ```
Copy one of the multiaddresses from one running instance. Use the last part of `node 1` multiaddress to ping it using `node 2` by making an HTTP request to `localhost:{PORT2}/pingpong/{ID1}` like:
Make an HTTP request to `localhost:{PORT1}/pingpong/{MULTIADDRESS2}` like:
```sh ```sh
curl localhost:8501/pingpong/ip4/127.0.0.1/tcp/60304/p2p/Qmdao2FbfSK8ZcFxuUVmVDPUJifgRmbofNWH21WQESZm7x curl localhost:8502/pingpong/QmT4TNB4cKYanUjdYodw1Cns8cuVaRVo24hHNYcT7JjkTB
``` ```
Ping pong messages should be exchanged from `node 1` (listening on `PORT1`) to `node 2` (with multiaddress `MULTIADDRESS2`).
## Structure ## Structure
- cmd/bee - a simple application integrating p2p and pingpong service - cmd/bee - a simple application integrating p2p and pingpong service
......
...@@ -20,6 +20,7 @@ func (c *command) initStartCmd() (err error) { ...@@ -20,6 +20,7 @@ func (c *command) initStartCmd() (err error) {
optionNameP2PAddr = "p2p-addr" optionNameP2PAddr = "p2p-addr"
optionNameP2PDisableWS = "p2p-disable-ws" optionNameP2PDisableWS = "p2p-disable-ws"
optionNameP2PDisableQUIC = "p2p-disable-quic" optionNameP2PDisableQUIC = "p2p-disable-quic"
optionNameBootnodes = "bootnode"
) )
cmd := &cobra.Command{ cmd := &cobra.Command{
...@@ -40,6 +41,7 @@ func (c *command) initStartCmd() (err error) { ...@@ -40,6 +41,7 @@ func (c *command) initStartCmd() (err error) {
Addr: c.config.GetString(optionNameP2PAddr), Addr: c.config.GetString(optionNameP2PAddr),
DisableWS: c.config.GetBool(optionNameP2PDisableWS), DisableWS: c.config.GetBool(optionNameP2PDisableWS),
DisableQUIC: c.config.GetBool(optionNameP2PDisableQUIC), DisableQUIC: c.config.GetBool(optionNameP2PDisableQUIC),
Bootnodes: c.config.GetStringSlice(optionNameBootnodes),
// Routing: func(h host.Host) (r routing.PeerRouting, err error) { // Routing: func(h host.Host) (r routing.PeerRouting, err error) {
// idht, err = dht.New(ctx, h) // idht, err = dht.New(ctx, h)
// return idht, err // return idht, err
...@@ -84,8 +86,9 @@ func (c *command) initStartCmd() (err error) { ...@@ -84,8 +86,9 @@ func (c *command) initStartCmd() (err error) {
cmd.Flags().String(optionNameAPIAddr, ":8500", "HTTP API listen address") cmd.Flags().String(optionNameAPIAddr, ":8500", "HTTP API listen address")
cmd.Flags().String(optionNameP2PAddr, ":30399", "P2P listen address") cmd.Flags().String(optionNameP2PAddr, ":30399", "P2P listen address")
cmd.Flags().Bool(optionNameP2PDisableWS, false, "Disable P2P WebSocket protocol") cmd.Flags().Bool(optionNameP2PDisableWS, false, "disable P2P WebSocket protocol")
cmd.Flags().Bool(optionNameP2PDisableQUIC, false, "Disable P2P QUIC protocol") cmd.Flags().Bool(optionNameP2PDisableQUIC, false, "disable P2P QUIC protocol")
cmd.Flags().StringSlice(optionNameBootnodes, nil, "initial nodes to connect to")
if err := c.config.BindPFlags(cmd.Flags()); err != nil { if err := c.config.BindPFlags(cmd.Flags()); err != nil {
return err return err
......
...@@ -5,6 +5,7 @@ go 1.13 ...@@ -5,6 +5,7 @@ go 1.13
require ( require (
github.com/gogo/protobuf v1.3.1 github.com/gogo/protobuf v1.3.1
github.com/gorilla/handlers v1.4.2 github.com/gorilla/handlers v1.4.2
github.com/gorilla/mux v1.7.3
github.com/hashicorp/golang-lru v0.5.3 // indirect github.com/hashicorp/golang-lru v0.5.3 // indirect
github.com/ipfs/go-log v1.0.1 // indirect github.com/ipfs/go-log v1.0.1 // indirect
github.com/libp2p/go-libp2p v0.5.0 github.com/libp2p/go-libp2p v0.5.0
......
...@@ -99,6 +99,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa ...@@ -99,6 +99,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
......
...@@ -3,34 +3,18 @@ package api ...@@ -3,34 +3,18 @@ package api
import ( import (
"fmt" "fmt"
"net/http" "net/http"
"strings"
"github.com/multiformats/go-multiaddr" "github.com/gorilla/mux"
) )
func (s *server) pingpongHandler(w http.ResponseWriter, r *http.Request) { func (s *server) pingpongHandler(w http.ResponseWriter, r *http.Request) {
target := strings.TrimPrefix(r.URL.Path, "/pingpong") peerID := mux.Vars(r)["peer-id"]
addr, err := multiaddr.NewMultiaddr(target)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintln(w, "invalid address", target, err)
return
}
ctx := r.Context() ctx := r.Context()
peerID, err := s.P2P.Connect(ctx, addr)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintln(w, "connect error", addr, err)
return
}
rtt, err := s.Pingpong.Ping(ctx, peerID, "hey", "there", ",", "how are", "you", "?") rtt, err := s.Pingpong.Ping(ctx, peerID, "hey", "there", ",", "how are", "you", "?")
if err != nil { if err != nil {
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintln(w, "ping error", addr, err) fmt.Fprintln(w, "ping error", peerID, err)
return return
} }
......
...@@ -5,17 +5,18 @@ import ( ...@@ -5,17 +5,18 @@ import (
"net/http" "net/http"
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
"github.com/gorilla/mux"
"resenje.org/web" "resenje.org/web"
) )
func (s *server) setupRouting() { func (s *server) setupRouting() {
baseRouter := http.NewServeMux() baseRouter := mux.NewRouter()
baseRouter.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) { baseRouter.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "User-agent: *\nDisallow: /") fmt.Fprintln(w, "User-agent: *\nDisallow: /")
}) })
baseRouter.HandleFunc("/pingpong/", s.pingpongHandler) baseRouter.HandleFunc("/pingpong/{peer-id}", s.pingpongHandler)
s.Handler = web.ChainHandlers( s.Handler = web.ChainHandlers(
handlers.CompressHandler, handlers.CompressHandler,
......
...@@ -33,6 +33,7 @@ type Options struct { ...@@ -33,6 +33,7 @@ type Options struct {
Addr string Addr string
DisableWS bool DisableWS bool
DisableQUIC bool DisableQUIC bool
Bootnodes []string
// PrivKey []byte // PrivKey []byte
// Routing func(host.Host) (routing.PeerRouting, error) // Routing func(host.Host) (routing.PeerRouting, error)
} }
...@@ -128,7 +129,21 @@ func New(ctx context.Context, o Options) (*Service, error) { ...@@ -128,7 +129,21 @@ func New(ctx context.Context, o Options) (*Service, error) {
return nil, fmt.Errorf("autonat: %w", err) return nil, fmt.Errorf("autonat: %w", err)
} }
return &Service{host: h}, nil s := &Service{host: h}
// TODO: be more resilient on connection errors and connect in parallel
for _, a := range o.Bootnodes {
addr, err := ma.NewMultiaddr(a)
if err != nil {
return nil, fmt.Errorf("bootnode %s: %w", a, err)
}
if _, err := s.Connect(ctx, addr); err != nil {
return nil, fmt.Errorf("connect to bootnode %s: %w", a, err)
}
}
return s, nil
} }
func (s *Service) AddProtocol(p p2p.ProtocolSpec) (err error) { func (s *Service) AddProtocol(p p2p.ProtocolSpec) (err error) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment