diff --git a/cluster_config.go b/cluster_config.go index d65be26e..bdb39b4f 100644 --- a/cluster_config.go +++ b/cluster_config.go @@ -13,6 +13,7 @@ import ( "github.com/ipfs/ipfs-cluster/config" + ipfsconfig "github.com/ipfs/go-ipfs-config" pnet "github.com/libp2p/go-libp2p-pnet" ma "github.com/multiformats/go-multiaddr" @@ -21,9 +22,12 @@ import ( const configKey = "cluster" +// DefaultListenAddrs contains TCP and QUIC listen addresses +var DefaultListenAddrs = []string{"/ip4/0.0.0.0/tcp/9096", "/ip4/0.0.0.0/udp/9096/quic"} + // Configuration defaults const ( - DefaultListenAddr = "/ip4/0.0.0.0/tcp/9096" + DefaultEnableRelayHop = true DefaultStateSyncInterval = 600 * time.Second DefaultIPFSSyncInterval = 130 * time.Second DefaultPinRecoverInterval = 1 * time.Hour @@ -73,7 +77,11 @@ type Config struct { // Listen parameters for the Cluster libp2p Host. Used by // the RPC and Consensus components. - ListenAddr ma.Multiaddr + ListenAddr []ma.Multiaddr + + // Enables HOP relay for the node. If this is enabled, the node will act as + // an intermediate (Hop Relay) node in relay circuits for connected peers. + EnableRelayHop bool // ConnMgr holds configuration values for the connection manager for // the libp2p host. @@ -160,7 +168,8 @@ type configJSON struct { PrivateKey string `json:"private_key,omitempty"` Secret string `json:"secret"` LeaveOnShutdown bool `json:"leave_on_shutdown"` - ListenMultiaddress string `json:"listen_multiaddress"` + ListenMultiaddress ipfsconfig.Strings `json:"listen_multiaddress"` + EnableRelayHop bool `json:"enable_relay_hop"` ConnectionManager *connMgrConfigJSON `json:"connection_manager"` StateSyncInterval string `json:"state_sync_interval"` IPFSSyncInterval string `json:"ipfs_sync_interval"` @@ -228,6 +237,10 @@ func (cfg *Config) Validate() error { return errors.New("cluster.listen_multiaddress is undefined") } + if len(cfg.ListenAddr) == 0 { + return errors.New("cluster.listen_multiaddress is empty") + } + if cfg.ConnMgr.LowWater <= 0 { return errors.New("cluster.connection_manager.low_water is invalid") } @@ -334,8 +347,13 @@ func (cfg *Config) setDefaults() { } cfg.Peername = hostname - addr, _ := ma.NewMultiaddr(DefaultListenAddr) - cfg.ListenAddr = addr + listenAddrs := []ma.Multiaddr{} + for _, m := range DefaultListenAddrs { + addr, _ := ma.NewMultiaddr(m) + listenAddrs = append(listenAddrs, addr) + } + cfg.ListenAddr = listenAddrs + cfg.EnableRelayHop = DefaultEnableRelayHop cfg.ConnMgr = ConnMgrConfig{ HighWater: DefaultConnMgrHighWater, LowWater: DefaultConnMgrLowWater, @@ -384,13 +402,18 @@ func (cfg *Config) applyConfigJSON(jcfg *configJSON) error { } cfg.Secret = clusterSecret - clusterAddr, err := ma.NewMultiaddr(jcfg.ListenMultiaddress) - if err != nil { - err = fmt.Errorf("error parsing cluster_listen_multiaddress: %s", err) - return err + var listenAddrs []ma.Multiaddr + for _, addr := range jcfg.ListenMultiaddress { + listenAddr, err := ma.NewMultiaddr(addr) + if err != nil { + err = fmt.Errorf("error parsing a listen_multiaddress: %s", err) + return err + } + listenAddrs = append(listenAddrs, listenAddr) } - cfg.ListenAddr = clusterAddr + cfg.ListenAddr = listenAddrs + cfg.EnableRelayHop = jcfg.EnableRelayHop if conman := jcfg.ConnectionManager; conman != nil { cfg.ConnMgr = ConnMgrConfig{ HighWater: jcfg.ConnectionManager.HighWater, @@ -455,7 +478,12 @@ func (cfg *Config) toConfigJSON() (jcfg *configJSON, err error) { jcfg.ReplicationFactorMin = cfg.ReplicationFactorMin jcfg.ReplicationFactorMax = cfg.ReplicationFactorMax jcfg.LeaveOnShutdown = cfg.LeaveOnShutdown - jcfg.ListenMultiaddress = cfg.ListenAddr.String() + var listenAddrs ipfsconfig.Strings + for _, addr := range cfg.ListenAddr { + listenAddrs = append(listenAddrs, addr.String()) + } + jcfg.ListenMultiaddress = ipfsconfig.Strings(listenAddrs) + jcfg.EnableRelayHop = cfg.EnableRelayHop jcfg.ConnectionManager = &connMgrConfigJSON{ HighWater: cfg.ConnMgr.HighWater, LowWater: cfg.ConnMgr.LowWater, diff --git a/cluster_config_test.go b/cluster_config_test.go index 98d2cca4..5994f16a 100644 --- a/cluster_config_test.go +++ b/cluster_config_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" "time" + + ipfsconfig "github.com/ipfs/go-ipfs-config" ) var ccfgTestJSON = []byte(` @@ -17,7 +19,10 @@ var ccfgTestJSON = []byte(` "low_water": 500, "grace_period": "100m0s" }, - "listen_multiaddress": "/ip4/127.0.0.1/tcp/10000", + "listen_multiaddress": [ + "/ip4/127.0.0.1/tcp/10000", + "/ip4/127.0.0.1/udp/10000/quic" + ], "state_sync_interval": "1m0s", "ipfs_sync_interval": "2m10s", "pin_recover_interval": "1m", @@ -114,7 +119,7 @@ func TestLoadJSON(t *testing.T) { }) t.Run("bad listen multiaddress", func(t *testing.T) { - _, err := loadJSON2(t, func(j *configJSON) { j.ListenMultiaddress = "abc" }) + _, err := loadJSON2(t, func(j *configJSON) { j.ListenMultiaddress = ipfsconfig.Strings{"abc"} }) if err == nil { t.Error("expected error parsing listen_multiaddress") } @@ -197,7 +202,10 @@ func TestLoadJSON(t *testing.T) { func TestToJSON(t *testing.T) { cfg := &Config{} - cfg.LoadJSON(ccfgTestJSON) + err := cfg.LoadJSON(ccfgTestJSON) + if err != nil { + t.Fatal(err) + } newjson, err := cfg.ToJSON() if err != nil { t.Fatal(err) diff --git a/clusterhost.go b/clusterhost.go index 81ac06d0..4db5c113 100644 --- a/clusterhost.go +++ b/clusterhost.go @@ -6,6 +6,7 @@ import ( "github.com/ipfs/ipfs-cluster/config" libp2p "github.com/libp2p/go-libp2p" + autonat "github.com/libp2p/go-libp2p-autonat-svc" relay "github.com/libp2p/go-libp2p-circuit" connmgr "github.com/libp2p/go-libp2p-connmgr" routing "github.com/libp2p/go-libp2p-core/routing" @@ -15,6 +16,7 @@ import ( dht "github.com/libp2p/go-libp2p-kad-dht" pnet "github.com/libp2p/go-libp2p-pnet" pubsub "github.com/libp2p/go-libp2p-pubsub" + libp2pquic "github.com/libp2p/go-libp2p-quic-transport" routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" ) @@ -30,13 +32,27 @@ func NewClusterHost( connman := connmgr.NewConnManager(cfg.ConnMgr.LowWater, cfg.ConnMgr.HighWater, cfg.ConnMgr.GracePeriod) + relayOpts := []relay.RelayOpt{relay.OptDiscovery} + if cfg.EnableRelayHop { + relayOpts = append(relayOpts, relay.OptHop) + } + + opts := []libp2p.Option{ + libp2p.ListenAddrs(cfg.ListenAddr...), + libp2p.NATPortMap(), + libp2p.ConnectionManager(connman), + libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) { + return dht.New(ctx, h) + }), + libp2p.EnableRelay(relayOpts...), + libp2p.EnableAutoRelay(), + } + h, err := newHost( ctx, cfg.Secret, ident.PrivateKey, - libp2p.ListenAddrs(cfg.ListenAddr), - libp2p.NATPortMap(), - libp2p.ConnectionManager(connman), + opts..., ) if err != nil { return nil, nil, nil, err @@ -74,18 +90,25 @@ func newHost(ctx context.Context, secret []byte, priv crypto.PrivKey, opts ...li finalOpts := []libp2p.Option{ libp2p.Identity(priv), libp2p.PrivateNetwork(prot), - libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) { - return dht.New(ctx, h) - }), - libp2p.EnableRelay(relay.OptHop, relay.OptDiscovery), - libp2p.EnableAutoRelay(), + libp2p.ChainOptions(libp2p.Transport(libp2pquic.NewTransport), libp2p.DefaultTransports), } finalOpts = append(finalOpts, opts...) - return libp2p.New( + h, err := libp2p.New( ctx, finalOpts..., ) + if err != nil { + return nil, err + } + + // need this for auto relay + _, err = autonat.NewAutoNATService(ctx, h, libp2p.PrivateNetwork(prot)) + if err != nil { + return nil, err + } + + return h, nil } func newDHT(ctx context.Context, h host.Host) (*dht.IpfsDHT, error) { diff --git a/go.mod b/go.mod index 3218636d..ebc016bd 100644 --- a/go.mod +++ b/go.mod @@ -24,6 +24,7 @@ require ( github.com/ipfs/go-fs-lock v0.0.1 github.com/ipfs/go-ipfs-api v0.0.2 github.com/ipfs/go-ipfs-chunker v0.0.1 + github.com/ipfs/go-ipfs-config v0.0.6 github.com/ipfs/go-ipfs-ds-help v0.0.1 github.com/ipfs/go-ipfs-files v0.0.6 github.com/ipfs/go-ipfs-posinfo v0.0.1 @@ -39,6 +40,8 @@ require ( github.com/lanzafame/go-libp2p-ocgorpc v0.1.1 github.com/libp2p/go-libp2p v0.4.0 github.com/libp2p/go-libp2p-connmgr v0.1.1 + github.com/libp2p/go-libp2p-autonat-svc v0.1.0 + github.com/libp2p/go-libp2p-circuit v0.1.1 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-core v0.2.3 github.com/libp2p/go-libp2p-crypto v0.1.0 @@ -58,6 +61,7 @@ require ( github.com/multiformats/go-multiaddr v0.1.1 github.com/multiformats/go-multiaddr-dns v0.1.1 github.com/multiformats/go-multiaddr-net v0.1.0 + github.com/libp2p/go-ws-transport v0.1.0 github.com/multiformats/go-multicodec v0.1.6 github.com/multiformats/go-multihash v0.0.8 github.com/pkg/errors v0.8.1 diff --git a/go.sum b/go.sum index ee7be133..60bfedc1 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,8 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= @@ -116,6 +118,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= @@ -381,6 +385,8 @@ github.com/libp2p/go-libp2p-autonat v0.0.6 h1:OCStANLLpeyQeWFUuqZJ7aS9+Bx0/uoVb1 github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-autonat-svc v0.1.0 h1:28IM7iWMDclZeVkpiFQaWVANwXwE7zLlpbnS7yXxrfs= +github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= @@ -494,7 +500,8 @@ github.com/libp2p/go-libp2p-pubsub v0.1.1 h1:phDnQvO3H3hAgaEEQi6yt3LILqIYVXaw05b github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-raft v0.1.4 h1:mE/RH6Q/QjwXXl1eWkbSpF6EjuD4pt2E9f94rkMalUE= github.com/libp2p/go-libp2p-raft v0.1.4/go.mod h1:+JGEXVP5ziDLtdDDRqvFjWN3Vsa6ahdLZNvFmTiN9gc= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= +github.com/libp2p/go-libp2p-quic-transport v0.1.2-0.20190830164807-17543aa14ed2 h1:KP4b2LodGnu82AvQrwjWGAZfTFPPBcVvYQCboLVEk7g= +github.com/libp2p/go-libp2p-quic-transport v0.1.2-0.20190830164807-17543aa14ed2/go.mod h1:h9PVZIZFhyPugM4FC5sVTnSCa2LudHBxtmW7Zj8eQVgithub.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= @@ -526,6 +533,8 @@ github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/ github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U= github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-tls v0.1.1 h1:tjW7njTM8JX8FbEvqr8/VSKBdZYZ7CtGtv3i6NiFf10= +github.com/libp2p/go-libp2p-tls v0.1.1/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5 h1:pV6+UlRxyDpASSGD+60vMvdifSCby6JkJDfi+yUMHac= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= @@ -591,8 +600,13 @@ github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/lucas-clemente/quic-go v0.12.0 h1:dYHUyB50gEQlK3KqytmNySzuyzAcaQ3iuI2ZReAfVrE= +github.com/lucas-clemente/quic-go v0.12.0/go.mod h1:UXJJPE4RfFef/xPO5wQm0tITK8gNfqwTxjbE7s3Vb8s= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= +github.com/marten-seemann/qtls v0.3.2 h1:O7awy4bHEzSX/K3h+fZig3/Vo03s/RxlxgsAk9sYamI= +github.com/marten-seemann/qtls v0.3.2/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -858,6 +872,7 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -900,6 +915,7 @@ golang.org/x/sys v0.0.0-20190524122548-abf6ff778158 h1:v73Zw0Y1htnV0qaOAYSNiuIAv golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4 h1:VSJ45BzqrVgR4clSx415y1rHH7QAGhGt71J0ZmhLYrc= golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= diff --git a/ipfscluster_test.go b/ipfscluster_test.go index 26b550b2..8706055d 100644 --- a/ipfscluster_test.go +++ b/ipfscluster_test.go @@ -297,14 +297,15 @@ func createHosts(t *testing.T, clusterSecret []byte, nClusters int) ([]host.Host pubsubs := make([]*pubsub.PubSub, nClusters, nClusters) dhts := make([]*dht.IpfsDHT, nClusters, nClusters) - listen, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") + addr, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") + quicAddr, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0/quic") for i := range hosts { priv, _, err := crypto.GenerateKeyPair(crypto.RSA, 2048) if err != nil { t.Fatal(err) } - h, p, d := createHost(t, priv, clusterSecret, listen) + h, p, d := createHost(t, priv, clusterSecret, []ma.Multiaddr{addr, quicAddr}) hosts[i] = h dhts[i] = d pubsubs[i] = p @@ -313,9 +314,9 @@ func createHosts(t *testing.T, clusterSecret []byte, nClusters int) ([]host.Host return hosts, pubsubs, dhts } -func createHost(t *testing.T, priv crypto.PrivKey, clusterSecret []byte, listen ma.Multiaddr) (host.Host, *pubsub.PubSub, *dht.IpfsDHT) { +func createHost(t *testing.T, priv crypto.PrivKey, clusterSecret []byte, listen []ma.Multiaddr) (host.Host, *pubsub.PubSub, *dht.IpfsDHT) { ctx := context.Background() - h, err := newHost(ctx, clusterSecret, priv, libp2p.ListenAddrs(listen)) + h, err := newHost(ctx, clusterSecret, priv, libp2p.ListenAddrs(listen...)) if err != nil { t.Fatal(err) } diff --git a/peer_manager_test.go b/peer_manager_test.go index b34c5417..881c02d5 100644 --- a/peer_manager_test.go +++ b/peer_manager_test.go @@ -43,7 +43,7 @@ func peerManagerClusters(t *testing.T) ([]*Cluster, []*test.IpfsMock, host.Host) cfg := &Config{} cfg.Default() listen, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") - cfg.ListenAddr = listen + cfg.ListenAddr = []ma.Multiaddr{listen} cfg.Secret = testingClusterSecret h, _, idht := createHost(t, ident.PrivateKey, testingClusterSecret, cfg.ListenAddr)