You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ni...@apache.org on 2022/06/16 09:56:14 UTC

[pulsar] branch master updated: [improve][admin] Add option function-type to admin CLI for Functions (#16075)

This is an automated email from the ASF dual-hosted git repository.

nicoloboschi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new eb2a8703d40 [improve][admin] Add option function-type to admin CLI for Functions (#16075)
eb2a8703d40 is described below

commit eb2a8703d403f932f2e340bb777fcfb09ea6e1da
Author: Christophe Bornet <cb...@hotmail.com>
AuthorDate: Thu Jun 16 11:56:03 2022 +0200

    [improve][admin] Add option function-type to admin CLI for Functions (#16075)
    
    This option can be used as an alternative to the --jar option to create a built-in Function.
    This is the equivalent of the --sink-type/--source-type options of connectors for Functions
---
 .../org/apache/pulsar/common/functions/FunctionConfig.java   |  1 +
 .../java/org/apache/pulsar/admin/cli/CmdFunctionsTest.java   | 12 ++++--------
 .../main/java/org/apache/pulsar/admin/cli/CmdFunctions.java  | 12 ++++++++++++
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java
index 0fe539f491e..527c954110d 100644
--- a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java
+++ b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java
@@ -114,6 +114,7 @@ public class FunctionConfig {
     private String jar;
     private String py;
     private String go;
+    private String functionType;
     // Whether the subscriptions the functions created/used should be deleted when the functions is deleted
     private Boolean cleanupSubscription;
     // This is an arbitrary string that can be interpreted by the function runtime
diff --git a/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/CmdFunctionsTest.java b/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/CmdFunctionsTest.java
index faa94ebef5a..e98894e9c65 100644
--- a/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/CmdFunctionsTest.java
+++ b/pulsar-client-tools-test/src/test/java/org/apache/pulsar/admin/cli/CmdFunctionsTest.java
@@ -78,13 +78,11 @@ public class CmdFunctionsTest {
     private static final String PACKAGE_GO_URL = "function://sample/ns1/godummyexamples@1";
     private static final String PACKAGE_PY_URL = "function://sample/ns1/pydummyexamples@1";
     private static final String PACKAGE_INVALID_URL = "functionsample.jar";
-    private static final String BUILTIN_NAR = "builtin://dummyexamples";
+    private static final String BUILTIN_NAR = "dummyexamples";
 
     private PulsarAdmin admin;
     private Functions functions;
     private CmdFunctions cmd;
-    private CmdSinks cmdSinks;
-    private CmdSources cmdSources;
 
     public static class DummyFunction implements Function<String, String> {
 
@@ -105,9 +103,6 @@ public class CmdFunctionsTest {
         when(admin.functions()).thenReturn(functions);
         when(admin.getServiceUrl()).thenReturn("http://localhost:1234");
         this.cmd = new CmdFunctions(() -> admin);
-        this.cmdSinks = new CmdSinks(() -> admin);
-        this.cmdSources = new CmdSources(() -> admin);
-
     }
 
 //    @Test
@@ -299,6 +294,7 @@ public class CmdFunctionsTest {
         assertEquals(FN_NAME, creater.getFunctionName());
         assertEquals(INPUT_TOPIC_NAME, creater.getInputs());
         assertEquals(OUTPUT_TOPIC_NAME, creater.getOutput());
+
         verify(functions, times(1)).createFunctionWithUrl(any(FunctionConfig.class), anyString());
     }
 
@@ -433,16 +429,16 @@ public class CmdFunctionsTest {
                 "--name", FN_NAME,
                 "--inputs", INPUT_TOPIC_NAME,
                 "--output", OUTPUT_TOPIC_NAME,
-                "--jar", BUILTIN_NAR,
+                "--function-type", BUILTIN_NAR,
                 "--tenant", "sample",
                 "--namespace", "ns1",
         });
-
         CreateFunction creater = cmd.getCreater();
 
         assertEquals(FN_NAME, creater.getFunctionName());
         assertEquals(INPUT_TOPIC_NAME, creater.getInputs());
         assertEquals(OUTPUT_TOPIC_NAME, creater.getOutput());
+        assertEquals("builtin://" + BUILTIN_NAR, creater.getFunctionConfig().getJar());
         verify(functions, times(1)).createFunction(any(FunctionConfig.class), anyString());
     }
 
diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java
index 61bf9c438d4..f7da5bf7174 100644
--- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java
+++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java
@@ -198,6 +198,8 @@ public class CmdFunctions extends CmdBase {
         protected String deprecatedClassName;
         @Parameter(names = "--classname", description = "The class name of a Pulsar Function")
         protected String className;
+        @Parameter(names = { "-t", "--function-type" }, description = "The built-in Pulsar Function type")
+        protected String functionType;
         @Parameter(names = "--jar", description = "Path to the JAR file for the function "
                 + "(if the function is written in Java). It also supports URL path [http/https/file "
                 + "(file protocol assumes that file already exists on worker host)/function "
@@ -617,10 +619,20 @@ public class CmdFunctions extends CmdBase {
                 functionConfig.setDeadLetterTopic(deadLetterTopic);
             }
 
+            if (jarFile != null && functionType != null) {
+                throw new ParameterException("Cannot specify both jar and function-type");
+            }
+
             if (null != jarFile) {
                 functionConfig.setJar(jarFile);
             }
 
+            if (functionType != null) {
+                functionConfig.setJar("builtin://" + functionType);
+            } else if (functionConfig.getFunctionType() != null) {
+                functionConfig.setJar("builtin://" + functionConfig.getFunctionType());
+            }
+
             if (null != pyFile) {
                 functionConfig.setPy(pyFile);
             }