5
5
TerraformPlanJson ,
6
6
TerraformPlanResource ,
7
7
ResourceActions ,
8
- VALID_RESOURCE_ACTIONS ,
8
+ VALID_RESOURCE_ACTIONS_FOR_DELTA_SCAN ,
9
+ VALID_RESOURCE_ACTIONS_FOR_FULL_SCAN ,
9
10
TerraformScanInput ,
10
11
TerraformPlanResourceChange ,
11
12
IaCErrorCodes ,
@@ -35,19 +36,26 @@ function terraformPlanReducer(
35
36
function resourceChangeReducer (
36
37
scanInput : TerraformScanInput ,
37
38
resource : TerraformPlanResourceChange ,
39
+ isFullScan : boolean ,
38
40
) : TerraformScanInput {
39
41
// TODO: investigate if we need to address also `after_unknown` field.
40
42
const { actions, after } = resource . change || { actions : [ ] , after : { } } ;
41
- if ( isValidResourceActions ( actions ) ) {
43
+ if ( isValidResourceActions ( actions , isFullScan ) ) {
42
44
const resourceForReduction = { ...resource , values : after || { } } ;
43
45
return terraformPlanReducer ( scanInput , resourceForReduction ) ;
44
46
}
45
47
46
48
return scanInput ;
47
49
}
48
50
49
- function isValidResourceActions ( action : ResourceActions ) : boolean {
50
- return VALID_RESOURCE_ACTIONS . some ( ( validAction : string [ ] ) => {
51
+ function isValidResourceActions (
52
+ action : ResourceActions ,
53
+ isFullScan : boolean ,
54
+ ) : boolean {
55
+ const VALID_ACTIONS = isFullScan
56
+ ? VALID_RESOURCE_ACTIONS_FOR_FULL_SCAN
57
+ : VALID_RESOURCE_ACTIONS_FOR_DELTA_SCAN ;
58
+ return VALID_ACTIONS . some ( ( validAction : string [ ] ) => {
51
59
if ( action . length !== validAction . length ) {
52
60
return false ;
53
61
}
@@ -57,56 +65,28 @@ function isValidResourceActions(action: ResourceActions): boolean {
57
65
} ) ;
58
66
}
59
67
60
- function extractRootModuleResources (
61
- terraformPlanJson : TerraformPlanJson ,
62
- ) : Array < TerraformPlanResource > {
63
- return terraformPlanJson . planned_values ?. root_module ?. resources || [ ] ;
64
- }
65
-
66
- function extractChildModulesResources (
67
- terraformPlanJson : TerraformPlanJson ,
68
- ) : Array < TerraformPlanResource > {
69
- const childModules =
70
- terraformPlanJson ?. planned_values ?. root_module ?. child_modules || [ ] ;
71
- const extractedChildModuleResources : Array < TerraformPlanResource > = [ ] ;
72
- childModules . forEach ( ( childModule ) =>
73
- childModule . resources . forEach ( ( resource ) =>
74
- extractedChildModuleResources . push ( resource ) ,
75
- ) ,
76
- ) ;
77
- return extractedChildModuleResources ;
78
- }
79
-
80
68
function extractResourceChanges (
81
69
terraformPlanJson : TerraformPlanJson ,
82
70
) : Array < TerraformPlanResourceChange > {
83
71
return terraformPlanJson . resource_changes || [ ] ;
84
72
}
85
73
86
- function extractResourcesForFullScan (
87
- terraformPlanJson : TerraformPlanJson ,
88
- ) : TerraformScanInput {
89
- const rootModuleResources = extractRootModuleResources ( terraformPlanJson ) ;
90
- const childModuleResources = extractChildModulesResources ( terraformPlanJson ) ;
91
- return [
92
- ...rootModuleResources ,
93
- ...childModuleResources ,
94
- ] . reduce ( terraformPlanReducer , { resource : { } , data : { } } ) ;
95
- }
96
-
97
- function extractResourcesForDeltaScan (
74
+ function extractResourcesForScan (
98
75
terraformPlanJson : TerraformPlanJson ,
76
+ isFullScan = false ,
99
77
) : TerraformScanInput {
100
78
const resourceChanges = extractResourceChanges ( terraformPlanJson ) ;
101
- return resourceChanges . reduce ( resourceChangeReducer , {
102
- resource : { } ,
103
- data : { } ,
104
- } ) ;
79
+ return resourceChanges . reduce (
80
+ ( memo , curr ) => resourceChangeReducer ( memo , curr , isFullScan ) ,
81
+ {
82
+ resource : { } ,
83
+ data : { } ,
84
+ } ,
85
+ ) ;
105
86
}
106
87
107
88
export function isTerraformPlan ( terraformPlanJson : TerraformPlanJson ) : boolean {
108
89
const missingRequiredFields =
109
- ! terraformPlanJson . planned_values ?. root_module ||
110
90
terraformPlanJson . resource_changes === undefined ;
111
91
return ! missingRequiredFields ;
112
92
}
@@ -117,14 +97,10 @@ export function tryParsingTerraformPlan(
117
97
{ isFullScan } : { isFullScan : boolean } = { isFullScan : false } ,
118
98
) : Array < IacFileParsed > {
119
99
try {
120
- const scannableInput = isFullScan
121
- ? extractResourcesForFullScan ( terraformPlanJson )
122
- : extractResourcesForDeltaScan ( terraformPlanJson ) ;
123
-
124
100
return [
125
101
{
126
102
...terraformPlanFile ,
127
- jsonContent : scannableInput ,
103
+ jsonContent : extractResourcesForScan ( terraformPlanJson , isFullScan ) ,
128
104
engineType : EngineType . Terraform ,
129
105
} ,
130
106
] ;
0 commit comments