|
|
@@ -5,7 +5,10 @@ import (
|
|
|
"log"
|
|
|
"net/http"
|
|
|
"os"
|
|
|
+ "os/signal"
|
|
|
"strconv"
|
|
|
+ "syscall"
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/go-chi/chi"
|
|
|
"github.com/go-chi/chi/middleware"
|
|
|
@@ -16,26 +19,83 @@ import (
|
|
|
var (
|
|
|
MaxWorkers = os.Getenv("MAX_WORKERS")
|
|
|
MaxQueue = os.Getenv("MAX_QUEUE")
|
|
|
+
|
|
|
+ jobQueue chan worker.Job
|
|
|
)
|
|
|
|
|
|
func main() {
|
|
|
- ctx, cancel := context.WithCancel(context.Background())
|
|
|
- defer cancel()
|
|
|
-
|
|
|
workerCount, err := strconv.Atoi(MaxWorkers)
|
|
|
if err != nil {
|
|
|
log.Default().Fatalln("invalid MAX_WORKERS value")
|
|
|
}
|
|
|
|
|
|
+ log.Default().Printf("setting max worker count to: %d\n", workerCount)
|
|
|
+
|
|
|
queueCount, err := strconv.Atoi(MaxQueue)
|
|
|
if err != nil {
|
|
|
log.Default().Fatalln("invalid MAX_QUEUE value")
|
|
|
}
|
|
|
|
|
|
- jobQueue := make(chan worker.Job, queueCount)
|
|
|
+ log.Default().Printf("setting max job queue count to: %d\n", queueCount)
|
|
|
|
|
|
+ jobQueue = make(chan worker.Job, queueCount)
|
|
|
d := worker.NewDispatcher(workerCount)
|
|
|
- d.Run(ctx, jobQueue)
|
|
|
+
|
|
|
+ log.Default().Println("starting worker dispatcher")
|
|
|
+
|
|
|
+ err = d.Run(jobQueue)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ log.Default().Fatalln(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ server := &http.Server{Addr: ":3000", Handler: httpService()}
|
|
|
+
|
|
|
+ serverCtx, serverStopCtx := context.WithCancel(context.Background())
|
|
|
+
|
|
|
+ sig := make(chan os.Signal, 1)
|
|
|
+ signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
|
|
|
+ go func() {
|
|
|
+ <-sig
|
|
|
+
|
|
|
+ log.Default().Println("shutting down server")
|
|
|
+
|
|
|
+ shutdownCtx, shutdownCtxCancel := context.WithTimeout(serverCtx, 30*time.Second)
|
|
|
+ defer shutdownCtxCancel()
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ <-shutdownCtx.Done()
|
|
|
+ if shutdownCtx.Err() == context.DeadlineExceeded {
|
|
|
+ log.Fatal("graceful shutdown timed out.. forcing exit.")
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ err = server.Shutdown(shutdownCtx)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Default().Println("server shutdown completed")
|
|
|
+
|
|
|
+ serverStopCtx()
|
|
|
+ }()
|
|
|
+
|
|
|
+ log.Default().Println("starting HTTP server at :3000")
|
|
|
+
|
|
|
+ err = server.ListenAndServe()
|
|
|
+ if err != nil && err != http.ErrServerClosed {
|
|
|
+ log.Default().Fatalf("error starting HTTP server: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Wait for server context to be stopped
|
|
|
+ <-serverCtx.Done()
|
|
|
+
|
|
|
+ d.Exit()
|
|
|
+}
|
|
|
+
|
|
|
+func httpService() http.Handler {
|
|
|
+ log.Default().Println("setting up HTTP router and adding middleware")
|
|
|
|
|
|
r := chi.NewRouter()
|
|
|
r.Use(middleware.Logger)
|
|
|
@@ -43,6 +103,8 @@ func main() {
|
|
|
r.Use(middleware.Heartbeat("/ping"))
|
|
|
r.Use(middleware.AllowContentType("application/json"))
|
|
|
|
|
|
+ log.Default().Println("setting up HTTP POST endpoint to enqueue jobs")
|
|
|
+
|
|
|
r.Post("/enqueue/{id}", func(w http.ResponseWriter, r *http.Request) {
|
|
|
job := getJob(chi.URLParam(r, "id"))
|
|
|
|
|
|
@@ -55,12 +117,12 @@ func main() {
|
|
|
w.WriteHeader(http.StatusCreated)
|
|
|
})
|
|
|
|
|
|
- http.ListenAndServe(":3000", r)
|
|
|
+ return r
|
|
|
}
|
|
|
|
|
|
func getJob(id string) worker.Job {
|
|
|
- if id == "helm-release-tracker" {
|
|
|
- return &jobs.HelmReleaseTracker{}
|
|
|
+ if id == "helm-revisions-count-tracker" {
|
|
|
+ return jobs.NewHelmRevisionsCountTracker(time.Now().UTC())
|
|
|
}
|
|
|
|
|
|
return nil
|