lib/Utils/YamlValidationUtil.js (370 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.validateYamlConfig = void 0; const util_1 = require("util"); const UtilModels_1 = require("../models/UtilModels"); const CommonUtils_1 = require("./CommonUtils"); const EngineUtil = __importStar(require("./EngineUtil")); const TestKind_1 = require("../models/TestKind"); const YamlConfig_1 = require("../models/YamlConfig"); function validateYamlConfig(givenYaml) { var _a, _b, _c; if (!isDictionary(givenYaml)) { return { valid: false, error: `Invalid YAML syntax.` }; } let unSupportedKeys = []; let supportedKeys = Object.keys(new YamlConfig_1.YamlConfig()); unSupportedKeys = Object.keys(givenYaml).filter(element => supportedKeys.indexOf(element) == -1); if (unSupportedKeys.length) { const result = unSupportedKeys.map(element => `${element}`).join(", "); return { valid: false, error: `The YAML file provided has unsupported field(s) "${result}".` }; } if ((0, util_1.isNullOrUndefined)(givenYaml.testName) && (0, util_1.isNullOrUndefined)(givenYaml.testId)) { return { valid: false, error: "The required field testId is missing in the load test YAML file." }; } let testId = ''; if (!(0, util_1.isNullOrUndefined)(givenYaml.testName)) { testId = givenYaml.testName; } if (!(0, util_1.isNullOrUndefined)(givenYaml.testId)) { testId = givenYaml.testId; } testId = testId.toLowerCase(); if (typeof (testId) != "string" || (0, CommonUtils_1.invalidName)(testId)) { return { valid: false, error: `The value "${testId}" for testId is not a valid string. Allowed characters are [a-zA-Z0-9-_] and the length must be between 2 to 50 characters.` }; } if (givenYaml.displayName && (typeof givenYaml.displayName != 'string' || (0, CommonUtils_1.invalidDisplayName)(givenYaml.displayName))) { return { valid: false, error: `The value "${givenYaml.displayName}" for displayName is invalid. Display name must be a string of length between 2 to 50.` }; } if (givenYaml.description && (typeof givenYaml.description != 'string' || (0, CommonUtils_1.invalidDescription)(givenYaml.description))) { return { valid: false, error: `The value "${givenYaml.description}" for description is invalid. Description must be a string of length less than 100.` }; } if ((0, util_1.isNullOrUndefined)(givenYaml.testPlan)) { return { valid: false, error: "The required field testPlan is missing in the load test YAML file." }; } if (givenYaml.engineInstances && (isNaN(givenYaml.engineInstances) || (0, CommonUtils_1.inValidEngineInstances)(givenYaml.engineInstances))) { return { valid: false, error: `The value "${givenYaml.engineInstances}" for engineInstances is invalid. The value should be an integer between 1 and 400.` }; } let kind = (_a = givenYaml.testType) !== null && _a !== void 0 ? _a : TestKind_1.TestKind.JMX; if (!isValidTestKind(kind)) { return { valid: false, error: `The value "${kind}" for testType is invalid. Acceptable values are ${EngineUtil.Resources.Strings.allFrameworksFriendly}.` }; } let framework = EngineUtil.getLoadTestFrameworkModelFromKind(kind); if (givenYaml.testType == TestKind_1.TestKind.URL) { if (!(0, CommonUtils_1.checkFileType)(givenYaml.testPlan, 'json')) { return { valid: false, error: "The testPlan for a URL test should of type \"json\"." }; } } else if (!(0, CommonUtils_1.checkFileType)(givenYaml.testPlan, framework.testScriptFileExtension)) { return { valid: false, error: `The testPlan for a ${kind} test should of type "${framework.testScriptFileExtension}".` }; } if (givenYaml.subnetId && (typeof givenYaml.subnetId != 'string' || isInValidSubnet(givenYaml.subnetId))) { return { valid: false, error: `The value "${givenYaml.subnetId}" for subnetId is invalid. The value should be a string of the format: "/subscriptions/{subscriptionId}/resourceGroups/{rgName}/providers/Microsoft.Network/virtualNetworks/{vnetName}/subnets/{subnetName}".` }; } if (givenYaml.keyVaultReferenceIdentity && (typeof givenYaml.keyVaultReferenceIdentity != 'string' || isInvalidManagedIdentityId(givenYaml.keyVaultReferenceIdentity))) { return { valid: false, error: `The value "${givenYaml.keyVaultReferenceIdentity}" for keyVaultReferenceIdentity is invalid. The value should be a string of the format: "/subscriptions/{subsId}/resourceGroups/{rgName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}".` }; } if (givenYaml.keyVaultReferenceIdentityType != undefined && givenYaml.keyVaultReferenceIdentityType != null && !isValidManagedIdentityType(givenYaml.keyVaultReferenceIdentityType)) { return { valid: false, error: `The value "${givenYaml.keyVaultReferenceIdentityType}" for keyVaultReferenceIdentityType is invalid. Allowed values are "SystemAssigned" and "UserAssigned".` }; } if (!(0, util_1.isNullOrUndefined)(givenYaml.referenceIdentities)) { if (!Array.isArray(givenYaml.referenceIdentities)) { return { valid: false, error: `The value "${givenYaml.referenceIdentities.toString()}" for referenceIdentities is invalid. Provide a valid list of reference identities.` }; } let result = validateReferenceIdentities(givenYaml.referenceIdentities); if ((result === null || result === void 0 ? void 0 : result.valid) == false) { return result; } try { if (givenYaml.keyVaultReferenceIdentityType || givenYaml.keyVaultReferenceIdentity) { (0, CommonUtils_1.validateAndGetSegregatedManagedIdentities)(givenYaml.referenceIdentities, true); } else { (0, CommonUtils_1.validateAndGetSegregatedManagedIdentities)(givenYaml.referenceIdentities); } } catch (error) { return { valid: false, error: error.message }; } } if (!(0, util_1.isNullOrUndefined)(givenYaml.keyVaultReferenceIdentity) && givenYaml.keyVaultReferenceIdentityType == UtilModels_1.ManagedIdentityType.SystemAssigned) { return { valid: false, error: `The "keyVaultReferenceIdentity" should omitted or set to null when using the "SystemAssigned" identity type.` }; } if ((0, util_1.isNullOrUndefined)(givenYaml.keyVaultReferenceIdentity) && givenYaml.keyVaultReferenceIdentityType == UtilModels_1.ManagedIdentityType.UserAssigned) { return { valid: false, error: `"The value for 'keyVaultReferenceIdentity' cannot be null when using the 'UserAssigned' identity type. Provide a valid identity reference for 'keyVaultReferenceIdentity'."` }; } if (givenYaml.publicIPDisabled && typeof givenYaml.publicIPDisabled != 'boolean') { return { valid: false, error: `The value "${givenYaml.publicIPDisabled}" for publicIPDisabled is invalid. The value should be either true or false.` }; } if (givenYaml.publicIPDisabled && (0, util_1.isNullOrUndefined)(givenYaml.subnetId)) { return { valid: false, error: `Public IP deployment can only be disabled for tests against private endpoints. For public endpoints, set publicIPDisabled to False.` }; } if (givenYaml.configurationFiles && !isArrayOfStrings(givenYaml.configurationFiles)) { return { valid: false, error: `The value "${givenYaml.configurationFiles}" for configurationFiles is invalid. Provide a valid list of strings.` }; } if (givenYaml.zipArtifacts && !isArrayOfStrings(givenYaml.zipArtifacts)) { return { valid: false, error: `The value "${givenYaml.zipArtifacts}" for zipArtifacts is invalid. Provide a valid list of strings.` }; } if (givenYaml.splitAllCSVs && typeof givenYaml.splitAllCSVs != 'boolean') { return { valid: false, error: `The value "${givenYaml.splitAllCSVs}" for splitAllCSVs is invalid. The value should be either true or false` }; } if (givenYaml.properties != undefined && givenYaml.properties.userPropertyFile != undefined) { if ((0, util_1.isNull)(givenYaml.properties.userPropertyFile) || typeof givenYaml.properties.userPropertyFile != 'string' || !(0, CommonUtils_1.checkFileTypes)(givenYaml.properties.userPropertyFile, framework.userPropertyFileExtensions)) { return { valid: false, error: `The value "${givenYaml.properties.userPropertyFile}" for userPropertyFile is invalid. Provide a valid file path of type ${framework.ClientResources.userPropertyFileExtensionsFriendly}. Refer to the YAML syntax at https://learn.microsoft.com/azure/load-testing/reference-test-config-yaml#properties-configuration.` }; } } if (givenYaml.appComponents) { if (!Array.isArray(givenYaml.appComponents)) { return { valid: false, error: `The value "${givenYaml.appComponents}" for appComponents is invalid. Provide a valid list of application components.` }; } let validationAppComponents = validateAppComponentAndServerMetricsConfig(givenYaml.appComponents); if (validationAppComponents.valid == false) { return validationAppComponents; } } if (givenYaml.autoStop) { let validation = (0, CommonUtils_1.validateAutoStop)(givenYaml.autoStop); if (validation.valid == false) { return validation; } } if (givenYaml.failureCriteria != undefined) { let result = validateFailureCriteria(givenYaml.failureCriteria); if (result.valid == false) { return result; } } if (givenYaml.regionalLoadTestConfig) { if (!Array.isArray(givenYaml.regionalLoadTestConfig)) { return { valid: false, error: `The value "${(_b = givenYaml.regionalLoadTestConfig) === null || _b === void 0 ? void 0 : _b.toString()}" for regionalLoadTestConfig is invalid. Provide a valid list of region configuration for Multi-region load test.` }; } if (givenYaml.regionalLoadTestConfig.length < 2) { return { valid: false, error: `Multi-region load tests should contain a minimum of 2 geographic regions in the configuration.` }; } var totalEngineCount = 0; for (let i = 0; i < givenYaml.regionalLoadTestConfig.length; i++) { if ((0, util_1.isNullOrUndefined)(givenYaml.regionalLoadTestConfig[i].region) || typeof givenYaml.regionalLoadTestConfig[i].region != 'string' || givenYaml.regionalLoadTestConfig[i].region == "") { return { valid: false, error: `The value "${givenYaml.regionalLoadTestConfig[i].region}" for region in regionalLoadTestConfig is invalid. Provide a valid string.` }; } if ((0, util_1.isNullOrUndefined)(givenYaml.regionalLoadTestConfig[i].engineInstances) || isNaN(givenYaml.regionalLoadTestConfig[i].engineInstances) || (0, CommonUtils_1.inValidEngineInstances)(givenYaml.regionalLoadTestConfig[i].engineInstances)) { return { valid: false, error: `The value "${givenYaml.regionalLoadTestConfig[i].engineInstances}" for engineInstances in regionalLoadTestConfig is invalid. The value should be an integer between 1 and 400.` }; } totalEngineCount += givenYaml.regionalLoadTestConfig[i].engineInstances; } let engineInstances = (_c = givenYaml.engineInstances) !== null && _c !== void 0 ? _c : 1; if (totalEngineCount != givenYaml.engineInstances) { return { valid: false, error: `The sum of engineInstances in regionalLoadTestConfig should be equal to the value of totalEngineInstances "${engineInstances}" in the test configuration.` }; } } return { valid: true, error: "" }; } exports.validateYamlConfig = validateYamlConfig; function validateFailureCriteria(failureCriteria) { var _a, _b, _c, _d, _e, _f, _g, _h; if (!Array.isArray(failureCriteria)) { if (!isDictionary(failureCriteria)) { return { valid: false, error: `The value "${failureCriteria === null || failureCriteria === void 0 ? void 0 : failureCriteria.toString()}" for failureCriteria is invalid. Provide a valid dictionary with keys as ${UtilModels_1.ValidCriteriaTypes.clientMetrics} and ${UtilModels_1.ValidCriteriaTypes.serverMetrics}.` }; } let keys = Object.keys(failureCriteria); for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (!isValidFailureCriteriaType(key)) { return { valid: false, error: `The value "${key}" for failureCriteria is invalid. Provide a valid dictionary with keys as ${UtilModels_1.ValidCriteriaTypes.clientMetrics} and ${UtilModels_1.ValidCriteriaTypes.serverMetrics}.` }; } if (!Array.isArray(failureCriteria[key])) { return { valid: false, error: `The value "${(_a = failureCriteria[key]) === null || _a === void 0 ? void 0 : _a.toString()}" for ${key} in failureCriteria is invalid. Provide a valid list of criteria.` }; } } if (failureCriteria[UtilModels_1.ValidCriteriaTypes.serverMetrics]) { let serverMetrics = failureCriteria[UtilModels_1.ValidCriteriaTypes.serverMetrics]; for (let i = 0; i < serverMetrics.length; i++) { let serverMetric = serverMetrics[i]; if (!isDictionary(serverMetric)) { return { valid: false, error: `The value "${serverMetric === null || serverMetric === void 0 ? void 0 : serverMetric.toString()}" for ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid dictionary with metricName, aggregation, condition, value and optionally metricNamespace.` }; } if (isInvalidString(serverMetric.resourceId)) { return { valid: false, error: `The value "${(_b = serverMetric.resourceId) === null || _b === void 0 ? void 0 : _b.toString()}" for resourceId in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid string.` }; } if (isInvalidString(serverMetric.metricNameSpace, true)) { return { valid: false, error: `The value "${(_c = serverMetric.metricNameSpace) === null || _c === void 0 ? void 0 : _c.toString()}" for metricNameSpace in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid string.` }; } if (isInvalidString(serverMetric.metricName)) { return { valid: false, error: `The value "${(_d = serverMetric.metricName) === null || _d === void 0 ? void 0 : _d.toString()}" for metricName in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid string.` }; } if (isInvalidString(serverMetric.aggregation)) { return { valid: false, error: `The value "${(_e = serverMetric.aggregation) === null || _e === void 0 ? void 0 : _e.toString()}" for aggregation in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid string.` }; } if (isInvalidString(serverMetric.condition)) { return { valid: false, error: `The value "${(_f = serverMetric.condition) === null || _f === void 0 ? void 0 : _f.toString()}" for condition in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid condition from "${UtilModels_1.ValidConditionsEnumValuesList.GreaterThan}", "${UtilModels_1.ValidConditionsEnumValuesList.LessThan}".` }; } if ((0, util_1.isNullOrUndefined)(serverMetric.value) || typeof serverMetric.value != 'number' || isNaN(serverMetric.value)) { return { valid: false, error: `The value "${(_g = serverMetric.value) === null || _g === void 0 ? void 0 : _g.toString()}" for value in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid number.` }; } if (!isValidConditionEnumString(serverMetric.condition)) { return { valid: false, error: `The value "${(_h = serverMetric.condition) === null || _h === void 0 ? void 0 : _h.toString()}" for condition in ${UtilModels_1.ValidCriteriaTypes.serverMetrics} in failureCriteria is invalid. Provide a valid condition from "${UtilModels_1.ValidConditionsEnumValuesList.GreaterThan}", "${UtilModels_1.ValidConditionsEnumValuesList.LessThan}".` }; } } } if (failureCriteria[UtilModels_1.ValidCriteriaTypes.clientMetrics]) { let clientMetrics = failureCriteria[UtilModels_1.ValidCriteriaTypes.clientMetrics]; for (let clientMetric of clientMetrics) { if (!isDictionary(clientMetric) && typeof clientMetric != 'string') { return { valid: false, error: `The value "${clientMetric === null || clientMetric === void 0 ? void 0 : clientMetric.toString()}" for ${UtilModels_1.ValidCriteriaTypes.clientMetrics} in failureCriteria is invalid. Provide a valid criteria.` }; } } } } else { for (let criteria of failureCriteria) { if (!isDictionary(criteria) && typeof criteria != 'string') { return { valid: false, error: `The value "${criteria === null || criteria === void 0 ? void 0 : criteria.toString()}" for failureCriteria is invalid. Provide a valid criteria.` }; } } } return { valid: true, error: "" }; } function validateReferenceIdentities(referenceIdentities) { for (let referenceIdentity of referenceIdentities) { if (!isDictionary(referenceIdentity)) { return { valid: false, error: `The value "${referenceIdentity.toString()}" for referenceIdentities is invalid. Provide a valid dictionary with kind, value and type.` }; } if (referenceIdentity.value != undefined && typeof referenceIdentity.value != 'string') { return { valid: false, error: `The value "${referenceIdentity.value.toString()}" for id in referenceIdentities is invalid. Provide a valid string.` }; } if (referenceIdentity.type != undefined && typeof referenceIdentity.type != 'string') { return { valid: false, error: `The value "${referenceIdentity.type.toString()}" for type in referenceIdentities is invalid. Allowed values are "SystemAssigned" and "UserAssigned".` }; } if (!isValidReferenceIdentityKind(referenceIdentity.kind)) { return { valid: false, error: `The value "${referenceIdentity.kind}" for kind in referenceIdentity is invalid. Allowed values are 'Metrics', 'Keyvault' and 'Engine'.` }; } if (referenceIdentity.type && !isValidManagedIdentityType(referenceIdentity.type)) { return { valid: false, error: `The value "${referenceIdentity.type}" for type in referenceIdentities is invalid. Allowed values are "SystemAssigned" and "UserAssigned".` }; } if (!(0, util_1.isNullOrUndefined)(referenceIdentity.value) && referenceIdentity.type == UtilModels_1.ManagedIdentityType.SystemAssigned) { return { valid: false, error: `The "reference identity value" should omitted or set to null when using the "SystemAssigned" identity type.` }; } if ((0, util_1.isNullOrUndefined)(referenceIdentity.value) && referenceIdentity.type == UtilModels_1.ManagedIdentityType.UserAssigned) { return { valid: false, error: `The value for 'referenceIdentity value' cannot be null when using the 'UserAssigned' identity type. Provide a valid identity reference for 'reference identity value'.` }; } if (referenceIdentity.value && isInvalidManagedIdentityId(referenceIdentity.value)) { return { valid: false, error: `The value "${referenceIdentity.value}" for reference identity is invalid. The value should be a string of the format: "/subscriptions/{subsId}/resourceGroups/{rgName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}".` }; } } return { valid: true, error: "" }; } function validateAppComponentAndServerMetricsConfig(appComponents) { var _a, _b, _c, _d, _e; let appComponentsParsed = appComponents; for (let i = 0; i < appComponentsParsed.length; i++) { if (!isDictionary(appComponentsParsed[i])) { return { valid: false, error: `The value "${appComponentsParsed[i].toString()}" for AppComponents in the index "${i}" is invalid. Provide a valid dictionary.` }; } let resourceId = appComponentsParsed[i].resourceId; if (isInvalidString(resourceId)) { return { valid: false, error: `The value "${appComponentsParsed[i].resourceId}" for resourceId in appComponents is invalid. Provide a valid resourceId.` }; } resourceId = resourceId.toLowerCase(); let subscriptionId = (0, CommonUtils_1.getSubscriptionIdFromResourceId)(resourceId); let resourceType = (0, CommonUtils_1.getResourceTypeFromResourceId)(resourceId); let name = (0, CommonUtils_1.getResourceNameFromResourceId)(resourceId); let resourceGroup = (0, CommonUtils_1.getResourceGroupFromResourceId)(resourceId); if ((0, util_1.isNullOrUndefined)(resourceGroup) || (0, util_1.isNullOrUndefined)(subscriptionId) || (0, util_1.isNullOrUndefined)(resourceType) || (0, util_1.isNullOrUndefined)(name) || !isValidGUID(subscriptionId)) { return { valid: false, error: `The value "${resourceId}" for resourceId in appComponents is invalid. Provide a valid resourceId.` }; } if (isInvalidString(appComponentsParsed[i].kind, true)) { return { valid: false, error: `The value "${(_a = appComponentsParsed[i].kind) === null || _a === void 0 ? void 0 : _a.toString()}" for kind in appComponents is invalid. Provide a valid string.` }; } if (isInvalidString(appComponentsParsed[i].resourceName, true)) { return { valid: false, error: `The value "${(_b = appComponentsParsed[i].resourceName) === null || _b === void 0 ? void 0 : _b.toString()}" for resourceName in appComponents is invalid. Provide a valid string.` }; } let resourceName = appComponentsParsed[i].resourceName || name; if (!(0, util_1.isNullOrUndefined)(appComponentsParsed[i].metrics)) { let metrics = appComponentsParsed[i].metrics; if (!Array.isArray(metrics)) { return { valid: false, error: `The value "${metrics === null || metrics === void 0 ? void 0 : metrics.toString()}" for metrics in the appComponent with resourceName "${resourceName}" is invalid. Provide a valid list of metrics.` }; } for (let metric of metrics) { if (!isDictionary(metric)) { return { valid: false, error: `The value "${metric === null || metric === void 0 ? void 0 : metric.toString()}" for metrics in the appComponent with resourceName "${resourceName}" is invalid. Provide a valid dictionary.` }; } if (metric && isInvalidString(metric.name)) { return { valid: false, error: `The value "${(_c = metric.name) === null || _c === void 0 ? void 0 : _c.toString()}" for name in the appComponent with resourceName "${resourceName}" is invalid. Provide a valid string.` }; } if (isInvalidString(metric.aggregation)) { return { valid: false, error: `The value "${(_d = metric.aggregation) === null || _d === void 0 ? void 0 : _d.toString()}" for aggregation in the appComponent with resourceName "${resourceName}" is invalid. Provide a valid string.` }; } if (isInvalidString(metric.namespace, true)) { return { valid: false, error: `The value "${(_e = metric.namespace) === null || _e === void 0 ? void 0 : _e.toString()}" for namespace in the appComponent with resourceName "${resourceName}" is invalid. Provide a valid string.` }; } } } else { console.log(`Metrics not provided for the appComponent "${resourceName}", default metrics will be enabled for the same.`); } } return { valid: true, error: "" }; } function isDictionary(variable) { return typeof variable === 'object' && variable !== null && !Array.isArray(variable); } function isValidTestKind(value) { return Object.values(TestKind_1.TestKind).includes(value); } function isValidConditionEnumString(value) { return Object.values(UtilModels_1.ValidConditionsEnumValuesList).includes(value); } function isValidFailureCriteriaType(value) { return Object.values(UtilModels_1.ValidCriteriaTypes).includes(value); } function isInValidSubnet(uri) { const pattern = /^\/subscriptions\/[a-f0-9-]+\/resourceGroups\/[a-zA-Z0-9\u0080-\uFFFF()._-]+\/providers\/Microsoft\.Network\/virtualNetworks\/[a-zA-Z0-9._-]+\/subnets\/[a-zA-Z0-9._-]+$/i; return !(pattern.test(uri)); } function isInvalidManagedIdentityId(uri) { const pattern = /^\/subscriptions\/[a-f0-9-]+\/resourceGroups\/[a-zA-Z0-9\u0080-\uFFFF()._-]+\/providers\/Microsoft\.ManagedIdentity\/userAssignedIdentities\/[a-zA-Z0-9._-]+$/i; return !(pattern.test(uri)); } function isValidReferenceIdentityKind(value) { return Object.values(UtilModels_1.ReferenceIdentityKinds).includes(value); } function isValidManagedIdentityType(value) { return Object.values(UtilModels_1.ManagedIdentityType).includes(value); } function isArrayOfStrings(variable) { return Array.isArray(variable) && variable.every((item) => typeof item === 'string'); } function isInvalidString(variable, allowNull = false) { if (allowNull) { return !(0, util_1.isNullOrUndefined)(variable) && (typeof variable != 'string' || variable == ""); } return (0, util_1.isNullOrUndefined)(variable) || typeof variable != 'string' || variable == ""; } function isValidGUID(guid) { const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/; return guidRegex.test(guid); }