def run(self, root_folder=None, external_checks_dir=None, files=None, runner_filter=RunnerFilter(), collect_skip_comments=True): report = Report(self.check_type) self.tf_definitions = {} parsing_errors = {} if external_checks_dir: for directory in external_checks_dir: resource_registry.load_external_checks(directory, runner_filter) if files: files = [os.path.abspath(file) for file in files] for file in files: if file.endswith(".json"): tf_definitions, template_lines = parse_tf_plan(file) self.tf_definitions = tf_definitions self.template_lines = template_lines self.check_tf_definition(report, runner_filter) report.add_parsing_errors(parsing_errors.keys()) return report
def test_tags_values_are_flattened(self): current_dir = os.path.dirname(os.path.realpath(__file__)) valid_plan_path = current_dir + "/resources/plan_tags/tfplan.json" tf_definitions, _ = parse_tf_plan(valid_plan_path) file_resource_definition = next(iter(tf_definitions.values()))['resource'][0] resource_definition = next(iter(file_resource_definition.values())) resource_attributes = next(iter(resource_definition.values())) resource_tags = resource_attributes['tags'][0] for tag_key, tag_value in resource_tags.items(): if tag_key not in ['start_line', 'end_line']: self.assertIsInstance(tag_value, str)
def run(self, root_folder=None, external_checks_dir=None, files=None, runner_filter=RunnerFilter(), collect_skip_comments=True): report = Report(self.check_type) self.tf_definitions = {} parsing_errors = {} if external_checks_dir: for directory in external_checks_dir: resource_registry.load_external_checks(directory, runner_filter) if root_folder: files = [] if not files else files for root, d_names, f_names in os.walk(root_folder): for file in f_names: file_ending = os.path.splitext(file)[1] if file_ending == '.json': try: with open(f'{root}/{file}') as f: content = json.load(f) if isinstance( content, dict) and content.get('terraform_version'): files.append(os.path.join(root, file)) except Exception as e: logging.debug( f'Failed to load json file {root}/{file}, skipping' ) logging.debug('Failure message:') logging.debug(e, stack_info=True) if files: files = [os.path.abspath(file) for file in files] for file in files: if file.endswith(".json"): tf_definitions, template_lines = parse_tf_plan(file) if not tf_definitions: continue self.tf_definitions = tf_definitions self.template_lines = template_lines self.check_tf_definition(report, runner_filter) else: logging.debug( f'Failed to load {file} as is not a .json file, skipping' ) report.add_parsing_errors(parsing_errors.keys()) return report
def run(self, root_folder: Optional[str] = None, external_checks_dir: Optional[List[str]] = None, files: Optional[List[str]] = None, runner_filter: RunnerFilter = RunnerFilter(), collect_skip_comments: bool = True) -> Report: report = Report(self.check_type) self.tf_definitions = {} parsing_errors = {} if external_checks_dir: for directory in external_checks_dir: resource_registry.load_external_checks(directory) self.graph_registry.load_external_checks(directory) if root_folder: files = [] if not files else files for root, d_names, f_names in os.walk(root_folder): filter_ignored_paths(root, d_names, runner_filter.excluded_paths) filter_ignored_paths(root, f_names, runner_filter.excluded_paths) for file in f_names: file_ending = os.path.splitext(file)[1] if file_ending == '.json': try: with open(f'{root}/{file}') as f: content = json.load(f) if isinstance( content, dict) and content.get('terraform_version'): files.append(os.path.join(root, file)) except Exception as e: logging.debug( f'Failed to load json file {root}/{file}, skipping' ) logging.debug('Failure message:') logging.debug(e, stack_info=True) if files: files = [os.path.abspath(file) for file in files] for file in files: if file.endswith(".json"): tf_definitions, template_lines = parse_tf_plan(file) if not tf_definitions: continue self.tf_definitions = tf_definitions self.template_lines = template_lines self.check_tf_definition(report, runner_filter) else: logging.debug( f'Failed to load {file} as is not a .json file, skipping' ) report.add_parsing_errors(parsing_errors.keys()) if self.tf_definitions: graph = self.graph_manager.build_graph_from_definitions( self.tf_definitions, render_variables=False) self.graph_manager.save_graph(graph) graph_report = self.get_graph_checks_report( root_folder, runner_filter) merge_reports(report, graph_report) return report
def test_more_tags_values_are_flattened(self): current_dir = os.path.dirname(os.path.realpath(__file__)) valid_plan_path = current_dir + "/resources/plan_tags_variety/tfplan.json" tf_definitions, _ = parse_tf_plan(valid_plan_path) # TODO: this should also verify the flattening but at least shows it parses now. assert True