csharp/Microsoft.Azure.Databricks.Client.Sample/SampleProgram.Permissions.cs (267 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Azure.Databricks.Client.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Microsoft.Azure.Databricks.Client.Sample; internal static partial class SampleProgram { // Replace with an existing delta live pipeline ID to try out the permissions API // for a delta live pipeline in your workspace private static readonly string DeltaLivePipelineId = null; // Replace with an existing experiment ID to try out the permissions API // for an experiment in your workspace private static readonly string ExperimentId = null; // Replace with an existing registered model ID to try out the permissions API // for a registered model in your workspace private static readonly string RegisteredModelId = null; // Replace with an existing sql warehouse endpoint ID to try out the permissions API // for a sql warehouse in your workspace private static readonly string SqlWareHouseEndpointId = null; // Replace with an existing repository id to try out the permissions API // for a repository in your workspace private static readonly string RepositoryId = null; private static readonly string ClusterPolicyId = null; private static async Task TestPermissionsApi(DatabricksClient client) { await DirectoryPermissions(client); await TokenPermissions(client); await ClusterPermissions(client); await PoolPermissions(client); await JobPermissions(client); await PipelinePermissions(client); await NotebookPermissions(client); await ExperimentsPermissions(client); await RegisteredModelsPermissions(client); await SqlWarehousePermissions(client); await RepoPermissions(client); await ClusterPolicyPermissions(client); } private static async Task TestPermissions(string resourceId, string principal, Func<string, CancellationToken, Task<IEnumerable<(PermissionLevel, string)>>> funcGetPermissionLevels, Func<string, CancellationToken, Task<IEnumerable<AclPermissionItem>>> funcGetPermissions, Func<IEnumerable<AclPermissionItem>, string, CancellationToken, Task> funcUpdatePermissions, Func<IEnumerable<AclPermissionItem>, string, CancellationToken, Task> funcReplacePermissions ) { if (resourceId == null) return; Console.WriteLine($"Getting and displaying the allowable permission levels for resource {resourceId}"); var permissionLevels = (await funcGetPermissionLevels(resourceId, default)).ToList(); foreach (var (permissionLevel, description) in permissionLevels) { Console.WriteLine($"{permissionLevel}: {description}"); } var allowedLevels = (from p in permissionLevels select p.Item1).ToList(); Console.WriteLine($"Getting and displaying current access levels for resource {resourceId}"); var currentAclItems = (await funcGetPermissions(resourceId, default)).ToList(); foreach (var aclItem in currentAclItems) { Console.WriteLine($"Principal: {aclItem.Principal}, Permission Level: {aclItem.PermissionLevel}"); } var aclItems = from level in allowedLevels select new UserAclItem { Principal = principal, PermissionLevel = level }; foreach (var aclItem in aclItems.Where(item => item.PermissionLevel != PermissionLevel.IS_OWNER)) { Console.WriteLine( $"Updating permissions for principal {aclItem.Principal}, permission level {aclItem.PermissionLevel}" ); await funcUpdatePermissions(new[] { aclItem }, resourceId, default); } Console.WriteLine("Resetting user permissions"); await funcReplacePermissions(currentAclItems, resourceId, default); } private static async Task DirectoryPermissions(DatabricksClient client) { Console.WriteLine("Creating a new workspace..."); await client.Workspace.Mkdirs(SampleWorkspacePath); var dirInfo = await client.Workspace.GetStatus(SampleWorkspacePath); await TestPermissions( dirInfo.ObjectId.ToString(), DatabricksUserName, client.Permissions.GetDirectoryPermissionLevels, client.Permissions.GetDirectoryPermissions, client.Permissions.UpdateDirectoryPermissions, client.Permissions.ReplaceDirectoryPermissions ); await client.Workspace.Delete(SampleWorkspacePath, true); Console.WriteLine("Sample workspace removed"); } private static async Task TokenPermissions(DatabricksClient client) { //only the getters are shown here, since updating these permissions might invalidate //the token that we are currently using to connect in the first place. Console.WriteLine("Getting and displaying the allowable permission levels for databricks tokens..."); var allowablePermissions = await client.Permissions.GetTokenPermissionLevels(); foreach (var (permissionLevel, description) in allowablePermissions) { Console.WriteLine($"{permissionLevel}: {description}"); } Console.WriteLine("Getting and displaying current access levels for tokens..."); var currentAclItems = await client.Permissions.GetTokenPermissions(); foreach (var aclItem in currentAclItems) { Console.WriteLine($"Principal: {aclItem.Principal}, Permission Level: {aclItem.PermissionLevel}"); } } private static async Task ClusterPermissions(DatabricksClient client) { Console.WriteLine("Creating standard cluster"); var clusterConfig = ClusterAttributes.GetNewClusterConfiguration("Sample cluster") .WithRuntimeVersion(RuntimeVersions.Runtime_11_3) .WithAutoTermination(20) .WithNodeType(NodeTypes.Standard_D3_v2) .WithClusterMode(ClusterMode.SingleNode); var clusterId = await client.Clusters.Create(clusterConfig); await TestPermissions( clusterId, DatabricksUserName, client.Permissions.GetClusterPermissionLevels, client.Permissions.GetClusterPermissions, client.Permissions.UpdateClusterPermissions, client.Permissions.ReplaceClusterPermissions ); Console.WriteLine("Deleting Sample cluster"); await client.Clusters.Delete(clusterId); } private static async Task PoolPermissions(DatabricksClient client) { Console.WriteLine("Creating Testing Instance Pool"); var poolAttributes = new InstancePoolAttributes { PoolName = "Sample pool", PreloadedSparkVersions = new[] { RuntimeVersions.Runtime_11_3 }, MinIdleInstances = 2, MaxCapacity = 100, IdleInstanceAutoTerminationMinutes = 15, NodeTypeId = NodeTypes.Standard_D3_v2, EnableElasticDisk = true, DiskSpec = new DiskSpec { DiskCount = 2, DiskSize = 64, DiskType = DiskType.FromAzureDisk(AzureDiskVolumeType.STANDARD_LRS) }, AzureAttributes = new InstancePoolAzureAttributes { Availability = AzureAvailability.SPOT_AZURE, SpotBidMaxPrice = -1 } }; var poolId = await client.InstancePool.Create(poolAttributes).ConfigureAwait(false); await TestPermissions( poolId, DatabricksUserName, client.Permissions.GetInstancePoolPermissionLevels, client.Permissions.GetInstancePoolPermissions, client.Permissions.UpdateInstancePoolPermissions, client.Permissions.ReplaceInstancePoolPermissions ); Console.WriteLine("Deleting Sample pool"); await client.InstancePool.Delete(poolId); } private static async Task JobPermissions(DatabricksClient client) { Console.WriteLine("Creating new job"); Console.WriteLine($"Creating workspace {SampleWorkspacePath}"); await client.Workspace.Mkdirs(SampleWorkspacePath); Console.WriteLine("Downloading sample notebook"); var content = await DownloadSampleNotebook(); Console.WriteLine($"Importing sample HTML notebook to {SampleNotebookPath}"); await client.Workspace.Import(SampleNotebookPath, ExportFormat.HTML, null, content, true); var newCluster = ClusterAttributes.GetNewClusterConfiguration() .WithClusterMode(ClusterMode.SingleNode) .WithNodeType(NodeTypes.Standard_D3_v2) .WithRuntimeVersion(RuntimeVersions.Runtime_10_4); var jobSettings = new JobSettings { MaxConcurrentRuns = 1, Name = "Sample Job" }; jobSettings.AddTask("task1", new NotebookTask { NotebookPath = SampleNotebookPath }) .WithDescription("Sample Job - task1") .WithNewCluster(newCluster); Console.WriteLine("Creating new job"); var jobId = await client.Jobs.Create(jobSettings); Console.WriteLine("Job created: {0}", jobId); await TestPermissions( jobId.ToString(), DatabricksUserName, client.Permissions.GetJobPermissionLevels, client.Permissions.GetJobPermissions, client.Permissions.UpdateJobPermissions, client.Permissions.ReplaceJobPermissions ); await client.Jobs.Delete(jobId); await client.Workspace.Delete(SampleNotebookPath, true); } private static async Task PipelinePermissions(DatabricksClient client) { await TestPermissions( DeltaLivePipelineId, DatabricksUserName, client.Permissions.GetPipelinePermissionLevels, client.Permissions.GetPipelinePermissions, client.Permissions.UpdatePipelinePermissions, client.Permissions.ReplacePipelinePermissions ); } private static async Task NotebookPermissions(DatabricksClient client) { Console.WriteLine($"Creating workspace {SampleWorkspacePath}"); await client.Workspace.Mkdirs(SampleWorkspacePath); Console.WriteLine("Downloading sample notebook"); var content = await DownloadSampleNotebook(); Console.WriteLine($"Importing sample HTML notebook to {SampleNotebookPath}"); await client.Workspace.Import(SampleNotebookPath, ExportFormat.HTML, null, content, true); var dirInfo = await client.Workspace.GetStatus(SampleNotebookPath); var notebookId = dirInfo.ObjectId.ToString(); await TestPermissions( notebookId, DatabricksUserName, client.Permissions.GetNotebookPermissionLevels, client.Permissions.GetNotebookPermissions, client.Permissions.UpdateNotebookPermissions, client.Permissions.ReplaceNotebookPermissions ); Console.WriteLine("Deleting sample workspace"); await client.Workspace.Delete(SampleWorkspacePath, true); } private static async Task ExperimentsPermissions(DatabricksClient client) { await TestPermissions( ExperimentId, DatabricksUserName, client.Permissions.GetExperimentPermissionLevels, client.Permissions.GetExperimentPermissions, client.Permissions.UpdateExperimentPermissions, client.Permissions.ReplaceExperimentPermissions ); } private static async Task RegisteredModelsPermissions(DatabricksClient client) { await TestPermissions( RegisteredModelId, DatabricksUserName, client.Permissions.GetRegisteredModelPermissionLevels, client.Permissions.GetRegisteredModelPermissions, client.Permissions.UpdateRegisteredModelPermissions, client.Permissions.ReplaceRegisteredModelPermissions ); } private static async Task SqlWarehousePermissions(DatabricksClient client) { await TestPermissions( SqlWareHouseEndpointId, DatabricksUserName, client.Permissions.GetSqlWarehousePermissionLevels, client.Permissions.GetSqlWarehousePermissions, client.Permissions.UpdateSqlWarehousePermissions, client.Permissions.ReplaceSqlWarehousePermissions ); } private static async Task RepoPermissions(DatabricksClient client) { await TestPermissions( RepositoryId, DatabricksUserName, client.Permissions.GetRepoPermissionLevels, client.Permissions.GetRepoPermissions, client.Permissions.UpdateRepoPermissions, client.Permissions.ReplaceRepoPermissions ); } private static async Task ClusterPolicyPermissions(DatabricksClient client) { await TestPermissions( ClusterPolicyId, DatabricksUserName, client.Permissions.GetClusterPolicyPermissionLevels, client.Permissions.GetClusterPolicyPermissions, client.Permissions.UpdateClusterPolicyPermissions, client.Permissions.ReplaceClusterPolicyPermissions ); } }