Esempio n. 1
0
    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
Esempio n. 2
0
 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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
 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