1 #ifndef _ots_ConfigurationManager_h_
2 #define _ots_ConfigurationManager_h_
10 #include "artdaq-core/Utilities/TimeUtils.hh"
11 #include "otsdaq/ConfigurationInterface/ConfigurationInterface.h"
12 #include "otsdaq/ConfigurationInterface/ConfigurationTree.h"
13 #include "otsdaq/TableCore/TableVersion.h"
19 #define __GET_CONFIG__(X) getTable<X>(QUOTE(X))
29 typedef std::map<std::string,
30 std::pair<std::pair<std::string, TableGroupKey>,
31 std::map<std::string, TableVersion>
39 static const std::string READONLY_USER;
41 static const std::string ALIAS_VERSION_PREAMBLE;
42 static const std::string SCRATCH_VERSION_ALIAS;
44 static const std::string XDAQ_CONTEXT_TABLE_NAME;
45 static const std::string XDAQ_APPLICATION_TABLE_NAME;
46 static const std::string XDAQ_APP_PROPERTY_TABLE_NAME;
47 static const std::string GROUP_ALIASES_TABLE_NAME;
48 static const std::string VERSION_ALIASES_TABLE_NAME;
49 static const std::string ARTDAQ_TOP_TABLE_NAME;
50 static const std::string DESKTOP_ICON_TABLE_NAME;
52 static const std::string GROUP_TYPE_NAME_CONTEXT;
53 static const std::string GROUP_TYPE_NAME_BACKBONE;
54 static const std::string GROUP_TYPE_NAME_ITERATE;
55 static const std::string GROUP_TYPE_NAME_CONFIGURATION;
56 static const std::string GROUP_TYPE_NAME_UNKNOWN;
58 static const std::string LAST_TABLE_GROUP_SAVE_PATH;
59 static const std::string LAST_ACTIVATED_CONFIG_GROUP_FILE;
60 static const std::string LAST_ACTIVATED_CONTEXT_GROUP_FILE;
61 static const std::string LAST_ACTIVATED_BACKBONE_GROUP_FILE;
62 static const std::string LAST_ACTIVATED_ITERATOR_GROUP_FILE;
64 static const uint8_t METADATA_COL_ALIASES;
65 static const uint8_t METADATA_COL_COMMENT;
66 static const uint8_t METADATA_COL_AUTHOR;
67 static const uint8_t METADATA_COL_TIMESTAMP;
70 static const std::set<std::string>
76 static const std::string CONTEXT_SUBSYSTEM_OPTIONAL_TABLE;
77 static const std::string UNKNOWN_INFO;
78 static const std::string UNKNOWN_TIME;
89 enum class LoadGroupType
92 ONLY_BACKBONE_OR_CONTEXT_TYPES,
98 static const std::set<std::string>& getContextMemberNames (
void);
99 static const std::set<std::string>& getBackboneMemberNames (
void);
100 static const std::set<std::string>& getIterateMemberNames (
void);
101 const std::set<std::string>& getConfigurationMemberNames (
void);
104 static ConfigurationManager::GroupType
getTypeOfGroup (
const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
105 static const std::string&
getTypeNameOfGroup (
const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
111 bool initializeFromFhicl =
false);
116 void init (std::string* accumulatedErrors = 0,
bool initForWriteAccess =
false, std::string* accumulatedWarnings = 0);
118 void destroyTableGroup (
const std::string& theGroup =
"",
bool onlyDeactivate =
false);
124 std::string runTimeSeconds() {
130 std::to_string(artdaq::TimeUtils::GetElapsedTime(deltaClockTime_)) +
"s";
131 deltaClockTime_ = std::chrono::steady_clock::now();
136 const std::string& tableGroupName,
138 bool doActivate =
false,
139 std::map<std::string, TableVersion>* groupMembers = 0,
141 std::string* accumulateWarnings = 0,
142 std::string* groupComment = 0,
143 std::string* groupAuthor = 0,
144 std::string* groupCreateTime = 0,
145 bool doNotLoadMember =
false,
146 std::string* groupTypeString = 0,
147 std::map<std::string /*name*/, std::string /*alias*/>* groupAliases = 0,
148 ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext = ConfigurationManager::LoadGroupType::ALL_TYPES,
149 bool ignoreVersionTracking =
false);
152 const std::map<std::string, TableVersion>& groupMembers,
153 const std::string& configGroupName =
"",
155 bool doActivate =
false,
156 bool ignoreVersionTracking =
false);
158 getGroupOfLoadedTable (
const std::string& tableName)
const;
159 void loadMemberMap (
const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap, std::string* accumulateWarnings = 0);
166 const T*
getTable (
const std::string& tableName)
const
169 const T* retPtr =
dynamic_cast<const T*
>(srcPtr);
if(retPtr ==
nullptr) { __SS__ <<
"Illegal cast of '" << tableName <<
"' to type " << StringMacros::getTypeName<T>() <<
" (s=" <<
static_cast<const void*
>(srcPtr) <<
", t=" <<
typeid(srcPtr).name() <<
")"<< __E__; __SS_THROW__ }
return retPtr;
173 void dumpActiveConfiguration (
const std::string& filePath,
const std::string& dumpType,
const std::string& configurationAlias,
const std::string& logEntry,
const std::string& activeUsers, std::ostream& altOut = std::cout);
174 void dumpMacroMakerModeFhicl (
void);
176 std::map<std::string ,
177 std::pair<std::string ,
181 std::map<std::string ,
182 std::map<std::string ,
184 std::pair<std::string ,
186 std::map<std::string ,
187 std::pair<std::string ,
189 const std::map<std::string ,
190 std::pair<std::string ,
191 TableGroupKey>>& getFailedTableGroups (
void)
const {
return lastFailedGroupLoad_;}
192 const lastGroupLoad_t& getLastTableGroups (
void)
const {
return lastGroupLoad_;}
193 const std::string& getActiveGroupName (
const ConfigurationManager::GroupType& type = ConfigurationManager::GroupType::CONFIGURATION_TYPE)
const;
194 TableGroupKey getActiveGroupKey (
const ConfigurationManager::GroupType& type = ConfigurationManager::GroupType::CONFIGURATION_TYPE)
const;
196 ConfigurationTree
getNode (
const std::string& nodeString,
bool doNotThrowOnBrokenUIDLinks =
false)
const;
197 std::map<std::string, ConfigurationTree>
198 getNodes (
const std::string& nodeString)
const;
199 ConfigurationTree getContextNode (
const std::string& contextUID,
const std::string& applicationUID)
const;
200 ConfigurationTree getSupervisorNode (
const std::string& contextUID,
const std::string& applicationUID)
const;
201 ConfigurationTree getSupervisorTableNode (
const std::string& contextUID,
const std::string& applicationUID)
const;
204 std::vector<std::pair<std::string ,
205 ConfigurationTree>>
getChildren (std::map<std::string, TableVersion>* memberMap = 0, std::string* accumulatedTreeErrors = 0)
const;
206 std::map<std::string ,
207 ConfigurationTree>
getChildrenMap (std::map<std::string, TableVersion>* memberMap = 0, std::string* accumulatedTreeErrors = 0)
const;
208 std::string
getFirstPathToNode (
const ConfigurationTree& node,
const std::string& startPath =
"/")
const;
212 const std::string& getOwnerContext (
void) {
return ownerContextUID_; }
213 const std::string& getOwnerApp (
void) {
return ownerAppUID_; }
214 bool isOwnerFirstAppInContext (
void);
216 std::map<std::string ,
217 std::pair<std::string ,
218 TableGroupKey>> getOtherSubsystemActiveTableGroups (
const std::string& otherSubsystemUID, std::string* userDataPathPtr =
nullptr, std::string* hostnamePtr =
nullptr, std::string* usernamePtr =
nullptr);
219 void getOtherSubsystemInstanceInfo (
const std::string& otherSubsystemUID, std::string* userDataPathPtr =
nullptr, std::string* hostnamePtr =
nullptr, std::string* usernamePtr =
nullptr, std::string* fullNamePtr =
nullptr);
222 void getOtherSubsystemConfigAliasInfo (
const std::string& otherSubsystemUID,
const std::string& configAlias, std::pair<std::string, TableGroupKey>& groupTranslation, std::string& groupComment, std::string& groupAuthor, std::string& groupCreationTime);
227 void restoreActiveTableGroups (
bool throwErrors =
false,
const std::string& pathToActiveGroupsFile =
"", ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext = ConfigurationManager::LoadGroupType::ALL_TYPES, std::string* accumulatedWarnings = 0);
229 void setOwnerContext (
const std::string& contextUID) { ownerContextUID_ = contextUID; }
230 void setOwnerApp (
const std::string& appUID) { ownerAppUID_ = appUID; }
231 static void saveGroupNameAndKey (
const std::pair<std::string /*group name*/, TableGroupKey>& theGroup,
const std::string& fileName);
234 TableGroupKey>
loadGroupNameAndKey (
const std::string& fileName, std::string& returnedTimeString);
240 TableBase* getDesktopIconTable (
void);
242 void initializeFromFhicl (
const std::string& fhiclPath);
243 void recursiveInitFromFhiclPSet (
const std::string& tableName,
const fhicl::ParameterSet& pset,
const std::string& recordName =
"",
const std::string& groupName =
"",
const std::string& groupLinkIndex =
"");
244 void recursiveTreeToFhicl (ConfigurationTree node, std::ostream& out, std::string& tabStr, std::string& commentStr,
unsigned int depth = -1);
247 std::string* accumulatedWarnings,
248 std::mutex* threadMutex,
249 std::shared_ptr<std::atomic<bool>> threadDone);
250 static void fillTableThread (ConfigurationInterface* theInterface,
251 std::map<std::string, ots::TableBase *>*nameToTableMap,
253 std::string tableName,
255 std::string* accumulatedWarnings,
256 std::mutex* threadMutex,
257 std::shared_ptr<std::atomic<bool>> threadDone);
261 std::string mfSubject_;
263 std::string username_;
264 ConfigurationInterface* theInterface_;
265 std::shared_ptr<TableGroupKey> theConfigurationTableGroupKey_, theContextTableGroupKey_, theBackboneTableGroupKey_, theIterateTableGroupKey_;
266 std::string theConfigurationTableGroup_, theContextTableGroup_, theBackboneTableGroup_, theIterateTableGroup_;
268 std::map<std::string,
269 std::pair<std::string, TableGroupKey>> lastFailedGroupLoad_;
270 lastGroupLoad_t lastGroupLoad_;
274 std::map<std::string, TableBase*> nameToTableMap_;
276 TableBase groupMetadataTable_;
278 std::string ownerContextUID_;
279 std::string ownerAppUID_;
281 std::mutex metaDataTableMutex_;
std::map< std::string, std::map< std::string, TableVersion > > getVersionAliases(void) const
void loadTableGroup(const std::string &tableGroupName, const TableGroupKey &tableGroupKey, bool doActivate=false, std::map< std::string, TableVersion > *groupMembers=0, ProgressBar *progressBar=0, std::string *accumulateWarnings=0, std::string *groupComment=0, std::string *groupAuthor=0, std::string *groupCreateTime=0, bool doNotLoadMember=false, std::string *groupTypeString=0, std::map< std::string, std::string > *groupAliases=0, ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext=ConfigurationManager::LoadGroupType::ALL_TYPES, bool ignoreVersionTracking=false)
static const unsigned int PROCESSOR_COUNT
Static members.
static const std::string & convertGroupTypeToName(const ConfigurationManager::GroupType &groupTypeId)
void restoreActiveTableGroups(bool throwErrors=false, const std::string &pathToActiveGroupsFile="", ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext=ConfigurationManager::LoadGroupType::ALL_TYPES, std::string *accumulatedWarnings=0)
std::map< std::string, std::pair< std::string, TableGroupKey > > getActiveTableGroups(void) const
std::set< std::string > getOtherSubsystemConfigAliases(const std::string &otherSubsystemUID)
Ignore any System Aliases with "Context" or "Iterat" in the name.
std::chrono::steady_clock::time_point startClockTime_
std::set< std::string > configurationMemberNames_
list of 'active' configuration members
void loadMemberMap(const std::map< std::string, TableVersion > &memberMap, std::string *accumulateWarnings=0)
void dumpActiveConfiguration(const std::string &filePath, const std::string &dumpType, const std::string &configurationAlias, const std::string &logEntry, const std::string &activeUsers, std::ostream &altOut=std::cout)
std::map< std::string, TableVersion > getActiveVersions(void) const
getActiveVersions
ConfigurationManager(bool initForWriteAccess=false, bool initializeFromFhicl=false)
std::shared_ptr< TableGroupKey > makeTheTableGroupKey(TableGroupKey key)
Setters/Modifiers.
void copyTableGroupFromCache(const ConfigurationManager &cacheConfigMgr, const std::map< std::string, TableVersion > &groupMembers, const std::string &configGroupName="", const TableGroupKey &tableGroupKey=TableGroupKey(TableGroupKey::INVALID), bool doActivate=false, bool ignoreVersionTracking=false)
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
const T * getTable(const std::string &tableName) const
static const std::set< std::string > contextMemberNames_
list of context members
void init(std::string *accumulatedErrors=0, bool initForWriteAccess=false, std::string *accumulatedWarnings=0)
std::string getFirstPathToNode(const ConfigurationTree &node, const std::string &startPath="/") const
getFirstPathToNode
static ConfigurationManager::GroupType getTypeOfGroup(const std::map< std::string, TableVersion > &memberMap)
static const std::string & getTypeNameOfGroup(const std::map< std::string, TableVersion > &memberMap)
static const std::set< std::string > backboneMemberNames_
list of backbone members
void destroyTableGroup(const std::string &theGroup="", bool onlyDeactivate=false)
std::vector< std::pair< std::string, ConfigurationTree > > getChildren(std::map< std::string, TableVersion > *memberMap=0, std::string *accumulatedTreeErrors=0) const
std::map< std::string, ConfigurationTree > getChildrenMap(std::map< std::string, TableVersion > *memberMap=0, std::string *accumulatedTreeErrors=0) const
std::pair< std::string, TableGroupKey > getTableGroupFromAlias(std::string systemAlias, ProgressBar *progressBar=0)
Getters.
void getOtherSubsystemConfigAliasInfo(const std::string &otherSubsystemUID, const std::string &configAlias, std::pair< std::string, TableGroupKey > &groupTranslation, std::string &groupComment, std::string &groupAuthor, std::string &groupCreationTime)
returns configAlias translation group info by reference
ConfigurationTree getGatewaySupervisorNode(void) const
There can only be one active Gateway Superivsor app, so find it.
static const std::string ACTIVE_GROUPS_FILENAME
added env check for otsdaq_flatten_active_to_version to function
std::set< std::string > getOtherSubsystemFilteredConfigAliases(const std::string &otherSubsystemUID, const std::string &otherSubsystemFsmName)
Ignore any System Aliases with "Context" or "Iterat" in the name.
static const std::set< std::string > iterateMemberNames_
list of iterate members
TableGroupKey loadConfigurationBackbone(void)
const TableBase * getTableByName(const std::string &configurationName) const
static std::pair< std::string, TableGroupKey > loadGroupNameAndKey(const std::string &fileName, std::string &returnedTimeString)
std::map< std::string, std::pair< std::string, TableGroupKey > > getActiveGroupAliases(void)