From 20ec72db67baababefc50cb3d1516dbcd00ad7ca Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:27:10 +0530 Subject: [PATCH 01/25] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ed104edf..2ab30ec0 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,11 @@ For using any credentials like Azure Service Principal in your workflow, add the with: creds: ${{ secrets.AZURE_CREDENTIALS }} ``` - + +## Breaking changes + +The minor versions from `1.1` such as `1.1.x` will stop to work due to a breaking change, we recommend to use the `v1` tag which is promised to support, We are bumping the minor version upgrade to `1.2.1` now, use this if needs the pinning. + ## Azure Load Testing Action This section describes the Azure Load Testing GitHub action. You can use this action by referencing `azure/load-testing@v1` action in your workflow. The action runs on Windows, Linux, and Mac runners. From 90127646956ddb7ebaa322cc0980dd851232c0f7 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:27:40 +0530 Subject: [PATCH 02/25] Refactor cloud token scopes to use TaskParameters --- lib/Constants/EnvironmentConstants.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/Constants/EnvironmentConstants.js b/lib/Constants/EnvironmentConstants.js index e5779f87..9a591adc 100644 --- a/lib/Constants/EnvironmentConstants.js +++ b/lib/Constants/EnvironmentConstants.js @@ -1,14 +1,15 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AzureUSGovernmentCloud = exports.AzurePublicCloud = void 0; +const TaskParameters_1 = require("../models/TaskParameters"); exports.AzurePublicCloud = { cloudName: "AzureCloud", - armTokenScope: "https://management.core.windows.net", - dataPlaneTokenScope: "https://loadtest.azure-dev.com", + armTokenScope: TaskParameters_1.armPublicTokenScope, + dataPlaneTokenScope: TaskParameters_1.publicTokenScope, armEndpoint: "https://management.azure.com", }; exports.AzureUSGovernmentCloud = { cloudName: "AzureUSGovernment", - armTokenScope: "https://management.usgovcloudapi.net", - dataPlaneTokenScope: "https://cnt-prod.loadtesting.azure.us", + armTokenScope: TaskParameters_1.armUsGovernmentTokenScope, + dataPlaneTokenScope: TaskParameters_1.usGovernmentTokenScope, }; From 3d89755ff4ba82f9f6cf60be9e17c37064f4798e Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:28:10 +0530 Subject: [PATCH 03/25] Add token scopes for Azure management --- lib/models/TaskParameters.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/models/TaskParameters.js b/lib/models/TaskParameters.js index c8ad2e54..a3d8e6a6 100644 --- a/lib/models/TaskParameters.js +++ b/lib/models/TaskParameters.js @@ -1,2 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.armUsGovernmentTokenScope = exports.armPublicTokenScope = exports.usGovernmentTokenScope = exports.publicTokenScope = void 0; +exports.publicTokenScope = "https://cnt-prod.loadtesting.azure.com"; +exports.usGovernmentTokenScope = "https://cnt-prod.loadtesting.azure.us"; +exports.armPublicTokenScope = "https://management.core.windows.net"; +exports.armUsGovernmentTokenScope = "https://management.usgovcloudapi.net"; From c4904b36f6d0e00d379711b402222aed7bafc716 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:29:11 +0530 Subject: [PATCH 04/25] Simplify token retrieval in AuthenticatorService Refactor getTokenAPI to simplify command arguments. --- lib/services/AuthenticatorService.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/services/AuthenticatorService.js b/lib/services/AuthenticatorService.js index 679d8411..84e47086 100644 --- a/lib/services/AuthenticatorService.js +++ b/lib/services/AuthenticatorService.js @@ -43,8 +43,8 @@ class AuthenticatorService { this.taskParameters = taskParameters; } getDataPlaneHeader(apicallType) { + var _a; return __awaiter(this, void 0, void 0, function* () { - var _a; if (!this.isTokenValid(UtilModels_1.TokenScope.Dataplane)) { let tokenRes = yield this.getTokenAPI(UtilModels_1.TokenScope.Dataplane); this.dataPlanetoken = tokenRes; @@ -71,9 +71,7 @@ class AuthenticatorService { return __awaiter(this, void 0, void 0, function* () { let tokenScopeDecoded = scope == UtilModels_1.TokenScope.Dataplane ? this.taskParameters.dataPlaneTokenScope : this.taskParameters.armTokenScope; try { - const cmdArguments = ["account", "get-access-token", "--resource"]; - cmdArguments.push(tokenScopeDecoded); - let result = yield AzCliUtility.execAz(cmdArguments); + let result = yield AzCliUtility.execAz(tokenScopeDecoded); let token = result.accessToken; scope == UtilModels_1.TokenScope.ControlPlane ? this.controlPlaneToken = token : this.dataPlanetoken = token; return token; From 2d78928e2de868e6dd3ea89212d7b897de7bda2d Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:29:39 +0530 Subject: [PATCH 05/25] Update AzCliUtility.js --- lib/Utils/AzCliUtility.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/Utils/AzCliUtility.js b/lib/Utils/AzCliUtility.js index 4c847803..0c15dce2 100644 --- a/lib/Utils/AzCliUtility.js +++ b/lib/Utils/AzCliUtility.js @@ -9,13 +9,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.execAz = void 0; +exports.getSubscriptions = exports.execAz = void 0; const child_process_1 = require("child_process"); -function execAz(cmdArguments) { +function execAz(tokenScope) { + return __awaiter(this, void 0, void 0, function* () { + const cmdArguments = ["account", "get-access-token", "--resource"]; + cmdArguments.push(tokenScope); + return runCommand(cmdArguments); + }); +} +exports.execAz = execAz; +function getSubscriptions() { + return __awaiter(this, void 0, void 0, function* () { + const cmdArguments = ["cloud", "show"]; + return runCommand(cmdArguments); + }); +} +exports.getSubscriptions = getSubscriptions; +function runCommand(cmdArguments) { return __awaiter(this, void 0, void 0, function* () { const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: true }, (error, stdout) => { + (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: false }, (error, stdout) => { if (error) { return reject(error); } @@ -31,4 +46,3 @@ function execAz(cmdArguments) { }); }); } -exports.execAz = execAz; From f227175b909669d6d150a2d9fdc333be5b7f9b47 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:30:04 +0530 Subject: [PATCH 06/25] Refactor httpClientRetries for improved readability --- lib/Utils/FetchUtils.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/Utils/FetchUtils.js b/lib/Utils/FetchUtils.js index 61bc19eb..b16ea1e4 100644 --- a/lib/Utils/FetchUtils.js +++ b/lib/Utils/FetchUtils.js @@ -47,11 +47,13 @@ const methodEnumToString = { [UtilModels_1.FetchCallType.patch]: "patch" }; // (note mohit): shift to the enum later. -function httpClientRetries(urlSuffix_1, header_1, method_1) { - return __awaiter(this, arguments, void 0, function* (urlSuffix, header, method, retries = 1, data, isUploadCall = true, log = true) { +function httpClientRetries(urlSuffix, header, method, retries = 1, data, isUploadCall = true, log = true) { + return __awaiter(this, void 0, void 0, function* () { let httpResponse; + const retrriableCodes = [408, 429, 500, 502, 503, 504]; // 408 - Request Timeout, 429 - Too Many Requests, 500 - Internal Server Error, 502 - Bad Gateway, 503 - Service Unavailable, 504 - Gateway Timeout + let backOffTimeForRetry = 5; // seconds + let correlationId = `gh-actions-${(0, CommonUtils_1.getUniqueId)()}`; try { - let correlationId = `gh-actions-${(0, CommonUtils_1.getUniqueId)()}`; header[UtilModels_1.correlationHeader] = correlationId; // even if we put console.debug its printing along with the logs, so lets just go ahead with the differentiation with azdo, so we can search the timeframe for azdo in correlationid and resource filter. if (method == UtilModels_1.FetchCallType.get) { httpResponse = yield httpClient.get(urlSuffix, header); @@ -79,7 +81,10 @@ function httpClientRetries(urlSuffix_1, header_1, method_1) { if (httpResponse.message.statusCode != undefined && httpResponse.message.statusCode >= 300) { CoreUtils.debug(`correlation id : ${correlationId}`); } - if (httpResponse.message.statusCode != undefined && [408, 429, 502, 503, 504].includes(httpResponse.message.statusCode)) { + if (httpResponse.message.statusCode != undefined && retrriableCodes.includes(httpResponse.message.statusCode)) { + if (method == UtilModels_1.FetchCallType.patch) { + backOffTimeForRetry += 60; // extra 60 seconds for patch, basically this happens when the service didnot handle some of the external service dependencies, and the external can take time to recover. + } let err = yield (0, CommonUtils_1.getResultObj)(httpResponse); throw { message: (err && err.error && err.error.message) ? err.error.message : (0, CommonUtils_1.errorCorrection)(httpResponse) }; // throwing as message to catch it as err.message } @@ -87,7 +92,7 @@ function httpClientRetries(urlSuffix_1, header_1, method_1) { } catch (err) { if (retries) { - let sleeptime = (5 - retries) * 1000 + Math.floor(Math.random() * 5001); + let sleeptime = backOffTimeForRetry * 1000; if (log) { console.log(`Failed to connect to ${urlSuffix} due to ${err.message}, retrying in ${sleeptime / 1000} seconds`); } @@ -95,6 +100,7 @@ function httpClientRetries(urlSuffix_1, header_1, method_1) { return yield httpClientRetries(urlSuffix, header, method, retries - 1, data); } else { + console.log(err, "\ncorrelationId:" + correlationId); throw new Error(`Operation did not succeed after 3 retries. Pipeline failed with error : ${err.message}`); } } From 92db3c3b58bba45f6b3f9262f716a718a3db4a88 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:30:34 +0530 Subject: [PATCH 07/25] Refactor getTaskParameters and update subscription logic --- lib/Utils/TaskParametersUtil.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/Utils/TaskParametersUtil.js b/lib/Utils/TaskParametersUtil.js index bee71920..72d32d78 100644 --- a/lib/Utils/TaskParametersUtil.js +++ b/lib/Utils/TaskParametersUtil.js @@ -39,8 +39,8 @@ const InputConstants = __importStar(require("../Constants/InputConstants")); const EnvironmentConstants = __importStar(require("../Constants/EnvironmentConstants")); const AzCliUtility = __importStar(require("../Utils/AzCliUtility")); class TaskParametersUtil { - static getTaskParameters() { - return __awaiter(this, arguments, void 0, function* (isPostProcessJob = false) { + static getTaskParameters(isPostProcessJob = false) { + return __awaiter(this, void 0, void 0, function* () { let taskParameters = { subscriptionId: '', subscriptionName: '', @@ -73,8 +73,7 @@ class TaskParametersUtil { static setSubscriptionParameters(taskParameters) { return __awaiter(this, void 0, void 0, function* () { try { - const cmdArguments = ["account", "show"]; - var result = yield AzCliUtility.execAz(cmdArguments); + var result = yield AzCliUtility.getSubscriptions(); taskParameters.subscriptionId = result.id; taskParameters.subscriptionName = result.name; } @@ -88,8 +87,7 @@ class TaskParametersUtil { static setEndpointAndScopeParameters(taskParameters) { return __awaiter(this, void 0, void 0, function* () { try { - const cmdArguments = ["cloud", "show"]; - var result = yield AzCliUtility.execAz(cmdArguments); + var result = yield AzCliUtility.getSubscriptions(); let env = result ? result.name : null; taskParameters.environment = env !== null && env !== void 0 ? env : EnvironmentConstants.AzurePublicCloud.cloudName; let endpointUrl = (result && result.endpoints) ? result.endpoints.resourceManager : null; From 2fc6042d2fb0d2f7102450fc5a4a6c572aed2b17 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:30:59 +0530 Subject: [PATCH 08/25] Refactor token scopes to use enums --- src/Constants/EnvironmentConstants.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Constants/EnvironmentConstants.ts b/src/Constants/EnvironmentConstants.ts index 7a7e33bf..3f17a2b5 100644 --- a/src/Constants/EnvironmentConstants.ts +++ b/src/Constants/EnvironmentConstants.ts @@ -1,19 +1,21 @@ +import { ControlPlaneTokenScope, DataPlaneTokenScope, publicTokenScope, usGovernmentTokenScope, armUsGovernmentTokenScope, armPublicTokenScope } from "../models/TaskParameters"; + type EnvironmentSettings = { cloudName: string; - armTokenScope: string; - dataPlaneTokenScope: string; + armTokenScope: ControlPlaneTokenScope; + dataPlaneTokenScope: DataPlaneTokenScope; armEndpoint?: string; } export const AzurePublicCloud: EnvironmentSettings = { cloudName: "AzureCloud", - armTokenScope: "https://management.core.windows.net", - dataPlaneTokenScope: "https://loadtest.azure-dev.com", + armTokenScope: armPublicTokenScope, + dataPlaneTokenScope: publicTokenScope, armEndpoint: "https://management.azure.com", } export const AzureUSGovernmentCloud: EnvironmentSettings = { cloudName: "AzureUSGovernment", - armTokenScope: "https://management.usgovcloudapi.net", - dataPlaneTokenScope: "https://cnt-prod.loadtesting.azure.us", -} \ No newline at end of file + armTokenScope: armUsGovernmentTokenScope, + dataPlaneTokenScope: usGovernmentTokenScope, +} From 4fa0cc45e1d5d53983cb2aad6c67dd4e11544c19 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:31:23 +0530 Subject: [PATCH 09/25] Refactor token scopes in TaskParameters interface --- src/models/TaskParameters.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/models/TaskParameters.ts b/src/models/TaskParameters.ts index 27e954f5..2317ee48 100644 --- a/src/models/TaskParameters.ts +++ b/src/models/TaskParameters.ts @@ -1,9 +1,16 @@ +export const publicTokenScope = "https://cnt-prod.loadtesting.azure.com"; +export const usGovernmentTokenScope = "https://cnt-prod.loadtesting.azure.us"; +export const armPublicTokenScope = "https://management.core.windows.net"; +export const armUsGovernmentTokenScope = "https://management.usgovcloudapi.net"; +export type ControlPlaneTokenScope = typeof armPublicTokenScope | typeof armUsGovernmentTokenScope; +export type DataPlaneTokenScope = typeof publicTokenScope | typeof usGovernmentTokenScope; + export interface TaskParameters { subscriptionId: string; subscriptionName: string; environment: string; - armTokenScope: string; - dataPlaneTokenScope: string; + armTokenScope: ControlPlaneTokenScope; + dataPlaneTokenScope: DataPlaneTokenScope; resourceId: string; armEndpoint?: string; -} \ No newline at end of file +} From 00a1b8636813619051ae1f0476df4f4277e12bda Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:31:53 +0530 Subject: [PATCH 10/25] Simplify token retrieval in getTokenAPI Refactor getTokenAPI to simplify command arguments. --- src/services/AuthenticatorService.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/services/AuthenticatorService.ts b/src/services/AuthenticatorService.ts index 57e5f49b..b4cf148e 100644 --- a/src/services/AuthenticatorService.ts +++ b/src/services/AuthenticatorService.ts @@ -41,9 +41,7 @@ export class AuthenticatorService { { let tokenScopeDecoded = scope == TokenScope.Dataplane ? this.taskParameters.dataPlaneTokenScope : this.taskParameters.armTokenScope; try { - const cmdArguments = ["account", "get-access-token", "--resource"]; - cmdArguments.push(tokenScopeDecoded); - let result: any = await AzCliUtility.execAz(cmdArguments); + let result: any = await AzCliUtility.execAz(tokenScopeDecoded); let token = result.accessToken; scope == TokenScope.ControlPlane ? this.controlPlaneToken = token : this.dataPlanetoken = token; return token; @@ -66,4 +64,4 @@ export class AuthenticatorService { console.log("Error in getting the token"); } } -} \ No newline at end of file +} From c6bfcebb81d0c4f1e02be0c45eed965ec051612f Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:32:12 +0530 Subject: [PATCH 11/25] Refactor execAz function to accept token scope --- src/Utils/AzCliUtility.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index 016d3a35..ea1e48f4 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -1,9 +1,21 @@ import { execFile } from "child_process"; +import { ControlPlaneTokenScope, DataPlaneTokenScope } from "../models/TaskParameters"; -export async function execAz(cmdArguments: string[]): Promise { +export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { + const cmdArguments = ["account", "get-access-token", "--resource"]; + cmdArguments.push(tokenScope); + return runCommand(cmdArguments); +} + +export async function getSubscriptions(): Promise { + const cmdArguments = ["cloud", "show"]; + return runCommand(cmdArguments); +} + +async function runCommand(cmdArguments: string[]): Promise { const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : true }, (error:any, stdout:any) => { + execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : false }, (error:any, stdout:any) => { if (error) { return reject(error); } @@ -17,4 +29,4 @@ export async function execAz(cmdArguments: string[]): Promise { } }); }); -} \ No newline at end of file +} From 76ef294de500f7d47cbf8b66e9c0807cc5abbe76 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:32:29 +0530 Subject: [PATCH 12/25] Refactor httpClientRetries for improved error handling --- src/Utils/FetchUtils.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Utils/FetchUtils.ts b/src/Utils/FetchUtils.ts index 373427f3..41501724 100644 --- a/src/Utils/FetchUtils.ts +++ b/src/Utils/FetchUtils.ts @@ -17,8 +17,10 @@ const methodEnumToString : { [key in FetchCallType] : string } = { // (note mohit): shift to the enum later. export async function httpClientRetries(urlSuffix : string, header : IHeaders, method : FetchCallType , retries : number = 1, data : string , isUploadCall : boolean = true, log: boolean = true) : Promise{ let httpResponse : IHttpClientResponse; + const retrriableCodes = [408,429,500,502,503,504]; // 408 - Request Timeout, 429 - Too Many Requests, 500 - Internal Server Error, 502 - Bad Gateway, 503 - Service Unavailable, 504 - Gateway Timeout + let backOffTimeForRetry = 5; // seconds + let correlationId = `gh-actions-${getUniqueId()}`; try { - let correlationId = `gh-actions-${getUniqueId()}`; header[correlationHeader] = correlationId; // even if we put console.debug its printing along with the logs, so lets just go ahead with the differentiation with azdo, so we can search the timeframe for azdo in correlationid and resource filter. if(method == FetchCallType.get){ httpResponse = await httpClient.get(urlSuffix, header); @@ -45,7 +47,10 @@ export async function httpClientRetries(urlSuffix : string, header : IHeaders, m if(httpResponse.message.statusCode!= undefined && httpResponse.message.statusCode >= 300){ CoreUtils.debug(`correlation id : ${correlationId}`); } - if(httpResponse.message.statusCode!=undefined && [408,429,502,503,504].includes(httpResponse.message.statusCode)){ + if(httpResponse.message.statusCode!=undefined && retrriableCodes.includes(httpResponse.message.statusCode)){ + if(method == FetchCallType.patch){ + backOffTimeForRetry += 60; // extra 60 seconds for patch, basically this happens when the service didnot handle some of the external service dependencies, and the external can take time to recover. + } let err = await getResultObj(httpResponse); throw {message : (err && err.error && err.error.message) ? err.error.message : errorCorrection(httpResponse)}; // throwing as message to catch it as err.message } @@ -53,7 +58,7 @@ export async function httpClientRetries(urlSuffix : string, header : IHeaders, m } catch(err:any){ if(retries){ - let sleeptime = (5-retries)*1000 + Math.floor(Math.random() * 5001); + let sleeptime = backOffTimeForRetry * 1000; if (log) { console.log(`Failed to connect to ${urlSuffix} due to ${err.message}, retrying in ${sleeptime/1000} seconds`); } @@ -61,7 +66,8 @@ export async function httpClientRetries(urlSuffix : string, header : IHeaders, m return await httpClientRetries(urlSuffix,header,method,retries-1,data); } else{ + console.log(err, "\ncorrelationId:" + correlationId); throw new Error(`Operation did not succeed after 3 retries. Pipeline failed with error : ${err.message}`); } } -} \ No newline at end of file +} From 72dd8fa9bedfe06062a0c9ac7e28d81fcbd6aec0 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:32:59 +0530 Subject: [PATCH 13/25] Refactor subscription parameter retrieval methods --- src/Utils/TaskParametersUtil.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Utils/TaskParametersUtil.ts b/src/Utils/TaskParametersUtil.ts index 808cda52..a88dada6 100644 --- a/src/Utils/TaskParametersUtil.ts +++ b/src/Utils/TaskParametersUtil.ts @@ -43,8 +43,7 @@ export class TaskParametersUtil { private static async setSubscriptionParameters(taskParameters: TaskParameters) { try { - const cmdArguments = ["account", "show"]; - var result: any = await AzCliUtility.execAz(cmdArguments); + var result: any = await AzCliUtility.getSubscriptions(); taskParameters.subscriptionId = result.id; taskParameters.subscriptionName = result.name; @@ -60,8 +59,7 @@ export class TaskParametersUtil { private static async setEndpointAndScopeParameters(taskParameters: TaskParameters) { try { - const cmdArguments = ["cloud", "show"]; - var result: any = await AzCliUtility.execAz(cmdArguments); + var result: any = await AzCliUtility.getSubscriptions(); let env = result ? result.name : null; taskParameters.environment = env ?? EnvironmentConstants.AzurePublicCloud.cloudName; @@ -80,4 +78,4 @@ export class TaskParametersUtil { throw new Error(message); } } -} \ No newline at end of file +} From d2639bc49024d4885770691d492602a77ff3f81e Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:33:51 +0530 Subject: [PATCH 14/25] Refactor test stubs for AzCliUtility calls --- test/authenticatorService.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/authenticatorService.test.ts b/test/authenticatorService.test.ts index 0da2002d..af145623 100644 --- a/test/authenticatorService.test.ts +++ b/test/authenticatorService.test.ts @@ -18,12 +18,12 @@ describe('authenticator service tests', () => { let tokenResult = { accessToken: "token" }; - let stub = sinon.stub(AzCliUtility, "execAz").withArgs(["account", "get-access-token", "--resource", Constants.defaultTaskParameters.dataPlaneTokenScope]).resolves(tokenResult); + let stub = sinon.stub(AzCliUtility, "execAz").withArgs(Constants.defaultTaskParameters.dataPlaneTokenScope).resolves(tokenResult); let authenticatorService = new AuthenticatorService(Constants.defaultTaskParameters); let result = await authenticatorService.getDataPlaneHeader(FetchCallType.get); - expect(stub.calledWith(["account", "get-access-token", "--resource", Constants.defaultTaskParameters.dataPlaneTokenScope])).toBe(true); + expect(stub.calledWith(Constants.defaultTaskParameters.dataPlaneTokenScope)).toBe(true); expect(result).toHaveProperty("Authorization"); }); @@ -31,13 +31,13 @@ describe('authenticator service tests', () => { let tokenResult = { accessToken: "token" }; - let stub = sinon.stub(AzCliUtility, "execAz").withArgs(["account", "get-access-token", "--resource", Constants.defaultTaskParameters.armTokenScope]).resolves(tokenResult); + let stub = sinon.stub(AzCliUtility, "execAz").withArgs(Constants.defaultTaskParameters.armTokenScope).resolves(tokenResult); let authenticatorService = new AuthenticatorService(Constants.defaultTaskParameters); let result = await authenticatorService.getARMTokenHeader(); - expect(stub.calledWith(["account", "get-access-token", "--resource", Constants.defaultTaskParameters.armTokenScope])).toBe(true); + expect(stub.calledWith(Constants.defaultTaskParameters.armTokenScope)).toBe(true); expect(result).toHaveProperty("Authorization"); }); -}) \ No newline at end of file +}) From 93ea47ffbdd0e9b7632703e57ddb6e586825d5a7 Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:52:49 +0530 Subject: [PATCH 15/25] Increase timeout for deleteFileAPI test --- test/apiService.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/apiService.test.ts b/test/apiService.test.ts index 6cf89cf6..805aa66d 100644 --- a/test/apiService.test.ts +++ b/test/apiService.test.ts @@ -146,7 +146,7 @@ describe('api service tests', () => { await expect(apiService.deleteFileAPI("samplefile.jmx")).rejects.toThrow(); expect(authenticatorServiceMock.getDataPlaneHeaderCalled()).toBe(true); expect(authenticatorServiceMock.getARMTokenHeaderCalled()).toBe(false); - }); + }, 40000); it("createTestAPI returns resp on 201", async () => { let testId = "testid1"; @@ -306,4 +306,4 @@ describe('api service tests', () => { expect(authenticatorServiceMock.getDataPlaneHeaderCalled()).toBe(true); expect(authenticatorServiceMock.getARMTokenHeaderCalled()).toBe(false); }); -}) \ No newline at end of file +}) From fde2f27bed2f7d949ec89d547ea9b9f0213e041a Mon Sep 17 00:00:00 2001 From: Mohit Pavan Kumar Gadamsetty <112494281+mohitpavan@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:05:42 +0530 Subject: [PATCH 16/25] Add conditional for installing dependencies on main branch --- .github/workflows/pr_check_load_test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr_check_load_test.yml b/.github/workflows/pr_check_load_test.yml index 74dfe36d..fc89e6e0 100644 --- a/.github/workflows/pr_check_load_test.yml +++ b/.github/workflows/pr_check_load_test.yml @@ -64,6 +64,7 @@ jobs: node-version: '20' - name: Installing dependencies and building latest changes + if: github.ref == 'refs/heads/main' run: | npm install --include=dev -f npm ci From eb7f825065ffe33df01ced05d2380828b86bb84c Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 08:47:36 +0530 Subject: [PATCH 17/25] correcting UTs. --- lib/Utils/AzCliUtility.js | 9 ++++----- lib/Utils/TaskParametersUtil.js | 32 +++++++++++++++++++++----------- src/Utils/AzCliUtility.ts | 6 +++--- src/Utils/TaskParametersUtil.ts | 4 ++-- src/models/TaskParameters.ts | 2 ++ test/Utils/TestSupport.ts | 2 +- test/taskParameters.test.ts | 32 ++++++++++++++++---------------- 7 files changed, 49 insertions(+), 38 deletions(-) diff --git a/lib/Utils/AzCliUtility.js b/lib/Utils/AzCliUtility.js index 0c15dce2..14a9cda7 100644 --- a/lib/Utils/AzCliUtility.js +++ b/lib/Utils/AzCliUtility.js @@ -9,7 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getSubscriptions = exports.execAz = void 0; +exports.execAz = execAz; +exports.getAccounts = getAccounts; const child_process_1 = require("child_process"); function execAz(tokenScope) { return __awaiter(this, void 0, void 0, function* () { @@ -18,14 +19,12 @@ function execAz(tokenScope) { return runCommand(cmdArguments); }); } -exports.execAz = execAz; -function getSubscriptions() { +function getAccounts(accountType) { return __awaiter(this, void 0, void 0, function* () { - const cmdArguments = ["cloud", "show"]; + const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; return runCommand(cmdArguments); }); } -exports.getSubscriptions = getSubscriptions; function runCommand(cmdArguments) { return __awaiter(this, void 0, void 0, function* () { const azCmd = process.platform === "win32" ? "az.cmd" : "az"; diff --git a/lib/Utils/TaskParametersUtil.js b/lib/Utils/TaskParametersUtil.js index 72d32d78..f11a3e66 100644 --- a/lib/Utils/TaskParametersUtil.js +++ b/lib/Utils/TaskParametersUtil.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -39,8 +49,8 @@ const InputConstants = __importStar(require("../Constants/InputConstants")); const EnvironmentConstants = __importStar(require("../Constants/EnvironmentConstants")); const AzCliUtility = __importStar(require("../Utils/AzCliUtility")); class TaskParametersUtil { - static getTaskParameters(isPostProcessJob = false) { - return __awaiter(this, void 0, void 0, function* () { + static getTaskParameters() { + return __awaiter(this, arguments, void 0, function* (isPostProcessJob = false) { let taskParameters = { subscriptionId: '', subscriptionName: '', @@ -73,7 +83,7 @@ class TaskParametersUtil { static setSubscriptionParameters(taskParameters) { return __awaiter(this, void 0, void 0, function* () { try { - var result = yield AzCliUtility.getSubscriptions(); + var result = yield AzCliUtility.getAccounts('Subscription'); taskParameters.subscriptionId = result.id; taskParameters.subscriptionName = result.name; } @@ -87,7 +97,7 @@ class TaskParametersUtil { static setEndpointAndScopeParameters(taskParameters) { return __awaiter(this, void 0, void 0, function* () { try { - var result = yield AzCliUtility.getSubscriptions(); + var result = yield AzCliUtility.getAccounts('Cloud'); let env = result ? result.name : null; taskParameters.environment = env !== null && env !== void 0 ? env : EnvironmentConstants.AzurePublicCloud.cloudName; let endpointUrl = (result && result.endpoints) ? result.endpoints.resourceManager : null; diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index ea1e48f4..a599ff20 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -1,5 +1,5 @@ import { execFile } from "child_process"; -import { ControlPlaneTokenScope, DataPlaneTokenScope } from "../models/TaskParameters"; +import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../models/TaskParameters"; export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; @@ -7,8 +7,8 @@ export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenS return runCommand(cmdArguments); } -export async function getSubscriptions(): Promise { - const cmdArguments = ["cloud", "show"]; +export async function getAccounts(accountType: AccountType): Promise { + const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; return runCommand(cmdArguments); } diff --git a/src/Utils/TaskParametersUtil.ts b/src/Utils/TaskParametersUtil.ts index a88dada6..9bf898fe 100644 --- a/src/Utils/TaskParametersUtil.ts +++ b/src/Utils/TaskParametersUtil.ts @@ -43,7 +43,7 @@ export class TaskParametersUtil { private static async setSubscriptionParameters(taskParameters: TaskParameters) { try { - var result: any = await AzCliUtility.getSubscriptions(); + var result: any = await AzCliUtility.getAccounts('Subscription'); taskParameters.subscriptionId = result.id; taskParameters.subscriptionName = result.name; @@ -59,7 +59,7 @@ export class TaskParametersUtil { private static async setEndpointAndScopeParameters(taskParameters: TaskParameters) { try { - var result: any = await AzCliUtility.getSubscriptions(); + var result: any = await AzCliUtility.getAccounts('Cloud'); let env = result ? result.name : null; taskParameters.environment = env ?? EnvironmentConstants.AzurePublicCloud.cloudName; diff --git a/src/models/TaskParameters.ts b/src/models/TaskParameters.ts index 2317ee48..fbde7490 100644 --- a/src/models/TaskParameters.ts +++ b/src/models/TaskParameters.ts @@ -5,6 +5,8 @@ export const armUsGovernmentTokenScope = "https://management.usgovcloudapi.net"; export type ControlPlaneTokenScope = typeof armPublicTokenScope | typeof armUsGovernmentTokenScope; export type DataPlaneTokenScope = typeof publicTokenScope | typeof usGovernmentTokenScope; +export type AccountType = 'Subscription' | 'Cloud'; // cloud is what the service principal logged into, should be only 1. + export interface TaskParameters { subscriptionId: string; subscriptionName: string; diff --git a/test/Utils/TestSupport.ts b/test/Utils/TestSupport.ts index 07274e6e..04c875b3 100644 --- a/test/Utils/TestSupport.ts +++ b/test/Utils/TestSupport.ts @@ -18,7 +18,7 @@ export class TestSupport { } public static setupMockForPostProcess(isTestRunCompleted: boolean = false) { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let cloudShowResult = { name: EnvironmentConstants.AzurePublicCloud.cloudName, endpoints: { diff --git a/test/taskParameters.test.ts b/test/taskParameters.test.ts index 836f708b..1c52f46d 100644 --- a/test/taskParameters.test.ts +++ b/test/taskParameters.test.ts @@ -21,7 +21,7 @@ describe('task parameters tests', () => { }); it("sets inputs for public cloud", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, @@ -38,8 +38,8 @@ describe('task parameters tests', () => { let taskParameters = await TaskParametersUtil.getTaskParameters(); - expect(stub.calledWith(["account", "show"])).toBe(true); - expect(stub.calledWith(["cloud", "show"])).toBe(true); + expect(stub.calledWith('Subscription')).toBe(true); + expect(stub.calledWith('Cloud')).toBe(true); expect(taskParameters.resourceId.toLowerCase()).toBe(Constants.loadtestResourceId.toLowerCase()); expect(taskParameters.subscriptionId).toBe(Constants.loadtestConfig.subscriptionId); expect(taskParameters.subscriptionName).toBe("fakeSubscriptionName"); @@ -50,7 +50,7 @@ describe('task parameters tests', () => { }); it("sets inputs for gov cloud", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, @@ -67,8 +67,8 @@ describe('task parameters tests', () => { let taskParameters = await TaskParametersUtil.getTaskParameters(); - expect(stub.calledWith(["account", "show"])).toBe(true); - expect(stub.calledWith(["cloud", "show"])).toBe(true); + expect(stub.calledWith('Subscription')).toBe(true); + expect(stub.calledWith('Cloud')).toBe(true); expect(taskParameters.resourceId.toLowerCase()).toBe(Constants.loadtestResourceId.toLowerCase()); expect(taskParameters.subscriptionId).toBe(Constants.loadtestConfig.subscriptionId); expect(taskParameters.subscriptionName).toBe("fakeSubscriptionName"); @@ -79,7 +79,7 @@ describe('task parameters tests', () => { }); it("sets inputs for gov cloud with different case", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, @@ -96,8 +96,8 @@ describe('task parameters tests', () => { let taskParameters = await TaskParametersUtil.getTaskParameters(); - expect(stub.calledWith(["account", "show"])).toBe(true); - expect(stub.calledWith(["cloud", "show"])).toBe(true); + expect(stub.calledWith('Subscription')).toBe(true); + expect(stub.calledWith('Cloud')).toBe(true); expect(taskParameters.resourceId.toLowerCase()).toBe(Constants.loadtestResourceId.toLowerCase()); expect(taskParameters.subscriptionId).toBe(Constants.loadtestConfig.subscriptionId); expect(taskParameters.subscriptionName).toBe("fakeSubscriptionName"); @@ -108,7 +108,7 @@ describe('task parameters tests', () => { }); it("does not set resource id for postprocess", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let cloudShowResult = { name: EnvironmentConstants.AzurePublicCloud.cloudName, endpoints: { @@ -120,8 +120,8 @@ describe('task parameters tests', () => { let taskParameters = await TaskParametersUtil.getTaskParameters(true); - expect(stub.calledWith(["account", "show"])).toBe(false); - expect(stub.calledWith(["cloud", "show"])).toBe(true); + expect(stub.calledWith('Subscription')).toBe(false); + expect(stub.calledWith('Cloud')).toBe(true); expect(taskParameters.resourceId).toBe(''); expect(taskParameters.subscriptionId).toBe(''); expect(taskParameters.subscriptionName).toBe(''); @@ -132,7 +132,7 @@ describe('task parameters tests', () => { }); it("az cli cloud show error throws error", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, @@ -145,14 +145,14 @@ describe('task parameters tests', () => { }); it("az cli account show error throws error", async () => { - let accountShowStub = sinon.stub(AzCliUtility, "execAz").withArgs(["account", "show"]).rejects(new Error("Error")); + let accountShowStub = sinon.stub(AzCliUtility, "getAccounts").withArgs('Subscription').rejects(new Error("Error")); expect(async () => await TaskParametersUtil.getTaskParameters()).rejects.toThrow(`Azure CLI for getting subscription name`); expect(accountShowStub.calledOnce).toBe(true); }); it("missing resource group throws error", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, @@ -164,7 +164,7 @@ describe('task parameters tests', () => { }); it("missing load test resource throws error", async () => { - let stub = sinon.stub(AzCliUtility, "execAz"); + let stub = sinon.stub(AzCliUtility, "getAccounts"); let accountShowResult = { name: "fakeSubscriptionName", id: Constants.loadtestConfig.subscriptionId, From 51a8e1d421fab29eed222b0dc9b08a30fde1d3db Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 10:32:22 +0530 Subject: [PATCH 18/25] fixing installation step. --- .github/workflows/pr_check_load_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_check_load_test.yml b/.github/workflows/pr_check_load_test.yml index fc89e6e0..52d62a74 100644 --- a/.github/workflows/pr_check_load_test.yml +++ b/.github/workflows/pr_check_load_test.yml @@ -64,7 +64,7 @@ jobs: node-version: '20' - name: Installing dependencies and building latest changes - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/main' || (github.event_name == 'pull_request' && github.base_ref == 'main') run: | npm install --include=dev -f npm ci From 8304585383fbbfed0ffdeebad6b1c354b35fa101 Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 10:41:20 +0530 Subject: [PATCH 19/25] updating redme. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ab30ec0..d5062407 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,9 @@ For using any credentials like Azure Service Principal in your workflow, add the ## Breaking changes -The minor versions from `1.1` such as `1.1.x` will stop to work due to a breaking change, we recommend to use the `v1` tag which is promised to support, We are bumping the minor version upgrade to `1.2.1` now, use this if needs the pinning. +All minor versions under `1.1` (e.g., `1.1.x`) will stop working due to a breaking change. +To ensure continued compatibility, we recommend switching to the `v1` tag, which we will continue to support. +We are also bumping the minor version to `1.2.1`. If you prefer to pin to a specific version, please update your workflows to use `1.2.1`. ## Azure Load Testing Action From 130b7b181402a86063a2f3b067df17eeb158512a Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 10:48:48 +0530 Subject: [PATCH 20/25] printing the platform --- src/Utils/AzCliUtility.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index a599ff20..13637549 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -13,6 +13,7 @@ export async function getAccounts(accountType: AccountType): Promise { } async function runCommand(cmdArguments: string[]): Promise { + console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : false }, (error:any, stdout:any) => { From ffcd0281843be9cccd3fed7849f88368c38cfb2f Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 10:57:33 +0530 Subject: [PATCH 21/25] account show is not working in the cmd. --- src/Utils/AzCliUtility.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index 13637549..b5f9a7f6 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -4,19 +4,19 @@ import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../mod export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments); + return runCommand(cmdArguments, false); } export async function getAccounts(accountType: AccountType): Promise { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments); + return runCommand(cmdArguments, true); } -async function runCommand(cmdArguments: string[]): Promise { +async function runCommand(cmdArguments: string[], isLogin: boolean): Promise { console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : false }, (error:any, stdout:any) => { + execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" && isLogin}, (error:any, stdout:any) => { if (error) { return reject(error); } From 17e359c1f72eee5198c4df70e1b6eb4624498f91 Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 10:59:41 +0530 Subject: [PATCH 22/25] changed back to true. --- src/Utils/AzCliUtility.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index b5f9a7f6..4468a7a7 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -4,19 +4,19 @@ import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../mod export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments, false); + return runCommand(cmdArguments); } export async function getAccounts(accountType: AccountType): Promise { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments, true); + return runCommand(cmdArguments); } -async function runCommand(cmdArguments: string[], isLogin: boolean): Promise { +async function runCommand(cmdArguments: string[]): Promise { console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" && isLogin}, (error:any, stdout:any) => { + execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : true }, (error:any, stdout:any) => { if (error) { return reject(error); } From 6ee63c52b0653fd4a564262d42d24e3f48204410 Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 11:13:35 +0530 Subject: [PATCH 23/25] changing js too. --- lib/Utils/AzCliUtility.js | 9 +++++---- src/Utils/AzCliUtility.ts | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/Utils/AzCliUtility.js b/lib/Utils/AzCliUtility.js index 14a9cda7..1cc8733f 100644 --- a/lib/Utils/AzCliUtility.js +++ b/lib/Utils/AzCliUtility.js @@ -16,20 +16,21 @@ function execAz(tokenScope) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments); + return runCommand(cmdArguments, false); }); } function getAccounts(accountType) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments); + return runCommand(cmdArguments, true); }); } -function runCommand(cmdArguments) { +function runCommand(cmdArguments, isLogin) { return __awaiter(this, void 0, void 0, function* () { + console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: false }, (error, stdout) => { + (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: process.platform === "win32" && isLogin }, (error, stdout) => { if (error) { return reject(error); } diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index 4468a7a7..db9c9961 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -4,19 +4,19 @@ import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../mod export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments); + return runCommand(cmdArguments, false); } export async function getAccounts(accountType: AccountType): Promise { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments); + return runCommand(cmdArguments, true); } -async function runCommand(cmdArguments: string[]): Promise { +async function runCommand(cmdArguments: string[], isLogin: boolean): Promise { console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : true }, (error:any, stdout:any) => { + execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" && isLogin }, (error:any, stdout:any) => { if (error) { return reject(error); } From 7cefaa4d83ebde023107eb70b108f7475b9c7715 Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 11:19:01 +0530 Subject: [PATCH 24/25] change. --- lib/Utils/AzCliUtility.js | 8 ++++---- src/Utils/AzCliUtility.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/Utils/AzCliUtility.js b/lib/Utils/AzCliUtility.js index 1cc8733f..1fd5e9d2 100644 --- a/lib/Utils/AzCliUtility.js +++ b/lib/Utils/AzCliUtility.js @@ -16,21 +16,21 @@ function execAz(tokenScope) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments, false); + return runCommand(cmdArguments); }); } function getAccounts(accountType) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments, true); + return runCommand(cmdArguments); }); } -function runCommand(cmdArguments, isLogin) { +function runCommand(cmdArguments) { return __awaiter(this, void 0, void 0, function* () { console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: process.platform === "win32" && isLogin }, (error, stdout) => { + (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: process.platform === "win32" }, (error, stdout) => { if (error) { return reject(error); } diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index db9c9961..9208e306 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -4,19 +4,19 @@ import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../mod export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments, false); + return runCommand(cmdArguments); } export async function getAccounts(accountType: AccountType): Promise { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments, true); + return runCommand(cmdArguments); } -async function runCommand(cmdArguments: string[], isLogin: boolean): Promise { +async function runCommand(cmdArguments: string[]): Promise { console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { - execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" && isLogin }, (error:any, stdout:any) => { + execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" }, (error:any, stdout:any) => { if (error) { return reject(error); } From d76f3d96fda7472d652254c2870318c7679ca954 Mon Sep 17 00:00:00 2001 From: mohitpavan Date: Thu, 20 Nov 2025 11:31:06 +0530 Subject: [PATCH 25/25] updating function name and removing console. --- lib/Utils/AzCliUtility.js | 11 +++++------ lib/services/AuthenticatorService.js | 28 +++++++++++++++++++--------- src/Utils/AzCliUtility.ts | 9 ++++----- src/services/AuthenticatorService.ts | 2 +- test/authenticatorService.test.ts | 4 ++-- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/lib/Utils/AzCliUtility.js b/lib/Utils/AzCliUtility.js index 1fd5e9d2..2979d520 100644 --- a/lib/Utils/AzCliUtility.js +++ b/lib/Utils/AzCliUtility.js @@ -9,25 +9,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.execAz = execAz; +exports.getDPTokens = getDPTokens; exports.getAccounts = getAccounts; const child_process_1 = require("child_process"); -function execAz(tokenScope) { +function getDPTokens(tokenScope) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments); + return execAz(cmdArguments); }); } function getAccounts(accountType) { return __awaiter(this, void 0, void 0, function* () { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments); + return execAz(cmdArguments); }); } -function runCommand(cmdArguments) { +function execAz(cmdArguments) { return __awaiter(this, void 0, void 0, function* () { - console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { (0, child_process_1.execFile)(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell: process.platform === "win32" }, (error, stdout) => { diff --git a/lib/services/AuthenticatorService.js b/lib/services/AuthenticatorService.js index 84e47086..c3b44569 100644 --- a/lib/services/AuthenticatorService.js +++ b/lib/services/AuthenticatorService.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -43,8 +53,8 @@ class AuthenticatorService { this.taskParameters = taskParameters; } getDataPlaneHeader(apicallType) { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; if (!this.isTokenValid(UtilModels_1.TokenScope.Dataplane)) { let tokenRes = yield this.getTokenAPI(UtilModels_1.TokenScope.Dataplane); this.dataPlanetoken = tokenRes; @@ -71,7 +81,7 @@ class AuthenticatorService { return __awaiter(this, void 0, void 0, function* () { let tokenScopeDecoded = scope == UtilModels_1.TokenScope.Dataplane ? this.taskParameters.dataPlaneTokenScope : this.taskParameters.armTokenScope; try { - let result = yield AzCliUtility.execAz(tokenScopeDecoded); + let result = yield AzCliUtility.getDPTokens(tokenScopeDecoded); let token = result.accessToken; scope == UtilModels_1.TokenScope.ControlPlane ? this.controlPlaneToken = token : this.dataPlanetoken = token; return token; diff --git a/src/Utils/AzCliUtility.ts b/src/Utils/AzCliUtility.ts index 9208e306..eeeacf9c 100644 --- a/src/Utils/AzCliUtility.ts +++ b/src/Utils/AzCliUtility.ts @@ -1,19 +1,18 @@ import { execFile } from "child_process"; import { AccountType, ControlPlaneTokenScope, DataPlaneTokenScope } from "../models/TaskParameters"; -export async function execAz(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { +export async function getDPTokens(tokenScope: ControlPlaneTokenScope| DataPlaneTokenScope): Promise { const cmdArguments = ["account", "get-access-token", "--resource"]; cmdArguments.push(tokenScope); - return runCommand(cmdArguments); + return execAz(cmdArguments); } export async function getAccounts(accountType: AccountType): Promise { const cmdArguments = accountType === 'Subscription' ? ["account", "show"] : ["cloud", "show"]; - return runCommand(cmdArguments); + return execAz(cmdArguments); } -async function runCommand(cmdArguments: string[]): Promise { - console.log(`Executing az command: az ${cmdArguments.join(" ")}`, process.platform); +async function execAz(cmdArguments: string[]): Promise { const azCmd = process.platform === "win32" ? "az.cmd" : "az"; return new Promise((resolve, reject) => { execFile(azCmd, [...cmdArguments, "--out", "json"], { encoding: "utf8", shell : process.platform === "win32" }, (error:any, stdout:any) => { diff --git a/src/services/AuthenticatorService.ts b/src/services/AuthenticatorService.ts index b4cf148e..ed615fb2 100644 --- a/src/services/AuthenticatorService.ts +++ b/src/services/AuthenticatorService.ts @@ -41,7 +41,7 @@ export class AuthenticatorService { { let tokenScopeDecoded = scope == TokenScope.Dataplane ? this.taskParameters.dataPlaneTokenScope : this.taskParameters.armTokenScope; try { - let result: any = await AzCliUtility.execAz(tokenScopeDecoded); + let result: any = await AzCliUtility.getDPTokens(tokenScopeDecoded); let token = result.accessToken; scope == TokenScope.ControlPlane ? this.controlPlaneToken = token : this.dataPlanetoken = token; return token; diff --git a/test/authenticatorService.test.ts b/test/authenticatorService.test.ts index af145623..3977c6f8 100644 --- a/test/authenticatorService.test.ts +++ b/test/authenticatorService.test.ts @@ -18,7 +18,7 @@ describe('authenticator service tests', () => { let tokenResult = { accessToken: "token" }; - let stub = sinon.stub(AzCliUtility, "execAz").withArgs(Constants.defaultTaskParameters.dataPlaneTokenScope).resolves(tokenResult); + let stub = sinon.stub(AzCliUtility, "getDPTokens").withArgs(Constants.defaultTaskParameters.dataPlaneTokenScope).resolves(tokenResult); let authenticatorService = new AuthenticatorService(Constants.defaultTaskParameters); let result = await authenticatorService.getDataPlaneHeader(FetchCallType.get); @@ -31,7 +31,7 @@ describe('authenticator service tests', () => { let tokenResult = { accessToken: "token" }; - let stub = sinon.stub(AzCliUtility, "execAz").withArgs(Constants.defaultTaskParameters.armTokenScope).resolves(tokenResult); + let stub = sinon.stub(AzCliUtility, "getDPTokens").withArgs(Constants.defaultTaskParameters.armTokenScope).resolves(tokenResult); let authenticatorService = new AuthenticatorService(Constants.defaultTaskParameters); let result = await authenticatorService.getARMTokenHeader();