Module refactoring and dynamic loading
diff --git a/cfg_checker/cfg_check.py b/cfg_checker/cfg_check.py
index b8243ff..a0df7e6 100644
--- a/cfg_checker/cfg_check.py
+++ b/cfg_checker/cfg_check.py
@@ -5,15 +5,9 @@
from logging import INFO, DEBUG
-import reporter
+from cfg_checker.common.exception import CheckerException
+from cfg_checker.common import config, logger, logger_cli
-from cfg_checker.common.exception import CheckerException, ConfigException
-from cfg_checker.common import utils, const
-from cfg_checker.common import config, logger, logger_cli, pkg_dir
-
-import cfg_checker.reclass_cmp as reclass_cmp
-from cfg_checker.pkg_check import CloudPackageChecker
-from cfg_checker.network_checks import NetworkChecker
pkg_dir = os.path.dirname(__file__)
pkg_dir = os.path.normpath(pkg_dir)
@@ -40,150 +34,6 @@
return
-def get_file_arg(args):
- if args.file:
- return args.file
- else:
- raise ConfigException("No report filename supplied")
-
-
-def get_path_arg(path):
- if os.path.exists(path):
- return path
- else:
- raise ConfigException("'{}' not exists".format(path))
-
-
-def validate_model(path):
- logger_cli.debug("\t...validating '{}' as a model".format(path))
- _checks = []
- _is_folder = os.path.isdir(path)
- logger_cli.debug("\t- folder? -> {}".format(_is_folder))
- _checks.append(_is_folder)
- _has_classes = os.path.isdir(os.path.join(path, "classes"))
- logger_cli.debug("\t- has classes? -> {}".format(_has_classes))
- _checks.append(_has_classes)
- _has_cluster = os.path.isdir(os.path.join(path, "classes", "cluster"))
- logger_cli.debug("\t- has classes/cluster? -> {}".format(_has_cluster))
- _checks.append(_has_cluster)
- _has_system = os.path.isdir(os.path.join(path, "classes", "system"))
- logger_cli.debug("\t- has classes/system? -> {}".format(_has_system))
- _checks.append(_has_system)
- _has_nodes = os.path.isdir(os.path.join(path, "nodes"))
- logger_cli.debug("\t- has nodes? -> {}".format(_has_nodes))
- _checks.append(_has_nodes)
-
- logger_cli.debug("\t-> {}".format(
- all(_checks)
- ))
-
- return all(_checks)
-
-
-def packages_report(args):
- """Create package versions report
-
- :args: - parser arguments
- :return: - no return value
- """
- _filename = get_file_arg(args)
-
- # init connection to salt and collect minion data
- pChecker = CloudPackageChecker()
- # collect data on installed packages
- pChecker.collect_installed_packages()
- # diff installed and candidates
- # pChecker.collect_packages()
- # report it
- pChecker.create_html_report(_filename)
-
-
-def network_check(args):
- logger_cli.info("# Network check (CLI output)")
- netChecker = NetworkChecker()
- netChecker.collect_network_info()
- netChecker.print_network_report()
-
- return
-
-
-def network_report(args):
- logger_cli.info("# Network check (HTML report: '{}')".format(args.file))
- _filename = get_file_arg(args)
-
- netChecker = NetworkChecker()
- netChecker.collect_network_info()
- netChecker.create_html_report(_filename)
-
- return
-
-
-def reclass_list(args):
- logger_cli.info("# Reclass list")
- _path = get_path_arg(args.models_path)
-
- logger_cli.info("# ...models path is '{}'".format(args.models_path))
-
- models = {}
- for _folder in os.listdir(args.models_path):
- # validate item as a model
- _model_path = os.path.join(
- args.models_path,
- _folder
- )
- _validated = validate_model(_model_path)
-
- if not _validated:
- logger_cli.info("-> '{}' not a valid model".format(_folder))
- continue
- else:
- models[_folder] = _model_path
-
- logger_cli.info("-> '{}' at '{}'".format(_folder, _model_path))
-
- # TODO: collect info about the model
-
- return
-
-
-def reclass_diff(args):
- logger_cli.info("Reclass comparer (HTML report: '{}'".format(args.file))
- _filename = get_file_arg(args)
-
- # checking folder params
- _model1 = get_path_arg(args.model1)
- _model2 = get_path_arg(args.model2)
-
- # Do actual compare using hardcoded model names
- mComparer = reclass_cmp.ModelComparer()
-
- mComparer.model_name_1 = os.path.split(_model1)[1]
- mComparer.model_path_1 = _model1
- mComparer.model_name_2 = os.path.split(_model2)[1]
- mComparer.model_path_2 = _model2
-
- mComparer.load_model_tree(
- mComparer.model_name_1,
- mComparer.model_path_1
- )
- mComparer.load_model_tree(
- mComparer.model_name_2,
- mComparer.model_path_2
- )
-
- diffs = mComparer.generate_model_report_tree()
-
- report = reporter.ReportToFile(
- reporter.HTMLModelCompare(),
- _filename
- )
- logger_cli.info("# Generating report to {}".format(_filename))
- report({
- "nodes": {},
- "diffs": diffs
- })
-
-
def config_check_entrypoint():
"""
Main entry point. Uses nested parsers structure
@@ -291,7 +141,7 @@
try:
args = parser.parse_args()
except TypeError as e:
- logger_cli.info("\nPlease, check arguments")
+ logger_cli.info("\n# Please, check arguments")
return
# Pass externally configured values
@@ -306,21 +156,21 @@
# Validate the commands
# check command
if args.command not in commands:
- logger_cli.info("\nPlease, type a command listed above")
+ logger_cli.info("\n# Please, type a command listed above")
return
elif args.type not in commands[args.command]:
# check type
logger_cli.info(
- "\nPlease, select '{}' command type listed above".format(
+ "\n# Please, select '{}' command type listed above".format(
args.command
)
)
return
else:
# form function name to call
- _method_name = args.command + "_" + args.type
- _this_module = sys.modules[__name__]
- _method = getattr(_this_module, _method_name)
+ _method_name = "do_" + args.type
+ _target_module = __import__("cfg_checker.modules."+args.command, fromlist=[""])
+ _method = getattr(_target_module, _method_name)
# Execute the command
result = _method(args)
diff --git a/cfg_checker/cli/__init__.py b/cfg_checker/cli/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cfg_checker/cli/__init__.py
diff --git a/cfg_checker/cli/network.py b/cfg_checker/cli/network.py
new file mode 100644
index 0000000..f70c410
--- /dev/null
+++ b/cfg_checker/cli/network.py
@@ -0,0 +1,14 @@
+from cfg_checker.network.checker import NetworkChecker
+
+if __name__ == '__main__':
+ # init connection to salt and collect minion data
+ cl = NetworkChecker()
+
+ # collect data on installed packages
+ cl.collect_network_info()
+
+ # diff installed and candidates
+ # cl.collect_packages()
+
+ # report it
+ cl.create_html_report("./pkg_versions.html")
diff --git a/cfg_checker/cli/package.py b/cfg_checker/cli/package.py
new file mode 100644
index 0000000..3119385
--- /dev/null
+++ b/cfg_checker/cli/package.py
@@ -0,0 +1,15 @@
+from cfg_checker.packages.checker import CloudPackageChecker
+
+
+if __name__ == '__main__':
+ # init connection to salt and collect minion data
+ cl = CloudPackageChecker()
+
+ # collect data on installed packages
+ cl.collect_installed_packages()
+
+ # diff installed and candidates
+ # cl.collect_packages()
+
+ # report it
+ cl.create_html_report("./pkg_versions.html")
diff --git a/cfg_checker/cli/reclass.py b/cfg_checker/cli/reclass.py
new file mode 100644
index 0000000..41b863d
--- /dev/null
+++ b/cfg_checker/cli/reclass.py
@@ -0,0 +1,6 @@
+from cfg_checker.reclass.comparer import ModelComparer
+
+if __name__ == "__main__":
+ # Execute the comparison using argv params
+
+ pass
diff --git a/cfg_checker/helpers/__init__.py b/cfg_checker/helpers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cfg_checker/helpers/__init__.py
diff --git a/cfg_checker/helpers/args_utils.py b/cfg_checker/helpers/args_utils.py
new file mode 100644
index 0000000..d7b694d
--- /dev/null
+++ b/cfg_checker/helpers/args_utils.py
@@ -0,0 +1,17 @@
+import os
+
+from cfg_checker.common.exception import ConfigException
+
+
+def get_file_arg(args):
+ if args.file:
+ return args.file
+ else:
+ raise ConfigException("No report filename supplied")
+
+
+def get_path_arg(path):
+ if os.path.exists(path):
+ return path
+ else:
+ raise ConfigException("'{}' not exists".format(path))
diff --git a/cfg_checker/modules/__init__.py b/cfg_checker/modules/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cfg_checker/modules/__init__.py
diff --git a/cfg_checker/modules/network/__init__.py b/cfg_checker/modules/network/__init__.py
new file mode 100644
index 0000000..627c7d5
--- /dev/null
+++ b/cfg_checker/modules/network/__init__.py
@@ -0,0 +1,23 @@
+import checker
+
+from cfg_checker.helpers import args_utils
+from cfg_checker.common import logger_cli
+
+def do_check(args):
+ logger_cli.info("# Network check (CLI output)")
+ netChecker = checker.NetworkChecker()
+ netChecker.collect_network_info()
+ netChecker.print_network_report()
+
+ return
+
+
+def do_report(args):
+ logger_cli.info("# Network check (HTML report: '{}')".format(args.file))
+ _filename = args_utils.get_file_arg(args)
+
+ netChecker = checker.NetworkChecker()
+ netChecker.collect_network_info()
+ netChecker.create_html_report(_filename)
+
+ return
diff --git a/cfg_checker/network_checks.py b/cfg_checker/modules/network/checker.py
similarity index 92%
rename from cfg_checker/network_checks.py
rename to cfg_checker/modules/network/checker.py
index d5bb9d5..03a48de 100644
--- a/cfg_checker/network_checks.py
+++ b/cfg_checker/modules/network/checker.py
@@ -5,8 +5,7 @@
from copy import deepcopy
-import reporter
-
+from cfg_checker import reporter
from cfg_checker.common import utils, const
from cfg_checker.common import config, logger, logger_cli, pkg_dir
from cfg_checker.common import salt_utils
@@ -128,19 +127,3 @@
"diffs": {}
})
logger_cli.info("-> Done")
-
-
-if __name__ == '__main__':
- # init connection to salt and collect minion data
- cl = NetworkChecker()
-
- # collect data on installed packages
- cl.collect_network_info()
-
- # diff installed and candidates
- # cl.collect_packages()
-
- # report it
- cl.create_html_report("./pkg_versions.html")
-
- sys.exit(0)
diff --git a/cfg_checker/modules/packages/__init__.py b/cfg_checker/modules/packages/__init__.py
new file mode 100644
index 0000000..4f1a809
--- /dev/null
+++ b/cfg_checker/modules/packages/__init__.py
@@ -0,0 +1,21 @@
+import checker
+
+from cfg_checker.helpers import args_utils
+
+
+def do_report(args):
+ """Create package versions report
+
+ :args: - parser arguments
+ :return: - no return value
+ """
+ _filename = args_utils.get_file_arg(args)
+
+ # init connection to salt and collect minion data
+ pChecker = checker.CloudPackageChecker()
+ # collect data on installed packages
+ pChecker.collect_installed_packages()
+ # diff installed and candidates
+ # pChecker.collect_packages()
+ # report it
+ pChecker.create_html_report(_filename)
diff --git a/cfg_checker/pkg_check.py b/cfg_checker/modules/packages/checker.py
similarity index 85%
rename from cfg_checker/pkg_check.py
rename to cfg_checker/modules/packages/checker.py
index e9c312e..5f48dcd 100644
--- a/cfg_checker/pkg_check.py
+++ b/cfg_checker/modules/packages/checker.py
@@ -1,11 +1,10 @@
import json
import os
-import sys
+#import sys
from copy import deepcopy
-import reporter
-
+from cfg_checker import reporter
from cfg_checker.common import utils, const
from cfg_checker.common import config, logger, logger_cli, pkg_dir
from cfg_checker.common import salt_utils
@@ -70,19 +69,3 @@
"diffs": {}
})
logger_cli.info("-> Done")
-
-
-if __name__ == '__main__':
- # init connection to salt and collect minion data
- cl = CloudPackageChecker()
-
- # collect data on installed packages
- cl.collect_installed_packages()
-
- # diff installed and candidates
- # cl.collect_packages()
-
- # report it
- cl.create_html_report("./pkg_versions.html")
-
- sys.exit(0)
diff --git a/cfg_checker/modules/reclass/__init__.py b/cfg_checker/modules/reclass/__init__.py
new file mode 100644
index 0000000..a695482
--- /dev/null
+++ b/cfg_checker/modules/reclass/__init__.py
@@ -0,0 +1,74 @@
+import os
+
+import comparer
+import validator
+
+from cfg_checker.common import logger_cli
+from cfg_checker.helpers import args_utils
+from cfg_checker.reports import reporter
+
+
+def do_list(args):
+ logger_cli.info("# Reclass list")
+ _path = args_utils.get_path_arg(args.models_path)
+
+ logger_cli.info("# ...models path is '{}'".format(args.models_path))
+
+ models = {}
+ for _folder in os.listdir(args.models_path):
+ # validate item as a model
+ _model_path = os.path.join(
+ args.models_path,
+ _folder
+ )
+ _validated = validator.basic_model_validation_by_path(_model_path)
+
+ if not _validated:
+ logger_cli.info("-> '{}' not a valid model".format(_folder))
+ continue
+ else:
+ models[_folder] = _model_path
+
+ logger_cli.info("-> '{}' at '{}'".format(_folder, _model_path))
+
+ # TODO: collect info about the model
+
+ return
+
+
+def do_diff(args):
+ logger_cli.info("Reclass comparer (HTML report: '{}'".format(args.file))
+ _filename = args_utils.get_file_arg(args)
+
+ # checking folder params
+ _model1 = args_utils.get_path_arg(args.model1)
+ _model2 = args_utils.get_path_arg(args.model2)
+
+ # Do actual compare using hardcoded model names
+ mComparer = comparer.ModelComparer()
+
+ mComparer.model_name_1 = os.path.split(_model1)[1]
+ mComparer.model_path_1 = _model1
+ mComparer.model_name_2 = os.path.split(_model2)[1]
+ mComparer.model_path_2 = _model2
+
+ mComparer.load_model_tree(
+ mComparer.model_name_1,
+ mComparer.model_path_1
+ )
+ mComparer.load_model_tree(
+ mComparer.model_name_2,
+ mComparer.model_path_2
+ )
+
+ diffs = mComparer.generate_model_report_tree()
+
+ report = reporter.ReportToFile(
+ reporter.HTMLModelCompare(),
+ _filename
+ )
+ logger_cli.info("# Generating report to {}".format(_filename))
+ report({
+ "nodes": {},
+ "diffs": diffs
+ })
diff --git a/cfg_checker/reclass_cmp.py b/cfg_checker/modules/reclass/comparer.py
similarity index 90%
rename from cfg_checker/reclass_cmp.py
rename to cfg_checker/modules/reclass/comparer.py
index f7c34d6..5a26f29 100644
--- a/cfg_checker/reclass_cmp.py
+++ b/cfg_checker/modules/reclass/comparer.py
@@ -6,7 +6,7 @@
import os
import yaml
-import reporter
+from cfg_checker import reporter
from cfg_checker.common import logger, logger_cli
@@ -328,44 +328,37 @@
_diff_report["diff_names"] = [self.model_name_1, self.model_name_2]
return _diff_report
+ def compare_models(self):
+ # Do actual compare using model names from the class
+ self.load_model_tree(
+ self.model_name_1,
+ self.model_path_1
+ )
+ self.load_model_tree(
+ self.model_name_2,
+ self.model_path_2
+ )
+ # Models should have similar structure to be compared
+ # classes/system
+ # classes/cluster
+ # nodes
-def compare_models():
- # Do actual compare using model names from the class
- mComparer = ModelComparer()
- mComparer.load_model_tree(
- mComparer.model_name_1,
- mComparer.model_path_1
- )
- mComparer.load_model_tree(
- mComparer.model_name_2,
- mComparer.model_path_2
- )
- # Models should have similar structure to be compared
- # classes/system
- # classes/cluster
- # nodes
-
- diffs = mComparer.generate_model_report_tree()
+ diffs = self.generate_model_report_tree()
- report_file = \
- mComparer.model_name_1 + "-vs-" + mComparer.model_name_2 + ".html"
- # HTML report class is post-callable
- report = reporter.ReportToFile(
- reporter.HTMLModelCompare(),
- report_file
- )
- logger_cli.info("...generating report to {}".format(report_file))
- # report will have tabs for each of the comparable entities in diffs
- report({
- "nodes": {},
- "all_diffs": diffs,
- })
- # with open("./gen_tree.json", "w+") as _out:
- # _out.write(json.dumps(mComparer.generate_model_report_tree))
+ report_file = \
+ self.model_name_1 + "-vs-" + self.model_name_2 + ".html"
+ # HTML report class is post-callable
+ report = reporter.ReportToFile(
+ reporter.HTMLModelCompare(),
+ report_file
+ )
+ logger_cli.info("...generating report to {}".format(report_file))
+ # report will have tabs for each of the comparable entities in diffs
+ report({
+ "nodes": {},
+ "all_diffs": diffs,
+ })
+ # with open("./gen_tree.json", "w+") as _out:
+ # _out.write(json.dumps(mComparer.generate_model_report_tree))
- return
-
-
-# temporary executing the parser as a main prog
-if __name__ == '__main__':
- compare_models()
+ return
diff --git a/cfg_checker/modules/reclass/validator.py b/cfg_checker/modules/reclass/validator.py
new file mode 100644
index 0000000..e7d7f06
--- /dev/null
+++ b/cfg_checker/modules/reclass/validator.py
@@ -0,0 +1,28 @@
+import os
+
+from cfg_checker.common import logger_cli
+
+def basic_model_validation_by_path(path):
+ logger_cli.debug("\t...validating '{}' as a model".format(path))
+ _checks = []
+ _is_folder = os.path.isdir(path)
+ logger_cli.debug("\t- folder? -> {}".format(_is_folder))
+ _checks.append(_is_folder)
+ _has_classes = os.path.isdir(os.path.join(path, "classes"))
+ logger_cli.debug("\t- has classes? -> {}".format(_has_classes))
+ _checks.append(_has_classes)
+ _has_cluster = os.path.isdir(os.path.join(path, "classes", "cluster"))
+ logger_cli.debug("\t- has classes/cluster? -> {}".format(_has_cluster))
+ _checks.append(_has_cluster)
+ _has_system = os.path.isdir(os.path.join(path, "classes", "system"))
+ logger_cli.debug("\t- has classes/system? -> {}".format(_has_system))
+ _checks.append(_has_system)
+ _has_nodes = os.path.isdir(os.path.join(path, "nodes"))
+ logger_cli.debug("\t- has nodes? -> {}".format(_has_nodes))
+ _checks.append(_has_nodes)
+
+ logger_cli.debug("\t-> {}".format(
+ all(_checks)
+ ))
+
+ return all(_checks)
diff --git a/cfg_checker/reports/__init__.py b/cfg_checker/reports/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cfg_checker/reports/__init__.py
diff --git a/cfg_checker/reporter.py b/cfg_checker/reports/reporter.py
similarity index 100%
rename from cfg_checker/reporter.py
rename to cfg_checker/reports/reporter.py
diff --git a/setup.py b/setup.py
index 0addf90..2661496 100644
--- a/setup.py
+++ b/setup.py
@@ -21,8 +21,12 @@
]
entry_points = {
- "console_scripts":
- "mcp_checker = cfg_checker.cfg_check:cli_main"
+ "console_scripts": [
+ "mcp-checker = cfg_checker.cfg_check:cli_main",
+ "package-report = cfg_checker.cli.package",
+ "network-check = cfg_checker.cli.network",
+ "reclass-compare = cfg_checker.cli.reclass"
+ ]
}