Skip to content

Commit 1772cb8

Browse files
authored
Add support for IaC realtime (AST-102219) (#883)
* Add support for IaC realtime scanning and update related constants and tests (AST-102219) * Enable ScanContainersRealtime test case
1 parent 664b3ed commit 1772cb8

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

src/main/iacRealtime/CxIac.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import {CxRealtimeEngineStatus} from "../oss/CxRealtimeEngineStatus";
2+
3+
export default class CxIacResult {
4+
title: string;
5+
description: string;
6+
similarityID: string;
7+
filepath: string;
8+
severity: CxRealtimeEngineStatus;
9+
locations: { line: number, startIndex: number, endIndex: number }[];
10+
11+
static parseResult(resultObject: any): CxIacResult[] {
12+
let iacResults: CxIacResult[] = [];
13+
if (resultObject instanceof Array) {
14+
iacResults = resultObject.map((member: any) => {
15+
const iacResult = new CxIacResult();
16+
iacResult.title = member.Title;
17+
iacResult.description = member.Description;
18+
iacResult.similarityID = member.SimilarityID;
19+
iacResult.filepath = member.FilePath;
20+
iacResult.severity = member.Severity as CxRealtimeEngineStatus;
21+
iacResult.locations = Array.isArray(member.Locations)
22+
? member.Locations.map((l: any) => ({
23+
line: l.Line,
24+
startIndex: l.StartIndex,
25+
endIndex: l.EndIndex,
26+
}))
27+
: [];
28+
return iacResult;
29+
});
30+
} else {
31+
const iacResult = new CxIacResult();
32+
iacResult.title = resultObject.Title;
33+
iacResult.description = resultObject.Description;
34+
iacResult.severity = resultObject.Severity;
35+
iacResult.filepath = resultObject.FilePath;
36+
iacResult.filepath = resultObject.FilePath;
37+
iacResult.locations = Array.isArray(resultObject.Locations)
38+
? resultObject.Locations.map((l: any) => ({
39+
line: l.Line,
40+
startIndex: l.StartIndex,
41+
endIndex: l.EndIndex,
42+
}))
43+
: [];
44+
iacResults.push(iacResult);
45+
}
46+
return iacResults;
47+
}
48+
}

src/main/wrapper/CxConstants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export enum CxConstants {
7676
CMD_OSS = "oss-realtime",
7777
CMD_SECRETS = "secrets-realtime",
7878
CMD_CONTAINERS_REALTIME = "containers-realtime",
79+
CMD_IAC_REALTIME = "iac-realtime",
7980
PROJECT_ID = "--project-id",
8081
SIMILARITY_ID = "--similarity-id",
8182
QUERY_ID = "--query-id",
@@ -92,6 +93,7 @@ export enum CxConstants {
9293
SCAN_TYPE = "CxScan",
9394
SCAN_ASCA = "CxAsca",
9495
SCAN_OSS = "CxOss",
96+
SCAN_IAC = "CxIac",
9597
SCAN_SECRETS = "CxSecrets",
9698
SCAN_CONTAINERS_REALTIME = "CxContainersRealtime",
9799
PROJECT_TYPE = "CxProject",

src/main/wrapper/CxWrapper.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,13 @@ export class CxWrapper {
175175
return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_CONTAINERS_REALTIME);
176176
}
177177

178+
async iacRealtimeScanResults(sourceFile: string, engine: string): Promise<CxCommandOutput> {
179+
const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_IAC_REALTIME, CxConstants.SOURCE, sourceFile, CxConstants.ENGINE, engine];
180+
commands.push(...this.initializeCommands(false));
181+
const exec = new ExecutionService();
182+
return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_IAC);
183+
}
184+
178185
async secretsScanResults(sourceFile: string, ignoredFilePath?: string): Promise<CxCommandOutput> {
179186
const commands: string[] = [
180187
CxConstants.CMD_SCAN,

src/main/wrapper/ExecutionService.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import CxAsca from "../asca/CxAsca";
2626
import CxOssResult from "../oss/CxOss";
2727
import CxSecretsResult from "../secrets/CxSecrets";
2828
import CxContainerRealtimeResult from "../containersRealtime/CxContainerRealtime";
29+
import CxIacResult from "../iacRealtime/CxIac";
2930

3031
let skipValue = false;
3132
const fileSourceFlag = "--file-source"
@@ -212,6 +213,10 @@ export class ExecutionService {
212213
const oss = CxOssResult.parseResult(resultObject);
213214
cxCommandOutput.payload = [oss];
214215
break;
216+
case CxConstants.SCAN_IAC:
217+
const iac = CxIacResult.parseResult(resultObject);
218+
cxCommandOutput.payload = [iac];
219+
break;
215220
case CxConstants.SCAN_CONTAINERS_REALTIME:
216221
const images = CxContainerRealtimeResult.parseResult(resultObject);
217222
cxCommandOutput.payload = [images];

src/tests/ScanTest.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,21 @@ describe("ScanCreate cases", () => {
227227
expect(cxCommandOutput.exitCode).toBe(0);
228228
});
229229

230-
it.skip('ScanContainersRealtime Successful case', async () => {
230+
it('ScanContainersRealtime Successful case', async () => {
231231
const wrapper = new CxWrapper(cxScanConfig);
232232
const cxCommandOutput: CxCommandOutput = await wrapper.containersRealtimeScanResults("src/tests/data/Dockerfile");
233233
console.log("Json object from scanContainersRealtime successful case: " + JSON.stringify(cxCommandOutput));
234234
expect(cxCommandOutput.payload).toBeDefined();
235235
expect(cxCommandOutput.exitCode).toBe(0);
236236
});
237237

238+
it.skip('ScanIacRealtime Successful case', async () => {
239+
const wrapper = new CxWrapper(cxScanConfig);
240+
const cxCommandOutput: CxCommandOutput = await wrapper.iacRealtimeScanResults("src/tests/data/Dockerfile", "docker");
241+
console.log("Json object from scanIacRealtime successful case: " + JSON.stringify(cxCommandOutput));
242+
expect(cxCommandOutput.payload).toBeDefined();
243+
expect(cxCommandOutput.exitCode).toBe(0);
244+
});
245+
238246
});
239247

0 commit comments

Comments
 (0)