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;
}