23#define STOP_TIMEOUT 30
24#define KILL_TIMEOUT 10
26#define BROKER_LOCAL "local"
27#define BROKER_YARPRUN "yarprun"
28#define BROKER_YARPDEV "yarpdev"
41 bWithWatchDog = withWatchDog;
42 bAutoDependancy =
false;
46 knowledge.
createFrom(
nullptr,
nullptr,
nullptr);
51 const char* szResPath,
bool withWatchDog)
54 bWithWatchDog = withWatchDog;
55 bAutoDependancy =
false;
62 if (!modload.
init()) {
68 if (!appload.
init()) {
74 if (!resload.
init()) {
78 knowledge.
createFrom(pModLoad, pAppLoad, pResLoad);
92 if (find(listOfXml.begin(), listOfXml.end(), szFileName) == listOfXml.end()) {
93 listOfXml.emplace_back(szFileName);
98 if (!appload.
init()) {
106 return knowledge.
addApplication(application, szAppName_, modifyName);
113 if (!appload.
init()) {
119 const char* currentFile = application->
getXmlFile();
121 listOfXml.emplace_back(currentFile);
130 if (!modload.
init()) {
133 Module*
module = modload.getNextModule();
144 if (!modload.
init()) {
158 if (!resload.
init()) {
162 bool bloaded =
false;
173 if (!resload.
init()) {
188 if(!runnables.empty())
190 logger->
addError(
"Application cannot be removed if there is a loaded application");
193 listOfXml.erase(std::remove(listOfXml.begin(), listOfXml.end(), szFileName), listOfXml.end());
206 if(!runnables.empty())
208 logger->
addError(
"Module cannot be removed if there is a loaded application");
224 if(!runnables.empty())
226 logger->
addError(
"Resource cannot be removed if there is a loaded application");
246 logger->
addError(
"Please stop current running application first.");
250 strAppName = szAppName;
254 for(
auto& allresource : allresources)
256 auto* comp =
dynamic_cast<Computer*
>(allresource);
262 return prepare(
true);
279 bool ret = prepare(
false);
285 if (
id < runnables.size())
287 return runnables[id];
298 if (removeBroker(exe))
300 modules[id]->setHost(exe->
getHost());
301 Broker* broker = createBroker(modules[
id]);
302 if ( broker ==
nullptr)
306 broker->
setDisplay(modules[
id]->getDisplay());
317bool Manager::prepare(
bool silent)
339 for(itr=modules.begin(); itr!=modules.end(); itr++)
341 Broker* broker = createBroker(*itr);
345 exe->setCommand((*itr)->getName());
346 exe->setParam((*itr)->getParam());
347 exe->setHost((*itr)->getHost());
348 exe->setStdio((*itr)->getStdio());
349 exe->setWorkDir((*itr)->getWorkDir());
350 exe->setPostExecWait((*itr)->getPostExecWait());
351 exe->setPostStopWait((*itr)->getPostStopWait());
352 exe->setOriginalPostExecWait((*itr)->getPostExecWait());
353 exe->setOriginalPostStopWait((*itr)->getPostStopWait());
355 if ((*itr)->getPrefix() && strlen((*itr)->getPrefix())) {
356 env = std::string(
"YARP_PORT_PREFIX=") + std::string((*itr)->getPrefix());
358 if ((*itr)->getEnvironment() && strlen((*itr)->getEnvironment())) {
359 env += (env.length()) ? (std::string(
";") + (*itr)->getEnvironment()) : (*itr)->getEnvironment();
361 exe->setEnv(env.c_str());
376 for(
auto& resource : resources)
379 if (res && (res->owner() == (*itr))) {
380 exe->addResource(*res);
384 runnables.push_back(exe);
431 const char* szhost,
const char* szstdio,
432 const char* szworkdir,
const char* szenv )
434 if(runnables.empty())
436 logger->
addError(
"Application is not loaded.");
440 if(
id>=runnables.size())
442 logger->
addError(
"Module id is out of range.");
457 const char* to,
const char* carrier)
459 if(
id>=connections.size())
461 logger->
addError(
"Connection id is out of range.");
476 connections[id].setFrom(from);
477 connections[id].setTo(to);
478 connections[id].setCarrier(carrier);
491 if(
id>=resources.size())
493 logger->
addError(
"Resource id is out of range.");
508 std::string strPort = res->
getName();
509 if (strPort[0] !=
'/') {
510 strPort = std::string(
"/") + strPort;
525 yError()<<
"Manager::Cannot contact the NameClient";
559 std::vector<std::string> ports;
563 for(
auto& allresource : allresources)
565 auto* comp =
dynamic_cast<Computer*
>(allresource);
569 for(
int i=0; i<comp->peripheralCount(); i++)
571 auto* res =
dynamic_cast<ResYarpPort*
>(&comp->getPeripheralAt(i));
578 for(
auto& port : ports)
585 for(
int i=0; i<comp->peripheralCount(); i++)
587 auto* res =
dynamic_cast<ResYarpPort*
>(&comp->getPeripheralAt(i));
588 if(res && (std::string(res->getName()) == std::string(resport.
getName())))
596 comp->addPeripheral(resport);
620 auto* comp =
dynamic_cast<Computer*
>(resource);
621 if (!comp || !strlen(comp->getName())) {
630 std::string strServer = comp->getName();
631 if (strServer[0] !=
'/') {
632 strServer = std::string(
"/") + strServer;
637 comp->setAvailability(
false);
641 comp->setAvailability(
true);
643 comp->getMemory().setTotalSpace(
info.memory.totalSpace*1024);
644 comp->getMemory().setFreeSpace(
info.memory.freeSpace*1024);
646 comp->getStorage().setTotalSpace(
info.storage.totalSpace*1024);
647 comp->getStorage().setFreeSpace(
info.storage.freeSpace*1024);
654 comp->getProcessor().setArchitecture(
info.processor.architecture.c_str());
655 comp->getProcessor().setCores(
info.processor.cores);
656 comp->getProcessor().setSiblings(
info.processor.siblings);
657 comp->getProcessor().setFrequency(
info.processor.frequency);
658 comp->getProcessor().setModel(
info.processor.model.c_str());
661 load.loadAverage1 =
info.load.cpuLoad1;
662 load.loadAverage5 =
info.load.cpuLoad5;
663 load.loadAverage15 =
info.load.cpuLoad15;
664 comp->getProcessor().setCPULoad(load);
666 comp->getPlatform().setName(
info.platform.name.c_str());
667 comp->getPlatform().setDistribution(
info.platform.distribution.c_str());
668 comp->getPlatform().setRelease(
info.platform.release.c_str());
676 double wait = runnables[id]->getPostExecWait() +
RUN_TIMEOUT;
677 while (!timeout(base, wait)) {
684 msg<<
"Failed to run "<<runnables[id]->getCommand();
685 msg<<
" on "<<runnables[id]->getHost();
686 msg<<
". (State: "<<runnables[id]->state();
687 msg<<
", parameter: "<<runnables[id]->getParam()<<
")";
703 msg<<
"Failed to stop "<<runnables[id]->getCommand();
704 msg<<
" on "<<runnables[id]->getHost();
705 msg<<
". (State: "<<runnables[id]->state();
706 msg<<
", paramete: "<<runnables[id]->getParam()<<
")";
721 msg<<
"Failed to kill "<<runnables[id]->getCommand();
722 msg<<
" on "<<runnables[id]->getHost();
723 msg<<
". (State: "<<runnables[id]->state();
724 msg<<
", paramete: "<<runnables[id]->getParam()<<
")";
733 if(
id>=connections.size())
735 logger->
addError(
"Connection id is out of range.");
738 std::string portName(connections[
id].from());
739 if(portName.find(
' ') != std::string::npos)
741 std::string message =
"Port name \"" + portName +
"\" contains spaces.";
746 bool exists = connector.
exists(portName.c_str());
747 connections[id].setFromExists(exists);
754 if(
id>=connections.size())
756 logger->
addError(
"Connection id is out of range.");
759 std::string portName(connections[
id].to());
760 if(portName.find(
' ') != std::string::npos)
762 std::string message =
"Port name \"" + portName +
"\" contains spaces.";
767 bool exists = connector.
exists(portName.c_str());
768 connections[id].setToExists(exists);
782 for(itrRes=resources.begin(); itrRes!=resources.end(); itrRes++)
784 if(!(*itrRes)->getAvailability())
788 err<<
"Resource "<<(*itrRes)->getName()<<
" is not available!";
800 if(runnables.empty())
802 logger->
addError(
"Application is not loaded.");
806 if(
id>=runnables.size())
808 logger->
addError(
"Module id is out of range.");
812 if (runnables[
id]->shouldChangeBroker())
816 logger->
addError(
"Failing to switch broker");
821 runnables[id]->disableAutoConnect();
822 runnables[id]->start();
825 runnables[id]->startWatchDog();
837 if(runnables.empty())
839 logger->
addError(
"Application is not loaded.");
847 logger->
addError(
"Some of external ports dependency are not satisfied.");
850 logger->
addWarning(
"Some of external ports dependency are not satisfied.");
856 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
859 (*itr)->enableAutoConnect();
861 (*itr)->disableAutoConnect();
865 wait = (wait > (*itr)->getPostExecWait()) ? wait : (*itr)->getPostExecWait();
878 for (itr = runnables.begin(); itr != runnables.end(); itr++) {
879 (*itr)->startWatchDog();
886 for (itr = runnables.begin(); itr != runnables.end(); itr++) {
890 msg<<
"Failed to run "<<(*itr)->getCommand();
891 msg<<
" on "<<(*itr)->getHost();
892 msg<<
". (State: "<<(*itr)->state();
893 msg<<
", parameter: "<<(*itr)->getParam()<<
")";
907 if(!connectExtraPorts())
909 logger->
addError(
"Failed to stablish some of connections.");
921 if(runnables.empty())
923 logger->
addError(
"Application is not loaded.");
927 if(
id>=runnables.size())
929 logger->
addError(
"Module id is out of range.");
933 runnables[id]->stop();
946 if (runnables.empty()) {
951 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
967 for (itr = runnables.begin(); itr != runnables.end(); itr++) {
969 ((*itr)->state() !=
DEAD))
972 msg<<
"Failed to stop "<<(*itr)->getCommand();
973 msg<<
" on "<<(*itr)->getHost();
974 msg<<
". (State: "<<(*itr)->state();
975 msg<<
", paramete: "<<(*itr)->getParam()<<
")";
987 if(runnables.empty())
989 logger->
addError(
"Application is not loaded.");
993 if(
id>=runnables.size())
995 logger->
addError(
"Module id is out of range.");
999 runnables[id]->kill();
1010 if (runnables.empty()) {
1015 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
1031 for (itr = runnables.begin(); itr != runnables.end(); itr++) {
1033 ((*itr)->state() !=
DEAD))
1036 msg<<
"Failed to kill "<<(*itr)->getCommand();
1037 msg<<
" on "<<(*itr)->getHost();
1038 msg<<
". (State: "<<(*itr)->state();
1039 msg<<
", paramete: "<<(*itr)->getParam()<<
")";
1050void Manager::clearExecutables()
1053 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
1064 if(
id>=connections.size())
1066 logger->
addError(
"Connection id is out of range.");
1073 if( !connector.
connect(connections[
id].from(),
1074 connections[
id].to(),
1075 connections[
id].carrier(),
1076 connections[
id].isPersistent()) )
1084 return connector.
setQos(connections[
id].from(),
1085 connections[
id].to(),
1086 connections[
id].qosFrom(),
1087 connections[
id].qosTo());
1095 for(cnn=connections.begin(); cnn!=connections.end(); cnn++) {
1096 if( !(*cnn).getFromExists() ||
1097 !(*cnn).getToExists() ||
1098 !connector.
connect((*cnn).from(), (*cnn).to(),
1099 (*cnn).carrier(), (*cnn).isPersistent()) )
1109 if(! connector.
setQos((*cnn).from(), (*cnn).to(),
1110 (*cnn).qosFrom(), (*cnn).qosTo())) {
1121 if(
id>=connections.size())
1123 logger->
addError(
"Connection id is out of range.");
1130 if( !connector.
disconnect(connections[
id].from(),
1131 connections[
id].to(),
1132 connections[
id].carrier()) )
1147 for (cnn = connections.begin(); cnn != connections.end(); cnn++) {
1148 if( !connector.
disconnect((*cnn).from(), (*cnn).to(), (*cnn).carrier()) )
1161 if(
id>=connections.size())
1163 logger->
addError(
"Connection id is out of range.");
1167 if(!connector.
rmconnect(connections[
id].from(),
1168 connections[
id].to()) )
1181 for (cnn = connections.begin(); cnn != connections.end(); cnn++) {
1182 if( !connector.
rmconnect((*cnn).from(), (*cnn).to()) )
1194 if(
id>=connections.size())
1196 logger->
addError(
"Connection id is out of range.");
1200 return connections[id].getFromExists() &&
1201 connections[id].getToExists() &&
1202 connector.
connected(connections[
id].from(),
1203 connections[
id].to(),
1204 connections[
id].carrier());
1213 bool bConnected =
true;
1214 for (cnn = connections.begin(); cnn != connections.end(); cnn++) {
1215 if (!(*cnn).getFromExists() || !(*cnn).getToExists() || !connector.
connected((*cnn).from(), (*cnn).to(), (*cnn).carrier())) {
1222bool Manager::checkPortsAvailable(
Broker* broker)
1225 for(itr=connections.begin(); itr!=connections.end(); itr++)
1229 if (!broker->
exists((*itr).to()) || !broker->
exists((*itr).from())) {
1238bool Manager::connectExtraPorts()
1244 while (!timeout(base, 10.0)) {
1245 if (checkPortsAvailable(&connector)) {
1251 for(cnn=connections.begin(); cnn!=connections.end(); cnn++)
1255 if( !connector.
connect((*cnn).from(), (*cnn).to(),
1269 if(
id>=runnables.size())
1271 logger->
addError(
"Module id is out of range.");
1275 RSTATE st = runnables[id]->state();
1283bool Manager::allRunning()
1285 if (!runnables.size()) {
1289 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
1291 RSTATE st = (*itr)->state();
1302 if(
id>=runnables.size())
1304 logger->
addError(
"Module id is out of range.");
1307 RSTATE st = runnables[id]->state();
1315bool Manager::allStopped()
1317 if (!runnables.size()) {
1321 for(itr=runnables.begin(); itr!=runnables.end(); itr++)
1323 RSTATE st = (*itr)->state();
1333 if(
id>=runnables.size())
1335 logger->
addError(
"Module id is out of range.");
1342 msg<<
"Cannot attach to stdout of "<<runnables[id]->getCommand();
1343 msg<<
" on "<<runnables[id]->getHost();
1344 msg<<
". (State: "<<runnables[id]->state();
1345 msg<<
", paramete: "<<runnables[id]->getParam()<<
") ";
1346 msg<<
"because "<<runnables[id]->getBroker()->error();
1355 if(
id>=runnables.size())
1357 logger->
addError(
"Module id is out of range.");
1361 runnables[id]->getBroker()->detachStdout();
1365bool Manager::timeout(
double base,
double t)
const char * getXmlFile()
void setDisplay(const char *szDisplay)
virtual bool exists(const std::string &port)=0
void addError(const char *szError)
void addWarning(const char *szWarning)
static ErrorLogger * Instance()
Singleton class ErrorLogger.
void setParam(const char *val)
void setWorkDir(const char *val)
void setHost(const char *val)
void setStdio(const char *val)
void setEnv(const char *val)
void setAndInitializeBroker(Broker *_broker)
void setAvailability(bool flag)
void setName(const char *szName)
Module * getModule(const char *szName)
bool removeModule(Module *module)
const CnnContainer & getSelConnection()
const ModulePContainer & getSelModules()
GenericResource * getResource(const char *szName)
bool removeResource(GenericResource *resource)
const ResourcePContainer & getSelResources()
bool reasolveDependency(const char *szName, bool bAutoDependancy=false, bool bSilent=false)
bool addResource(GenericResource *resource)
Node * getNode(std::string appName)
Application * getApplication()
bool addModule(Module *module)
bool removeApplication(Application *application)
bool createFrom(ModuleLoader *_mloader, AppLoader *_apploader, ResourceLoader *_resloader)
const ResourcePContainer & getResources(Application *parent=nullptr)
bool addApplication(Application *application, char **szAppName_=nullptr, bool modifyName=false)
bool saveApplication(AppSaver *appSaver, Application *application)
void onExecutableStdout(void *which, const char *msg) override
void onExecutableDied(void *which) override
void onExecutableStop(void *which) override
Manager(bool withWatchDog=false)
Class Manager.
bool removeApplication(const char *szFileName, const char *szAppName)
bool updateResource(const char *szName)
bool detachStdout(unsigned int id)
void onCnnFailed(void *which) override
bool addModule(const char *szFileName)
bool updateConnection(unsigned int id, const char *from, const char *to, const char *carrier)
bool attachStdout(unsigned int id)
bool removeModule(const char *szModName)
bool existPortFrom(unsigned int id)
bool addModules(const char *szPath)
bool addResources(const char *szPath)
Node * getNode(std::string appName)
bool addApplication(const char *szFileName, char **szAppName_=nullptr, bool modifyName=false)
bool exist(unsigned int id)
bool existPortTo(unsigned int id)
void onError(void *which) override
bool switchBroker(size_t id)
bool addResource(const char *szFileName)
bool updateExecutable(unsigned int id, const char *szparam, const char *szhost, const char *szstdio, const char *szworkdir, const char *szenv)
bool waitingModuleKill(unsigned int id)
bool waitingModuleStop(unsigned int id)
bool removeResource(const char *szResName)
bool addApplications(const char *szPath)
void onExecutableFailed(void *which) override
bool loadApplication(const char *szAppName)
bool saveApplication(const char *szAppName, const char *fileName=nullptr)
void onCnnStablished(void *which) override
bool waitingModuleRun(unsigned int id)
Executable * getExecutableById(size_t id)
void onExecutableStart(void *which) override
void setPort(const char *szPort)
Application * getNextApplication() override
Module * getNextModule() override
GenericResource * getNextResource() override
bool rmconnect(const std::string &from, const std::string &to)
bool getAllPorts(std::vector< std::string > &stingList)
bool connected(const std::string &from, const std::string &to, const std::string &carrier) override
bool setQos(const std::string &from, const std::string &to, const std::string &qosFrom, const std::string &qosTo)
bool connect(const std::string &from, const std::string &to, const std::string &carrier, bool persist=false) override
connection broker
std::string error() override
bool disconnect(const std::string &from, const std::string &to, const std::string &carrier) override
bool exists(const std::string &port) override
bool getSystemInfo(const std::string &server, yarp::os::SystemInfoSerializer &info)
A simple collection of objects that can be described and transmitted in a portable way.
size_type size() const
Gets the number of elements in the bottle.
Value & get(size_type index) const
Reads a Value v from a certain part of the list.
void addString(const char *str)
Places a string in the bottle, at the end of the list.
static double nowSystem()
static void delaySystem(double seconds)
A helper class to pass the SystemInfo object around the YARP network.
virtual bool asBool() const
Get boolean value.
static NameClient & getNameClient()
Get an instance of the name client.
bool compareString(const char *szFirst, const char *szSecond)
std::vector< Executable * >::iterator ExecutablePIterator
enum yarp::manager::__RSTATE RSTATE
std::vector< GenericResource * >::iterator ResourcePIterator
std::vector< Connection >::iterator CnnIterator
std::stringstream OSTRINGSTREAM
std::vector< GenericResource * > ResourcePContainer
std::vector< Module * >::iterator ModulePIterator
double now()
Return the current time in seconds, relative to an arbitrary starting point.
double loadAverageInstant
#define __CHECK_NULLPTR(_ptr)