🎉 Initial commit of Ring

This commit is contained in:
2025-12-13 19:47:46 +08:00
parent 95005c0cff
commit aed5d53f9e
2 changed files with 100 additions and 9 deletions

View File

@@ -2,13 +2,13 @@ package main
import ( import (
"fmt" "fmt"
"hash/fnv"
"os" "os"
"os/signal" "os/signal"
"strconv" "strconv"
"strings" "strings"
"syscall" "syscall"
"git.solsynth.dev/goatworks/turbine/pkg/shared/hash"
"git.solsynth.dev/goatworks/turbine/pkg/shared/registrar" "git.solsynth.dev/goatworks/turbine/pkg/shared/registrar"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
@@ -17,12 +17,6 @@ import (
"github.com/spf13/viper" "github.com/spf13/viper"
) )
func hash(s string) uint32 {
h := fnv.New32a()
h.Write([]byte(s))
return h.Sum32()
}
func init() { func init() {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
} }
@@ -69,7 +63,7 @@ func main() {
} }
serviceName := "config" serviceName := "config"
instanceID := fmt.Sprint(hash(fmt.Sprintf("%s-%s-%d", serviceName, host, port)))[:8] instanceID := fmt.Sprint(hash.Hash(fmt.Sprintf("%s-%s-%d", serviceName, host, port)))[:8]
err = serviceReg.Register(serviceName, "http", instanceID, host, port, 30) err = serviceReg.Register(serviceName, "http", instanceID, host, port, 30)
if err != nil { if err != nil {
@@ -83,7 +77,7 @@ func main() {
}) })
// This is the main endpoint that serves the configuration as JSON. // This is the main endpoint that serves the configuration as JSON.
app.Get("/", func(c fiber.Ctx) error { app.Get("/api/", func(c fiber.Ctx) error {
log.Info().Msg("Serving shared configuration as JSON") log.Info().Msg("Serving shared configuration as JSON")
// Use a new Viper instance to read the shared config // Use a new Viper instance to read the shared config

97
pkg/ring/main.go Normal file
View File

@@ -0,0 +1,97 @@
package main
import (
"fmt"
"os"
"strconv"
"strings"
"git.solsynth.dev/goatworks/turbine/pkg/shared/hash"
"git.solsynth.dev/goatworks/turbine/pkg/shared/registrar"
"github.com/gofiber/fiber/v3"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
)
func init() {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
func main() {
log.Info().Msg("Starting Turbine Ring...")
viper.SetConfigName("settings")
viper.AddConfigPath(".")
viper.AddConfigPath("/etc/turbine/")
viper.SetConfigType("toml")
log.Info().Msg("Reading configuration...")
if err := viper.ReadInConfig(); err != nil {
log.Fatal().Err(err).Msg("Failed to read config file...")
}
log.Info().Msg("Configuration loaded.")
// --- Service Registration ---
etcdEndpoints := viper.GetStringSlice("etcd.endpoints")
if len(etcdEndpoints) == 0 {
log.Fatal().Msg("etcd.endpoints not configured")
}
if viper.GetBool("etcd.insecure") {
for i, ep := range etcdEndpoints {
if !strings.HasPrefix(ep, "http://") && !strings.HasPrefix(ep, "https://") {
etcdEndpoints[i] = "http://" + ep
}
}
}
serviceReg, err := registrar.NewServiceRegistrar(etcdEndpoints)
if err != nil {
log.Fatal().Err(err).Msg("Failed to create service registrar")
}
listenAddr := viper.GetString("listen")
host := viper.GetString("host")
if host == "" {
log.Fatal().Msg("host not configured")
}
portStr := strings.TrimPrefix(listenAddr, ":")
port, err := strconv.Atoi(portStr)
if err != nil {
log.Fatal().Err(err).Msg("Invalid listen address")
}
serviceName := "config"
instanceID := fmt.Sprint(hash.Hash(fmt.Sprintf("%s-%s-%d", serviceName, host, port)))[:8]
err = serviceReg.Register(serviceName, "http", instanceID, host, port, 30)
if err != nil {
log.Fatal().Err(err).Msg("Failed to register service")
}
log.Info().Str("service", serviceName).Str("instanceID", instanceID).Msg("Service registered successfully")
// --- Web Server ---
app := fiber.New(fiber.Config{
ServerHeader: "Turbine Ring",
})
// This is the main endpoint that serves the configuration as JSON.
app.Get("/", func(c fiber.Ctx) error {
log.Info().Msg("Serving shared configuration as JSON")
// Use a new Viper instance to read the shared config
v := viper.New()
v.SetConfigName("shared_config")
v.AddConfigPath(".") // Look in the current directory (pkg/config)
v.SetConfigType("toml")
if err := v.ReadInConfig(); err != nil {
log.Error().Err(err).Msg("Failed to read shared_config.toml")
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "could not load configuration",
})
}
return c.JSON(v.AllSettings())
})
}