1 #include "otsdaq-core/ConfigurationPluginDataFormats/XDAQContextConfiguration.h"
2 #include "otsdaq-core/Macros/ConfigurationPluginMacros.h"
3 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
12 #define XDAQ_RUN_FILE std::string(getenv("XDAQ_CONFIGURATION_DATA_PATH")) + "/"+ std::string(getenv("XDAQ_CONFIGURATION_XML")) + ".xml"
17 XDAQContextConfiguration::XDAQContextConfiguration(
void)
44 XDAQContextConfiguration::~XDAQContextConfiguration(
void)
50 extractContexts(configManager);
55 fs.open(XDAQ_RUN_FILE, std::fstream::out | std::fstream::trunc);
58 __SS__ <<
"Failed to open XDAQ run file: " << XDAQ_RUN_FILE << std::endl;
59 throw std::runtime_error(ss.str());
61 outputXDAQXML((std::ostream &)fs);
89 bool XDAQContextConfiguration::isARTDAQContext(
const std::string &contextUID)
91 return (contextUID.find(
"ART") == 0 ||
92 contextUID.find(
"ARTDAQ") == 0);
102 unsigned int XDAQContextConfiguration::getARTDAQAppRank(
const std::string &contextUID)
const
107 unsigned int rank = 0;
109 for(
auto &i : artdaqBoardReaders_)
111 if(contexts_[i].contextUID_ == contextUID)
115 for(
auto &i : artdaqEventBuilders_)
117 if(contexts_[i].contextUID_ == contextUID)
121 for(
auto &i : artdaqAggregators_)
123 if(contexts_[i].contextUID_ == contextUID)
128 if(contextUID ==
"X")
131 __SS__ <<
"ARTDAQ rank could not be found for context UID '" <<
132 contextUID <<
"' - there were " << rank
133 <<
" active ARTDAQ context UID(s) checked." << std::endl;
134 __MOUT_ERR__ <<
"\n" << ss.str();
135 throw std::runtime_error(ss.str());
140 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getBoardReaderContexts()
const
142 std::vector<const XDAQContext *> retVec;
143 for(
auto &i : artdaqBoardReaders_)
144 retVec.push_back(&contexts_[i]);
148 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getEventBuilderContexts()
const
150 std::vector<const XDAQContext *> retVec;
151 for(
auto &i : artdaqEventBuilders_)
152 retVec.push_back(&contexts_[i]);
157 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getAggregatorContexts()
const
159 std::vector<const XDAQContext *> retVec;
160 for(
auto &i : artdaqAggregators_)
161 retVec.push_back(&contexts_[i]);
167 const std::string &contextUID,
const std::string &appUID)
const
169 return configManager->__SELF_NODE__.getNode(
171 colContext_.colLinkToApplicationConfiguration_ +
"/" +
173 colApplication_.colLinkToSupervisorConfiguration_);
203 __MOUT__ <<
"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" << std::endl;
204 __MOUT__ << configManager->__SELF_NODE__ << std::endl;
209 auto children = configManager->__SELF_NODE__.getChildren();
212 artdaqContexts_.clear();
214 artdaqBoardReaders_.clear();
215 artdaqEventBuilders_.clear();
216 artdaqAggregators_.clear();
218 for(
auto &child:children)
220 contexts_.push_back(XDAQContext());
224 contexts_.back().contextUID_ = child.first;
226 contexts_.back().sourceConfig_ = child.second.getConfigurationName() +
"_v" +
227 child.second.getConfigurationVersion().toString() +
" @ " +
228 std::to_string(child.second.getConfigurationCreationTime());
229 child.second.getNode(colContext_.colContextUID_ ).getValue(contexts_.back().contextUID_);
230 child.second.getNode(colContext_.colStatus_ ).getValue(contexts_.back().status_);
231 child.second.getNode(colContext_.colId_ ).getValue(contexts_.back().id_);
232 child.second.getNode(colContext_.colAddress_ ).getValue(contexts_.back().address_);
233 child.second.getNode(colContext_.colPort_ ).getValue(contexts_.back().port_);
236 auto appLink = child.second.getNode(colContext_.colLinkToApplicationConfiguration_);
237 if(appLink.isDisconnected())
239 __SS__ <<
"Application link is disconnected!" << std::endl;
240 throw std::runtime_error(ss.str());
244 auto appChildren = appLink.getChildren();
245 for(
auto appChild:appChildren)
249 contexts_.back().applications_.push_back(XDAQApplication());
251 contexts_.back().applications_.back().applicationGroupID_ = child.first;
252 contexts_.back().applications_.back().sourceConfig_ = appChild.second.getConfigurationName() +
"_v" +
253 appChild.second.getConfigurationVersion().toString() +
" @ " +
254 std::to_string(appChild.second.getConfigurationCreationTime());
256 appChild.second.getNode(colApplication_.colApplicationUID_ ).getValue(contexts_.back().applications_.back().applicationUID_);
257 appChild.second.getNode(colApplication_.colStatus_ ).getValue(contexts_.back().applications_.back().status_);
258 appChild.second.getNode(colApplication_.colClass_ ).getValue(contexts_.back().applications_.back().class_);
259 appChild.second.getNode(colApplication_.colId_ ).getValue(contexts_.back().applications_.back().id_);
260 appChild.second.getNode(colApplication_.colInstance_ ).getValue(contexts_.back().applications_.back().instance_);
261 appChild.second.getNode(colApplication_.colNetwork_ ).getValue(contexts_.back().applications_.back().network_);
262 appChild.second.getNode(colApplication_.colGroup_ ).getValue(contexts_.back().applications_.back().group_);
263 appChild.second.getNode(colApplication_.colModule_ ).getValue(contexts_.back().applications_.back().module_);
267 if(isARTDAQContext(contexts_.back().contextUID_))
269 artdaqContexts_.push_back(contexts_.size()-1);
271 if(contexts_.back().applications_.size() != 1)
273 __SS__ <<
"ARTDAQ Context must only have one Application!" <<
274 contexts_.back().applications_.size() <<
" were found. " << std::endl;
275 throw std::runtime_error(ss.str());
278 if(!contexts_.back().status_)
continue;
280 if(contexts_.back().applications_[0].class_ ==
281 "ots::ARTDAQDataManagerSupervisor")
282 artdaqBoardReaders_.push_back(contexts_.size()-1);
283 else if(contexts_.back().applications_[0].class_ ==
284 "ots::EventBuilderApp")
285 artdaqEventBuilders_.push_back(contexts_.size()-1);
286 else if(contexts_.back().applications_[0].class_ ==
287 "ots::AggregatorApp")
288 artdaqAggregators_.push_back(contexts_.size()-1);
291 __SS__ <<
"ARTDAQ Context must be have Application of an allowed class type:\n " <<
292 "\tots::ARTDAQDataManagerSupervisor\n" <<
293 "\tots::EventBuilderApp\n" <<
294 "\tots::AggregatorApp\n" <<
"\nClass found was " <<
295 contexts_.back().applications_[0].class_ << std::endl;
296 throw std::runtime_error(ss.str());
504 void XDAQContextConfiguration::outputXDAQXML(std::ostream &out)
513 out <<
"<?xml version='1.0'?>\n" <<
514 "<xc:Partition \txmlns:xsi\t= \"http://www.w3.org/2001/XMLSchema-instance\"\n" <<
515 "\t\txmlns:soapenc\t= \"http://schemas.xmlsoap.org/soap/encoding/\"\n" <<
516 "\t\txmlns:xc\t= \"http://xdaq.web.cern.ch/xdaq/xsd/2004/XMLConfiguration-30\">\n\n";
528 for(XDAQContext &context:contexts_)
533 sprintf(tmp,
"\t<!-- ContextUID='%s' sourceConfig='%s' -->",
534 context.contextUID_.c_str(), context.sourceConfig_.c_str());
540 sprintf(tmp,
"\t<xc:Context id=\"%u\" url=\"%s:%u\">", context.id_, context.address_.c_str(), context.port_);
541 out << tmp <<
"\n\n";
543 for(XDAQApplication &app:context.applications_)
550 sprintf(tmp,
"\t\t<!-- Application GroupID = '%s' UID='%s' sourceConfig='%s' -->",
551 app.applicationGroupID_.c_str(), app.applicationUID_.c_str(), app.sourceConfig_.c_str());
558 sprintf(tmp,
"\t\t<xc:Application class=\"%s\" id=\"%u\" instance=\"%u\" network=\"%s\" group=\"%s\"/>\n",
559 app.class_.c_str(), app.id_, app.instance_, app.network_.c_str(), app.group_.c_str());
562 sprintf(tmp,
"\t\t<xc:Module>%s</xc:Module>\n", app.module_.c_str());
565 if(context.status_ && !app.status_)
570 out <<
"\t</xc:Context>\n";
576 out <<
"</xc:Partition>\n\n\n";
581 std::string XDAQContextConfiguration::getContextUID(
const std::string &url)
const
583 for(
auto context: contexts_)
585 if(!context.status_)
continue;
587 if(url == context.address_ +
":" + std::to_string(context.port_))
588 return context.contextUID_;
594 std::string XDAQContextConfiguration::getApplicationUID(
const std::string &url,
unsigned int id)
const
596 for(
auto context: contexts_)
598 if(!context.status_)
continue;
600 if(url == context.address_ +
":" + std::to_string(context.port_))
601 for(
auto application: context.applications_)
603 if(!application.status_)
continue;
605 if(application.id_ ==
id)
607 return application.applicationUID_;