diff --git a/core/src/main/java/org/apache/spark/security/CredentialProvider.java b/core/src/main/java/org/apache/spark/security/CredentialProvider.java index aae7f0f430a9b..a306b427535b0 100644 --- a/core/src/main/java/org/apache/spark/security/CredentialProvider.java +++ b/core/src/main/java/org/apache/spark/security/CredentialProvider.java @@ -36,7 +36,7 @@ * Implementations must be thread-safe: {@code resolve()} may be called concurrently from * multiple threads after {@code init()} completes. * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public interface CredentialProvider extends AutoCloseable { @@ -58,7 +58,7 @@ public interface CredentialProvider extends AutoCloseable { * * @param conf Spark configuration properties scoped to {@code spark.security.oidc.*} * keys (must not be null) - * @since 4.3.0 + * @since 4.4.0 */ void init(Map conf); @@ -69,7 +69,7 @@ public interface CredentialProvider extends AutoCloseable { * set must be non-empty and stable across calls. * * @return a non-empty set of supported scheme names - * @since 4.3.0 + * @since 4.4.0 */ Set supportedSchemes(); @@ -85,7 +85,7 @@ public interface CredentialProvider extends AutoCloseable { * @param target the target URI for which credentials are requested (must not be null) * @return a short-lived service credential for the target * @throws CredentialResolutionException if the credential exchange fails - * @since 4.3.0 + * @since 4.4.0 */ ServiceCredential resolve(UserContext user, URI target) throws CredentialResolutionException; @@ -96,7 +96,7 @@ public interface CredentialProvider extends AutoCloseable { * The default is 15 minutes. * * @return the suggested credential TTL (never null) - * @since 4.3.0 + * @since 4.4.0 */ default Duration suggestedTtl() { return Duration.ofMinutes(15); @@ -119,7 +119,7 @@ default Duration suggestedTtl() { * clause in their override (e.g., declare {@code close()} with no {@code throws} or * with a more specific exception type). * - * @since 4.3.0 + * @since 4.4.0 */ @Override default void close() throws Exception {} diff --git a/core/src/main/java/org/apache/spark/security/CredentialProviderLoader.java b/core/src/main/java/org/apache/spark/security/CredentialProviderLoader.java index 84aaaca0a1961..50d2a24546e95 100644 --- a/core/src/main/java/org/apache/spark/security/CredentialProviderLoader.java +++ b/core/src/main/java/org/apache/spark/security/CredentialProviderLoader.java @@ -59,7 +59,7 @@ * {@link CredentialProvider} contract, implementations must be thread-safe, so a returned * instance may be used concurrently. * - * @since 4.3.0 + * @since 4.4.0 */ @Private public final class CredentialProviderLoader { diff --git a/core/src/main/java/org/apache/spark/security/CredentialResolutionException.java b/core/src/main/java/org/apache/spark/security/CredentialResolutionException.java index eb5aaf2372984..86db39835168e 100644 --- a/core/src/main/java/org/apache/spark/security/CredentialResolutionException.java +++ b/core/src/main/java/org/apache/spark/security/CredentialResolutionException.java @@ -26,7 +26,7 @@ * This is a checked exception to ensure callers handle credential resolution failures * explicitly (e.g., retry, fail the job, or fall back to another mechanism). * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public class CredentialResolutionException extends Exception { diff --git a/core/src/main/java/org/apache/spark/security/FileTokenIngestor.java b/core/src/main/java/org/apache/spark/security/FileTokenIngestor.java index b51dcc7f0b43e..c43fd5dc601ca 100644 --- a/core/src/main/java/org/apache/spark/security/FileTokenIngestor.java +++ b/core/src/main/java/org/apache/spark/security/FileTokenIngestor.java @@ -50,7 +50,7 @@ * returns empty rather than throwing * * - * @since 4.3.0 + * @since 4.4.0 */ @Private public class FileTokenIngestor implements TokenIngestor { diff --git a/core/src/main/java/org/apache/spark/security/ServiceCredential.java b/core/src/main/java/org/apache/spark/security/ServiceCredential.java index b0502cf922a45..4e988821a3983 100644 --- a/core/src/main/java/org/apache/spark/security/ServiceCredential.java +++ b/core/src/main/java/org/apache/spark/security/ServiceCredential.java @@ -36,7 +36,7 @@ *

* This class is immutable and {@link Serializable}. * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public final class ServiceCredential implements Serializable { diff --git a/core/src/main/java/org/apache/spark/security/TokenIngestor.java b/core/src/main/java/org/apache/spark/security/TokenIngestor.java index 0c25fc59d69e2..fd15b5f734387 100644 --- a/core/src/main/java/org/apache/spark/security/TokenIngestor.java +++ b/core/src/main/java/org/apache/spark/security/TokenIngestor.java @@ -29,7 +29,7 @@ * configuration is passed at construction time. * Implementations must be thread-safe because {@link #load()} may be called concurrently. * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public interface TokenIngestor { diff --git a/core/src/main/java/org/apache/spark/security/UserContext.java b/core/src/main/java/org/apache/spark/security/UserContext.java index 9d9f372dad34b..a063c6c2eae1c 100644 --- a/core/src/main/java/org/apache/spark/security/UserContext.java +++ b/core/src/main/java/org/apache/spark/security/UserContext.java @@ -31,7 +31,7 @@ * not {@link java.io.Serializable} and must never be transmitted to executors. * The {@code rawToken} field is always redacted in {@link #toString()}. * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public final class UserContext { diff --git a/core/src/main/java/org/apache/spark/security/UserCredentials.java b/core/src/main/java/org/apache/spark/security/UserCredentials.java index 3f5e1d54b9239..3d4427651a0e9 100644 --- a/core/src/main/java/org/apache/spark/security/UserCredentials.java +++ b/core/src/main/java/org/apache/spark/security/UserCredentials.java @@ -38,7 +38,7 @@ * This class is transmitted to executors and does not contain any reference * to {@link UserContext} or raw identity tokens. It is immutable and {@link Serializable}. * - * @since 4.3.0 + * @since 4.4.0 */ @DeveloperApi public final class UserCredentials implements Serializable { diff --git a/core/src/main/scala/org/apache/spark/internal/config/package.scala b/core/src/main/scala/org/apache/spark/internal/config/package.scala index 87a2da236a91a..86a63ffc1c2e7 100644 --- a/core/src/main/scala/org/apache/spark/internal/config/package.scala +++ b/core/src/main/scala/org/apache/spark/internal/config/package.scala @@ -1710,7 +1710,7 @@ package object config { .doc("Whether to enable OIDC credential propagation. When enabled, the driver reads an " + "identity token from a file, exchanges it for short-lived service credentials via " + "CredentialProvider implementations, and propagates those credentials to executors.") - .version("4.3.0") + .version("4.4.0") .withBindingPolicy(ConfigBindingPolicy.NOT_APPLICABLE) .booleanConf .createWithDefault(false) @@ -1720,7 +1720,7 @@ package object config { .doc("Path to the OIDC identity token file on the driver. Required when " + "spark.security.oidc.enabled is true. The file should contain a JWT token " + "(e.g., a Kubernetes projected service account token).") - .version("4.3.0") + .version("4.4.0") .withBindingPolicy(ConfigBindingPolicy.NOT_APPLICABLE) .stringConf .createOptional @@ -1729,7 +1729,7 @@ package object config { ConfigBuilder("spark.security.oidc.renewal.safetyMargin") .doc("How long before credential expiry to trigger renewal. Credentials are refreshed " + "at min(identity token expiry, service credential expiry) minus this margin.") - .version("4.3.0") + .version("4.4.0") .withBindingPolicy(ConfigBindingPolicy.NOT_APPLICABLE) .timeConf(TimeUnit.MILLISECONDS) .checkValue(_ > 0, "The safety margin must be a positive time value.") @@ -1739,7 +1739,7 @@ package object config { ConfigBuilder("spark.security.oidc.renewal.minInterval") .doc("Minimum interval between credential renewal attempts. This prevents tight renewal " + "loops when credentials have very short TTLs or when failures cause rapid retries.") - .version("4.3.0") + .version("4.4.0") .withBindingPolicy(ConfigBindingPolicy.NOT_APPLICABLE) .timeConf(TimeUnit.MILLISECONDS) .checkValue(_ > 0, "The minimum renewal interval must be a positive time value.")