PowerBI Report Server : Planifier le rafraîchissement des données via Script

L’API Rest de PowerBI Report Server

Suite au déploiement automatisé d’un rapport power BI vers le PowerBI Report Server (cf. PowerBI Report Server : Déployer et configurer un rapport via Script), une autre opération consiste à planifier le rafraîchissement du rapport.

A nouveau, nous pouvons faire appel à l’API Rest de PowerBI Report Server. Les planifications étant accessibles sur la route CacheRefreshPlans.

La planification

Pour créer une nouvelle planification, il s’agit d’utiliser sur cette route la méthode POST en lui fournissant un objet Json dont la structure est celle d’une planification.

Il faut y trouver :

  • Un propriétaire
  • Une description
  • L’élément à rafraîchir (représenté par son chemin virtuel)
  • Le type d’événement qui doit être DataModelRefresh
  • Une planification
  • Le cas échéants des valeurs pour les paramètres

Ce qui peut donner le script PowerShell suivant :

#Création de l'objet Json de planification
$payload = convertTo-Json (@{
"Owner" = "Domain\User";
"Description" = "Planification créée automatiquement"
"CatalogItemPath" = "/MonRapportPublie";
"EventType"="DataModelRefresh";
"Schedule" = @{"ScheduleID" = "";
"Definition" = @{
"StartDateTime" = "2018-11-14T16:00:00.00+02:00"
}
};
"ParameterValues" = @()
})


#Création de la planification sur le serveur
Invoke-WebRequest -Uri $powerBIReportsCacheRefreshPlansUri -Method POST -Body $payload -ContentType "application/json" -UseDefaultCredentials

Nous disposons désormais d’un rapport dont le rafraîchissement est planifié, la publication ayant été pilotée uniquement en PowerShell.

PowerBI Report Server : Déployer et configurer un rapport via Script

L’API Rest de PowerBI Report Server

Dans le cadre d’un industrialisation du serveur de rapport, il est utile de pouvoir déployer, configurer et planifier le rafraîchissement de rapports PowerBI de manière automatisée.

PowerBI Report Server est une version enrichie de SQL Server Reporting Services 2017.

Il est par conséquent possible d’utiliser la récente API REST de Reporting Services pour réaliser certaines opérations via Script. Elle se trouve par défaut à cet emplacement : http://<urlserver>/reports/api/v2.0

La documentation exhaustive de l’API s’obtient à partir du fichier swagger. Elle a été mise en forme à cette adresse : https://app.swaggerhub.com/apis/microsoft-rs/pbirs/2.0

Les exemples sont ici fournis en PowerShell, mais un proxy .Net peut être obtenu à partir du fichier Swagger pour manipuler l’API au travers d’un modèle objet.

Le déploiement

L’API présente notamment une route PowerBIReports qui permet d’obtenir la liste des rapports PowerBI publiés si on la requête en GET.

Pour déployer via Script, la logique est d’appeler cette Url en POST avec la bonne structure.

Voici un extrait de code PowerShell permettant le déploiement d’un rapport depuis un dossier vers le serveur de rapport :

#Déclaration des variables
$ReportPortalUri = 'http://localhost/reports'
$uploadItemPath = 'D:\Repository\MonRapport.pbix'
$destName = 'MonRapportPublie'


#Liste des rapports existants
$powerBIReportsUri = $ReportPortalUri + "/api/v2.0/PowerBIReports"
$res = Invoke-WebRequest -Uri $powerBIReportsUri -Method Get -UseDefaultCredentials


#Upload du rapport (en POST - échouera s'il existe déja)
$bytes = [System.IO.File]::ReadAllBytes($uploadItemPath)
$payload = @{
"@odata.type" = "#Model.PowerBIReport";
"Content" = [System.Convert]::ToBase64String($bytes);
"ContentType"="";
"Name" = $destName;
"Path" = '/';
} | ConvertTo-Json
Invoke-WebRequest -Uri $powerBIReportsUri -Method Post -Body $payload -ContentType "application/json" -UseDefaultCredentials | Out-Null

La méthode POST créé le rapport s’il n’existe pas et retourne une erreur s’il existe déjà. Dans ce deuxième cas, la méthode PATCH devra être préférée puisqu’elle permet la mise à jour.

Le rapport apparait désormais sur le portail.

La configuration

A la suite de la publication, une opération fréquente consiste à modifier la configuration du rapport, une chaine de connexion par exemple. Il est également possible d’automatiser cette opération.

Les chaines de connexion d’un rapport sont exposées dans les DataSources de ce rapport. Cette collection est accessible dans l’API suivant cette route : PowerBIReports($id)/DataSources

Le script suivant permet d’obtenir la liste des sources de données d’un rapport, dont on a récupéré précédemment l’identifiant, et de modifier les credentials associés

#Déclaration des variables
$id = ""
$ReportPortalUri = 'http://localhost/reports'
$powerBIReportsDataSourceUri = $ReportPortalUri + "/api/v2.0/PowerBIReports($id)/DataSources"


#Récupération des sources de données
$res = Invoke-WebRequest -Uri $powerBIReportsDataSourceUri -Method Get -UseDefaultCredentials
$content =convertFrom-json ($res.Content)
$datasources = $content.value


#Affectation des credentials dans les objets DataSource
Foreach($dataSource in $datasources)
{
$dataModelDatasource = $dataSource.DataModelDataSource
$dataModelDatasource.Username = "Domain\user"
$dataModelDatasource.Secret = "Mdp"
}
#la serialisation Json par défaut ne traite les tableaux que sur 2 niveaux, il faut donc la forcer à au moins 3
$payload = convertTo-Json -depth 3($datasources)


#Modification des datasources sur le serveur de rapport
Invoke-WebRequest -Uri $powerBIReportsDataSourceUri -Method PATCH -Body $payload -ContentType "application/json" -UseDefaultCredentials

Les informations d’authentification sont désormais modifiées.

A suivre : La création de la planification du rafraîchissement des rapports ainsi déployés