NIFI-10287 ExecuteScript - Allow python scripts to use external modules

Co-authored-by: Nissim Shiman <nshiman@yahoo.com>
Co-authored-by: dan-s1 <dstieg1@gmail.com>

NIFI-10287 changes for code review

NIFI-10287 modification based on reviewer comment

Signed-off-by: Matthew Burgess <mattyb149@apache.org>

This closes #6254
This commit is contained in:
Nissim Shiman 2022-07-28 13:25:20 +00:00 committed by Matthew Burgess
parent 2afe2b36b9
commit f4069ab77a
No known key found for this signature in database
GPG Key ID: 05D3DEB8126DAD24
3 changed files with 60 additions and 1 deletions

View File

@ -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() {

View File

@ -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.
*

View File

@ -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"