Create scaffolding of ddl-simulator
Implement global server as control plane Implement device to get their info from global server and connect each others
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package device
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
pb "git.pengzhan.dev/ddp-simulator/proto"
|
||||
"github.com/cenkalti/backoff/v4"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
)
|
||||
|
||||
func (d *Device) RegisterClient() error {
|
||||
conn, err := grpc.NewClient(fmt.Sprintf("%s:%d", d.ParentIP, d.ParentPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect to global server: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
client := pb.NewDeviceClient(conn)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
children := make([]string, 0)
|
||||
for _, child := range d.Children {
|
||||
children = append(children, child.ID)
|
||||
}
|
||||
|
||||
_, err = client.Register(ctx, &pb.RegisterRequest{
|
||||
Id: d.ID,
|
||||
Role: d.Role,
|
||||
Ip: d.IP,
|
||||
Port: int32(d.Port),
|
||||
ChildrenIds: children,
|
||||
Capacity: d.Capacity,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *Device) RegisterClientRetry(ctx context.Context, timeout time.Duration) error {
|
||||
b := backoff.NewExponentialBackOff()
|
||||
b.InitialInterval = 1 * time.Second
|
||||
b.MaxElapsedTime = timeout
|
||||
|
||||
retryOp := func() error {
|
||||
return d.RegisterClient()
|
||||
}
|
||||
err := backoff.Retry(retryOp, backoff.WithContext(b, ctx))
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user