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"
18 XDAQContextConfiguration::XDAQContextConfiguration(
void)
45 XDAQContextConfiguration::~XDAQContextConfiguration(
void)
51 extractContexts(configManager);
56 fs.open(XDAQ_RUN_FILE, std::fstream::out | std::fstream::trunc);
59 __SS__ <<
"Failed to open XDAQ run file: " << XDAQ_RUN_FILE << std::endl;
60 throw std::runtime_error(ss.str());
62 outputXDAQXML((std::ostream &)fs);
90 bool XDAQContextConfiguration::isARTDAQContext(
const std::string &contextUID)
92 return (contextUID.find(
"ART") == 0 ||
93 contextUID.find(
"ARTDAQ") == 0);
103 unsigned int XDAQContextConfiguration::getARTDAQAppRank(
const std::string &contextUID)
const
108 unsigned int rank = 0;
110 for(
auto &i : artdaqBoardReaders_)
112 if(contexts_[i].contextUID_ == contextUID)
116 for(
auto &i : artdaqEventBuilders_)
118 if(contexts_[i].contextUID_ == contextUID)
122 for(
auto &i : artdaqAggregators_)
124 if(contexts_[i].contextUID_ == contextUID)
129 if(contextUID ==
"X")
134 __COUT__ <<
"Assuming since there are 0 active ARTDAQ context UID(s), we can ignore rank failure." << std::endl;
137 __SS__ <<
"ARTDAQ rank could not be found for context UID '" <<
138 contextUID <<
"' - there were " << rank
139 <<
" active ARTDAQ context UID(s) checked." << std::endl;
140 __COUT_ERR__ <<
"\n" << ss.str();
141 throw std::runtime_error(ss.str());
146 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getBoardReaderContexts()
const
148 std::vector<const XDAQContext *> retVec;
149 for(
auto &i : artdaqBoardReaders_)
150 retVec.push_back(&contexts_[i]);
154 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getEventBuilderContexts()
const
156 std::vector<const XDAQContext *> retVec;
157 for(
auto &i : artdaqEventBuilders_)
158 retVec.push_back(&contexts_[i]);
163 std::vector<const XDAQContextConfiguration::XDAQContext *> XDAQContextConfiguration::getAggregatorContexts()
const
165 std::vector<const XDAQContext *> retVec;
166 for(
auto &i : artdaqAggregators_)
167 retVec.push_back(&contexts_[i]);
173 const std::string &contextUID,
const std::string &appUID)
const
175 return configManager->__SELF_NODE__.getNode(
177 colContext_.colLinkToApplicationConfiguration_ +
"/" +
179 colApplication_.colLinkToSupervisorConfiguration_);
215 auto children = configManager->__SELF_NODE__.getChildren();
218 artdaqContexts_.clear();
220 artdaqBoardReaders_.clear();
221 artdaqEventBuilders_.clear();
222 artdaqAggregators_.clear();
224 for(
auto &child:children)
226 contexts_.push_back(XDAQContext());
230 contexts_.back().contextUID_ = child.first;
232 contexts_.back().sourceConfig_ = child.second.getConfigurationName() +
"_v" +
233 child.second.getConfigurationVersion().toString() +
" @ " +
234 std::to_string(child.second.getConfigurationCreationTime());
235 child.second.getNode(colContext_.colContextUID_ ).getValue(contexts_.back().contextUID_);
236 child.second.getNode(colContext_.colStatus_ ).getValue(contexts_.back().status_);
237 child.second.getNode(colContext_.colId_ ).getValue(contexts_.back().id_);
238 child.second.getNode(colContext_.colAddress_ ).getValue(contexts_.back().address_);
239 child.second.getNode(colContext_.colPort_ ).getValue(contexts_.back().port_);
242 auto appLink = child.second.getNode(colContext_.colLinkToApplicationConfiguration_);
243 if(appLink.isDisconnected())
245 __SS__ <<
"Application link is disconnected!" << std::endl;
246 throw std::runtime_error(ss.str());
250 auto appChildren = appLink.getChildren();
251 for(
auto appChild:appChildren)
255 contexts_.back().applications_.push_back(XDAQApplication());
257 contexts_.back().applications_.back().applicationGroupID_ = child.first;
258 contexts_.back().applications_.back().sourceConfig_ = appChild.second.getConfigurationName() +
"_v" +
259 appChild.second.getConfigurationVersion().toString() +
" @ " +
260 std::to_string(appChild.second.getConfigurationCreationTime());
262 appChild.second.getNode(colApplication_.colApplicationUID_ ).getValue(contexts_.back().applications_.back().applicationUID_);
263 appChild.second.getNode(colApplication_.colStatus_ ).getValue(contexts_.back().applications_.back().status_);
264 appChild.second.getNode(colApplication_.colClass_ ).getValue(contexts_.back().applications_.back().class_);
265 appChild.second.getNode(colApplication_.colId_ ).getValue(contexts_.back().applications_.back().id_);
268 if(appChild.second.getNode(colApplication_.colInstance_ ).isDefaultValue())
269 contexts_.back().applications_.back().instance_ = 1;
271 appChild.second.getNode(colApplication_.colInstance_ ).getValue(contexts_.back().applications_.back().instance_);
273 if(appChild.second.getNode(colApplication_.colNetwork_ ).isDefaultValue())
274 contexts_.back().applications_.back().network_ =
"local";
276 appChild.second.getNode(colApplication_.colNetwork_ ).getValue(contexts_.back().applications_.back().network_);
278 if(appChild.second.getNode(colApplication_.colGroup_ ).isDefaultValue())
279 contexts_.back().applications_.back().group_ =
"daq";
281 appChild.second.getNode(colApplication_.colGroup_ ).getValue(contexts_.back().applications_.back().group_);
283 appChild.second.getNode(colApplication_.colModule_ ).getValue(contexts_.back().applications_.back().module_);
286 auto appPropertyLink = appChild.second.getNode(colApplication_.colLinkToPropertyConfiguration_);
287 if(!appPropertyLink.isDisconnected())
291 auto appPropertyChildren = appPropertyLink.getChildren();
295 for(
auto appPropertyChild:appPropertyChildren)
297 contexts_.back().applications_.back().properties_.push_back(XDAQApplicationProperty());
298 contexts_.back().applications_.back().properties_.back().status_ =
299 appPropertyChild.second.getNode(colAppProperty_.colStatus_).getValue<
bool>();
300 contexts_.back().applications_.back().properties_.back().name_ =
301 appPropertyChild.second.getNode(colAppProperty_.colPropertyName_).getValue<std::string>();
302 contexts_.back().applications_.back().properties_.back().type_ =
303 appPropertyChild.second.getNode(colAppProperty_.colPropertyType_).getValue<std::string>();
304 contexts_.back().applications_.back().properties_.back().value_ =
305 appPropertyChild.second.getNode(colAppProperty_.colPropertyValue_).getValue<std::string>();
315 if(isARTDAQContext(contexts_.back().contextUID_))
317 artdaqContexts_.push_back(contexts_.size()-1);
319 if(contexts_.back().applications_.size() != 1)
321 __SS__ <<
"ARTDAQ Context '" << contexts_.back().contextUID_ <<
322 "' must have one Application! " <<
323 contexts_.back().applications_.size() <<
" were found. " << std::endl;
324 throw std::runtime_error(ss.str());
327 if(!contexts_.back().status_)
continue;
329 if(contexts_.back().applications_[0].class_ ==
330 "ots::ARTDAQDataManagerSupervisor")
331 artdaqBoardReaders_.push_back(contexts_.size()-1);
332 else if(contexts_.back().applications_[0].class_ ==
333 "ots::EventBuilderApp")
334 artdaqEventBuilders_.push_back(contexts_.size()-1);
335 else if(contexts_.back().applications_[0].class_ ==
336 "ots::AggregatorApp")
337 artdaqAggregators_.push_back(contexts_.size()-1);
340 __SS__ <<
"ARTDAQ Context must be have Application of an allowed class type:\n " <<
341 "\tots::ARTDAQDataManagerSupervisor\n" <<
342 "\tots::EventBuilderApp\n" <<
343 "\tots::AggregatorApp\n" <<
"\nClass found was " <<
344 contexts_.back().applications_[0].class_ << std::endl;
345 throw std::runtime_error(ss.str());
553 void XDAQContextConfiguration::outputXDAQXML(std::ostream &out)
562 out <<
"<?xml version='1.0'?>\n" <<
563 "<xc:Partition \txmlns:xsi\t= \"http://www.w3.org/2001/XMLSchema-instance\"\n" <<
564 "\t\txmlns:soapenc\t= \"http://schemas.xmlsoap.org/soap/encoding/\"\n" <<
565 "\t\txmlns:xc\t= \"http://xdaq.web.cern.ch/xdaq/xsd/2004/XMLConfiguration-30\">\n\n";
577 for(XDAQContext &context:contexts_)
582 sprintf(tmp,
"\t<!-- ContextUID='%s' sourceConfig='%s' -->",
583 context.contextUID_.c_str(), context.sourceConfig_.c_str());
589 sprintf(tmp,
"\t<xc:Context id=\"%u\" url=\"%s:%u\">", context.id_, context.address_.c_str(), context.port_);
590 out << tmp <<
"\n\n";
592 for(XDAQApplication &app:context.applications_)
599 sprintf(tmp,
"\t\t<!-- Application GroupID = '%s' UID='%s' sourceConfig='%s' -->",
600 app.applicationGroupID_.c_str(), app.applicationUID_.c_str(), app.sourceConfig_.c_str());
607 sprintf(tmp,
"\t\t<xc:Application class=\"%s\" id=\"%u\" instance=\"%u\" network=\"%s\" group=\"%s\">\n",
608 app.class_.c_str(), app.id_, app.instance_, app.network_.c_str(), app.group_.c_str());
612 int foundColon = app.class_.rfind(
':');
613 if(foundColon >= 0) ++foundColon;
614 out <<
"\t\t\t<properties xmlns=\"urn:xdaq-application:" <<
615 app.class_.substr(foundColon) <<
616 "\" xsi:type=\"soapenc:Struct\">\n";
619 for(XDAQApplicationProperty &appProperty:app.properties_)
622 if(!appProperty.status_)
623 out <<
"\t\t\t\t<!--\n";
625 sprintf(tmp,
"\t\t\t\t<%s xsi:type=\"%s\">%s</%s>\n",
626 appProperty.name_.c_str(),
627 appProperty.type_.c_str(),
628 appProperty.value_.c_str(),
629 appProperty.name_.c_str());
632 if(!appProperty.status_)
633 out <<
"\t\t\t\t-->\n";
635 out <<
"\t\t\t</properties>\n";
638 out <<
"\t\t</xc:Application>\n";
641 sprintf(tmp,
"\t\t<xc:Module>%s</xc:Module>\n", app.module_.c_str());
644 if(context.status_ && !app.status_)
649 out <<
"\t</xc:Context>\n";
655 out <<
"</xc:Partition>\n\n\n";
660 std::string XDAQContextConfiguration::getContextUID(
const std::string &url)
const
662 for(
auto context: contexts_)
664 if(!context.status_)
continue;
666 if(url == context.address_ +
":" + std::to_string(context.port_))
667 return context.contextUID_;
673 std::string XDAQContextConfiguration::getApplicationUID(
const std::string &url,
unsigned int id)
const
675 for(
auto context: contexts_)
677 if(!context.status_)
continue;
679 if(url == context.address_ +
":" + std::to_string(context.port_))
680 for(
auto application: context.applications_)
682 if(!application.status_)
continue;
684 if(application.id_ ==
id)
686 return application.applicationUID_;