dynamic HTTPMonitor::handleSingle()

in bistro/server/HTTPMonitor.cpp [103:178]


dynamic HTTPMonitor::handleSingle(const Config& c, const dynamic& d) {
  const auto& handler = d["handler"].asString();
  if (handler == "errors") {
    auto errors = monitor_->copyErrors();
    dynamic dObj = dynamic::object;
    for (const auto& key_and_error : errors) {
      dObj[key_and_error.first] = key_and_error.second;
    }
    return dObj;
  }
  if (handler == "refresh_time") {
    return dynamic(monitor_->getLastUpdateTime());
  }
  if (handler == "jobs") {
    return handleJobs(c, getRequestedJobs(c, d));
  }
  if (handler == "sorted_node_names") {
    return handleSortedNodeNames(c);
  }
  // TODO: deprecate this in favor of running_tasks
  if (handler == "job_node_runtime") {
    return handleTaskRuntime(d);
  }
  if (handler == "running_tasks") {
    return handleRunningTasks(d);
  }
  if (handler == "histogram") {
    return handleHistograms(
      c,
      getRequestedJobs(c, d),
      d.getDefault("num_samples", 0).asInt()
    );
  }
  if (handler == "task_logs") {
    return handleTaskLogs(c, d);
  }
  if (handler == "delete_job") {
    configLoader_->deleteJob(d["job_id"].asString());
    return "deleted";
  }
  if (handler == "save_job") {
    configLoader_->saveJob(d["job_id"].asString(), d["job"]);
    return "saved";
  }
  if (handler == "forgive_jobs") {
    if (auto* p = d.get_ptr("jobs")) {
      for (const auto& j : *p) {
        taskStatuses_->forgiveJob(j.asString());
      }
    }
    return "forgiven";
  }
  if (handler == "nodes") {
    return handleNodes(c, d);
  }
  if (handler == "kill_task") {
    // Ignore d["status_filter"], since that option is now deprecated.
    auto job = d["job_id"].asString();
    auto node = d["node_id"].asString();
    // Look up the job
    auto jit = c.jobs.find(job);
    if (jit == c.jobs.end()) {
      throw BistroException("Unknown job ", job);
    }
    // Look up the running task
    const Job::ID job_id(as_const(Job::JobNameTable)->lookup(job));
    const Node::ID node_id(as_const(Node::NodeNameTable)->lookup(node));
    auto maybe_rt = taskStatuses_->copyRunningTask(job_id, node_id);
    if (!maybe_rt.has_value()) {
      throw BistroException("Unknown running task ", job, ", ", node);
    }
    taskRunner_->killTask(*maybe_rt, jit->second->killRequest());
    return "signaled";
  }
  throw BistroException("Unknown handler: ", handler);
}