func (k *KubernetesScheduler) InstallDebugHandlers(mux *http.ServeMux) { wrappedHandler := func(uri string, h http.Handler) { mux.HandleFunc(uri, func(w http.ResponseWriter, r *http.Request) { ch := make(chan struct{}) closer := runtime.Closer(ch) proc.OnError(k.asMaster().Do(func() { defer closer() h.ServeHTTP(w, r) }), func(err error) { defer closer() log.Warningf("failed HTTP request for %s: %v", uri, err) w.WriteHeader(http.StatusServiceUnavailable) }, k.terminate) select { case <-time.After(k.schedcfg.HttpHandlerTimeout.Duration): log.Warningf("timed out waiting for request to be processed") w.WriteHeader(http.StatusServiceUnavailable) return case <-ch: // noop } }) } requestReconciliation := func(uri string, requestAction func()) { wrappedHandler(uri, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requestAction() w.WriteHeader(http.StatusNoContent) })) } requestReconciliation("/debug/actions/requestExplicit", k.reconciler.RequestExplicit) requestReconciliation("/debug/actions/requestImplicit", k.reconciler.RequestImplicit) wrappedHandler("/debug/actions/kamikaze", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slaves := k.slaves.getSlaveIds() for _, slaveId := range slaves { _, err := k.driver.SendFrameworkMessage( k.executor.ExecutorId, mutil.NewSlaveID(slaveId), messages.Kamikaze) if err != nil { log.Warningf("failed to send kamikaze message to slave %s: %v", slaveId, err) } else { io.WriteString(w, fmt.Sprintf("kamikaze slave %s\n", slaveId)) } } io.WriteString(w, "OK") })) }
func (k *framework) installDebugHandlers(mux *http.ServeMux) { wrappedHandler := func(uri string, h http.Handler) { mux.HandleFunc(uri, func(w http.ResponseWriter, r *http.Request) { ch := make(chan struct{}) closer := runtime.Closer(ch) proc.OnError(k.asMaster().Do(func() { defer closer() h.ServeHTTP(w, r) }), func(err error) { defer closer() log.Warningf("failed HTTP request for %s: %v", uri, err) w.WriteHeader(http.StatusServiceUnavailable) }, k.terminate) select { case <-time.After(k.schedulerConfig.HttpHandlerTimeout.Duration): log.Warningf("timed out waiting for request to be processed") w.WriteHeader(http.StatusServiceUnavailable) return case <-ch: // noop } }) } requestReconciliation := func(uri string, requestAction func()) { wrappedHandler(uri, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requestAction() w.WriteHeader(http.StatusNoContent) })) } requestReconciliation("/debug/actions/requestExplicit", k.tasksReconciler.RequestExplicit) requestReconciliation("/debug/actions/requestImplicit", k.tasksReconciler.RequestImplicit) wrappedHandler("/debug/actions/kamikaze", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { refs := k.executorRefs() for _, ref := range refs { _, err := k.driver.SendFrameworkMessage( ref.executorID, ref.slaveID, messages.Kamikaze, ) if err != nil { msg := fmt.Sprintf( "error sending kamikaze message to executor %q on slave %q: %v", ref.executorID.GetValue(), ref.slaveID.GetValue(), err, ) log.Warning(msg) fmt.Fprintln(w, msg) continue } io.WriteString(w, fmt.Sprintf( "kamikaze message sent to executor %q on slave %q\n", ref.executorID.GetValue(), ref.slaveID.GetValue(), )) } io.WriteString(w, "OK") })) }