1
0
Fork 0

refactor: move http api to a new transport layer

This commit is contained in:
Arthur K. 2026-01-23 09:56:01 +03:00
parent 476c4b056f
commit 0448f66ab2
Signed by: wzray
GPG key ID: B97F30FDC4636357
41 changed files with 822 additions and 390 deletions

View file

@ -7,26 +7,41 @@ import (
"sync"
"time"
"git.wzray.com/homelab/hivemind/internal/app"
"git.wzray.com/homelab/hivemind/internal/config"
"git.wzray.com/homelab/hivemind/internal/state"
"git.wzray.com/homelab/hivemind/internal/transport"
"git.wzray.com/homelab/hivemind/internal/transport/node"
"git.wzray.com/homelab/hivemind/internal/types"
"git.wzray.com/homelab/hivemind/internal/web/client"
"github.com/rs/zerolog/log"
)
type Role struct {
state *state.RuntimeState
state *app.State
keepaliveGroup sync.WaitGroup
config config.NodeConfig
}
func New(state *state.RuntimeState, config config.NodeConfig) *Role {
func New(state *app.State, config config.NodeConfig) *Role {
return &Role{
state: state,
config: config,
}
}
func (r *Role) OnStartup(ctx context.Context) error {
r.keepaliveGroup.Go(r.keepaliveFunc(ctx))
return nil
}
func (r *Role) OnShutdown() error {
r.keepaliveGroup.Wait()
return nil
}
func (n *Role) RegisterHandlers(r transport.Registrator) {
node.Register(r, n)
}
func (r *Role) Join(bootstrap string) error {
masters := make(map[string]struct{})
for _, node := range r.state.Registry.ByRole(types.MasterRole) {
@ -46,14 +61,14 @@ func (r *Role) Join(bootstrap string) error {
logger := log.With().Str("host", m).Logger()
logger.Debug().Msg("trying to join via master")
nodes, err := client.Post[map[string]types.Node](m, types.PathMasterJoin, r.state.Self)
nodes, err := r.state.Clients.Master.Join(m, r.state.Self)
if err != nil {
errs = append(errs, err)
logger.Debug().Err(err).Msg("unable to join")
continue
}
if err := r.state.Registry.Set(*nodes); err != nil {
if err := r.state.Registry.Set(nodes); err != nil {
logger.Debug().Err(err).Msg("unable to set master's nodes")
errs = append(errs, err)
continue
@ -76,8 +91,7 @@ func (r *Role) Leave() error {
logger := log.With().Str("name", m.Hostname).Logger()
logger.Debug().Msg("sending leave message")
_, err := client.Post[any](m.Endpoint, types.PathMasterLeave, r.state.Self)
if err != nil {
if err := r.state.Clients.Master.Leave(m.Endpoint, r.state.Self); err != nil {
logger.Debug().Err(err).Msg("unable to send leave message")
errs = append(errs, err)
continue
@ -90,14 +104,8 @@ func (r *Role) Leave() error {
return fmt.Errorf("unable to send leave message to any master: %w", errors.Join(errs...))
}
func (r *Role) OnStartup(ctx context.Context) error {
r.keepaliveGroup.Go(r.keepaliveFunc(ctx))
return nil
}
func (r *Role) OnShutdown() error {
r.keepaliveGroup.Wait()
return nil
func (r *Role) Healthcheck() (string, error) {
return "OK", nil
}
func (r *Role) keepaliveFunc(ctx context.Context) func() {
@ -106,7 +114,7 @@ func (r *Role) keepaliveFunc(ctx context.Context) func() {
logger := log.With().Str("name", m.Hostname).Logger()
logger.Debug().Msg("sending keepalive packet")
nodes, err := client.Post[map[string]types.Node](m.Endpoint, types.PathMasterKeepalive, r.state.Self)
nodes, err := r.state.Clients.Master.Heartbeat(m.Endpoint, r.state.Self)
if err != nil {
logger.Info().Err(err).Msg("unable to send keepalive packet")
continue
@ -114,7 +122,7 @@ func (r *Role) keepaliveFunc(ctx context.Context) func() {
logger.Debug().Msg("keepalive packet sent")
if err := r.state.Registry.Set(*nodes); err != nil {
if err := r.state.Registry.Set(nodes); err != nil {
logger.Warn().Err(err).Msg("unable to set masters nodes")
continue
}
@ -134,11 +142,3 @@ func (r *Role) keepaliveFunc(ctx context.Context) func() {
}
}
}
func healthcheck() (string, error) {
return "OK", nil
}
func (n *Role) RegisterHandlers(r types.Registrator) {
r.Register(types.GetEndpoint(types.PathNodeHealthcheck, healthcheck))
}