csharp/Microsoft.Azure.Databricks.Client/DatabricksClient.cs (150 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Reflection;
using System.Threading.Tasks;
using Azure.Core;
namespace Microsoft.Azure.Databricks.Client;
public partial class DatabricksClient : IDisposable
{
/// <summary>
/// Initializes a new instance of the <see cref="DatabricksClient"/> class.
/// </summary>
private DatabricksClient(HttpClient httpClient)
{
this.Clusters = new ClustersApiClient(httpClient);
this.Jobs = new JobsApiClient(httpClient);
this.Dbfs = new DbfsApiClient(httpClient);
this.Secrets = new SecretsApiClient(httpClient);
this.Groups = new GroupsApiClient(httpClient);
this.Libraries = new LibrariesApiClient(httpClient);
this.Token = new TokenApiClient(httpClient);
this.Workspace = new WorkspaceApiClient(httpClient);
this.InstancePool = new InstancePoolApiClient(httpClient);
this.Permissions = new PermissionsApiClient(httpClient);
this.ClusterPolicies = new ClusterPoliciesApiClient(httpClient);
this.GlobalInitScriptsApi = new GlobalInitScriptsApi(httpClient);
this.SQL = new SQLApiClient(httpClient);
this.Repos = new ReposApiClient(httpClient);
this.Pipelines = new PipelinesApiClient(httpClient);
this.UnityCatalog = new UnityCatalogClient(httpClient);
this.MachineLearning = new MachineLearningClient(httpClient);
}
/// <summary>
/// Initializes a new instance of the <see cref="DatabricksClient"/> class for mocking.
/// </summary>
protected DatabricksClient()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DatabricksClient"/> class.
/// </summary>
/// <param name="baseUrl">The base URL of the databricks portal. ex. https://southcentralus.azuredatabricks.net</param>
/// <param name="token">The access token.</param>
/// <param name="timeoutSeconds">The timeout in seconds for the http requests.</param>
/// <param name="httpClientConfig">A custom function to configure the HttpClient object.</param>
protected DatabricksClient(string baseUrl, string token, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
: this(CreateHttpClient(baseUrl, token, timeoutSeconds, httpClientConfig))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DatabricksClient"/> class.
/// </summary>
/// <remarks>
/// The AAD service principal used to acquire the token must be contributor role to the databricks workspace resource.
/// </remarks>
/// <param name="baseUrl">The base URL of the databricks portal. ex. https://southcentralus.azuredatabricks.net</param>
/// <param name="workspaceResourceId">The ResourceId of the databricks workspace.</param>
/// <param name="databricksToken">The AAD token used to access the global databricks application (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d).</param>
/// <param name="managementToken">The AAD token for Azure management API (https://management.core.windows.net/).</param>
/// <param name="timeoutSeconds">The timeout in seconds for the http requests.</param>
/// <param name="httpClientConfig">A custom function to configure the HttpClient object.</param>
protected DatabricksClient(string baseUrl, string workspaceResourceId, string databricksToken,
string managementToken, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
: this(CreateHttpClient(baseUrl, workspaceResourceId, databricksToken, managementToken, timeoutSeconds, httpClientConfig))
{
}
private static HttpClient CreateHttpClient(string baseUrl, string beareToken, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
{
var apiUrl = new Uri(new Uri(baseUrl), "api/");
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var httpClient = new HttpClient(handler, false)
{
BaseAddress = apiUrl,
Timeout = TimeSpan.FromSeconds(timeoutSeconds)
};
httpClientConfig?.Invoke(httpClient);
SetDefaultHttpHeaders(httpClient);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", beareToken);
return httpClient;
}
private static HttpClient CreateHttpClient(string baseUrl, string workspaceResourceId, string databricksToken,
string managementToken, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
{
var httpClient = CreateHttpClient(baseUrl, databricksToken, timeoutSeconds, httpClientConfig);
httpClient.DefaultRequestHeaders.Add("X-Databricks-Azure-SP-Management-Token", managementToken);
httpClient.DefaultRequestHeaders.Add("X-Databricks-Azure-Workspace-Resource-Id", workspaceResourceId);
return httpClient;
}
private static HttpClient CreateHttpClient(string baseUrl, Func<Task<string>> getToken, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
{
var apiUrl = new Uri(new Uri(baseUrl), "api/");
var decompressHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var bearerHeaderHandler = new BearerHeaderHandler(getToken, decompressHandler);
var httpClient = new HttpClient(bearerHeaderHandler, false)
{
BaseAddress = apiUrl,
Timeout = TimeSpan.FromSeconds(timeoutSeconds)
};
httpClientConfig?.Invoke(httpClient);
SetDefaultHttpHeaders(httpClient);
return httpClient;
}
private static readonly string Version = Assembly.GetExecutingAssembly().GetName().Version!.ToString();
private static void SetDefaultHttpHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Microsoft.Azure.Databricks.Client",
Version));
}
/// <summary>
/// Create client object with specified base URL, access token and timeout.
/// </summary>
/// <param name="baseUrl">Base URL for the databricks resource. For example: https://southcentralus.azuredatabricks.net</param>
/// <param name="token">The access token. To generate a token, refer to this document: https://docs.databricks.com/api/latest/authentication.html#generate-a-token </param>
/// <param name="timeoutSeconds">Web request time out in seconds</param>
/// <param name="httpClientConfig">A custom function to configure the HttpClient object.</param>
public static DatabricksClient CreateClient(string baseUrl, string token, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
{
return new DatabricksClient(baseUrl, token, timeoutSeconds, httpClientConfig);
}
/// <summary>
/// Create client object with specified base URL, workspace resourceId, databricks token, management API token and timeout.
/// This is to support calling Databricks API with an Azure AAD app.
/// </summary>
/// <remarks>
/// This feature is still in preview.
/// The AAD service principal used to acquire the token must be contributor role to the databricks workspace resource.
/// Request the access token via the AAD oauth2 API (v1): https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-oauth2-client-creds-grant-flow#request-an-access-token
/// </remarks>
/// <param name="baseUrl">The base URL of the databricks portal. ex. https://southcentralus.azuredatabricks.net</param>
/// <param name="workspaceResourceId">The ResourceId of the databricks workspace.</param>
/// <param name="databricksToken">The AAD token used to access the global databricks application (resource to claim: "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d").</param>
/// <param name="managementToken">The AAD token for Azure management API (resource to claim: "https://management.core.windows.net/").</param>
/// <param name="timeoutSeconds">The timeout in seconds for the http requests.</param>
/// <param name="httpClientConfig">A custom function to configure the HttpClient object.</param>
public static DatabricksClient CreateClient(string baseUrl, string workspaceResourceId, string databricksToken, string managementToken, long timeoutSeconds = 30,
Action<HttpClient> httpClientConfig = default)
{
return new DatabricksClient(baseUrl, workspaceResourceId, databricksToken, managementToken, timeoutSeconds, httpClientConfig);
}
/// <summary>
/// Create client object with specified base URL, a TokenCredential object and timeout value.
/// </summary>
public static DatabricksClient CreateClient(string baseUrl, TokenCredential credential, long timeoutSeconds = 30, Action<HttpClient> httpClientConfig = default)
{
const string DatabricksScope = "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default";
var httpClient = CreateHttpClient(
baseUrl,
async () => (await credential.GetTokenAsync(new TokenRequestContext(new string[] { DatabricksScope }), default)).Token,
timeoutSeconds,
httpClientConfig
);
return new DatabricksClient(httpClient);
}
public virtual IClustersApi Clusters { get; }
public virtual IJobsApi Jobs { get; }
public virtual IDbfsApi Dbfs { get; }
public virtual ISecretsApi Secrets { get; }
public virtual IGroupsApi Groups { get; }
public virtual ILibrariesApi Libraries { get; }
public virtual ITokenApi Token { get; }
public virtual IWorkspaceApi Workspace { get; }
public virtual IInstancePoolApi InstancePool { get; }
public virtual IPermissionsApi Permissions { get; }
public virtual IClusterPoliciesApi ClusterPolicies { get; }
public virtual IGlobalInitScriptsApi GlobalInitScriptsApi { get; }
public virtual ISQLApi SQL { get; }
public virtual IReposApi Repos { get; }
public virtual IPipelinesApi Pipelines { get; }
public virtual UnityCatalogClient UnityCatalog { get; }
public virtual MachineLearningClient MachineLearning { get; }
public void Dispose()
{
Clusters.Dispose();
Jobs.Dispose();
Dbfs.Dispose();
Secrets.Dispose();
Groups.Dispose();
Libraries.Dispose();
Token.Dispose();
Workspace.Dispose();
InstancePool.Dispose();
ClusterPolicies.Dispose();
GlobalInitScriptsApi.Dispose();
Repos.Dispose();
Pipelines.Dispose();
UnityCatalog.Dispose();
MachineLearning.Dispose();
GC.SuppressFinalize(this);
}
}