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

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


The following commit(s) were added to refs/heads/master by this push:
     new 9525047  Fix for FQFN flag (#1528)
9525047 is described below

commit 9525047d82e2d6105f4de28bc69d36ebcb04b579
Author: Luc Perkins <lucperk...@gmail.com>
AuthorDate: Tue Apr 10 10:31:37 2018 -0700

    Fix for FQFN flag (#1528)
    
    * move fqfn flag into proper command base
    
    * Extend FunctionCommand from BaseCommand rather than NamespaceCommand
    
    * clean up input topics function
    
    * Add special processArguments function for FunctionCommand
    
    * Match wording of error output across commands
    
    * Add checks for tenant, namespace, and function name
---
 .../org/apache/pulsar/admin/cli/CmdFunctions.java  | 77 ++++++++++++++++------
 1 file changed, 56 insertions(+), 21 deletions(-)

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 adf7283..66b8630 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
@@ -26,6 +26,7 @@ import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Type;
 import java.net.MalformedURLException;
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -103,9 +104,6 @@ public class CmdFunctions extends CmdBase {
      */
     @Getter
     abstract class NamespaceCommand extends BaseCommand {
-        @Parameter(names = "--fqfn", description = "The Fully Qualified 
Function Name (FQFN) for the function", required = false)
-        protected String fqfn;
-
         @Parameter(names = "--tenant", description = "The function's tenant", 
required = true)
         protected String tenant;
 
@@ -117,9 +115,47 @@ public class CmdFunctions extends CmdBase {
      * Function level command
      */
     @Getter
-    abstract class FunctionCommand extends NamespaceCommand {
-        @Parameter(names = "--name", description = "The function's name", 
required = true)
+    abstract class FunctionCommand extends BaseCommand {
+        @Parameter(names = "--fqfn", description = "The Fully Qualified 
Function Name (FQFN) for the function")
+        protected String fqfn;
+
+        @Parameter(names = "--tenant", description = "The function's tenant")
+        protected String tenant;
+
+        @Parameter(names = "--namespace", description = "The function's 
namespace")
+        protected String namespace;
+
+        @Parameter(names = "--name", description = "The function's name")
         protected String functionName;
+
+        @Override
+        void processArguments() throws Exception {
+            super.processArguments();
+
+            boolean usesSetters = (null != tenant || null != namespace || null 
!= functionName);
+            boolean usesFqfn = (null != fqfn);
+
+            // Throw an exception if --fqfn is set alongside any combination 
of --tenant, --namespace, and --name
+            if (usesFqfn && usesSetters) {
+                throw new RuntimeException(
+                        "You must specify either a Fully Qualified Function 
Name (FQFN) or tenant, namespace, and function name");
+            } else if (usesFqfn) {
+                // If the --fqfn flag is used, parse tenant, namespace, and 
name using that flag
+                String[] fqfnParts = fqfn.split("/");
+                if (fqfnParts.length != 3) {
+                    throw new RuntimeException(
+                            "Fully qualified function names (FQFNs) must be of 
the form tenant/namespace/name");
+                }
+                tenant = fqfnParts[0];
+                namespace = fqfnParts[1];
+                functionName = fqfnParts[2];
+            } else {
+                if (null == tenant || null == namespace || null == 
functionName) {
+                    throw new RuntimeException(
+                            "You must specify a tenant, namespace, and name 
for the function or a Fully Qualified Function Name (FQFN)");
+                }
+            }
+        }
     }
 
     /**
@@ -135,7 +171,7 @@ public class CmdFunctions extends CmdBase {
         protected String namespace;
         @Parameter(names = "--name", description = "The function's name")
         protected String functionName;
-        @Parameter(names = "--className", description = "The function's class 
name", required = true)
+        @Parameter(names = "--className", description = "The function's class 
name")
         protected String className;
         @Parameter(
                 names = "--jar",
@@ -173,6 +209,8 @@ public class CmdFunctions extends CmdBase {
 
         @Override
         void processArguments() throws Exception {
+            super.processArguments();
+
             FunctionConfig.Builder functionConfigBuilder;
 
             // Initialize config builder either from a supplied YAML config 
file or from scratch
@@ -197,10 +235,7 @@ public class CmdFunctions extends CmdBase {
             }
 
             if (null != inputs) {
-                String[] topicNames = inputs.split(",");
-                for (int i = 0; i < topicNames.length; ++i) {
-                    functionConfigBuilder.addInputs(topicNames[i]);
-                }
+                
Arrays.asList(inputs.split(",")).forEach(functionConfigBuilder::addInputs);
             }
             if (null != customSerdeInputString) {
                 Type type = new TypeToken<Map<String, String>>(){}.getType();
@@ -385,17 +420,6 @@ public class CmdFunctions extends CmdBase {
             }
         }
 
-        private void parseFullyQualifiedFunctionName(String fqfn, 
FunctionConfig.Builder functionConfigBuilder) {
-            String[] args = fqfn.split("/");
-            if (args.length != 3) {
-                throw new RuntimeException("Fully qualified function names 
must be of the form tenant/namespace/name");
-            } else {
-                functionConfigBuilder.setTenant(args[0]);
-                functionConfigBuilder.setNamespace(args[1]);
-                functionConfigBuilder.setName(args[2]);
-            }
-        }
-
         private void doPythonSubmitChecks(FunctionConfig.Builder 
functionConfigBuilder) {
             if (functionConfigBuilder.getProcessingGuarantees() == 
FunctionConfig.ProcessingGuarantees.EFFECTIVELY_ONCE) {
                 throw new RuntimeException("Effectively-once processing 
guarantees not yet supported in Python");
@@ -746,4 +770,15 @@ public class CmdFunctions extends CmdBase {
         Utils.mergeJson(FunctionsImpl.printJson(functionConfig), 
functionConfigBuilder);
         return functionConfigBuilder.build();
     }
+
+    private void parseFullyQualifiedFunctionName(String fqfn, 
FunctionConfig.Builder functionConfigBuilder) {
+        String[] args = fqfn.split("/");
+        if (args.length != 3) {
+            throw new RuntimeException("Fully qualified function names (FQFNs) 
must be of the form tenant/namespace/name");
+        } else {
+            functionConfigBuilder.setTenant(args[0]);
+            functionConfigBuilder.setNamespace(args[1]);
+            functionConfigBuilder.setName(args[2]);
+        }
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
mme...@apache.org.

Reply via email to