Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Azure Data Factory pipeline to refresh a Power BI dataset using a Service Principal, and Azure Key Vault.
{
"name": "pipeline1",
"properties": {
"activities": [
{
"name": "Call dataset refresh",
"type": "WebActivity",
"dependsOn": [
{
"activity": "Get AAD Token",
"dependencyConditions": [
"Succeeded"
]
}
],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": true
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat('https://api.powerbi.com/v1.0/myorg/groups/',pipeline().parameters.workspaceGuid,'/datasets/',pipeline().parameters.datasetGuid,'/refreshes')",
"type": "Expression"
},
"method": "POST",
"headers": {
"Authorization": {
"value": "@concat(string(activity('Get AAD Token').output.token_type),' ',string(activity('Get AAD Token').output.access_token))",
"type": "Expression"
}
},
"body": {
"notifyOption": "NoNotification"
}
}
},
{
"name": "Until dataset refresh completion",
"type": "Until",
"dependsOn": [
{
"activity": "Call dataset refresh",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"expression": {
"value": "@not(equals(first(json(string(activity('Get dataset refresh status').output)).value).status,'Unknown'))",
"type": "Expression"
},
"activities": [
{
"name": "Wait 15 seconds",
"type": "Wait",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"waitTimeInSeconds": 15
}
},
{
"name": "Get dataset refresh status",
"type": "WebActivity",
"dependsOn": [
{
"activity": "Wait 15 seconds",
"dependencyConditions": [
"Succeeded"
]
}
],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": true
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat('https://api.powerbi.com/v1.0/myorg/groups/',pipeline().parameters.workspaceGuid,'/datasets/',pipeline().parameters.datasetGuid,'/refreshes?$top=1')",
"type": "Expression"
},
"method": "GET",
"headers": {
"Authorization": {
"value": "@concat(string(activity('Get AAD Token').output.token_type),' ',string(activity('Get AAD Token').output.access_token))",
"type": "Expression"
},
"Content-Type": "application/json"
}
}
}
],
"timeout": "0.03:00:00"
}
},
{
"name": "If dataset refresh failed",
"type": "IfCondition",
"dependsOn": [
{
"activity": "Until dataset refresh completion",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"expression": {
"value": "@equals(first(json(string(activity('Get dataset refresh status').output)).value).status,'Failed')",
"type": "Expression"
},
"ifTrueActivities": [
{
"name": "SaveErrorMessages",
"description": "In case of an error in processing of the dataset, the actual messages are saved in the pipeline variable \"ProcessingErrors\".",
"type": "SetVariable",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"variableName": "ProcessingErrors",
"value": {
"value": "@string(json(first(json(string(activity('Get dataset refresh status').output)).value).serviceExceptionJson))",
"type": "Expression"
}
}
}
]
}
},
{
"name": "Get AAD Token",
"type": "WebActivity",
"dependsOn": [
{
"activity": "Get Secret from AKV",
"dependencyConditions": [
"Succeeded"
]
},
{
"activity": "Get ClientId from AKV",
"dependencyConditions": [
"Succeeded"
]
},
{
"activity": "Get TenantId from AKV",
"dependencyConditions": [
"Succeeded"
]
}
],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": true,
"secureInput": true
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat('https://login.microsoftonline.com/',activity('Get TenantId from AKV').output.value,'/oauth2/token')",
"type": "Expression"
},
"method": "POST",
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
},
"body": {
"value": "@concat('grant_type=client_credentials&resource=https://analysis.windows.net/powerbi/api&client_id=',activity('Get ClientId from AKV').output.value,'&client_secret=',encodeUriComponent(activity('Get Secret from AKV').output.value))",
"type": "Expression"
}
}
},
{
"name": "Get TenantId from AKV",
"type": "WebActivity",
"dependsOn": [],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": true,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat(pipeline().parameters.KeyVaultDNSName,'secrets/',pipeline().parameters.SecretName_TenantId,'/?api-version=7.0')",
"type": "Expression"
},
"method": "GET",
"body": {
"simple": "body"
},
"authentication": {
"type": "MSI",
"resource": "https://vault.azure.net"
}
}
},
{
"name": "Get ClientId from AKV",
"type": "WebActivity",
"dependsOn": [],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": true,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat(pipeline().parameters.KeyVaultDNSName,'secrets/',pipeline().parameters.SecretName_SPClientId,'/?api-version=7.0')",
"type": "Expression"
},
"method": "GET",
"body": {
"simple": "body"
},
"authentication": {
"type": "MSI",
"resource": "https://vault.azure.net"
}
}
},
{
"name": "Get Secret from AKV",
"type": "WebActivity",
"dependsOn": [],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": true,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"url": {
"value": "@concat(pipeline().parameters.KeyVaultDNSName,'secrets/',pipeline().parameters.SecretName_SPSecret,'/?api-version=7.0')",
"type": "Expression"
},
"method": "GET",
"body": {
"simple": "body"
},
"authentication": {
"type": "MSI",
"resource": "https://vault.azure.net"
}
}
}
],
"parameters": {
"SecretName_TenantId": {
"type": "String"
},
"SecretName_SPClientId": {
"type": "String"
},
"SecretName_SPSecret": {
"type": "String"
},
"KeyVaultDNSName": {
"type": "string"
},
"workspaceGuid": {
"type": "string"
},
"datasetGuid": {
"type": "string"
}
},
"variables": {
"ProcessingErrors": {
"type": "Boolean"
}
},
"folder": {
"name": "50-powerbi"
},
"annotations": []
},
"type": "Microsoft.DataFactory/factories/pipelines"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment