aboutsummaryrefslogtreecommitdiff
path: root/src/zencompute/httporchestrator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencompute/httporchestrator.cpp')
-rw-r--r--src/zencompute/httporchestrator.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/zencompute/httporchestrator.cpp b/src/zencompute/httporchestrator.cpp
new file mode 100644
index 000000000..39e7e60d7
--- /dev/null
+++ b/src/zencompute/httporchestrator.cpp
@@ -0,0 +1,81 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "zencompute/httporchestrator.h"
+
+#include <zencore/compactbinarybuilder.h>
+#include <zencore/logging.h>
+
+namespace zen::compute {
+
+HttpOrchestratorService::HttpOrchestratorService() : m_Log(logging::Get("orch"))
+{
+ m_Router.RegisterRoute(
+ "provision",
+ [this](HttpRouterRequest& Req) {
+ HttpServerRequest& HttpReq = Req.ServerRequest();
+
+ CbObjectWriter Cbo;
+ Cbo.BeginArray("workers");
+
+ m_KnownWorkersLock.WithSharedLock([&] {
+ for (const auto& [WorkerId, Worker] : m_KnownWorkers)
+ {
+ Cbo.BeginObject();
+ Cbo << "uri" << Worker.BaseUri;
+ Cbo << "dt" << Worker.LastSeen.GetElapsedTimeMs();
+ Cbo.EndObject();
+ }
+ });
+
+ Cbo.EndArray();
+
+ HttpReq.WriteResponse(HttpResponseCode::OK, Cbo.Save());
+ },
+ HttpVerb::kPost);
+
+ m_Router.RegisterRoute(
+ "announce",
+ [this](HttpRouterRequest& Req) {
+ HttpServerRequest& HttpReq = Req.ServerRequest();
+
+ CbObject Data = HttpReq.ReadPayloadObject();
+
+ std::string_view WorkerId = Data["id"].AsString("");
+ std::string_view WorkerUri = Data["uri"].AsString("");
+
+ if (WorkerId.empty() || WorkerUri.empty())
+ {
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
+ }
+
+ m_KnownWorkersLock.WithExclusiveLock([&] {
+ auto& Worker = m_KnownWorkers[std::string(WorkerId)];
+ Worker.BaseUri = WorkerUri;
+ Worker.LastSeen.Reset();
+ });
+
+ HttpReq.WriteResponse(HttpResponseCode::OK);
+ },
+ HttpVerb::kPost);
+}
+
+HttpOrchestratorService::~HttpOrchestratorService()
+{
+}
+
+const char*
+HttpOrchestratorService::BaseUri() const
+{
+ return "/orch/";
+}
+
+void
+HttpOrchestratorService::HandleRequest(HttpServerRequest& Request)
+{
+ if (m_Router.HandleRequest(Request) == false)
+ {
+ ZEN_WARN("No route found for {0}", Request.RelativeUri());
+ }
+}
+
+} // namespace zen::compute