otsdaq  3.03.00
ConfigurationManager.h
1 #ifndef _ots_ConfigurationManager_h_
2 #define _ots_ConfigurationManager_h_
3 
4 #include <map>
5 #include <mutex>
6 #include <set>
7 #include <string>
8 #include <thread>
9 
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"
14 
15 namespace ots
16 {
17 class ProgressBar;
18 
19 #define __GET_CONFIG__(X) getTable<X>(QUOTE(X))
20 
22 {
25  friend class ConfigurationManagerRW;
26  friend class GatewaySupervisor;
27 
28  public:
29  typedef std::map<std::string,
30  std::pair<std::pair<std::string, TableGroupKey>,
31  std::map<std::string, TableVersion> /* memberMap */
32  >>
33  lastGroupLoad_t;
34 
35  //==============================================================================
37  static const unsigned int PROCESSOR_COUNT;
38 
39  static const std::string READONLY_USER;
40  static const std::string ACTIVE_GROUPS_FILENAME;
41  static const std::string ALIAS_VERSION_PREAMBLE;
42  static const std::string SCRATCH_VERSION_ALIAS;
43 
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;
51 
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;
57 
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;
63 
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;
68 
69  static const std::string CONTEXT_SUBSYSTEM_OPTIONAL_TABLE;
70  static const std::string UNKNOWN_INFO;
71  static const std::string UNKNOWN_TIME;
72 
73  enum class GroupType
74  {
75  UNKNOWN_TYPE,
76  CONTEXT_TYPE,
77  BACKBONE_TYPE,
78  ITERATE_TYPE,
79  CONFIGURATION_TYPE
80  };
81 
82  enum class LoadGroupType
83  {
84  ALL_TYPES,
85  ONLY_BACKBONE_OR_CONTEXT_TYPES,
86  ONLY_BACKBONE_TYPE
87  };
88 
89  // clang-format off
90 
91  static const std::set<std::string>& getFixedContextMemberNames (void);
92  static const std::set<std::string>& getBackboneMemberNames (void);
93  static const std::set<std::string>& getIterateMemberNames (void);
94  const std::set<std::string>& getActiveContextMemberNames (void);
95  const std::set<std::string>& getConfigurationMemberNames (void);
96 
97  static const std::string& convertGroupTypeToName (const ConfigurationManager::GroupType& groupTypeId);
98  static ConfigurationManager::GroupType getTypeOfGroup (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
99  static const std::string& getTypeNameOfGroup (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
100 
101  //==============================================================================
104  ConfigurationManager(bool initForWriteAccess = false,
105  bool initializeFromFhicl = false);
106  virtual ~ConfigurationManager(void);
107 
108 
109 
110  void init (std::string* accumulatedErrors = 0, bool initForWriteAccess = false, std::string* accumulatedWarnings = 0);
111  void destroy (void);
112  void destroyTableGroup (const std::string& theGroup = "", bool onlyDeactivate = false);
113 
114  //==============================================================================
117  std::chrono::steady_clock::time_point startClockTime_, deltaClockTime_;
118  std::string /* sinceStart deltaLastCheck */ runTimeSeconds() {
119 
120  //((double)(clock()-startClockTime_))/CLOCKS_PER_SEC;};
121  std::string retStr =
122  std::to_string(artdaq::TimeUtils::GetElapsedTime(startClockTime_))
123  + "s " +
124  std::to_string(artdaq::TimeUtils::GetElapsedTime(deltaClockTime_)) + "s";
125  deltaClockTime_ = std::chrono::steady_clock::now();
126  return retStr;
127  };
128 
129  void loadTableGroup (
130  const std::string& tableGroupName,
131  const TableGroupKey& tableGroupKey,
132  bool doActivate = false,
133  std::map<std::string, TableVersion>* groupMembers = 0,
134  ProgressBar* progressBar = 0,
135  std::string* accumulateWarnings = 0,
136  std::string* groupComment = 0,
137  std::string* groupAuthor = 0,
138  std::string* groupCreateTime = 0,
139  bool doNotLoadMember = false,
140  std::string* groupTypeString = 0,
141  std::map<std::string /*name*/, std::string /*alias*/>* groupAliases = 0,
142  ConfigurationManager::LoadGroupType groupTypeToLoad = ConfigurationManager::LoadGroupType::ALL_TYPES,
143  bool ignoreVersionTracking = false);
145  const ConfigurationManager& cacheConfigMgr,
146  const std::map<std::string, TableVersion>& groupMembers,
147  const std::string& configGroupName = "",
148  const TableGroupKey& tableGroupKey = TableGroupKey(TableGroupKey::INVALID),
149  bool doActivate = false,
150  bool ignoreVersionTracking = false);
151  std::pair<std::string /* groupName */, TableGroupKey>
152  getGroupOfLoadedTable (const std::string& tableName) const;
153  void loadMemberMap (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap, std::string* accumulateWarnings = 0);
155 
156  //================
159  template<class T>
160  const T* getTable (const std::string& tableName) const
161  {
162  const TableBase* srcPtr = getTableByName(tableName);
163  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;
164  }
165  const TableBase* getTableByName (const std::string& configurationName) const;
166 
167  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);
168  void dumpMacroMakerModeFhicl (void);
169 
170  std::map<std::string /*groupAlias*/,
171  std::pair<std::string /*groupName*/,
175  std::map<std::string /*tableName*/,
176  std::map<std::string /*aliasName*/,
177  TableVersion>> getVersionAliases (void) const;
178  std::pair<std::string /*groupName*/,
179  TableGroupKey> getTableGroupFromAlias (std::string systemAlias, ProgressBar* progressBar = 0);
180  std::map<std::string /*groupType*/,
181  std::pair<std::string /*groupName*/,
182  TableGroupKey>> getActiveTableGroups (void) const;
183  const std::map<std::string /*groupType*/,
184  std::pair<std::string /*groupName*/,
185  TableGroupKey>>& getFailedTableGroups (void) const {return lastFailedGroupLoad_;}
186  const lastGroupLoad_t& getLastTableGroups (void) const {return lastGroupLoad_;}
187  const std::string& getActiveGroupName (const ConfigurationManager::GroupType& type = ConfigurationManager::GroupType::CONFIGURATION_TYPE) const;
188  TableGroupKey getActiveGroupKey (const ConfigurationManager::GroupType& type = ConfigurationManager::GroupType::CONFIGURATION_TYPE) const;
189 
190  ConfigurationTree getNode (const std::string& nodeString, bool doNotThrowOnBrokenUIDLinks = false) const;
191  std::map<std::string, ConfigurationTree>
192  getNodes (const std::string& nodeString) const;
193  ConfigurationTree getContextNode (const std::string& contextUID, const std::string& applicationUID) const;
194  ConfigurationTree getSupervisorNode (const std::string& contextUID, const std::string& applicationUID) const;
195  ConfigurationTree getSupervisorTableNode (const std::string& contextUID, const std::string& applicationUID) const;
196  ConfigurationTree getGatewaySupervisorNode (void) const;
197 
198  std::vector<std::pair<std::string /*childName*/,
199  ConfigurationTree>> getChildren (std::map<std::string, TableVersion>* memberMap = 0, std::string* accumulatedTreeErrors = 0) const;
200  std::map<std::string /*childName*/,
201  ConfigurationTree> getChildrenMap (std::map<std::string, TableVersion>* memberMap = 0, std::string* accumulatedTreeErrors = 0) const;
202  std::string getFirstPathToNode (const ConfigurationTree& node, const std::string& startPath = "/") const;
203 
204  std::map<std::string, TableVersion> getActiveVersions (void) const;
205 
206  const std::string& getOwnerContext (void) { return ownerContextUID_; }
207  const std::string& getOwnerApp (void) { return ownerAppUID_; }
208  bool isOwnerFirstAppInContext (void);
209 
210  std::map<std::string /*groupType*/,
211  std::pair<std::string /*groupName*/,
212  TableGroupKey>> getOtherSubsystemActiveTableGroups (const std::string& otherSubsystemUID, std::string* userDataPathPtr = nullptr, std::string* hostnamePtr = nullptr, std::string* usernamePtr = nullptr);
213  void getOtherSubsystemInstanceInfo (const std::string& otherSubsystemUID, std::string* userDataPathPtr = nullptr, std::string* hostnamePtr = nullptr, std::string* usernamePtr = nullptr, std::string* fullNamePtr = nullptr);
214  std::set<std::string /* configAlias */> getOtherSubsystemConfigAliases (const std::string& otherSubsystemUID);
215  std::set<std::string /* configAlias */> getOtherSubsystemFilteredConfigAliases (const std::string& otherSubsystemUID, const std::string& otherSubsystemFsmName );
216  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);
217 
218  //==============================================================================
220  std::shared_ptr<TableGroupKey> makeTheTableGroupKey (TableGroupKey key);
221  void restoreActiveTableGroups (bool throwErrors = false, const std::string& pathToActiveGroupsFile = "", ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext = ConfigurationManager::LoadGroupType::ALL_TYPES, std::string* accumulatedWarnings = 0);
222 
223  void setOwnerContext (const std::string& contextUID) { ownerContextUID_ = contextUID; }
224  void setOwnerApp (const std::string& appUID) { ownerAppUID_ = appUID; }
225  static void saveGroupNameAndKey (const std::pair<std::string /*group name*/, TableGroupKey>& theGroup,const std::string& fileName, bool appendMode = false);
226  static std::pair<
227  std::string /*group name*/,
228  TableGroupKey> loadGroupNameAndKey (const std::string& fileName, std::string& returnedTimeString);
229 
230 
231  private:
232  ConfigurationManager (const std::string& userName);
233 
234  TableBase* getDesktopIconTable (void);
235 
236  void initializeFromFhicl (const std::string& fhiclPath);
237  void recursiveInitFromFhiclPSet (const std::string& tableName, const fhicl::ParameterSet& pset, const std::string& recordName = "", const std::string& groupName = "", const std::string& groupLinkIndex = "");
238  void recursiveTreeToFhicl (ConfigurationTree node, std::ostream& out, std::string& tabStr, std::string& commentStr, unsigned int depth = -1);
239  static void initTableThread (ConfigurationManager* cfgMgr,
240  ots::TableBase* table,
241  std::string* threadErrors,
242  std::mutex* threadMutex,
243  std::shared_ptr<std::atomic<bool>> threadDone);
244  static void fillTableThread (ConfigurationInterface* theInterface,
245  std::map<std::string, ots::TableBase *>*nameToTableMap,
246  ots::TableBase* table,
247  std::string tableName,
248  ots::TableVersion version,
249  std::string* threadErrors,
250  std::mutex* threadMutex,
251  std::shared_ptr<std::atomic<bool>> threadDone);
252 
253 
254  protected:
255  std::string mfSubject_;
256  private:
257  std::string username_;
258  ConfigurationInterface* theInterface_;
259  std::shared_ptr<TableGroupKey> theConfigurationTableGroupKey_, theContextTableGroupKey_, theBackboneTableGroupKey_, theIterateTableGroupKey_;
260  std::string theConfigurationTableGroup_, theContextTableGroup_, theBackboneTableGroup_, theIterateTableGroup_;
261 
262  std::map<std::string,
263  std::pair<std::string, TableGroupKey>> lastFailedGroupLoad_;
264  lastGroupLoad_t lastGroupLoad_;
265 
266 
267 
268  std::map<std::string, TableBase*> nameToTableMap_;
269 
270  TableBase groupMetadataTable_;
271 
272  std::string ownerContextUID_;
273  std::string ownerAppUID_;
274 
275  std::mutex metaDataTableMutex_;
276 
277  static const std::set<std::string>
278  fixedContextMemberNames_;
279  static const std::set<std::string>
280  backboneMemberNames_;
281  static const std::set<std::string> iterateMemberNames_;
282  std::set<std::string> contextMemberNames_,
283  configurationMemberNames_;
284 
285  // clang-format on
286 };
287 } // namespace ots
288 
289 #endif
std::map< std::string, std::map< std::string, TableVersion > > getVersionAliases(void) const
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_
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)
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 groupTypeToLoad=ConfigurationManager::LoadGroupType::ALL_TYPES, bool ignoreVersionTracking=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
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)
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.
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)