[ 
https://issues.apache.org/jira/browse/NIFI-14368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julien Ledoux updated NIFI-14368:
---------------------------------
    Affects Version/s: 2.6.0
                       2.5.0
                       2.4.0

> Python Processor can not use parent class properties as PropertyDependency
> --------------------------------------------------------------------------
>
>                 Key: NIFI-14368
>                 URL: https://issues.apache.org/jira/browse/NIFI-14368
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: 2.1.0, 2.2.0, 2.3.0, 2.4.0, 2.5.0, 2.6.0
>         Environment: Official Docker Images NiFi 2.x running on Ubuntu 
> 22.04.4 LTS and Docker v27.0.3
>            Reporter: Julien Ledoux
>            Priority: Blocker
>              Labels: extensions, python
>         Attachments: debug_inheritance.zip
>
>
> When using a Python parent class (multiple inheritance) to store common 
> properties and methods for a collection processors, it is not possible to use 
> parent class properties as a PropertyDependency in its child classes.
> This approach worked correctly in NiFi versions 2.0.0-M4 and 2.0.0. However, 
> starting with NiFi 2.1.0, referencing a parent class property as a 
> PropertyDependency causes a crash of the processors using this pattern.
> Here is the error message from 2.3.0 version:
> {code:java}
> 2025-03-14 14:06:52,561 ERROR [python-log-344] py4j.java_gateway There was an 
> exception while executing the Python Proxy on the Python Side.Traceback (most 
> recent call last):  File 
> "/opt/nifi/nifi-current/python/framework/py4j/java_gateway.py", line 2506, in 
> _call_proxy    return_value = getattr(self.pool[obj_id], method)(*params)     
>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/./python/framework/Controller.py", line 77, in 
> reloadProcessor    self.extensionManager.reload_processor(processorType, 
> version, workDirectory)  File 
> "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 135, in 
> reload_processor    self.__gather_extension_details(module_file, 
> extension_home, dependencies_bundled, work_dir)  File 
> "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 239, in 
> __gather_extension_details    classes_and_details = 
> self.__get_processor_classes_and_details(module_file, extension_home, 
> dependencies_bundled)                          
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 
> 269, in __get_processor_classes_and_details    details = 
> ProcessorInspection.get_processor_details(class_node, module_file, 
> extension_home, dependencies_bundled=dependencies_bundled)              
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 
> 154, in get_processor_details    property_descriptions = 
> get_property_descriptions(class_node, module_string_constants)                
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
> File "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 
> 288, in get_property_descriptions    visitor.visit(class_node)  File 
> "/usr/lib/python3.11/ast.py", line 418, in visit    return visitor(node)      
>      ^^^^^^^^^^^^^  File "/usr/lib/python3.11/ast.py", line 426, in 
> generic_visit    self.visit(item)  File "/usr/lib/python3.11/ast.py", line 
> 418, in visit    return visitor(node)           ^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 94, in 
> visit_Assign    value = self.resolve_dependencies(keyword.value)            
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 61, in 
> resolve_dependencies    variable_name = dependency.args[0].id                 
>    ^^^^^^^^^^^^^^^^^^^^^AttributeError: 'Attribute' object has no attribute 
> 'id'2025-03-14 14:06:52,564 WARN [Validate Components Thread-3] 
> o.a.n.p.processor.FlowFileSourceProxy 
> PythonProcessor[type=AnotherFlowFileSourceProcessor, 
> id=9453f6c2-0195-1000-0d8a-2de7d7b09bca] Failed to perform validation for 
> Python Processor PythonProcessor[type=AnotherFlowFileSourceProcessor, 
> id=9453f6c2-0195-1000-0d8a-2de7d7b09bca]; assuming invalidpy4j.Py4JException: 
> An exception was raised by the Python Proxy. Return Message: Traceback (most 
> recent call last):  File 
> "/opt/nifi/nifi-current/python/framework/py4j/java_gateway.py", line 2506, in 
> _call_proxy    return_value = getattr(self.pool[obj_id], method)(*params)     
>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/./python/framework/Controller.py", line 77, in 
> reloadProcessor    self.extensionManager.reload_processor(processorType, 
> version, workDirectory)  File 
> "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 135, in 
> reload_processor    self.__gather_extension_details(module_file, 
> extension_home, dependencies_bundled, work_dir)  File 
> "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 239, in 
> __gather_extension_details    classes_and_details = 
> self.__get_processor_classes_and_details(module_file, extension_home, 
> dependencies_bundled)                          
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/opt/nifi/nifi-current/python/framework/ExtensionManager.py", line 
> 269, in __get_processor_classes_and_details    details = 
> ProcessorInspection.get_processor_details(class_node, module_file, 
> extension_home, dependencies_bundled=dependencies_bundled)              
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 
> 154, in get_processor_details    property_descriptions = 
> get_property_descriptions(class_node, module_string_constants)                
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
> File "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 
> 288, in get_property_descriptions    visitor.visit(class_node)  File 
> "/usr/lib/python3.11/ast.py", line 418, in visit    return visitor(node)      
>      ^^^^^^^^^^^^^  File "/usr/lib/python3.11/ast.py", line 426, in 
> generic_visit    self.visit(item)  File "/usr/lib/python3.11/ast.py", line 
> 418, in visit    return visitor(node)           ^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 94, in 
> visit_Assign    value = self.resolve_dependencies(keyword.value)            
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File 
> "/opt/nifi/nifi-current/python/framework/ProcessorInspection.py", line 61, in 
> resolve_dependencies    variable_name = dependency.args[0].id                 
>    ^^^^^^^^^^^^^^^^^^^^^AttributeError: 'Attribute' object has no attribute 
> 'id'
>       at py4j.Protocol.getReturnValue(Protocol.java:476)      at 
> org.apache.nifi.py4j.client.PythonProxyInvocationHandler.invoke(PythonProxyInvocationHandler.java:87)
>         at jdk.proxy6/jdk.proxy6.$Proxy109.reloadProcessor(Unknown Source)    
>   at 
> org.apache.nifi.py4j.StandardPythonProcessorBridge.reload(StandardPythonProcessorBridge.java:186)
>     at 
> org.apache.nifi.python.processor.PythonProcessorProxy.reload(PythonProcessorProxy.java:357)
>   at 
> org.apache.nifi.python.processor.PythonProcessorProxy.customValidate(PythonProcessorProxy.java:199)
>   at 
> org.apache.nifi.components.AbstractConfigurableComponent.validate(AbstractConfigurableComponent.java:130)
>     at 
> org.apache.nifi.controller.AbstractComponentNode.computeValidationErrors(AbstractComponentNode.java:912)
>      at 
> org.apache.nifi.controller.StandardProcessorNode.computeValidationErrors(StandardProcessorNode.java:1054)
>     at 
> org.apache.nifi.controller.AbstractComponentNode.performValidation(AbstractComponentNode.java:847)
>    at 
> org.apache.nifi.controller.AbstractComponentNode.performValidation(AbstractComponentNode.java:861)
>    at 
> org.apache.nifi.components.validation.StandardValidationTrigger.trigger(StandardValidationTrigger.java:52)
>    at 
> org.apache.nifi.components.validation.TriggerValidationTask.run(TriggerValidationTask.java:58)
>        at 
> org.apache.nifi.engine.FlowEngine.lambda$wrap$1(FlowEngine.java:105) at 
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
>     at 
> java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)   
> at 
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
>      at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
>     at java.base/java.lang.Thread.run(Thread.java:1583) {code}
> Because of this issue, upgrades beyond NiFi 2.0.0 are blocked for anyone 
> relying on this inheritance pattern. 
> I've attached a simple processor structure that uses such pattern : 
> [^debug_inheritance.zip]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to