Files
Pengzhan Hao d6e129179c Create scaffolding of ddl-simulator
Implement global server as control plane

Implement device to get their info from global server and connect each
others
2024-12-17 07:31:18 +00:00

78 lines
1.9 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"net"
"os"
"os/signal"
"syscall"
"time"
"git.pengzhan.dev/ddp-simulator/pkg/device"
"git.pengzhan.dev/ddp-simulator/pkg/env"
pb "git.pengzhan.dev/ddp-simulator/proto"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
var (
id = flag.String("id", "0", "The device id")
gip = flag.String("gip", "127.0.0.1", "The global server ip")
gport = flag.Int("gport", 3200, "The global server port")
)
func init() {
flag.Parse()
log.SetOutput(os.Stdout)
log.SetLevel(log.TraceLevel)
// log.SetReportCaller(true)
}
func main() {
conn, err := grpc.NewClient(fmt.Sprintf("%s:%d", *gip, *gport), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("failed to connect to global server: %v", err)
}
client := pb.NewGlobalServiceClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
resp, err := client.Init(ctx, &pb.InitRequest{Id: *id})
if err != nil {
log.Fatalf("failed to init: %v", err)
}
d := device.NewDevice(*id, resp.Role, resp.Ip, int(resp.Port))
if resp.Capacity != nil {
d.UpdateCapacity(resp.Capacity)
}
if resp.ParentId != nil {
d.UpdateParent(resp.ParentId, *resp.Pip, int(*resp.Pport))
if err := d.RegisterClientRetry(context.TODO(), 30*time.Second); err != nil {
log.WithField("device", d.ID).Fatalf("failed to register: %v", err)
}
}
s := grpc.NewServer()
lis, err := net.Listen(env.PROTOCOL, fmt.Sprintf("%s:%d", resp.Ip, resp.Port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
os.Exit(1)
}()
pb.RegisterDeviceServer(s, d)
log.Infof("device %s start on %s:%d", *id, resp.Ip, resp.Port)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}