From 58706954653ecce92325fadba3483b744878dbc9 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 21 Aug 2025 17:39:43 +0200 Subject: [PATCH] chore: rename ClusterContext to NodeContext --- README.md | 22 ++++++++++++++++---- src/ClusterManager.cpp | 2 +- src/ClusterManager.h | 6 +++--- src/NetworkManager.cpp | 2 +- src/NetworkManager.h | 6 +++--- src/{ClusterContext.cpp => NodeContext..cpp} | 10 ++++----- src/{ClusterContext.h => NodeContext.h} | 6 +++--- src/RestApiServer.cpp | 2 +- src/RestApiServer.h | 6 +++--- src/main.cpp | 4 ++-- 10 files changed, 40 insertions(+), 26 deletions(-) rename src/{ClusterContext.cpp => NodeContext..cpp} (54%) rename src/{ClusterContext.h => NodeContext.h} (89%) diff --git a/README.md b/README.md index ddb77fa..c0653b5 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,28 @@ SProcket ORchestration Engine - ESP8266 -## Configuration +## Architecture + +### Auto Discovery + +A node periodically executes 2 tasks responsible for auto discovers: + +- send discovery: send UDP packet on broadcast address to discover nodes +- listen for discovery: receive UDP packets and send response back to the node who initiated discovery + +Discovered nodes are added to the so cluster memberlist. +Another periodic task will then call the `/api/node/status` endpoint over HTTP on each node in the memberlist to get detailed informations about the node (e.g. freeHeap, available API endpoints). + +## Develop + +### Configuration Choose one of your nodes as the API node to interact with the cluster and configure it in `.env`: ```sh export API_NODE=10.0.1.x ``` -## Build +### Build Build the firmware: @@ -29,14 +43,14 @@ Build the firmware: ./ctl.sh build ``` -## Flash +### Flash Flash firmware to a connected device: ```sh ./ctl.sh flash ``` -## OTA +### OTA Update one nodes: diff --git a/src/ClusterManager.cpp b/src/ClusterManager.cpp index e87bda5..08b3653 100644 --- a/src/ClusterManager.cpp +++ b/src/ClusterManager.cpp @@ -1,6 +1,6 @@ #include "ClusterManager.h" -ClusterManager::ClusterManager(ClusterContext& ctx) : ctx(ctx) { +ClusterManager::ClusterManager(NodeContext& ctx) : ctx(ctx) { // Register callback for node_discovered event ctx.registerEvent("node_discovered", [this](void* data) { NodeInfo* node = static_cast(data); diff --git a/src/ClusterManager.h b/src/ClusterManager.h index 54c0b1d..1703083 100644 --- a/src/ClusterManager.h +++ b/src/ClusterManager.h @@ -1,6 +1,6 @@ #pragma once #include "Globals.h" -#include "ClusterContext.h" +#include "NodeContext.h" #include "NodeInfo.h" #include #include @@ -9,7 +9,7 @@ class ClusterManager { public: - ClusterManager(ClusterContext& ctx); + ClusterManager(NodeContext& ctx); void sendDiscovery(); void listenForDiscovery(); void addOrUpdateNode(const String& nodeHost, IPAddress nodeIP); @@ -22,5 +22,5 @@ public: void heartbeatTaskCallback(); void updateAllMembersInfoTaskCallback(); private: - ClusterContext& ctx; + NodeContext& ctx; }; diff --git a/src/NetworkManager.cpp b/src/NetworkManager.cpp index b7932c7..8800f6b 100644 --- a/src/NetworkManager.cpp +++ b/src/NetworkManager.cpp @@ -3,7 +3,7 @@ const char* STA_SSID = "shroud"; const char* STA_PASS = "th3r31sn0sp00n"; -NetworkManager::NetworkManager(ClusterContext& ctx) : ctx(ctx) {} +NetworkManager::NetworkManager(NodeContext& ctx) : ctx(ctx) {} void NetworkManager::setHostnameFromMac() { uint8_t mac[6]; diff --git a/src/NetworkManager.h b/src/NetworkManager.h index aaef026..9a98672 100644 --- a/src/NetworkManager.h +++ b/src/NetworkManager.h @@ -1,12 +1,12 @@ #pragma once -#include "ClusterContext.h" +#include "NodeContext.h" #include class NetworkManager { public: - NetworkManager(ClusterContext& ctx); + NetworkManager(NodeContext& ctx); void setupWiFi(); void setHostnameFromMac(); private: - ClusterContext& ctx; + NodeContext& ctx; }; diff --git a/src/ClusterContext.cpp b/src/NodeContext..cpp similarity index 54% rename from src/ClusterContext.cpp rename to src/NodeContext..cpp index b95c7dc..5f54d84 100644 --- a/src/ClusterContext.cpp +++ b/src/NodeContext..cpp @@ -1,23 +1,23 @@ -#include "ClusterContext.h" +#include "NodeContext.h" -ClusterContext::ClusterContext() { +NodeContext::NodeContext() { scheduler = new Scheduler(); udp = new WiFiUDP(); memberList = new std::vector(); hostname = ""; } -ClusterContext::~ClusterContext() { +NodeContext::~NodeContext() { delete scheduler; delete udp; delete memberList; } -void ClusterContext::registerEvent(const std::string& event, EventCallback cb) { +void NodeContext::registerEvent(const std::string& event, EventCallback cb) { eventRegistry[event].push_back(cb); } -void ClusterContext::triggerEvent(const std::string& event, void* data) { +void NodeContext::triggerEvent(const std::string& event, void* data) { for (auto& cb : eventRegistry[event]) { cb(data); } diff --git a/src/ClusterContext.h b/src/NodeContext.h similarity index 89% rename from src/ClusterContext.h rename to src/NodeContext.h index e5f3cd2..3b8b579 100644 --- a/src/ClusterContext.h +++ b/src/NodeContext.h @@ -7,10 +7,10 @@ #include #include -class ClusterContext { +class NodeContext { public: - ClusterContext(); - ~ClusterContext(); + NodeContext(); + ~NodeContext(); Scheduler* scheduler; WiFiUDP* udp; String hostname; diff --git a/src/RestApiServer.cpp b/src/RestApiServer.cpp index 3470622..156ead2 100644 --- a/src/RestApiServer.cpp +++ b/src/RestApiServer.cpp @@ -1,6 +1,6 @@ #include "RestApiServer.h" -RestApiServer::RestApiServer(ClusterContext& ctx, uint16_t port) : server(port), ctx(ctx) {} +RestApiServer::RestApiServer(NodeContext& ctx, uint16_t port) : server(port), ctx(ctx) {} void RestApiServer::addEndpoint(const String& uri, int method, std::function requestHandler) { serviceRegistry.push_back(std::make_tuple(uri, method)); diff --git a/src/RestApiServer.h b/src/RestApiServer.h index a554a9f..1058ef2 100644 --- a/src/RestApiServer.h +++ b/src/RestApiServer.h @@ -7,7 +7,7 @@ #include #include -#include "ClusterContext.h" +#include "NodeContext.h" #include "NodeInfo.h" #define DEBUG_UPDATER 1 @@ -17,14 +17,14 @@ using namespace std::placeholders; class RestApiServer { public: - RestApiServer(ClusterContext& ctx, uint16_t port = 80); + RestApiServer(NodeContext& ctx, uint16_t port = 80); void begin(); void addEndpoint(const String& uri, int method, std::function requestHandler); void addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler); private: AsyncWebServer server; - ClusterContext& ctx; + NodeContext& ctx; std::vector> serviceRegistry; void getClusterMembersJson(AsyncWebServerRequest *request); void methodToStr(const std::tuple &endpoint, ArduinoJson::V742PB22::JsonObject &apiObj); diff --git a/src/main.cpp b/src/main.cpp index c6e5b16..04454bc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,11 @@ #include #include "Globals.h" -#include "ClusterContext.h" +#include "NodeContext.h" #include "NetworkManager.h" #include "ClusterManager.h" #include "RestApiServer.h" -ClusterContext ctx; +NodeContext ctx; NetworkManager network(ctx); ClusterManager cluster(ctx); RestApiServer apiServer(ctx);