From 3ea465cbd5f29063fde67f3e02ed62eaf2c6d507 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 12 May 2021 21:28:32 +0900 Subject: [PATCH 01/11] feat: swarm peering command without save option --- core/commands/commands_test.go | 4 ++ core/commands/swarm.go | 124 +++++++++++++++++++++++++++++++++ peering/peering.go | 19 +++++ peering/peering_test.go | 6 ++ test/sharness/t0140-swarm.sh | 30 ++++++++ 5 files changed, 183 insertions(+) diff --git a/core/commands/commands_test.go b/core/commands/commands_test.go index 5c076307413..052eba2fcb9 100644 --- a/core/commands/commands_test.go +++ b/core/commands/commands_test.go @@ -237,6 +237,10 @@ func TestCommands(t *testing.T) { "/swarm/filters/add", "/swarm/filters/rm", "/swarm/peers", + "/swarm/peering", + "/swarm/peering/add", + "/swarm/peering/ls", + "/swarm/peering/rm", "/tar", "/tar/add", "/tar/cat", diff --git a/core/commands/swarm.go b/core/commands/swarm.go index b82a95630dc..7aba1689881 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -51,6 +51,7 @@ ipfs peers in the internet. "disconnect": swarmDisconnectCmd, "filters": swarmFiltersCmd, "peers": swarmPeersCmd, + "peering": swarmPeeringCmd, }, } @@ -61,6 +62,129 @@ const ( swarmDirectionOptionName = "direction" ) +var swarmPeeringCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "modify the peering service.", + ShortDescription: ` +'ipfs swarm peering' is a tool to manupulate the peering service. +Peers in the peering service is maintained to be connected, reconnected +on disconnect with a back-off. +`, + }, + Subcommands: map[string]*cmds.Command{ + "add": swarmPeeringAddCmd, + "ls": swarmPeeringLsCmd, + "rm": swarmPeeringRmCmd, + }, +} + +var swarmPeeringAddCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "add peers into the peering service.", + ShortDescription: ` +'ipfs swarm peering add' adds peers into the peering service. +`, + }, + Arguments: []cmds.Argument{ + cmds.StringArg("address", true, true, "address of peer to add into the PeeringService"), + }, + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + addrs := make([]ma.Multiaddr, len(req.Arguments)) + + for i, arg := range req.Arguments { + addr, err := ma.NewMultiaddr(arg) + if err != nil { + return err + } + + addrs[i] = addr + } + + addInfos, err := peer.AddrInfosFromP2pAddrs(addrs...) + if err != nil { + return err + } + + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + + output := make([]string, len(addInfos)) + for i, id := range addInfos { + output[i] = "add " + id.ID.Pretty() + node.Peering.AddPeer(id) + + output[i] += " success" + } + + return cmds.EmitOnce(res, &stringList{output}) + }, + Encoders: cmds.EncoderMap{ + cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + }, + Type: stringList{}, +} + +var swarmPeeringLsCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "list peers registered in the peering service.", + ShortDescription: ` +'ipfs swarm peering ls' lists peers registered in the peering service.`, + }, + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + peers := node.Peering.ListPeer() + return cmds.EmitOnce(res, addrInfos{Peers: peers}) + }, + Type: addrInfos{}, +} + +type addrInfos struct { + Peers []peer.AddrInfo +} + +var swarmPeeringRmCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "remove a peer from the peering service.", + ShortDescription: ` +'ipfs swarm peering rm' removes peers from the peering service. +`, + }, + Arguments: []cmds.Argument{ + cmds.StringArg("ID", true, true, "ID of peer to remove from PeeringService"), + }, + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + + output := make([]string, 0, len(req.Arguments)) + for _, arg := range req.Arguments { + id, err := peer.Decode(arg) + if err != nil { + return err + } + + msg := "remove " + id.Pretty() + + node.Peering.RemovePeer(id) + + msg += " success" + output = append(output, msg) + } + return cmds.EmitOnce(res, &stringList{output}) + }, + Type: stringList{}, + Encoders: cmds.EncoderMap{ + cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + }, +} + var swarmPeersCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "List peers with open connections.", diff --git a/peering/peering.go b/peering/peering.go index ed0b43226c0..8ccb80de16b 100644 --- a/peering/peering.go +++ b/peering/peering.go @@ -3,6 +3,7 @@ package peering import ( "context" "errors" + "fmt" "math/rand" "sync" "time" @@ -212,6 +213,7 @@ func (ps *PeeringService) Stop() error { // Add peer may also be called multiple times for the same peer. The new // addresses will replace the old. func (ps *PeeringService) AddPeer(info peer.AddrInfo) { + fmt.Printf("atempt to add peer %s of addrs %s\n", info.ID, info.Addrs) ps.mu.Lock() defer ps.mu.Unlock() @@ -220,6 +222,7 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) { handler.setAddrs(info.Addrs) } else { logger.Infow("peer added", "peer", info.ID, "addrs", info.Addrs) + // in case ps.host is null this line results in a panic. ps.host.ConnManager().Protect(info.ID, connmgrTag) handler = &peerHandler{ @@ -242,6 +245,22 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) { } } +// ListPeer lists peers in the peering service. +func (ps *PeeringService) ListPeer() []peer.AddrInfo { + out := make([]peer.AddrInfo, len(ps.peers)) + c := 0 + for k, v := range ps.peers { + out_addrs := make([]multiaddr.Multiaddr, len(v.addrs)) + copy(out_addrs, v.addrs) + out[c] = peer.AddrInfo{ + ID: k, + Addrs: out_addrs, + } + c++ + } + return out +} + // RemovePeer removes a peer from the peering service. This function may be // safely called at any time: before the service is started, while running, or // after it stops. diff --git a/peering/peering_test.go b/peering/peering_test.go index 7ec42efb6a5..8d4d4ae2578 100644 --- a/peering/peering_test.go +++ b/peering/peering_test.go @@ -39,6 +39,7 @@ func TestPeeringService(t *testing.T) { // peer 1 -> 2 ps1.AddPeer(peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) // We haven't started so we shouldn't have any peers. require.Never(t, func() bool { @@ -109,6 +110,7 @@ func TestPeeringService(t *testing.T) { // Unprotect 2 from 1. ps1.RemovePeer(h2.ID()) + require.NotContains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) // Trim connections. h1.ConnManager().TrimOpenConns(ctx) @@ -127,7 +129,9 @@ func TestPeeringService(t *testing.T) { // Until added back ps1.AddPeer(peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) ps1.AddPeer(peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}) + require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}) t.Logf("wait for h1 to connect to h2 and h3 again") require.Eventually(t, func() bool { return h1.Network().Connectedness(h2.ID()) == network.Connected @@ -142,7 +146,9 @@ func TestPeeringService(t *testing.T) { // Adding and removing should work after stopping. ps1.AddPeer(peer.AddrInfo{ID: h4.ID(), Addrs: h4.Addrs()}) + require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h4.ID(), Addrs: h4.Addrs()}) ps1.RemovePeer(h2.ID()) + require.NotContains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) } func TestNextBackoff(t *testing.T) { diff --git a/test/sharness/t0140-swarm.sh b/test/sharness/t0140-swarm.sh index 352467136df..2d873ebc064 100755 --- a/test/sharness/t0140-swarm.sh +++ b/test/sharness/t0140-swarm.sh @@ -97,6 +97,36 @@ test_expect_success "Addresses.NoAnnounce with /ipcidr affects addresses" ' test_kill_ipfs_daemon +test_launch_ipfs_daemon + +test_expect_success "'ipfs swarm peering ls' lists peerings" ' + ipfs swarm peering ls +' + +peeringID='QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N' +peeringAddr='/ip4/1.2.3.4/tcp/1234/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N' +test_expect_success "'ipfs swarm peering add' adds a peering" ' + ipfs swarm peering ls > peeringls && + ! test_should_contain ${peeringID} peeringls + ipfs swarm peering add $peeringAddr +' + +test_expect_success 'a peering is added' ' + ipfs swarm peering ls > peeringadd && + test_should_contain ${peeringID} peeringadd +' + +test_expect_success "'swarm peering rm' removes a peering" ' + ipfs swarm peering rm ${peeringID} +' + +test_expect_success 'peering is removed' ' + ipfs swarm peering ls > peeringrm && + ! test_should_contain ${peeringID} peeringrm +' + +test_kill_ipfs_daemon + test_expect_success "set up tcp testbed" ' iptb testbed create -type localipfs -count 2 -force -init ' From 6207eebe89ce3815ea5ef5ffcc532cc9d82c97d5 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 01:55:57 +0900 Subject: [PATCH 02/11] fix: unnecessary printf --- peering/peering.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/peering/peering.go b/peering/peering.go index 8ccb80de16b..4d207d1038c 100644 --- a/peering/peering.go +++ b/peering/peering.go @@ -3,7 +3,6 @@ package peering import ( "context" "errors" - "fmt" "math/rand" "sync" "time" @@ -213,7 +212,6 @@ func (ps *PeeringService) Stop() error { // Add peer may also be called multiple times for the same peer. The new // addresses will replace the old. func (ps *PeeringService) AddPeer(info peer.AddrInfo) { - fmt.Printf("atempt to add peer %s of addrs %s\n", info.ID, info.Addrs) ps.mu.Lock() defer ps.mu.Unlock() From f6b7a91fe207eadd5e90e2a8df654073b3f9d5a6 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 02:13:36 +0900 Subject: [PATCH 03/11] fix: add an encoder for swarm peering ls --- core/commands/swarm.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 7aba1689881..2054610b62a 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -141,6 +141,17 @@ var swarmPeeringLsCmd = &cmds.Command{ return cmds.EmitOnce(res, addrInfos{Peers: peers}) }, Type: addrInfos{}, + Encoders: cmds.EncoderMap{ + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, ai *addrInfos) error { + for _, info := range ai.Peers { + fmt.Fprintf(w, "%s \n", info.ID.String()) + for _, addr := range info.Addrs { + fmt.Fprintf(w, "\t"+addr.String()+"\n") + } + } + return nil + }), + }, } type addrInfos struct { From 93aee8f5d5052489ea68223dc0c5c54e8c26bab7 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 13:45:30 +0900 Subject: [PATCH 04/11] Update peering/peering.go Co-authored-by: Steven Allen --- peering/peering.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/peering/peering.go b/peering/peering.go index 4d207d1038c..47ce454c561 100644 --- a/peering/peering.go +++ b/peering/peering.go @@ -243,8 +243,8 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) { } } -// ListPeer lists peers in the peering service. -func (ps *PeeringService) ListPeer() []peer.AddrInfo { +// ListPeers lists peers in the peering service. +func (ps *PeeringService) ListPeers() []peer.AddrInfo { out := make([]peer.AddrInfo, len(ps.peers)) c := 0 for k, v := range ps.peers { From 4a9997839dbe32b7ae4da197ef2aa82d72d36e94 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 13:45:41 +0900 Subject: [PATCH 05/11] Update peering/peering.go Co-authored-by: Steven Allen --- peering/peering.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/peering/peering.go b/peering/peering.go index 47ce454c561..796167a91e7 100644 --- a/peering/peering.go +++ b/peering/peering.go @@ -248,7 +248,7 @@ func (ps *PeeringService) ListPeers() []peer.AddrInfo { out := make([]peer.AddrInfo, len(ps.peers)) c := 0 for k, v := range ps.peers { - out_addrs := make([]multiaddr.Multiaddr, len(v.addrs)) + outAddrs := make([]multiaddr.Multiaddr, len(v.addrs)) copy(out_addrs, v.addrs) out[c] = peer.AddrInfo{ ID: k, From 9121c9e54b8f667aeec26ec5d097ec136f4889b9 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 13:46:22 +0900 Subject: [PATCH 06/11] Update core/commands/swarm.go Co-authored-by: Steven Allen --- core/commands/swarm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 2054610b62a..f8c98765576 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -146,7 +146,7 @@ var swarmPeeringLsCmd = &cmds.Command{ for _, info := range ai.Peers { fmt.Fprintf(w, "%s \n", info.ID.String()) for _, addr := range info.Addrs { - fmt.Fprintf(w, "\t"+addr.String()+"\n") + fmt.Fprintf(w, "\t%s\n", addr) } } return nil From 9c2340c67b0a61c8688e95f29a8e70040023a0d5 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 13:46:35 +0900 Subject: [PATCH 07/11] Update core/commands/swarm.go Co-authored-by: Steven Allen --- core/commands/swarm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index f8c98765576..220801bf72c 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -144,7 +144,7 @@ var swarmPeeringLsCmd = &cmds.Command{ Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, ai *addrInfos) error { for _, info := range ai.Peers { - fmt.Fprintf(w, "%s \n", info.ID.String()) + fmt.Fprintf(w, "%s\n", info.ID) for _, addr := range info.Addrs { fmt.Fprintf(w, "\t%s\n", addr) } From 0803da7e46f41da7cd3fd84d739074b4fb43bde0 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Wed, 18 Aug 2021 21:07:34 +0900 Subject: [PATCH 08/11] fix: help text and comments --- core/commands/swarm.go | 25 +++++++++++++------------ peering/peering.go | 16 +++++----------- peering/peering_test.go | 12 ++++++------ 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 220801bf72c..6c4e7ac1bdb 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -64,10 +64,10 @@ const ( var swarmPeeringCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "modify the peering service.", + Tagline: "Modify the peering subsystem.", ShortDescription: ` -'ipfs swarm peering' is a tool to manupulate the peering service. -Peers in the peering service is maintained to be connected, reconnected +'ipfs swarm peering' manages the peering subsystem. +Peers in the peering subsystem is maintained to be connected, reconnected on disconnect with a back-off. `, }, @@ -80,13 +80,13 @@ on disconnect with a back-off. var swarmPeeringAddCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "add peers into the peering service.", + Tagline: "Add peers into the peering subsystem.", ShortDescription: ` -'ipfs swarm peering add' adds peers into the peering service. +'ipfs swarm peering add' will add the new address to the peering subsystem as one that should always be connected to. `, }, Arguments: []cmds.Argument{ - cmds.StringArg("address", true, true, "address of peer to add into the PeeringService"), + cmds.StringArg("address", true, true, "address of peer to add into the peering subsystem"), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { addrs := make([]ma.Multiaddr, len(req.Arguments)) @@ -128,16 +128,17 @@ var swarmPeeringAddCmd = &cmds.Command{ var swarmPeeringLsCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "list peers registered in the peering service.", + Tagline: "List peers registered in the peering subsystem.", ShortDescription: ` -'ipfs swarm peering ls' lists peers registered in the peering service.`, +'ipfs swarm peering ls' lists the peers that are registered in the peering subsystem and to which the daemon is always connected. +`, }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { node, err := cmdenv.GetNode(env) if err != nil { return err } - peers := node.Peering.ListPeer() + peers := node.Peering.ListPeers() return cmds.EmitOnce(res, addrInfos{Peers: peers}) }, Type: addrInfos{}, @@ -160,13 +161,13 @@ type addrInfos struct { var swarmPeeringRmCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "remove a peer from the peering service.", + Tagline: "Remove a peer from the peering subsystem.", ShortDescription: ` -'ipfs swarm peering rm' removes peers from the peering service. +'ipfs swarm peering rm' will remove the given ID from the peering subsystem and remove it from the always-on connection. `, }, Arguments: []cmds.Argument{ - cmds.StringArg("ID", true, true, "ID of peer to remove from PeeringService"), + cmds.StringArg("ID", true, true, "ID of peer to remove from the peering subsystem"), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { node, err := cmdenv.GetNode(env) diff --git a/peering/peering.go b/peering/peering.go index 796167a91e7..3146769a02a 100644 --- a/peering/peering.go +++ b/peering/peering.go @@ -220,7 +220,6 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) { handler.setAddrs(info.Addrs) } else { logger.Infow("peer added", "peer", info.ID, "addrs", info.Addrs) - // in case ps.host is null this line results in a panic. ps.host.ConnManager().Protect(info.ID, connmgrTag) handler = &peerHandler{ @@ -245,16 +244,11 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) { // ListPeers lists peers in the peering service. func (ps *PeeringService) ListPeers() []peer.AddrInfo { - out := make([]peer.AddrInfo, len(ps.peers)) - c := 0 - for k, v := range ps.peers { - outAddrs := make([]multiaddr.Multiaddr, len(v.addrs)) - copy(out_addrs, v.addrs) - out[c] = peer.AddrInfo{ - ID: k, - Addrs: out_addrs, - } - c++ + out := make([]peer.AddrInfo, 0, len(ps.peers)) + for id, addrs := range ps.peers { + ai := peer.AddrInfo{ID: id} + ai.Addrs = append(ai.Addrs, addrs.addrs...) + out = append(out, ai) } return out } diff --git a/peering/peering_test.go b/peering/peering_test.go index 8d4d4ae2578..cf91e637c75 100644 --- a/peering/peering_test.go +++ b/peering/peering_test.go @@ -39,7 +39,7 @@ func TestPeeringService(t *testing.T) { // peer 1 -> 2 ps1.AddPeer(peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) - require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.Contains(t, ps1.ListPeers(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) // We haven't started so we shouldn't have any peers. require.Never(t, func() bool { @@ -110,7 +110,7 @@ func TestPeeringService(t *testing.T) { // Unprotect 2 from 1. ps1.RemovePeer(h2.ID()) - require.NotContains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.NotContains(t, ps1.ListPeers(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) // Trim connections. h1.ConnManager().TrimOpenConns(ctx) @@ -129,9 +129,9 @@ func TestPeeringService(t *testing.T) { // Until added back ps1.AddPeer(peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) - require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.Contains(t, ps1.ListPeers(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) ps1.AddPeer(peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}) - require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}) + require.Contains(t, ps1.ListPeers(), peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}) t.Logf("wait for h1 to connect to h2 and h3 again") require.Eventually(t, func() bool { return h1.Network().Connectedness(h2.ID()) == network.Connected @@ -146,9 +146,9 @@ func TestPeeringService(t *testing.T) { // Adding and removing should work after stopping. ps1.AddPeer(peer.AddrInfo{ID: h4.ID(), Addrs: h4.Addrs()}) - require.Contains(t, ps1.ListPeer(), peer.AddrInfo{ID: h4.ID(), Addrs: h4.Addrs()}) + require.Contains(t, ps1.ListPeers(), peer.AddrInfo{ID: h4.ID(), Addrs: h4.Addrs()}) ps1.RemovePeer(h2.ID()) - require.NotContains(t, ps1.ListPeer(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) + require.NotContains(t, ps1.ListPeers(), peer.AddrInfo{ID: h2.ID(), Addrs: h2.Addrs()}) } func TestNextBackoff(t *testing.T) { From 9b9c26cb4b187f784640ccf100976d17e2cf1fea Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Thu, 26 Aug 2021 01:41:47 +0900 Subject: [PATCH 09/11] change return value of swarm peering add --- core/commands/swarm.go | 27 +++++++++++++++++---------- test/sharness/t0140-swarm.sh | 10 +++++++--- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 6c4e7ac1bdb..38fd6edeb0f 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -62,6 +62,11 @@ const ( swarmDirectionOptionName = "direction" ) +type peeringResult struct { + ID peer.ID + Status string +} + var swarmPeeringCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Modify the peering subsystem.", @@ -110,20 +115,22 @@ var swarmPeeringAddCmd = &cmds.Command{ return err } - output := make([]string, len(addInfos)) - for i, id := range addInfos { - output[i] = "add " + id.ID.Pretty() - node.Peering.AddPeer(id) - - output[i] += " success" + for _, addrinfo := range addInfos { + node.Peering.AddPeer(addrinfo) + err = res.Emit(peeringResult{addrinfo.ID, "success"}) + if err != nil { + return err + } } - - return cmds.EmitOnce(res, &stringList{output}) + return nil }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, pr *peeringResult) error { + fmt.Fprintf(w, "add %s %s\n", pr.ID.String(), pr.Status) + return nil + }), }, - Type: stringList{}, + Type: peeringResult{}, } var swarmPeeringLsCmd = &cmds.Command{ diff --git a/test/sharness/t0140-swarm.sh b/test/sharness/t0140-swarm.sh index 2d873ebc064..20994c13e7c 100755 --- a/test/sharness/t0140-swarm.sh +++ b/test/sharness/t0140-swarm.sh @@ -104,16 +104,20 @@ test_expect_success "'ipfs swarm peering ls' lists peerings" ' ' peeringID='QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N' +peeringID2='QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5K' peeringAddr='/ip4/1.2.3.4/tcp/1234/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N' +peeringAddr2='/ip4/1.2.3.4/tcp/1234/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5K' test_expect_success "'ipfs swarm peering add' adds a peering" ' ipfs swarm peering ls > peeringls && - ! test_should_contain ${peeringID} peeringls - ipfs swarm peering add $peeringAddr + ! test_should_contain ${peeringID} peeringls && + ! test_should_contain ${peeringID2} peeringls && + ipfs swarm peering add ${peeringAddr} ${peeringAddr2} ' test_expect_success 'a peering is added' ' ipfs swarm peering ls > peeringadd && - test_should_contain ${peeringID} peeringadd + test_should_contain ${peeringID} peeringadd && + test_should_contain ${peeringID2} peeringadd ' test_expect_success "'swarm peering rm' removes a peering" ' From 8f32e34e1e8cf4dce4d1dd0d2e0c7db3b2305220 Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Thu, 26 Aug 2021 01:51:35 +0900 Subject: [PATCH 10/11] change return value of swarm peering rm --- core/commands/swarm.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 38fd6edeb0f..803a4a033d7 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -182,25 +182,25 @@ var swarmPeeringRmCmd = &cmds.Command{ return err } - output := make([]string, 0, len(req.Arguments)) for _, arg := range req.Arguments { id, err := peer.Decode(arg) if err != nil { return err } - msg := "remove " + id.Pretty() - node.Peering.RemovePeer(id) - - msg += " success" - output = append(output, msg) + if err = res.Emit(peeringResult{id, "success"}); err != nil { + return err + } } - return cmds.EmitOnce(res, &stringList{output}) + return nil }, - Type: stringList{}, + Type: peeringResult{}, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, pr *peeringResult) error { + fmt.Fprintf(w, "add %s %s\n", pr.ID.String(), pr.Status) + return nil + }), }, } From dbdf1034fa454393ddd173f199043dc44d8cc43e Mon Sep 17 00:00:00 2001 From: Takashi Matsuda Date: Fri, 3 Sep 2021 01:46:37 +0900 Subject: [PATCH 11/11] Update core/commands/swarm.go --- core/commands/swarm.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 803a4a033d7..7cde3f38d43 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -74,6 +74,7 @@ var swarmPeeringCmd = &cmds.Command{ 'ipfs swarm peering' manages the peering subsystem. Peers in the peering subsystem is maintained to be connected, reconnected on disconnect with a back-off. +The changes are not saved to the config. `, }, Subcommands: map[string]*cmds.Command{