From b31b9575ee8fb59a45f4d65b01a82e751cb5766b Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 8 Jul 2024 18:04:13 +0200 Subject: [PATCH 01/34] Create ConflictResolution enum --- .../model/diff/rule_diff/rule_diff.ts | 2 ++ .../diff/three_way_diff/three_way_diff.ts | 20 ++++++++++++------- .../review_rule_upgrade_route.ts | 1 + .../logic/diff/calculate_rule_diff.ts | 18 ++++++++++++----- .../algorithms/scalar_array_diff_algorithm.ts | 6 +++++- .../algorithms/simple_diff_algorithm.ts | 6 +++++- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index d990bb3dbf461..686aab737ed07 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -63,6 +63,8 @@ export type RuleFieldsDiff = CommonFieldsDiff & export interface FullRuleDiff { fields: RuleFieldsDiff; has_conflict: boolean; + number_fields_with_updates: number; + number_fields_with_conflicts: number; } /** diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 3b6831709ced9..6522909ded26f 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -19,6 +19,12 @@ import type { ThreeWayMergeOutcome } from './three_way_merge_outcome'; export const MissingVersion = Symbol('MissingVersion'); export type MissingVersion = typeof MissingVersion; +export enum ThreeWayDiffConflictResolutionResult { + NO, + SOLVABLE, + NON_SOLVABLE, +} + /** * Three versions of a value to pass to a diff algorithm. */ @@ -107,15 +113,15 @@ export interface ThreeWayDiff extends ThreeVersionsOf { has_update: boolean; /** - * True if: - * - current != target and we couldn't automatically resolve the conflict between them + * Enum of possible conflict outcomes of a three-way diff: + * - NON_SOLVABLE: current != target and we couldn't automatically resolve the conflict between them + * - SOLVABLE: current != target and we automatically resolved the conflict between them + * - NO: + * - current == target (value won't change) + * - current != target && current == base (stock rule will get a new value) * - * False if: - * - current == target (value won't change) - * - current != target && current == base (stock rule will get a new value) - * - current != target and we automatically resolved the conflict between them */ - has_conflict: boolean; + has_conflict: ThreeWayDiffConflictResolutionResult; } /** diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index f38fcc7953641..e1d76e6e710be 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -90,6 +90,7 @@ const calculateRuleStats = (results: CalculateRuleDiffResult[]): RuleUpgradeStat const allTags = new Set( results.flatMap((result) => result.ruleVersions.input.current?.tags ?? []) ); + debugger; return { num_rules_to_upgrade_total: results.length, tags: [...allTags].sort((a, b) => a.localeCompare(b)), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index 337a510c3b4b2..de96687f27af6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -10,7 +10,10 @@ import type { FullRuleDiff, ThreeWayDiff, } from '../../../../../../common/api/detection_engine/prebuilt_rules'; -import { MissingVersion } from '../../../../../../common/api/detection_engine/prebuilt_rules'; +import { + MissingVersion, + ThreeWayDiffConflictResolutionResult, +} from '../../../../../../common/api/detection_engine/prebuilt_rules'; import type { RuleResponse } from '../../../../../../common/api/detection_engine/model/rule_schema'; import { invariant } from '../../../../../../common/utils/invariant'; import type { PrebuiltRuleAsset } from '../../model/rule_assets/prebuilt_rule_asset'; @@ -75,14 +78,19 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = target_version: diffableTargetVersion, }); - const hasAnyFieldConflict = Object.values>(fieldsDiff).some( - (fieldDiff) => fieldDiff.has_conflict - ); + const numberFieldsWithUpdates = Object.values>(fieldsDiff).filter( + (fieldDiff) => fieldDiff.has_update + ).length; + const numberFieldsWithConflicts = Object.values>(fieldsDiff).filter( + (fieldDiff) => fieldDiff.has_conflict !== ThreeWayDiffConflictResolutionResult.NO + ).length; return { ruleDiff: { fields: fieldsDiff, - has_conflict: hasAnyFieldConflict, + has_conflict: numberFieldsWithConflicts > 0, + number_fields_with_updates: numberFieldsWithUpdates, + number_fields_with_conflicts: numberFieldsWithConflicts, }, ruleVersions: { input: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index 18cf7f4f8b2cd..da419a3df752a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -17,6 +17,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -52,7 +53,10 @@ export const scalarArrayDiffAlgorithm = ( diff_outcome: diffOutcome, merge_outcome: mergeOutcome, has_update: valueCanUpdate, - has_conflict: mergeOutcome === ThreeWayMergeOutcome.Conflict, + has_conflict: + mergeOutcome === ThreeWayMergeOutcome.Conflict + ? ThreeWayDiffConflictResolutionResult.SOLVABLE + : ThreeWayDiffConflictResolutionResult.NO, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 51d3d8fc22d58..e16d27959bca0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -13,6 +13,7 @@ import type { import { determineDiffOutcome, determineIfValueCanUpdate, + ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; @@ -49,7 +50,10 @@ export const simpleDiffAlgorithm = ( diff_outcome: diffOutcome, merge_outcome: mergeOutcome, has_update: valueCanUpdate, - has_conflict: mergeOutcome === ThreeWayMergeOutcome.Conflict, + has_conflict: + mergeOutcome === ThreeWayMergeOutcome.Conflict + ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE + : ThreeWayDiffConflictResolutionResult.NO, }; }; From 6f783dca2ac78cd248780689cebdc6b3221026bd Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 8 Jul 2024 18:18:53 +0200 Subject: [PATCH 02/34] Update prop name --- .../model/diff/three_way_diff/three_way_diff.ts | 2 +- .../rule_details/per_field_rule_diff_tab.test.tsx | 3 ++- .../review_rule_upgrade_route.ts | 2 +- .../logic/diff/calculate_rule_diff.ts | 2 +- .../algorithms/number_diff_algorithm.test.ts | 15 ++++++++------- .../algorithms/scalar_array_diff_algorithm.ts | 2 +- .../algorithms/simple_diff_algorithm.ts | 2 +- .../single_line_string_diff_algorithm.test.ts | 15 ++++++++------- 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 6522909ded26f..13ca5b168b7c6 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -121,7 +121,7 @@ export interface ThreeWayDiff extends ThreeVersionsOf { * - current != target && current == base (stock rule will get a new value) * */ - has_conflict: ThreeWayDiffConflictResolutionResult; + conflict: ThreeWayDiffConflictResolutionResult; } /** diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 3b24b7022acdd..6c777a9d50b41 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -7,6 +7,7 @@ import { KqlQueryType, + ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '../../../../../common/api/detection_engine'; @@ -18,7 +19,7 @@ import { PerFieldRuleDiffTab } from './per_field_rule_diff_tab'; const ruleFieldsDiffBaseFieldsMock = { diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, merge_outcome: ThreeWayMergeOutcome.Target, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index e1d76e6e710be..af1daa60c3a68 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -90,7 +90,7 @@ const calculateRuleStats = (results: CalculateRuleDiffResult[]): RuleUpgradeStat const allTags = new Set( results.flatMap((result) => result.ruleVersions.input.current?.tags ?? []) ); - debugger; + return { num_rules_to_upgrade_total: results.length, tags: [...allTags].sort((a, b) => a.localeCompare(b)), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index de96687f27af6..14dfd6047e932 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -82,7 +82,7 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = (fieldDiff) => fieldDiff.has_update ).length; const numberFieldsWithConflicts = Object.values>(fieldsDiff).filter( - (fieldDiff) => fieldDiff.has_conflict !== ThreeWayDiffConflictResolutionResult.NO + (fieldDiff) => fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO ).length; return { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index ddefb27a397da..7ec0d7af57210 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -10,6 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine'; import { numberDiffAlgorithm } from './number_diff_algorithm'; @@ -28,7 +29,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -47,7 +48,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -66,7 +67,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -85,7 +86,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -104,7 +105,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - has_conflict: true, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, }) ); }); @@ -124,7 +125,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -143,7 +144,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index da419a3df752a..6d31002eb9639 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -53,7 +53,7 @@ export const scalarArrayDiffAlgorithm = ( diff_outcome: diffOutcome, merge_outcome: mergeOutcome, has_update: valueCanUpdate, - has_conflict: + conflict: mergeOutcome === ThreeWayMergeOutcome.Conflict ? ThreeWayDiffConflictResolutionResult.SOLVABLE : ThreeWayDiffConflictResolutionResult.NO, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index e16d27959bca0..d396888ff9a8d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -50,7 +50,7 @@ export const simpleDiffAlgorithm = ( diff_outcome: diffOutcome, merge_outcome: mergeOutcome, has_update: valueCanUpdate, - has_conflict: + conflict: mergeOutcome === ThreeWayMergeOutcome.Conflict ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE : ThreeWayDiffConflictResolutionResult.NO, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts index 427b592985e07..f067266e1c03e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts @@ -10,6 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine'; import { singleLineStringDiffAlgorithm } from './single_line_string_diff_algorithm'; @@ -28,7 +29,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -47,7 +48,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -66,7 +67,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -85,7 +86,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -104,7 +105,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - has_conflict: true, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, }) ); }); @@ -124,7 +125,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -143,7 +144,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); From a6e11b71df51ba8cea56c26c9a08b80d985c8c02 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 8 Jul 2024 18:32:16 +0200 Subject: [PATCH 03/34] Fixes --- .../prebuilt_rules/model/diff/rule_diff/rule_diff.ts | 2 ++ .../review_rule_upgrade/review_rule_upgrade_route.ts | 4 ++-- .../components/rule_details/per_field_rule_diff_tab.test.tsx | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index 686aab737ed07..3720395de7a7b 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -74,6 +74,8 @@ export interface FullRuleDiff { export interface PartialRuleDiff { fields: Partial; has_conflict: boolean; + number_fields_with_updates: number; + number_fields_with_conflicts: number; } export type RuleFieldsDiffWithDataSource = diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts index 09067a2e152e1..1c6b5c0d096e3 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts @@ -6,7 +6,7 @@ */ import type { RuleObjectId, RuleSignatureId, RuleTagArray } from '../../model'; -import type { PartialRuleDiff } from '../model'; +import type { FullRuleDiff } from '../model'; import type { RuleResponse } from '../../model/rule_schema'; export interface ReviewRuleUpgradeResponseBody { @@ -30,6 +30,6 @@ export interface RuleUpgradeInfoForReview { rule_id: RuleSignatureId; current_rule: RuleResponse; target_rule: RuleResponse; - diff: PartialRuleDiff; + diff: FullRuleDiff; revision: number; } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 6c777a9d50b41..c74a5922eba59 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -35,6 +35,8 @@ const ruleFieldsDiffMock: PartialRuleDiff = { }, }, has_conflict: false, + number_fields_with_updates: 1, + number_fields_with_conflicts: 0, }; const renderPerFieldRuleDiffTab = (ruleDiff: PartialRuleDiff) => { From bf00ce7a5b2b2b49f20f6cca59f2eeeb7f13fcd2 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 8 Jul 2024 19:10:55 +0200 Subject: [PATCH 04/34] Endpoint updates --- .../review_rule_upgrade_route.ts | 4 +-- .../review_rule_upgrade_route.ts | 2 ++ .../scalar_array_diff_algorithm.test.ts | 33 ++++++++++--------- ...view_prebuilt_rules.scalar_array_fields.ts | 25 +++++++------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts index 1c6b5c0d096e3..09067a2e152e1 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts @@ -6,7 +6,7 @@ */ import type { RuleObjectId, RuleSignatureId, RuleTagArray } from '../../model'; -import type { FullRuleDiff } from '../model'; +import type { PartialRuleDiff } from '../model'; import type { RuleResponse } from '../../model/rule_schema'; export interface ReviewRuleUpgradeResponseBody { @@ -30,6 +30,6 @@ export interface RuleUpgradeInfoForReview { rule_id: RuleSignatureId; current_rule: RuleResponse; target_rule: RuleResponse; - diff: FullRuleDiff; + diff: PartialRuleDiff; revision: number; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index af1daa60c3a68..0376c84882188 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -127,6 +127,8 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo (fieldDiff) => fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate ), has_conflict: ruleDiff.has_conflict, + number_fields_with_conflicts: ruleDiff.number_fields_with_conflicts, + number_fields_with_updates: ruleDiff.number_fields_with_updates, }, }; }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index 81f3c0272ac6e..ca320da938f29 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -10,6 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine'; import { scalarArrayDiffAlgorithm } from './scalar_array_diff_algorithm'; @@ -28,7 +29,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -47,7 +48,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -66,7 +67,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -85,7 +86,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -105,7 +106,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -125,7 +126,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -144,7 +145,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -165,7 +166,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -186,7 +187,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -206,7 +207,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -226,7 +227,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -246,7 +247,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -267,7 +268,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -286,7 +287,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -305,7 +306,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); @@ -324,7 +325,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: [], diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, }) ); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index ecbd1711dc52d..0ee12688b41cf 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -6,6 +6,7 @@ */ import expect from 'expect'; import { + ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -69,7 +70,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -110,7 +111,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -120,7 +121,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -155,7 +156,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -165,7 +166,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -205,7 +206,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -215,7 +216,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -267,7 +268,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -429,7 +430,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -474,7 +475,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -518,7 +519,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'five'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -527,7 +528,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); From 32c1fae68804c1e339b1d27e1cdbd5568b111a9a Mon Sep 17 00:00:00 2001 From: jpdjere Date: Tue, 9 Jul 2024 16:31:28 +0200 Subject: [PATCH 05/34] Replaced enum --- .../model/diff/three_way_diff/three_way_diff.ts | 6 +++--- .../calculation/algorithms/scalar_array_diff_algorithm.ts | 3 ++- .../diff/calculation/algorithms/simple_diff_algorithm.ts | 2 ++ .../logic/diff/calculation/calculate_rule_fields_diff.ts | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 13ca5b168b7c6..d75675a96eef6 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -20,9 +20,9 @@ export const MissingVersion = Symbol('MissingVersion'); export type MissingVersion = typeof MissingVersion; export enum ThreeWayDiffConflictResolutionResult { - NO, - SOLVABLE, - NON_SOLVABLE, + NO = 'NO', + SOLVABLE = 'SOLVABLE', + NON_SOLVABLE = 'NON_SOLVABLE', } /** diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index 6d31002eb9639..a2812b72c6791 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -54,7 +54,8 @@ export const scalarArrayDiffAlgorithm = ( merge_outcome: mergeOutcome, has_update: valueCanUpdate, conflict: - mergeOutcome === ThreeWayMergeOutcome.Conflict + // Scalar Arrays can only result in Merged outcomes on conflict + mergeOutcome === ThreeWayMergeOutcome.Merged ? ThreeWayDiffConflictResolutionResult.SOLVABLE : ThreeWayDiffConflictResolutionResult.NO, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index d396888ff9a8d..237eb08af02a8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -51,6 +51,8 @@ export const simpleDiffAlgorithm = ( merge_outcome: mergeOutcome, has_update: valueCanUpdate, conflict: + // Simple Diffs algos can only results in NON_SOLVABLE conflicts + // if the diff outcome is a conflict mergeOutcome === ThreeWayMergeOutcome.Conflict ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE : ThreeWayDiffConflictResolutionResult.NO, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts index cc27fe928b27c..fc83298fc6d72 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts @@ -42,6 +42,7 @@ import { scalarArrayDiffAlgorithm, simpleDiffAlgorithm, singleLineStringDiffAlgorithm, + scalarArrayDiffAlgorithm, } from './algorithms'; const BASE_TYPE_ERROR = `Base version can't be of different rule type`; From 3c5c858faf34e0130c2be339b9496f2856eae6e2 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 10 Jul 2024 14:02:23 +0200 Subject: [PATCH 06/34] Fix tests --- .../algorithms/scalar_array_diff_algorithm.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index ca320da938f29..3a8c297802659 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -106,7 +106,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, }) ); }); @@ -247,7 +247,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, }) ); }); From 4254782eb75a054ea5ed556a1b1e191ea0bc2bce Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 12 Jul 2024 17:17:12 +0200 Subject: [PATCH 07/34] Added stats --- .../model/diff/rule_diff/rule_diff.ts | 11 +++-- .../review_rule_upgrade_route.ts | 6 +++ .../review_rule_upgrade_route.ts | 12 ++++-- .../logic/diff/calculate_rule_diff.ts | 43 +++++++++++++++---- .../calculation/calculate_rule_fields_diff.ts | 1 - ...ade_review_prebuilt_rules.number_fields.ts | 25 +++++------ ...view_prebuilt_rules.scalar_array_fields.ts | 20 ++++----- ...rebuilt_rules.single_line_string_fields.ts | 25 +++++------ 8 files changed, 92 insertions(+), 51 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index 3720395de7a7b..a343560fff1d1 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -63,8 +63,10 @@ export type RuleFieldsDiff = CommonFieldsDiff & export interface FullRuleDiff { fields: RuleFieldsDiff; has_conflict: boolean; - number_fields_with_updates: number; - number_fields_with_conflicts: number; + has_non_solvable_conflict: boolean; + num_fields_with_updates: number; + num_fields_with_conflicts: number; + num_fields_with_non_solvable_conflicts: number; } /** @@ -74,8 +76,9 @@ export interface FullRuleDiff { export interface PartialRuleDiff { fields: Partial; has_conflict: boolean; - number_fields_with_updates: number; - number_fields_with_conflicts: number; + num_fields_with_updates: number; + num_fields_with_conflicts: number; + num_fields_with_non_solvable_conflicts: number; } export type RuleFieldsDiffWithDataSource = diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts index 09067a2e152e1..67f000a41711e 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/review_rule_upgrade/review_rule_upgrade_route.ts @@ -21,6 +21,12 @@ export interface RuleUpgradeStatsForReview { /** Number of installed prebuilt rules available for upgrade (stock + customized) */ num_rules_to_upgrade_total: number; + /** Number of installed prebuilt rules with upgrade conflicts (SOLVABLE or NON_SOLVALBE) */ + num_rules_with_conflicts: number; + + /** Number of installed prebuilt rules with NON_SOLVABLE upgrade conflicts */ + num_rules_with_non_solvable_conflicts: number; + /** A union of all tags of all rules available for upgrade */ tags: RuleTagArray; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index 0376c84882188..b80137d455be8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -92,6 +92,10 @@ const calculateRuleStats = (results: CalculateRuleDiffResult[]): RuleUpgradeStat ); return { + num_rules_with_conflicts: results.filter((result) => result.ruleDiff.has_conflict).length, + num_rules_with_non_solvable_conflicts: results.filter( + (result) => result.ruleDiff.has_non_solvable_conflict + ).length, num_rules_to_upgrade_total: results.length, tags: [...allTags].sort((a, b) => a.localeCompare(b)), }; @@ -116,6 +120,7 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo }; return { + test: 'adfadfadfadf', id: installedCurrentVersion.id, rule_id: installedCurrentVersion.rule_id, revision: installedCurrentVersion.revision, @@ -126,9 +131,10 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo ruleDiff.fields, (fieldDiff) => fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate ), - has_conflict: ruleDiff.has_conflict, - number_fields_with_conflicts: ruleDiff.number_fields_with_conflicts, - number_fields_with_updates: ruleDiff.number_fields_with_updates, + has_conflict: ruleDiff.num_fields_with_conflicts > 0, + num_fields_with_updates: ruleDiff.num_fields_with_updates, + num_fields_with_conflicts: ruleDiff.num_fields_with_conflicts, + num_fields_with_non_solvable_conflicts: ruleDiff.num_fields_with_non_solvable_conflicts, }, }; }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index 14dfd6047e932..36511eba03dbb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -8,7 +8,6 @@ import type { DiffableRule, FullRuleDiff, - ThreeWayDiff, } from '../../../../../../common/api/detection_engine/prebuilt_rules'; import { MissingVersion, @@ -78,19 +77,45 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = target_version: diffableTargetVersion, }); - const numberFieldsWithUpdates = Object.values>(fieldsDiff).filter( - (fieldDiff) => fieldDiff.has_update - ).length; - const numberFieldsWithConflicts = Object.values>(fieldsDiff).filter( - (fieldDiff) => fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO - ).length; + const { + numberFieldsWithUpdates, + numberFieldsWithConflicts, + numberFieldsWithNonSolvableConflicts, + } = Object.values(fieldsDiff).reduce<{ + numberFieldsWithUpdates: number; + numberFieldsWithConflicts: number; + numberFieldsWithNonSolvableConflicts: number; + }>( + (counts, fieldDiff) => { + if (fieldDiff.has_update) { + counts.numberFieldsWithUpdates += 1; + } + + if (fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO) { + counts.numberFieldsWithConflicts += 1; + + if (fieldDiff.conflict === ThreeWayDiffConflictResolutionResult.NON_SOLVABLE) { + counts.numberFieldsWithNonSolvableConflicts += 1; + } + } + + return counts; + }, + { + numberFieldsWithUpdates: 0, + numberFieldsWithConflicts: 0, + numberFieldsWithNonSolvableConflicts: 0, + } + ); return { ruleDiff: { fields: fieldsDiff, has_conflict: numberFieldsWithConflicts > 0, - number_fields_with_updates: numberFieldsWithUpdates, - number_fields_with_conflicts: numberFieldsWithConflicts, + has_non_solvable_conflict: numberFieldsWithNonSolvableConflicts > 0, + num_fields_with_updates: numberFieldsWithUpdates, + num_fields_with_conflicts: numberFieldsWithConflicts, + num_fields_with_non_solvable_conflicts: numberFieldsWithNonSolvableConflicts, }, ruleVersions: { input: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts index fc83298fc6d72..cc27fe928b27c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts @@ -42,7 +42,6 @@ import { scalarArrayDiffAlgorithm, simpleDiffAlgorithm, singleLineStringDiffAlgorithm, - scalarArrayDiffAlgorithm, } from './algorithms'; const BASE_TYPE_ERROR = `Base version can't be of different rule type`; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index 79d29a29c0cd3..d16717213704f 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -6,6 +6,7 @@ */ import expect from 'expect'; import { + ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -65,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -106,7 +107,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -116,7 +117,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -151,7 +152,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -161,7 +162,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -201,7 +202,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -211,7 +212,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -253,7 +254,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - has_conflict: true, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, has_update: true, }, version: { @@ -263,7 +264,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -308,7 +309,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -352,7 +353,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 3, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -361,7 +362,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 0ee12688b41cf..9e1e1fc05d26f 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -258,7 +258,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four', 'five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, has_update: true, }, version: { @@ -314,7 +314,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'three'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, has_update: true, }, version: { @@ -324,11 +324,11 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); }); @@ -370,7 +370,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['ONE', 'one', 'THREE'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, has_update: true, }, version: { @@ -380,11 +380,11 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); }); @@ -420,7 +420,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, has_update: true, }, version: { @@ -434,7 +434,7 @@ export default ({ getService }: FtrProviderContext): void => { has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); }); }); @@ -479,7 +479,7 @@ export default ({ getService }: FtrProviderContext): void => { has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index f814d6725885a..10bc9818236d6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -6,6 +6,7 @@ */ import expect from 'expect'; import { + ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -65,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -106,7 +107,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -116,7 +117,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -151,7 +152,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -161,7 +162,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -201,7 +202,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: false, }, version: { @@ -211,7 +212,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -253,7 +254,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - has_conflict: true, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, has_update: true, }, version: { @@ -263,7 +264,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -308,7 +309,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); @@ -352,7 +353,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'C', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, version: { @@ -361,7 +362,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO, has_update: true, }, }); From 60e9bceb85922402e0171a50fc9f357eb461bd7e Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 12 Jul 2024 17:48:49 +0200 Subject: [PATCH 08/34] Extend tests --- .../model/diff/rule_diff/rule_diff.ts | 1 + .../review_rule_upgrade_route.ts | 4 +- ...ade_review_prebuilt_rules.number_fields.ts | 49 +++++++++++++ ...view_prebuilt_rules.scalar_array_fields.ts | 73 ++++++++++++++++++- ...rebuilt_rules.single_line_string_fields.ts | 49 +++++++++++++ 5 files changed, 171 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index a343560fff1d1..7318d33642241 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -76,6 +76,7 @@ export interface FullRuleDiff { export interface PartialRuleDiff { fields: Partial; has_conflict: boolean; + has_non_solvable_conflict: boolean; num_fields_with_updates: number; num_fields_with_conflicts: number; num_fields_with_non_solvable_conflicts: number; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index b80137d455be8..f02a501f119e5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -120,7 +120,6 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo }; return { - test: 'adfadfadfadf', id: installedCurrentVersion.id, rule_id: installedCurrentVersion.rule_id, revision: installedCurrentVersion.revision, @@ -131,7 +130,8 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo ruleDiff.fields, (fieldDiff) => fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate ), - has_conflict: ruleDiff.num_fields_with_conflicts > 0, + has_conflict: ruleDiff.has_conflict, + has_non_solvable_conflict: ruleDiff.has_non_solvable_conflict, num_fields_with_updates: ruleDiff.num_fields_with_updates, num_fields_with_conflicts: ruleDiff.num_fields_with_conflicts, num_fields_with_non_solvable_conflicts: ruleDiff.num_fields_with_non_solvable_conflicts, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index d16717213704f..de87435c491b8 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -71,7 +71,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -122,7 +129,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -167,7 +181,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); describe('when rule field has an update and a custom value that are the same - scenario ABB', () => { @@ -217,7 +238,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -269,7 +297,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(1); }); }); @@ -314,7 +349,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -367,7 +409,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 9e1e1fc05d26f..e7e997e143af9 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -75,7 +75,11 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -126,7 +130,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -171,7 +182,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); describe('when rule field has an update and a custom value that are the same - scenario ABB', () => { @@ -221,7 +239,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -272,8 +297,15 @@ export default ({ getService }: FtrProviderContext): void => { has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); it('should compare values after deduplication', async () => { @@ -329,7 +361,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); it('should compare values sensitive of case', async () => { @@ -385,7 +424,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); it('should handle empty arrays', async () => { @@ -435,7 +481,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -479,8 +532,15 @@ export default ({ getService }: FtrProviderContext): void => { has_update: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -533,7 +593,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index 10bc9818236d6..ade51bb7f9e12 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -71,7 +71,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -122,7 +129,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -167,7 +181,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); describe('when rule field has an update and a custom value that are the same - scenario ABB', () => { @@ -217,7 +238,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -269,7 +297,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(true); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(1); }); }); @@ -314,7 +349,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -367,7 +409,14 @@ export default ({ getService }: FtrProviderContext): void => { }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); }); From 8ae098aa835beb158bab581eb2f648aa72aab24a Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 12 Jul 2024 17:50:26 +0200 Subject: [PATCH 09/34] fix type --- .../rule_details/per_field_rule_diff_tab.test.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index c74a5922eba59..01037c6d069f3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -35,8 +35,10 @@ const ruleFieldsDiffMock: PartialRuleDiff = { }, }, has_conflict: false, - number_fields_with_updates: 1, - number_fields_with_conflicts: 0, + has_non_solvable_conflict: false, + num_fields_with_updates: 1, + num_fields_with_conflicts: 0, + num_fields_with_non_solvable_conflicts: 0, }; const renderPerFieldRuleDiffTab = (ruleDiff: PartialRuleDiff) => { From 807a6c7ec6b31db2bb8b576dca9b23b30c99a481 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 17 Jul 2024 11:36:21 +0200 Subject: [PATCH 10/34] Add upgrade review endpoint stats integration tests --- .../scripts/run_integration_tests.sh | 77 ++++++++++ .../trial_license_complete_tier/index.ts | 1 + .../upgrade_review_prebuilt_rules.stats.ts | 131 ++++++++++++++++++ 3 files changed, 209 insertions(+) create mode 100755 x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts diff --git a/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh b/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh new file mode 100755 index 0000000000000..9fa6852c0be9e --- /dev/null +++ b/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# Function to determine the config file +get_config_file() { + local test_path=$1 + local dir=$(dirname "$test_path") + while [[ "$dir" != "/" ]]; do + if [[ -f "$dir/configs/ess.config.ts" ]]; then + echo "$dir/configs/ess.config.ts" + return + elif [[ -f "$dir/configs/serverless.config.ts" ]]; then + echo "$dir/configs/serverless.config.ts" + return + fi + dir=$(dirname "$dir") + done + echo "Error: No config file found" >&2 + exit 1 +} + +# Check if a test file path is provided +if [ $# -eq 0 ]; then + echo "Please provide the path to the test file." + exit 1 +fi + +TEST_FILE=$1 +CONFIG_FILE=$(get_config_file "$TEST_FILE") + +if [ $? -ne 0 ]; then + echo "$CONFIG_FILE" + exit 1 +fi + +# Determine the project root (where the 'scripts' folder is located) +PROJECT_ROOT=$(pwd) +while [[ ! -d "$PROJECT_ROOT/scripts" && "$PROJECT_ROOT" != "/" ]]; do + PROJECT_ROOT=$(dirname "$PROJECT_ROOT") +done + +if [[ "$PROJECT_ROOT" == "/" ]]; then + echo "Error: Could not find the project root directory containing the 'scripts' folder." + exit 1 +fi + +# Start the server +echo "Starting the server..." +node "$PROJECT_ROOT/scripts/functional_tests_server" --config "$CONFIG_FILE" & +SERVER_PID=$! + +# Function to kill the server process +cleanup() { + echo "Stopping the server..." + kill $SERVER_PID + exit +} + +# Set up trap to ensure server is stopped on script exit +trap cleanup EXIT + +# Wait for the server to be ready +echo "Waiting for the server to be ready..." +while true; do + if grep -q "Elasticsearch and Kibana are ready for functional testing" <(tail -n 1 -f /dev/null & PID=$! && sleep 10 && kill $PID); then + echo "Server is ready. Starting tests..." + break + fi + sleep 5 +done + +# Run the tests +echo "Running tests..." +node "$PROJECT_ROOT/scripts/functional_test_runner" --config "$CONFIG_FILE" --include "$TEST_FILE" + +# Wait for user input before exiting (which will trigger cleanup) +echo "Tests completed. Press Enter to exit and stop the server." +read \ No newline at end of file diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts index 31c7cdd30374f..995fd61745134 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts @@ -19,5 +19,6 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.number_fields')); loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.single_line_string_fields')); loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.scalar_array_fields')); + loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.stats')); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts new file mode 100644 index 0000000000000..f194bf9c91863 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from 'expect'; +import { FtrProviderContext } from '../../../../../../ftr_provider_context'; +import { + deleteAllTimelines, + deleteAllPrebuiltRuleAssets, + createRuleAssetSavedObject, + installPrebuiltRules, + // createPrebuiltRuleAssetSavedObjects, + reviewPrebuiltRulesToUpgrade, + // patchRule, + createHistoricalPrebuiltRuleAssetSavedObjects, + patchRule, +} from '../../../../utils'; +import { deleteAllRules } from '../../../../../../../common/utils/security_solution'; + +export default ({ getService }: FtrProviderContext): void => { + const es = getService('es'); + const supertest = getService('supertest'); + const log = getService('log'); + + describe('@ess @serverless @skipInServerlessMKI review prebuilt rules updates', () => { + beforeEach(async () => { + await deleteAllRules(supertest, log); + await deleteAllTimelines(es, log); + await deleteAllPrebuiltRuleAssets(es, log); + }); + + describe(`@ess @serverless the endpoint stats -`, () => { + const getRuleAssetSavedObjects = () => [ + createRuleAssetSavedObject({ rule_id: 'rule-1', version: 1, name: 'A' }), + createRuleAssetSavedObject({ rule_id: 'rule-2', version: 1, name: 'A' }), + createRuleAssetSavedObject({ rule_id: 'rule-3', version: 1, name: 'A' }), + ]; + + it('should show how many rules have upgrades', async () => { + await createHistoricalPrebuiltRuleAssetSavedObjects(es, getRuleAssetSavedObjects()); + await installPrebuiltRules(es, supertest); + + const updatedRuleAssetSavedObjects = ['rule-1', 'rule-2', 'rule-3'].map((ruleId) => + createRuleAssetSavedObject({ + rule_id: ruleId, + name: 'A', + version: 2, + }) + ); + + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(3); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + + it('should show how many rules have updates with conflicts', async () => { + await createHistoricalPrebuiltRuleAssetSavedObjects(es, getRuleAssetSavedObjects()); + await installPrebuiltRules(es, supertest); + + // Customize a scalar array field on the installed rules to generate a solvable conflict + for (const ruleId of ['rule-1', 'rule-2', 'rule-3']) { + await patchRule(supertest, log, { + rule_id: ruleId, + tags: ['one', 'two', 'four'], + }); + } + + const updatedRuleAssetSavedObjects = ['rule-1', 'rule-2', 'rule-3'].map((ruleId) => + createRuleAssetSavedObject({ + rule_id: ruleId, + name: 'A', + version: 2, + tags: ['one', 'two', 'FOUR'], + }) + ); + + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(3); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(3); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + + it('should show how many rules have updates with non-solvable conflicts', async () => { + await createHistoricalPrebuiltRuleAssetSavedObjects(es, getRuleAssetSavedObjects()); + await installPrebuiltRules(es, supertest); + + // Customize a scalar array field on the installed rules to generate a solvable conflict + for (const ruleId of ['rule-1', 'rule-2', 'rule-3']) { + await patchRule(supertest, log, { + rule_id: ruleId, + tags: ['one', 'two', 'four'], + }); + } + + // Customize a single-line field on two installed rules to generate a non-solvable conflict + for (const ruleId of ['rule-2', 'rule-3']) { + await patchRule(supertest, log, { + rule_id: ruleId, + name: 'B', + }); + } + + const updatedRuleAssetSavedObjects = ['rule-1', 'rule-2', 'rule-3'].map((ruleId) => + createRuleAssetSavedObject({ + rule_id: ruleId, + name: 'C', + version: 2, + tags: ['one', 'two', 'FOUR'], + }) + ); + + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(3); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(3); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(2); + }); + }); + }); +}; From 64a1b269a83a459f6df3dc0b2ca3bc250019bd1d Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 17 Jul 2024 11:37:20 +0200 Subject: [PATCH 11/34] Test name --- .../upgrade_review_prebuilt_rules.stats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts index f194bf9c91863..74010578da9f3 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.stats.ts @@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext): void => { await deleteAllPrebuiltRuleAssets(es, log); }); - describe(`@ess @serverless the endpoint stats -`, () => { + describe(`the endpoint stats -`, () => { const getRuleAssetSavedObjects = () => [ createRuleAssetSavedObject({ rule_id: 'rule-1', version: 1, name: 'A' }), createRuleAssetSavedObject({ rule_id: 'rule-2', version: 1, name: 'A' }), From 28354dfd8ea4c78519c865f1148d8bf58f911384 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 17 Jul 2024 11:46:18 +0200 Subject: [PATCH 12/34] Updated ENUM --- .../diff/three_way_diff/three_way_diff.ts | 6 ++-- .../per_field_rule_diff_tab.test.tsx | 2 +- .../logic/diff/calculate_rule_diff.ts | 4 +-- .../algorithms/number_diff_algorithm.test.ts | 14 ++++---- .../scalar_array_diff_algorithm.test.ts | 32 ++++++++--------- .../algorithms/scalar_array_diff_algorithm.ts | 4 +-- .../algorithms/simple_diff_algorithm.ts | 4 +-- .../single_line_string_diff_algorithm.test.ts | 14 ++++---- ...ade_review_prebuilt_rules.number_fields.ts | 24 ++++++------- ...view_prebuilt_rules.scalar_array_fields.ts | 36 +++++++++---------- ...rebuilt_rules.single_line_string_fields.ts | 24 ++++++------- 11 files changed, 82 insertions(+), 82 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index d75675a96eef6..e48499242157a 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -20,9 +20,9 @@ export const MissingVersion = Symbol('MissingVersion'); export type MissingVersion = typeof MissingVersion; export enum ThreeWayDiffConflictResolutionResult { - NO = 'NO', - SOLVABLE = 'SOLVABLE', - NON_SOLVABLE = 'NON_SOLVABLE', + NO_CONFLICT = 'NO_CONFLICT', + SOLVABLE_CONFLICT = 'SOLVABLE_CONFLICT', + NON_SOLVABLE_CONFLICT = 'NON_SOLVABLE_CONFLICT', } /** diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 01037c6d069f3..39032ea1ec98c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -19,7 +19,7 @@ import { PerFieldRuleDiffTab } from './per_field_rule_diff_tab'; const ruleFieldsDiffBaseFieldsMock = { diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, merge_outcome: ThreeWayMergeOutcome.Target, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index 36511eba03dbb..6f5ce5090fd58 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -91,10 +91,10 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = counts.numberFieldsWithUpdates += 1; } - if (fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO) { + if (fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO_CONFLICT) { counts.numberFieldsWithConflicts += 1; - if (fieldDiff.conflict === ThreeWayDiffConflictResolutionResult.NON_SOLVABLE) { + if (fieldDiff.conflict === ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT) { counts.numberFieldsWithNonSolvableConflicts += 1; } } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index 7ec0d7af57210..d301f46f7f4bb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -29,7 +29,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -48,7 +48,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -67,7 +67,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -86,7 +86,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -105,7 +105,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, }) ); }); @@ -125,7 +125,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -144,7 +144,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index 3a8c297802659..7784e3e2d2b83 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -29,7 +29,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -48,7 +48,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -67,7 +67,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -86,7 +86,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -106,7 +106,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, }) ); }); @@ -126,7 +126,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -145,7 +145,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -166,7 +166,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -187,7 +187,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -207,7 +207,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -227,7 +227,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -247,7 +247,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, }) ); }); @@ -268,7 +268,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -287,7 +287,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -306,7 +306,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -325,7 +325,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: [], diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index a2812b72c6791..fb1f3ca4fb2c7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -56,8 +56,8 @@ export const scalarArrayDiffAlgorithm = ( conflict: // Scalar Arrays can only result in Merged outcomes on conflict mergeOutcome === ThreeWayMergeOutcome.Merged - ? ThreeWayDiffConflictResolutionResult.SOLVABLE - : ThreeWayDiffConflictResolutionResult.NO, + ? ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT + : ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 237eb08af02a8..aa3456bebf1d8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -54,8 +54,8 @@ export const simpleDiffAlgorithm = ( // Simple Diffs algos can only results in NON_SOLVABLE conflicts // if the diff outcome is a conflict mergeOutcome === ThreeWayMergeOutcome.Conflict - ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE - : ThreeWayDiffConflictResolutionResult.NO, + ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT + : ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts index f067266e1c03e..eef0ace9eef3e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts @@ -29,7 +29,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -48,7 +48,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -67,7 +67,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -86,7 +86,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -105,7 +105,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, }) ); }); @@ -125,7 +125,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -144,7 +144,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index de87435c491b8..f0589e57a4a70 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -66,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -114,7 +114,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -124,7 +124,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -166,7 +166,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -176,7 +176,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -223,7 +223,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -233,7 +233,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -282,7 +282,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -292,7 +292,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -344,7 +344,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -395,7 +395,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 3, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -404,7 +404,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index e7e997e143af9..175655115c9cf 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -70,7 +70,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -115,7 +115,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -125,7 +125,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -167,7 +167,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -177,7 +177,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -224,7 +224,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -234,7 +234,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -283,7 +283,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four', 'five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -293,7 +293,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -346,7 +346,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'three'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -356,7 +356,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -409,7 +409,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['ONE', 'one', 'THREE'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -419,7 +419,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -466,7 +466,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -476,7 +476,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -528,7 +528,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -579,7 +579,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'five'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -588,7 +588,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index ade51bb7f9e12..7051144a12b56 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -66,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -114,7 +114,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -124,7 +124,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -166,7 +166,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -176,7 +176,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -223,7 +223,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, }, version: { @@ -233,7 +233,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -282,7 +282,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, has_update: true, }, version: { @@ -292,7 +292,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -344,7 +344,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); @@ -395,7 +395,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'C', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, version: { @@ -404,7 +404,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, }, }); From 36cb99e7ea06367745e6d9c35a1724cd35a9c681 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 17 Jul 2024 11:49:05 +0200 Subject: [PATCH 13/34] Updated comment --- .../model/diff/three_way_diff/three_way_diff.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index e48499242157a..ef0073dd7e5ed 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -114,9 +114,9 @@ export interface ThreeWayDiff extends ThreeVersionsOf { /** * Enum of possible conflict outcomes of a three-way diff: - * - NON_SOLVABLE: current != target and we couldn't automatically resolve the conflict between them - * - SOLVABLE: current != target and we automatically resolved the conflict between them - * - NO: + * - NON_SOLVABLE_CONFLICT: current != target and we couldn't automatically resolve the conflict between them + * - SOLVABLE_CONFLICT: current != target and we automatically resolved the conflict between them + * - NO_CONFLICT: * - current == target (value won't change) * - current != target && current == base (stock rule will get a new value) * From a5c1c99aa0aa31c0d95fcd3bc7884120e79d2a9d Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 09:30:15 +0200 Subject: [PATCH 14/34] Added logic change for multi-line string algo --- .../algorithms/multi_line_string_diff_algorithm.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index aa3b3c6b39f43..a78f92e7c50e2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -17,6 +17,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -50,7 +51,7 @@ export const multiLineStringDiffAlgorithm = ( diff_outcome: diffOutcome, merge_outcome: mergeOutcome, has_update: valueCanUpdate, - has_conflict: mergeOutcome === ThreeWayMergeOutcome.Conflict, + conflict: determineConflictType(mergeOutcome), }; }; @@ -112,3 +113,13 @@ const mergeVersions = ({ return assertUnreachable(diffOutcome); } }; + +const determineConflictType = (mergeOutcome: ThreeWayMergeOutcome) => { + if (mergeOutcome === ThreeWayMergeOutcome.Conflict) { + return ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT; + } + if (mergeOutcome === ThreeWayMergeOutcome.Merged) { + return ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT; + } + return ThreeWayDiffConflictResolutionResult.NO_CONFLICT; +}; From 68550a8490faf6803ce6134afa1c100ecb4d2e58 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 12:18:54 +0200 Subject: [PATCH 15/34] Add has_base_version prop --- .../model/diff/three_way_diff/three_way_diff.ts | 7 +++++++ .../algorithms/multi_line_string_diff_algorithm.ts | 1 + .../calculation/algorithms/scalar_array_diff_algorithm.ts | 1 + .../diff/calculation/algorithms/simple_diff_algorithm.ts | 2 ++ 4 files changed, 11 insertions(+) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index ef0073dd7e5ed..bbfb9b654aeda 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -104,6 +104,13 @@ export interface ThreeWayDiff extends ThreeVersionsOf { */ merge_outcome: ThreeWayMergeOutcome; + /** + * Bolean which determines if a base version was found and return for the three-way-diff for the field + * - true: the base version of the field was found and is either defined or undefined + * - false: the base version of the field was not found + */ + has_base_version: boolean; + /** * Tells if the value has changed in the target version and the current version could be updated. * True if: diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index a78f92e7c50e2..7f0b30b2f773f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -43,6 +43,7 @@ export const multiLineStringDiffAlgorithm = ( }); return { + has_base_version: baseVersion !== MissingVersion, base_version: baseVersion, current_version: currentVersion, target_version: targetVersion, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index fb1f3ca4fb2c7..eaf11093a9ab3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -45,6 +45,7 @@ export const scalarArrayDiffAlgorithm = ( }); return { + has_base_version: baseVersion !== MissingVersion, base_version: baseVersion, current_version: currentVersion, target_version: targetVersion, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index aa3456bebf1d8..2cab1b229f43f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -13,6 +13,7 @@ import type { import { determineDiffOutcome, determineIfValueCanUpdate, + MissingVersion, ThreeWayDiffConflictResolutionResult, ThreeWayDiffOutcome, ThreeWayMergeOutcome, @@ -42,6 +43,7 @@ export const simpleDiffAlgorithm = ( }); return { + has_base_version: baseVersion !== MissingVersion, base_version: baseVersion, current_version: currentVersion, target_version: targetVersion, From 8f78e699825a7a7e99dd9dce2abae2b43497215e Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 12:25:20 +0200 Subject: [PATCH 16/34] Tests for multi-line strings and missing version --- .../multi_line_string_diff_algorithm.test.ts | 21 ++++++++++++------- .../algorithms/number_diff_algorithm.test.ts | 4 ++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts index bd0459be914c7..0bd0f60fb9bb7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts @@ -10,6 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, + ThreeWayDiffConflictResolutionResult, } from '../../../../../../../../common/api/detection_engine'; import { multiLineStringDiffAlgorithm } from './multi_line_string_diff_algorithm'; @@ -28,7 +29,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -47,7 +48,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -66,7 +67,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -85,7 +86,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -107,7 +108,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, }) ); }); @@ -126,7 +127,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - has_conflict: true, + conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, }) ); }); @@ -144,10 +145,12 @@ describe('multiLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: MissingVersion, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); @@ -163,10 +166,12 @@ describe('multiLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: MissingVersion, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - has_conflict: false, + conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index d301f46f7f4bb..611d0c08b2d11 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -122,6 +122,8 @@ describe('numberDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: MissingVersion, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, @@ -141,6 +143,8 @@ describe('numberDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: MissingVersion, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, From dab9bd3c278d5ca568a3658f2ab211548cdddf47 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 14:46:31 +0200 Subject: [PATCH 17/34] Update integration tests --- ...rade_review_prebuilt_rules.number_fields.ts | 12 ++++++++++++ ...eview_prebuilt_rules.scalar_array_fields.ts | 18 ++++++++++++++++++ ...prebuilt_rules.single_line_string_fields.ts | 13 +++++++++++++ 3 files changed, 43 insertions(+) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index f0589e57a4a70..d6d5c959309d4 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -68,6 +68,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -116,6 +117,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -126,6 +128,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -168,6 +171,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -178,6 +182,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -225,6 +230,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -235,6 +241,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -284,6 +291,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -294,6 +302,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -346,6 +355,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -397,6 +407,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, version: { current_version: 1, @@ -406,6 +417,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 175655115c9cf..e12705d306c4b 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -72,6 +72,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -117,6 +118,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -127,6 +129,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -169,6 +172,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -179,6 +183,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -226,6 +231,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -236,6 +242,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -285,6 +292,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -295,6 +303,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -348,6 +357,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -358,6 +368,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -411,6 +422,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -421,6 +433,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -468,6 +481,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -478,6 +492,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -530,6 +545,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -581,6 +597,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, version: { current_version: 1, @@ -590,6 +607,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index 7051144a12b56..b810ad8f636e1 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -68,6 +68,8 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -116,6 +118,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -126,6 +129,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -168,6 +172,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -178,6 +183,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -225,6 +231,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: false, + has_base_version: true, }, version: { base_version: 1, @@ -235,6 +242,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -284,6 +292,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, has_update: true, + has_base_version: true, }, version: { base_version: 1, @@ -294,6 +303,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: true, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); @@ -346,6 +356,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); @@ -397,6 +408,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, version: { current_version: 1, @@ -406,6 +418,7 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, + has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); From 716b222ffa2a24f2695c551cb638bb897ca69d69 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 15:08:24 +0200 Subject: [PATCH 18/34] Lint --- .../upgrade_review_prebuilt_rules.single_line_string_fields.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index b810ad8f636e1..c63ba8d1c7b46 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -68,7 +68,6 @@ export default ({ getService }: FtrProviderContext): void => { merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, - has_base_version: true, }, }); From dd10c90515dbdda97f2e5bbcb5bdb59bd35e7ba4 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 15:23:17 +0200 Subject: [PATCH 19/34] Update comment --- .../prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index bbfb9b654aeda..857edc2c5754d 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -105,7 +105,7 @@ export interface ThreeWayDiff extends ThreeVersionsOf { merge_outcome: ThreeWayMergeOutcome; /** - * Bolean which determines if a base version was found and return for the three-way-diff for the field + * Boolean which determines if a base version was found and returned for the three-way-diff of the field * - true: the base version of the field was found and is either defined or undefined * - false: the base version of the field was not found */ From 2c8741b31c328ba1607326cc047adf2b452aceed Mon Sep 17 00:00:00 2001 From: jpdjere Date: Fri, 19 Jul 2024 16:13:28 +0200 Subject: [PATCH 20/34] Remove file --- .../scripts/run_integration_tests.sh | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100755 x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh diff --git a/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh b/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh deleted file mode 100755 index 9fa6852c0be9e..0000000000000 --- a/x-pack/test/security_solution_api_integration/scripts/run_integration_tests.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -# Function to determine the config file -get_config_file() { - local test_path=$1 - local dir=$(dirname "$test_path") - while [[ "$dir" != "/" ]]; do - if [[ -f "$dir/configs/ess.config.ts" ]]; then - echo "$dir/configs/ess.config.ts" - return - elif [[ -f "$dir/configs/serverless.config.ts" ]]; then - echo "$dir/configs/serverless.config.ts" - return - fi - dir=$(dirname "$dir") - done - echo "Error: No config file found" >&2 - exit 1 -} - -# Check if a test file path is provided -if [ $# -eq 0 ]; then - echo "Please provide the path to the test file." - exit 1 -fi - -TEST_FILE=$1 -CONFIG_FILE=$(get_config_file "$TEST_FILE") - -if [ $? -ne 0 ]; then - echo "$CONFIG_FILE" - exit 1 -fi - -# Determine the project root (where the 'scripts' folder is located) -PROJECT_ROOT=$(pwd) -while [[ ! -d "$PROJECT_ROOT/scripts" && "$PROJECT_ROOT" != "/" ]]; do - PROJECT_ROOT=$(dirname "$PROJECT_ROOT") -done - -if [[ "$PROJECT_ROOT" == "/" ]]; then - echo "Error: Could not find the project root directory containing the 'scripts' folder." - exit 1 -fi - -# Start the server -echo "Starting the server..." -node "$PROJECT_ROOT/scripts/functional_tests_server" --config "$CONFIG_FILE" & -SERVER_PID=$! - -# Function to kill the server process -cleanup() { - echo "Stopping the server..." - kill $SERVER_PID - exit -} - -# Set up trap to ensure server is stopped on script exit -trap cleanup EXIT - -# Wait for the server to be ready -echo "Waiting for the server to be ready..." -while true; do - if grep -q "Elasticsearch and Kibana are ready for functional testing" <(tail -n 1 -f /dev/null & PID=$! && sleep 10 && kill $PID); then - echo "Server is ready. Starting tests..." - break - fi - sleep 5 -done - -# Run the tests -echo "Running tests..." -node "$PROJECT_ROOT/scripts/functional_test_runner" --config "$CONFIG_FILE" --include "$TEST_FILE" - -# Wait for user input before exiting (which will trigger cleanup) -echo "Tests completed. Press Enter to exit and stop the server." -read \ No newline at end of file From 6242ea32d637bf0599c420dfe33dc7168b964dde Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 12:14:15 +0200 Subject: [PATCH 21/34] Address feedback --- .../model/diff/rule_diff/rule_diff.ts | 19 +++---- .../diff/three_way_diff/three_way_diff.ts | 17 +----- .../three_way_diff/three_way_diff_conflict.ts | 21 +++++++ .../per_field_rule_diff_tab.test.tsx | 1 + .../logic/diff/calculate_rule_diff.ts | 55 ++++++++++--------- 5 files changed, 64 insertions(+), 49 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index 7318d33642241..9e2f463c83034 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -54,32 +54,31 @@ export type RuleFieldsDiff = CommonFieldsDiff & | NewTermsFieldsDiff ); +interface BaseRuleDiff { + has_conflict: boolean; + has_non_solvable_conflict: boolean; + num_fields_with_updates: number; + num_fields_with_conflicts: number; + num_fields_with_non_solvable_conflicts: number; +} /** * Full rule diff contains diffs for all the top-level rule fields. * Even if there's no change at all to a given field, its diff will be included in this object. * This diff can be useful for internal server-side calculations or debugging. * Note that this is a pretty large object so returning it from the API might be undesirable. */ -export interface FullRuleDiff { +export interface FullRuleDiff extends BaseRuleDiff { fields: RuleFieldsDiff; has_conflict: boolean; - has_non_solvable_conflict: boolean; - num_fields_with_updates: number; - num_fields_with_conflicts: number; - num_fields_with_non_solvable_conflicts: number; } /** * Partial rule diff contains diffs only for those rule fields that have some changes to them. * This diff can be useful for returning info from REST API endpoints because its size is tolerable. */ -export interface PartialRuleDiff { +export interface PartialRuleDiff extends BaseRuleDiff { fields: Partial; has_conflict: boolean; - has_non_solvable_conflict: boolean; - num_fields_with_updates: number; - num_fields_with_conflicts: number; - num_fields_with_non_solvable_conflicts: number; } export type RuleFieldsDiffWithDataSource = diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 857edc2c5754d..08d8180c7c324 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -7,6 +7,7 @@ import type { ThreeWayDiffOutcome } from './three_way_diff_outcome'; import type { ThreeWayMergeOutcome } from './three_way_merge_outcome'; +import type { ThreeWayDiffConflict } from './three_way_diff_conflict'; /** * A symbol that represents a missing value and used when a base version of a @@ -19,12 +20,6 @@ import type { ThreeWayMergeOutcome } from './three_way_merge_outcome'; export const MissingVersion = Symbol('MissingVersion'); export type MissingVersion = typeof MissingVersion; -export enum ThreeWayDiffConflictResolutionResult { - NO_CONFLICT = 'NO_CONFLICT', - SOLVABLE_CONFLICT = 'SOLVABLE_CONFLICT', - NON_SOLVABLE_CONFLICT = 'NON_SOLVABLE_CONFLICT', -} - /** * Three versions of a value to pass to a diff algorithm. */ @@ -120,15 +115,9 @@ export interface ThreeWayDiff extends ThreeVersionsOf { has_update: boolean; /** - * Enum of possible conflict outcomes of a three-way diff: - * - NON_SOLVABLE_CONFLICT: current != target and we couldn't automatically resolve the conflict between them - * - SOLVABLE_CONFLICT: current != target and we automatically resolved the conflict between them - * - NO_CONFLICT: - * - current == target (value won't change) - * - current != target && current == base (stock rule will get a new value) - * + * Enum of possible conflict outcomes of a three-way diff. */ - conflict: ThreeWayDiffConflictResolutionResult; + conflict: ThreeWayDiffConflict; } /** diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts new file mode 100644 index 0000000000000..755bbf85e2fe1 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Enum of possible conflict outcomes of a three-way diff: + * - NON_SOLVABLE_CONFLICT: current != target and we couldn't automatically resolve the conflict between them + * - SOLVABLE_CONFLICT: current != target and we automatically resolved the conflict between them + * - NO_CONFLICT: + * - current == target (value won't change) + * - current != target && current == base (stock rule will get a new value) + * + */ +export enum ThreeWayDiffConflict { + NONE = 'NONE', + SOLVABLE = 'SOLVABLE', + NON_SOLVABLE = 'NON_SOLVABLE', +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 39032ea1ec98c..f519010c8ce08 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -22,6 +22,7 @@ const ruleFieldsDiffBaseFieldsMock = { conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, has_update: true, merge_outcome: ThreeWayMergeOutcome.Target, + has_base_version: true, }; const ruleFieldsDiffMock: PartialRuleDiff = { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index 6f5ce5090fd58..e648e5d802d68 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -8,6 +8,8 @@ import type { DiffableRule, FullRuleDiff, + ThreeWayDiff, + RuleFieldsDiff, } from '../../../../../../common/api/detection_engine/prebuilt_rules'; import { MissingVersion, @@ -81,7 +83,34 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = numberFieldsWithUpdates, numberFieldsWithConflicts, numberFieldsWithNonSolvableConflicts, - } = Object.values(fieldsDiff).reduce<{ + } = getNumberOfFieldsByChangeType(fieldsDiff); + + return { + ruleDiff: { + fields: fieldsDiff, + has_conflict: numberFieldsWithConflicts > 0, + has_non_solvable_conflict: numberFieldsWithNonSolvableConflicts > 0, + num_fields_with_updates: numberFieldsWithUpdates, + num_fields_with_conflicts: numberFieldsWithConflicts, + num_fields_with_non_solvable_conflicts: numberFieldsWithNonSolvableConflicts, + }, + ruleVersions: { + input: { + current, + base, + target, + }, + output: { + current: diffableCurrentVersion, + base: diffableBaseVersion, + target: diffableTargetVersion, + }, + }, + }; +}; + +const getNumberOfFieldsByChangeType = (fieldsDiff: RuleFieldsDiff) => + Object.values>(fieldsDiff).reduce<{ numberFieldsWithUpdates: number; numberFieldsWithConflicts: number; numberFieldsWithNonSolvableConflicts: number; @@ -107,27 +136,3 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = numberFieldsWithNonSolvableConflicts: 0, } ); - - return { - ruleDiff: { - fields: fieldsDiff, - has_conflict: numberFieldsWithConflicts > 0, - has_non_solvable_conflict: numberFieldsWithNonSolvableConflicts > 0, - num_fields_with_updates: numberFieldsWithUpdates, - num_fields_with_conflicts: numberFieldsWithConflicts, - num_fields_with_non_solvable_conflicts: numberFieldsWithNonSolvableConflicts, - }, - ruleVersions: { - input: { - current, - base, - target, - }, - output: { - current: diffableCurrentVersion, - base: diffableBaseVersion, - target: diffableTargetVersion, - }, - }, - }; -}; From a9238399713e3ffebc3c8c6f955fc486b8a4814b Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 12:21:17 +0200 Subject: [PATCH 22/34] Replaced enum --- .../detection_engine/prebuilt_rules/index.ts | 1 + .../prebuilt_rules/model/index.ts | 1 + .../per_field_rule_diff_tab.test.tsx | 4 +- .../logic/diff/calculate_rule_diff.ts | 6 +-- .../multi_line_string_diff_algorithm.test.ts | 18 ++++----- .../multi_line_string_diff_algorithm.ts | 8 ++-- .../algorithms/number_diff_algorithm.test.ts | 16 ++++---- .../scalar_array_diff_algorithm.test.ts | 34 ++++++++--------- .../algorithms/scalar_array_diff_algorithm.ts | 6 +-- .../algorithms/simple_diff_algorithm.ts | 6 +-- .../single_line_string_diff_algorithm.test.ts | 16 ++++---- ...ade_review_prebuilt_rules.number_fields.ts | 26 ++++++------- ...view_prebuilt_rules.scalar_array_fields.ts | 38 +++++++++---------- ...rebuilt_rules.single_line_string_fields.ts | 26 ++++++------- 14 files changed, 104 insertions(+), 102 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts index 635dfdf45c1c4..08d91061f58e8 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts @@ -20,4 +20,5 @@ export * from './model/diff/rule_diff/fields_diff'; export * from './model/diff/rule_diff/rule_diff'; export * from './model/diff/three_way_diff/three_way_diff_outcome'; export * from './model/diff/three_way_diff/three_way_diff'; +export * from './model/diff/three_way_diff/three_way_diff_conflict'; export * from './model/diff/three_way_diff/three_way_merge_outcome'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts index 8abee3cbe83a6..2dac61022e6a8 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts @@ -12,4 +12,5 @@ export * from './diff/rule_diff/fields_diff'; export * from './diff/rule_diff/rule_diff'; export * from './diff/three_way_diff/three_way_diff_outcome'; export * from './diff/three_way_diff/three_way_diff'; +export * from './diff/three_way_diff/three_way_diff_conflict'; export * from './diff/three_way_diff/three_way_merge_outcome'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index f519010c8ce08..daa70c83e955f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -7,7 +7,7 @@ import { KqlQueryType, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '../../../../../common/api/detection_engine'; @@ -19,7 +19,7 @@ import { PerFieldRuleDiffTab } from './per_field_rule_diff_tab'; const ruleFieldsDiffBaseFieldsMock = { diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, merge_outcome: ThreeWayMergeOutcome.Target, has_base_version: true, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index e648e5d802d68..22ef8cf690b0a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -13,7 +13,7 @@ import type { } from '../../../../../../common/api/detection_engine/prebuilt_rules'; import { MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../common/api/detection_engine/prebuilt_rules'; import type { RuleResponse } from '../../../../../../common/api/detection_engine/model/rule_schema'; import { invariant } from '../../../../../../common/utils/invariant'; @@ -120,10 +120,10 @@ const getNumberOfFieldsByChangeType = (fieldsDiff: RuleFieldsDiff) => counts.numberFieldsWithUpdates += 1; } - if (fieldDiff.conflict !== ThreeWayDiffConflictResolutionResult.NO_CONFLICT) { + if (fieldDiff.conflict !== ThreeWayDiffConflict.NONE) { counts.numberFieldsWithConflicts += 1; - if (fieldDiff.conflict === ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT) { + if (fieldDiff.conflict === ThreeWayDiffConflict.NON_SOLVABLE) { counts.numberFieldsWithNonSolvableConflicts += 1; } } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts index 0bd0f60fb9bb7..f9770f4f70a99 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts @@ -10,7 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; import { multiLineStringDiffAlgorithm } from './multi_line_string_diff_algorithm'; @@ -29,7 +29,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -48,7 +48,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -67,7 +67,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -86,7 +86,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -108,7 +108,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); @@ -127,7 +127,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); }); @@ -150,7 +150,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -171,7 +171,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index 7f0b30b2f773f..9fa1d3b14400f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -17,7 +17,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -117,10 +117,10 @@ const mergeVersions = ({ const determineConflictType = (mergeOutcome: ThreeWayMergeOutcome) => { if (mergeOutcome === ThreeWayMergeOutcome.Conflict) { - return ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT; + return ThreeWayDiffConflict.NON_SOLVABLE; } if (mergeOutcome === ThreeWayMergeOutcome.Merged) { - return ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT; + return ThreeWayDiffConflict.SOLVABLE; } - return ThreeWayDiffConflictResolutionResult.NO_CONFLICT; + return ThreeWayDiffConflict.NONE; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index 611d0c08b2d11..af87cf59058fe 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -10,7 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; import { numberDiffAlgorithm } from './number_diff_algorithm'; @@ -29,7 +29,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -48,7 +48,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -67,7 +67,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -86,7 +86,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -105,7 +105,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); }); @@ -127,7 +127,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -148,7 +148,7 @@ describe('numberDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index 7784e3e2d2b83..ee9d684b94cae 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -10,7 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; import { scalarArrayDiffAlgorithm } from './scalar_array_diff_algorithm'; @@ -29,7 +29,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -48,7 +48,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -67,7 +67,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -86,7 +86,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -106,7 +106,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); @@ -126,7 +126,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -145,7 +145,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -166,7 +166,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -187,7 +187,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -207,7 +207,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -227,7 +227,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -247,7 +247,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); @@ -268,7 +268,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -287,7 +287,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -306,7 +306,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -325,7 +325,7 @@ describe('scalarArrayDiffAlgorithm', () => { merged_version: [], diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index eaf11093a9ab3..ea55743a63d81 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -17,7 +17,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -57,8 +57,8 @@ export const scalarArrayDiffAlgorithm = ( conflict: // Scalar Arrays can only result in Merged outcomes on conflict mergeOutcome === ThreeWayMergeOutcome.Merged - ? ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT - : ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + ? ThreeWayDiffConflict.SOLVABLE + : ThreeWayDiffConflict.NONE, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 2cab1b229f43f..e2c660eccea2d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -14,7 +14,7 @@ import { determineDiffOutcome, determineIfValueCanUpdate, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; @@ -56,8 +56,8 @@ export const simpleDiffAlgorithm = ( // Simple Diffs algos can only results in NON_SOLVABLE conflicts // if the diff outcome is a conflict mergeOutcome === ThreeWayMergeOutcome.Conflict - ? ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT - : ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + ? ThreeWayDiffConflict.NON_SOLVABLE + : ThreeWayDiffConflict.NONE, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts index eef0ace9eef3e..bb3aeb66a59db 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts @@ -10,7 +10,7 @@ import { ThreeWayDiffOutcome, ThreeWayMergeOutcome, MissingVersion, - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; import { singleLineStringDiffAlgorithm } from './single_line_string_diff_algorithm'; @@ -29,7 +29,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -48,7 +48,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -67,7 +67,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -86,7 +86,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -105,7 +105,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); }); @@ -125,7 +125,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); @@ -144,7 +144,7 @@ describe('singleLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, }) ); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index d6d5c959309d4..1f62a059df09f 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -6,7 +6,7 @@ */ import expect from 'expect'; import { - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -66,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -115,7 +115,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -126,7 +126,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -169,7 +169,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -180,7 +180,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -228,7 +228,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -239,7 +239,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -289,7 +289,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, has_update: true, has_base_version: true, }, @@ -300,7 +300,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -353,7 +353,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -405,7 +405,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 3, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -415,7 +415,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index e12705d306c4b..0f2ef9f3244a6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -6,7 +6,7 @@ */ import expect from 'expect'; import { - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -70,7 +70,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -116,7 +116,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -127,7 +127,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -170,7 +170,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -181,7 +181,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -229,7 +229,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -240,7 +240,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -290,7 +290,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'four', 'five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, }, @@ -301,7 +301,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -355,7 +355,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'three'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, }, @@ -366,7 +366,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -420,7 +420,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['ONE', 'one', 'THREE'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, }, @@ -431,7 +431,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -479,7 +479,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Merged, - conflict: ThreeWayDiffConflictResolutionResult.SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, }, @@ -490,7 +490,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -543,7 +543,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -595,7 +595,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: ['one', 'two', 'five'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -605,7 +605,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index c63ba8d1c7b46..2c6ea35f4c9b6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -6,7 +6,7 @@ */ import expect from 'expect'; import { - ThreeWayDiffConflictResolutionResult, + ThreeWayDiffConflict, ThreeWayDiffOutcome, ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; @@ -66,7 +66,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -115,7 +115,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -126,7 +126,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -169,7 +169,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -180,7 +180,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -228,7 +228,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, }, @@ -239,7 +239,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -289,7 +289,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Conflict, - conflict: ThreeWayDiffConflictResolutionResult.NON_SOLVABLE_CONFLICT, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, has_update: true, has_base_version: true, }, @@ -300,7 +300,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, }, @@ -353,7 +353,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -405,7 +405,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 'C', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, @@ -415,7 +415,7 @@ export default ({ getService }: FtrProviderContext): void => { merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflictResolutionResult.NO_CONFLICT, + conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: false, }, From a96ca38e8e8d6fca2725a990f2f0836eaba5765d Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 13:26:07 +0200 Subject: [PATCH 23/34] Removed redudant API response props --- .../model/diff/rule_diff/rule_diff.ts | 4 --- .../diff/three_way_diff/three_way_diff.ts | 22 +++++++++++- .../prebuilt_rules_customization.md | 2 +- .../per_field_rule_diff_tab.test.tsx | 2 -- .../review_rule_upgrade_route.ts | 35 +++++++++++++------ .../logic/diff/calculate_rule_diff.ts | 2 -- .../multi_line_string_diff_algorithm.ts | 5 +-- .../algorithms/scalar_array_diff_algorithm.ts | 5 +-- .../algorithms/simple_diff_algorithm.ts | 6 ++-- ...ade_review_prebuilt_rules.number_fields.ts | 14 -------- ...view_prebuilt_rules.scalar_array_fields.ts | 19 ---------- ...rebuilt_rules.single_line_string_fields.ts | 14 -------- 12 files changed, 57 insertions(+), 73 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts index 9e2f463c83034..8825413b4ceda 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/rule_diff.ts @@ -55,8 +55,6 @@ export type RuleFieldsDiff = CommonFieldsDiff & ); interface BaseRuleDiff { - has_conflict: boolean; - has_non_solvable_conflict: boolean; num_fields_with_updates: number; num_fields_with_conflicts: number; num_fields_with_non_solvable_conflicts: number; @@ -69,7 +67,6 @@ interface BaseRuleDiff { */ export interface FullRuleDiff extends BaseRuleDiff { fields: RuleFieldsDiff; - has_conflict: boolean; } /** @@ -78,7 +75,6 @@ export interface FullRuleDiff extends BaseRuleDiff { */ export interface PartialRuleDiff extends BaseRuleDiff { fields: Partial; - has_conflict: boolean; } export type RuleFieldsDiffWithDataSource = diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 08d8180c7c324..7c84047e15bf4 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -67,7 +67,27 @@ export interface ThreeVersionsOf { * 6. base=A, current=B, target=C => merged=C, conflict=true * Customized rule, the value has changed, conflict between B and C couldn't be resolved automatically. */ -export interface ThreeWayDiff extends ThreeVersionsOf { +export interface ThreeWayDiff { + /** + * Corresponds to the stock version of the currently installed prebuilt rule. + * This field is optional because the base version is not always available in the package. + * This type is part of the API response, so the type of this field is replaced from possibly + * a MissingVersion (a JS Symbol), which can't be serialized in JSON, to possibly `undefined`. + */ + base_version: TValue | undefined; + + /** + * Corresponds exactly to the currently installed prebuilt rule: + * - to the customized version (if it's customized) + * - to the stock version (if it's not customized) + */ + current_version: TValue; + + /** + * Corresponds to the "new" stock version that the user is trying to upgrade to. + */ + target_version: TValue; + /** * The result of an automatic three-way merge of three values: * - base version diff --git a/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md index 97f7be2b8cd69..5b261f20a47c9 100644 --- a/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md +++ b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md @@ -2767,7 +2767,7 @@ const reviewUpgradeResponse: ReviewRuleUpgradeResponseBody = await fetch( const performUpgradePayload = { mode: 'SPECIFIC_RULES', rules: reviewUpgradeResponse.rules - .filter((rule) => !rule.diff.has_conflict) + .filter((rule) => rule.diff.num_fields_with_conflicts === 0) .map((rule) => ({ rule_id: rule.rule_id, revision: rule.revision, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index daa70c83e955f..c099459fea224 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -35,8 +35,6 @@ const ruleFieldsDiffMock: PartialRuleDiff = { target_version: 2, }, }, - has_conflict: false, - has_non_solvable_conflict: false, num_fields_with_updates: 1, num_fields_with_conflicts: 0, num_fields_with_non_solvable_conflicts: 0, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index f02a501f119e5..fee95c91cebed 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -87,17 +87,34 @@ export const reviewRuleUpgradeRoute = (router: SecuritySolutionPluginRouter) => }; const calculateRuleStats = (results: CalculateRuleDiffResult[]): RuleUpgradeStatsForReview => { - const allTags = new Set( - results.flatMap((result) => result.ruleVersions.input.current?.tags ?? []) + const allTags = new Set(); + + const stats = results.reduce( + (acc, result) => { + acc.num_rules_to_upgrade_total += 1; + + if (result.ruleDiff.num_fields_with_conflicts > 0) { + acc.num_rules_with_conflicts += 1; + } + + if (result.ruleDiff.num_fields_with_non_solvable_conflicts > 0) { + acc.num_rules_with_non_solvable_conflicts += 1; + } + + result.ruleVersions.input.current?.tags.forEach((tag) => allTags.add(tag)); + + return acc; + }, + { + num_rules_to_upgrade_total: 0, + num_rules_with_conflicts: 0, + num_rules_with_non_solvable_conflicts: 0, + } ); return { - num_rules_with_conflicts: results.filter((result) => result.ruleDiff.has_conflict).length, - num_rules_with_non_solvable_conflicts: results.filter( - (result) => result.ruleDiff.has_non_solvable_conflict - ).length, - num_rules_to_upgrade_total: results.length, - tags: [...allTags].sort((a, b) => a.localeCompare(b)), + ...stats, + tags: Array.from(allTags), }; }; @@ -130,8 +147,6 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo ruleDiff.fields, (fieldDiff) => fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate ), - has_conflict: ruleDiff.has_conflict, - has_non_solvable_conflict: ruleDiff.has_non_solvable_conflict, num_fields_with_updates: ruleDiff.num_fields_with_updates, num_fields_with_conflicts: ruleDiff.num_fields_with_conflicts, num_fields_with_non_solvable_conflicts: ruleDiff.num_fields_with_non_solvable_conflicts, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts index 22ef8cf690b0a..568c6591a724d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculate_rule_diff.ts @@ -88,8 +88,6 @@ export const calculateRuleDiff = (args: RuleVersions): CalculateRuleDiffResult = return { ruleDiff: { fields: fieldsDiff, - has_conflict: numberFieldsWithConflicts > 0, - has_non_solvable_conflict: numberFieldsWithNonSolvableConflicts > 0, num_fields_with_updates: numberFieldsWithUpdates, num_fields_with_conflicts: numberFieldsWithConflicts, num_fields_with_non_solvable_conflicts: numberFieldsWithNonSolvableConflicts, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index 9fa1d3b14400f..040ba93d8145f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -41,10 +41,11 @@ export const multiLineStringDiffAlgorithm = ( targetVersion, diffOutcome, }); + const hasBaseVersion = baseVersion !== MissingVersion; return { - has_base_version: baseVersion !== MissingVersion, - base_version: baseVersion, + has_base_version: hasBaseVersion, + base_version: hasBaseVersion ? baseVersion : undefined, current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index ea55743a63d81..f2a984dca8826 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -43,10 +43,11 @@ export const scalarArrayDiffAlgorithm = ( targetVersion, diffOutcome, }); + const hasBaseVersion = baseVersion !== MissingVersion; return { - has_base_version: baseVersion !== MissingVersion, - base_version: baseVersion, + has_base_version: hasBaseVersion, + base_version: hasBaseVersion ? baseVersion : undefined, current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index e2c660eccea2d..2dd47a7364104 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -42,9 +42,11 @@ export const simpleDiffAlgorithm = ( diffOutcome, }); + const hasBaseVersion = baseVersion !== MissingVersion; + return { - has_base_version: baseVersion !== MissingVersion, - base_version: baseVersion, + has_base_version: hasBaseVersion, + base_version: hasBaseVersion ? baseVersion : undefined, current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index 1f62a059df09f..4bc14f7fba945 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -71,8 +71,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -131,8 +129,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -185,8 +181,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -244,8 +238,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -305,8 +297,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(true); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); @@ -358,8 +348,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -420,8 +408,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 0f2ef9f3244a6..5e44c68cb7f2c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -75,7 +75,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -132,8 +131,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -186,8 +183,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -245,8 +240,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -306,8 +299,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -371,8 +362,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -436,8 +425,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -495,8 +482,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -548,8 +533,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -610,8 +593,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index 2c6ea35f4c9b6..c69dd0e535f87 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -71,8 +71,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -131,8 +129,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -185,8 +181,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -244,8 +238,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -305,8 +297,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: true, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(true); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(true); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); @@ -358,8 +348,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -420,8 +408,6 @@ export default ({ getService }: FtrProviderContext): void => { has_base_version: false, }, }); - expect(reviewResponse.rules[0].diff.has_conflict).toBe(false); - expect(reviewResponse.rules[0].diff.has_non_solvable_conflict).toBe(false); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); From e1d3311a2b1e74e6f0463633b743a528b76b8d15 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 16:30:00 +0200 Subject: [PATCH 24/34] Handled missing base version scenarios --- .../detection_engine/prebuilt_rules/index.ts | 1 - .../diff/three_way_diff/three_way_diff.ts | 9 --- .../three_way_diff/three_way_merge_outcome.ts | 26 -------- .../multi_line_string_diff_algorithm.test.ts | 15 +---- .../multi_line_string_diff_algorithm.ts | 63 ++++++++++--------- .../algorithms/number_diff_algorithm.test.ts | 14 +---- .../scalar_array_diff_algorithm.test.ts | 23 ++----- .../algorithms/scalar_array_diff_algorithm.ts | 61 +++++++++--------- .../algorithms/simple_diff_algorithm.ts | 47 ++++++++------ .../single_line_string_diff_algorithm.test.ts | 14 ++--- 10 files changed, 108 insertions(+), 165 deletions(-) delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts index 08d91061f58e8..86956c001843e 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts @@ -21,4 +21,3 @@ export * from './model/diff/rule_diff/rule_diff'; export * from './model/diff/three_way_diff/three_way_diff_outcome'; export * from './model/diff/three_way_diff/three_way_diff'; export * from './model/diff/three_way_diff/three_way_diff_conflict'; -export * from './model/diff/three_way_diff/three_way_merge_outcome'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 7c84047e15bf4..2fcb86d780f02 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -6,7 +6,6 @@ */ import type { ThreeWayDiffOutcome } from './three_way_diff_outcome'; -import type { ThreeWayMergeOutcome } from './three_way_merge_outcome'; import type { ThreeWayDiffConflict } from './three_way_diff_conflict'; /** @@ -111,14 +110,6 @@ export interface ThreeWayDiff { */ diff_outcome: ThreeWayDiffOutcome; - /** - * The type of result of an automatic three-way merge of three values: - * - base version - * - current version - * - target version - */ - merge_outcome: ThreeWayMergeOutcome; - /** * Boolean which determines if a base version was found and returned for the three-way-diff of the field * - true: the base version of the field was found and is either defined or undefined diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts deleted file mode 100644 index 5c2caea0130dd..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/** - * Type of result of an automatic three-way merge of three values: - * - base version - * - current version - * - target version - */ -export enum ThreeWayMergeOutcome { - /** Took current version and returned as the merged one. */ - Current = 'CURRENT', - - /** Took target version and returned as the merged one. */ - Target = 'TARGET', - - /** Merged three versions successfully into a new one. */ - Merged = 'MERGED', - - /** Couldn't merge three versions because of a conflict. */ - Conflict = 'CONFLICT', -} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts index f9770f4f70a99..cc9c73d5c9a1a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts @@ -8,7 +8,6 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -28,7 +27,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -47,7 +45,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -66,7 +63,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -85,7 +81,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -107,7 +102,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -126,7 +120,6 @@ describe('multiLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); @@ -146,10 +139,9 @@ describe('multiLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ has_base_version: false, - base_version: MissingVersion, + base_version: undefined, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -167,11 +159,10 @@ describe('multiLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ has_base_version: false, - base_version: MissingVersion, + base_version: undefined, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index 040ba93d8145f..30ff8fb37ef6e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -15,7 +15,6 @@ import { determineDiffOutcome, determineIfValueCanUpdate, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; @@ -35,13 +34,15 @@ export const multiLineStringDiffAlgorithm = ( const diffOutcome = determineDiffOutcome(baseVersion, currentVersion, targetVersion); const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); - const { mergeOutcome, mergedVersion } = mergeVersions({ + const hasBaseVersion = baseVersion !== MissingVersion; + + const { conflict, mergedVersion } = mergeVersions({ + hasBaseVersion, baseVersion, currentVersion, targetVersion, diffOutcome, }); - const hasBaseVersion = baseVersion !== MissingVersion; return { has_base_version: hasBaseVersion, @@ -51,18 +52,18 @@ export const multiLineStringDiffAlgorithm = ( merged_version: mergedVersion, diff_outcome: diffOutcome, - merge_outcome: mergeOutcome, + conflict, has_update: valueCanUpdate, - conflict: determineConflictType(mergeOutcome), }; }; interface MergeResult { - mergeOutcome: ThreeWayMergeOutcome; mergedVersion: string; + conflict: ThreeWayDiffConflict; } interface MergeArgs { + hasBaseVersion: boolean; baseVersion: string | MissingVersion; currentVersion: string; targetVersion: string; @@ -70,44 +71,54 @@ interface MergeArgs { } const mergeVersions = ({ + hasBaseVersion, baseVersion, currentVersion, targetVersion, diffOutcome, }: MergeArgs): MergeResult => { switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: { + case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB return { - mergeOutcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, mergedVersion: currentVersion, }; - } + case ThreeWayDiffOutcome.StockValueCanUpdate: { + if (!hasBaseVersion) { + // Scenario -AB. Treated as scenario ABC, returns target + // version and marked as "SOLVABLE" conflict. + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + return { + mergedVersion: targetVersion, + conflict: ThreeWayDiffConflict.SOLVABLE, + }; + } + + // Scenario AAB return { - mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, mergedVersion: targetVersion, }; } + + // Scenario ABC case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { - if (baseVersion === MissingVersion) { - return { - mergeOutcome: ThreeWayMergeOutcome.Conflict, - mergedVersion: currentVersion, - }; - } - const mergedVersion = merge(currentVersion, baseVersion, targetVersion, { + // TS does not realize that in ABC scenario, baseVersion cannot be missing + // Missing baseVersion scenarios were handled as -AA and -AB. + const mergedVersion = merge(currentVersion, baseVersion as string, targetVersion, { stringSeparator: /(\S+|\s+)/g, // Retains all whitespace, which we keep to preserve formatting }); return mergedVersion.conflict ? { - mergeOutcome: ThreeWayMergeOutcome.Conflict, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, mergedVersion: currentVersion, } : { - mergeOutcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, mergedVersion: mergedVersion.result.join(''), }; } @@ -115,13 +126,3 @@ const mergeVersions = ({ return assertUnreachable(diffOutcome); } }; - -const determineConflictType = (mergeOutcome: ThreeWayMergeOutcome) => { - if (mergeOutcome === ThreeWayMergeOutcome.Conflict) { - return ThreeWayDiffConflict.NON_SOLVABLE; - } - if (mergeOutcome === ThreeWayMergeOutcome.Merged) { - return ThreeWayDiffConflict.SOLVABLE; - } - return ThreeWayDiffConflict.NONE; -}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index af87cf59058fe..36d8875a55eed 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -8,7 +8,6 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -28,7 +27,6 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -47,7 +45,6 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -66,7 +63,6 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -85,7 +81,6 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -104,7 +99,6 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); @@ -123,10 +117,9 @@ describe('numberDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ has_base_version: false, - base_version: MissingVersion, + base_version: undefined, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -144,11 +137,10 @@ describe('numberDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ has_base_version: false, - base_version: MissingVersion, + base_version: undefined, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index ee9d684b94cae..b8aaffb6fd771 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -8,7 +8,6 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -28,7 +27,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -47,7 +45,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -66,7 +63,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -85,7 +81,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -105,7 +100,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -123,9 +117,10 @@ describe('scalarArrayDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: undefined, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -142,10 +137,11 @@ describe('scalarArrayDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: undefined, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); @@ -165,7 +161,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -186,7 +181,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -206,7 +200,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -226,7 +219,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -246,7 +238,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -267,7 +258,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -286,7 +276,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -305,7 +294,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -324,7 +312,6 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: [], diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index f2a984dca8826..cb84ab8633b9a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -15,7 +15,6 @@ import { determineOrderAgnosticDiffOutcome, determineIfValueCanUpdate, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; @@ -37,13 +36,14 @@ export const scalarArrayDiffAlgorithm = ( const diffOutcome = determineOrderAgnosticDiffOutcome(baseVersion, currentVersion, targetVersion); const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); - const { mergeOutcome, mergedVersion } = mergeVersions({ - baseVersion, + const hasBaseVersion = baseVersion !== MissingVersion; + const { conflict, mergedVersion } = mergeVersions({ + hasBaseVersion, + baseVersion: hasBaseVersion ? baseVersion : undefined, currentVersion, targetVersion, diffOutcome, }); - const hasBaseVersion = baseVersion !== MissingVersion; return { has_base_version: hasBaseVersion, @@ -53,65 +53,68 @@ export const scalarArrayDiffAlgorithm = ( merged_version: mergedVersion, diff_outcome: diffOutcome, - merge_outcome: mergeOutcome, + conflict, has_update: valueCanUpdate, - conflict: - // Scalar Arrays can only result in Merged outcomes on conflict - mergeOutcome === ThreeWayMergeOutcome.Merged - ? ThreeWayDiffConflict.SOLVABLE - : ThreeWayDiffConflict.NONE, }; }; interface MergeResult { - mergeOutcome: ThreeWayMergeOutcome; mergedVersion: TValue[]; + conflict: ThreeWayDiffConflict; } interface MergeArgs { - baseVersion: TValue[] | MissingVersion; + hasBaseVersion: boolean; + baseVersion: TValue[] | undefined; currentVersion: TValue[]; targetVersion: TValue[]; diffOutcome: ThreeWayDiffOutcome; } const mergeVersions = ({ + hasBaseVersion, baseVersion, currentVersion, targetVersion, diffOutcome, }: MergeArgs): MergeResult => { - const dedupedBaseVersion = baseVersion !== MissingVersion ? uniq(baseVersion) : MissingVersion; + const dedupedBaseVersion = uniq(baseVersion); const dedupedCurrentVersion = uniq(currentVersion); const dedupedTargetVersion = uniq(targetVersion); switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: { + case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB return { - mergeOutcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, mergedVersion: dedupedCurrentVersion, }; - } + case ThreeWayDiffOutcome.StockValueCanUpdate: { + if (!hasBaseVersion) { + // Scenario -AB. Treated as scenario ABC, returns target + // version and marked as "SOLVABLE" conflict. + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + return { + mergedVersion: targetVersion, + conflict: ThreeWayDiffConflict.SOLVABLE, + }; + } + + // Scenario AAB return { - mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, mergedVersion: dedupedTargetVersion, }; } - case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { - if (dedupedBaseVersion === MissingVersion) { - return { - mergeOutcome: ThreeWayMergeOutcome.Merged, - mergedVersion: union(currentVersion, targetVersion), - }; - } - const addedCurrent = difference(dedupedCurrentVersion, dedupedBaseVersion); + // Scenario ABC + case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { + const addedCurrent = difference(dedupedCurrentVersion, dedupedBaseVersion as TValue[]); const removedCurrent = difference(dedupedBaseVersion, dedupedCurrentVersion); - const addedTarget = difference(dedupedTargetVersion, dedupedBaseVersion); + const addedTarget = difference(dedupedTargetVersion, dedupedBaseVersion as TValue[]); const removedTarget = difference(dedupedBaseVersion, dedupedTargetVersion); const bothAdded = union(addedCurrent, addedTarget); @@ -120,7 +123,7 @@ const mergeVersions = ({ const merged = difference(union(dedupedBaseVersion, bothAdded), bothRemoved); return { - mergeOutcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, mergedVersion: merged, }; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 2dd47a7364104..40e9767c08bc6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -16,7 +16,6 @@ import { MissingVersion, ThreeWayDiffConflict, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -36,14 +35,15 @@ export const simpleDiffAlgorithm = ( const diffOutcome = determineDiffOutcome(baseVersion, currentVersion, targetVersion); const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); - const { mergeOutcome, mergedVersion } = mergeVersions({ + const hasBaseVersion = baseVersion !== MissingVersion; + + const { conflict, mergedVersion } = mergeVersions({ + hasBaseVersion, currentVersion, targetVersion, diffOutcome, }); - const hasBaseVersion = baseVersion !== MissingVersion; - return { has_base_version: hasBaseVersion, base_version: hasBaseVersion ? baseVersion : undefined, @@ -52,52 +52,61 @@ export const simpleDiffAlgorithm = ( merged_version: mergedVersion, diff_outcome: diffOutcome, - merge_outcome: mergeOutcome, has_update: valueCanUpdate, - conflict: - // Simple Diffs algos can only results in NON_SOLVABLE conflicts - // if the diff outcome is a conflict - mergeOutcome === ThreeWayMergeOutcome.Conflict - ? ThreeWayDiffConflict.NON_SOLVABLE - : ThreeWayDiffConflict.NONE, + conflict, }; }; interface MergeResult { - mergeOutcome: ThreeWayMergeOutcome; mergedVersion: TValue; + conflict: ThreeWayDiffConflict; } interface MergeArgs { + hasBaseVersion: boolean; currentVersion: TValue; targetVersion: TValue; diffOutcome: ThreeWayDiffOutcome; } const mergeVersions = ({ + hasBaseVersion, currentVersion, targetVersion, diffOutcome, }: MergeArgs): MergeResult => { switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: { + case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB return { - mergeOutcome: ThreeWayMergeOutcome.Current, mergedVersion: currentVersion, + conflict: ThreeWayDiffConflict.NONE, }; - } + case ThreeWayDiffOutcome.StockValueCanUpdate: { + if (!hasBaseVersion) { + // Scenario -AB. Treated as scenario ABC, returns target + // version and marked as "SOLVABLE" conflict. + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + return { + mergedVersion: targetVersion, + conflict: ThreeWayDiffConflict.SOLVABLE, + }; + } + + // Scenario AAB return { - mergeOutcome: ThreeWayMergeOutcome.Target, mergedVersion: targetVersion, + conflict: ThreeWayDiffConflict.NONE, }; } + + // Scenario ABC case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { return { - mergeOutcome: ThreeWayMergeOutcome.Conflict, mergedVersion: currentVersion, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, }; } default: diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts index bb3aeb66a59db..4c91f9e5f3e2a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts @@ -8,7 +8,6 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, - ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -28,7 +27,6 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -47,7 +45,6 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -66,7 +63,6 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -85,7 +81,6 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -104,7 +99,6 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); @@ -122,9 +116,10 @@ describe('singleLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: undefined, merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -141,10 +136,11 @@ describe('singleLineStringDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ + has_base_version: false, + base_version: undefined, merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, }) ); }); From 8529241f8773dd5cdfc5b87f6c86afb5fa67ea99 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 17:30:41 +0200 Subject: [PATCH 25/34] Updated integration tests --- .../algorithms/simple_diff_algorithm.ts | 2 +- ...ade_review_prebuilt_rules.number_fields.ts | 41 +++++------------ ...view_prebuilt_rules.scalar_array_fields.ts | 45 +++++-------------- ...rebuilt_rules.single_line_string_fields.ts | 37 ++++----------- 4 files changed, 32 insertions(+), 93 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 40e9767c08bc6..01fd02c62056e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -34,7 +34,7 @@ export const simpleDiffAlgorithm = ( const diffOutcome = determineDiffOutcome(baseVersion, currentVersion, targetVersion); const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); - + console.log({diffOutcome}) const hasBaseVersion = baseVersion !== MissingVersion; const { conflict, mergedVersion } = mergeVersions({ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index 4bc14f7fba945..4d4265e0979bb 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -8,7 +8,6 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -65,7 +64,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -112,7 +110,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 1, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -123,7 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -164,7 +160,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -175,7 +170,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -221,7 +215,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -232,7 +225,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -280,7 +272,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 3, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflict.NON_SOLVABLE, has_update: true, has_base_version: true, @@ -291,7 +282,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -317,43 +307,38 @@ export default ({ getService }: FtrProviderContext): void => { // Clear previous rule assets await deleteAllPrebuiltRuleAssets(es, log); - // Customize a number field on the installed rule - await patchRule(supertest, log, { - rule_id: 'rule-1', - risk_score: 2, - }); - - // Increment the version of the installed rule, update a number field, and create the new rule assets + // Increment the version of the installed rule with the number field maintained const updatedRuleAssetSavedObjects = [ createRuleAssetSavedObject({ rule_id: 'rule-1', version: 2, - risk_score: 2, + risk_score: 1, }), ]; await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update - // but does NOT contain number field + // but does NOT contain the risk_score number field, since -AA is treated as AAA const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + expect(reviewResponse.rules[0].diff.fields).toEqual({ version: { + base_version: undefined, current_version: 1, target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -392,8 +377,7 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 3, merged_version: 3, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, @@ -402,18 +386,17 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 5e44c68cb7f2c..4fd7c8b461b93 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -8,7 +8,6 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -69,7 +68,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -114,7 +112,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'three'], merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -125,7 +122,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -166,7 +162,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'four'], merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -177,7 +172,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -223,7 +217,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'four'], merged_version: ['one', 'two', 'four'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -234,7 +227,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -282,7 +274,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'five'], merged_version: ['one', 'two', 'four', 'five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, @@ -293,7 +284,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -345,7 +335,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['three', 'three', 'one'], merged_version: ['one', 'three'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, @@ -356,7 +345,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -408,7 +396,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['ONE', 'THREE'], merged_version: ['ONE', 'one', 'THREE'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, @@ -419,7 +406,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -465,7 +451,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'five'], merged_version: ['five'], diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: true, @@ -476,7 +461,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -502,24 +486,18 @@ export default ({ getService }: FtrProviderContext): void => { // Clear previous rule assets await deleteAllPrebuiltRuleAssets(es, log); - // Customize a scalar array field on the installed rule - await patchRule(supertest, log, { - rule_id: 'rule-1', - tags: ['one', 'three', 'two'], - }); - - // Increment the version of the installed rule, update a scalar array field, and create the new rule assets + // Increment the version of the installed rule, but keep scalar array field unchanged const updatedRuleAssetSavedObjects = [ createRuleAssetSavedObject({ rule_id: 'rule-1', version: 2, - tags: ['one', 'three', 'two'], + tags: ['one', 'two', 'three'], // unchanged }), ]; await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update - // but does NOT contain scalar array field + // but does NOT contain scalar array field (tags is not present) const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); expect(reviewResponse.rules[0].diff.fields).toEqual({ version: { @@ -527,18 +505,17 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -577,8 +554,7 @@ export default ({ getService }: FtrProviderContext): void => { target_version: ['one', 'two', 'five'], merged_version: ['one', 'two', 'five'], diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, @@ -587,18 +563,17 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index c69dd0e535f87..0aebd45b986dd 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -8,7 +8,6 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -65,7 +64,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -112,7 +110,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 'A', merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -123,7 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -164,7 +160,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 'B', merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -175,7 +170,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -221,7 +215,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 'B', merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, has_update: false, has_base_version: true, @@ -232,7 +225,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -280,7 +272,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 'C', merged_version: 'B', diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Conflict, conflict: ThreeWayDiffConflict.NON_SOLVABLE, has_update: true, has_base_version: true, @@ -291,7 +282,6 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, @@ -317,18 +307,12 @@ export default ({ getService }: FtrProviderContext): void => { // Clear previous rule assets await deleteAllPrebuiltRuleAssets(es, log); - // Customize a single line string field on the installed rule - await patchRule(supertest, log, { - rule_id: 'rule-1', - name: 'B', - }); - - // Increment the version of the installed rule, update a single line string field, and create the new rule assets + // Increment the version of the installed rule, but keep single line string field unchanged const updatedRuleAssetSavedObjects = [ createRuleAssetSavedObject({ rule_id: 'rule-1', version: 2, - name: 'B', + name: 'A', // unchanged }), ]; await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); @@ -342,18 +326,17 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); @@ -392,8 +375,7 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 'C', merged_version: 'C', diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, @@ -402,18 +384,17 @@ export default ({ getService }: FtrProviderContext): void => { target_version: 2, merged_version: 2, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.SOLVABLE, has_update: true, has_base_version: false, }, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); - expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); }); }); From c700ac1a465bc8eabab4e69f1164d4023dcf9292 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 17:35:25 +0200 Subject: [PATCH 26/34] Remove changes to rfc --- .../rfcs/detection_response/prebuilt_rules_customization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md index 5b261f20a47c9..97f7be2b8cd69 100644 --- a/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md +++ b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md @@ -2767,7 +2767,7 @@ const reviewUpgradeResponse: ReviewRuleUpgradeResponseBody = await fetch( const performUpgradePayload = { mode: 'SPECIFIC_RULES', rules: reviewUpgradeResponse.rules - .filter((rule) => rule.diff.num_fields_with_conflicts === 0) + .filter((rule) => !rule.diff.has_conflict) .map((rule) => ({ rule_id: rule.rule_id, revision: rule.revision, From 1aa243c62f3e1fd2dbf20c1c1a42a0172ff3d62b Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 17:44:38 +0200 Subject: [PATCH 27/34] Added link to RFC --- .../model/diff/three_way_diff/three_way_diff_conflict.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts index 755bbf85e2fe1..f33c52d33abfc 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts @@ -12,7 +12,7 @@ * - NO_CONFLICT: * - current == target (value won't change) * - current != target && current == base (stock rule will get a new value) - * + * See RFC: https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md#concrete-field-diff-algorithms-by-type */ export enum ThreeWayDiffConflict { NONE = 'NONE', From 18279f9e7ef80e675b1665b84298025f5a1ef4d8 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Mon, 22 Jul 2024 17:49:16 +0200 Subject: [PATCH 28/34] Remove consolelog --- .../logic/diff/calculation/algorithms/simple_diff_algorithm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 01fd02c62056e..40e9767c08bc6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -34,7 +34,7 @@ export const simpleDiffAlgorithm = ( const diffOutcome = determineDiffOutcome(baseVersion, currentVersion, targetVersion); const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); - console.log({diffOutcome}) + const hasBaseVersion = baseVersion !== MissingVersion; const { conflict, mergedVersion } = mergeVersions({ From 14647069619663b58ec7233c6d07961e2c63ed0d Mon Sep 17 00:00:00 2001 From: jpdjere Date: Tue, 23 Jul 2024 13:05:51 +0200 Subject: [PATCH 29/34] remove index --- .../common/api/detection_engine/prebuilt_rules/model/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts index 2dac61022e6a8..418a2c7014928 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts @@ -13,4 +13,3 @@ export * from './diff/rule_diff/rule_diff'; export * from './diff/three_way_diff/three_way_diff_outcome'; export * from './diff/three_way_diff/three_way_diff'; export * from './diff/three_way_diff/three_way_diff_conflict'; -export * from './diff/three_way_diff/three_way_merge_outcome'; From 82c77791118c466b711b67c5248d3f19d28834ce Mon Sep 17 00:00:00 2001 From: jpdjere Date: Tue, 23 Jul 2024 13:07:27 +0200 Subject: [PATCH 30/34] Fix --- .../components/rule_details/per_field_rule_diff_tab.test.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index c099459fea224..4d2dc56ac744e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -9,7 +9,6 @@ import { KqlQueryType, ThreeWayDiffConflict, ThreeWayDiffOutcome, - ThreeWayMergeOutcome, } from '../../../../../common/api/detection_engine'; import type { PartialRuleDiff } from '../../../../../common/api/detection_engine'; import { TestProviders } from '../../../../common/mock'; @@ -21,7 +20,6 @@ const ruleFieldsDiffBaseFieldsMock = { diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, conflict: ThreeWayDiffConflict.NONE, has_update: true, - merge_outcome: ThreeWayMergeOutcome.Target, has_base_version: true, }; From 7851d369ec9b2a667680c696bbd9211c924f432f Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 24 Jul 2024 14:21:46 +0200 Subject: [PATCH 31/34] Readded ThreeWayMergeOutcome enum and added missing base version scenarios to ThreeWayDiffOutcome enum --- .../detection_engine/prebuilt_rules/index.ts | 2 + .../diff/three_way_diff/three_way_diff.ts | 9 ++++ .../three_way_diff/three_way_diff_outcome.ts | 12 +++-- .../three_way_diff/three_way_merge_outcome.ts | 23 +++++++++ .../per_field_rule_diff_tab.test.tsx | 2 + .../multi_line_string_diff_algorithm.test.ts | 13 ++++- .../multi_line_string_diff_algorithm.ts | 43 ++++++++++------- .../algorithms/number_diff_algorithm.test.ts | 12 ++++- .../scalar_array_diff_algorithm.test.ts | 21 ++++++++- .../algorithms/scalar_array_diff_algorithm.ts | 41 +++++++++------- .../algorithms/simple_diff_algorithm.ts | 47 +++++++++++-------- .../single_line_string_diff_algorithm.test.ts | 12 ++++- 12 files changed, 173 insertions(+), 64 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts index 86956c001843e..2dfb1583de190 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts @@ -21,3 +21,5 @@ export * from './model/diff/rule_diff/rule_diff'; export * from './model/diff/three_way_diff/three_way_diff_outcome'; export * from './model/diff/three_way_diff/three_way_diff'; export * from './model/diff/three_way_diff/three_way_diff_conflict'; +export * from './model/diff/three_way_diff/three_way_merge_outcome'; + diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 2fcb86d780f02..7b71bb6f16c7a 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -7,6 +7,7 @@ import type { ThreeWayDiffOutcome } from './three_way_diff_outcome'; import type { ThreeWayDiffConflict } from './three_way_diff_conflict'; +import type { ThreeWayMergeOutcome } from './three_way_merge_outcome'; /** * A symbol that represents a missing value and used when a base version of a @@ -110,6 +111,14 @@ export interface ThreeWayDiff { */ diff_outcome: ThreeWayDiffOutcome; + /** + * The type of result of an automatic three-way merge of three values: + * - current version + * - target version + * - merged version + */ + merge_outcome: ThreeWayMergeOutcome; + /** * Boolean which determines if a base version was found and returned for the three-way-diff of the field * - true: the base version of the field was found and is either defined or undefined diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts index afa63c01744e1..19a675b8de279 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts @@ -27,6 +27,12 @@ export enum ThreeWayDiffOutcome { /** Customized rule, the value has changed in the target version and is not equal to the current version. */ CustomizedValueCanUpdate = 'BASE=A, CURRENT=B, TARGET=C', + + /** Missing base, the value hasn't changed in the target version. */ + MissingBaseNoUpdate = 'BASE=-, CURRENT=A, TARGET=A', + + /** Missing base, the value changed in the target version. */ + MissingBaseCanUpdate = 'BASE=-, CURRENT=A, TARGET=B', } export const determineDiffOutcome = ( @@ -85,12 +91,12 @@ const getThreeWayDiffOutcome = ({ if (!hasBaseVersion) { /** * We couldn't find the base version of the rule in the package so further - * version comparison is not possible. We assume that the rule is not + * version comparison is not possible. We assume that the rule is * customized and the value can be updated if there's an update. */ return currentEqlTarget - ? ThreeWayDiffOutcome.StockValueNoUpdate - : ThreeWayDiffOutcome.StockValueCanUpdate; + ? ThreeWayDiffOutcome.MissingBaseNoUpdate + : ThreeWayDiffOutcome.MissingBaseCanUpdate; } if (baseEqlCurrent) { diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts new file mode 100644 index 0000000000000..d770125553744 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_merge_outcome.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * The type of result of an automatic three-way merge of three values: + * - current version + * - target version + * - merged version + */ +export enum ThreeWayMergeOutcome { + /** Took current version and returned as the merged one. */ + Current = 'CURRENT', + + /** Took target version and returned as the merged one. */ + Target = 'TARGET', + + /** Merged three versions successfully into a new one. */ + Merged = 'MERGED', +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 4d2dc56ac744e..5e417b3d862ed 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -9,6 +9,7 @@ import { KqlQueryType, ThreeWayDiffConflict, ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '../../../../../common/api/detection_engine'; import type { PartialRuleDiff } from '../../../../../common/api/detection_engine'; import { TestProviders } from '../../../../common/mock'; @@ -21,6 +22,7 @@ const ruleFieldsDiffBaseFieldsMock = { conflict: ThreeWayDiffConflict.NONE, has_update: true, has_base_version: true, + merge_outcome: ThreeWayMergeOutcome.Target, }; const ruleFieldsDiffMock: PartialRuleDiff = { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts index cc9c73d5c9a1a..dd1d6abaa04b0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts @@ -8,6 +8,7 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, + ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -28,6 +29,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, conflict: ThreeWayDiffConflict.NONE, + merge_outcome: ThreeWayMergeOutcome.Current, }) ); }); @@ -46,6 +48,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, conflict: ThreeWayDiffConflict.NONE, + merge_outcome: ThreeWayMergeOutcome.Current, }) ); }); @@ -64,6 +67,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, conflict: ThreeWayDiffConflict.NONE, + merge_outcome: ThreeWayMergeOutcome.Target, }) ); }); @@ -82,6 +86,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, conflict: ThreeWayDiffConflict.NONE, + merge_outcome: ThreeWayMergeOutcome.Current, }) ); }); @@ -103,6 +108,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, conflict: ThreeWayDiffConflict.SOLVABLE, + merge_outcome: ThreeWayMergeOutcome.Merged, }) ); }); @@ -121,6 +127,7 @@ describe('multiLineStringDiffAlgorithm', () => { merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, conflict: ThreeWayDiffConflict.NON_SOLVABLE, + merge_outcome: ThreeWayMergeOutcome.Current, }) ); }); @@ -141,7 +148,8 @@ describe('multiLineStringDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.current_version, - diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -161,7 +169,8 @@ describe('multiLineStringDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.target_version, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index 30ff8fb37ef6e..9cb326102ae6d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -14,9 +14,10 @@ import type { import { determineDiffOutcome, determineIfValueCanUpdate, - ThreeWayDiffOutcome, MissingVersion, ThreeWayDiffConflict, + ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -36,7 +37,7 @@ export const multiLineStringDiffAlgorithm = ( const hasBaseVersion = baseVersion !== MissingVersion; - const { conflict, mergedVersion } = mergeVersions({ + const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ hasBaseVersion, baseVersion, currentVersion, @@ -50,6 +51,7 @@ export const multiLineStringDiffAlgorithm = ( current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, + merge_outcome: mergeOutcome, diff_outcome: diffOutcome, conflict, @@ -58,6 +60,7 @@ export const multiLineStringDiffAlgorithm = ( }; interface MergeResult { + mergeOutcome: ThreeWayMergeOutcome; mergedVersion: string; conflict: ThreeWayDiffConflict; } @@ -78,33 +81,26 @@ const mergeVersions = ({ diffOutcome, }: MergeArgs): MergeResult => { switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB + // Scenario -AA is treated as scenario AAA: + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseNoUpdate: + case ThreeWayDiffOutcome.StockValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: return { conflict: ThreeWayDiffConflict.NONE, mergedVersion: currentVersion, + mergeOutcome: ThreeWayMergeOutcome.Current, }; case ThreeWayDiffOutcome.StockValueCanUpdate: { - if (!hasBaseVersion) { - // Scenario -AB. Treated as scenario ABC, returns target - // version and marked as "SOLVABLE" conflict. - // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 - return { - mergedVersion: targetVersion, - conflict: ThreeWayDiffConflict.SOLVABLE, - }; - } - - // Scenario AAB return { conflict: ThreeWayDiffConflict.NONE, mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, }; } - // Scenario ABC case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { // TS does not realize that in ABC scenario, baseVersion cannot be missing // Missing baseVersion scenarios were handled as -AA and -AB. @@ -116,12 +112,25 @@ const mergeVersions = ({ ? { conflict: ThreeWayDiffConflict.NON_SOLVABLE, mergedVersion: currentVersion, + mergeOutcome: ThreeWayMergeOutcome.Current, } : { conflict: ThreeWayDiffConflict.SOLVABLE, mergedVersion: mergedVersion.result.join(''), + mergeOutcome: ThreeWayMergeOutcome.Merged, }; } + + // Scenario -AB is treated as scenario ABC, but marked as + // SOLVABLE, and returns the target version as the merged version + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseCanUpdate: { + return { + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + }; + } default: return assertUnreachable(diffOutcome); } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts index 36d8875a55eed..837fb85c3b2c3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/number_diff_algorithm.test.ts @@ -8,6 +8,7 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, + ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -27,6 +28,7 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -45,6 +47,7 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -63,6 +66,7 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -81,6 +85,7 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -99,6 +104,7 @@ describe('numberDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); @@ -119,7 +125,8 @@ describe('numberDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.current_version, - diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -139,7 +146,8 @@ describe('numberDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.target_version, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts index b8aaffb6fd771..f041aa139bf41 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.test.ts @@ -8,6 +8,7 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, + ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -27,6 +28,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -45,6 +47,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -63,6 +66,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -81,6 +85,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -100,6 +105,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -120,7 +126,8 @@ describe('scalarArrayDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.current_version, - diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -140,7 +147,8 @@ describe('scalarArrayDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.target_version, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -161,6 +169,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -181,6 +190,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -200,6 +210,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -219,6 +230,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -238,6 +250,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: expectedMergedVersion, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); @@ -258,6 +271,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -276,6 +290,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -294,6 +309,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -312,6 +328,7 @@ describe('scalarArrayDiffAlgorithm', () => { expect.objectContaining({ merged_version: [], diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index cb84ab8633b9a..3b69b7c73fa46 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -17,6 +17,7 @@ import { ThreeWayDiffOutcome, MissingVersion, ThreeWayDiffConflict, + ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -37,7 +38,8 @@ export const scalarArrayDiffAlgorithm = ( const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); const hasBaseVersion = baseVersion !== MissingVersion; - const { conflict, mergedVersion } = mergeVersions({ + + const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ hasBaseVersion, baseVersion: hasBaseVersion ? baseVersion : undefined, currentVersion, @@ -51,6 +53,7 @@ export const scalarArrayDiffAlgorithm = ( current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, + merge_outcome: mergeOutcome, diff_outcome: diffOutcome, conflict, @@ -59,6 +62,7 @@ export const scalarArrayDiffAlgorithm = ( }; interface MergeResult { + mergeOutcome: ThreeWayMergeOutcome; mergedVersion: TValue[]; conflict: ThreeWayDiffConflict; } @@ -83,33 +87,26 @@ const mergeVersions = ({ const dedupedTargetVersion = uniq(targetVersion); switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB + // Scenario -AA is treated as scenario AAA: + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseNoUpdate: + case ThreeWayDiffOutcome.StockValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: return { conflict: ThreeWayDiffConflict.NONE, mergedVersion: dedupedCurrentVersion, + mergeOutcome: ThreeWayMergeOutcome.Current, }; case ThreeWayDiffOutcome.StockValueCanUpdate: { - if (!hasBaseVersion) { - // Scenario -AB. Treated as scenario ABC, returns target - // version and marked as "SOLVABLE" conflict. - // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 - return { - mergedVersion: targetVersion, - conflict: ThreeWayDiffConflict.SOLVABLE, - }; - } - - // Scenario AAB return { conflict: ThreeWayDiffConflict.NONE, mergedVersion: dedupedTargetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, }; } - // Scenario ABC case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { const addedCurrent = difference(dedupedCurrentVersion, dedupedBaseVersion as TValue[]); const removedCurrent = difference(dedupedBaseVersion, dedupedCurrentVersion); @@ -125,6 +122,18 @@ const mergeVersions = ({ return { conflict: ThreeWayDiffConflict.SOLVABLE, mergedVersion: merged, + mergeOutcome: ThreeWayMergeOutcome.Merged, + }; + } + + // Scenario -AB is treated as scenario ABC, but marked as + // SOLVABLE, and returns the target version as the merged version + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseCanUpdate: { + return { + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, }; } default: diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts index 40e9767c08bc6..1673b87003a00 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/simple_diff_algorithm.ts @@ -16,6 +16,7 @@ import { MissingVersion, ThreeWayDiffConflict, ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; /** @@ -37,7 +38,7 @@ export const simpleDiffAlgorithm = ( const hasBaseVersion = baseVersion !== MissingVersion; - const { conflict, mergedVersion } = mergeVersions({ + const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ hasBaseVersion, currentVersion, targetVersion, @@ -50,6 +51,7 @@ export const simpleDiffAlgorithm = ( current_version: currentVersion, target_version: targetVersion, merged_version: mergedVersion, + merge_outcome: mergeOutcome, diff_outcome: diffOutcome, has_update: valueCanUpdate, @@ -58,6 +60,7 @@ export const simpleDiffAlgorithm = ( }; interface MergeResult { + mergeOutcome: ThreeWayMergeOutcome; mergedVersion: TValue; conflict: ThreeWayDiffConflict; } @@ -76,37 +79,41 @@ const mergeVersions = ({ diffOutcome, }: MergeArgs): MergeResult => { switch (diffOutcome) { - case ThreeWayDiffOutcome.StockValueNoUpdate: // Scenarios AAA and -AA - case ThreeWayDiffOutcome.CustomizedValueNoUpdate: // Scenario ABA - case ThreeWayDiffOutcome.CustomizedValueSameUpdate: // Scenario ABB + // Scenario -AA is treated as scenario AAA: + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseNoUpdate: + case ThreeWayDiffOutcome.StockValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: return { - mergedVersion: currentVersion, conflict: ThreeWayDiffConflict.NONE, + mergedVersion: currentVersion, + mergeOutcome: ThreeWayMergeOutcome.Current, }; case ThreeWayDiffOutcome.StockValueCanUpdate: { - if (!hasBaseVersion) { - // Scenario -AB. Treated as scenario ABC, returns target - // version and marked as "SOLVABLE" conflict. - // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 - return { - mergedVersion: targetVersion, - conflict: ThreeWayDiffConflict.SOLVABLE, - }; - } - - // Scenario AAB return { - mergedVersion: targetVersion, conflict: ThreeWayDiffConflict.NONE, + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, }; } - - // Scenario ABC case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { return { - mergedVersion: currentVersion, conflict: ThreeWayDiffConflict.NON_SOLVABLE, + mergedVersion: currentVersion, + mergeOutcome: ThreeWayMergeOutcome.Current, + }; + } + + // Scenario -AB is treated as scenario ABC, but marked as + // SOLVABLE, and returns the target version as the merged version + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseCanUpdate: { + return { + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, }; } default: diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts index 4c91f9e5f3e2a..af238283ca21f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/single_line_string_diff_algorithm.test.ts @@ -8,6 +8,7 @@ import type { ThreeVersionsOf } from '../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffOutcome, + ThreeWayMergeOutcome, MissingVersion, ThreeWayDiffConflict, } from '../../../../../../../../common/api/detection_engine'; @@ -27,6 +28,7 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -45,6 +47,7 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -63,6 +66,7 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.target_version, diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -81,6 +85,7 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -99,6 +104,7 @@ describe('singleLineStringDiffAlgorithm', () => { expect.objectContaining({ merged_version: mockVersions.current_version, diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); @@ -119,7 +125,8 @@ describe('singleLineStringDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.current_version, - diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, conflict: ThreeWayDiffConflict.NONE, }) ); @@ -139,7 +146,8 @@ describe('singleLineStringDiffAlgorithm', () => { has_base_version: false, base_version: undefined, merged_version: mockVersions.target_version, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, conflict: ThreeWayDiffConflict.SOLVABLE, }) ); From 0bf6e126d3aba70ec716fd0cda50c0f6d7aabce1 Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 24 Jul 2024 15:23:25 +0200 Subject: [PATCH 32/34] Simplified single line strings integration tests --- .../detection_engine/prebuilt_rules/index.ts | 1 - .../three_way_diff/three_way_diff_outcome.ts | 3 +- .../components/rule_details/helpers.ts | 3 +- .../review_rule_upgrade_route.ts | 4 +- ...rebuilt_rules.single_line_string_fields.ts | 197 ++++++------------ 5 files changed, 73 insertions(+), 135 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts index 2dfb1583de190..08d91061f58e8 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts @@ -22,4 +22,3 @@ export * from './model/diff/three_way_diff/three_way_diff_outcome'; export * from './model/diff/three_way_diff/three_way_diff'; export * from './model/diff/three_way_diff/three_way_diff_conflict'; export * from './model/diff/three_way_diff/three_way_merge_outcome'; - diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts index 19a675b8de279..44885d1932070 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts @@ -117,6 +117,7 @@ const getThreeWayDiffOutcome = ({ export const determineIfValueCanUpdate = (diffCase: ThreeWayDiffOutcome): boolean => { return ( diffCase === ThreeWayDiffOutcome.StockValueCanUpdate || - diffCase === ThreeWayDiffOutcome.CustomizedValueCanUpdate + diffCase === ThreeWayDiffOutcome.CustomizedValueCanUpdate || + diffCase === ThreeWayDiffOutcome.MissingBaseCanUpdate ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts index fd933ba33ae7e..73dbe92cebbe4 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts @@ -52,7 +52,8 @@ export const filterUnsupportedDiffOutcomes = ( const diff = value as ThreeWayDiff; return ( diff.diff_outcome !== ThreeWayDiffOutcome.CustomizedValueNoUpdate && - diff.diff_outcome !== ThreeWayDiffOutcome.CustomizedValueSameUpdate + diff.diff_outcome !== ThreeWayDiffOutcome.CustomizedValueSameUpdate && + diff.diff_outcome !== ThreeWayDiffOutcome.MissingBaseNoUpdate ); }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts index fee95c91cebed..8b229c6406b10 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts @@ -145,7 +145,9 @@ const calculateRuleInfos = (results: CalculateRuleDiffResult[]): RuleUpgradeInfo diff: { fields: pickBy>( ruleDiff.fields, - (fieldDiff) => fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate + (fieldDiff) => + fieldDiff.diff_outcome !== ThreeWayDiffOutcome.StockValueNoUpdate && + fieldDiff.diff_outcome !== ThreeWayDiffOutcome.MissingBaseNoUpdate ), num_fields_with_updates: ruleDiff.num_fields_with_updates, num_fields_with_conflicts: ruleDiff.num_fields_with_conflicts, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts index 0aebd45b986dd..aa1feb5fc70e8 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.single_line_string_fields.ts @@ -8,6 +8,7 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -55,20 +56,11 @@ export default ({ getService }: FtrProviderContext): void => { ]; await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); - // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligable for update but single line string field is NOT returned + // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligible for update + // but single line string field (name) is NOT returned const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - }); + expect(reviewResponse.rules[0].diff.fields.name).toBeUndefined(); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -101,30 +93,21 @@ export default ({ getService }: FtrProviderContext): void => { ]; await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); - // Call the upgrade review prebuilt rules endpoint and check that single line string diff field is returned but field does not have an update + // Call the upgrade review prebuilt rules endpoint and check that single line string diff field + // is returned but field does not have an update, and the merge outcome is "Current" const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - name: { - base_version: 'A', - current_version: 'B', - target_version: 'A', - merged_version: 'B', - diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.name).toEqual({ + base_version: 'A', + current_version: 'B', + target_version: 'A', + merged_version: 'B', + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -153,28 +136,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - name: { - base_version: 'A', - current_version: 'A', - target_version: 'B', - merged_version: 'B', - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.name).toEqual({ + base_version: 'A', + current_version: 'A', + target_version: 'B', + merged_version: 'B', + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -208,28 +181,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - name: { - base_version: 'A', - current_version: 'B', - target_version: 'B', - merged_version: 'B', - diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.name).toEqual({ + base_version: 'A', + current_version: 'B', + target_version: 'B', + merged_version: 'B', + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -263,30 +226,20 @@ export default ({ getService }: FtrProviderContext): void => { await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update - // and single line string field update has conflict + // and single line string field update has NON_SOLVABLE conflict, and merged version is CURRENT const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - name: { - base_version: 'A', - current_version: 'B', - target_version: 'C', - merged_version: 'B', - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.NON_SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.name).toEqual({ + base_version: 'A', + current_version: 'B', + target_version: 'C', + merged_version: 'B', + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); @@ -320,19 +273,10 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // but does NOT contain single line string field const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - }); + expect(reviewResponse.rules[0].diff.fields.name).toBeUndefined(); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); // version is considered a conflict expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); @@ -369,28 +313,19 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and single line string field update does not have a conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - name: { - current_version: 'B', - target_version: 'C', - merged_version: 'C', - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - version: { - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, + expect(reviewResponse.rules[0].diff.fields.name).toEqual({ + current_version: 'B', + target_version: 'C', + merged_version: 'C', + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: false, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); // name + version are both considered conflicts expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); From 23189ec649fb94445cc7ba275f2f560aae20aabb Mon Sep 17 00:00:00 2001 From: jpdjere Date: Wed, 24 Jul 2024 15:49:38 +0200 Subject: [PATCH 33/34] Simplified integration tests --- ...ade_review_prebuilt_rules.number_fields.ts | 187 ++++-------- ...view_prebuilt_rules.scalar_array_fields.ts | 286 ++++++------------ 2 files changed, 152 insertions(+), 321 deletions(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts index 4d4265e0979bb..3d5c0d6d15527 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.number_fields.ts @@ -8,6 +8,7 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -55,21 +56,12 @@ export default ({ getService }: FtrProviderContext): void => { ]; await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); - // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligable for update but number field is NOT returned + // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligible + // for update but number field (risk_score) is NOT returned const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - }); - expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.fields.risk_score).toBeUndefined(); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); // version expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -103,27 +95,16 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that number diff field is returned but field does not have an update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - risk_score: { - base_version: 1, - current_version: 2, - target_version: 1, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.risk_score).toEqual({ + base_version: 1, + current_version: 2, + target_version: 1, + merged_version: 2, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); @@ -153,28 +134,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - risk_score: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.risk_score).toEqual({ + base_version: 1, + current_version: 1, + target_version: 2, + merged_version: 2, + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -208,27 +179,16 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update and contains number field const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - risk_score: { - base_version: 1, - current_version: 2, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.risk_score).toEqual({ + base_version: 1, + current_version: 2, + target_version: 2, + merged_version: 2, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); @@ -265,28 +225,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and number field update has conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - risk_score: { - base_version: 1, - current_version: 2, - target_version: 3, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.NON_SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.risk_score).toEqual({ + base_version: 1, + current_version: 2, + target_version: 3, + merged_version: 2, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); @@ -320,19 +270,8 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // but does NOT contain the risk_score number field, since -AA is treated as AAA const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + expect(reviewResponse.rules[0].diff.fields.risk_score).toBeUndefined(); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - base_version: undefined, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -371,25 +310,15 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and number field update does not have a conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - risk_score: { - current_version: 2, - target_version: 3, - merged_version: 3, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - version: { - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, + expect(reviewResponse.rules[0].diff.fields.risk_score).toEqual({ + current_version: 2, + target_version: 3, + merged_version: 3, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: false, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts index 4fd7c8b461b93..dde56d59f82ac 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.scalar_array_fields.ts @@ -8,6 +8,7 @@ import expect from 'expect'; import { ThreeWayDiffConflict, ThreeWayDiffOutcome, + ThreeWayMergeOutcome, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; import { @@ -61,18 +62,8 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligable for update but scalar array field is NOT returned const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - }); + expect(reviewResponse.rules[0].diff.fields.tags).toBeUndefined(); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -105,28 +96,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that scalar array diff field is returned but field does not have an update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'three'], - current_version: ['one', 'two', 'four'], - target_version: ['one', 'two', 'three'], - merged_version: ['one', 'two', 'four'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'three'], + current_version: ['one', 'two', 'four'], + target_version: ['one', 'two', 'three'], + merged_version: ['one', 'two', 'four'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -155,28 +136,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'three'], - current_version: ['one', 'two', 'three'], - target_version: ['one', 'two', 'four'], - merged_version: ['one', 'two', 'four'], - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'three'], + current_version: ['one', 'two', 'three'], + target_version: ['one', 'two', 'four'], + merged_version: ['one', 'two', 'four'], + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -210,27 +181,16 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update and contains scalar array field const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'three'], - current_version: ['one', 'two', 'four'], - target_version: ['one', 'two', 'four'], - merged_version: ['one', 'two', 'four'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: false, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'three'], + current_version: ['one', 'two', 'four'], + target_version: ['one', 'two', 'four'], + merged_version: ['one', 'two', 'four'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, }); expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); @@ -267,28 +227,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and scalar array field update has conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'three'], - current_version: ['one', 'two', 'four'], - target_version: ['one', 'two', 'five'], - merged_version: ['one', 'two', 'four', 'five'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'three'], + current_version: ['one', 'two', 'four'], + target_version: ['one', 'two', 'five'], + merged_version: ['one', 'two', 'four', 'five'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -328,28 +278,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and scalar array field update has conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'two'], - current_version: ['two', 'one', 'three'], - target_version: ['three', 'three', 'one'], - merged_version: ['one', 'three'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'two'], + current_version: ['two', 'one', 'three'], + target_version: ['three', 'three', 'one'], + merged_version: ['one', 'three'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -389,28 +329,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and scalar array field update has conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['ONE', 'TWO'], - current_version: ['one', 'ONE'], - target_version: ['ONE', 'THREE'], - merged_version: ['ONE', 'one', 'THREE'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['ONE', 'TWO'], + current_version: ['one', 'ONE'], + target_version: ['ONE', 'THREE'], + merged_version: ['ONE', 'one', 'THREE'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -444,28 +374,18 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and scalar array field update has conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - base_version: ['one', 'two', 'three'], - current_version: [], - target_version: ['one', 'two', 'five'], - merged_version: ['five'], - diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: true, - }, - version: { - base_version: 1, - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.NONE, - has_update: true, - has_base_version: true, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + base_version: ['one', 'two', 'three'], + current_version: [], + target_version: ['one', 'two', 'five'], + merged_version: ['five'], + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); @@ -497,21 +417,12 @@ export default ({ getService }: FtrProviderContext): void => { await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update - // but does NOT contain scalar array field (tags is not present) + // but does NOT contain scalar array field (tags is not present, since scenario -AA is not included in response) const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - version: { - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - }); + expect(reviewResponse.rules[0].diff.fields.tags).toBeUndefined(); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); // version is considered conflict expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); @@ -548,28 +459,19 @@ export default ({ getService }: FtrProviderContext): void => { // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update // and scalar array field update does not have a conflict const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); - expect(reviewResponse.rules[0].diff.fields).toEqual({ - tags: { - current_version: ['one', 'two', 'four'], - target_version: ['one', 'two', 'five'], - merged_version: ['one', 'two', 'five'], - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, - version: { - current_version: 1, - target_version: 2, - merged_version: 2, - diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, - conflict: ThreeWayDiffConflict.SOLVABLE, - has_update: true, - has_base_version: false, - }, + expect(reviewResponse.rules[0].diff.fields.tags).toEqual({ + current_version: ['one', 'two', 'four'], + target_version: ['one', 'two', 'five'], + merged_version: ['one', 'two', 'five'], + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: false, }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); - expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); // version + tags expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); From a5b26289f360ea8f833e93d46d3b26b9b936a4cf Mon Sep 17 00:00:00 2001 From: jpdjere Date: Thu, 25 Jul 2024 14:39:31 +0200 Subject: [PATCH 34/34] Remove type casting --- .../algorithms/multi_line_string_diff_algorithm.ts | 9 +++------ .../algorithms/scalar_array_diff_algorithm.ts | 8 ++------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts index 9cb326102ae6d..ab830d1b7fc14 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.ts @@ -38,8 +38,7 @@ export const multiLineStringDiffAlgorithm = ( const hasBaseVersion = baseVersion !== MissingVersion; const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ - hasBaseVersion, - baseVersion, + baseVersion: hasBaseVersion ? baseVersion : undefined, currentVersion, targetVersion, diffOutcome, @@ -66,15 +65,13 @@ interface MergeResult { } interface MergeArgs { - hasBaseVersion: boolean; - baseVersion: string | MissingVersion; + baseVersion: string | undefined; currentVersion: string; targetVersion: string; diffOutcome: ThreeWayDiffOutcome; } const mergeVersions = ({ - hasBaseVersion, baseVersion, currentVersion, targetVersion, @@ -104,7 +101,7 @@ const mergeVersions = ({ case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { // TS does not realize that in ABC scenario, baseVersion cannot be missing // Missing baseVersion scenarios were handled as -AA and -AB. - const mergedVersion = merge(currentVersion, baseVersion as string, targetVersion, { + const mergedVersion = merge(currentVersion, baseVersion ?? '', targetVersion, { stringSeparator: /(\S+|\s+)/g, // Retains all whitespace, which we keep to preserve formatting }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts index 3b69b7c73fa46..e990ad9aa7c33 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/scalar_array_diff_algorithm.ts @@ -40,7 +40,6 @@ export const scalarArrayDiffAlgorithm = ( const hasBaseVersion = baseVersion !== MissingVersion; const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ - hasBaseVersion, baseVersion: hasBaseVersion ? baseVersion : undefined, currentVersion, targetVersion, @@ -68,7 +67,6 @@ interface MergeResult { } interface MergeArgs { - hasBaseVersion: boolean; baseVersion: TValue[] | undefined; currentVersion: TValue[]; targetVersion: TValue[]; @@ -76,7 +74,6 @@ interface MergeArgs { } const mergeVersions = ({ - hasBaseVersion, baseVersion, currentVersion, targetVersion, @@ -108,10 +105,10 @@ const mergeVersions = ({ } case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { - const addedCurrent = difference(dedupedCurrentVersion, dedupedBaseVersion as TValue[]); + const addedCurrent = difference(dedupedCurrentVersion, dedupedBaseVersion); const removedCurrent = difference(dedupedBaseVersion, dedupedCurrentVersion); - const addedTarget = difference(dedupedTargetVersion, dedupedBaseVersion as TValue[]); + const addedTarget = difference(dedupedTargetVersion, dedupedBaseVersion); const removedTarget = difference(dedupedBaseVersion, dedupedTargetVersion); const bothAdded = union(addedCurrent, addedTarget); @@ -125,7 +122,6 @@ const mergeVersions = ({ mergeOutcome: ThreeWayMergeOutcome.Merged, }; } - // Scenario -AB is treated as scenario ABC, but marked as // SOLVABLE, and returns the target version as the merged version // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293