dynamic HTTPMonitor::handleNodes()

in bistro/server/HTTPMonitor.cpp [315:374]


dynamic HTTPMonitor::handleNodes(const Config& c, const dynamic& request) {
  dynamic responses = dynamic::object("results", dynamic::object());

  bool no_node_filter =
    request.getDefault("nodes", dynamic::array()).empty();
  std::unordered_set<folly::fbstring> do_this_node;
  if (!no_node_filter) {
    for (auto name : request["nodes"]) {
      do_this_node.insert(name.asString());
    }
  }

  bool field_disabled = true, field_resources = true;
  if (!request.getDefault("fields", dynamic::array()).empty()) {
    field_disabled = field_resources = false;
    for (const auto& field : request["fields"]) {
      const auto& fieldName = field.asString();
      if (fieldName == "resources") {
        field_resources = true;
      } else if (fieldName == "disabled") {
        field_disabled = true;
      } else {
        throw BistroException("Unknown field name: ", fieldName);
      }
    }
  }

  // Iterate over all nodes instead of accessing only those requested.
  auto& results = responses["results"];
  for (const auto& node : *(nodesLoader_->getDataOrThrow())) {
    const auto& node_name = node->name();
    if (no_node_filter || do_this_node.count(node_name) > 0) {
      // Add level to response if it isn't there yet.
      const int level = node->level();
      auto levelString = c.levels.lookup(level);
      auto& d_level = results.setDefault(levelString);
      auto& res = (d_level[node_name] = dynamic::object);

      if (field_resources) {
        auto& resources = (res["resources"] = dynamic::object);
        for (auto r_id : c.levelIDToResourceID[level]) {
          const auto& r_name = c.resourceNames.lookup(r_id);
          auto& resource = (resources[r_name] = dynamic::object
            ("default", c.defaultJobResources[r_id])
            ("limit", c.resourcesByLevel[level][r_id])
          );
          const auto weight = c.resourceIDToWeight[r_id];
          if (weight > 0) {
            resource["weight"] = weight;
          }
        }
      }

      if (field_disabled && !node->enabled()) {
        res["disabled"] = true;
      }
    }
  }
  return responses;
}