Skip to content

Commit

Permalink
add debugapi /addresses endpoint to expose libp2p mutiaddresses (#44)
Browse files Browse the repository at this point in the history
  • Loading branch information
janos committed Apr 1, 2020
1 parent e67df73 commit b120c01
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 0 deletions.
11 changes: 11 additions & 0 deletions pkg/debugapi/debugapi_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/p2p"
"github.com/ethersphere/bee/pkg/topology/mock"
"github.com/multiformats/go-multiaddr"
"resenje.org/web"
)

Expand Down Expand Up @@ -61,3 +62,13 @@ func newTestServer(t *testing.T, o testServerOptions) *testServer {
Cleanup: cleanup,
}
}

func mustMultiaddr(t *testing.T, s string) multiaddr.Multiaddr {
t.Helper()

a, err := multiaddr.NewMultiaddr(s)
if err != nil {
t.Fatal(err)
}
return a
}
1 change: 1 addition & 0 deletions pkg/debugapi/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ type (
StatusResponse = statusResponse
PeerConnectResponse = peerConnectResponse
PeersResponse = peersResponse
AddressesResponse = addressesResponse
)
28 changes: 28 additions & 0 deletions pkg/debugapi/p2p.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2020 The Swarm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package debugapi

import (
"net/http"

"github.com/ethersphere/bee/pkg/jsonhttp"
"github.com/multiformats/go-multiaddr"
)

type addressesResponse struct {
Addresses []multiaddr.Multiaddr `json:"addresses"`
}

func (s *server) addressesHandler(w http.ResponseWriter, r *http.Request) {
addresses, err := s.P2P.Addresses()
if err != nil {
s.Logger.Debugf("debug api: p2p addresses: %v", err)
jsonhttp.InternalServerError(w, err)
return
}
jsonhttp.OK(w, addressesResponse{
Addresses: addresses,
})
}
61 changes: 61 additions & 0 deletions pkg/debugapi/p2p_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright 2020 The Swarm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package debugapi_test

import (
"errors"
"net/http"
"testing"

"github.com/ethersphere/bee/pkg/debugapi"
"github.com/ethersphere/bee/pkg/jsonhttp"
"github.com/ethersphere/bee/pkg/jsonhttp/jsonhttptest"
"github.com/ethersphere/bee/pkg/p2p/mock"
"github.com/multiformats/go-multiaddr"
)

func TestAddresses(t *testing.T) {
addresses := []multiaddr.Multiaddr{
mustMultiaddr(t, "/ip4/127.0.0.1/tcp/7071/p2p/16Uiu2HAmTBuJT9LvNmBiQiNoTsxE5mtNy6YG3paw79m94CRa9sRb"),
mustMultiaddr(t, "/ip4/192.168.0.101/tcp/7071/p2p/16Uiu2HAmTBuJT9LvNmBiQiNoTsxE5mtNy6YG3paw79m94CRa9sRb"),
mustMultiaddr(t, "/ip4/127.0.0.1/udp/7071/quic/p2p/16Uiu2HAmTBuJT9LvNmBiQiNoTsxE5mtNy6YG3paw79m94CRa9sRb"),
}

testServer := newTestServer(t, testServerOptions{
P2P: mock.New(mock.WithAddressesFunc(func() ([]multiaddr.Multiaddr, error) {
return addresses, nil
})),
})
defer testServer.Cleanup()

t.Run("ok", func(t *testing.T) {
jsonhttptest.ResponseDirect(t, testServer.Client, http.MethodGet, "/addresses", nil, http.StatusOK, debugapi.AddressesResponse{
Addresses: addresses,
})
})

t.Run("post method not allowed", func(t *testing.T) {
jsonhttptest.ResponseDirect(t, testServer.Client, http.MethodPost, "/addresses", nil, http.StatusMethodNotAllowed, jsonhttp.StatusResponse{
Code: http.StatusMethodNotAllowed,
Message: http.StatusText(http.StatusMethodNotAllowed),
})
})
}

func TestAddresses_error(t *testing.T) {
testErr := errors.New("test error")

testServer := newTestServer(t, testServerOptions{
P2P: mock.New(mock.WithAddressesFunc(func() ([]multiaddr.Multiaddr, error) {
return nil, testErr
})),
})
defer testServer.Cleanup()

jsonhttptest.ResponseDirect(t, testServer.Client, http.MethodGet, "/addresses", nil, http.StatusInternalServerError, jsonhttp.StatusResponse{
Code: http.StatusInternalServerError,
Message: testErr.Error(),
})
}
3 changes: 3 additions & 0 deletions pkg/debugapi/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ func (s *server) setupRouting() {
router.HandleFunc("/health", s.statusHandler)
router.HandleFunc("/readiness", s.statusHandler)

router.Handle("/addresses", jsonhttp.MethodHandler{
"GET": http.HandlerFunc(s.addressesHandler),
})
router.Handle("/connect/{multi-address:.+}", jsonhttp.MethodHandler{
"POST": http.HandlerFunc(s.peerConnectHandler),
})
Expand Down
14 changes: 14 additions & 0 deletions pkg/p2p/mock/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type Service struct {
disconnectFunc func(overlay swarm.Address) error
peersFunc func() []p2p.Peer
setPeerAddedHandlerFunc func(func(context.Context, swarm.Address) error)
addressesFunc func() ([]ma.Multiaddr, error)
}

func WithAddProtocolFunc(f func(p2p.ProtocolSpec) error) Option {
Expand Down Expand Up @@ -51,6 +52,12 @@ func WithSetPeerAddedHandlerFunc(f func(func(context.Context, swarm.Address) err
})
}

func WithAddressesFunc(f func() ([]ma.Multiaddr, error)) Option {
return optionFunc(func(s *Service) {
s.addressesFunc = f
})
}

func New(opts ...Option) *Service {
s := new(Service)
for _, o := range opts {
Expand Down Expand Up @@ -88,6 +95,13 @@ func (s *Service) SetPeerAddedHandler(f func(context.Context, swarm.Address) err
s.setPeerAddedHandlerFunc(f)
}

func (s *Service) Addresses() ([]ma.Multiaddr, error) {
if s.addressesFunc == nil {
return nil, errors.New("function Addresses not configured")
}
return s.addressesFunc()
}

func (s *Service) Peers() []p2p.Peer {
if s.peersFunc == nil {
return nil
Expand Down
1 change: 1 addition & 0 deletions pkg/p2p/p2p.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type Service interface {
Disconnect(overlay swarm.Address) error
Peers() []Peer
SetPeerAddedHandler(func(context.Context, swarm.Address) error)
Addresses() ([]ma.Multiaddr, error)
}

// Streamer is able to create a new Stream.
Expand Down

0 comments on commit b120c01

Please sign in to comment.