diff --git a/Cargo.lock b/Cargo.lock index d9d7588827e..f02849aecda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5039,12 +5039,15 @@ dependencies = [ "arrow-schema", "async-trait", "aws-config", + "aws-credential-types", "aws-sdk-sts", + "aws-sigv4", "axum", "base64 0.22.1", "bytes", "chrono", "futures", + "hex", "hmac 0.12.1", "lance", "lance-arrow", diff --git a/java/lance-jni/Cargo.lock b/java/lance-jni/Cargo.lock index fa08fd758aa..502a2a38997 100644 --- a/java/lance-jni/Cargo.lock +++ b/java/lance-jni/Cargo.lock @@ -3910,6 +3910,7 @@ dependencies = [ "itertools 0.13.0", "lance-arrow", "libc", + "libm", "log", "moka", "num_cpus", @@ -3925,6 +3926,7 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", + "twox-hash", "url", ] @@ -4104,7 +4106,6 @@ dependencies = [ "lance-select", "lance-table", "lance-tokenizer", - "libm", "libsais-rs", "log", "ndarray", @@ -4124,7 +4125,6 @@ dependencies = [ "tempfile", "tokio", "tracing", - "twox-hash", "uuid", ] @@ -4242,9 +4242,13 @@ dependencies = [ "arrow-ipc", "arrow-schema", "async-trait", + "aws-config", + "aws-credential-types", + "aws-sigv4", "axum", "bytes", "futures", + "hex", "lance", "lance-core", "lance-index", @@ -4258,6 +4262,7 @@ dependencies = [ "reqwest 0.12.28", "serde", "serde_json", + "sha2 0.10.9", "tokio", "tower", "tower-http 0.5.2", diff --git a/java/lance-jni/Cargo.toml b/java/lance-jni/Cargo.toml index 5eaa69f071b..3d0520e38b3 100644 --- a/java/lance-jni/Cargo.toml +++ b/java/lance-jni/Cargo.toml @@ -23,7 +23,7 @@ lance-linalg = { path = "../../rust/lance-linalg" } lance-index = { path = "../../rust/lance-index" } lance-io = { path = "../../rust/lance-io" } lance-namespace = { path = "../../rust/lance-namespace" } -lance-namespace-impls = { path = "../../rust/lance-namespace-impls", features = ["rest", "rest-adapter", "dir-goosefs"] } +lance-namespace-impls = { path = "../../rust/lance-namespace-impls", features = ["rest", "rest-adapter", "dir-goosefs", "rest-auth-sigv4"] } lance-core = { path = "../../rust/lance-core" } lance-file = { path = "../../rust/lance-file" } lance-table = { path = "../../rust/lance-table" } diff --git a/java/lance-jni/src/namespace.rs b/java/lance-jni/src/namespace.rs index f0da7ff79ae..5fc3e325dc6 100644 --- a/java/lance-jni/src/namespace.rs +++ b/java/lance-jni/src/namespace.rs @@ -2533,7 +2533,12 @@ fn create_rest_namespace_internal( builder = builder.context_provider(Arc::new(java_provider)); } - let namespace = builder.build(); + let namespace = builder.build().map_err(|e| { + Error::runtime_error(format!("Failed to build RestNamespace: {}", e)) + })?; + + RT.block_on(namespace.warm_up_auth()) + .map_err(|e| Error::runtime_error(format!("Auth initialization failed: {}", e)))?; let blocking_namespace = BlockingRestNamespace { inner: Arc::new(namespace), diff --git a/java/src/main/java/org/lance/namespace/RestNamespace.java b/java/src/main/java/org/lance/namespace/RestNamespace.java index 9cbbc588660..f4fb4059bb7 100644 --- a/java/src/main/java/org/lance/namespace/RestNamespace.java +++ b/java/src/main/java/org/lance/namespace/RestNamespace.java @@ -120,6 +120,18 @@ *
  • uri (required): REST API endpoint URL *
  • delimiter (optional): Namespace delimiter (default: "$") *
  • header.* (optional): HTTP headers (e.g., header.Authorization=Bearer token) + *
  • rest.auth.type (optional): Authentication type — "sigv4" or "none" (default: none) + *
  • rest.auth.sigv4.region (required if sigv4): AWS region + *
  • rest.auth.sigv4.service (optional): AWS service name (default: "execute-api") + *
  • rest.auth.sigv4.access-key-id (optional): Explicit AWS access key ID + *
  • rest.auth.sigv4.secret-access-key (optional): Explicit AWS secret access key + *
  • rest.auth.sigv4.session-token (optional): STS session token + * + * + *

    Note: {@code rest.auth.*} and {@code header.Authorization} are mutually exclusive. + * Setting both will throw an error at initialization time. + * + *