mirror of https://github.com/apache/nifi.git
NIFI-13394 Check candidate directory for python command
This closes #8961 Signed-off-by: David Handermann <exceptionfactory@apache.org>
This commit is contained in:
parent
039cd2f18a
commit
d25efb385c
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.apache.nifi.py4j;
|
package org.apache.nifi.py4j;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.apache.nifi.logging.LogLevel;
|
import org.apache.nifi.logging.LogLevel;
|
||||||
import org.apache.nifi.py4j.client.JavaObjectBindings;
|
import org.apache.nifi.py4j.client.JavaObjectBindings;
|
||||||
import org.apache.nifi.py4j.client.NiFiPythonGateway;
|
import org.apache.nifi.py4j.client.NiFiPythonGateway;
|
||||||
|
@ -302,14 +303,22 @@ public class PythonProcess {
|
||||||
} else if (virtualEnvDirectories.length == 1) {
|
} else if (virtualEnvDirectories.length == 1) {
|
||||||
commandExecutableDirectory = virtualEnvDirectories[0].getName();
|
commandExecutableDirectory = virtualEnvDirectories[0].getName();
|
||||||
} else {
|
} else {
|
||||||
// Default to bin directory for macOS and Linux
|
commandExecutableDirectory = findExecutableDirectory(pythonCmd, virtualEnvDirectories);
|
||||||
commandExecutableDirectory = "bin";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final File pythonCommandFile = new File(virtualEnvHome, commandExecutableDirectory + File.separator + pythonCmd);
|
final File pythonCommandFile = new File(virtualEnvHome, commandExecutableDirectory + File.separator + pythonCmd);
|
||||||
return pythonCommandFile.getAbsolutePath();
|
return pythonCommandFile.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String findExecutableDirectory(final String pythonCmd, final File[] virtualEnvDirectories) throws IOException {
|
||||||
|
// Check for python command.
|
||||||
|
return List.of(virtualEnvDirectories)
|
||||||
|
.stream()
|
||||||
|
.filter(file -> ArrayUtils.isNotEmpty(file.list((dir, name) -> name.startsWith(pythonCmd))))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(() -> new IOException("Failed to find Python command [%s]".formatted(pythonCmd)))
|
||||||
|
.getName();
|
||||||
|
}
|
||||||
|
|
||||||
private void setupEnvironment() throws IOException {
|
private void setupEnvironment() throws IOException {
|
||||||
// Environment creation is only necessary if using PIP. Otherwise, the Process requires no outside dependencies, other than those
|
// Environment creation is only necessary if using PIP. Otherwise, the Process requires no outside dependencies, other than those
|
||||||
|
|
|
@ -91,17 +91,32 @@ class PythonProcessTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testResolvePythonCommandPreferBin() throws IOException {
|
void testResolvePythonCommandFindCommand() throws IOException {
|
||||||
|
final File binDir = new File(virtualEnvHome, UNIX_BIN_DIR);
|
||||||
|
assertTrue(binDir.mkdir());
|
||||||
|
final File scriptsDir = new File(virtualEnvHome, WINDOWS_SCRIPTS_DIR);
|
||||||
|
assertTrue(scriptsDir.mkdir());
|
||||||
|
|
||||||
|
final File fakeWindowsPythonExe = new File(scriptsDir, PYTHON_CMD + ".exe");
|
||||||
|
assertTrue(fakeWindowsPythonExe.createNewFile());
|
||||||
|
|
||||||
|
when(pythonProcessConfig.getPythonCommand()).thenReturn(PYTHON_CMD);
|
||||||
|
final String result = this.pythonProcess.resolvePythonCommand();
|
||||||
|
|
||||||
|
final String expected = getExpectedBinaryPath(WINDOWS_SCRIPTS_DIR);
|
||||||
|
assertEquals(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testResolvePythonCommandFindCommandMissingPythonCmd() throws IOException {
|
||||||
final File binDir = new File(virtualEnvHome, UNIX_BIN_DIR);
|
final File binDir = new File(virtualEnvHome, UNIX_BIN_DIR);
|
||||||
assertTrue(binDir.mkdir());
|
assertTrue(binDir.mkdir());
|
||||||
final File scriptsDir = new File(virtualEnvHome, WINDOWS_SCRIPTS_DIR);
|
final File scriptsDir = new File(virtualEnvHome, WINDOWS_SCRIPTS_DIR);
|
||||||
assertTrue(scriptsDir.mkdir());
|
assertTrue(scriptsDir.mkdir());
|
||||||
|
|
||||||
when(pythonProcessConfig.getPythonCommand()).thenReturn(PYTHON_CMD);
|
when(pythonProcessConfig.getPythonCommand()).thenReturn(PYTHON_CMD);
|
||||||
final String result = this.pythonProcess.resolvePythonCommand();
|
|
||||||
|
|
||||||
final String expected = getExpectedBinaryPath(UNIX_BIN_DIR);
|
assertThrows(IOException.class, () -> this.pythonProcess.resolvePythonCommand());
|
||||||
assertEquals(expected, result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue