diff --git a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java index 824c1db63ff29cda15c679f198b71da24024f012..842da22f176d5301fba5ef6d8481761e198b67dd 100644 --- a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java +++ b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java @@ -632,9 +632,11 @@ public class FunctionConfigUtils { } else if (functionConfig.getRuntime() == FunctionConfig.Runtime.GO) { doGolangChecks(functionConfig); return null; - } else { + } else if (functionConfig.getRuntime() == FunctionConfig.Runtime.PYTHON){ doPythonChecks(functionConfig); return null; + } else { + throw new IllegalArgumentException("Function language runtime is either not set or cannot be determined"); } } diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java index 4bb08c17ace9feecb22615b746a21c370457ea77..e5df566a5a18e6ad90f39ce1db71162e6dc42133 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java @@ -1533,6 +1533,31 @@ public class FunctionApiV3ResourceTest { resource.registerFunction(actualTenant, actualNamespace, actualName, null, null, filePackageUrl, functionConfig, null, null); } + @Test(expectedExceptions = RestException.class, expectedExceptionsMessageRegExp = "Function language runtime is either not set or cannot be determined") + public void testCreateFunctionWithoutSettingRuntime() { + Configurator.setRootLevel(Level.DEBUG); + + String fileLocation = FutureUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + String filePackageUrl = "file://" + fileLocation; + when(mockedManager.containsFunction(eq(tenant), eq(namespace), eq(function))).thenReturn(false); + + RequestResult rr = new RequestResult().setSuccess(true).setMessage("function registered"); + CompletableFuture requestResult = CompletableFuture.completedFuture(rr); + when(mockedManager.updateFunction(any(FunctionMetaData.class))).thenReturn(requestResult); + + FunctionConfig functionConfig = new FunctionConfig(); + functionConfig.setTenant(tenant); + functionConfig.setNamespace(namespace); + functionConfig.setName(function); + functionConfig.setClassName(className); + functionConfig.setParallelism(parallelism); + functionConfig.setCustomSerdeInputs(topicsToSerDeClassName); + functionConfig.setOutput(outputTopic); + functionConfig.setOutputSerdeClassName(outputSerdeClassName); + resource.registerFunction(tenant, namespace, function, null, null, filePackageUrl, functionConfig, null, null); + + } + public static FunctionConfig createDefaultFunctionConfig() { FunctionConfig functionConfig = new FunctionConfig(); functionConfig.setTenant(tenant);