@@ -159,80 +159,96 @@ def parse_argv(self):
159159 sys .exit ()
160160
161161
162- DB_FACTORY = {
163- 'mongodb' : lambda db_config : MongoDB (db_config ['uri' ], db_config ['db' ], db_config ['collection' ]),
164- 'csv' : lambda db_config : CsvDB (current_path = os .getcwd () if 'directory' not in db_config else db_config ['directory' ],
165- files = [] if 'files' not in db_config else db_config ['files' ]),
166- 'influxdb' : lambda db_config : InfluxDB (db_config ['uri' ], db_config ['port' ], db_config ['db' ]),
167- 'opentsdb' : lambda db_config : OpenTSDB (db_config ['uri' ], db_config ['port' ], db_config ['metric_name' ]),
168- }
169-
170-
171- MODEL_FACTORY = {
172- 'hwpc_report' : HWPCModel (),
173- 'power_report' : PowerModel (),
174- }
175-
176-
177- def generate_pullers (config , report_filter ):
178- # default mode if no input are specified
179- if 'input' not in config :
180- factory = DB_FACTORY ['csv' ]
181- model = HWPCModel ()
182- name = 'csv_puller'
183- db_config = {'files' : ['core.csv' , 'rapl.csv' , 'pcu.csv' ]}
184- puller = PullerActor (name , factory (db_config ), report_filter , model , stream_mode = config ['stream' ],
185- level_logger = config ['verbose' ])
186- return {name : puller }
187-
188- pullers = {}
189- for db_config in config ['input' ]:
190- try :
191- factory = DB_FACTORY [db_config ['type' ]]
192- model = MODEL_FACTORY [db_config ['model' ]]
193- name = db_config ['name' ]
194- puller = PullerActor (name , factory (db_config ), report_filter , model , stream_mode = config ['stream' ],
195- level_logger = config ['verbose' ])
196- pullers [name ] = puller
197- except KeyError as exn :
198- msg = 'CLI error : argument ' + exn .args [0 ]
199- msg += ' needed with --output ' + db_config ['type' ]
200- print (msg , file = sys .stderr )
162+ class Generator :
163+
164+ def __init__ (self , component_group_name ):
165+ self .component_group_name = component_group_name
166+
167+ def generate (self , config ):
168+ if self .component_group_name not in config :
169+ print ('CLI error : no ' + self .component_group_name + ' specified' , file = sys .stderr )
201170 sys .exit ()
202171
203- return pullers
172+ actors = {}
204173
174+ for component_name , component_config in config [self .component_group_name ].items ():
175+ try :
176+ actors [component_config ['name' ]] = self ._gen_actor (component_name , component_config , config )
177+ except KeyError as exn :
178+ msg = 'CLI error : argument ' + exn .args [0 ]
179+ msg += ' needed with --output ' + component_name
180+ print (msg , file = sys .stderr )
181+ sys .exit ()
205182
206- def generate_pushers (config ):
207- # default mode if no output are specified
208- if 'output' not in config :
209- factory = DB_FACTORY ['csv' ]
210- model = PowerModel ()
211- name = 'csv_pusher'
212- pusher = PusherActor (name , model , factory ({}), level_logger = config ['verbose' ])
213- return {name : pusher }
183+ return actors
214184
215- pushers = {}
185+ def _gen_actor (self , component_name , component_config , main_config ):
186+ raise NotImplementedError ()
216187
217- for db_config in config ['output' ]:
218- try :
219- factory = DB_FACTORY [db_config ['type' ]]
220- model = MODEL_FACTORY [db_config ['model' ]]
221- name = db_config ['name' ]
222- pusher = PusherActor (name , model , factory (db_config ), level_logger = config ['verbose' ])
223188
224- pushers [ name ] = pusher
189+ class DBActorGenerator ( Generator ):
225190
191+ def __init__ (self , component_group_name ):
192+ Generator .__init__ (self , component_group_name )
193+ self .model_factory = {
194+ 'hwpc_report' : HWPCModel (),
195+ 'power_report' : PowerModel (),
196+ }
197+
198+ self .db_factory = {
199+ 'mongodb' : lambda db_config : MongoDB (db_config ['uri' ], db_config ['db' ], db_config ['collection' ]),
200+ 'csv' : lambda db_config : CsvDB (current_path = os .getcwd () if 'directory' not in db_config else db_config ['directory' ],
201+ files = [] if 'files' not in db_config else db_config ['files' ]),
202+ 'influxdb' : lambda db_config : InfluxDB (db_config ['uri' ], db_config ['port' ], db_config ['db' ]),
203+ 'opentsdb' : lambda db_config : OpenTSDB (db_config ['uri' ], db_config ['port' ], db_config ['metric_name' ]),
204+ }
205+
206+ def _generate_db (self , db_name , db_config , main_config ):
207+ try :
208+ return self .db_factory [db_name ](db_config )
226209 except KeyError as exn :
227- msg = 'CLI error : '
210+ arg = exn . args [ 0 ]
228211
229- if 'type' not in db_config :
230- msg += 'output type not specified'
212+ # if an argument is missing, look if it exist in another component group
213+ for group_name , group in main_config .items ():
214+ if group_name == self .component_group_name :
215+ pass
231216
232- else :
233- msg += 'argument ' + exn .args [0 ]
234- msg += ' needed with --output ' + db_config ['type' ]
235- print (msg , file = sys .stderr )
236- sys .exit ()
217+ elif not isinstance (group , dict ):
218+ pass
219+
220+ elif db_name not in group :
221+ pass
222+
223+ elif arg in group [db_name ]:
224+ db_config [arg ] = group [db_name ][arg ]
225+ return self ._generate_db (db_name , db_config , main_config )
226+ raise exn
227+
228+ def _gen_actor (self , db_name , db_config , main_config ):
229+ db = self ._generate_db (db_name , db_config , main_config )
230+ model = self .model_factory [db_config ['model' ]]
231+ name = db_config ['name' ]
232+ return self ._actor_factory (name , db , model , main_config ['stream' ], main_config ['verbose' ])
233+
234+ def _actor_factory (self , name , db , model , stream_mode , level_logger ):
235+ raise NotImplementedError ()
236+
237+
238+ class PullerGenerator (DBActorGenerator ):
239+
240+ def __init__ (self , report_filter ):
241+ DBActorGenerator .__init__ (self , 'input' )
242+ self .report_filter = report_filter
243+
244+ def _actor_factory (self , name , db , model , stream_mode , level_logger ):
245+ return PullerActor (name , db , self .report_filter , model , stream_mode , level_logger )
246+
247+
248+ class PusherGenerator (DBActorGenerator ):
249+
250+ def __init__ (self ):
251+ DBActorGenerator .__init__ (self , 'output' )
237252
238- return pushers
253+ def _actor_factory (self , name , db , model , stream_mode , level_logger ):
254+ return PusherActor (name , model , db , level_logger )
0 commit comments