Ceph info and report OSD configuration

 - Added OSD configuration gathering
 - Uniq values filtering

 Related-PROD: PROD-36669

Change-Id: I7a2ef144554d892d06c0f05f978a512ba156360a
diff --git a/templates/ceph_info_html.j2 b/templates/ceph_info_html.j2
index 9dca52a..ac4d83f 100644
--- a/templates/ceph_info_html.j2
+++ b/templates/ceph_info_html.j2
@@ -84,6 +84,8 @@
         }
         
         .row_content {
+			font-family: "LaoSangamMN", Monaco, monospace;
+			font-size: 0.8em;
             padding: 0 18px;
             background-color: white;
             max-height: 0;
@@ -138,6 +140,13 @@
             padding-right: 0px;
             margin: 1px;
         }
+        td > .osdconf_group {
+            display: inline-block;
+            grid-template-columns: repeat(3, auto);
+            padding-left: 0px;
+            padding-right: 0px;
+            margin: 1px;
+        }
         .item {
         	display: inline-grid;
   			border-width: 1px;
@@ -218,6 +227,9 @@
         .lat_apply { border-color: #a0c0c0; background-color: rgb(255, 250, 250); text-align: left;  width: 35px}
         .meta_name { border-color: #c4b890; background-color: #e7dbb6; text-align: left; width: 150px;}
         .meta_value { border-color: #c6c3ba;background-color: #d4d4d4; text-align: left; width: 480px;}
+        .conf_name { border-color: #c4b890; background-color: #e7dbb6; text-align: left; width: 295px; word-break: break-all;}
+        .conf_value { border-color: #c6c3ba;background-color: #d4d4d4; text-align: left; width: 280px; word-break: break-all;}
+        .conf_source { border-color: #c6c3ba;background-color: #a4a4a4; text-align: left; width: 50px;}
 
         .map_grid {
             display: grid;
@@ -334,6 +346,7 @@
         <button class="bar-item" onclick="openBar(event, 'status')">Status</button>
         <button class="bar-item" onclick="openBar(event, 'latency')">Latency</button>
         <button class="bar-item" onclick="openBar(event, 'crush')">CRUSH Map</button>
+        <button class="bar-item" onclick="openBar(event, 'osdconf')">OSD Conf</button>
         <button class="bar-item" onclick="openBar(event, 'mondump')">Monitors</button>
         <button class="bar-item" onclick="openBar(event, 'df')">Pools</button>
         <button class="bar-item" onclick="openBar(event, 'dfrados')">Rados</button>
@@ -630,6 +643,46 @@
 </div>
 {% endmacro %}
 
+<!-- OSD Configuration -->
+{% macro osdconf_page(info, id_label) %}
+<div id="{{ id_label }}" class="barcontent">
+    <h5>{{ caller() }}</h5>
+    <hr>
+    {% set cbase = info["osd_config_data"]["data"]["common"] %}
+    {% set cuniq = info["osd_config_data"]["data"]["uniq"] %}
+    <button type="button" class="row_button">{{ cbase | length }} common configuration values</button>
+    <div class="row_content">
+        <table class="ceph_status"><tbody>
+            <tr><td class="metadata">
+            {% for tname, tdata in cbase.items() %}
+                <div class="osdconf_group">
+                    <div class="item conf_name">{{ tname }}</div>
+                    <div class="item conf_value">{{ tdata["value"] }}</div>
+                    <div class="item conf_source">{{ tdata["source"] }}</div>
+                </div>
+            {% endfor %}
+            </td></tr>
+        </tbody></table>
+    </div>
+    {% for osdname in cuniq.keys() | sort %}
+    <button type="button" class="row_button">{{ osdname }}: {{ cuniq[osdname] | length }} uniq values</button>
+    <div class="row_content">
+        <table class="ceph_status"><tbody>
+            <tr><td class="metadata">
+            {% for tname, tdata in cuniq[osdname].items() %}
+                <div class="osdconf_group">
+                    <div class="item conf_name">{{ tname }}</div>
+                    <div class="item conf_value">{{ tdata["value"] }}</div>
+                    <div class="item conf_source">{{ tdata["source"] }}</div>
+                </div>
+            {% endfor %}
+            </td></tr>
+        </tbody></table>
+    </div>
+    {% endfor %}
+</div>
+{% endmacro %}
+
 <!-- Latency -->
 {% macro latency_page(lat, id_label) %}
 <div id="{{ id_label }}" class="barcontent">
@@ -942,6 +995,10 @@
     CRUSH map
 {% endcall %}
 
+{% call osdconf_page(info, "osdconf") %}
+    OSD configs
+{% endcall %}
+
 {% call latency_page(info['osd_latency_data'], "latency") %}
     Quick latency check for all OSDs
 {% endcall %}