Add WatchEvents, enable/disable/weight RPCs, and config check

gRPC / proto
- Rename WatchBackendEvents → WatchEvents; return a stream of Event
  oneof (LogEvent, BackendEvent, FrontendEvent) with optional filter
  flags (log, log_level, backend, frontend)
- Add EnableBackend, DisableBackend, SetFrontendPoolBackendWeight RPCs
- Rename PauseResumeRequest → BackendRequest
- Add CheckConfig RPC returning ok/parse_error/semantic_error

maglevd
- Route slog through a LogBroadcaster (slog.Handler) so WatchEvents
  subscribers can receive structured log records independently of the
  daemon's own --log-level
- Add --reflection flag (default true) to toggle gRPC server reflection
- Add --check flag: validates config file and exits 0/1/2
- SIGHUP: use config.Check before applying reload; log parse vs semantic
  error separately; refuse reload on any error
- Rename default config path /etc/maglev → /etc/vpp-maglev

maglevc
- Add 'watch events [num <n>] [log [level <level>]] [backend] [frontend]'
  command; prints compact protojson, stops on any keypress or Ctrl-C;
  uses cbreak mode (not raw) so output post-processing is preserved
- Add 'set backend <name> enable|disable'
- Add 'set frontend <name> pool <pool> backend <name> weight <0-100>'
- Add 'config check' command

Debian packaging
- Rename service unit to vpp-maglevd.service
- Rename conffiles to /etc/default/vpp-maglev and /etc/vpp-maglev/
- Create maglevd system user/group in postinst; add to vpp group if present
- Add postrm; add adduser to Depends
This commit is contained in:
2026-04-11 16:42:11 +02:00
parent d612086a5f
commit 58391f5463
26 changed files with 1969 additions and 400 deletions

View File

@@ -10,11 +10,15 @@ service Maglev {
rpc GetFrontend(GetFrontendRequest) returns (FrontendInfo);
rpc ListBackends(ListBackendsRequest) returns (ListBackendsResponse);
rpc GetBackend(GetBackendRequest) returns (BackendInfo);
rpc PauseBackend(PauseResumeRequest) returns (BackendInfo);
rpc ResumeBackend(PauseResumeRequest) returns (BackendInfo);
rpc PauseBackend(BackendRequest) returns (BackendInfo);
rpc ResumeBackend(BackendRequest) returns (BackendInfo);
rpc EnableBackend(BackendRequest) returns (BackendInfo);
rpc DisableBackend(BackendRequest) returns (BackendInfo);
rpc ListHealthChecks(ListHealthChecksRequest) returns (ListHealthChecksResponse);
rpc GetHealthCheck(GetHealthCheckRequest) returns (HealthCheckInfo);
rpc WatchBackendEvents(WatchRequest) returns (stream BackendEvent);
rpc SetFrontendPoolBackendWeight(SetWeightRequest) returns (FrontendInfo);
rpc WatchEvents(WatchRequest) returns (stream Event);
rpc CheckConfig(CheckConfigRequest) returns (CheckConfigResponse);
}
// ---- requests ---------------------------------------------------------------
@@ -31,7 +35,7 @@ message GetBackendRequest {
string name = 1;
}
message PauseResumeRequest {
message BackendRequest {
string name = 1;
}
@@ -41,7 +45,29 @@ message GetHealthCheckRequest {
string name = 1;
}
message WatchRequest {}
message CheckConfigRequest {}
message CheckConfigResponse {
bool ok = 1;
string parse_error = 2; // set when YAML cannot be read or parsed
string semantic_error = 3; // set when YAML is valid but semantically incorrect
}
message SetWeightRequest {
string frontend = 1;
string pool = 2;
string backend = 3;
int32 weight = 4; // 0-100
}
// WatchRequest controls which event types are streamed. All fields default to
// true (i.e. an empty request subscribes to everything at info level).
message WatchRequest {
optional bool log = 1; // include log events (default: true)
string log_level = 2; // minimum log level: debug|info|warn|error (default: info)
optional bool backend = 3; // include backend transition events (default: true)
optional bool frontend = 4; // include frontend events (default: true)
}
// ---- responses --------------------------------------------------------------
@@ -123,7 +149,36 @@ message TransitionRecord {
int64 at_unix_ns = 3;
}
// ---- event stream -----------------------------------------------------------
// LogAttr is a single key/value attribute from a structured log record.
message LogAttr {
string key = 1;
string value = 2;
}
// LogEvent carries a single structured log record.
message LogEvent {
int64 at_unix_ns = 1;
string level = 2;
string msg = 3;
repeated LogAttr attrs = 4;
}
// BackendEvent is emitted on every backend state transition.
message BackendEvent {
string backend_name = 1;
TransitionRecord transition = 2;
}
// FrontendEvent is reserved for future frontend-level events.
message FrontendEvent {}
// Event is the envelope returned by WatchEvents.
message Event {
oneof event {
LogEvent log = 1;
BackendEvent backend = 2;
FrontendEvent frontend = 3;
}
}