- Add edge runtime config and opsconsole package - Refactor edge console to use new runtime config - Add service source metadata support - Update CLI adapter with target terminology - Add edge operation contract and event bus replay - Update node label and command ops surface - Add E2E smoke tests and full validation - Update proto runtime definitions - Update documentation and agent-ops rules
84 lines
2 KiB
Go
84 lines
2 KiB
Go
package bootstrap
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
edgeevents "iop/apps/edge/internal/events"
|
|
edgenode "iop/apps/edge/internal/node"
|
|
edgeservice "iop/apps/edge/internal/service"
|
|
"iop/apps/edge/internal/transport"
|
|
"iop/packages/config"
|
|
"iop/packages/observability"
|
|
)
|
|
|
|
// Runtime is the shared edge runtime assembly used by both `serve` and
|
|
// `console` entrypoints. NewRuntime wires logger, registry, node store,
|
|
// event bus, service, and transport server; Start performs handler wiring
|
|
// and binds the server and metrics endpoint.
|
|
type Runtime struct {
|
|
Cfg *config.EdgeConfig
|
|
Logger *zap.Logger
|
|
Registry *edgenode.Registry
|
|
NodeStore *edgenode.NodeStore
|
|
EventBus *edgeevents.Bus
|
|
Service *edgeservice.Service
|
|
Server *transport.Server
|
|
}
|
|
|
|
func NewRuntime(cfg *config.EdgeConfig) (*Runtime, error) {
|
|
logger, err := observability.NewLogger(cfg.Logging.Level, cfg.Logging.Pretty)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
registry := edgenode.NewRegistry()
|
|
nodeStore, err := edgenode.LoadFromConfig(cfg.Nodes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("edge: seed node store: %w", err)
|
|
}
|
|
|
|
bus := edgeevents.NewBus()
|
|
svc := edgeservice.New(registry, bus)
|
|
|
|
server, err := transport.NewServer(cfg.Server.Listen, registry, nodeStore, logger)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Runtime{
|
|
Cfg: cfg,
|
|
Logger: logger,
|
|
Registry: registry,
|
|
NodeStore: nodeStore,
|
|
EventBus: bus,
|
|
Service: svc,
|
|
Server: server,
|
|
}, nil
|
|
}
|
|
|
|
func (r *Runtime) wireHandlers() {
|
|
r.Server.SetRunEventHandler(r.EventBus.PublishRun)
|
|
r.Server.SetNodeEventHandler(r.EventBus.PublishNode)
|
|
}
|
|
|
|
func (r *Runtime) Start(ctx context.Context) error {
|
|
r.wireHandlers()
|
|
if err := r.Server.Start(ctx); err != nil {
|
|
return err
|
|
}
|
|
go func() {
|
|
if err := observability.ServeMetrics(r.Cfg.Metrics.Port); err != nil {
|
|
r.Logger.Warn("metrics server exited", zap.Error(err))
|
|
}
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (r *Runtime) Stop() error {
|
|
err := r.Server.Stop()
|
|
_ = r.Logger.Sync()
|
|
return err
|
|
}
|