Skip to content

Commit b609684

Browse files
committed
Merge branch 'fix/CG-900' into 'master'
refactor(rulesEngine): Avoid rulemetada duplication Closes CG-900 See merge request auto-cloud/cloudgraph/sdk!54
2 parents 4f771a6 + 345b44d commit b609684

File tree

7 files changed

+21
-49
lines changed

7 files changed

+21
-49
lines changed

src/plugins/policyPack/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
StorageEngine,
1212
} from '../..'
1313
import RulesEngine from '../../rules-engine'
14-
import { Result, Severity } from '../../rules-engine/types'
14+
import { Result, Rule, Severity } from '../../rules-engine/types'
1515
import Plugin, { ConfiguredPlugin, PluginManager } from '../types'
1616

1717
export default class PolicyPackPlugin extends Plugin {
@@ -57,7 +57,7 @@ export default class PolicyPackPlugin extends Plugin {
5757
[policyPackName: string]: {
5858
engine: Engine
5959
entity: string
60-
rules: any
60+
rules: Rule[]
6161
}
6262
} = {}
6363

@@ -285,7 +285,7 @@ export default class PolicyPackPlugin extends Plugin {
285285
)
286286

287287
if (!isEmpty(results)) {
288-
this.displayResults(groupBy(results, 'severity'))
288+
this.displayResults(groupBy(results, 'rule.severity'))
289289

290290
this.logger.info(
291291
`For more information, you can query ${chalk.italic.green(

src/rules-engine/evaluators/js-evaluator.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,17 @@ export default class JsEvaluator implements RuleEvaluator<JsRule> {
1717
rule: JsRule,
1818
data: ResourceData
1919
): Promise<RuleFinding> {
20+
const { gql, check, resource, ...ruleMetadata } = rule
2021
const result = rule.check!(data)
2122
? RuleResult.MATCHES
2223
: RuleResult.DOESNT_MATCH
2324

2425
const finding = {
2526
id: `${rule.id}/${data.resource?.id}`,
26-
ruleId: rule.id,
2727
resourceId: data.resource?.id,
2828
result: result !== RuleResult.MATCHES ? Result.FAIL : Result.PASS,
29-
severity: rule.severity,
30-
description: rule.description,
31-
title: rule.title,
32-
rationale: rule.rationale,
33-
audit: rule.audit,
34-
remediation: rule.remediation,
35-
references: rule.references,
3629
typename: data.resource?.__typename, // eslint-disable-line no-underscore-dangle
30+
rule: ruleMetadata,
3731
} as RuleFinding
3832

3933
return finding

src/rules-engine/evaluators/json-evaluator.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ export default class JsonEvaluator implements RuleEvaluator<JsonRule> {
2222
rule: JsonRule,
2323
data: ResourceData
2424
): Promise<RuleFinding> {
25+
const { gql, conditions, resource, ...ruleMetadata } = rule
2526
const result = (await this.evaluateCondition(rule.conditions, data))
2627
? RuleResult.MATCHES
2728
: RuleResult.DOESNT_MATCH
2829

2930
const finding = {
3031
id: `${rule.id}/${data.resource?.id}`,
31-
ruleId: rule.id,
3232
resourceId: data.resource?.id,
3333
result: result !== RuleResult.MATCHES ? Result.FAIL : Result.PASS,
34-
severity: rule.severity,
35-
description: rule.description,
36-
title: rule.title,
37-
rationale: rule.rationale,
38-
audit: rule.audit,
39-
remediation: rule.remediation,
40-
references: rule.references,
4134
typename: data.resource?.__typename, // eslint-disable-line no-underscore-dangle
35+
rule: ruleMetadata,
4236
} as RuleFinding
4337

4438
return finding

src/rules-engine/evaluators/manual-evaluator.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,9 @@ export default class ManualEvaluator implements RuleEvaluator<JsonRule> {
99
async evaluateSingleResource(rule: Rule): Promise<RuleFinding> {
1010
return {
1111
id: `${rule.id}/manual`,
12-
ruleId: rule.id,
1312
result: Result.SKIPPED,
14-
severity: rule.severity,
15-
description: rule.description,
16-
title: rule.title,
17-
rationale: rule.rationale,
18-
audit: rule.audit,
19-
remediation: rule.remediation,
20-
references: rule.references,
2113
typename: 'manual',
14+
rule,
2215
} as RuleFinding
2316
}
2417
}

src/rules-engine/index.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,28 +209,36 @@ export default class RulesProvider implements Engine {
209209
MISSING
210210
SKIPPED
211211
}
212+
212213
type ${this.providerName}Findings @key(fields: "id") {
213214
id: String! @id
214215
${this.entityName}Findings: [${this.providerName}${
215216
this.entityName
216217
}Findings]
217218
}
218-
interface baseFinding {
219-
id: String! @id
220-
ruleId: String! @search(by: [hash, regexp])
221-
resourceId: String @search(by: [hash, regexp])
219+
220+
type ruleMetadata @key(fields: "id") {
221+
id: String! @id @search(by: [hash, regexp])
222222
severity: String! @search(by: [hash, regexp])
223223
description: String! @search(by: [hash, regexp])
224224
title: String @search(by: [hash, regexp])
225225
audit: String @search(by: [hash, regexp])
226226
rationale: String @search(by: [hash, regexp])
227227
remediation: String @search(by: [hash, regexp])
228228
references: [String] @search(by: [hash, regexp])
229+
findings: [baseFinding] @hasInverse(field: rule)
230+
}
231+
232+
interface baseFinding {
233+
id: String! @id
234+
resourceId: String @search(by: [hash, regexp])
235+
rule: [ruleMetadata] @hasInverse(field: findings)
229236
result: FindingsResult @search
230237
}
238+
231239
type ${this.providerName}${
232240
this.entityName
233-
}Findings implements baseFinding @key(fields: "id") {
241+
}Findings implements baseFinding @key(fields: "id") {
234242
findings: ${this.providerName}Findings @hasInverse(field: ${
235243
this.entityName
236244
}Findings)

src/rules-engine/types.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,8 @@ export interface Rule {
5353
}
5454
export interface RuleFinding {
5555
id: string
56-
title: string
57-
ruleId: string
5856
resourceId?: string
5957
result: Result
60-
severity: Severity
61-
description: string
62-
rationale?: string
63-
audit?: string
64-
remediation?: string
65-
references?: string[]
6658
typename: string
6759
}
6860

tests/rules-engine.test.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,19 @@ describe('RulesEngine', () => {
5555
})
5656

5757
it('Should pass preparing the mutations to insert findings data given a RuleFindings array', () => {
58-
const ruleId = cuid()
5958
const resourceId = cuid()
6059
const data = [
6160
{
6261
id: cuid(),
63-
ruleId,
6462
resourceId,
6563
result: Result.FAIL,
66-
severity: Severity.MEDIUM,
6764
typename: 'querySchemaA',
68-
description: '',
69-
title: '',
7065
},
7166
{
7267
id: cuid(),
73-
ruleId,
7468
resourceId,
7569
result: Result.PASS,
76-
severity: Severity.LOW,
7770
typename: 'querySchemaA',
78-
description: '',
79-
title: '',
8071
},
8172
]
8273

0 commit comments

Comments
 (0)