lib/Utils/CreateAndRunUtils.js (335 lines of code) (raw):

"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : 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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAndSetOverrideParams = exports.validateAndGetOutPutVarName = exports.getTestRunPayload = exports.validateAndGetRunTimeParamsForTestRun = exports.getAllFileNamesTobeDeleted = exports.getPayloadForServerMetricsConfig = exports.getPayloadForAppcomponents = exports.getPayloadForTest = exports.addExistingAppComponentParameters = exports.addExistingTestParameters = void 0; const util_1 = require("util"); const UtilModels_1 = require("../models/UtilModels"); const Util = __importStar(require("./CommonUtils")); const InputConstants = __importStar(require("../Constants/InputConstants")); const GeneralConstants_1 = require("../Constants/GeneralConstants"); const CoreUtils = __importStar(require("./CoreUtils")); const LoadtestConfigUtil_1 = require("./LoadtestConfigUtil"); function addExistingTestParameters(testObj, existingParams) { if (!(0, util_1.isNullOrUndefined)(testObj.passFailCriteria) && !(0, util_1.isNullOrUndefined)(testObj.passFailCriteria.passFailMetrics)) { existingParams.passFailCriteria = testObj.passFailCriteria.passFailMetrics; } if (!(0, util_1.isNullOrUndefined)(testObj.passFailCriteria) && !(0, util_1.isNullOrUndefined)(testObj.passFailCriteria.passFailServerMetrics)) { existingParams.passFailServerMetrics = testObj.passFailCriteria.passFailServerMetrics; } if (!(0, util_1.isNullOrUndefined)(testObj.secrets)) { existingParams.secrets = testObj.secrets; } if (!(0, util_1.isNullOrUndefined)(testObj.environmentVariables)) { existingParams.env = testObj.environmentVariables; } } exports.addExistingTestParameters = addExistingTestParameters; function addExistingAppComponentParameters(appcomponents, existingParams) { var _a, _b, _c; if (appcomponents) { for (let guid in appcomponents === null || appcomponents === void 0 ? void 0 : appcomponents.components) { let resourceId = (_b = (_a = appcomponents.components[guid]) === null || _a === void 0 ? void 0 : _a.resourceId) !== null && _b !== void 0 ? _b : ""; if (existingParams.appComponents.has(resourceId === null || resourceId === void 0 ? void 0 : resourceId.toLowerCase())) { let existingGuids = (_c = existingParams.appComponents.get(resourceId === null || resourceId === void 0 ? void 0 : resourceId.toLowerCase())) !== null && _c !== void 0 ? _c : []; existingGuids.push(guid); existingParams.appComponents.set(resourceId.toLowerCase(), existingGuids); } else { existingParams.appComponents.set(resourceId.toLowerCase(), [guid]); } } } } exports.addExistingAppComponentParameters = addExistingAppComponentParameters; function getPayloadForTest(loadTestConfig, existingParams) { let passFailCriteria = mergePassFailCriteria(loadTestConfig, existingParams); let passFailServerCriteria = mergePassFailServerCriteria(loadTestConfig, existingParams); let secrets = mergeSecrets(loadTestConfig, existingParams); let env = mergeEnv(loadTestConfig, existingParams); let createdata = { testId: loadTestConfig.testId, description: loadTestConfig.description, displayName: loadTestConfig.displayName, loadTestConfiguration: { engineInstances: loadTestConfig.engineInstances, splitAllCSVs: loadTestConfig.splitAllCSVs, regionalLoadTestConfig: loadTestConfig.regionalLoadTestConfig, }, secrets: secrets, kind: loadTestConfig.kind, certificate: loadTestConfig.certificates, environmentVariables: env, passFailCriteria: { passFailMetrics: passFailCriteria, passFailServerMetrics: passFailServerCriteria, }, autoStopCriteria: loadTestConfig.autoStop, subnetId: loadTestConfig.subnetId, publicIPDisabled: loadTestConfig.publicIPDisabled, keyvaultReferenceIdentityType: loadTestConfig.keyVaultReferenceIdentityType, keyvaultReferenceIdentityId: loadTestConfig.keyVaultReferenceIdentity, engineBuiltinIdentityIds: loadTestConfig.engineReferenceIdentities, engineBuiltinIdentityType: loadTestConfig.engineReferenceIdentityType, metricsReferenceIdentityType: loadTestConfig.metricsReferenceIdentityType, metricsReferenceIdentityId: loadTestConfig.metricsReferenceIdentity }; return createdata; } exports.getPayloadForTest = getPayloadForTest; function getPayloadForAppcomponents(loadTestConfig, existingData) { let appComponentsMerged = loadTestConfig.appComponents; for (let [resourceId, keys] of existingData.appComponents) { if (!loadTestConfig.appComponents.hasOwnProperty(resourceId.toLowerCase())) { for (let key of keys) { !loadTestConfig.appComponents.hasOwnProperty(key) && (loadTestConfig.appComponents[key] = null); } } else { for (let key of keys) { if (key != null && key != resourceId.toLowerCase()) { !loadTestConfig.appComponents.hasOwnProperty(key) && (loadTestConfig.appComponents[key] = null); } } } } let appcomponents = { components: appComponentsMerged }; return appcomponents; } exports.getPayloadForAppcomponents = getPayloadForAppcomponents; function getPayloadForServerMetricsConfig(existingServerCriteria, loadTestConfig) { var _a, _b, _c; let mergedServerCriteria = loadTestConfig.serverMetricsConfig; if (!(0, util_1.isNullOrUndefined)(existingServerCriteria) && !(0, util_1.isNullOrUndefined)(existingServerCriteria.metrics)) { for (let key in existingServerCriteria.metrics) { let resourceId = (_c = (_b = (_a = existingServerCriteria.metrics[key]) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : ""; if (loadTestConfig.addDefaultsForAppComponents.hasOwnProperty(resourceId) && !loadTestConfig.addDefaultsForAppComponents[resourceId] && !loadTestConfig.serverMetricsConfig.hasOwnProperty(key)) { mergedServerCriteria[key] = null; } } } let serverMetricsConfig = { metrics: mergedServerCriteria }; return serverMetricsConfig; } exports.getPayloadForServerMetricsConfig = getPayloadForServerMetricsConfig; function getAllFileNamesTobeDeleted(loadTestConfig, testFiles) { let filesToDelete = []; if (testFiles.userPropFileInfo != null) { filesToDelete.push(testFiles.userPropFileInfo.fileName); } if (!(0, util_1.isNullOrUndefined)(testFiles.additionalFileInfo)) { // delete existing files which are not present in yaml, the files which are in yaml will anyway be uploaded again. let file; for (file of testFiles.additionalFileInfo) { filesToDelete.push(file.fileName); } for (let file of loadTestConfig.configurationFiles) { file = Util.getFileName(file); let indexOfFile = filesToDelete.indexOf(file); if (indexOfFile != -1) { filesToDelete.splice(indexOfFile, 1); } } for (let file of loadTestConfig.zipArtifacts) { file = Util.getFileName(file); let indexOfFile = filesToDelete.indexOf(file); if (indexOfFile != -1) { filesToDelete.splice(indexOfFile, 1); } } } return filesToDelete; } exports.getAllFileNamesTobeDeleted = getAllFileNamesTobeDeleted; function validateAndGetRunTimeParamsForTestRun(testId) { var _a, _b; var secretRun = CoreUtils.getInput(InputConstants.secrets); let secretsParsed = {}; let envParsed = {}; if (secretRun) { try { var obj = JSON.parse(secretRun); for (var index in obj) { var val = obj[index]; let str = `name : ${val.name}, value : ${val.value}`; if ((0, util_1.isNullOrUndefined)(val.name)) { throw new Error(`Invalid secret name at pipeline parameters at ${str}`); } secretsParsed[val.name] = { type: 'SECRET_VALUE', value: val.value }; } } catch (error) { console.log(error); throw new Error(`Invalid format of ${InputConstants.secretsLabel} in the pipeline file. Refer to the pipeline syntax at : https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd?tabs=github#update-the-azure-pipelines-workflow`); } } var eRun = CoreUtils.getInput(InputConstants.envVars); if (eRun) { try { var obj = JSON.parse(eRun); for (var index in obj) { var val = obj[index]; let str = `name : ${val.name}, value : ${val.value}`; if ((0, util_1.isNullOrUndefined)(val.name)) { throw new Error(`Invalid environment name at pipeline parameters at ${str}`); } envParsed[val.name] = val.value; } } catch (error) { console.log(error); throw new Error(`Invalid format of ${InputConstants.envVarsLabel} in the pipeline file. Refer to the pipeline syntax at : https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd?tabs=github#update-the-azure-pipelines-workflow`); } } const runDisplayName = (_a = CoreUtils.getInput(InputConstants.testRunName)) !== null && _a !== void 0 ? _a : Util.getDefaultTestRunName(); const runDescription = (_b = CoreUtils.getInput(InputConstants.runDescription)) !== null && _b !== void 0 ? _b : Util.getDefaultRunDescription(); let runTimeParams = { env: envParsed, secrets: secretsParsed, runDisplayName, runDescription, testId: '', testRunId: '' }; Util.validateTestRunParamsFromPipeline(runTimeParams); runTimeParams.testRunId = Util.getUniqueId(); runTimeParams.testId = testId; return runTimeParams; } exports.validateAndGetRunTimeParamsForTestRun = validateAndGetRunTimeParamsForTestRun; function getTestRunPayload(runTimeParams) { let testRunPayload = { environmentVariables: runTimeParams.env, secrets: runTimeParams.secrets, displayName: runTimeParams.runDisplayName, description: runTimeParams.runDescription, testId: runTimeParams.testId, testRunId: runTimeParams.testRunId }; return testRunPayload; } exports.getTestRunPayload = getTestRunPayload; function validateAndGetOutPutVarName() { var _a; let outputVarName = (_a = CoreUtils.getInput(InputConstants.outputVariableName)) !== null && _a !== void 0 ? _a : GeneralConstants_1.OutputVariableName; // for now keeping the validations here, later shift to the tasklib class when written. let validation = Util.validateOutputParametervariableName(outputVarName); if (validation.valid == false) { console.log(validation.error); throw new Error(`Invalid ${InputConstants.outputVariableNameLabel}. Refer to the pipeline syntax at : https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd?tabs=github#update-the-azure-pipelines-workflow`); } return outputVarName; } exports.validateAndGetOutPutVarName = validateAndGetOutPutVarName; function validateAndSetOverrideParams(loadTestConfig) { let overRideParams = CoreUtils.getInput(InputConstants.overRideParameters); let validation = Util.validateOverRideParameters(overRideParams); if (validation.valid == false) { console.log(validation.error); throw new Error(`Invalid ${InputConstants.overRideParametersLabel}. Refer to the pipeline syntax at : https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd?tabs=github#update-the-azure-pipelines-workflow`); } if (overRideParams) { let overRideParamsObj = JSON.parse(overRideParams); if (overRideParamsObj.testId != undefined) { loadTestConfig.testId = overRideParamsObj.testId.toLowerCase(); } if (overRideParamsObj.displayName != undefined) { loadTestConfig.displayName = overRideParamsObj.displayName; } if (overRideParamsObj.description != undefined) { loadTestConfig.description = overRideParamsObj.description; } if (overRideParamsObj.engineInstances != undefined) { loadTestConfig.engineInstances = overRideParamsObj.engineInstances; } if (overRideParamsObj.autoStop != undefined) { loadTestConfig.autoStop = LoadtestConfigUtil_1.LoadtestConfigUtil.getAutoStopCriteria(overRideParamsObj.autoStop); } } } exports.validateAndSetOverrideParams = validateAndSetOverrideParams; function mergePassFailCriteria(loadTestConfig, existingData) { let existingCriteria = existingData.passFailCriteria; let existingCriteriaIds = Object.keys(existingCriteria); var numberOfExistingCriteria = existingCriteriaIds.length; var index = 0; let passFailCriteriaMerged = {}; if (!(0, util_1.isNullOrUndefined)(loadTestConfig.failureCriteria)) { for (var key in loadTestConfig.failureCriteria) { var splitted = key.split(" "); var criteriaId = index < numberOfExistingCriteria ? existingCriteriaIds[index++] : Util.getUniqueId(); passFailCriteriaMerged[criteriaId] = { clientMetric: splitted[0], aggregate: splitted[1], condition: splitted[2], action: splitted[3], value: loadTestConfig.failureCriteria[key], requestName: splitted.length > 4 ? splitted.slice(4).join(' ') : null }; } } for (; index < numberOfExistingCriteria; index++) { passFailCriteriaMerged[existingCriteriaIds[index]] = null; } return passFailCriteriaMerged; } function mergePassFailServerCriteria(loadTestConfig, existingData) { var _a, _b, _c; let existingServerCriteria = existingData.passFailServerMetrics; let existingServerCriteriaIds = Object.keys(existingServerCriteria); let numberOfExistingServerCriteria = existingServerCriteriaIds.length; let serverIndex = 0; let passFailServerCriteriaMerged = {}; if (!(0, util_1.isNullOrUndefined)(loadTestConfig.serverFailureCriteria)) { for (let serverCriteria of loadTestConfig.serverFailureCriteria) { let criteriaId = serverIndex < numberOfExistingServerCriteria ? existingServerCriteriaIds[serverIndex++] : Util.getUniqueId(); passFailServerCriteriaMerged[criteriaId] = { metricName: serverCriteria.metricName, aggregation: serverCriteria.aggregation, resourceId: serverCriteria.resourceId, condition: UtilModels_1.ConditionEnumToSignMap[(_a = serverCriteria.condition) !== null && _a !== void 0 ? _a : UtilModels_1.ValidConditionsEnumValuesList.LessThan], value: (_b = serverCriteria.value) === null || _b === void 0 ? void 0 : _b.toString(), metricNameSpace: (_c = serverCriteria.metricNameSpace) !== null && _c !== void 0 ? _c : Util.getResourceTypeFromResourceId(serverCriteria.resourceId), }; } } for (; serverIndex < numberOfExistingServerCriteria; serverIndex++) { passFailServerCriteriaMerged[existingServerCriteriaIds[serverIndex]] = null; } return passFailServerCriteriaMerged; } function mergeSecrets(loadTestConfig, existingData) { let existingParams = existingData.secrets; let secretsMerged = loadTestConfig.secrets; for (var key in existingParams) { if (!loadTestConfig.secrets.hasOwnProperty(key)) secretsMerged[key] = null; } return secretsMerged; } function mergeEnv(loadTestConfig, existingData) { let existingEnv = existingData.env; let envMerged = loadTestConfig.environmentVariables; for (var key in existingEnv) { if (!loadTestConfig.environmentVariables.hasOwnProperty(key)) { envMerged[key] = null; } } return envMerged; }