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
|
|
@ -2,36 +2,37 @@ package host
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"slices"
|
||||
"sync"
|
||||
|
||||
"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/host"
|
||||
"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
|
||||
config config.HostConfig
|
||||
|
||||
client *traefikClient
|
||||
gateway *TraefikGateway
|
||||
tasksGroup sync.WaitGroup
|
||||
|
||||
externalDomains []string // TODO: i don't like hardcoding external/internal logic here
|
||||
internalDomains []string
|
||||
}
|
||||
|
||||
func New(state *state.RuntimeState, config config.HostConfig) *Role {
|
||||
return &Role{
|
||||
client: newClient(config.Domain, config.LocalAddress),
|
||||
func New(state *app.State, config config.HostConfig) *Role {
|
||||
r := &Role{
|
||||
state: state,
|
||||
config: config,
|
||||
}
|
||||
|
||||
r.gateway = NewTraefikGateway(config, r)
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Role) sendUpdate(domains []string, role types.Role) {
|
||||
|
|
@ -45,7 +46,7 @@ func (r *Role) sendUpdate(domains []string, role types.Role) {
|
|||
r.tasksGroup.Go(func() {
|
||||
logger := log.With().Str("name", node.Hostname).Logger()
|
||||
logger.Debug().Msg("sending update")
|
||||
if _, err := client.Post[any](node.Endpoint, types.PathDnsCallback, state); err != nil {
|
||||
if _, err := r.state.Clients.DNS.Callback(node.Endpoint, state); err != nil {
|
||||
logger.Warn().Err(err).Msg("unable to send dns info")
|
||||
} else {
|
||||
logger.Debug().Msg("update sent")
|
||||
|
|
@ -54,7 +55,7 @@ func (r *Role) sendUpdate(domains []string, role types.Role) {
|
|||
}
|
||||
}
|
||||
|
||||
func (r *Role) mutateState(resp traefikResponse) {
|
||||
func (r *Role) OnTraefikUpdate(resp traefikResponse) {
|
||||
newInternal := resp.Domains(r.config.InternalEntrypoint)
|
||||
newExternal := resp.Domains(r.config.ExternalEntrypoint)
|
||||
|
||||
|
|
@ -71,20 +72,7 @@ func (r *Role) mutateState(resp traefikResponse) {
|
|||
}
|
||||
}
|
||||
|
||||
func (r *Role) onCallback(w http.ResponseWriter, req *http.Request) {
|
||||
var resp traefikResponse
|
||||
if err := json.NewDecoder(req.Body).Decode(&resp); err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
log.Err(err).Msg("unable to decode traefik callback data")
|
||||
return
|
||||
}
|
||||
|
||||
r.mutateState(resp)
|
||||
|
||||
w.Write([]byte("OK"))
|
||||
}
|
||||
|
||||
func (r *Role) getInternal() (types.HostState, error) {
|
||||
func (r *Role) Dns() (types.HostState, error) {
|
||||
return types.HostState{
|
||||
Domains: r.internalDomains,
|
||||
Address: r.config.IpAddress,
|
||||
|
|
@ -92,7 +80,7 @@ func (r *Role) getInternal() (types.HostState, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
func (r *Role) getExternal() (types.HostState, error) {
|
||||
func (r *Role) Nameserver() (types.HostState, error) {
|
||||
return types.HostState{
|
||||
Domains: r.externalDomains,
|
||||
Address: r.config.IpAddress,
|
||||
|
|
@ -101,14 +89,25 @@ func (r *Role) getExternal() (types.HostState, error) {
|
|||
|
||||
}
|
||||
|
||||
func (r *Role) RegisterHandlers(rg types.Registrator) {
|
||||
rg.RegisterRaw(http.MethodPost, types.PathHostCallback.String(), r.onCallback)
|
||||
rg.Register(types.GetEndpoint(types.PathHostDns, r.getInternal))
|
||||
rg.Register(types.GetEndpoint(types.PathHostNs, r.getExternal))
|
||||
func (r *Role) RegisterHandlers(rg transport.Registrator) {
|
||||
host.Register(rg, r)
|
||||
}
|
||||
|
||||
func (r *Role) OnStartup(ctx context.Context) error {
|
||||
resp, err := r.client.GetRawData()
|
||||
r.tasksGroup.Go(func() {
|
||||
if err := r.gateway.Listen(); err != nil {
|
||||
log.Err(err).Msg("traefik gateway stopped")
|
||||
}
|
||||
})
|
||||
|
||||
r.tasksGroup.Go(func() {
|
||||
<-ctx.Done()
|
||||
if err := r.gateway.Shutdown(context.Background()); err != nil {
|
||||
log.Err(err).Msg("failed to shutdown traefik gateway")
|
||||
}
|
||||
})
|
||||
|
||||
resp, err := r.gateway.GetRawData()
|
||||
if err != nil {
|
||||
return fmt.Errorf("get traefik state: %w", err)
|
||||
}
|
||||
|
|
@ -116,7 +115,7 @@ func (r *Role) OnStartup(ctx context.Context) error {
|
|||
log.Info().Msg("got raw data from traefik")
|
||||
log.Debug().Interface("response", resp).Send()
|
||||
|
||||
r.mutateState(*resp)
|
||||
r.OnTraefikUpdate(*resp)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue