tpuproxy/cmd/gossip/pull/pull.go

98 lines
1.9 KiB
Go

// Pull downloads CRDS from a peer.
package main
import (
"context"
"crypto/ed25519"
"crypto/rand"
"flag"
"net"
"net/netip"
"os"
"os/signal"
"time"
"github.com/certusone/radiance/pkg/gossip"
"golang.org/x/sync/errgroup"
"k8s.io/klog/v2"
)
var (
flagAddr = flag.String("addr", "", "Address to ping (<host>:<port>)")
)
var target netip.AddrPort
func init() {
klog.InitFlags(nil)
flag.Parse()
}
func main() {
if *flagAddr == "" {
klog.Exit("No address specified")
}
udpAddr, err := net.ResolveUDPAddr("udp", *flagAddr)
if err != nil {
klog.Exitf("invalid target address: %s", err)
}
target = udpAddr.AddrPort()
ctx := context.Background()
_, identity, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
conn, err := net.ListenUDP("udp", nil)
if err != nil {
klog.Exit(err)
}
pingClient := gossip.NewPingClient(identity, conn)
pingServer := gossip.NewPingServer(identity, conn)
pullClient := gossip.NewPullClient(identity, conn)
handler := &gossip.Handler{
PingClient: pingClient,
PingServer: pingServer,
PullClient: pullClient,
}
client := gossip.NewDriver(handler, conn)
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt)
defer cancel()
group, ctx := errgroup.WithContext(ctx)
group.Go(func() error {
return client.Run(ctx)
})
group.Go(func() error {
_, _, err := pingClient.Ping(ctx, target)
if err != nil {
klog.Exitf("ping ignored: %s", err)
}
klog.Info("Pinged")
err = pullClient.Pull(target)
if err != nil {
klog.Exitf("failed to send pull request: %s", err)
}
err = pullClient.Pull(target)
if err != nil {
klog.Exitf("failed to send pull request: %s", err)
}
time.Sleep(2 * time.Second)
err = pullClient.Pull(target)
if err != nil {
klog.Exitf("failed to send pull request: %s", err)
}
time.Sleep(3 * time.Second)
return context.Canceled // done
})
_ = group.Wait()
_ = conn.Close()
}