add consul task
[arvados.git] / services / boot / server.go
index 3a9825ca32b60b996d4094ddc9e9bbdcd3591dcc..f9aad5727a5baac67e0598f954a31bda6ace7c24 100644 (file)
@@ -5,17 +5,38 @@ import (
        "flag"
        "log"
        "net/http"
+       "os"
+       "strconv"
        "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/config"
 )
 
+const defaultCfgPath = "/etc/arvados/boot/boot.yml"
+
+var cfg Config
+
 func main() {
-       listen := flag.String("listen", ":80", "addr:port or :port to listen on")
+       cfgPath := flag.String("config", defaultCfgPath, "`path` to config file")
        flag.Parse()
+
+       if err := config.LoadFile(&cfg, *cfgPath); os.IsNotExist(err) && *cfgPath == defaultCfgPath {
+               log.Printf("WARNING: No config file specified or found, starting fresh!")
+       } else if err != nil {
+               log.Fatal(err)
+       }
+       cfg.SetDefaults()
+       go func() {
+               log.Printf("starting server at %s", cfg.WebListen)
+               log.Fatal(http.ListenAndServe(cfg.WebListen, stack(logger, apiOrAssets)))
+       }()
        go func() {
-               log.Printf("starting server at %s", *listen)
-               log.Fatal(http.ListenAndServe(*listen, stack(logger, apiOrAssets)))
+               ticker := time.NewTicker(5 * time.Second)
+               for {
+                       runTasks(&cfg, ctlTasks)
+                       <-ticker.C
+               }
        }()
-       go runTasks(ctlTasks)
        <-(chan struct{})(nil)
 }
 
@@ -63,6 +84,20 @@ func apiRoutes(http.Handler) http.Handler {
        mux.HandleFunc("/api/ping", func(w http.ResponseWriter, r *http.Request) {
                json.NewEncoder(w).Encode(map[string]interface{}{"time": time.Now().UTC()})
        })
+       mux.HandleFunc("/api/tasks/ctl", func(w http.ResponseWriter, r *http.Request) {
+               timeout := time.Minute
+               if v, err := strconv.ParseInt(r.FormValue("timeout"), 10, 64); err == nil {
+                       timeout = time.Duration(v) * time.Second
+               }
+               if v, err := strconv.ParseInt(r.FormValue("newerThan"), 10, 64); err == nil {
+                       TaskState.Wait(version(v), timeout, r.Context())
+               }
+               rep, v := report(ctlTasks)
+               json.NewEncoder(w).Encode(map[string]interface{}{
+                       "Version": v,
+                       "Tasks":   rep,
+               })
+       })
        mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                w.WriteHeader(http.StatusNotFound)
                json.NewEncoder(w).Encode(map[string]string{"error": "not found"})