You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ma...@apache.org on 2022/11/02 20:19:52 UTC
[nifi] branch main updated: NIFI-10287 ExecuteScript - Allow python scripts to use external modules
This is an automated email from the ASF dual-hosted git repository.
mattyb149 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new f4069ab77a NIFI-10287 ExecuteScript - Allow python scripts to use external modules
f4069ab77a is described below
commit f4069ab77aafbebfd806a17791773a7201fe7404
Author: Nissim Shiman <ns...@yahoo.com>
AuthorDate: Thu Jul 28 13:25:20 2022 +0000
NIFI-10287 ExecuteScript - Allow python scripts to use external modules
Co-authored-by: Nissim Shiman <ns...@yahoo.com>
Co-authored-by: dan-s1 <ds...@gmail.com>
NIFI-10287 changes for code review
NIFI-10287 modification based on reviewer comment
Signed-off-by: Matthew Burgess <ma...@apache.org>
This closes #6254
---
.../nifi/script/ScriptingComponentHelper.java | 6 ++++-
.../nifi/processors/script/TestExecuteJython.java | 26 +++++++++++++++++++
.../test/resources/jython/test_external_module.py | 29 ++++++++++++++++++++++
3 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java
index 1db75bf28d..f11558403a 100644
--- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java
+++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java
@@ -265,7 +265,11 @@ public class ScriptingComponentHelper {
scriptEngineName = context.getProperty(SCRIPT_ENGINE).getValue();
scriptPath = context.getProperty(ScriptingComponentUtils.SCRIPT_FILE).evaluateAttributeExpressions().getValue();
scriptBody = context.getProperty(ScriptingComponentUtils.SCRIPT_BODY).getValue();
- modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources().flattenRecursively();
+ if ("python".equalsIgnoreCase(scriptEngineName)) {
+ modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources();
+ } else {
+ modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources().flattenRecursively();
+ }
}
public void stop() {
diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java
index 4a987d172c..3bc0abc071 100644
--- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java
+++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java
@@ -61,6 +61,32 @@ public class TestExecuteJython extends BaseScriptTest {
result.get(0).assertAttributeEquals("from-content", "test content");
}
+ /**
+ * Tests a Jython script that references an outside python module
+ *
+ */
+ @Test
+ public void testAccessModuleAndStoreInFlowFileAttributeWithScriptBody() {
+ runner.setValidateExpressionUsage(false);
+ runner.setProperty(scriptingComponent.getScriptingComponentHelper().SCRIPT_ENGINE, "python");
+ runner.setProperty(ScriptingComponentUtils.MODULES, "target/test/resources/jython/");
+ runner.setProperty(ScriptingComponentUtils.SCRIPT_BODY,
+ "from org.apache.nifi.processors.script import ExecuteScript\n"
+ + "from test_external_module import ExternalModule\n"
+ + "externalModule = ExternalModule()\n"
+ + "flowFile = session.get()\n"
+ + "flowFile = session.putAttribute(flowFile, \"key\", externalModule.testHelloWorld())\n"
+ + "session.transfer(flowFile, ExecuteScript.REL_SUCCESS)");
+
+ runner.assertValid();
+ runner.enqueue("test content".getBytes(StandardCharsets.UTF_8));
+ runner.run();
+
+ runner.assertAllFlowFilesTransferred(ExecuteScript.REL_SUCCESS, 1);
+ final List<MockFlowFile> result = runner.getFlowFilesForRelationship(ExecuteScript.REL_SUCCESS);
+ result.get(0).assertAttributeEquals("key", "helloWorld");
+ }
+
/**
* Tests a script that does not transfer or remove the original flow file, thereby causing an error during commit.
*
diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py
new file mode 100755
index 0000000000..20c47c590c
--- /dev/null
+++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py
@@ -0,0 +1,29 @@
+#! /usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+class ExternalModule :
+
+ def __init__(self) :
+ pass
+
+ def testHelloWorld(self) :
+ return "helloWorld"
+
+