sonic-build/routes/kusto.js (83 lines of code) (raw):
const KustoClient = require("azure-kusto-data").Client;
const KustoConnectionStringBuilder = require("azure-kusto-data").KustoConnectionStringBuilder;
const ClientRequestProperties = require("azure-kusto-data").ClientRequestProperties;
const uuidv4 = require("uuid/v4");
const NodeCache = require( "node-cache" );
var utils = require('./utils');
const request = utils.request;
const clusterConectionString = "https://sonic.westus2.kusto.windows.net";
const database = "build";
const kcs = KustoConnectionStringBuilder.withAadManagedIdentities(clusterConectionString);
const kustoClient = new KustoClient(kcs);
const TEST = false;
/* Query builds from Azure Pipelines, only for test
Only support to list the default branch for a definition, it is hard to list all the branches for Azure Pipelines API in a single query*/
async function test_queryBuilds(){
var url = "https://dev.azure.com/mssonic/build/_apis/build/definitions?api-version=6.0&includeAllProperties=true";
var definitionsRes = await request('GET', url);
var definitions = JSON.parse(definitionsRes);
var results = {};
//Sequence, DefinitionId, DefinitionName, Platform, SourceBranch
var rows = [];
for (var i=0; i<definitions.value.length; i++){
var row = [];
var definition = definitions.value[i];
if (definition.path.startsWith("\\selftest") || definition.path.startsWith("\\fips")){
continue;
}
var platform =definition.name.startsWith("Azure.sonic-buildimage.official.") ? definition.name.substring(32) : "";
row.push(rows.length+1);
row.push(definition.id);
row.push(definition.name);
row.push(platform);
row.push(definition.repository.defaultBranch);
rows.push(row);
}
rows.sort((a, b) => a[2].localeCompare(b[2]));
for (var i=0; i<rows.length; i++){
rows[i][0] = i+1;
}
results['_rows'] = rows;
return results;
}
async function query(queryString, timoutInSeconds = 1000 * 20, fromAzureAPI = false) {
let clientRequestProps = new ClientRequestProperties();
clientRequestProps.setTimeout(timoutInSeconds);
clientRequestProps.clientRequestId = `MyApp.MyActivity;${uuidv4()}`;
if (TEST || fromAzureAPI){
return await test_queryBuilds();
}
try {
results = await kustoClient.execute(database, queryString, clientRequestProps);
var data = [];
return results.primaryResults[0];
}
catch (error) {
console.log(error);
throw error;
}
}
function parseQueryResults(items){
var columns = items['columns'];
var rows = items['_rows'];
var results = [];
for (var i=0; i<rows.length; i++){
var row = rows[i];
var result = {};
for (var j=0; j<columns.length; j++){
result[columns[j].name]=row[j];
}
results.push(result);
}
return results;
}
function getColumnNames(items){
var columns = items['columns'];
var results = [];
for (var i=0; i<columns.length; i++){
results.push(columns[i].name);
}
return results;
}
module.exports = Object.freeze({
query: query,
parseQueryResults: parseQueryResults,
getColumnNames: getColumnNames,
});