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

laskoviymishka pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git


The following commit(s) were added to refs/heads/main by this push:
     new 5d377f16b docs(io): document ADLS managed identity property divergence 
(#2024)
5d377f16b is described below

commit 5d377f16bc3a5da0abd59a80204e73698bde7af2
Author: Revanth <[email protected]>
AuthorDate: Wed Sep 23 16:27:33 2026 -0500

    docs(io): document ADLS managed identity property divergence (#2024)
    
    * docs(io): document ADLS managed identity property divergence
    
    * docs(io): clarify ADLS authentication precedence and property
    
    * docs(io): clarify ADLS auth precedence and cross-client property 
differences
---
 io/config.go                 | 28 +++++++++++++++++++++++++++-
 website/src/configuration.md | 31 ++++++++++++++++++++++---------
 2 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/io/config.go b/io/config.go
index 35189c15b..39a6602d3 100644
--- a/io/config.go
+++ b/io/config.go
@@ -54,11 +54,37 @@ const (
        ADLSConnectionStringPrefix = "adls.connection-string."
        ADLSSharedKeyAccountName   = "adls.auth.shared-key.account.name"
        ADLSSharedKeyAccountKey    = "adls.auth.shared-key.account.key"
-       ADLSClientID               = "adls.client-id"
        ADLSEndpoint               = "adls.endpoint"
        ADLSProtocol               = "adls.protocol"
+
+       // ADLSManagedIdentityEnabled uses ManagedIdentityCredential directly 
when set
+       // to "true", rather than the broader DefaultAzureCredential chain, 
which already
+       // tries managed identity among its other sources. Pair it with 
ADLSClientID to
+       // select a user-assigned managed identity; on its own it uses the 
system-assigned
+       // managed identity.
+       //
+       // It is evaluated only after shared-key credentials, a SAS-token 
property for
+       // the target hostname, and a connection-string property for the target 
account
+       // name, all of which take precedence over it; if any of them is 
configured,
+       // this flag has no effect.
+       //
+       // This property is specific to this implementation. Neither the Java 
nor the
+       // PyIceberg implementation defines an equivalent property, so catalog 
properties
+       // that set it will not carry over to them.
        ADLSManagedIdentityEnabled = "adls.auth.managed-identity.enabled"
 
+       // ADLSClientID selects a user-assigned managed identity by client ID. 
It only
+       // takes effect when ADLSManagedIdentityEnabled is "true"; on its own 
it is ignored.
+       //
+       // PyIceberg recognizes the same "adls.client-id" key but uses it for 
service
+       // principal authentication, alongside "adls.client-secret" and 
"adls.tenant-id",
+       // which it requires to be set together; see
+       // https://py.iceberg.apache.org/configuration/#azure-data-lake. This
+       // implementation defines neither of those, so the key is only ever 
read as a
+       // user-assigned managed identity ID here. Java's AzureProperties 
defines no
+       // "adls.client-id" at all.
+       ADLSClientID = "adls.client-id"
+
        // Not in use yet
        // ADLSReadBlockSize          = "adls.read.block-size-bytes"
        // ADLSWriteBlockSize         = "adls.write.block-size-bytes"
diff --git a/website/src/configuration.md b/website/src/configuration.md
index 87a7f08be..f722901f2 100644
--- a/website/src/configuration.md
+++ b/website/src/configuration.md
@@ -204,12 +204,25 @@ Tuning properties:
 
 ### Azure Data Lake Storage / Blob
 
-Authentication is selected based on the property keys present 
(`io/gocloud/azure/azure.go`):
-
-1. Shared key: both `adls.auth.shared-key.account.name` and 
`adls.auth.shared-key.account.key` set.
-2. Per-host SAS token: `adls.sas-token.<hostname>` (prefix-matched against the 
storage account host).
-3. Per-host connection string: `adls.connection-string.<hostname>`.
-4. Managed identity: `adls.auth.managed-identity.enabled` set to a truthy 
value.
+Authentication is selected in the following order 
(`io/gocloud/azure/azure.go`); the first applicable option wins, and if none of 
1-4 apply the default credential chain (5) is used:
+
+1. Shared key: a nonempty `adls.auth.shared-key.account.name` selects this 
path and requires a nonempty `adls.auth.shared-key.account.key`.
+2. Per-host SAS token: `adls.sas-token.<hostname>`, where `<hostname>` exactly 
matches the storage account hostname (for example, 
`myaccount.dfs.core.windows.net`).
+3. Per-account connection string: `adls.connection-string.<account-name>` (for 
example, `adls.connection-string.myaccount`).
+4. Managed identity: `adls.auth.managed-identity.enabled` set to exactly 
`"true"` selects this path and uses `ManagedIdentityCredential` directly. Set 
`adls.client-id` to select a user-assigned managed identity; otherwise, the 
system-assigned managed identity is used.
+5. Default credential chain: `DefaultAzureCredential`, which includes managed 
identity among its credential sources.
+
+> **Note on cross-client parity.** The two properties in step 4 diverge from 
the
+> other clients. `adls.auth.managed-identity.enabled` is Go-specific: neither
+> Iceberg Java nor PyIceberg defines a property that forces
+> `ManagedIdentityCredential`, so catalog properties that set it do not carry
+> over. `adls.client-id` collides in name only — PyIceberg reads it as a 
service
+> principal client ID used together with `adls.client-secret` and
+> `adls.tenant-id`, neither of which iceberg-go defines (see the
+> [PyIceberg ADLS 
configuration](https://py.iceberg.apache.org/configuration/#azure-data-lake)),
+> while Java's `AzureProperties` defines no `adls.client-id` at all. Here it is
+> only ever read as a user-assigned managed identity ID, and only when step 4 
is
+> selected.
 
 Tuning properties:
 
@@ -218,11 +231,11 @@ Tuning properties:
 | `adls.auth.shared-key.account.name` (`io.ADLSSharedKeyAccountName`) | 
Account name. |
 | `adls.auth.shared-key.account.key` (`io.ADLSSharedKeyAccountKey`) | Account 
key. |
 | `adls.sas-token.<host>` (prefix `io.ADLSSasTokenPrefix`) | Per-host SAS 
token. |
-| `adls.connection-string.<host>` (prefix `io.ADLSConnectionStringPrefix`) | 
Per-host connection string. |
-| `adls.client-id` (`io.ADLSClientID`) | Client/application ID for AAD auth. |
+| `adls.connection-string.<account-name>` (prefix 
`io.ADLSConnectionStringPrefix`) | Per-account connection string. |
+| `adls.client-id` (`io.ADLSClientID`) | Client ID of a user-assigned managed 
identity. Used only when the explicit managed-identity authentication path is 
selected. |
 | `adls.endpoint` (`io.ADLSEndpoint`) | Storage domain (e.g. 
`blob.core.windows.net`). |
 | `adls.protocol` (`io.ADLSProtocol`) | `http` or `https`. |
-| `adls.auth.managed-identity.enabled` (`io.ADLSManagedIdentityEnabled`) | 
Enable Azure Managed Identity auth. |
+| `adls.auth.managed-identity.enabled` (`io.ADLSManagedIdentityEnabled`) | Set 
to exactly `"true"` to use `ManagedIdentityCredential` directly, subject to the 
precedence above. |
 
 ## Environment variables
 

Reply via email to