refactor: move http api to a new transport layer
This commit is contained in:
parent
476c4b056f
commit
0448f66ab2
41 changed files with 822 additions and 390 deletions
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue