Files
cunicu/test/nodes/agent_list.go
2022-08-04 00:20:43 +02:00

79 lines
1.3 KiB
Go

//go:build linux
package nodes
import (
"fmt"
"golang.org/x/sync/errgroup"
)
type AgentList []*Agent
func (al AgentList) Start(args []any) error {
if err := al.ForEachAgentPair(func(a, b *Agent) error {
return a.AddWireGuardPeer(b)
}); err != nil {
return fmt.Errorf("failed to add wireguard peers")
}
if err := al.ForEachAgent(func(a *Agent) error {
return a.Start(args)
}); err != nil {
return fmt.Errorf("failed to start agent: %w", err)
}
return nil
}
func (al AgentList) Stop() error {
return al.ForEachAgent(func(a *Agent) error {
return a.Stop()
})
}
func (al AgentList) ForEachAgent(cb func(a *Agent) error) error {
g := errgroup.Group{}
for _, node := range al {
n := node
g.Go(func() error {
return cb(n)
})
}
return g.Wait()
}
func (al AgentList) ForEachAgentPair(cb func(a, b *Agent) error) error {
g := errgroup.Group{}
for _, n := range al {
for _, p := range al {
if n != p {
peer := p
node := n
g.Go(func() error {
return cb(node, peer)
})
}
}
}
return g.Wait()
}
func (al AgentList) WaitConnected() error {
return al.ForEachAgentPair(func(a, b *Agent) error {
return a.WaitReady(b)
})
}
func (al AgentList) PingPeers() error {
return al.ForEachAgentPair(func(a, b *Agent) error {
return a.PingWireGuardPeer(b)
})
}