blob: 85d5b81d818a606c2fc8c1b2a09b47dfe35c4a23 [file] [log] [blame]
Alex0989ecf2022-03-29 13:43:21 -05001# Author: Alex Savatieiev (osavatieiev@mirantis.com; a.savex@gmail.com)
2# Copyright 2019-2022 Mirantis, Inc.
Alex Savatieievc9055712019-03-01 14:43:56 -06003import os
4
Alex Savatieievc9055712019-03-01 14:43:56 -06005from cfg_checker.common import logger_cli
Alex9a4ad212020-10-01 18:04:25 -05006from cfg_checker.common.settings import ENV_TYPE_LINUX
Alex Savatieievc9055712019-03-01 14:43:56 -06007from cfg_checker.helpers import args_utils
8from cfg_checker.reports import reporter
9
Alex3bc95f62020-03-05 17:00:04 -060010from . import comparer
Alex3ebc5632019-04-18 16:47:18 -050011
Alex3bc95f62020-03-05 17:00:04 -060012from . import validator
Alex3ebc5632019-04-18 16:47:18 -050013
Alexbab1efe2019-04-23 18:51:23 -050014command_help = "Reclass related checks and reports"
Alex9a4ad212020-10-01 18:04:25 -050015supported_envs = [ENV_TYPE_LINUX]
Alexbab1efe2019-04-23 18:51:23 -050016
17
18def init_parser(_parser):
19 # reclass subparsers
20 reclass_subparsers = _parser.add_subparsers(dest='type')
21 reclass_list_parser = reclass_subparsers.add_parser(
22 'list',
23 help="List models available to compare"
24 )
25 reclass_list_parser.add_argument(
26 "-p",
27 "--models-path",
28 default="/srv/salt/",
29 help="Global path to search models in"
30 )
31
32 reclass_diff_parser = reclass_subparsers.add_parser(
33 'diff',
34 help="List models available to compare"
35 )
36 reclass_diff_parser.add_argument(
37 "--model1",
38 required=True,
39 help="Model A <path>. Model name is the folder name"
40 )
41 reclass_diff_parser.add_argument(
42 "--model2",
43 required=True,
44 help="Model B <path>. Model name is the folder name"
45 )
46 reclass_diff_parser.add_argument(
47 '--html',
48 metavar='reclass_html_filename',
49 help="HTML filename to save report"
50 )
51
52 return _parser
53
Alex Savatieievc9055712019-03-01 14:43:56 -060054
Alex9a4ad212020-10-01 18:04:25 -050055def do_list(args, config):
56 # Check if there is supported env found
57 args_utils.check_supported_env(ENV_TYPE_LINUX, args, config)
58 # Start command
Alex Savatieievc9055712019-03-01 14:43:56 -060059 logger_cli.info("# Reclass list")
Alex41485522019-04-12 17:26:18 -050060 _arg_path = args_utils.get_arg(args, 'models_path')
61 logger_cli.info("-> Current path is: {}".format(_arg_path))
62 _path = args_utils.get_path_arg(_arg_path)
Alex3ebc5632019-04-18 16:47:18 -050063
64 logger_cli.info("# ...models path is '{}'".format(_path))
65
Alex Savatieievc9055712019-03-01 14:43:56 -060066 models = {}
67 for _folder in os.listdir(args.models_path):
68 # validate item as a model
69 _model_path = os.path.join(
70 args.models_path,
71 _folder
72 )
73 _validated = validator.basic_model_validation_by_path(_model_path)
Alex3ebc5632019-04-18 16:47:18 -050074
Alex Savatieievc9055712019-03-01 14:43:56 -060075 if not _validated:
76 logger_cli.info("-> '{}' not a valid model".format(_folder))
77 continue
78 else:
79 models[_folder] = _model_path
Alex3ebc5632019-04-18 16:47:18 -050080
Alex Savatieievc9055712019-03-01 14:43:56 -060081 logger_cli.info("-> '{}' at '{}'".format(_folder, _model_path))
Alex3ebc5632019-04-18 16:47:18 -050082
Alex Savatieievc9055712019-03-01 14:43:56 -060083 # TODO: collect info about the model
84
85 return
86
87
Alex9a4ad212020-10-01 18:04:25 -050088def do_diff(args, config):
89 # Check if there is supported env found
90 args_utils.check_supported_env(ENV_TYPE_LINUX, args, config)
91 # Start command
Alexb8af13a2019-04-16 18:38:12 -050092 logger_cli.info("# Reclass comparer (HTML report)")
Alex41485522019-04-12 17:26:18 -050093 _filename = args_utils.get_arg(args, 'html')
Alex Savatieievc9055712019-03-01 14:43:56 -060094 # checking folder params
95 _model1 = args_utils.get_path_arg(args.model1)
96 _model2 = args_utils.get_path_arg(args.model2)
Alex3ebc5632019-04-18 16:47:18 -050097
Alex Savatieievc9055712019-03-01 14:43:56 -060098 # Do actual compare using hardcoded model names
99 mComparer = comparer.ModelComparer()
100
101 mComparer.model_name_1 = os.path.split(_model1)[1]
102 mComparer.model_path_1 = _model1
103 mComparer.model_name_2 = os.path.split(_model2)[1]
104 mComparer.model_path_2 = _model2
Alex3ebc5632019-04-18 16:47:18 -0500105
Alex Savatieievc9055712019-03-01 14:43:56 -0600106 mComparer.load_model_tree(
107 mComparer.model_name_1,
108 mComparer.model_path_1
109 )
110 mComparer.load_model_tree(
111 mComparer.model_name_2,
112 mComparer.model_path_2
113 )
114
115 diffs = mComparer.generate_model_report_tree()
116
117 report = reporter.ReportToFile(
118 reporter.HTMLModelCompare(),
119 _filename
120 )
121 logger_cli.info("# Generating report to {}".format(_filename))
122 report({
123 "nodes": {},
124 "diffs": diffs
125 })