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

pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 3a8da7b  NIFI-8979 Add KerberosUserService to PutKudu
3a8da7b is described below

commit 3a8da7b33e2973e0bee58b4d47a814dc92b14a99
Author: Bryan Bende <[email protected]>
AuthorDate: Mon Sep 20 14:12:08 2021 -0400

    NIFI-8979 Add KerberosUserService to PutKudu
    
    Signed-off-by: Pierre Villard <[email protected]>
    
    This closes #5400.
---
 .../nifi-kudu-bundle/nifi-kudu-processors/pom.xml  |  5 ++
 .../processors/kudu/AbstractKuduProcessor.java     | 58 +++++++++++++++++-----
 .../org/apache/nifi/processors/kudu/PutKudu.java   |  1 +
 .../apache/nifi/processors/kudu/TestPutKudu.java   | 20 ++++++++
 4 files changed, 71 insertions(+), 13 deletions(-)

diff --git a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/pom.xml 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/pom.xml
index 4b21c14..51a97aa 100644
--- a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/pom.xml
@@ -63,6 +63,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
+            <artifactId>nifi-kerberos-user-service-api</artifactId>
+            <version>1.15.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-record-serialization-service-api</artifactId>
         </dependency>
         <dependency>
diff --git 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/AbstractKuduProcessor.java
 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/AbstractKuduProcessor.java
index 4131d2f..e188323 100644
--- 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/AbstractKuduProcessor.java
+++ 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/AbstractKuduProcessor.java
@@ -39,6 +39,7 @@ import org.apache.nifi.components.ValidationResult;
 import org.apache.nifi.expression.AttributeExpression;
 import org.apache.nifi.expression.ExpressionLanguageScope;
 import org.apache.nifi.kerberos.KerberosCredentialsService;
+import org.apache.nifi.kerberos.KerberosUserService;
 import org.apache.nifi.processor.AbstractProcessor;
 import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.util.StandardValidators;
@@ -53,7 +54,6 @@ import 
org.apache.nifi.serialization.record.type.DecimalDataType;
 import org.apache.nifi.serialization.record.util.DataTypeUtils;
 import org.apache.nifi.util.StringUtils;
 
-import javax.security.auth.login.LoginException;
 import java.math.BigDecimal;
 import java.sql.Date;
 import java.sql.Timestamp;
