From e5951f84a909396a8baad6e582b3b51406865dfb Mon Sep 17 00:00:00 2001 From: Daniel Oliveira Date: Tue, 19 Jan 2021 19:37:34 +0100 Subject: [PATCH] Add Agones Healthcheck and Ready state --- cmd/q3/app/server/server.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/cmd/q3/app/server/server.go b/cmd/q3/app/server/server.go index 4250943..93437c9 100644 --- a/cmd/q3/app/server/server.go +++ b/cmd/q3/app/server/server.go @@ -3,6 +3,7 @@ package server import ( "context" "fmt" + "log" "net/url" "time" @@ -14,6 +15,8 @@ import ( quakeserver "github.com/criticalstack/quake-kube/internal/quake/server" httputil "github.com/criticalstack/quake-kube/internal/util/net/http" "github.com/criticalstack/quake-kube/public" + + sdk "agones.dev/agones/sdks/go" ) var opts struct { @@ -24,6 +27,7 @@ var opts struct { AssetsDir string ConfigFile string WatchInterval time.Duration + WithAgones bool } func NewCommand() *cobra.Command { @@ -52,6 +56,37 @@ func NewCommand() *cobra.Command { return err } + if opts.WithAgones { + log.Println("starting Agones SDK client") + s, err := sdk.NewSDK() + if err != nil { + return errors.Wrap(err, "Agones SDK could not be initialized") + } + + if err := s.Ready(); err != nil { + log.Println("failed to make the server Ready") + } + + go func() { + tick := time.Tick(2 * time.Second) + maxAttempts := 0 + for { + if err := s.Health(); err != nil { + if maxAttempts > 5 { + log.Fatalf("Could not send health ping: %v", err) + } + maxAttempts++ + } + select { + case <-ctx.Done(): + log.Print("Stopped health pings") + return + case <-tick: + } + } + }() + } + go func() { s := quakeserver.Server{ Dir: opts.AssetsDir, @@ -88,5 +123,6 @@ func NewCommand() *cobra.Command { cmd.Flags().StringVar(&opts.ClientAddr, "client-addr", "0.0.0.0:8080", "client address :") cmd.Flags().StringVar(&opts.ServerAddr, "server-addr", "0.0.0.0:27960", "dedicated server :") cmd.Flags().DurationVar(&opts.WatchInterval, "watch-interval", 15*time.Second, "dedicated server :") + cmd.Flags().BoolVar(&opts.WithAgones, "with-agones", false, "use Agones SDK integration") return cmd }