d6e129179c
Implement global server as control plane Implement device to get their info from global server and connect each others
53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
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
|
|
}
|