|
28 | 28 |
|
29 | 29 | databricks_metainfo=$(az resource show -g $RESOURCE_GROUP --resource-type Microsoft.Databricks/workspaces -n $ADB_WORKSPACE -o json) |
30 | 30 |
|
| 31 | +# Databricks CLI automatically picks up configuration from $DATABRICKS_HOST and $DATABRICKS_TOKEN. |
| 32 | +export DATABRICKS_HOST=$(jq -r '"https://" + .location + ".azuredatabricks.net"' <<<"$databricks_metainfo") |
| 33 | + |
31 | 34 | echo 'creating Key Vault to store Databricks PAT token' |
32 | 35 | az keyvault create -g $RESOURCE_GROUP -n $ADB_TOKEN_KEYVAULT -o tsv >>log.txt |
33 | 36 |
|
34 | 37 | echo 'checking PAT token secret presence in Key Vault' |
35 | 38 | databricks_token_secret_name="DATABRICKS-TOKEN" |
36 | 39 | pat_token_secret=$(az keyvault secret list --vault-name $ADB_TOKEN_KEYVAULT --query "[?ends_with(id, '/$databricks_token_secret_name')].id" -o tsv) |
37 | 40 | if [[ -z "$pat_token_secret" ]]; then |
38 | | - echo 'PAT token secret not present. Creating dummy entry for user to fill in manually' |
39 | | - az keyvault secret set --vault-name $ADB_TOKEN_KEYVAULT -n "$databricks_token_secret_name" --file /dev/null -o tsv >>log.txt |
| 41 | + echo 'generating PAT token' |
| 42 | + wsId=$(jq -r .id <<<"$databricks_metainfo") |
| 43 | + |
| 44 | + # Get a token for the global Databricks application. |
| 45 | + # The resource name is fixed and never changes. |
| 46 | + token_response=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d) |
| 47 | + token=$(jq .accessToken -r <<< "$token_response") |
| 48 | + |
| 49 | + # Get a token for the Azure management API |
| 50 | + token_response=$(az account get-access-token --resource https://management.core.windows.net/) |
| 51 | + azToken=$(jq .accessToken -r <<< "$token_response") |
| 52 | + |
| 53 | + api_response=$(curl -sf "$DATABRICKS_HOST/api/2.0/token/create" \ |
| 54 | + -H "Authorization: Bearer $token" \ |
| 55 | + -H "X-Databricks-Azure-SP-Management-Token:$azToken" \ |
| 56 | + -H "X-Databricks-Azure-Workspace-Resource-Id:$wsId" \ |
| 57 | + -d '{ "lifetime_seconds": 864000, "comment": "streaming-at-scale generated token" }') |
| 58 | + pat_token=$(jq .token_value -r <<< "$api_response") |
| 59 | + |
| 60 | + az keyvault secret set --vault-name "$ADB_TOKEN_KEYVAULT" --name "$databricks_token_secret_name" --value "$pat_token" |
40 | 61 | fi |
41 | 62 |
|
42 | | -echo 'checking PAT token presence in Key Vault' |
43 | | -pat_token=$(az keyvault secret show --vault-name $ADB_TOKEN_KEYVAULT -n "$databricks_token_secret_name" --query value -o tsv) |
44 | | - |
45 | | -if [[ -z "$pat_token" ]]; then |
46 | | - echo 'PAT token not present. Requesting user to fill in manually' |
47 | | - databricks_login_url=$(jq -r '"https://" + .location + ".azuredatabricks.net/aad/auth?has=&Workspace=" + .id + "&WorkspaceResourceGroupUri="+ .properties.managedResourceGroupId' <<<"$databricks_metainfo") |
48 | | - |
49 | | - kv_info=$(az resource show -g $RESOURCE_GROUP --resource-type Microsoft.KeyVault/vaults -n $ADB_TOKEN_KEYVAULT -o json) |
50 | | - kv_secrets_url=$(jq -r '"https://portal.azure.com/#@" + .properties.tenantId + "/resource" + .id + "/secrets"' <<<$kv_info) |
51 | | - |
52 | | - cat <<EOM |
53 | | - ERROR: Missing PAT token in Key Vault (this is normal the first time you run this script). |
54 | | -
|
55 | | - You need to manually create a Databricks PAT token and register it into the Key Vault as follows, |
56 | | - then rerun this script or pipeline. |
57 | | -
|
58 | | - - Navigate to: |
59 | | - $databricks_login_url |
60 | | - Create a PAT token and copy it to the clipboard: |
61 | | - https://docs.azuredatabricks.net/api/latest/authentication.html#generate-a-token |
62 | | - - Navigate to: |
63 | | - $kv_secrets_url |
64 | | - Click $databricks_token_secret_name |
65 | | - Click "+ New Version" |
66 | | - As value, enter the PAT token you copied |
67 | | - Click Create |
68 | | - - The script will wait for the PAT to be copied into the Key Vault |
69 | | - If you stop the script, you can resume it running the following command: |
70 | | - ./create-solution.sh -d "$PREFIX" -t $TESTTYPE -s PT |
71 | | -
|
72 | | -EOM |
73 | | - |
74 | | - echo 'waiting for PAT (polling every 5 secs)...' |
75 | | - while : ; do |
76 | | - pat_token=$(az keyvault secret show --vault-name "$ADB_TOKEN_KEYVAULT" --name "$databricks_token_secret_name" --query value -o tsv | grep dapi || true) |
77 | | - if [ ! -z "$pat_token" ]; then break; fi |
78 | | - sleep 5 |
79 | | - done |
80 | | - echo 'PAT detected' |
81 | | -fi |
82 | | - |
83 | | -# Databricks CLI automatically picks up configuration from these two environment variables. |
84 | | -export DATABRICKS_HOST=$(jq -r '"https://" + .location + ".azuredatabricks.net"' <<<"$databricks_metainfo") |
85 | | -export DATABRICKS_TOKEN="$pat_token" |
| 63 | +echo 'getting PAT token from Key Vault' |
| 64 | +export DATABRICKS_TOKEN=$(az keyvault secret show --vault-name $ADB_TOKEN_KEYVAULT -n "$databricks_token_secret_name" --query value -o tsv) |
86 | 65 |
|
87 | 66 | fi |
88 | 67 | echo 'checking Databricks secrets scope exists' |
|
0 commit comments