@@ -2,6 +2,7 @@ package nr
22
33import (
44 "bytes"
5+ "context"
56 "crypto/md5"
67 "encoding/json"
78 "fmt"
@@ -13,9 +14,11 @@ import (
1314 "strings"
1415 "time"
1516
17+ "github.com/cenkalti/backoff/v3"
1618 "github.com/threefoldtech/zosbase/pkg/gridtypes/zos"
1719 "github.com/threefoldtech/zosbase/pkg/network/ifaceutil"
1820 "github.com/threefoldtech/zosbase/pkg/network/macvlan"
21+ "github.com/threefoldtech/zosbase/pkg/network/mycelium"
1922 "github.com/threefoldtech/zosbase/pkg/network/ndmz"
2023 "github.com/threefoldtech/zosbase/pkg/network/options"
2124 "github.com/threefoldtech/zosbase/pkg/network/tuntap"
@@ -309,19 +312,10 @@ func (nr *NetResource) SetMycelium() (err error) {
309312 "--peers" ,
310313 }
311314
312- // set mycelium public addresses as the private peers
313- mycNamespace , mycInterface := ndmz .DmzNamespace , ndmz .DmzPub4
314- if namespace .Exists (publicNamespaceName ) {
315- mycNamespace = publicNamespaceName
316- mycInterface = publicInterfaceName
317- }
318-
319- ips , err := baseifaceutil .GetIPsForIFace (mycInterface , mycNamespace )
315+ hostPeers , err := getMyceliumPeers ()
320316 if err != nil {
321- return errors . Wrap ( err , "failed to get IPs for npub4" )
317+ return err
322318 }
323-
324- hostPeers := baseifaceutil .BuildMyceliumPeerURLs (ips )
325319 args = append (args , hostPeers ... )
326320
327321 err = zinit .AddService (name , zinit.InitService {
@@ -334,6 +328,46 @@ func (nr *NetResource) SetMycelium() (err error) {
334328 return init .Monitor (name )
335329}
336330
331+ // will keep retrying to get the host interface ips for a min, eventually will failback to the public peers
332+ func getMyceliumPeers () ([]string , error ) {
333+ // set mycelium public addresses as the private peers
334+ mycNamespace , mycInterface := ndmz .DmzNamespace , ndmz .DmzPub4
335+ if namespace .Exists (publicNamespaceName ) {
336+ mycNamespace = publicNamespaceName
337+ mycInterface = publicInterfaceName
338+ }
339+
340+ var ips []net.IPNet
341+ bo := backoff .NewExponentialBackOff ()
342+ bo .MaxElapsedTime = time .Minute
343+ bo .MaxInterval = 10 * time .Second
344+
345+ err := backoff .Retry (func () error {
346+ ips , err := baseifaceutil .GetIPsForIFace (mycInterface , mycNamespace )
347+ if err != nil {
348+ return backoff .Permanent (errors .Wrap (err , "failed to get IPs" ))
349+ }
350+ if len (ips ) == 0 {
351+ return fmt .Errorf ("no IPs available yet" )
352+ }
353+ return nil
354+ }, bo )
355+
356+ var hostPeers []string
357+ if err != nil {
358+ log .Warn ().Msg ("failed to get IPs after 1 minute, falling back to public mycelium peers" )
359+ peers , err := mycelium .FindPeers (context .Background (), nil )
360+ if err != nil {
361+ return nil , errors .Wrap (err , "failed to find public mycelium peers" )
362+ }
363+ hostPeers = peers
364+ } else {
365+ hostPeers = baseifaceutil .BuildMyceliumPeerURLs (ips )
366+ }
367+
368+ return hostPeers , nil
369+ }
370+
337371func (nr * NetResource ) ensureMyceliumNetwork (keyFile string ) error {
338372 // applies network configuration for this mycelium instance inside the proper namespace
339373 mycelium , err := nr .inspectMycelium (keyFile )
0 commit comments