use std::sync::Arc;
use ailake_core::{AilakeError, AilakeResult};
use object_store::azure::{AzureConfigKey, MicrosoftAzureBuilder};
use crate::ObjectStoreBackend;
pub enum AzureCredentials {
ClientSecret {
tenant_id: String,
client_id: String,
client_secret: String,
},
ManagedIdentity { client_id: Option<String> },
AccessKey(String),
SasToken(String),
AzureCli,
}
pub struct AzureConfig {
pub account_name: String,
pub container: String,
pub credentials: AzureCredentials,
}
#[cfg(feature = "store-azure")]
pub fn azure_store(
config: AzureConfig,
prefix: impl Into<String>,
) -> AilakeResult<ObjectStoreBackend> {
let mut b = MicrosoftAzureBuilder::new()
.with_account(&config.account_name)
.with_container_name(&config.container);
match config.credentials {
AzureCredentials::ClientSecret {
tenant_id,
client_id,
client_secret,
} => {
b = b.with_client_secret_authorization(client_id, client_secret, tenant_id);
}
AzureCredentials::ManagedIdentity { client_id } => {
if let Some(id) = client_id {
b = b.with_client_id(id);
}
}
AzureCredentials::AccessKey(key) => {
b = b.with_access_key(key);
}
AzureCredentials::SasToken(token) => {
b = b.with_config(AzureConfigKey::SasKey, token);
}
AzureCredentials::AzureCli => {
b = b.with_use_azure_cli(true);
}
}
let store = b.build().map_err(|e| AilakeError::Store(e.to_string()))?;
Ok(ObjectStoreBackend::new(Arc::new(store), prefix))
}