NRP Core  1.4.1
engine_json_registration_server.h
Go to the documentation of this file.
1 /* * NRP Core - Backend infrastructure to synchronize simulations
2  *
3  * Copyright 2020-2023 NRP Team
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * This project has received funding from the European Union’s Horizon 2020
18  * Framework Programme for Research and Innovation under the Specific Grant
19  * Agreement No. 945539 (Human Brain Project SGA3).
20  */
21 
22 #ifndef ENGINE_JSON_REGISTRATION_SERVER_H
23 #define ENGINE_JSON_REGISTRATION_SERVER_H
24 
25 #include <pistache/router.h>
26 #include <pistache/endpoint.h>
27 
29 
34 {
38  struct RequestHandler : Pistache::Http::Handler
39  {
40  HTTP_PROTOTYPE(RequestHandler);
41 
42  RequestHandler(EngineJSONRegistrationServer *pServer);
43  ~RequestHandler() override;
44 
45  void onRequest(const Pistache::Http::Request& req, Pistache::Http::ResponseWriter response) override;
46 
47  private:
48  EngineJSONRegistrationServer *_pServer = nullptr;
49  };
50 
51  using engine_name_t = decltype(DataPackIdentifier::EngineName);
52 
53  public:
57  static constexpr std::string_view JSONEngineName = "engine_name";
58 
62  static constexpr std::string_view JSONAddress = "address";
63 
69 
75  static EngineJSONRegistrationServer *resetInstance(const std::string &serverAddress);
76 
80  static void clearInstance();
81 
97  static std::string tryInstantiate(const std::string & initialAddress, const unsigned numRetries);
98 
99  // Delete copy and move operations for singleton
102 
105 
107 
111  void startServerAsync();
112 
116  void shutdownServer();
117 
121  const std::string serverAddress() const;
122 
126  bool isRunning() const;
127 
131  size_t getNumWaitingEngines();
132 
138  std::string retrieveEngineAddress(const engine_name_t &engineName);
139 
145  std::string requestEngine(const engine_name_t &engineName);
146 
152  void registerEngineAddress(const engine_name_t &engineName, const std::string &address);
153 
163  static bool sendClientEngineRequest(const std::string &address, const engine_name_t &engineName, const std::string &engineAddress, const unsigned int numTries = 1, const unsigned int waitTime = 0);
164 
165  private:
169  bool _serverRunning = false;
170 
174  std::string _address;
175 
179  Pistache::Http::Endpoint _endpoint;
180 
184  std::mutex _lock;
185 
189  std::map<decltype(DataPackIdentifier::EngineName), std::string> _registeredAddresses;
190 
194  static std::unique_ptr<EngineJSONRegistrationServer> _instance;
195 
200  EngineJSONRegistrationServer(const std::string &address);
201 
203 };
204 
205 #endif // ENGINE_JSON_REGISTRATION_SERVER_H
EngineJSONRegistrationServer::serverAddress
const std::string serverAddress() const
Get server address.
Definition: engine_json_registration_server.cpp:168
EngineJSONRegistrationServer::JSONEngineName
static constexpr std::string_view JSONEngineName
JSON Engine Name locator used during registration.
Definition: engine_json_registration_server.h:57
EngineJSONRegistrationServer::~EngineJSONRegistrationServer
~EngineJSONRegistrationServer()
Definition: engine_json_registration_server.cpp:139
EngineJSONRegistrationServer::tryInstantiate
static std::string tryInstantiate(const std::string &initialAddress, const unsigned numRetries)
Attempts to instantiate and start the registration server.
Definition: engine_json_registration_server.cpp:81
datapack_interface.h
EngineJSONRegistrationServer::clearInstance
static void clearInstance()
Delete Instance.
Definition: engine_json_registration_server.cpp:74
EngineJSONRegistrationServer::getInstance
static EngineJSONRegistrationServer * getInstance()
Get Instance of EngineJSONRegistrationServer.
Definition: engine_json_registration_server.cpp:61
EngineJSONRegistrationServer::shutdownServer
void shutdownServer()
Stop the Server.
Definition: engine_json_registration_server.cpp:157
EngineJSONRegistrationServer::sendClientEngineRequest
static bool sendClientEngineRequest(const std::string &address, const engine_name_t &engineName, const std::string &engineAddress, const unsigned int numTries=1, const unsigned int waitTime=0)
Send Engine Name and address to specified address.
Definition: engine_json_registration_server.cpp:225
EngineJSONRegistrationServer::JSONAddress
static constexpr std::string_view JSONAddress
JSON Engine Address locator used during registration.
Definition: engine_json_registration_server.h:62
EngineJSONRegistrationServer
Singleton. Creates an HTTP REST server to register newly created EngineJSONServers and store their ad...
Definition: engine_json_registration_server.h:33
EngineJSONRegistrationServer::getNumWaitingEngines
size_t getNumWaitingEngines()
Get the number of engines that are still waiting for registration.
Definition: engine_json_registration_server.cpp:178
EngineJSONRegistrationServer::startServerAsync
void startServerAsync()
Start the server if it's not already running.
Definition: engine_json_registration_server.cpp:146
EngineJSONRegistrationServer::resetInstance
static EngineJSONRegistrationServer * resetInstance(const std::string &serverAddress)
Reset EngineJSONRegistrationServer with the given address.
Definition: engine_json_registration_server.cpp:66
EngineJSONRegistrationServer::RequestHandler
friend struct EngineJSONRegistrationServer::RequestHandler
Definition: engine_json_registration_server.h:202
EngineJSONRegistrationServer::operator=
EngineJSONRegistrationServer & operator=(const EngineJSONRegistrationServer &)=delete
EngineJSONRegistrationServer::isRunning
bool isRunning() const
Returns true when server is running, false otherwise.
Definition: engine_json_registration_server.cpp:173
EngineJSONRegistrationServer::EngineJSONRegistrationServer
EngineJSONRegistrationServer(const EngineJSONRegistrationServer &)=delete
EngineJSONRegistrationServer::requestEngine
std::string requestEngine(const engine_name_t &engineName)
Request an engine's address. If available, erases entry from _registeredAddresses.
Definition: engine_json_registration_server.cpp:203
EngineJSONRegistrationServer::registerEngineAddress
void registerEngineAddress(const engine_name_t &engineName, const std::string &address)
Register an engine's address.
Definition: engine_json_registration_server.cpp:216
EngineJSONRegistrationServer::retrieveEngineAddress
std::string retrieveEngineAddress(const engine_name_t &engineName)
Retrieve a registered engine address. If available and non-empty, erase it from _registeredAddresses.
Definition: engine_json_registration_server.cpp:184
DataPackIdentifier::EngineName
std::string EngineName
Corresponding engine.
Definition: datapack_interface.h:49