@@ -13,7 +13,6 @@ import { DEFAULT_NAMESPACE_STRING } from '@kbn/core-saved-objects-utils-server';
1313import apm from 'elastic-apm-node' ;
1414
1515import type {
16- NewPackagePolicy ,
1716 AgentPolicy ,
1817 Installation ,
1918 Output ,
@@ -22,6 +21,8 @@ import type {
2221 PreconfiguredPackage ,
2322 PackagePolicy ,
2423 PackageInfo ,
24+ PreconfiguredPackagePolicy ,
25+ PreconfiguredInputs ,
2526} from '../../common/types' ;
2627import type { PreconfigurationError } from '../../common/constants' ;
2728import { PRECONFIGURATION_LATEST_KEYWORD } from '../../common/constants' ;
@@ -39,10 +40,14 @@ import { getInstallation, getPackageInfo } from './epm/packages';
3940import { ensurePackagesCompletedInstall } from './epm/packages/install' ;
4041import { bulkInstallPackages } from './epm/packages/bulk_install_packages' ;
4142import { agentPolicyService , addPackageToAgentPolicy } from './agent_policy' ;
42- import { type InputsOverride , packagePolicyService } from './package_policy' ;
43+ import { packagePolicyService } from './package_policy' ;
4344import { preconfigurePackageInputs } from './package_policy' ;
4445import { appContextService } from './app_context' ;
4546import type { UpgradeManagedPackagePoliciesResult } from './setup/managed_package_policies' ;
47+ import {
48+ packagePolicyHasFrozenVariablesUpdate ,
49+ updateFrozenInputs ,
50+ } from './preconfiguration/package_policy_frozen_variables' ;
4651
4752interface PreconfigurationResult {
4853 policies : Array < { id : string ; updated_at : string } > ;
@@ -273,14 +278,62 @@ export async function ensurePreconfiguredPackagesAndPolicies(
273278 } )
274279 ) ;
275280
276- const packagePoliciesToAdd = installedPackagePolicies . filter ( ( installablePackagePolicy ) => {
277- return ! ( agentPolicyWithPackagePolicies ?. package_policies as PackagePolicy [ ] ) . some (
278- ( packagePolicy ) =>
279- ( packagePolicy . id !== undefined &&
280- packagePolicy . id === installablePackagePolicy . packagePolicy . id ) ||
281- packagePolicy . name === installablePackagePolicy . packagePolicy . name
282- ) ;
283- } ) ;
281+ const [ packagePoliciesToAdd , packagePoliciesUpdates ] = installedPackagePolicies . reduce (
282+ ( acc , installablePackagePolicy ) => {
283+ const isAdd = ! ( agentPolicyWithPackagePolicies ?. package_policies as PackagePolicy [ ] ) . some (
284+ ( packagePolicy ) =>
285+ ( packagePolicy . id !== undefined &&
286+ packagePolicy . id === installablePackagePolicy . packagePolicy . id ) ||
287+ packagePolicy . name === installablePackagePolicy . packagePolicy . name
288+ ) ;
289+
290+ if ( isAdd ) {
291+ acc [ 0 ] . push ( installablePackagePolicy ) ;
292+ return acc ;
293+ }
294+
295+ if ( ! agentPolicyWithPackagePolicies ) {
296+ return acc ;
297+ }
298+
299+ const existingPackagePolicy = agentPolicyWithPackagePolicies . package_policies ?. find (
300+ ( packagePolicy ) =>
301+ packagePolicy . id === installablePackagePolicy . packagePolicy . id ||
302+ packagePolicy . name === installablePackagePolicy . packagePolicy . name
303+ ) ;
304+
305+ if ( ! existingPackagePolicy ) {
306+ return acc ;
307+ }
308+
309+ const updatePackagePolicy = { ...existingPackagePolicy } ;
310+ if ( Array . isArray ( installablePackagePolicy . packagePolicy . inputs ) ) {
311+ if (
312+ packagePolicyHasFrozenVariablesUpdate (
313+ updatePackagePolicy ,
314+ installablePackagePolicy . packagePolicy . inputs
315+ )
316+ ) {
317+ acc [ 1 ] . push ( {
318+ namespacedSoClient : installablePackagePolicy . namespacedSoClient ,
319+ packagePolicy : updatePackagePolicy ,
320+ inputs : installablePackagePolicy . packagePolicy . inputs ,
321+ } ) ;
322+ }
323+ }
324+
325+ return acc ;
326+ } ,
327+ [
328+ [ ] as Array < ( typeof installedPackagePolicies ) [ 0 ] > ,
329+ [ ] as Array < {
330+ namespacedSoClient : SavedObjectsClientContract ;
331+ packagePolicy : PackagePolicy ;
332+ inputs : PreconfiguredInputs [ ] ;
333+ } > ,
334+ ]
335+ ) ;
336+
284337 logger . debug (
285338 ( ) =>
286339 `Adding preconfigured package policies ${ JSON . stringify (
@@ -300,6 +353,33 @@ export async function ensurePreconfiguredPackagesAndPolicies(
300353 ) ;
301354 s ?. end ( ) ;
302355
356+ logger . debug (
357+ ( ) =>
358+ `Updating preconfigured package policies ${ JSON . stringify (
359+ packagePoliciesUpdates . map ( ( pol ) => ( {
360+ name : pol . packagePolicy . name ,
361+ package : pol . packagePolicy . package ?. name ,
362+ } ) )
363+ ) } `
364+ ) ;
365+ const s2 = apm . startSpan ( 'Update preconfigured package policies' , 'preconfiguration' ) ;
366+ for ( const packagePolicyUpdate of packagePoliciesUpdates ! ) {
367+ try {
368+ await updateFrozenInputs (
369+ esClient ,
370+ packagePolicyUpdate . namespacedSoClient ,
371+ packagePolicyUpdate . packagePolicy ,
372+ packagePolicyUpdate . inputs
373+ ) ;
374+ } catch ( error ) {
375+ logger . error (
376+ `Error updating preconfigured variables for package policy ${ packagePolicyUpdate . packagePolicy . name } : ${ error . message } ` ,
377+ { error }
378+ ) ;
379+ }
380+ }
381+ s2 ?. end ( ) ;
382+
303383 // Add the is_managed flag after configuring package policies to avoid errors
304384 if ( shouldAddIsManagedFlag ) {
305385 await agentPolicyService . update (
@@ -312,6 +392,10 @@ export async function ensurePreconfiguredPackagesAndPolicies(
312392 }
313393 ) ;
314394 }
395+
396+ if ( packagePoliciesUpdates . length > 0 ) {
397+ await agentPolicyService . bumpRevision ( namespacedSoClient , esClient , policy ! . id ) ;
398+ }
315399 }
316400 }
317401
@@ -363,13 +447,7 @@ async function addPreconfiguredPolicyPackages(
363447 installedPackagePolicies : Array < {
364448 installedPackage : Installation ;
365449 namespacedSoClient : SavedObjectsClientContract ;
366- packagePolicy :
367- | ( Partial < Omit < NewPackagePolicy , 'inputs' > > & {
368- id ?: string | number ;
369- name : string ;
370- inputs ?: InputsOverride [ ] ;
371- } )
372- | ( Omit < SimplifiedPackagePolicy , 'package' | 'policy_id' > & { id : string } ) ;
450+ packagePolicy : Omit < PreconfiguredPackagePolicy , 'package' > ;
373451 } > ,
374452 defaultOutput : Output ,
375453 bumpAgentPolicyRevison = false
0 commit comments