// Copyright Epic Games, Inc. All Rights Reserved. #include "zencompute/httporchestrator.h" #include #include 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