def run(self, root_folder, external_checks_dir=None, files=None, runner_filter=RunnerFilter(), collect_skip_comments=True, helmChart=None): report = Report(self.check_type) if self.context is None or self.definitions is None: if files or root_folder: self.definitions, self.definitions_raw = create_definitions( root_folder, files, runner_filter) else: return report if external_checks_dir: for directory in external_checks_dir: registry.load_external_checks(directory) self.graph_registry.load_external_checks(directory) self.context = build_definitions_context(self.definitions, self.definitions_raw) logging.info("creating kubernetes graph") local_graph = self.graph_manager.build_graph_from_definitions( self.definitions) for vertex in local_graph.vertices: file_abs_path = _get_entity_abs_path(root_folder, vertex.path) report.add_resource(f'{file_abs_path}:{vertex.id}') self.graph_manager.save_graph(local_graph) self.definitions = local_graph.definitions report = self.check_definitions(root_folder, runner_filter, report) graph_report = self.get_graph_checks_report(root_folder, runner_filter) merge_reports(report, graph_report) return report
def run(self, root_folder, external_checks_dir=None, files=None, runner_filter=RunnerFilter(), collect_skip_comments=True): report = Report(self.check_type) parsing_errors = {} self.load_external_checks(external_checks_dir) scan_hcl = should_scan_hcl_files() if self.context is None or self.definitions is None or self.breadcrumbs is None: self.definitions = {} logging.info( "Scanning root folder and producing fresh tf_definitions and context" ) if root_folder: root_folder = os.path.abspath(root_folder) local_graph, tf_definitions = self.graph_manager.build_graph_from_source_directory( source_dir=root_folder, local_graph_class=self.graph_class, download_external_modules=runner_filter. download_external_modules, external_modules_download_path=runner_filter. external_modules_download_path, parsing_errors=parsing_errors, excluded_paths=runner_filter.excluded_paths, vars_files=runner_filter.var_files) elif files: files = [os.path.abspath(file) for file in files] root_folder = os.path.split(os.path.commonprefix(files))[0] self.parser.evaluate_variables = False self._parse_files(files, scan_hcl, parsing_errors) local_graph = self.graph_manager.build_graph_from_definitions( self.definitions) else: raise Exception( "Root directory was not specified, files were not specified" ) for vertex in local_graph.vertices: if vertex.block_type == BlockType.RESOURCE: report.add_resource(f'{vertex.path}:{vertex.id}') self.graph_manager.save_graph(local_graph) self.definitions, self.breadcrumbs = convert_graph_vertices_to_tf_definitions( local_graph.vertices, root_folder) else: logging.info("Scanning root folder using existing tf_definitions") self.check_tf_definition(report, root_folder, runner_filter, collect_skip_comments) report.add_parsing_errors(list(parsing_errors.keys())) graph_report = self.get_graph_checks_report(root_folder, runner_filter) merge_reports(report, graph_report) report = remove_duplicate_results(report) return report
def run( self, root_folder: str, 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) parsing_errors = {} if self.context is None or self.definitions is None or self.breadcrumbs is None: self.definitions, self.definitions_raw = create_definitions( root_folder, files, runner_filter, parsing_errors) if external_checks_dir: for directory in external_checks_dir: cfn_registry.load_external_checks(directory) self.graph_registry.load_external_checks(directory) self.context = build_definitions_context(self.definitions, self.definitions_raw, root_folder) logging.info("creating cloudformation graph") local_graph = self.graph_manager.build_graph_from_definitions( self.definitions) for vertex in local_graph.vertices: if vertex.block_type == BlockType.RESOURCE: report.add_resource(f'{vertex.path}:{vertex.id}') self.graph_manager.save_graph(local_graph) self.definitions, self.breadcrumbs = convert_graph_vertices_to_definitions( local_graph.vertices, root_folder) # TODO: replace with real graph rendering for cf_file in self.definitions.keys(): file_definition = self.definitions.get(cf_file, None) file_definition_raw = self.definitions_raw.get(cf_file, None) if file_definition is not None and file_definition_raw is not None: cf_context_parser = ContextParser(cf_file, file_definition, file_definition_raw) logging.debug("Template Dump for {}: {}".format( cf_file, json.dumps(file_definition, indent=2, default=str))) cf_context_parser.evaluate_default_refs() report.add_parsing_errors(list(parsing_errors.keys())) # run checks self.check_definitions(root_folder, runner_filter, report) # run graph checks graph_report = self.get_graph_checks_report(root_folder, runner_filter) merge_reports(report, graph_report) return report