lib/Utils/PassFailCriteriaUtil.js (126 lines of code) (raw):
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getServerCriteriaFromYaml = exports.getPassFailCriteriaFromString = void 0;
const UtilModels_1 = require("../models/UtilModels");
const CommonUtils_1 = require("./CommonUtils");
/*
ado takes the full pf criteria as a string after parsing the string into proper data model,
*/
function getPassFailCriteriaFromString(passFailCriteria) {
let failureCriteriaValue = {};
passFailCriteria.forEach(criteria => {
let criteriaString = criteria;
let data = {
aggregate: "",
clientMetric: "",
condition: "",
value: "",
requestName: "",
action: "",
};
if (typeof criteria !== "string") {
let request = Object.keys(criteria)[0];
data.requestName = request;
criteriaString = criteria[request];
}
let tempStr = "";
for (let i = 0; i < criteriaString.length; i++) {
if (criteriaString[i] == '(') {
data.aggregate = tempStr.trim();
tempStr = "";
}
else if (criteriaString[i] == ')') {
data.clientMetric = tempStr;
tempStr = "";
}
else if (criteriaString[i] == ',') {
data.condition = tempStr.substring(0, (0, CommonUtils_1.indexOfFirstDigit)(tempStr)).trim();
data.value = tempStr.substr((0, CommonUtils_1.indexOfFirstDigit)(tempStr)).trim();
tempStr = "";
}
else {
tempStr += criteriaString[i];
}
}
if (criteriaString.indexOf(',') != -1) {
data.action = tempStr.trim();
}
else {
data.condition = tempStr.substring(0, (0, CommonUtils_1.indexOfFirstDigit)(tempStr)).trim();
data.value = tempStr.substr((0, CommonUtils_1.indexOfFirstDigit)(tempStr)).trim();
}
validateCriteriaAndConvertToWorkingStringModel(data, failureCriteriaValue);
});
return failureCriteriaValue;
}
exports.getPassFailCriteriaFromString = getPassFailCriteriaFromString;
function getServerCriteriaFromYaml(serverMetricsCriteria) {
let serverPFCriteriaValue = [];
serverMetricsCriteria.forEach((criteria) => {
let data = {
resourceId: criteria.resourceId,
metricName: criteria.metricName,
aggregation: criteria.aggregation,
condition: criteria.condition,
value: criteria.value,
metricNameSpace: criteria.metricNamespace
};
serverPFCriteriaValue.push(data);
});
return serverPFCriteriaValue;
}
exports.getServerCriteriaFromYaml = getServerCriteriaFromYaml;
/*
ado takes the full pf criteria as a string after parsing the string into proper data model,
this is to avoid duplicates of the data by keeping the full aggrregated metric
as a key and the values will be set in this function to use it further
*/
function validateCriteriaAndConvertToWorkingStringModel(data, failureCriteriaValue) {
if (data.action == "")
data.action = "continue";
data.value = (0, CommonUtils_1.removeUnits)(data.value);
if (!validCriteria(data))
throw new Error("Invalid Failure Criteria");
let key = data.clientMetric + ' ' + data.aggregate + ' ' + data.condition + ' ' + data.action;
if (data.requestName != "") {
key = key + ' ' + data.requestName;
}
let val = parseInt(data.value);
let currVal = val;
if (failureCriteriaValue.hasOwnProperty(key))
currVal = failureCriteriaValue[key];
if (data.condition == '>') {
failureCriteriaValue[key] = (val < currVal) ? val : currVal;
}
else {
failureCriteriaValue[key] = (val > currVal) ? val : currVal;
}
}
function validCriteria(data) {
switch (data.clientMetric) {
case "response_time_ms":
return validResponseTimeCriteria(data);
case "requests_per_sec":
return validRequestsPerSecondCriteria(data);
case "requests":
return validRequestsCriteria(data);
case "latency":
return validLatencyCriteria(data);
case "error":
return validErrorCriteria(data);
default:
return false;
}
}
function validResponseTimeCriteria(data) {
return !(!UtilModels_1.ValidAggregateList['response_time_ms'].includes(data.aggregate) || !UtilModels_1.ValidConditionList['response_time_ms'].includes(data.condition)
|| (data.value).indexOf('.') != -1 || data.action != "continue");
}
function validRequestsPerSecondCriteria(data) {
return !(!UtilModels_1.ValidAggregateList['requests_per_sec'].includes(data.aggregate) || !UtilModels_1.ValidConditionList['requests_per_sec'].includes(data.condition)
|| data.action != "continue");
}
function validRequestsCriteria(data) {
return !(!UtilModels_1.ValidAggregateList['requests'].includes(data.aggregate) || !UtilModels_1.ValidConditionList['requests'].includes(data.condition)
|| (data.value).indexOf('.') != -1 || data.action != "continue");
}
function validLatencyCriteria(data) {
return !(!UtilModels_1.ValidAggregateList['latency'].includes(data.aggregate) || !UtilModels_1.ValidConditionList['latency'].includes(data.condition)
|| (data.value).indexOf('.') != -1 || data.action != "continue");
}
function validErrorCriteria(data) {
return !(!UtilModels_1.ValidAggregateList['error'].includes(data.aggregate) || !UtilModels_1.ValidConditionList['error'].includes(data.condition)
|| Number(data.value) < 0 || Number(data.value) > 100 || data.action != "continue");
}