[TIC-CORE] Set the default installation packages
[archive/20170607/tools/tic-core.git] / tic / parser / view_parser.py
1 import logging
2 from operator import itemgetter
3 from tic.utils.rpmmisc import meetRequireVersion
4
5
6 def make_view_data(pkg_group):
7     logger = logging.getLogger(__name__)
8     
9     def _select_provide_rpm(capability, require):
10         provide_list = []
11         if require.get('ver') is not None:
12             for provide in capability:
13                 ver_data = provide['data']
14                 if not ver_data.get('ver'):
15                     ver_data = pkg_dict.get(provide['name']).get('version')
16                 if meetRequireVersion(require, ver_data):
17                     provide_list.append(provide)
18         else:
19             provide_list = capability
20             
21         result = []
22         for provide in provide_list:
23             result.append(pkg_dict[provide['name']])
24             
25         return result
26     
27     def set_meta_require(meta_info):
28         meta_nodes = meta_info.get('nodes')
29         for child_meta in meta_nodes:
30             refer_count[child_meta['id']] += 1
31             set_meta_require(child_meta)
32             
33         pkg_info = pkg_dict[meta_info['text']]
34         for dep_tag in ['requires', 'recommends']:
35             if pkg_info.get(dep_tag):
36                 for req in pkg_info.get(dep_tag):
37                     targets = []
38                     if req['name'] in provides:
39                         targets = _select_provide_rpm(provides[req['name']], req)
40                     elif req['name'] in files:
41                         targets.append(pkg_dict.get(files[req['name']][0]))
42                     elif req['name'] in pkg_dict:
43                         targets.append(pkg_dict.get(req['name']))
44                     else:
45                         # the dependent package does not exist.
46                         pass
47                         
48                     for pkg in targets:
49                         # The meta-pkg of the other group are excluded.
50                         if not pkg.get('meta'):
51                             refer_count[pkg['id']] += 1
52                             meta_nodes.append(make_node(pkg))
53                 
54     def make_node(pkg_info):
55         return dict(id=pkg_info['id'], text=pkg_info['name'], nodes=[])
56             
57     # view_data for tree view on web-ui
58     view_data = []
59     # temporary dictionary for referencing meta
60     view_ref = {}
61     
62     if not pkg_group:
63         return view_data
64       
65     pkg_dict = pkg_group['pkg_dict']
66     provides = pkg_group['provides']
67     files = pkg_group['files']
68     refer_count = [0] * len(pkg_dict)
69     
70     # sort by pkg_name ([0]:name, [1]:root, [2]:sub1)
71     meta_info = pkg_group.get('meta_info')
72     meta_info['root'] = sorted(meta_info['root'], key=itemgetter(0))
73     meta_info['sub1'] = sorted(meta_info['sub1'], key=itemgetter(0))
74     meta_info['sub2'] = sorted(meta_info['sub2'], key=itemgetter(0))
75     
76     # make tree of meta
77     for root in meta_info['root']:
78         root_node = make_node(pkg_dict[root[0]])
79         view_ref[root[0]] = root_node
80         view_data.append(root_node)
81         
82     for sub1 in meta_info['sub1']:
83         sub1_node = make_node(pkg_dict[sub1[0]])
84         view_ref[sub1[0]] = sub1_node
85         # search root
86         if sub1[1] in view_ref:
87             # add to root node
88             view_ref[sub1[1]]['nodes'].append(sub1_node)
89         else:
90             # If root-meta does not exist, sub1 is added to top-level
91             view_data.append(sub1_node)
92             
93     for sub2 in meta_info['sub2']:
94         sub2_node = make_node(pkg_dict[sub2[0]])
95         view_ref[sub2[0]] = sub2_node
96         # search sub1
97         if sub2[2] in view_ref:
98             view_ref[sub2[2]]['nodes'].append(sub2_node)
99         # search root    
100         elif sub2[1] in view_ref: 
101             # If sub1-meta does not exist, sub2 is added to child of root-meta
102             view_ref[sub2[1]]['nodes'].append(sub2_node)
103         else:
104             # If root-meta/sub1-meta does not exist, sub1 is added to top-level
105             view_data.append(sub2_node)
106     
107     # configure meta dependency tree (requires)
108     for meta_pkg in view_data:
109         refer_count[meta_pkg['id']] += 1
110         set_meta_require(meta_pkg)
111     
112     #The remaining rpms are grouped into a MISC tree
113     misc_info = {}
114     misc_info['text'] = 'MISC'
115     misc_info['nodes'] = []
116     for k, v in pkg_dict.iteritems():
117         # Pkg is not referenced from Meta-pkg
118         if refer_count[v['id']] == 0:
119             misc_info['nodes'].append(make_node(v))
120             
121     logger.info('meta: %d, misc: %d', len(view_ref), len(misc_info['nodes']))
122     
123     view_data.append(misc_info)
124     
125     return view_data
126