blob: 6b648045900beab264c93533a5347e0fb943cd47 [file] [log] [blame]
Alex Savatieiev5118de02019-02-20 15:50:42 -06001import argparse
2import os
3import sys
Alex Savatieieve9613992019-02-21 18:20:35 -06004import traceback
Alex Savatieiev06ab17d2019-02-26 18:40:48 -06005
Alex Savatieiev799bee32019-02-20 17:19:26 -06006from logging import INFO, DEBUG
Alex Savatieiev5118de02019-02-20 15:50:42 -06007
Alex Savatieievc9055712019-03-01 14:43:56 -06008from cfg_checker.common.exception import CheckerException
9from cfg_checker.common import config, logger, logger_cli
Alex Savatieiev06ab17d2019-02-26 18:40:48 -060010
Alex Savatieiev5118de02019-02-20 15:50:42 -060011
12pkg_dir = os.path.dirname(__file__)
13pkg_dir = os.path.normpath(pkg_dir)
14
Alex Savatieiev9c642112019-02-26 13:55:43 -060015commands = {
16 'packages': ['report'],
17 'network': ['check', 'report'],
18 'reclass': ['list', 'diff']
19}
Alex Savatieiev5118de02019-02-20 15:50:42 -060020
21class MyParser(argparse.ArgumentParser):
22 def error(self, message):
23 sys.stderr.write('Error: {0}\n\n'.format(message))
24 self.print_help()
25
26
Alex Savatieiev5118de02019-02-20 15:50:42 -060027def help_message():
28 print"""
29 Please, use following examples to generate info reports:\n
30 cfg_checker packages report\n
31 cfg_checker network check\n
32 cfg_checker network report\n
33 """
34 return
35
Alex Savatieiev9c642112019-02-26 13:55:43 -060036
Alex Savatieiev5118de02019-02-20 15:50:42 -060037def config_check_entrypoint():
Alex Savatieiev9c642112019-02-26 13:55:43 -060038 """
39 Main entry point. Uses nested parsers structure
40 with a default function to execute the comand
41
42 :return: - no return value
43 """
Alex Savatieiev4c406322019-02-28 17:37:09 -060044 # Main entrypoint
45 parser = MyParser(prog="# Mirantis Cloud configuration checker")
Alex Savatieiev9c642112019-02-26 13:55:43 -060046
47 # Parsers (each parser can have own arguments)
48 # - subparsers (command)
49 # |- pkg_parser
50 # | - pkg_subparsers (type)
51 # | - pkg_report_parser (default func - pkg_check)
52 # |- net_parser
53 # | - net_subparsers (type)
54 # | - net_check_parser (default func - net_check)
55 # | - net_report_parser (default func - net_report)
56 # - reclass_parser
57 # - reclass_list (default func - reclass_list)
58 # - reclass_compare (default func - reclass_diff)
59
Alex Savatieiev799bee32019-02-20 17:19:26 -060060 parser.add_argument(
61 "-d",
62 "--debug",
63 action="store_true", default=False,
64 help="Set CLI logging level to DEBUG"
65 )
Alex Savatieiev9c642112019-02-26 13:55:43 -060066 parser.add_argument(
Alex Savatieiev63576832019-02-27 15:46:26 -060067 '-s',
68 '--sudo',
69 action='store_true', default=True,
70 help="Use sudo for getting salt creds"
71 )
Alex Savatieiev5118de02019-02-20 15:50:42 -060072 subparsers = parser.add_subparsers(dest='command')
73 # packages
74 pkg_parser = subparsers.add_parser(
75 'packages',
76 help="Package versions check (Candidate vs Installed)"
77 )
78 pkg_subparsers = pkg_parser.add_subparsers(dest='type')
79
80 pkg_report_parser = pkg_subparsers.add_parser(
81 'report',
82 help="Report package versions to HTML file"
83 )
Alex41485522019-04-12 17:26:18 -050084 pkg_report_parser.add_argument(
85 '--full',
Alex682e7df2019-04-12 17:51:55 -050086 action="store_true", default=False,
Alex41485522019-04-12 17:26:18 -050087 help="HTML report will have all of the packages, not just errors"
88 )
89 pkg_report_parser.add_argument(
90 '--html',
91 metavar='packages_html_filename',
92 help="HTML filename to save report"
93 )
94 pkg_report_parser.add_argument(
95 '--csv',
96 metavar='packages_csv_filename',
97 help="CSV filename to save report"
98 )
Alex Savatieiev5118de02019-02-20 15:50:42 -060099
100 # networking
101 net_parser = subparsers.add_parser(
102 'network',
Alex Savatieiev9c642112019-02-26 13:55:43 -0600103 help="Network infrastructure checks and reports"
Alex Savatieiev5118de02019-02-20 15:50:42 -0600104 )
105 net_subparsers = net_parser.add_subparsers(dest='type')
106
107 net_check_parser = net_subparsers.add_parser(
108 'check',
109 help="Do network check and print the result"
110 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600111
112 net_report_parser = net_subparsers.add_parser(
113 'report',
114 help="Generate network check report"
115 )
Alex41485522019-04-12 17:26:18 -0500116
117 net_report_parser.add_argument(
118 '--html',
119 metavar='network_html_filename',
120 help="HTML filename to save report"
121 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600122
Alex Savatieiev9c642112019-02-26 13:55:43 -0600123 # reclass
124 reclass_parser = subparsers.add_parser(
125 'reclass',
126 help="Reclass related checks and reports"
127 )
128 reclass_subparsers = reclass_parser.add_subparsers(dest='type')
129 reclass_list_parser = reclass_subparsers.add_parser(
130 'list',
131 help="List models available to compare"
132 )
Alex Savatieiev06ab17d2019-02-26 18:40:48 -0600133 reclass_list_parser.add_argument(
134 "-p",
135 "--models-path",
136 default="/srv/salt/",
137 help="Global path to search models in"
138 )
Alex Savatieiev9c642112019-02-26 13:55:43 -0600139
140 reclass_diff_parser = reclass_subparsers.add_parser(
141 'diff',
142 help="List models available to compare"
143 )
Alex Savatieiev06ab17d2019-02-26 18:40:48 -0600144 reclass_diff_parser.add_argument(
145 "--model1",
146 required=True,
147 help="Model A <path>. Model name is the folder name"
148 )
149 reclass_diff_parser.add_argument(
150 "--model2",
151 required=True,
152 help="Model B <path>. Model name is the folder name"
153 )
Alex41485522019-04-12 17:26:18 -0500154 reclass_diff_parser.add_argument(
155 '--html',
156 metavar='reclass_html_filename',
157 help="HTML filename to save report"
158 )
159
Alex Savatieiev06ab17d2019-02-26 18:40:48 -0600160
Alex Savatieiev9c642112019-02-26 13:55:43 -0600161
Alex Savatieiev5118de02019-02-20 15:50:42 -0600162 #parse arguments
Alex Savatieiev9c642112019-02-26 13:55:43 -0600163 try:
164 args = parser.parse_args()
165 except TypeError as e:
Alex Savatieievc9055712019-03-01 14:43:56 -0600166 logger_cli.info("\n# Please, check arguments")
Alex Savatieiev9c642112019-02-26 13:55:43 -0600167 return
Alex Savatieiev5118de02019-02-20 15:50:42 -0600168
Alex Savatieiev63576832019-02-27 15:46:26 -0600169 # Pass externally configured values
170 config.ssh_uses_sudo = args.sudo
171
Alex Savatieiev799bee32019-02-20 17:19:26 -0600172 # Handle options
173 if args.debug:
174 logger_cli.setLevel(DEBUG)
175 else:
176 logger_cli.setLevel(INFO)
177
Alex Savatieiev9c642112019-02-26 13:55:43 -0600178 # Validate the commands
179 # check command
180 if args.command not in commands:
Alex Savatieievc9055712019-03-01 14:43:56 -0600181 logger_cli.info("\n# Please, type a command listed above")
Alex Savatieiev9c642112019-02-26 13:55:43 -0600182 return
183 elif args.type not in commands[args.command]:
184 # check type
185 logger_cli.info(
Alex Savatieievc9055712019-03-01 14:43:56 -0600186 "\n# Please, select '{}' command type listed above".format(
Alex Savatieiev9c642112019-02-26 13:55:43 -0600187 args.command
188 )
189 )
190 return
191 else:
192 # form function name to call
Alex Savatieievc9055712019-03-01 14:43:56 -0600193 _method_name = "do_" + args.type
194 _target_module = __import__("cfg_checker.modules."+args.command, fromlist=[""])
195 _method = getattr(_target_module, _method_name)
Alex Savatieiev9c642112019-02-26 13:55:43 -0600196
Alex Savatieiev5118de02019-02-20 15:50:42 -0600197 # Execute the command
Alex Savatieiev9c642112019-02-26 13:55:43 -0600198 result = _method(args)
Alex Savatieiev5118de02019-02-20 15:50:42 -0600199
200 logger.debug(result)
Alex Savatieiev5118de02019-02-20 15:50:42 -0600201
Alex Savatieiev4c406322019-02-28 17:37:09 -0600202def cli_main():
Alex Savatieieve47f7f42019-02-20 16:41:23 -0600203 try:
204 config_check_entrypoint()
Alex Savatieiev63576832019-02-27 15:46:26 -0600205 except CheckerException as e:
Alex Savatieiev06ab17d2019-02-26 18:40:48 -0600206 logger_cli.error("\nERROR: {}".format(
207 e.message
208 ))
209
Alex Savatieieve9613992019-02-21 18:20:35 -0600210 exc_type, exc_value, exc_traceback = sys.exc_info()
Alex Savatieiev06ab17d2019-02-26 18:40:48 -0600211 logger_cli.debug("\n{}".format(
Alex Savatieieve9613992019-02-21 18:20:35 -0600212 "".join(traceback.format_exception(
213 exc_type,
214 exc_value,
215 exc_traceback
216 ))
217 ))
Alex Savatieiev4c406322019-02-28 17:37:09 -0600218
219if __name__ == '__main__':
220 cli_main()