Skip to content

Commit

Permalink
feat: implement new status rpc on daemon
Browse files Browse the repository at this point in the history
  • Loading branch information
tinyzimmer committed Nov 7, 2023
1 parent 3a5b6f3 commit 58d58f2
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 15 deletions.
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ require (
github.com/spf13/cobra v1.7.0
github.com/spf13/pflag v1.0.5
github.com/vishvananda/netlink v1.2.1-beta.2
github.com/webmeshproj/api v0.10.9
github.com/webmeshproj/api v0.11.1
golang.org/x/crypto v0.14.0
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
golang.org/x/net v0.17.0
Expand All @@ -63,7 +63,7 @@ require (
)

require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231106192134-1baebb0a1518.2 // indirect
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
Expand Down Expand Up @@ -206,7 +206,7 @@ require (
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
gonum.org/v1/gonum v0.14.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
lukechampine.com/blake3 v1.2.1 // indirect
nhooyr.io/websocket v1.8.10 // indirect
)
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2 h1:m8rKyv88R8ZIR1549RMXckZ4FZJGxrq/7aRYl6U3WHc=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231106192134-1baebb0a1518.2 h1:iRWpWLm1nrsCHBVhibqPJQB3iIf3FRsAXioJVU8m6w0=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231106192134-1baebb0a1518.2/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
Expand Down Expand Up @@ -1572,8 +1572,8 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/webmeshproj/api v0.10.9 h1:timeGSKyRULX3WhW7a//MdG0CtDGZN6AcP00GqfSrQI=
github.com/webmeshproj/api v0.10.9/go.mod h1:St5+xO5NSaqVcTDMk9x8bl+WA5yWX3uuPwao3rofrDw=
github.com/webmeshproj/api v0.11.1 h1:n9nQ/RwfaK0ujx65B8O/dm7bPFKvX7+xPRuk/I890BQ=
github.com/webmeshproj/api v0.11.1/go.mod h1:xuYk93HM4aZWWlTh96Z2nIg1YhqcRG36nOfcifzHeM4=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
Expand Down Expand Up @@ -2331,8 +2331,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
Expand Down
21 changes: 21 additions & 0 deletions pkg/cmd/daemoncmd/connmgr.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"fmt"
"log/slog"
"net/netip"
"os"
"path/filepath"
"runtime"
"sync"
Expand Down Expand Up @@ -121,6 +122,26 @@ func (m *ConnManager) DataDir(connID string) string {
return filepath.Join(m.conf.Persistence.Path, connID)
}

// StoredConns returns all connection IDs known to the persistence layer.
func (m *ConnManager) StoredConns() ([]string, error) {
if m.conf.Persistence.Path == "" {
return nil, nil
}
m.mu.RLock()
defer m.mu.RUnlock()
contents, err := os.ReadDir(m.conf.Persistence.Path)
if err != nil {
return nil, fmt.Errorf("read dir: %w", err)
}
var ids []string
for _, entry := range contents {
if entry.IsDir() {
ids = append(ids, entry.Name())
}
}
return ids, nil
}

// NewConn creates a new connection for the given request. Start must be called
// opn the returned node to start the connection.
func (m *ConnManager) NewConn(ctx context.Context, req *v1.ConnectRequest) (id string, node embed.Node, err error) {
Expand Down
60 changes: 54 additions & 6 deletions pkg/cmd/daemoncmd/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,25 @@ import (
"fmt"
"log/slog"
"os"
"runtime"
"time"

"github.com/bufbuild/protovalidate-go"
v1 "github.com/webmeshproj/api/go/v1"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"

"github.com/webmeshproj/webmesh/pkg/context"
"github.com/webmeshproj/webmesh/pkg/storage/rpcsrv"
"github.com/webmeshproj/webmesh/pkg/version"
)

// AppDaemon is the app daemon RPC server.
type AppDaemon struct {
v1.UnimplementedAppDaemonServer
started time.Time
version version.BuildInfo
connmgr *ConnManager
validator *protovalidate.Validator
log *slog.Logger
Expand All @@ -49,12 +55,54 @@ func NewServer(conf Config) (*AppDaemon, error) {
return nil, fmt.Errorf("failed to create connection manager: %w", err)
}
return &AppDaemon{
started: time.Now(),
version: version.GetBuildInfo(),
connmgr: connmgr,
validator: v,
log: conf.NewLogger().With("appdaemon", "server"),
}, nil
}

func (app *AppDaemon) Status(ctx context.Context, _ *v1.StatusRequest) (*v1.DaemonStatus, error) {
return &v1.DaemonStatus{
NodeID: app.connmgr.nodeID.String(),
Description: fmt.Sprintf("Webmesh App Daemon (%s)", runtime.Version()),
Version: app.version.Version,
GitCommit: app.version.GitCommit,
BuildDate: app.version.BuildDate,
Uptime: time.Since(app.started).String(),
StartedAt: timestamppb.New(app.started),
Connections: func() map[string]v1.DaemonConnStatus {
out := make(map[string]v1.DaemonConnStatus)
for _, connid := range app.connmgr.ConnIDs() {
id := connid
c, ok := app.connmgr.Get(id)
if !ok {
// Disconnect was called on a connection before we got here.
continue
}
if c.MeshNode().Started() {
out[id] = v1.DaemonConnStatus_CONNECTED
} else {
out[id] = v1.DaemonConnStatus_CONNECTING
}
}
storedConns, err := app.connmgr.StoredConns()
if err != nil {
app.log.Error("Error getting stored connections", "error", err.Error())
return out
}
for _, connid := range storedConns {
id := connid
if _, ok := out[id]; !ok {
out[id] = v1.DaemonConnStatus_DISCONNECTED
}
}
return out
}(),
}, nil
}

func (app *AppDaemon) Connect(ctx context.Context, req *v1.ConnectRequest) (*v1.ConnectResponse, error) {
err := app.validator.Validate(req)
if err != nil {
Expand Down Expand Up @@ -130,7 +178,7 @@ func (app *AppDaemon) Metrics(ctx context.Context, req *v1.MetricsRequest) (*v1.
return res, nil
}

func (app *AppDaemon) Status(ctx context.Context, req *v1.StatusRequest) (*v1.StatusResponse, error) {
func (app *AppDaemon) ConnectionStatus(ctx context.Context, req *v1.ConnectionStatusRequest) (*v1.ConnectionStatusResponse, error) {
err := app.validator.Validate(req)
if err != nil {
return nil, newInvalidError(err)
Expand All @@ -139,7 +187,7 @@ func (app *AppDaemon) Status(ctx context.Context, req *v1.StatusRequest) (*v1.St
if len(ids) == 0 {
ids = app.connmgr.ConnIDs()
}
res := &v1.StatusResponse{
res := &v1.ConnectionStatusResponse{
Statuses: make(map[string]*v1.ConnectionStatus),
}
for _, connid := range ids {
Expand All @@ -149,15 +197,15 @@ func (app *AppDaemon) Status(ctx context.Context, req *v1.StatusRequest) (*v1.St
if !ok {
app.log.Info("Status requested for unknown connection", "id", id)
res.Statuses[id] = &v1.ConnectionStatus{
ConnectionStatus: v1.ConnectionStatus_DISCONNECTED,
ConnectionStatus: v1.DaemonConnStatus_DISCONNECTED,
}
} else {
res.Statuses[id] = &v1.ConnectionStatus{
ConnectionStatus: func() v1.ConnectionStatus_Status {
ConnectionStatus: func() v1.DaemonConnStatus {
if c.MeshNode().Started() {
return v1.ConnectionStatus_CONNECTED
return v1.DaemonConnStatus_CONNECTED
}
return v1.ConnectionStatus_CONNECTING
return v1.DaemonConnStatus_CONNECTING
}(),
Node: func() *v1.MeshNode {
if !c.MeshNode().Started() {
Expand Down

0 comments on commit 58d58f2

Please sign in to comment.