@@ -94,6 +94,14 @@ public abstract class AbstractKuduProcessor extends 
AbstractProcessor {
             .identifiesControllerService(KerberosCredentialsService.class)
             .build();
 
+    static final PropertyDescriptor KERBEROS_USER_SERVICE = new 
PropertyDescriptor.Builder()
+            .name("kerberos-user-service")
+            .displayName("Kerberos User Service")
+            .description("Specifies the Kerberos User Controller Service that 
should be used for authenticating with Kerberos")
+            .identifiesControllerService(KerberosUserService.class)
+            .required(false)
+            .build();
+
     static final PropertyDescriptor KERBEROS_PRINCIPAL = new 
PropertyDescriptor.Builder()
             .name("kerberos-principal")
             .displayName("Kerberos Principal")
@@ -172,19 +180,26 @@ public abstract class AbstractKuduProcessor extends 
AbstractProcessor {
         }
     }
 
-    protected void createKerberosUserAndOrKuduClient(ProcessContext context) 
throws LoginException {
-        final KerberosCredentialsService credentialsService = 
context.getProperty(KERBEROS_CREDENTIALS_SERVICE).asControllerService(KerberosCredentialsService.class);
-        final String kerberosPrincipal = 
context.getProperty(KERBEROS_PRINCIPAL).evaluateAttributeExpressions().getValue();
-        final String kerberosPassword = 
context.getProperty(KERBEROS_PASSWORD).getValue();
-
-        if (credentialsService != null) {
-            kerberosUser = 
createKerberosKeytabUser(credentialsService.getPrincipal(), 
credentialsService.getKeytab(), context);
-            kerberosUser.login(); // login creates the kudu client as well
-        } else if (!StringUtils.isBlank(kerberosPrincipal) && 
!StringUtils.isBlank(kerberosPassword)) {
-            kerberosUser = createKerberosPasswordUser(kerberosPrincipal, 
kerberosPassword, context);
-            kerberosUser.login(); // login creates the kudu client as well
-        } else {
+    protected void createKerberosUserAndOrKuduClient(ProcessContext context) {
+        final KerberosUserService kerberosUserService = 
context.getProperty(KERBEROS_USER_SERVICE).asControllerService(KerberosUserService.class);
+        if (kerberosUserService != null) {
+            kerberosUser = kerberosUserService.createKerberosUser();
+            kerberosUser.login();
             createKuduClient(context);
+        } else {
+            final KerberosCredentialsService credentialsService = 
context.getProperty(KERBEROS_CREDENTIALS_SERVICE).asControllerService(KerberosCredentialsService.class);
+            final String kerberosPrincipal = 
context.getProperty(KERBEROS_PRINCIPAL).evaluateAttributeExpressions().getValue();
+            final String kerberosPassword = 
context.getProperty(KERBEROS_PASSWORD).getValue();
+
+            if (credentialsService != null) {
+                kerberosUser = 
createKerberosKeytabUser(credentialsService.getPrincipal(), 
credentialsService.getKeytab(), context);
+                kerberosUser.login(); // login creates the kudu client as well
+            } else if (!StringUtils.isBlank(kerberosPrincipal) && 
!StringUtils.isBlank(kerberosPassword)) {
+                kerberosUser = createKerberosPasswordUser(kerberosPrincipal, 
kerberosPassword, context);
+                kerberosUser.login(); // login creates the kudu client as well
+            } else {
+                createKuduClient(context);
+            }
         }
     }
 
@@ -310,6 +325,7 @@ public abstract class AbstractKuduProcessor extends 
AbstractProcessor {
         }
 
         final KerberosCredentialsService kerberosCredentialsService = 
context.getProperty(KERBEROS_CREDENTIALS_SERVICE).asControllerService(KerberosCredentialsService.class);
+        final KerberosUserService kerberosUserService = 
context.getProperty(KERBEROS_USER_SERVICE).asControllerService(KerberosUserService.class);
 
         if (kerberosCredentialsService != null && (kerberosPrincipalProvided 
|| kerberosPasswordProvided)) {
             results.add(new ValidationResult.Builder()
@@ -319,6 +335,22 @@ public abstract class AbstractKuduProcessor extends 
AbstractProcessor {
                     .build());
         }
 
+        if (kerberosUserService != null && (kerberosPrincipalProvided || 
kerberosPasswordProvided)) {
+            results.add(new ValidationResult.Builder()
+                    .subject(KERBEROS_USER_SERVICE.getDisplayName())
+                    .valid(false)
+                    .explanation("kerberos principal/password and kerberos 
user service cannot be configured at the same time")
+                    .build());
+        }
+
+        if (kerberosUserService != null && kerberosCredentialsService != null) 
{
+            results.add(new ValidationResult.Builder()
+                    .subject(KERBEROS_USER_SERVICE.getDisplayName())
+                    .valid(false)
+                    .explanation("kerberos user service and kerberos 
credentials service cannot be configured at the same time")
+                    .build());
+        }
+
         return results;
     }
 
diff --git 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/PutKudu.java
 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/PutKudu.java
index ca273b6..37bf43a 100644
--- 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/PutKudu.java
+++ 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/main/java/org/apache/nifi/processors/kudu/PutKudu.java
@@ -283,6 +283,7 @@ public class PutKudu extends AbstractKuduProcessor {
         properties.add(KUDU_MASTERS);
         properties.add(TABLE_NAME);
         properties.add(FAILURE_STRATEGY);
+        properties.add(KERBEROS_USER_SERVICE);
         properties.add(KERBEROS_CREDENTIALS_SERVICE);
         properties.add(KERBEROS_PRINCIPAL);
         properties.add(KERBEROS_PASSWORD);
diff --git 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/test/java/org/apache/nifi/processors/kudu/TestPutKudu.java
 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/test/java/org/apache/nifi/processors/kudu/TestPutKudu.java
index f02917f..73913cf 100644
--- 
a/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/test/java/org/apache/nifi/processors/kudu/TestPutKudu.java
+++ 
b/nifi-nar-bundles/nifi-kudu-bundle/nifi-kudu-processors/src/test/java/org/apache/nifi/processors/kudu/TestPutKudu.java
@@ -33,6 +33,7 @@ import org.apache.nifi.controller.AbstractControllerService;
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.flowfile.attributes.CoreAttributes;
 import org.apache.nifi.kerberos.KerberosCredentialsService;
+import org.apache.nifi.kerberos.KerberosUserService;
 import org.apache.nifi.logging.ComponentLog;
 import org.apache.nifi.provenance.ProvenanceEventRecord;
 import org.apache.nifi.provenance.ProvenanceEventType;
@@ -167,6 +168,25 @@ public class TestPutKudu {
         testRunner.removeProperty(PutKudu.KERBEROS_PRINCIPAL);
         testRunner.removeProperty(PutKudu.KERBEROS_PASSWORD);
         testRunner.assertValid();
+
+        final KerberosUserService kerberosUserService = 
enableKerberosUserService(testRunner);
+        testRunner.setProperty(PutKudu.KERBEROS_USER_SERVICE, 
kerberosUserService.getIdentifier());
+        testRunner.assertNotValid();
+
+        testRunner.removeProperty(PutKudu.KERBEROS_CREDENTIALS_SERVICE);
+        testRunner.assertValid();
+
+        testRunner.setProperty(PutKudu.KERBEROS_PRINCIPAL, "principal");
+        testRunner.setProperty(PutKudu.KERBEROS_PASSWORD, "password");
+        testRunner.assertNotValid();
+    }
+
+    private KerberosUserService enableKerberosUserService(final TestRunner 
runner) throws InitializationException {
+        final KerberosUserService kerberosUserService = 
mock(KerberosUserService.class);
+        when(kerberosUserService.getIdentifier()).thenReturn("userService1");
+        runner.addControllerService(kerberosUserService.getIdentifier(), 
kerberosUserService);
+        runner.enableControllerService(kerberosUserService);
+        return kerberosUserService;
     }
 
     @Test

Reply via email to