sonic-build/routes/ui.js (120 lines of code) (raw):

var express = require('express'); var router = express.Router(); var utils = require('./utils'); const request = utils.request; const constants = require('./constants'); const kusto = require('./kusto'); const util = require('util'); const navigator_pipelines = [{name:'Pipelines', href:'/ui/sonic/Pipelines'}]; const buildUrlFormat = "https://dev.azure.com/mssonic/build/_apis/build/builds?definitions=%s&branchName=refs/heads/%s&statusFilter=completed"; const buildResultUrlFormat = "https://dev.azure.com/mssonic/build/_build/results?buildId=%s&view=artifacts&pathAsName=false&type=publishedArtifacts"; const artifactUrlFormat = "https://dev.azure.com/mssonic/build/_apis/build/builds/%s/artifacts"; const query_sonicimagebuilds = 'GetSonicImageBuilds() | project Sequence=row_number(), DefinitionId, DefinitionName, Platform, SourceBranch' const query_sonicbuilds = 'GetSonicBuilds() | project Sequence=row_number(), DefinitionId, DefinitionName, Platform, SourceBranch' function GetArtifactItems(items){ var results = []; if (items == null){ return results; } for(var i= 0; i < items.length; i++){ var item = items[i]; if (item.name.startsWith("/target/versions") || item.name.startsWith('/target/baseimage')){ continue; } results.push(item); var itemResults = GetArtifactItems(item.items); item['items'] = null; results.push(...itemResults); } return results; } function GetArtifacts(artifacts){ for(var item in artifacts.item); } /* Get SONiC pipelines */ router.get('/sonic/pipelines', async function(req, res, next) { var queryCommand = query_sonicimagebuilds; if (req.query.buildType == 'all'){ queryCommand = query_sonicbuilds; } var fromAzureAPI = req.query.fromAzureAPI == 'true'; var results = await kusto.query(queryCommand, 1000 * 20, fromAzureAPI=fromAzureAPI); res.render('pipelines', { title: 'Pipelines', rows: results['_rows'], fromAzureAPI: fromAzureAPI, buildType: req.query.buildType, navigators:[] }); }); /* Get SONiC builds. */ router.get('/sonic/pipelines/:definitionId/builds', async function(req, res, next) { var params = req.params; var query = req.query; var url = util.format(buildUrlFormat, params.definitionId, query.branchName); var buildsRes = await request('GET', url); var builds = JSON.parse(buildsRes); res.render('builds', { title: 'Builds', rows: builds['value'], branchName: query.branchName, navigators:navigator_pipelines }); }); /* Get SONiC artifacts. */ router.get('/sonic/pipelines/:definitionId/builds/:buildId/artifacts', async function(req, res, next) { var params = req.params; var query = req.query; var url = util.format(artifactUrlFormat, params.buildId); var navigator_builds = navigator_pipelines.concat([{name:'Builds', href:`/ui/sonic/pipelines/${params.definitionId}/builds?branchName=${query.branchName}`}]); var artifactsRes = await request('GET', url); var artifacts = JSON.parse(artifactsRes); for(var i=0; i<artifacts['value'].length; i++){ var row = artifacts['value'][i]; row["seq"] = i + 1; row["definitionId"] = params.definitionId; row["buildId"] = params.buildId; } res.render('artifact-names', { title: 'Artifacts', rows: artifacts['value'], branchName: query.branchName, navigators: navigator_builds}); }); /* Get SONiC artifact files. */ router.get('/sonic/pipelines/:definitionId/builds/:buildId/artifacts/:artifactId', async function(req, res, next) { var params = req.params; var query = req.query; var sourceUrl = util.format(buildResultUrlFormat, params.buildId); var navigator_artifacts = navigator_pipelines.concat([{name:'Builds', href:`/sonic/pipelines/${params.definitionId}/builds?branchName=${query.branchName}`}, {name:'Artifacts', href:`/ui/sonic/pipelines/${params.definitionId}/builds/${params.buildId}/artifacts?branchName=${query.branchName}`}, ]); var url = 'https://dev.azure.com/mssonic/_apis/Contribution/HierarchyQuery/project/be1b070f-be15-4154-aade-b1d3bfb17054'; var body = {"contributionIds":["ms.vss-build-web.run-artifacts-data-provider"], "dataProviderContext":{"properties":{ "artifactId":params.artifactId, "buildId":params.buildId, "sourcePage":{ "url": sourceUrl, "routeValues":{"project":"build","action":"Execute"} }}}}; var options = { headers: {'accept': 'application/json;api-version=5.0-preview.1', 'content-type': 'application/json', }, body: JSON.stringify(body), }; var artifactsRes = await request('POST', url, options); var artifacts = JSON.parse(artifactsRes); var dataProvider = artifacts['dataProviders']['ms.vss-build-web.run-artifacts-data-provider']; var items = GetArtifactItems(dataProvider.items); for (var i=0; i<items.length; i++){ items[i]['seq'] = i + 1; } var platform = constants.DEFINITIONS[params.definitionId]; var artifactUrl = "/api/sonic/artifacts?branchName=" + query.branchName; if (platform != null){ artifactUrl = artifactUrl + "&platform=" + platform; } else{ artifactUrl = artifactUrl + "&definitionId=" + params.definitionId + "&artifactName=" + query.artifactName; } res.render('artifacts', { title: 'Artifact ' + query.artifactName, rows: items, artifactUrl: artifactUrl, buildId: params.buildId, navigators: navigator_artifacts}); }); module.exports = router;