From 8a4c8f367f049ff79ec0d30d4d8a78ef4e97c964 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 17 Jan 2022 08:41:42 -0500 Subject: [PATCH] [Fleet] Fix package policy validation --- .../services/validate_package_policy.ts | 39 ++++++++----------- .../package_policy_input_stream.tsx | 8 +++- .../package_policy_input_var_field.tsx | 2 +- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/fleet/common/services/validate_package_policy.ts b/x-pack/plugins/fleet/common/services/validate_package_policy.ts index 12bef2dfd7c27..8e2744d970371 100644 --- a/x-pack/plugins/fleet/common/services/validate_package_policy.ts +++ b/x-pack/plugins/fleet/common/services/validate_package_policy.ts @@ -162,23 +162,17 @@ export const validatePackagePolicy = ( const streamVarDefs = streamVarDefsByDatasetAndInput[`${stream.data_stream.dataset}-${input.type}`]; - // Validate stream-level config fields - if (stream.vars) { - streamValidationResults.vars = Object.entries(stream.vars).reduce( - (results, [name, configEntry]) => { - results[name] = - streamVarDefs && streamVarDefs[name] && input.enabled && stream.enabled - ? validatePackagePolicyConfig( - configEntry, - streamVarDefs[name], - name, - safeLoadYaml - ) - : null; - return results; - }, - {} as ValidationEntry - ); + if (streamVarDefs && Object.keys(streamVarDefs).length) { + streamValidationResults.vars = Object.keys(streamVarDefs).reduce((results, name) => { + const configEntry = stream?.vars?.[name]; + + results[name] = + input.enabled && stream.enabled + ? validatePackagePolicyConfig(configEntry, streamVarDefs[name], name, safeLoadYaml) + : null; + + return results; + }, {} as ValidationEntry); } inputValidationResults.streams![stream.data_stream.dataset] = streamValidationResults; @@ -200,13 +194,15 @@ export const validatePackagePolicy = ( }; export const validatePackagePolicyConfig = ( - configEntry: PackagePolicyConfigRecordEntry, + configEntry: PackagePolicyConfigRecordEntry | undefined, varDef: RegistryVarsEntry, varName: string, safeLoadYaml: (yaml: string) => any ): string[] | null => { const errors = []; - const { value } = configEntry; + + const value = configEntry?.value; + let parsedValue: any = value; if (typeof value === 'string') { @@ -253,10 +249,7 @@ export const validatePackagePolicyConfig = ( }) ); } - if ( - varDef.required && - (!parsedValue || (Array.isArray(parsedValue) && parsedValue.length === 0)) - ) { + if (varDef.required && Array.isArray(parsedValue) && parsedValue.length === 0) { errors.push( i18n.translate('xpack.fleet.packagePolicyValidation.requiredErrorMessage', { defaultMessage: '{fieldName} is required', diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_stream.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_stream.tsx index 8e7dda174f363..b8bc0fdb03ad5 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_stream.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_stream.tsx @@ -107,7 +107,10 @@ export const PackagePolicyInputStreamConfig: React.FunctionComponent<{ {requiredVars.map((varDef) => { const { name: varName, type: varType } = varDef; - const { value, frozen } = packagePolicyInputStream.vars![varName]; + const varConfigEntry = packagePolicyInputStream.vars?.[varName]; + const value = varConfigEntry?.value; + const frozen = varConfigEntry?.frozen ?? false; + return ( { const { name: varName, type: varType } = varDef; - const value = packagePolicyInputStream.vars![varName].value; + const value = packagePolicyInputStream.vars?.[varName]?.value; + return ( setIsDirty(true)} isDisabled={frozen}