From 8925d81ff898fb36109193a5942c54fc312637c1 Mon Sep 17 00:00:00 2001 From: Ron Tal Date: Wed, 10 Mar 2021 18:29:12 +0200 Subject: [PATCH] fix: terraform plan parse bug --- .../parsers/terraform-plan-parser.ts | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/cli/commands/test/iac-local-execution/parsers/terraform-plan-parser.ts b/src/cli/commands/test/iac-local-execution/parsers/terraform-plan-parser.ts index 71555d3805..53f8caa917 100644 --- a/src/cli/commands/test/iac-local-execution/parsers/terraform-plan-parser.ts +++ b/src/cli/commands/test/iac-local-execution/parsers/terraform-plan-parser.ts @@ -30,14 +30,14 @@ function terraformPlanReducer( function extractRootModuleResources( terraformPlanJson: TerraformPlanJson, ): Array { - return terraformPlanJson?.planned_values?.root_module?.resources; + return terraformPlanJson?.planned_values?.root_module?.resources || []; } function extractChildModulesResources( terraformPlanJson: TerraformPlanJson, ): Array { const childModules = - terraformPlanJson?.planned_values?.root_module?.child_modules; + terraformPlanJson?.planned_values?.root_module?.child_modules || []; const extractedChildModuleResources = childModules.flatMap( (childModule) => childModule.resources, ); @@ -47,23 +47,35 @@ function extractChildModulesResources( export function tryParsingTerraformPlan( terraformPlanFile: IacFileData, ): Array { - // TODO: Handle failed parses with a meaningfull error message - const terraformPlanJson = JSON.parse( - terraformPlanFile.fileContent, - ) as TerraformPlanJson; + let terraformPlanJson; + try { + terraformPlanJson = JSON.parse( + terraformPlanFile.fileContent, + ) as TerraformPlanJson; + } catch (err) { + throw new Error('Failed to parse Terraform plan JSON file.'); + } + + try { + const rootModuleResources = extractRootModuleResources(terraformPlanJson); + const childModuleResources = extractChildModulesResources( + terraformPlanJson, + ); + const parsedInput = [ + ...rootModuleResources, + ...childModuleResources, + ].reduce(terraformPlanReducer, { resource: {}, data: {} }); - // TODO: Handle missing fields in plan json with a meaningfull error message - const rootModuleResources = extractRootModuleResources(terraformPlanJson); - const childModuleResources = extractChildModulesResources(terraformPlanJson); - const parsedInput = [ - ...rootModuleResources, - ...childModuleResources, - ].reduce(terraformPlanReducer, { resource: {}, data: {} }); - return [ - { - ...terraformPlanFile, - jsonContent: parsedInput, - engineType: EngineType.Terraform, - }, - ]; + return [ + { + ...terraformPlanFile, + jsonContent: parsedInput, + engineType: EngineType.Terraform, + }, + ]; + } catch (err) { + throw new Error( + 'Failed to extract resources from Terraform plan JSON file.', + ); + } }