blob: e9c312ef659927ca70f42e750eb3d8cfea07f695 [file] [log] [blame]
savex4448e132018-04-25 15:51:14 +02001import json
2import os
3import sys
4
5from copy import deepcopy
6
Alex Savatieievd48994d2018-12-13 12:13:00 +01007import reporter
Alex Savatieiev5118de02019-02-20 15:50:42 -06008
9from cfg_checker.common import utils, const
10from cfg_checker.common import config, logger, logger_cli, pkg_dir
11from cfg_checker.common import salt_utils
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060012from cfg_checker.nodes import SaltNodes, node_tmpl
savex4448e132018-04-25 15:51:14 +020013
14
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060015class CloudPackageChecker(SaltNodes):
savex4448e132018-04-25 15:51:14 +020016 def collect_installed_packages(self):
17 """
18 Collect installed packages on each node
19 sets 'installed' dict property in the class
20
21 :return: none
22 """
Alex Savatieiev799bee32019-02-20 17:19:26 -060023 logger_cli.info("### Collecting installed packages")
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060024 _result = self.execute_script("pkg_versions.py")
savex4448e132018-04-25 15:51:14 +020025
savex4448e132018-04-25 15:51:14 +020026 for key in self.nodes.keys():
27 # due to much data to be passed from salt, it is happening in order
28 if key in _result:
29 _text = _result[key]
30 _dict = json.loads(_text[_text.find('{'):])
31 self.nodes[key]['packages'] = _dict
32 else:
33 self.nodes[key]['packages'] = {}
Alex Savatieiev799bee32019-02-20 17:19:26 -060034 logger_cli.debug("# {} has {} packages installed".format(
savex4448e132018-04-25 15:51:14 +020035 key,
36 len(self.nodes[key]['packages'].keys())
37 ))
Alex Savatieiev799bee32019-02-20 17:19:26 -060038 logger_cli.info("-> Done")
savex4448e132018-04-25 15:51:14 +020039
40 def collect_packages(self):
41 """
42 Check package versions in repos vs installed
43
44 :return: no return values, all date put to dict in place
45 """
46 _all_packages = {}
47 for node_name, node_value in self.nodes.iteritems():
48 for package_name in node_value['packages']:
49 if package_name not in _all_packages:
50 _all_packages[package_name] = {}
51 _all_packages[package_name][node_name] = node_value
52
53 # TODO: process data for per-package basis
54
55 self.all_packages = _all_packages
56
57 def create_html_report(self, filename):
58 """
59 Create static html showing packages diff per node
60
61 :return: buff with html
62 """
Alex Savatieiev799bee32019-02-20 17:19:26 -060063 logger_cli.info("### Generating report to '{}'".format(filename))
Alex Savatieievd48994d2018-12-13 12:13:00 +010064 _report = reporter.ReportToFile(
65 reporter.HTMLPackageCandidates(),
savex4448e132018-04-25 15:51:14 +020066 filename
67 )
Alex Savatieiev36b938d2019-01-21 11:01:18 +010068 _report({
69 "nodes": self.nodes,
70 "diffs": {}
71 })
Alex Savatieiev799bee32019-02-20 17:19:26 -060072 logger_cli.info("-> Done")
savex4448e132018-04-25 15:51:14 +020073
74
Alex Savatieiev5118de02019-02-20 15:50:42 -060075if __name__ == '__main__':
76 # init connection to salt and collect minion data
77 cl = CloudPackageChecker()
savex4448e132018-04-25 15:51:14 +020078
Alex Savatieiev5118de02019-02-20 15:50:42 -060079 # collect data on installed packages
80 cl.collect_installed_packages()
savex4448e132018-04-25 15:51:14 +020081
Alex Savatieiev5118de02019-02-20 15:50:42 -060082 # diff installed and candidates
83 # cl.collect_packages()
savex4448e132018-04-25 15:51:14 +020084
Alex Savatieiev5118de02019-02-20 15:50:42 -060085 # report it
86 cl.create_html_report("./pkg_versions.html")
savex4448e132018-04-25 15:51:14 +020087
Alex Savatieiev5118de02019-02-20 15:50:42 -060088 sys.exit(0)