You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2024/12/16 10:19:48 UTC

(ranger) 01/01: RANGER-5026: agents-cred module: update for code readability improvement

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

pradeep pushed a commit to branch RANGER-5026_master
in repository https://gitbox.apache.org/repos/asf/ranger.git

commit 5de414131dc8033f43935658fd31244fb35c2b1b
Author: Pradeep AgrawaL <pr...@apache.org>
AuthorDate: Mon Dec 16 15:48:28 2024 +0530

    RANGER-5026: agents-cred module: update for code readability improvement
---
 agents-cred/pom.xml                                |   2 +
 .../credutils/CredentialsProviderUtil.java         |  84 +++---
 .../credutils/kerberos/AbstractJaasConf.java       |   8 +-
 .../kerberos/KerberosCredentialsProvider.java      |  14 +-
 .../credutils/kerberos/KeytabJaasConf.java         |   1 -
 .../hadoop/utils/RangerCredentialProvider.java     |  84 +++---
 .../hadoop/utils/RangerCredentialProviderTest.java | 295 ++++++++++-----------
 7 files changed, 232 insertions(+), 256 deletions(-)

diff --git a/agents-cred/pom.xml b/agents-cred/pom.xml
index 362a4e9a9..aa792c365 100644
--- a/agents-cred/pom.xml
+++ b/agents-cred/pom.xml
@@ -28,6 +28,8 @@
     <name>Credential Support</name>
     <description>Plugins Common</description>
     <properties>
+        <checkstyle.failOnViolation>true</checkstyle.failOnViolation>
+        <checkstyle.skip>false</checkstyle.skip>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
diff --git a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/CredentialsProviderUtil.java b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/CredentialsProviderUtil.java
index 773662211..dab6f9110 100644
--- a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/CredentialsProviderUtil.java
+++ b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/CredentialsProviderUtil.java
@@ -40,6 +40,7 @@ import javax.security.auth.kerberos.KerberosPrincipal;
 import javax.security.auth.kerberos.KerberosTicket;
 import javax.security.auth.login.Configuration;
 import javax.security.auth.login.LoginContext;
+
 import java.math.BigDecimal;
 import java.security.AccessControlContext;
 import java.security.AccessController;
