service init --randomports:

Allow initialize cluster with random ports that are ununsed (at the moment of initialization)
This commit is contained in:
Kishan Sagathiya 2019-10-24 21:24:50 +05:30 committed by Hector Sanjuan
parent 31534a429b
commit 7b499263af
3 changed files with 102 additions and 0 deletions

View File

@ -272,6 +272,10 @@ the peer IDs in the given multiaddresses.
Name: "force, f",
Usage: "overwrite configuration without prompting",
},
cli.BoolFlag{
Name: "randomports",
Usage: "configure random ports to listen on instead of defaults",
},
},
Action: func(c *cli.Context) error {
consensus := c.String("consensus")
@ -319,6 +323,16 @@ the peer IDs in the given multiaddresses.
// Generate defaults for all registered components
err := cfgHelper.Manager().Default()
checkErr("generating default configuration", err)
if c.Bool("randomports") {
cfgs := cfgHelper.Configs()
cfgs.Cluster.ListenAddr, err = cmdutils.RandomizePorts(cfgs.Cluster.ListenAddr)
checkErr("randomizing ports", err)
cfgs.Restapi.HTTPListenAddr, err = cmdutils.RandomizePorts(cfgs.Restapi.HTTPListenAddr)
checkErr("randomizing ports", err)
cfgs.Ipfsproxy.ListenAddr, err = cmdutils.RandomizePorts(cfgs.Ipfsproxy.ListenAddr)
checkErr("randomizing ports", err)
}
err = cfgHelper.Manager().ApplyEnvVars()
checkErr("applying environment variables to configuration", err)

View File

@ -0,0 +1,33 @@
package main
import (
"testing"
"github.com/ipfs/ipfs-cluster/cmdutils"
ma "github.com/multiformats/go-multiaddr"
)
func TestRandomPorts(t *testing.T) {
m1, _ := ma.NewMultiaddr("/ip4/0.0.0.0/tcp/9096")
m2, _ := ma.NewMultiaddr("/ip4/0.0.0.0/tcp/9096")
m1, err := cmdutils.RandomizePorts(m1)
if err != nil {
t.Fatal(err)
}
v1, err := m1.ValueForProtocol(ma.P_TCP)
if err != nil {
t.Fatal(err)
}
v2, err := m2.ValueForProtocol(ma.P_TCP)
if err != nil {
t.Fatal(err)
}
if v1 == v2 {
t.Error("expected different ports")
}
}

View File

@ -1,3 +1,58 @@
// Package cmdutils contains utilities to facilitate building of command line
// applications launching cluster peers.
package cmdutils
import (
"fmt"
"net"
ma "github.com/multiformats/go-multiaddr"
)
// RandomizePorts replaces TCP and UDP ports with random, but valid port
// values.
func RandomizePorts(m ma.Multiaddr) (ma.Multiaddr, error) {
var prev string
var err error
components := []ma.Multiaddr{}
ma.ForEach(m, func(c ma.Component) bool {
code := c.Protocol().Code
if code != ma.P_TCP && code != ma.P_UDP {
components = append(components, &c)
prev = c.Value()
return true
}
var ln net.Listener
ln, err = net.Listen(c.Protocol().Name, prev+":")
if err != nil {
return false
}
defer ln.Close()
var c1 *ma.Component
c1, err = ma.NewComponent(c.Protocol().Name, fmt.Sprintf("%d", getPort(ln, code)))
if err != nil {
return false
}
components = append(components, c1)
prev = c.Value()
return true
})
return ma.Join(components...), err
}
func getPort(ln net.Listener, code int) int {
if code == ma.P_TCP {
return ln.Addr().(*net.TCPAddr).Port
}
if code == ma.P_UDP {
return ln.Addr().(*net.UDPAddr).Port
}
return 0
}