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::set<std::string> contextMemberNames_;
70  static const std::set<std::string>
72  static const std::set<std::string> iterateMemberNames_;
73  std::set<std::string>
75 
76  static const std::string CONTEXT_SUBSYSTEM_OPTIONAL_TABLE;
77  static const std::string UNKNOWN_INFO;
78  static const std::string UNKNOWN_TIME;
79 
80  enum class GroupType
81  {
82  UNKNOWN_TYPE,
83  CONTEXT_TYPE,
84  BACKBONE_TYPE,
85  ITERATE_TYPE,
86  CONFIGURATION_TYPE
87  };
88 
89  enum class LoadGroupType
90  {
91  ALL_TYPES,
92  ONLY_BACKBONE_OR_CONTEXT_TYPES,
93  ONLY_BACKBONE_TYPE
94  };
95 
96  // clang-format off
97 
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);
102 
103  static const std::string& convertGroupTypeToName (const ConfigurationManager::GroupType& groupTypeId);
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);
106 
107  //==============================================================================
110  ConfigurationManager(bool initForWriteAccess = false,
111  bool initializeFromFhicl = false);
112  virtual ~ConfigurationManager(void);
113 
114 
115 
116  void init (std::string* accumulatedErrors = 0, bool initForWriteAccess = false, std::string* accumulatedWarnings = 0);
117  void destroy (void);
118  void destroyTableGroup (const std::string& theGroup = "", bool onlyDeactivate = false);
119 
120  //==============================================================================
123  std::chrono::steady_clock::time_point startClockTime_, deltaClockTime_;
124  std::string /* sinceStart deltaLastCheck */ runTimeSeconds() {
125 
126  //((double)(clock()-startClockTime_))/CLOCKS_PER_SEC;};
127  std::string retStr =
128  std::to_string(artdaq::TimeUtils::GetElapsedTime(startClockTime_))
129  + "s " +
130  std::to_string(artdaq::TimeUtils::GetElapsedTime(deltaClockTime_)) + "s";
131  deltaClockTime_ = std::chrono::steady_clock::now();
132  return retStr;
133  };
134 
135  void loadTableGroup (
136  const std::string& tableGroupName,
137  const TableGroupKey& tableGroupKey,
138  bool doActivate = false,
139  std::map<std::string, TableVersion>* groupMembers = 0,
140  ProgressBar* progressBar = 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);
151  const ConfigurationManager& cacheConfigMgr,
152  const std::map<std::string, TableVersion>& groupMembers,
153  const std::string& configGroupName = "",
154  const TableGroupKey& tableGroupKey = TableGroupKey(TableGroupKey::INVALID),
155  bool doActivate = false,
156  bool ignoreVersionTracking = false);
157  std::pair<std::string /* groupName */, TableGroupKey>
158  getGroupOfLoadedTable (const std::string& tableName) const;
159  void loadMemberMap (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap, std::string* accumulateWarnings = 0);
161 
162  //================
165  template<class T>
166  const T* getTable (const std::string& tableName) const
167  {
168  const TableBase* srcPtr = getTableByName(tableName);
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;
170  }
171  const TableBase* getTableByName (const std::string& configurationName) const;
172 
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);
175 
176  std::map<std::string /*groupAlias*/,
177  std::pair<std::string /*groupName*/,
181  std::map<std::string /*tableName*/,
182  std::map<std::string /*aliasName*/,
183  TableVersion>> getVersionAliases (void) const;
184  std::pair<std::string /*groupName*/,
185  TableGroupKey> getTableGroupFromAlias (std::string systemAlias, ProgressBar* progressBar = 0);
186  std::map<std::string /*groupType*/,
187  std::pair<std::string /*groupName*/,
188  TableGroupKey>> getActiveTableGroups (void) const;
189  const std::map<std::string /*groupType*/,
190  std::pair<std::string /*groupName*/,
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;
195 
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;
202  ConfigurationTree getGatewaySupervisorNode (void) const;
203 
204  std::vector<std::pair<std::string /*childName*/,
205  ConfigurationTree>> getChildren (std::map<std::string, TableVersion>* memberMap = 0, std::string* accumulatedTreeErrors = 0) const;
206  std::map<std::string /*childName*/,
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;
209 
210  std::map<std::string, TableVersion> getActiveVersions (void) const;
211 
212  const std::string& getOwnerContext (void) { return ownerContextUID_; }
213  const std::string& getOwnerApp (void) { return ownerAppUID_; }
214  bool isOwnerFirstAppInContext (void);
215 
216  std::map<std::string /*groupType*/,
217  std::pair<std::string /*groupName*/,
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);
220  std::set<std::string /* configAlias */> getOtherSubsystemConfigAliases (const std::string& otherSubsystemUID);
221  std::set<std::string /* configAlias */> getOtherSubsystemFilteredConfigAliases (const std::string& otherSubsystemUID, const std::string& otherSubsystemFsmName );
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);
223 
224  //==============================================================================
226  std::shared_ptr<TableGroupKey> makeTheTableGroupKey (TableGroupKey key);
227  void restoreActiveTableGroups (bool throwErrors = false, const std::string& pathToActiveGroupsFile = "", ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext = ConfigurationManager::LoadGroupType::ALL_TYPES, std::string* accumulatedWarnings = 0);
228 
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);
232  static std::pair<
233  std::string /*group name*/,
234  TableGroupKey> loadGroupNameAndKey (const std::string& fileName, std::string& returnedTimeString);
235 
236 
237  private:
238  ConfigurationManager (const std::string& userName);
239 
240  TableBase* getDesktopIconTable (void);
241 
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);
245  static void initTableThread (ConfigurationManager* cfgMgr,
246  ots::TableBase* table,
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,
252  ots::TableBase* table,
253  std::string tableName,
254  ots::TableVersion version,
255  std::string* accumulatedWarnings,
256  std::mutex* threadMutex,
257  std::shared_ptr<std::atomic<bool>> threadDone);
258 
259 
260  protected:
261  std::string mfSubject_;
262  private:
263  std::string username_;
264  ConfigurationInterface* theInterface_;
265  std::shared_ptr<TableGroupKey> theConfigurationTableGroupKey_, theContextTableGroupKey_, theBackboneTableGroupKey_, theIterateTableGroupKey_;
266  std::string theConfigurationTableGroup_, theContextTableGroup_, theBackboneTableGroup_, theIterateTableGroup_;
267 
268  std::map<std::string,
269  std::pair<std::string, TableGroupKey>> lastFailedGroupLoad_;
270  lastGroupLoad_t lastGroupLoad_;
271 
272 
273 
274  std::map<std::string, TableBase*> nameToTableMap_;
275 
276  TableBase groupMetadataTable_;
277 
278  std::string ownerContextUID_;
279  std::string ownerAppUID_;
280 
281  std::mutex metaDataTableMutex_;
282 
283  // clang-format on
284 };
285 } // namespace ots
286 
287 #endif
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)