Additional script and report to generate
diff --git a/ci_checker/pkg_check.py b/ci_checker/pkg_check.py
index b9d9ed3..dd1efc1 100644
--- a/ci_checker/pkg_check.py
+++ b/ci_checker/pkg_check.py
@@ -167,7 +167,10 @@
reporter.HTMLPackageCandidates(),
filename
)
- _report(nodes=self.nodes)
+ _report({
+ "nodes": self.nodes,
+ "diffs": {}
+ })
# init connection to salt and collect minion data
diff --git a/ci_checker/reclass_cmp.py b/ci_checker/reclass_cmp.py
index d50064c..b55ab2e 100644
--- a/ci_checker/reclass_cmp.py
+++ b/ci_checker/reclass_cmp.py
@@ -44,7 +44,7 @@
"Error loading file '{}': {}".format(fname, e.message)
)
raise Exception("CRITICAL: Failed to load YAML data: {}".format(
- e.message
+ e.message + e.strerror
))
def load_model_tree(self, name, root_path="/srv/salt/reclass"):
@@ -71,7 +71,9 @@
folders = path[start:].split(os.sep)
subdir = {}
# create generator of files that are not hidden
- _subfiles = (file for file in files if not file.startswith("."))
+ _exts = ('.yml', '.yaml')
+ _subfiles = (file for file in files
+ if file.endswith(_exts) and not file.startswith('.'))
for _file in _subfiles:
# cut file extension. All reclass files are '.yml'
_subnode = _file
@@ -79,8 +81,16 @@
subdir[_subnode] = self.load_yaml_class(
os.path.join(path, _file)
)
- # Save original filepath, just in case
- subdir[_subnode]["_source"] = os.path.join(path[start:], _file)
+ try:
+ # Save original filepath, just in case
+ subdir[_subnode]["_source"] = os.path.join(
+ path[start:],
+ _file
+ )
+ except Exception:
+ logger.warning(
+ "Non-yaml file detected: {}".format(_file)
+ )
# creating dict structure out of folder list. Pure python magic
parent = reduce(dict.get, folders[:-1], raw_tree)
parent[folders[-1]] = subdir
@@ -98,10 +108,21 @@
_new_path = path + ":" + k
if k == "_source":
continue
- if k not in dict2:
+ if dict2 is None or k not in dict2:
# no key in dict2
- _report[_new_path] = [dict1[k], "N/A"]
- logger_cli.info(
+ _report[_new_path] = {
+ "type": "value",
+ "raw_values": [dict1[k], "N/A"],
+ "str_values": [
+ "{}".format(dict1[k]),
+ "n/a"
+ ],
+ "str_short": [
+ "{:25.25}...".format(str(dict1[k])),
+ "n/a"
+ ]
+ }
+ logger.info(
"{}: {}, {}".format(_new_path, dict1[k], "N/A")
)
else:
@@ -128,16 +149,34 @@
dict2[k]
)
)
+ _original = ["= {}".format(item) for item in dict1[k]]
if _removed or _added:
_removed_str_lst = ["- {}".format(item)
for item in _removed]
_added_str_lst = ["+ {}".format(item)
for item in _added]
- _report[_new_path] = [
- dict1[k],
- _removed_str_lst + _added_str_lst
- ]
- logger_cli.info(
+ _report[_new_path] = {
+ "type": "list",
+ "raw_values": [
+ dict1[k],
+ _removed_str_lst + _added_str_lst
+ ],
+ "str_values": [
+ "{}".format('\n'.join(_original)),
+ "{}\n{}".format(
+ '\n'.join(_removed_str_lst),
+ '\n'.join(_added_str_lst)
+ )
+ ],
+ "str_short": [
+ "{} items".format(len(dict1[k])),
+ "{}\n{}".format(
+ '\n'.join(_removed_str_lst),
+ '\n'.join(_added_str_lst)
+ )
+ ]
+ }
+ logger.info(
"{}:\n"
"{} original items total".format(
_new_path,
@@ -145,17 +184,32 @@
)
)
if _removed:
- logger_cli.info(
+ logger.info(
"{}".format('\n'.join(_removed_str_lst))
)
if _added:
- logger_cli.info(
+ logger.info(
"{}".format('\n'.join(_added_str_lst))
)
else:
if dict1[k] != dict2[k]:
- _report[_new_path] = [dict1[k], dict2[k]]
- logger_cli.info("{}: {}, {}".format(
+ _str1 = str(dict1[k])
+ _str1_cut = "{:20.20}...".format(str(dict1[k]))
+ _str2 = str(dict2[k])
+ _str2_cut = "{:20.20}...".format(str(dict2[k]))
+ _report[_new_path] = {
+ "type": "value",
+ "raw_values": [dict1[k], dict2[k]],
+ "str_values": [
+ "{}".format(dict1[k]),
+ "{}".format(dict2[k])
+ ],
+ "str_short": [
+ _str1 if len(_str1) < 20 else _str1_cut,
+ _str2 if len(_str1) < 20 else _str2_cut,
+ ]
+ }
+ logger.info("{}: {}, {}".format(
_new_path,
dict1[k],
dict2[k]
@@ -164,8 +218,25 @@
# tmp report for keys
diff_report = find_changes(
self.models["inspur_Aug"],
- self.models['inspur_Dec']
+ self.models["inspur_Original"]
)
+ # prettify the report
+ for key in diff_report.keys():
+ # break the key in two parts
+ _ext = ".yml"
+ if ".yaml" in key:
+ _ext = ".yaml"
+ _split = key.split(_ext)
+ _file_path = _split[0]
+ _param_path = "none"
+ if len(_split) > 1:
+ _param_path = _split[1]
+ diff_report[key].update({
+ "class_file": _file_path + _ext,
+ "param": _param_path,
+ })
+
+ diff_report["diff_names"] = ["inspur_Aug", "inspur_Original"]
return diff_report
@@ -177,15 +248,20 @@
'/Users/savex/proj/inspur_hc/reclass_cmp/reclass-20180810'
)
mComparer.load_model_tree(
- 'inspur_Dec',
- '/Users/savex/proj/inspur_hc/reclass_cmp/reclass-20181210'
+ 'inspur_Original',
+ '/Users/savex/proj/inspur_hc/reclass_cmp/reclass_original'
)
diffs = mComparer.generate_model_report_tree()
+ report_file = "./mdl_diff_original.html"
report = reporter.ReportToFile(
reporter.HTMLModelCompare(),
- './mdl_diff.html'
+ report_file
)
- report(mdl_diff=diffs)
+ logger_cli.info("...generating report to {}".format(report_file))
+ report({
+ "nodes": {},
+ "diffs": diffs
+ })
# with open("./gen_tree.json", "w+") as _out:
# _out.write(json.dumps(mComparer.generate_model_report_tree))
diff --git a/ci_checker/reporter.py b/ci_checker/reporter.py
index 326969e..591026c 100644
--- a/ci_checker/reporter.py
+++ b/ci_checker/reporter.py
@@ -56,12 +56,12 @@
def _count_totals(data):
data['counters']['total_nodes'] = len(data['nodes'])
- def __call__(self, nodes={}, mdl_diff={}):
+ def __call__(self, payload):
# init data structures
data = self.common_data()
data.update({
- "nodes": nodes,
- "compare": data
+ "nodes": payload['nodes'],
+ "diffs": payload['diffs']
})
# add template specific data
@@ -149,12 +149,11 @@
tmpl = "model_tree_cmp_tmpl.j2"
def _extend_data(self, data):
- # extend data with the compare dict
+ # move names into separate place
+ data["names"] = data["diffs"].pop("diff_names")
# counters - mdl_diff
- data['counters']['mdl_diff'] = 51
-
- pass
+ data['counters']['mdl_diff'] = len(data["diffs"].keys())
class ReportToFile(object):
diff --git a/templates/model_tree_cmp_tmpl.j2 b/templates/model_tree_cmp_tmpl.j2
index f7633de..81cb2ae 100644
--- a/templates/model_tree_cmp_tmpl.j2
+++ b/templates/model_tree_cmp_tmpl.j2
@@ -103,13 +103,27 @@
width: 30%;
text-align: center;
}
+ .param {
+ font-size: 0.8em;
+ color: #555;
+ padding-left: 50px;
+ padding-right: 10px;
+ }
+ .class_file {
+ font-size: 0.8em;
+ font-weight: bold;
+ min-width: 300px;
+ text-align: left;
+ color: black;
+ }
+
.pkgName {
font-size: 1em;
padding-left: 10px;
}
.version {
- font-size: 1.1em;
+ font-size: 0.8em;
text-align: left;
}
@@ -196,18 +210,28 @@
<table class="pkgversions">
<tbody>
<tr>
- <td class="Header">Package name</td>
- <td class="Header">Installed</td>
- <td class="Header">Candidate</td>
+ <td class="Header">Reclass path</td>
+ <td class="Header">{{ names[0] }}</td>
+ <td class="Header">{{ names[1] }}</td>
</tr>
- <tr><td colspan=3>Package with different versions uniq for this node</td></tr>
- <td class="pkgName">class:cluster:param1</td>
- <td class="version differ">
- <div class="tooltip">Value1
- <pre class="tooltiptext">raw text from the diff | linebreaks }}</pre>
+ <tr><td colspan=3>Changes found in the model</td></tr>
+ {% for diff in diffs.keys() | sort %}
+ <tr>
+ <td class="pkgName">
+ <div class="class_file">{{ diffs[diff]["class_file"] }}</div>
+ <div class="param">{{ diffs[diff]["param"] }}</div>
+ </td>
+ <td class="version">
+ <div class="tooltip">{{ diffs[diff]["str_short"][0] | linebreaks }}
+ <pre class="tooltiptext">{{ diffs[diff]["str_values"][0] | linebreaks }}</pre>
</div>
</td>
- <td class="version">Value2</td>
+ <td class="version">
+ <div class="tooltip">{{ diffs[diff]["str_short"][1] | linebreaks }}
+ <pre class="tooltiptext">{{ diffs[diff]["str_values"][1] | linebreaks }}</pre>
+ </td>
+ </tr>
+ {% endfor %}
</tbody>
</table>
</div>