3535from powerapi .exception import PowerAPIException , ModelNameAlreadyUsed , DatabaseNameDoesNotExist , ModelNameDoesNotExist , \
3636 DatabaseNameAlreadyUsed , ProcessorTypeDoesNotExist , ProcessorTypeAlreadyUsed
3737from powerapi .filter import ReportFilter
38- from powerapi .processor .pre .k8s import K8sPreProcessorActor , K8sProcessorConfig
39- from powerapi .processor .pre .openstack import OpenStackPreProcessorActor
4038from powerapi .processor .processor_actor import ProcessorActor
4139from powerapi .puller import PullerActor
4240from powerapi .pusher import PusherActor
@@ -375,14 +373,13 @@ class ProcessorGenerator(Generator):
375373 Generator that initializes the processor actor(s) from the configuration.
376374 """
377375
378- def __init__ (self , component_group_name : str , processor_factory : dict [ str , Callable [[ dict ], ProcessorActor ]] ):
376+ def __init__ (self , component_group_name : str ):
379377 """
380378 :param component_group_name: Name of the component group
381- :param processor_factory: Dictionary mapping processor type to actor factory
382379 """
383380 super ().__init__ (component_group_name )
384381
385- self .processor_factory = processor_factory
382+ self .processor_factory : dict [ str , Callable [[ dict ], ProcessorActor ]] = {}
386383
387384 def remove_processor_factory (self , processor_type : str ) -> None :
388385 """
@@ -405,6 +402,14 @@ def add_processor_factory(self, processor_type: str, processor_factory_function:
405402
406403 self .processor_factory [processor_type ] = processor_factory_function
407404
405+ def _generate_processor (self , processor_name : str , component_config : dict ) -> ProcessorActor :
406+ try :
407+ return self .processor_factory [processor_name ](component_config )
408+ except KeyError as exn :
409+ raise PowerAPIException ('Configuration error: Invalid processor type: %s' , processor_name ) from exn
410+ except ImportError as exn :
411+ raise PowerAPIException ('Dependencies for %s processor are not installed' , processor_name ) from exn
412+
408413 def _gen_actor (self , component_config : dict , main_config : dict , component_name : str ) -> ProcessorActor :
409414 """
410415 Helper method to generate a processor actor from the given configuration.
@@ -414,12 +419,9 @@ def _gen_actor(self, component_config: dict, main_config: dict, component_name:
414419 :return: Processor actor
415420 """
416421 processor_actor_type = component_config [COMPONENT_TYPE_KEY ]
417- if processor_actor_type not in self .processor_factory :
418- raise PowerAPIException (f'Configuration error: Unknown processor actor type: { processor_actor_type } ' )
419-
420422 component_config [ACTOR_NAME_KEY ] = component_name
421423 component_config [GENERAL_CONF_VERBOSE_KEY ] = main_config [GENERAL_CONF_VERBOSE_KEY ]
422- return self .processor_factory [ processor_actor_type ]( component_config )
424+ return self ._generate_processor ( processor_actor_type , component_config )
423425
424426
425427class PreProcessorGenerator (ProcessorGenerator ):
@@ -428,39 +430,35 @@ class PreProcessorGenerator(ProcessorGenerator):
428430 """
429431
430432 def __init__ (self ):
431- super ().__init__ ('pre-processor' , self ._get_default_processor_factories ())
433+ super ().__init__ ('pre-processor' )
434+
435+ self .add_processor_factory ('k8s' , self ._k8s_pre_processor_factory )
436+ self .add_processor_factory ('openstack' , self ._openstack_pre_processor_factory )
432437
433438 @staticmethod
434- def _k8s_pre_processor_factory (processor_config : dict ) -> K8sPreProcessorActor :
439+ def _k8s_pre_processor_factory (processor_config : dict ) -> ProcessorActor :
435440 """
436441 Kubernetes pre-processor actor factory.
437442 :param processor_config: Pre-Processor configuration
438443 :return: Configured Kubernetes pre-processor actor
439444 """
445+ from powerapi .processor .pre .k8s .actor import K8sPreProcessorActor , K8sProcessorConfig
440446 name = processor_config [ACTOR_NAME_KEY ]
441- api_mode = processor_config . get ( K8S_API_MODE_KEY , 'manual' ) # use manual mode by default
447+ api_mode = processor_config [ K8S_API_MODE_KEY ]
442448 api_host = processor_config .get (K8S_API_HOST_KEY , None )
443449 api_key = processor_config .get (K8S_API_KEY_KEY , None )
444450 level_logger = logging .DEBUG if processor_config [GENERAL_CONF_VERBOSE_KEY ] else logging .INFO
445451 config = K8sProcessorConfig (api_mode , api_host , api_key )
446452 return K8sPreProcessorActor (name , config , level_logger )
447453
448454 @staticmethod
449- def _openstack_pre_processor_factory (processor_config : dict ) -> OpenStackPreProcessorActor :
455+ def _openstack_pre_processor_factory (processor_config : dict ) -> ProcessorActor :
450456 """
451457 Openstack pre-processor actor factory.
452458 :param processor_config: Pre-Processor configuration
453459 :return: Configured OpenStack pre-processor actor
454460 """
461+ from powerapi .processor .pre .openstack .actor import OpenStackPreProcessorActor
455462 name = processor_config [ACTOR_NAME_KEY ]
456463 level_logger = logging .DEBUG if processor_config [GENERAL_CONF_VERBOSE_KEY ] else logging .INFO
457464 return OpenStackPreProcessorActor (name , level_logger )
458-
459- def _get_default_processor_factories (self ) -> dict [str , Callable [[dict ], ProcessorActor ]]:
460- """
461- Return the default pre-processors factory.
462- """
463- return {
464- 'k8s' : self ._k8s_pre_processor_factory ,
465- 'openstack' : self ._openstack_pre_processor_factory
466- }
0 commit comments