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

93 lines
2.1 KiB
Go

package global
import (
"context"
"encoding/json"
"fmt"
"io"
"os"
pb "git.pengzhan.dev/ddp-simulator/proto"
log "github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto"
)
type GlobalServer struct {
pb.UnimplementedGlobalServiceServer
Configs map[string]config
}
type config struct {
ID string `json:"id"`
Role string `json:"role"`
Capacity float32 `json:"capacity"`
IP string `json:"ip"`
Port int `json:"port"`
ParentID string `json:"parentID"`
ParentIP string `json:"parentIP"`
ParentPort int `json:"parentPort"`
}
func NewGlobalServer(configPath string) *GlobalServer {
configs, err := ReadConfigFromPath(configPath)
if err != nil {
log.Fatalf("could not read config file: %v", err)
}
return &GlobalServer{
Configs: configs,
}
}
func ReadConfigFromPath(configPath string) (map[string]config, error) {
file, err := os.Open(configPath)
if err != nil {
return nil, fmt.Errorf("could not open file: %v", err)
}
defer file.Close()
fileContent, err := io.ReadAll(file)
if err != nil {
return nil, fmt.Errorf("could not read file content: %v", err)
}
var configs []config
err = json.Unmarshal(fileContent, &configs)
if err != nil {
return nil, fmt.Errorf("could not parse JSON content: %v", err)
}
configMap := make(map[string]config)
for _, c := range configs {
configMap[c.ID] = c
}
return configMap, nil
}
func (g *GlobalServer) Init(ctx context.Context, in *pb.InitRequest) (*pb.InitResponse, error) {
config, ok := g.Configs[in.Id]
if !ok {
log.Errorf("device %s not found", in.Id)
return nil, fmt.Errorf("device %s not found", in.Id)
}
log.Infof("device %s init", config.ID)
resp := &pb.InitResponse{
Role: config.Role,
Capacity: proto.Float32(config.Capacity),
Ip: config.IP,
Port: int32(config.Port),
}
if config.ParentID != "" {
resp.ParentId = proto.String(config.ParentID)
resp.Pip = proto.String(config.ParentIP)
resp.Pport = proto.Int32(int32(config.ParentPort))
}
if config.Capacity != 0 {
resp.Capacity = proto.Float32(config.Capacity)
}
return resp, nil
}