DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
consolidate.py
Go to the documentation of this file.
1from pathlib import Path
2import conffwk
3import sys
4import os
5from logging import getLogger
6from typing import Optional, Tuple
7log = getLogger('daqconf.consolidate')
8
9
10def get_all_includes(db: conffwk.Configuration, file: str) -> list[str]:
11 """
12 Recursively get all includes from an OKS database
13
14 Args:
15 db (conffwk.Configuration): The OKS database to get includes from
16 file (str): The file to get includes from
17
18 Returns:
19 list(str): A list of all includes in the database
20
21 Raises:
22 None
23 """
24 includes = db.get_includes(file)
25 for include in includes:
26 if "data.xml" not in include:
27 continue
28 includes += get_all_includes(db, include)
29
30 return list(set(includes))
31
33 oksfile: str, output_file: str, session_id: Optional[str] = None
34) -> None:
35 """
36 Consolidates a session database files into a single file.
37
38 The consolidated file contains all the schema and data required to define the entire
39 session. If session_id is None, all sessions will be consolidated into the single
40 output file.
41
42 Args:
43 oksfile: OKS file(s) to consolidate
44 output_file: File to output consolidated database to
45 session_id: Name of session, defaults to None
46
47 Returns:
48 None
49
50 Raises:
51 None
52 """
53 log.info(f"Consolidating database into output database '{output_file}'. Input database: '{oksfile}'.")
54
55 sys.setrecursionlimit(10000) # for example
56 db, new_db = create_copy_template(oksfile, output_file)
57
58 if session_id is None:
59 log.debug("Consolidating all dals in %s into %s", oksfile, output_file)
60 consolidate_full(db, new_db)
61 else:
62 log.debug("Consolidating all dals in session %s from %s into %s", session_id, oksfile, output_file)
63
64 consolidate_session(db, new_db, session_id)
65
66
67def create_copy_template(oksfile: str, output_file: str)->Tuple[conffwk.Configuration, conffwk.Configuration]:
68 """
69 Create a blank oks .data.xml template file with all the schema includes of oksfile.
70
71 Args:
72 oksfile: OKS file to copy includes from
73 output_file: OKS file to copy includes into
74
75 Returns:
76 Tuple of old_db, copied_db
77 """
78 log.debug("Reading database")
79 db = conffwk.Configuration("oksconflibs:" + oksfile)
80
81 schemafiles = []
82 includes = get_all_includes(db, None)
83 schemafiles += [i for i in includes if "schema.xml" in i]
84 log.debug(f"Included schemas: {schemafiles}")
85
86 log.debug("Creating new database")
87 new_db = conffwk.Configuration("oksconflibs")
88 new_db.create_db(output_file, schemafiles)
89 new_db.commit()
90
91 return db, new_db
92
93
94def consolidate_full(db: conffwk.Configuration, new_db: conffwk.Configuration)->None:
95 """Consolidates ALL dal objects in db into new_db
96
97 :param db: A conffwk.Configuration containing objects you want to copy over
98 :param new_db: A conffwk.Configuration you want to copy objects into
99 """
100 dal_list = list(db.get_all_dals().values())
101 copy_dals_to_cfg(new_db, dal_list)
102
103def consolidate_session(db: conffwk.Configuration, new_db: conffwk.Configuration, session_id: str)->None:
104 """
105 Consolidates all objects related to the session with id 'session_id' into a single file
106
107 :param db: A conffwk.Configuration containing objects you want to copy over
108 :param new_db: A conffwk.Configuration you want to copy objects into
109 :param session_id: Name of session
110 """
111
112 # Check session exists and load
113 try:
114 dal_session = db.get_dal('Session', session_id)
115 except Exception as e:
116 log.exception(e)
117 raise e
118
119 dal_list = get_relationships(db, dal_session, [])
120 copy_dals_to_cfg(new_db, dal_list)
121
122def get_relationships(db: conffwk.Configuration, current_dal: conffwk.Configuration, dal_list: list[conffwk.Configuration]) -> list[conffwk.Configuration]:
123 '''
124 Recurssively get all objects related to current_dal
125 '''
126 dal_list.append(current_dal)
127
128 for rel in db.relations(current_dal.className(), all=True):
129 rel_obj = getattr(current_dal, rel, None)
130 if rel_obj is None:
131 continue
132
133 if not isinstance(rel_obj, list):
134 rel_obj = [rel_obj]
135
136 for rel_obj in rel_obj:
137 dal_list = get_relationships(db, rel_obj, dal_list)
138
139 return dal_list
140
141
142def copy_dals_to_cfg(new_db: conffwk.Configuration, dal_list: list[conffwk.Configuration]) -> None:
143 '''
144 Copy a list of dals into a configuration
145 '''
146 log.debug("Copying %d objects to new db", len(dal_list))
147 for dal in dal_list:
148 new_db.add_dal(dal)
149
150 log.debug("Saving database")
151 new_db.commit()
152
153
154def copy_configuration(dest_dir : Path, input_files: list[conffwk.Configuration]) -> list[conffwk.Configuration]:
155 if len(input_files) == 0:
156 return []
157
158 log.info(f"Copying configuration represented by databases: \'{input_files}\' to \'{dest_dir}\'")
159 dest_dir = dest_dir.resolve() # Always include by absolute path when copying
160 sys.setrecursionlimit(10000) # for example
161
162 output_dbs = []
163
164 for input_file in input_files:
165 db = conffwk.Configuration("oksconflibs:" + input_file)
166 includes = db.get_includes(None)
167 schemas = [i for i in includes if "schema.xml" in i]
168 dbs = [i for i in includes if "data.xml" in i]
169 newdbs = copy_configuration(dest_dir, dbs)
170
171 output_file = dest_dir / os.path.basename(input_file)
172
173 new_db = conffwk.Configuration("oksconflibs")
174 new_db.create_db(str(output_file), schemas + newdbs)
175 new_db.commit()
176
177 dals = db.get_all_dals()
178
179 for dal in dals:
180 db.get_dal(dals[dal].className(), dals[dal].id)
181 new_db.add_dal(dals[dal])
182
183 new_db.commit()
184 output_dbs.append(str(output_file))
185 log.debug("DONE")
186
187 return output_dbs
188
189
190def consolidate_files(oksfile: str, *input_files) -> None:
191 includes = []
192 dbs = []
193 str_in_files = '\n'.join(input_files)
194 log.info(f"Consolidating {len(input_files)} databases into output database \'{oksfile}\'. Input databases: {str_in_files}")
195 sys.setrecursionlimit(10000) # for example
196
197 for input_file in input_files:
198 dbs.append(conffwk.Configuration("oksconflibs:" + input_file))
199 includes += get_all_includes(dbs[len(dbs) - 1], None)
200
201 includes = list(set(includes))
202 includes = [i for i in includes if i not in input_files]
203 log.debug(f"Included files: {includes}")
204
205 new_db = conffwk.Configuration("oksconflibs")
206 new_db.create_db(oksfile, includes)
207
208 new_db.commit()
209
210 for db in dbs:
211 log.debug(f"Reading dal objects from old db {db}")
212 dals = db.get_all_dals()
213
214 log.debug(f"Copying objects to new db {new_db}")
215 for dal in dals:
216
217 try:
218 new_db.get_dal(dals[dal].className(), dals[dal].id)
219 except:
220 new_db.add_dal(dals[dal])
221 new_db.commit()
222
223 log.debug(f"Saving database {new_db}")
224 new_db.commit()
None consolidate_db(str oksfile, str output_file, Optional[str] session_id=None)
None consolidate_files(str oksfile, *input_files)
None consolidate_session(conffwk.Configuration db, conffwk.Configuration new_db, str session_id)
Tuple[conffwk.Configuration, conffwk.Configuration] create_copy_template(str oksfile, str output_file)
list[str] get_all_includes(conffwk.Configuration db, str file)
list[conffwk.Configuration] copy_configuration(Path dest_dir, list[conffwk.Configuration] input_files)
None copy_dals_to_cfg(conffwk.Configuration new_db, list[conffwk.Configuration] dal_list)
list[conffwk.Configuration] get_relationships(conffwk.Configuration db, conffwk.Configuration current_dal, list[conffwk.Configuration] dal_list)
None consolidate_full(conffwk.Configuration db, conffwk.Configuration new_db)