blob: 736146bcd7c0126dc7eb6258a3f082b70e62e0ab [file] [log] [blame]
Alex41485522019-04-12 17:26:18 -05001<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>Cloud Package versions check</title>
6 {% include 'common_styles.j2' %}
7 {% include 'common_scripts.j2' %}
8 <style>
9 td.repo {width: 3em; text-align: center; font-size: 0.7em; color: #113b11; font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;}
10 td.component, td.app, td.package_name {
11 font-size: 0.75em;
12 text-align: center;
13 color: #113b11;
14 font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
15 }
16
17 td.repo {column-width: 50px;}
18 td.component {column-width: 130px;}
19 td.app {column-width: 80px;}
20 td.package_name {column-width: 200px; padding-left: 10px; text-align: left;}
21 td.node_name {column-width: 210px;}
22 td.installed {column-width: 16%;}
23 td.status_container {column-width: 200px;}
24 td.candidate {column-width: 16%;}
25 td.release {column-width: 13%;}
26
27 .status_container {
28 display: inline-block;
29 }
30
31 .status {
32 display: block;
33 float: left;
34 width: 80px;
35 padding: 1px;
36 padding-left: 5px;
37 padding-right: 5px;
38 color: white;
39 background-color: #113b11;
40 text-align: center;
41 }
42 .action {
43 display: block;
44 float: left;
45 width: 120px;
46 padding: 1px;
47 padding-left: 5px;
48 padding-right: 5px;
49 color: gray;
50 background-color: #d4dad9;
51 text-align: center;
52 }
53
54 .status_container .ok {
55 color: white;
56 background-color: #113b11;
57 }
58 .status_container .error {
59 color: white;
60 background-color: darkred;
61 }
62 .status_container .upgraded {
63 color: azure;
64 background-color: green;
65 }
66 .status_container .downgraded {
67 color: white;
68 background-color: darkolivegreen;
69 }
70
71 .status_container .needs_repo {
Alex9e4bfaf2019-06-11 15:21:59 -050072 color: #545454;
73 background-color: #a1b1b0;
Alex41485522019-04-12 17:26:18 -050074 }
75
76 .status_container .needs_up {
77 color: black;
78 background-color: #aaccaa;
79 }
80
81 .status_container .needs_down {
82 color: black;
83 background-color: #ffcc48;
84 }
85
86 .status_container .possible {
87 color: gray;
88 background-color: #d4dad9;
89 }
90
Alexfa3b0f22019-04-17 16:15:27 -050091 .status_container .text {
92 width: 500px;
93 font-size: 1em;
94 padding-left: 10px;
95 line-height: 20px;
96 }
97
Alex41485522019-04-12 17:26:18 -050098
99
100 .version {text-align: left; padding: 2px}
101 .v_epoch, .v_upstream, .v_debian, .colon, .dash {
102 color: darkslategray;
103 float: left;
104 display: block;
105 }
106
107 .ok {color: darkslategray;}
108 .error {color: white; background-color: darkred;}
Alex26b8a8c2019-10-09 17:09:07 -0500109 .warning {color: black; background-color: lightgoldenrodyellow;}
Alex41485522019-04-12 17:26:18 -0500110 .upgraded {color: whitesmoke; background-color: darkslategray;}
111 .downgraded {color: red;}
112
113 .smallgreytext {float: right; font-size: 0.5em; color: gray;}
Alex26b8a8c2019-10-09 17:09:07 -0500114 .tooltiptext { top: 120%; }
Alex41485522019-04-12 17:26:18 -0500115
116 /* Table specific */
117 .nodes tr:nth-child(even) {
118 background-color: #fff;
119 }
120 .nodes tr:nth-child(odd) {
121 background-color: #d4dad9;
122
123 }
124 </style>
125</head>
126<body onload="init()">
127
128<div class="header">
129 <div class="label">OpenStack release:</div>
130 <div class="text">{{ openstack_release }}</div>
131 <div class="label">MCP Version:</div>
132 <div class="text">{{ mcp_release }}</div>
133 <div class="label date">generated on: {{ gen_date }}</div>
134</div>
135
136<div class="bar">
137 <button class="bar-item" onclick="openBar(event, 'mirantis')">Mirantis</button>
138 <button class="bar-item" onclick="openBar(event, 'system')">System</button>
139 <button class="bar-item" onclick="openBar(event, 'other')">Other</button>
140 <button class="bar-item" onclick="openBar(event, 'unlisted')">Unlisted</button>
141 <button class="bar-item" onclick="openBar(event, 'legend')">Legend</button>
142</div>
143
144{% macro prettify_version(v) %}
145 <div class="version">
146 {% if v.epoch %}
Alex836fac82019-08-22 13:36:16 -0500147 <div class="v_epoch {{ v.epoch_status | pkg_status_class }}">{{ v.epoch }}</div>
Alex41485522019-04-12 17:26:18 -0500148 <div class="colon">:</div>
149 {% endif %}
Alex836fac82019-08-22 13:36:16 -0500150 <div class="v_upstream {{ v.upstream_status | pkg_status_class }}">{{ v.upstream }}{{ v.upstream_rev }}</div>
Alex41485522019-04-12 17:26:18 -0500151 {% if v.debian %}
152 <div class="dash">-</div>
Alex836fac82019-08-22 13:36:16 -0500153 <div class="v_debian {{ v.debian_status | pkg_status_class }}">{{ v.debian }}{{ v.debian_rev }}</div>
Alex41485522019-04-12 17:26:18 -0500154 {% endif %}
155 {{ caller() }}
156 </div>
157{% endmacro %}
158
159{% macro render_package(pkg_name, dat, status_shown, action_shown, id_label) %}
160 <tr onclick="toggleClassByID('{{ id_label }}_{{ pkg_name }}_{{ status_shown }}_{{ action_shown }}')" id="{{ id_label }}_{{ pkg_name }}_{{ status_shown }}_{{ action_shown }}_button">
161 <td class="repo">{{ dat['desc']['repo'] }}</td>
Alexd0391d42019-05-21 18:48:55 -0500162 <td class="component">{{ dat['desc']['section'] }}</td>
Alex41485522019-04-12 17:26:18 -0500163 <td class="app">{{ dat['desc']['app'] }}</td>
164 <td class="package_name">{{ pkg_name }}</td>
165 <td class="status_container" colspan="3">
Alex836fac82019-08-22 13:36:16 -0500166 <div class="status {{ status_shown | pkg_status_class }}">{{ status_shown | pkg_status_label }}</div>
167 {% if action_shown | pkg_action_label %}
168 <div class="action {{ action_shown | pkg_action_class }}">{{ action_shown | pkg_action_label }}</div>
Alex41485522019-04-12 17:26:18 -0500169 {% endif %}
170 </td>
171 </tr>
172 <tr class="collapsable" id="{{ id_label }}_{{ pkg_name }}_{{ status_shown }}_{{ action_shown }}"><td colspan="7">
173 <table class="nodes"><tbody>
174 {% for status in dat['results'].keys() | sort(reverse=true) %}
175 {% for action in dat['results'][status].keys() | sort(reverse=true) %}
176 {% set counter = 1 + loop.index0 %}
177 {% for node in dat['results'][status][action].keys() | sort %}
178 {% set n_counter = 1 + loop.index0 %}
179 {% set nd = dat['results'][status][action][node] %}
180 <tr>
181 <td class="repo">{{ n_counter }}</td>
182 <td class="node_name">{{ node }}</td>
183 <td class="status_container">
Alex836fac82019-08-22 13:36:16 -0500184 <div class="status {{ status | pkg_status_class }}">{{ status | pkg_status_label }}</div>
185 {% if action | pkg_action_label %}
186 <div class="action {{ action | pkg_action_class }}">{{ action | pkg_action_label }}</div>
Alex41485522019-04-12 17:26:18 -0500187 {% endif %}
188 </td>
189 <td class="installed">
190 <div class="tooltip">
191 {% call prettify_version(nd['i']) %}
192 <pre class="tooltiptext">{{ nd['raw'] | linebreaks }}</pre>
193 {% endcall %}
194 </div>
195 </td>
196 <td class="candidate">{{ nd['c'].version }}</td>
Alexd0391d42019-05-21 18:48:55 -0500197 <td class="release">
198 <div class="tooltip">
199 {{ dat['r'].version }}
Alex836fac82019-08-22 13:36:16 -0500200 <pre class="repoinfotext">{{ dat['repos'] | pkg_repo_info }}</pre>
Alexd0391d42019-05-21 18:48:55 -0500201 </div>
202 </td>
Alex41485522019-04-12 17:26:18 -0500203 </tr>
204 {% endfor %}
205 {% endfor %}
206 {% endfor %}
207 </tbody></table>
208 </td></tr>
209 {{ caller() }}
210{% endmacro %}
211
212{% macro package_table(pkg_dict, id_label) %}
213<div id="{{ id_label }}" class="barcontent">
214 <h5>{{ caller() }}</h5>
215 <table class="pkgversions">
216 <tbody>
217 <tr>
218 <td class="table_header" width="50px">repo</td>
219 <td class="table_header" width="130px">Component</td>
220 <td class="table_header" width="80px">App</td>
221 <td class="table_header" width="200px">Package name</td>
222 <td class="table_header">Installed</td>
223 <td class="table_header">Candidate</td>
224 <td class="table_header">Release</td>
225 </tr>
226 <!-- Print errors -->
227 <tr><td colspan="7">Errors ({{ errors[id_label] }})</td></tr>
228 {% for pkg_name in pkg_dict | get_sorted_keys %}
229 {% set dat = pkg_dict[pkg_name] %}
230 {% if status_err in dat['results'] %}
231 {% set action_to_show = dat['results'][status_err].keys() | get_max %}
232 {% call render_package(pkg_name, dat, status_err, action_to_show, id_label) %}
233 {% endcall %}
234 {% endif%}
235 {% endfor %}
236 {% if not errors[id_label] %}
237 <tr><td class="note" colspan="7">no errors found </td></tr>
238 {% endif %}
239
Alex26b8a8c2019-10-09 17:09:07 -0500240 <!-- Print warnings -->
241 <tr><td colspan="7">Warnings ({{ warnings[id_label] }})</td></tr>
242 {% for pkg_name in pkg_dict | get_sorted_keys %}
243 {% set dat = pkg_dict[pkg_name] %}
244 {% if status_warn in dat['results'] %}
245 {% set action_to_show = dat['results'][status_warn].keys() | get_max %}
246 {% call render_package(pkg_name, dat, status_warn, action_to_show, id_label) %}
247 {% endcall %}
248 {% endif%}
249 {% endfor %}
250 {% if not warnings[id_label] %}
251 <tr><td class="note" colspan="7">no warnings found </td></tr>
252 {% endif %}
253
Alex41485522019-04-12 17:26:18 -0500254 <!-- Print downgrades -->
255 <tr><td colspan="7">Downgrades ({{ downgrades[id_label] }})</td></tr>
256 {% for pkg_name in pkg_dict | get_sorted_keys %}
257 {% set dat = pkg_dict[pkg_name] %}
258 {% if status_down in dat['results'] %}
259 {% set action_to_show = dat['results'][status_down].keys() | get_max %}
260 {% call render_package(pkg_name, dat, status_down, action_to_show, id_label) %}
261 {% endcall %}
262 {% endif %}
263 {% endfor %}
264 {% if not downgrades[id_label] %}
265 <tr><td class="note" colspan="7">no downgrades found</td></tr>
266 {% endif %}
267
268 <!-- Print all other -->
269 <tr><td colspan="7">All others</td></tr>
270 {% for pkg_name in pkg_dict | get_sorted_keys %}
271 {% set dat = pkg_dict[pkg_name] %}
272 {% set status_to_show = dat['results'].keys() | get_max %}
273 {% set action_to_show = dat['results'][status_to_show].keys() | get_max %}
274 {% if status_err != status_to_show and status_down != status_to_show %}
275 {% call render_package(pkg_name, dat, status_to_show, action_to_show, id_label) %}
276 {% endcall %}
277 {% endif %}
278 {% endfor %}
279 </tbody>
280 </table>
281</div>
282{%- endmacro %}
283
284<!-- Mirantis packages which version is critical for functionality -->
285{% call package_table(critical, "mirantis") %}
286 Packages maintained and updated by Mirantis
287{% endcall %}
288
289<!-- System labeled packages-->
290{% call package_table(system, "system") %}
291 System packages which versions are critical to proper cloud function
292{%- endcall %}
293
294<!-- Other packages -->
295{% call package_table(other, "other") %}
296 Packages with no description or not critical
297{%- endcall %}
298
299{% call package_table(unlisted, "unlisted") %}
300 Packages that are not listed in version map. I.e. unexpected on the environment
301{%- endcall %}
302
303<!-- Legend -->
304<div id="legend" class="barcontent">
Alexfa3b0f22019-04-17 16:15:27 -0500305 <table width="100%"><tbody>
306 <tr>
307 <td width="50%"><h5>Version status desctiptions</h5></td>
308 <td width="50%"><h5>Action descriptions</h5></td>
309 </tr>
310
311 <tr>
312 <td width="50%">
313 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500314 <div class="status {{ cs.ok | pkg_status_class }}">{{ cs.ok | pkg_status_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500315 <div class="text">Installed and Candidate epoch:upstream version mach</div>
316 </div>
317 </td>
318 <td width="50%">
319 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500320 <div class="action {{ ca.na | pkg_action_class }}">{{ ca.na | pkg_action_label }} (no action)</div>
Alexfa3b0f22019-04-17 16:15:27 -0500321 <div class="text">No action suggested</div>
322 </div>
323 </td>
324 </tr>
325 <tr>
326 <td width="50%">
327 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500328 <div class="status {{ cs.up | pkg_status_class }}">{{ cs.up | pkg_status_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500329 <div class="text">Installed version is newer that the one found in Repo (i.e. candidate) or Release notes recordset</div>
330 </div>
331 </td>
332 <td width="50%">
333 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500334 <div class="action {{ ca.up | pkg_action_class }}">{{ ca.up | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500335 <div class="text">There is an upgrade possible for the package. But it is not strictly required action</div>
336 </div>
337 </td>
338 </tr>
339 <tr>
340 <td width="50%">
341 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500342 <div class="status {{ cs.down | pkg_status_class }}">{{ cs.down | pkg_status_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500343 <div class="text">Installed version is older that the one found in Repo (i.e. candidate) or Release notes recordset</div>
344 </div>
345 </td>
346 <td width="50%">
347 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500348 <div class="action {{ ca.need_up | pkg_action_class }}">{{ ca.need_up | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500349 <div class="text">Package should be upgraded to match version either in repo or in Release notes</div>
350 </div>
351 </td>
352 </tr>
353 <tr>
354 <td width="50%">
355 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500356 <div class="status {{ cs.err | pkg_status_class }}">{{ cs.err | pkg_status_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500357 <div class="text">Installed version conflicts with a combination of Candidate and Release notes versions</div>
358 </div>
359 </td>
360 <td width="50%">
361 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500362 <div class="action {{ ca.need_down | pkg_action_class }}">{{ ca.need_down | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500363 <div class="text">Package should be downgraded to match version either in repo or in Release notes</div>
364 </div>
365 </td>
366 </tr>
367 <tr>
368 <td width="50%">
369 </td>
370 <td width="50%">
371 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500372 <div class="action {{ ca.repo | pkg_action_class }}">{{ ca.repo | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500373 <div class="text">Repo that is configured on the target node contains invalid version and should be updated</div>
374 </div>
375 </td>
376 </tr>
377 </tbody></table>
378 <hr>
379 <h5>Versions status and Action combinations</h5>
380 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500381 <div class="status {{ cs.ok | pkg_status_class }}">{{ cs.ok | pkg_status_label }}</div>
382 <div class="action {{ ca.na | pkg_action_class }}">{{ ca.na | pkg_action_label }} (no action)</div>
Alexfa3b0f22019-04-17 16:15:27 -0500383 <div class="text">All versions are inline with each other</div>
384 </div>
385 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500386 <div class="status {{ cs.up | pkg_status_class }}">{{ cs.up | pkg_status_label }}</div>
387 <div class="action {{ ca.na | pkg_action_class }}">{{ ca.na | pkg_action_label }} (no action)</div>
Alexfa3b0f22019-04-17 16:15:27 -0500388 <div class="text">Installed version is newer that Cadidate, Release version - unknown or not tracked</div>
389 </div>
390 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500391 <div class="status {{ cs.ok | pkg_status_class }}">{{ cs.ok | pkg_status_label }}</div>
392 <div class="action {{ ca.up | pkg_action_class }}">{{ ca.up | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500393 <div class="text">Installed version is equal to Release, but there is newer in the repo</div>
394 </div>
395 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500396 <div class="status {{ cs.up | pkg_status_class }}">{{ cs.up | pkg_status_label }}</div>
397 <div class="action {{ ca.up | pkg_action_class }}">{{ ca.up | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500398 <div class="text">Installed version is newer than Release, and there is even newer in the repo</div>
399 </div>
400 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500401 <div class="status {{ cs.err | pkg_status_class }}">{{ cs.err | pkg_status_label }}</div>
402 <div class="action {{ ca.need_up | pkg_action_class }}">{{ ca.need_up | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500403 <div class="text">Installed version is older than Candidate and Release versions and must be upgraded</div>
404 </div>
405 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500406 <div class="status {{ cs.err | pkg_status_class }}">{{ cs.err | pkg_status_label }}</div>
407 <div class="action {{ ca.need_down | pkg_action_class }}">{{ ca.need_down | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500408 <div class="text">Unknown version installed, Release and Candidate versions are older</div>
409 </div>
410 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500411 <div class="status {{ cs.err | pkg_status_class }}">{{ cs.err | pkg_status_label }}</div>
412 <div class="action {{ ca.repo | pkg_action_class }}">{{ ca.repo | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500413 <div class="text">Installed and Candidate versions is older than release and repo must be updated</div>
414 </div>
415
416 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500417 <div class="status {{ cs.up | pkg_status_class }}">{{ cs.up | pkg_status_label }}</div>
418 <div class="action {{ ca.repo | pkg_action_class }}">{{ ca.repo | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500419 <div class="text">Candidate version in repo is older vs Release and both older vs Installed</div>
420 </div>
421 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500422 <div class="status {{ cs.ok | pkg_status_class }}">{{ cs.ok | pkg_status_label }}</div>
423 <div class="action {{ ca.repo | pkg_action_class }}">{{ ca.repo | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500424 <div class="text">Candidate version in Repo is older vs release, but release version installed</div>
425 </div>
426
427 <div class="status_container">
Alex836fac82019-08-22 13:36:16 -0500428 <div class="status {{ cs.down | pkg_status_class }}">{{ cs.down | pkg_status_label }}</div>
429 <div class="action {{ ca.repo | pkg_action_class }}">{{ ca.repo | pkg_action_label }}</div>
Alexfa3b0f22019-04-17 16:15:27 -0500430 <div class="text">Both Candidate in repo and Installed older vs release</div>
431 </div>
432 <div class="status_container">
433
434 <div class="text"></div>
435 </div>
436
Alex41485522019-04-12 17:26:18 -0500437</div>
438</body>
439</html>