@@ -50,35 +51,24 @@ import java.util.Date;
 import java.util.Set;
 
 public class CredentialsProviderUtil {
-    private static final Logger logger = LoggerFactory.getLogger(CredentialsProviderUtil.class);
-    private static final Oid SPNEGO_OID = getSpnegoOid();
-    private static final String CRED_CONF_NAME = "ESClientLoginConf";
-    public static long ticketExpireTime80 = 0;
+    private static final Logger logger             = LoggerFactory.getLogger(CredentialsProviderUtil.class);
+    private static final Oid    SPNEGO_OID         = getSpnegoOid();
+    private static final String CRED_CONF_NAME     = "ESClientLoginConf";
+    public static        long   ticketExpireTime80;
 
-    private static Oid getSpnegoOid() {
-        Oid oid = null;
-        try {
-            oid = new Oid("1.3.6.1.5.5.2");
-        } catch (GSSException gsse) {
-            throw new RuntimeException(gsse);
-        }
-        return oid;
+    private CredentialsProviderUtil() {
+        // to block instantiation
     }
 
-    public static KerberosCredentialsProvider getKerberosCredentials(String user, String password){
+    public static KerberosCredentialsProvider getKerberosCredentials(String user, String password) {
         KerberosCredentialsProvider credentialsProvider = new KerberosCredentialsProvider();
-        final GSSManager gssManager = GSSManager.getInstance();
+        final GSSManager            gssManager          = GSSManager.getInstance();
         try {
-            final GSSName gssUserPrincipalName = gssManager.createName(user, GSSName.NT_USER_NAME);
-            Subject subject = login(user, password);
-            final AccessControlContext acc = AccessController.getContext();
-            final GSSCredential credential = doAsPrivilegedWrapper(subject,
-                    (PrivilegedExceptionAction<GSSCredential>) () -> gssManager.createCredential(gssUserPrincipalName,
-                            GSSCredential.DEFAULT_LIFETIME, SPNEGO_OID, GSSCredential.INITIATE_ONLY),
-                    acc);
-            credentialsProvider.setCredentials(
-                    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthSchemes.SPNEGO),
-                    new KerberosCredentials(credential));
+            final GSSName              gssUserPrincipalName = gssManager.createName(user, GSSName.NT_USER_NAME);
+            Subject                    subject              = login(user, password);
+            final AccessControlContext acc                  = AccessController.getContext();
+            final GSSCredential credential = doAsPrivilegedWrapper(subject, (PrivilegedExceptionAction<GSSCredential>) () -> gssManager.createCredential(gssUserPrincipalName, GSSCredential.DEFAULT_LIFETIME, SPNEGO_OID, GSSCredential.INITIATE_ONLY), acc);
+            credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthSchemes.SPNEGO), new KerberosCredentials(credential));
         } catch (GSSException e) {
             logger.error("GSSException:", e);
             throw new RuntimeException(e);
@@ -91,7 +81,7 @@ public class CredentialsProviderUtil {
 
     public static synchronized KerberosTicket getTGT(Subject subject) {
         Set<KerberosTicket> tickets = subject.getPrivateCredentials(KerberosTicket.class);
-        for(KerberosTicket ticket: tickets) {
+        for (KerberosTicket ticket : tickets) {
             KerberosPrincipal server = ticket.getServer();
             if (server.getName().equals("krbtgt/" + server.getRealm() + "@" + server.getRealm())) {
                 if (logger.isDebugEnabled()) {
@@ -104,15 +94,15 @@ public class CredentialsProviderUtil {
         return null;
     }
 
-    public static Boolean ticketWillExpire(KerberosTicket ticket){
+    public static Boolean ticketWillExpire(KerberosTicket ticket) {
         long ticketExpireTime = ticket.getEndTime().getTime();
-        long currrentTime = new Date().getTime();
+        long currrentTime     = new Date().getTime();
         if (logger.isDebugEnabled()) {
             logger.debug("TicketExpireTime is:" + ticketExpireTime);
             logger.debug("currrentTime is:" + currrentTime);
         }
         if (ticketExpireTime80 == 0) {
-            long timeDiff = ticketExpireTime - currrentTime;
+            long timeDiff   = ticketExpireTime - currrentTime;
             long timeDiff20 = Math.round(Float.parseFloat(BigDecimal.valueOf(timeDiff * 0.2).toPlainString()));
             ticketExpireTime80 = ticketExpireTime - timeDiff20;
         }
@@ -130,21 +120,23 @@ public class CredentialsProviderUtil {
     }
 
     public static synchronized Subject login(String userPrincipalName, String keytabPath) throws PrivilegedActionException {
-             Subject sub = AccessController.doPrivileged((PrivilegedExceptionAction<Subject>) () -> {
-                final Subject subject = new Subject(false, Collections.singleton(new KerberosPrincipal(userPrincipalName)),
-                        Collections.emptySet(), Collections.emptySet());
-                Configuration conf = new KeytabJaasConf(userPrincipalName, keytabPath, false);
-
-                LoginContext loginContext = new LoginContext(CRED_CONF_NAME, subject, null, conf);
-                loginContext.login();
-                return loginContext.getSubject();
-            });
+        Subject sub = AccessController.doPrivileged((PrivilegedExceptionAction<Subject>) () -> {
+            final Subject subject = new Subject(false, Collections.singleton(new KerberosPrincipal(userPrincipalName)), Collections.emptySet(), Collections.emptySet());
+            Configuration conf = new KeytabJaasConf(userPrincipalName, keytabPath, false);
+            LoginContext loginContext = new LoginContext(CRED_CONF_NAME, subject, null, conf);
+            loginContext.login();
+            return loginContext.getSubject();
+        });
         return sub;
     }
 
+    public static CredentialsProvider getBasicCredentials(String user, String password) {
+        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password));
+        return credentialsProvider;
+    }
 
-    static <T> T doAsPrivilegedWrapper(final Subject subject, final PrivilegedExceptionAction<T> action, final AccessControlContext acc)
-            throws PrivilegedActionException {
+    static <T> T doAsPrivilegedWrapper(final Subject subject, final PrivilegedExceptionAction<T> action, final AccessControlContext acc) throws PrivilegedActionException {
         try {
             return AccessController.doPrivileged((PrivilegedExceptionAction<T>) () -> Subject.doAsPrivileged(subject, action, acc));
         } catch (PrivilegedActionException pae) {
@@ -155,11 +147,13 @@ public class CredentialsProviderUtil {
         }
     }
 
-    public static CredentialsProvider getBasicCredentials(String user, String password) {
-        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-        credentialsProvider.setCredentials(AuthScope.ANY,
-                new UsernamePasswordCredentials(user, password));
-        return credentialsProvider;
+    private static Oid getSpnegoOid() {
+        Oid oid = null;
+        try {
+            oid = new Oid("1.3.6.1.5.5.2");
+        } catch (GSSException gsse) {
+            throw new RuntimeException(gsse);
+        }
+        return oid;
     }
-
 }
diff --git a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/AbstractJaasConf.java b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/AbstractJaasConf.java
index ae3c9312d..521c005e0 100644
--- a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/AbstractJaasConf.java
+++ b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/AbstractJaasConf.java
@@ -21,17 +21,18 @@ package org.apache.ranger.authorization.credutils.kerberos;
 
 import javax.security.auth.login.AppConfigurationEntry;
 import javax.security.auth.login.Configuration;
+
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 public abstract class AbstractJaasConf extends Configuration {
-    private final String userPrincipalName;
+    private final String  userPrincipalName;
     private final boolean enableDebugLogs;
 
     public AbstractJaasConf(final String userPrincipalName, final boolean enableDebugLogs) {
         this.userPrincipalName = userPrincipalName;
-        this.enableDebugLogs = enableDebugLogs;
+        this.enableDebugLogs   = enableDebugLogs;
     }
 
     @Override
@@ -42,8 +43,7 @@ public abstract class AbstractJaasConf extends Configuration {
         options.put("storeKey", Boolean.TRUE.toString());
         options.put("debug", Boolean.toString(enableDebugLogs));
         addOptions(options);
-        return new AppConfigurationEntry[] { new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",
-                AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, Collections.unmodifiableMap(options)) };
+        return new AppConfigurationEntry[] {new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, Collections.unmodifiableMap(options))};
     }
 
     abstract void addOptions(Map<String, String> options);
diff --git a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KerberosCredentialsProvider.java b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KerberosCredentialsProvider.java
index 6ef3085b7..c8e1bf578 100644
--- a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KerberosCredentialsProvider.java
+++ b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KerberosCredentialsProvider.java
@@ -25,7 +25,7 @@ import org.apache.http.client.CredentialsProvider;
 import org.apache.http.client.config.AuthSchemes;
 
 public class KerberosCredentialsProvider implements CredentialsProvider {
-    private AuthScope authScope;
+    private AuthScope   authScope;
     private Credentials credentials;
 
     @Override
@@ -33,20 +33,22 @@ public class KerberosCredentialsProvider implements CredentialsProvider {
         if (authscope.getScheme().regionMatches(true, 0, AuthSchemes.SPNEGO, 0, AuthSchemes.SPNEGO.length()) == false) {
             throw new IllegalArgumentException("Only " + AuthSchemes.SPNEGO + " auth scheme is supported in AuthScope");
         }
-        this.authScope = authscope;
+        this.authScope   = authscope;
         this.credentials = credentials;
     }
 
     @Override
     public Credentials getCredentials(AuthScope authscope) {
-        assert this.authScope != null && authscope != null;
-        return authscope.match(this.authScope) > -1 ? this.credentials : null;
+        Credentials ret = null;
+        if (this.authScope != null && authscope != null) {
+            ret = authscope.match(this.authScope) > -1 ? this.credentials : null;
+        }
+        return ret;
     }
 
     @Override
     public void clear() {
-        this.authScope = null;
+        this.authScope   = null;
         this.credentials = null;
     }
-
 }
diff --git a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KeytabJaasConf.java b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KeytabJaasConf.java
index 4f96f95b2..87a0da666 100644
--- a/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KeytabJaasConf.java
+++ b/agents-cred/src/main/java/org/apache/ranger/authorization/credutils/kerberos/KeytabJaasConf.java
@@ -34,5 +34,4 @@ public class KeytabJaasConf extends AbstractJaasConf {
         options.put("keyTab", keytabFilePath);
         options.put("doNotPrompt", Boolean.TRUE.toString());
     }
-
 }
diff --git a/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java b/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
index ac7ccd23c..9983aceb6 100644
--- a/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
+++ b/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
@@ -19,59 +19,55 @@
 
 package org.apache.ranger.authorization.hadoop.utils;
 
-import java.util.List;
-
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialProvider;
 import org.apache.hadoop.security.alias.CredentialProviderFactory;
-import org.apache.hadoop.conf.Configuration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
 
 public final class RangerCredentialProvider {
+    private static final Logger LOG = LoggerFactory.getLogger(RangerCredentialProvider.class);
+    private static final RangerCredentialProvider CRED_PROVIDER = new RangerCredentialProvider();
 
-	private static final Logger LOG = LoggerFactory.getLogger(RangerCredentialProvider.class);
-
-	private static final RangerCredentialProvider CRED_PROVIDER = new RangerCredentialProvider();
-
-	protected RangerCredentialProvider() {
-		//
-	}
-
-	public static RangerCredentialProvider getInstance() {
-		return CRED_PROVIDER;
-	}
+    protected RangerCredentialProvider() {
+        //
+    }
 
-	public String getCredentialString(String url, String alias) {
-		if (url != null && alias != null) {
-			List<CredentialProvider> providers = getCredentialProviders(url);
-			if (providers != null) {
-				for (CredentialProvider provider : providers) {
-					try {
-						CredentialProvider.CredentialEntry credEntry = provider.getCredentialEntry(alias);
-						if (credEntry != null && credEntry.getCredential() != null) {
-							return new String(credEntry.getCredential());
-						}
-					} catch (Exception ie) {
-						LOG.error("Unable to get the Credential Provider from the Configuration", ie);
-					}
-				}
-			}
-		}
-		return null;
-	}
+    public static RangerCredentialProvider getInstance() {
+        return CRED_PROVIDER;
+    }
 
-	List<CredentialProvider> getCredentialProviders(String url) {
-		if (url != null) {
-			try {
-				Configuration conf = new Configuration();
-				conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, url);
-				return CredentialProviderFactory.getProviders(conf);
-			} catch (Exception ie) {
-				LOG.error("Unable to get the Credential Provider from the Configuration", ie);
-			}
-		}
-		return null;
-	}
+    public String getCredentialString(String url, String alias) {
+        if (url != null && alias != null) {
+            List<CredentialProvider> providers = getCredentialProviders(url);
+            if (providers != null) {
+                for (CredentialProvider provider : providers) {
+                    try {
+                        CredentialProvider.CredentialEntry credEntry = provider.getCredentialEntry(alias);
+                        if (credEntry != null && credEntry.getCredential() != null) {
+                            return new String(credEntry.getCredential());
+                        }
+                    } catch (Exception ie) {
+                        LOG.error("Unable to get the Credential Provider from the Configuration", ie);
+                    }
+                }
+            }
+        }
+        return null;
+    }
 
+    List<CredentialProvider> getCredentialProviders(String url) {
+        if (url != null) {
+            try {
+                Configuration conf = new Configuration();
+                conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, url);
+                return CredentialProviderFactory.getProviders(conf);
+            } catch (Exception ie) {
+                LOG.error("Unable to get the Credential Provider from the Configuration", ie);
+            }
+        }
+        return null;
+    }
 }
diff --git a/agents-cred/src/test/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProviderTest.java b/agents-cred/src/test/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProviderTest.java
index a3b83977d..7b0e3da5b 100644
--- a/agents-cred/src/test/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProviderTest.java
+++ b/agents-cred/src/test/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProviderTest.java
@@ -6,26 +6,17 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.ranger.authorization.hadoop.utils;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.List;
-
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialProvider;
 import org.apache.hadoop.security.alias.CredentialShell;
@@ -33,151 +24,143 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 public class RangerCredentialProviderTest {
-	
-	private final File ksFile;
-	private final String keystoreFile;
-	private final String[] argsCreate;
-	private final String[] argsDelete;
-	private final String url;
-	RangerCredentialProvider cp = null;
-	List<CredentialProvider> providers = null;
-	
-	
-	public RangerCredentialProviderTest() throws IOException {
-		ksFile = File.createTempFile("testkeystore", "jceks");
-		keystoreFile = ksFile.toURI().getPath();
-		url = "jceks://file@/" + keystoreFile;
-		
-		if (isCredentialShellInteractiveEnabled()) {
-			argsCreate = new String[] {"create", "TestCredential001", "-f",  "-value", "PassworD123", "-provider", "jceks://file@/" + keystoreFile};
-			argsDelete = new String[] {"delete", "TestCredential001", "-f" , "-provider", "jceks://file@/" + keystoreFile};
-		} else {
-			argsCreate = new String[] {"create", "TestCredential001", "-value", "PassworD123", "-provider", "jceks://file@/" + keystoreFile};
-			argsDelete = new String[] {"delete", "TestCredential001", "-provider", "jceks://file@/" + keystoreFile};
-		}
-	}
-	
-	
-	@Before
-	public void setup() throws Exception {
-		int ret;
-		//
-		// adding a delete before creating a keystore
-		//
-		try {
-			if (ksFile != null) {
-				if (ksFile.exists()) {
-					System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is available - and deleting");
-					ksFile.delete();
-					System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is deleted.");
-				} else {
-					System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is not available");
-				}
-			} else {
-				System.out.println("Keystore File is NULL");
-			}
-		} catch(Throwable t) {
-			t.printStackTrace();
-		}
-		
-		Configuration conf = new Configuration();
-		CredentialShell cs = new CredentialShell();
-		cs.setConf(conf);
-		try {
-			 ret = cs.run(argsCreate);
-		} catch (Exception e) {
-			throw e;
-		}
-		assertEquals(0, ret);
-		System.out.println("(1) Number of active Threads : " + Thread.activeCount());
-		listThreads();
-	}
-	
-	@After
-	public void cleanup() throws Exception {
-		if (ksFile != null && ksFile.exists()) {
-			ksFile.delete();
-		}
-	}
-	
-	@Test
-	public void testCredentialProvider() {
-		//test credential provider is registered and return credential providers.
-		cp = new RangerCredentialProvider();
-		providers = cp.getCredentialProviders(url);
-		if (providers != null) {
-			assertTrue(url.equals(providers.get(0).toString()));
-		}
-		System.out.println("(2) Number of active Threads : " + Thread.activeCount());
-		listThreads();
-	}
-	
-	@Test
-	public void testCredentialString() {
-		//test credential provider created is returning the correct credential string.
-		cp = new RangerCredentialProvider();
-		providers = cp.getCredentialProviders(url);
-		if (providers != null) {
-			assertTrue("PassworD123".equals(cp.getCredentialString(url, "TestCredential001")));
-		}
-		System.out.println("(3) Number of active Threads : " + Thread.activeCount());
-		listThreads();
-	}
+    private final File     ksFile;
+    private final String   keystoreFile;
+    private final String[] argsCreate;
+    private final String[] argsDelete;
+    private final String   url;
+    RangerCredentialProvider cp;
+    List<CredentialProvider> providers;
 
-	
-	@After
-	public void teardown() throws Exception {
-		System.out.println("In teardown : Number of active Threads : " + Thread.activeCount() );
-		int ret;
-		Configuration conf = new Configuration();
-		CredentialShell cs = new CredentialShell();
-		cs.setConf(conf);
-		try {
-			 ret = cs.run(argsDelete);
-		} catch (Exception e) {
-			throw e;
-		}
-		assertEquals(0, ret);
-		listThreads();
-	}
-	
-	private static void listThreads() {
-		int ac = Thread.activeCount();
-		if (ac > 0) {
-			Thread[] tlist = new Thread[ac];
-			Thread.enumerate(tlist);
-			for (Thread t : tlist) {
-				System.out.println("Thread [" + t + "] => {" + t.getClass().getName() + "}");
-			}
-		}
-	}
-	
-	private static boolean isCredentialShellInteractiveEnabled() {
-		boolean ret = false;
-		
-		String fieldName = "interactive";
-		
-		CredentialShell cs = new CredentialShell();
-		
-		try {
-			Field interactiveField = cs.getClass().getDeclaredField(fieldName);
-			
-			if (interactiveField != null) {
-				interactiveField.setAccessible(true);
-				ret = interactiveField.getBoolean(cs);
-				System.out.println("FOUND value of [" + fieldName + "] field in the Class [" + cs.getClass().getName() + "] = [" + ret + "]");
-			}
-		} catch (Throwable e) {
-			System.out.println("Unable to find the value of [" + fieldName + "] field in the Class [" + cs.getClass().getName() + "]. Skiping -f option");
-			e.printStackTrace();
-			ret = false;
-		}
-		
-		return ret;
-		
-		
-	}
+    public RangerCredentialProviderTest() throws IOException {
+        ksFile       = File.createTempFile("testkeystore", "jceks");
+        keystoreFile = ksFile.toURI().getPath();
+        url          = "jceks://file@/" + keystoreFile;
+        if (isCredentialShellInteractiveEnabled()) {
+            argsCreate = new String[] {"create", "TestCredential001", "-f", "-value", "PassworD123", "-provider", "jceks://file@/" + keystoreFile};
+            argsDelete = new String[] {"delete", "TestCredential001", "-f", "-provider", "jceks://file@/" + keystoreFile};
+        } else {
+            argsCreate = new String[] {"create", "TestCredential001", "-value", "PassworD123", "-provider", "jceks://file@/" + keystoreFile};
+            argsDelete = new String[] {"delete", "TestCredential001", "-provider", "jceks://file@/" + keystoreFile};
+        }
+    }
 
-}
+    @Before
+    public void setup() throws Exception {
+        int ret;
+        // adding a delete before creating a keystore
+        try {
+            if (ksFile != null) {
+                if (ksFile.exists()) {
+                    System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is available - and deleting");
+                    ksFile.delete();
+                    System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is deleted.");
+                } else {
+                    System.out.println("Keystore File [" + ksFile.getAbsolutePath() + "] is not available");
+                }
+            } else {
+                System.out.println("Keystore File is NULL");
+            }
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+
+        Configuration   conf = new Configuration();
+        CredentialShell cs   = new CredentialShell();
+        cs.setConf(conf);
+        try {
+            ret = cs.run(argsCreate);
+        } catch (Exception e) {
+            throw e;
+        }
+        assertEquals(0, ret);
+        System.out.println("(1) Number of active Threads : " + Thread.activeCount());
+        listThreads();
+    }
 
+    @After
+    public void cleanup() throws Exception {
+        if (ksFile != null && ksFile.exists()) {
+            ksFile.delete();
+        }
+    }
+
+    @Test
+    public void testCredentialProvider() {
+        //test credential provider is registered and return credential providers.
+        cp        = new RangerCredentialProvider();
+        providers = cp.getCredentialProviders(url);
+        if (providers != null) {
+            assertTrue(url.equals(providers.get(0).toString()));
+        }
+        System.out.println("(2) Number of active Threads : " + Thread.activeCount());
+        listThreads();
+    }
+
+    @Test
+    public void testCredentialString() {
+        //test credential provider created is returning the correct credential string.
+        cp        = new RangerCredentialProvider();
+        providers = cp.getCredentialProviders(url);
+        if (providers != null) {
+            assertTrue("PassworD123".equals(cp.getCredentialString(url, "TestCredential001")));
+        }
+        System.out.println("(3) Number of active Threads : " + Thread.activeCount());
+        listThreads();
+    }
+
+    @After
+    public void teardown() throws Exception {
+        System.out.println("In teardown : Number of active Threads : " + Thread.activeCount());
+        int             ret;
+        Configuration   conf = new Configuration();
+        CredentialShell cs   = new CredentialShell();
+        cs.setConf(conf);
+        try {
+            ret = cs.run(argsDelete);
+        } catch (Exception e) {
+            throw e;
+        }
+        assertEquals(0, ret);
+        listThreads();
+    }
+
+    private static void listThreads() {
+        int ac = Thread.activeCount();
+        if (ac > 0) {
+            Thread[] tlist = new Thread[ac];
+            Thread.enumerate(tlist);
+            for (Thread t : tlist) {
+                System.out.println("Thread [" + t + "] => {" + t.getClass().getName() + "}");
+            }
+        }
+    }
+
+    private static boolean isCredentialShellInteractiveEnabled() {
+        boolean         ret       = false;
+        String          fieldName = "interactive";
+        CredentialShell cs        = new CredentialShell();
+        try {
+            Field interactiveField = cs.getClass().getDeclaredField(fieldName);
+            if (interactiveField != null) {
+                interactiveField.setAccessible(true);
+                ret = interactiveField.getBoolean(cs);
+                System.out.println("FOUND value of [" + fieldName + "] field in the Class [" + cs.getClass().getName() + "] = [" + ret + "]");
+            }
+        } catch (Throwable e) {
+            System.out.println("Unable to find the value of [" + fieldName + "] field in the Class [" + cs.getClass().getName() + "]. Skiping -f option");
+            e.printStackTrace();
+            ret = false;
+        }
+        return ret;
+    }
+}