rename gatechecks and project_config
[releng-anteater.git] / anteater / src / get_lists.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 ##############################################################################
4 # Copyright (c) 2017 Luke Hinds <lhinds@redhat.com>, Red Hat
5 #
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
11
12 """
13     Gathers various values from the gate check yaml file and return them to the
14     calling instance
15 """
16
17 import anteater.utils.anteater_logger as antlog
18 import ConfigParser
19 import copy
20 import os
21 import yaml
22 import re
23
24 config = ConfigParser.RawConfigParser()
25 config.read('anteater.conf')
26 logger = antlog.Logger(__name__).getLogger()
27 master_list = config.get('config', 'master_list')
28
29 with open(master_list, 'r') as f:
30     yl = yaml.safe_load(f)
31
32
33 def _remove_nullvalue(contents):
34     if contents and len(contents) > 2 and 'nullvalue' in contents:
35         contents.remove('nullvalue')
36
37
38 def _merge(org, ded):
39     ret = copy.deepcopy(org)
40     for key in list(set([k for k in org] + [k for k in ded])):
41         if key in org and key in ded:
42             ret[key] = list(set(ret[key] + ded[key]))
43             _remove_nullvalue(ret[key])
44         elif key in ded:
45             ret[key] = ded[key]
46     return ret
47
48
49 class GetLists(object):
50     def __init__(self, *args):
51         # Placeholder for future args if more filters are needed
52         self.args = args
53         self.loaded = False
54
55     def load_project_exception_file(self, project_exceptions, project):
56         if self.loaded:
57             return
58         exception_file = None
59         for item in project_exceptions:
60             if project in item:
61                 exception_file = item.get(project)
62         if exception_file is not None:
63             with open(exception_file, 'r') as f:
64                 ex = yaml.safe_load(f)
65             for key in ex:
66                 if key in yl:
67                     yl[key][project] = _merge(yl[key][project], ex.get(key, None)) \
68                             if project in yl[key] else ex.get(key, None)
69             self.loaded = True
70
71     def binary_list(self, project):
72         project_list = False
73         self.load_project_exception_file(yl.get('project_exceptions'), project)
74         try:
75             default_list = (yl['binaries']['binary_ignore'])
76         except KeyError:
77             logger.error('Key Error processing binary list values')
78         try:
79             project_list = (yl['binaries'][project]['binary_ignore'])
80         except KeyError:
81             logger.info('No binary waivers found for {0}'.
82                         format(project))
83
84         binary_re = re.compile("|".join(default_list),
85                 flags=re.IGNORECASE)
86
87         if project_list:
88             binary_project_re = re.compile("|".join(project_list),
89                                            flags=re.IGNORECASE)
90             return binary_re, binary_project_re
91         else:
92             binary_project_re = re.compile("")
93             return binary_re, binary_project_re
94
95     def file_audit_list(self, project):
96         project_list = False
97         self.load_project_exception_file(yl.get('project_exceptions'), project)
98         try:
99             default_list = set((yl['file_audits']['file_names']))
100         except KeyError:
101             logger.error('Key Error processing file_names list values')
102         try:
103             project_list = set((yl['file_audits'][project]['file_names']))
104             logger.info('file_names waivers found for {0}'.
105                         format(project))
106         except KeyError:
107             logger.info('No file_names waivers found for {0}'.
108                         format(project))
109
110         file_names_re = re.compile("|".join(default_list),
111                                    flags=re.IGNORECASE)
112
113         if project_list:
114             file_names_proj_re = re.compile("|".join(project_list),
115                                             flags=re.IGNORECASE)
116             return file_names_re, file_names_proj_re
117         else:
118             file_names_proj_re = re.compile("")
119             return file_names_re, file_names_proj_re
120
121     def file_content_list(self,  project):
122         project_list = False
123         self.load_project_exception_file(yl.get('project_exceptions'), project)
124         try:
125             default_list = set((yl['file_audits']['file_contents']))
126         except KeyError:
127             logger.error('Key Error processing file_contents list values')
128         try:
129             project_list = set((yl['file_audits'][project]['file_contents']))
130         except KeyError:
131             logger.info('No file_contents waivers found  for {0}'.
132                         format(project))
133
134         file_contents_re = re.compile("|".join(default_list),
135                                       flags=re.IGNORECASE)
136
137         if project_list:
138             file_contents_proj_re = re.compile("|".join(project_list),
139                                                flags=re.IGNORECASE)
140             return file_contents_re, file_contents_proj_re
141         else:
142             file_contents_proj_re = re.compile("")
143             return file_contents_re, file_contents_proj_re
144
145     def licence_extensions(self):
146         try:
147             licence_extensions = (yl['licence']['licence_ext'])
148         except KeyError:
149             logger.error('Key Error processing licence_extensions list values')
150         return licence_extensions
151
152     def licence_ignore(self):
153         try:
154             licence_ignore = (yl['licence']['licence_ignore'])
155         except KeyError:
156             logger.error('Key Error processing licence_ignore list values')
157         return licence_ignore