43 lines
1.5 KiB
C++
43 lines
1.5 KiB
C++
#include "services/ClusterService.h"
|
|
#include "ApiServer.h"
|
|
|
|
ClusterService::ClusterService(NodeContext& ctx) : ctx(ctx) {}
|
|
|
|
void ClusterService::registerEndpoints(ApiServer& api) {
|
|
api.addEndpoint("/api/cluster/members", HTTP_GET,
|
|
[this](AsyncWebServerRequest* request) { handleMembersRequest(request); },
|
|
std::vector<ParamSpec>{});
|
|
}
|
|
|
|
void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) {
|
|
JsonDocument doc;
|
|
JsonArray arr = doc["members"].to<JsonArray>();
|
|
|
|
for (const auto& pair : *ctx.memberList) {
|
|
const NodeInfo& node = pair.second;
|
|
JsonObject obj = arr.add<JsonObject>();
|
|
obj["hostname"] = node.hostname;
|
|
obj["ip"] = node.ip.toString();
|
|
obj["lastSeen"] = node.lastSeen;
|
|
obj["latency"] = node.latency;
|
|
obj["status"] = statusToStr(node.status);
|
|
obj["resources"]["freeHeap"] = node.resources.freeHeap;
|
|
obj["resources"]["chipId"] = node.resources.chipId;
|
|
obj["resources"]["sdkVersion"] = node.resources.sdkVersion;
|
|
obj["resources"]["cpuFreqMHz"] = node.resources.cpuFreqMHz;
|
|
obj["resources"]["flashChipSize"] = node.resources.flashChipSize;
|
|
|
|
// Add labels if present
|
|
if (!node.labels.empty()) {
|
|
JsonObject labelsObj = obj["labels"].to<JsonObject>();
|
|
for (const auto& kv : node.labels) {
|
|
labelsObj[kv.first.c_str()] = kv.second;
|
|
}
|
|
}
|
|
}
|
|
|
|
String json;
|
|
serializeJson(doc, json);
|
|
request->send(200, "application/json", json);
|
|
}
|