sonic-build/routes/api.js (82 lines of code) (raw):

var express = require('express'); var router = express.Router(); const util = require('util'); var utils = require('./utils'); const request = utils.request; const constants = require('./constants'); const succeededBuildUrlFormat = "https://dev.azure.com/%s/%s/_apis/build/builds?definitions=%s&branchName=refs/heads/%s&resultFilter=succeeded&statusFilter=completed&$top=1"; const artifactUrlFormat = "https://dev.azure.com/%s/%s/_apis/build/builds/%s/artifacts?artifactName=%s"; const buildResultUrlFormat = "https://dev.azure.com/%s/%s/_build/results?buildId=%s&view=results"; const platformMapping = constants.PLATFORMS; async function GetLatestBuild(req) { var params = req.params; var query = req.query; var succeededBuildUrl = util.format(succeededBuildUrlFormat, params.organization, params.project, params.definitionId, query.branchName); var buildRes = await request('GET', succeededBuildUrl); var build = JSON.parse(buildRes); return build; } async function RedirectArtifacts(req, res, next) { var params = req.params; var query = req.query; var buildId = params.buildId; if (isNaN(parseInt(buildId))){ if (buildId != 'latest'){ var message = util.format("The parameter buildId '%s' is not correct, should be a number value or the value 'laster'.", buildId); return res.status(400).json({status: 400, message: message}); } var build = await GetLatestBuild(req); var value = build.value[0]; buildId = value.id; } var artifactUrl = util.format(artifactUrlFormat, params.organization, params.project, buildId, query.artifactName); var artifactRes = await request('GET', artifactUrl, {headers: {"Content-type": "application/json"}}); var artifact = JSON.parse(artifactRes); var downloadUrl = artifact.resource.downloadUrl; if (query.subPath != null){ if (query.format != "zip"){ var queryFormat = query.format == null ? 'file' : query.format; downloadUrl = downloadUrl.replace('format=zip', util.format('format=%s', queryFormat)); } var subPath = query.subPath; if (!subPath.startsWith('/')){ subPath = '/' + subPath; } downloadUrl = downloadUrl + "&subPath=" + encodeURIComponent(subPath); } res.redirect(downloadUrl); } async function RedirectSonicArtifacts(req, res, next) { var params = req.params; var query = req.query; params['organization'] = 'mssonic'; params['project'] = 'build'; params['buildId'] = "latest"; if (query['buildId'] != null) { params['buildId'] = query['buildId']; } var definitionId = query.definitionId; var platform = query.platform; if (definitionId == null){ if (platform == null){ var message = "The parameter platform is empty."; return res.status(400).json({status: 400, message: message}); } definitionId = platformMapping[platform]; if (definitionId == null){ var message = util.format("The platform '%s' is not defined.", platform); return res.status(400).json({status: 400, message: message}); } } params['definitionId'] = definitionId; if (query.target != null){ query.subPath = query.target; } if (query['artifactName'] == null){ query['artifactName'] = 'sonic-buildimage.' + platform; } await RedirectArtifacts(req, res, next); } /* Get the build artifacts for all public projects */ router.get('/azp/:organization/:project/_apis/build/definition/:definitionId/build/:buildId/artifacts', RedirectArtifacts); /* Get the SONiC build artifacts */ router.get('/sonic/artifacts', RedirectSonicArtifacts); module.exports = router;