mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add AgentAPI using DRPC (#10811)
Co-authored-by: Spike Curtis <spike@coder.com>
This commit is contained in:
co-authored by
Spike Curtis
parent
eb781751b8
commit
e46431078c
@@ -0,0 +1,53 @@
|
||||
package agentapi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
"tailscale.com/tailcfg"
|
||||
|
||||
agentproto "github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/tailnet"
|
||||
tailnetproto "github.com/coder/coder/v2/tailnet/proto"
|
||||
)
|
||||
|
||||
type TailnetAPI struct {
|
||||
Ctx context.Context
|
||||
DerpMapFn func() *tailcfg.DERPMap
|
||||
DerpMapUpdateFrequency time.Duration
|
||||
}
|
||||
|
||||
func (a *TailnetAPI) StreamDERPMaps(_ *tailnetproto.StreamDERPMapsRequest, stream agentproto.DRPCAgent_StreamDERPMapsStream) error {
|
||||
defer stream.Close()
|
||||
|
||||
ticker := time.NewTicker(a.DerpMapUpdateFrequency)
|
||||
defer ticker.Stop()
|
||||
|
||||
var lastDERPMap *tailcfg.DERPMap
|
||||
for {
|
||||
derpMap := a.DerpMapFn()
|
||||
if lastDERPMap == nil || !tailnet.CompareDERPMaps(lastDERPMap, derpMap) {
|
||||
protoDERPMap := tailnet.DERPMapToProto(derpMap)
|
||||
err := stream.Send(protoDERPMap)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("send derp map: %w", err)
|
||||
}
|
||||
lastDERPMap = derpMap
|
||||
}
|
||||
|
||||
ticker.Reset(a.DerpMapUpdateFrequency)
|
||||
select {
|
||||
case <-stream.Context().Done():
|
||||
return nil
|
||||
case <-a.Ctx.Done():
|
||||
return nil
|
||||
case <-ticker.C:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (*TailnetAPI) CoordinateTailnet(_ agentproto.DRPCAgent_CoordinateTailnetStream) error {
|
||||
// TODO: implement this
|
||||
return xerrors.New("CoordinateTailnet is unimplemented")
|
||||
}
|
||||
Reference in New Issue
Block a user