@@ -159,72 +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- }
162+ class Generator :
169163
164+ def __init__ (self , component_group_name ):
165+ self .component_group_name = component_group_name
170166
171- MODEL_FACTORY = {
172- 'hwpc_report' : HWPCModel (),
173- 'power_report' : PowerModel (),
174- }
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 )
170+ sys . exit ()
175171
172+ actors = {}
173+
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 ()
182+
183+ return actors
184+
185+ def _gen_actor (self , component_name , component_config , main_config ):
186+ raise NotImplementedError ()
176187
177- def generate_pullers (config , report_filter ):
178- # default mode if no input are specified
179- if 'input' not in config :
180- print ('CLI error : no input specified' , file = sys .stderr )
181- sys .exit ()
182188
183- pullers = {}
184- for db_config in config ['input' ]:
189+ class DBActorGenerator (Generator ):
190+
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 ):
185207 try :
186- factory = DB_FACTORY [db_config ['type' ]]
187- model = MODEL_FACTORY [db_config ['model' ]]
188- name = db_config ['name' ]
189- puller = PullerActor (name , factory (db_config ), report_filter , model , stream_mode = config ['stream' ],
190- level_logger = config ['verbose' ])
191- pullers [name ] = puller
208+ return self .db_factory [db_name ](db_config )
192209 except KeyError as exn :
193- msg = 'CLI error : argument ' + exn .args [0 ]
194- msg += ' needed with --output ' + db_config ['type' ]
195- print (msg , file = sys .stderr )
196- sys .exit ()
210+ arg = exn .args [0 ]
197211
198- return pullers
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
199216
217+ elif not isinstance (group , dict ):
218+ pass
200219
201- def generate_pushers (config ):
202- # default mode if no output are specified
203- if 'output' not in config :
204- print ('CLI error : no output specified' , file = sys .stderr )
205- sys .exit ()
220+ elif db_name not in group :
221+ pass
206222
207- pushers = {}
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
208227
209- for db_config in config ['output' ]:
210- try :
211- factory = DB_FACTORY [db_config ['type' ]]
212- model = MODEL_FACTORY [db_config ['model' ]]
213- name = db_config ['name' ]
214- pusher = PusherActor (name , model , factory (db_config ), level_logger = config ['verbose' ])
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' ])
215233
216- pushers [name ] = pusher
234+ def _actor_factory (self , name , db , model , stream_mode , level_logger ):
235+ raise NotImplementedError ()
217236
218- except KeyError as exn :
219- msg = 'CLI error : '
220237
221- if 'type' not in db_config :
222- msg += 'output type not specified'
238+ class PullerGenerator (DBActorGenerator ):
223239
224- else :
225- msg += 'argument ' + exn .args [0 ]
226- msg += ' needed with --output ' + db_config ['type' ]
227- print (msg , file = sys .stderr )
228- sys .exit ()
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' )
229252
230- 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