You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by st...@apache.org on 2022/12/12 17:29:20 UTC
[hadoop] branch branch-3.3 updated: HADOOP-18329. Support for IBM Semeru JVM > 11.0.15.0 Vendor Name Changes (#4537) (#5208)
This is an automated email from the ASF dual-hosted git repository.
stevel pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/branch-3.3 by this push:
new c5b360fd15c HADOOP-18329. Support for IBM Semeru JVM > 11.0.15.0 Vendor Name Changes (#4537) (#5208)
c5b360fd15c is described below
commit c5b360fd15cf484843451844967fbbc8479f9ced
Author: Jack Richard Buggins <ja...@hotmail.com>
AuthorDate: Mon Dec 12 17:28:56 2022 +0000
HADOOP-18329. Support for IBM Semeru JVM > 11.0.15.0 Vendor Name Changes (#4537) (#5208)
The static boolean PlatformName.IBM_JAVA now identifies
Java 11+ IBM Semeru runtimes as IBM JVM releases.
Contributed by Jack Buggins.
---
.../java/org/apache/hadoop/util/PlatformName.java | 66 ++++++++++++++++++++--
.../org/apache/hadoop/minikdc/TestMiniKdc.java | 37 ++++++++++--
2 files changed, 92 insertions(+), 11 deletions(-)
diff --git a/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/util/PlatformName.java b/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/util/PlatformName.java
index eb52839b65a..c52d5d21351 100644
--- a/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/util/PlatformName.java
+++ b/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/util/PlatformName.java
@@ -18,6 +18,10 @@
package org.apache.hadoop.util;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Arrays;
+
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
@@ -33,21 +37,71 @@ public class PlatformName {
* per the java-vm.
*/
public static final String PLATFORM_NAME =
- (System.getProperty("os.name").startsWith("Windows")
- ? System.getenv("os") : System.getProperty("os.name"))
- + "-" + System.getProperty("os.arch")
- + "-" + System.getProperty("sun.arch.data.model");
+ (System.getProperty("os.name").startsWith("Windows") ?
+ System.getenv("os") : System.getProperty("os.name"))
+ + "-" + System.getProperty("os.arch") + "-"
+ + System.getProperty("sun.arch.data.model");
/**
* The java vendor name used in this platform.
*/
public static final String JAVA_VENDOR_NAME = System.getProperty("java.vendor");
+ /**
+ * Define a system class accessor that is open to changes in underlying implementations
+ * of the system class loader modules.
+ */
+ private static final class SystemClassAccessor extends ClassLoader {
+ public Class<?> getSystemClass(String className) throws ClassNotFoundException {
+ return findSystemClass(className);
+ }
+ }
+
/**
* A public static variable to indicate the current java vendor is
- * IBM java or not.
+ * IBM and the type is Java Technology Edition which provides its
+ * own implementations of many security packages and Cipher suites.
+ * Note that these are not provided in Semeru runtimes:
+ * See https://developer.ibm.com/languages/java/semeru-runtimes for details.
*/
- public static final boolean IBM_JAVA = JAVA_VENDOR_NAME.contains("IBM");
+ public static final boolean IBM_JAVA = JAVA_VENDOR_NAME.contains("IBM") &&
+ hasIbmTechnologyEditionModules();
+
+ private static boolean hasIbmTechnologyEditionModules() {
+ return Arrays.asList(
+ "com.ibm.security.auth.module.JAASLoginModule",
+ "com.ibm.security.auth.module.Win64LoginModule",
+ "com.ibm.security.auth.module.NTLoginModule",
+ "com.ibm.security.auth.module.AIX64LoginModule",
+ "com.ibm.security.auth.module.LinuxLoginModule",
+ "com.ibm.security.auth.module.Krb5LoginModule"
+ ).stream().anyMatch((module) -> isSystemClassAvailable(module));
+ }
+
+ /**
+ * In rare cases where different behaviour is performed based on the JVM vendor
+ * this method should be used to test for a unique JVM class provided by the
+ * vendor rather than using the vendor method. For example if on JVM provides a
+ * different Kerberos login module testing for that login module being loadable
+ * before configuring to use it is preferable to using the vendor data.
+ *
+ * @param className the name of a class in the JVM to test for
+ * @return true if the class is available, false otherwise.
+ */
+ private static boolean isSystemClassAvailable(String className) {
+ return AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> {
+ try {
+ // Using ClassLoader.findSystemClass() instead of
+ // Class.forName(className, false, null) because Class.forName with a null
+ // ClassLoader only looks at the boot ClassLoader with Java 9 and above
+ // which doesn't look at all the modules available to the findSystemClass.
+ new SystemClassAccessor().getSystemClass(className);
+ return true;
+ } catch (Exception ignored) {
+ return false;
+ }
+ });
+ }
public static void main(String[] args) {
System.out.println(PLATFORM_NAME);
diff --git a/hadoop-common-project/hadoop-minikdc/src/test/java/org/apache/hadoop/minikdc/TestMiniKdc.java b/hadoop-common-project/hadoop-minikdc/src/test/java/org/apache/hadoop/minikdc/TestMiniKdc.java
index 74130cff19b..45684053a03 100644
--- a/hadoop-common-project/hadoop-minikdc/src/test/java/org/apache/hadoop/minikdc/TestMiniKdc.java
+++ b/hadoop-common-project/hadoop-minikdc/src/test/java/org/apache/hadoop/minikdc/TestMiniKdc.java
@@ -38,8 +38,35 @@ import java.util.HashMap;
import java.util.Arrays;
public class TestMiniKdc extends KerberosSecurityTestcase {
- private static final boolean IBM_JAVA = System.getProperty("java.vendor")
- .contains("IBM");
+ private static final boolean IBM_JAVA = shouldUseIbmPackages();
+ // duplicated to avoid cycles in the build
+ private static boolean shouldUseIbmPackages() {
+ final List<String> ibmTechnologyEditionSecurityModules = Arrays.asList(
+ "com.ibm.security.auth.module.JAASLoginModule",
+ "com.ibm.security.auth.module.Win64LoginModule",
+ "com.ibm.security.auth.module.NTLoginModule",
+ "com.ibm.security.auth.module.AIX64LoginModule",
+ "com.ibm.security.auth.module.LinuxLoginModule",
+ "com.ibm.security.auth.module.Krb5LoginModule"
+ );
+
+ if (System.getProperty("java.vendor").contains("IBM")) {
+ return ibmTechnologyEditionSecurityModules
+ .stream().anyMatch((module) -> isSystemClassAvailable(module));
+ }
+
+ return false;
+ }
+
+ private static boolean isSystemClassAvailable(String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (Exception ignored) {
+ return false;
+ }
+ }
+
@Test
public void testMiniKdcStart() {
MiniKdc kdc = getKdc();
@@ -117,9 +144,9 @@ public class TestMiniKdc extends KerberosSecurityTestcase {
options.put("debug", "true");
return new AppConfigurationEntry[]{
- new AppConfigurationEntry(getKrb5LoginModuleName(),
- AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
- options)};
+ new AppConfigurationEntry(getKrb5LoginModuleName(),
+ AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options)};
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org