Matthias Rungehttp://www.matthias-runge.de/2021-12-06T16:00:00+01:00Debugging OpenStack Metrics2021-12-06T16:00:00+01:002021-12-06T16:00:00+01:00mrungetag:www.matthias-runge.de,2021-12-06:/2021/12/06/debugging-openstack-metrics/<h2>Overview</h2>
<p>We'll do the following steps:</p>
<ol>
<li><a href="#metric_get_in">check if metrics are getting in</a></li>
<li><a href="#ceilometer_running">if not, check if ceilometer is running</a></li>
<li><a href="#gnocchi_running">check if gnocchi is running</a></li>
<li><a href="#query_gnocchi">query gnocchi for metrics</a></li>
<li><a href="#query_alarms">check alarming</a></li>
<li><a href="#further_debugging">further debugging</a></li>
</ol>
<h3 id="metric_get_in">Check that metrics are getting in</h3>
<p><code>openstack server list</code></p>
<p>example:</p>
<div class="highlight"><pre><span></span><code><span class="c">$ openstack server list </span><span class="nb">-</span><span class="c">c ID </span><span class="nb">-</span><span class="c">c Name </span><span class="nb">-</span><span class="c">c …</span></code></pre></div><h2>Overview</h2>
<p>We'll do the following steps:</p>
<ol>
<li><a href="#metric_get_in">check if metrics are getting in</a></li>
<li><a href="#ceilometer_running">if not, check if ceilometer is running</a></li>
<li><a href="#gnocchi_running">check if gnocchi is running</a></li>
<li><a href="#query_gnocchi">query gnocchi for metrics</a></li>
<li><a href="#query_alarms">check alarming</a></li>
<li><a href="#further_debugging">further debugging</a></li>
</ol>
<h3 id="metric_get_in">Check that metrics are getting in</h3>
<p><code>openstack server list</code></p>
<p>example:</p>
<div class="highlight"><pre><span></span><code><span class="c">$ openstack server list </span><span class="nb">-</span><span class="c">c ID </span><span class="nb">-</span><span class="c">c Name </span><span class="nb">-</span><span class="c">c Status</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
<span class="c">| ID | Name | Status |</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
<span class="c">| 7e087c31</span><span class="nb">-</span><span class="c">7e9c</span><span class="nb">-</span><span class="c">47f7</span><span class="nb">-</span><span class="c">a4c4</span><span class="nb">-</span><span class="c">ebcc20034faa | foo</span><span class="nb">-</span><span class="c">4 | ACTIVE |</span>
<span class="c">| 977fd250</span><span class="nb">-</span><span class="c">75d4</span><span class="nb">-</span><span class="c">4da3</span><span class="nb">-</span><span class="c">a37c</span><span class="nb">-</span><span class="c">bc7649047151 | foo</span><span class="nb">-</span><span class="c">2 | ACTIVE |</span>
<span class="c">| a1182f44</span><span class="nb">-</span><span class="c">7163</span><span class="nb">-</span><span class="c">4ad9</span><span class="nb">-</span><span class="c">89ed</span><span class="nb">-</span><span class="c">36611f75bac7 | foo</span><span class="nb">-</span><span class="c">5 | ACTIVE |</span>
<span class="c">| a91951b3</span><span class="nb">-</span><span class="c">ff4e</span><span class="nb">-</span><span class="c">46a0</span><span class="nb">-</span><span class="c">a5fd</span><span class="nb">-</span><span class="c">20064f02afc9 | foo</span><span class="nb">-</span><span class="c">3 | ACTIVE |</span>
<span class="c">| f0a62c20</span><span class="nb">-</span><span class="c">2304</span><span class="nb">-</span><span class="c">4c8c</span><span class="nb">-</span><span class="c">aaf5</span><span class="nb">-</span><span class="c">f5bc9d385b5f | foo</span><span class="nb">-</span><span class="c">1 | ACTIVE |</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
</code></pre></div>
<p>We'll use <code>f0a62c20-2304-4c8c-aaf5-f5bc9d385b5f</code>. That's the uuid of the server <code>foo-1</code>. For convenience, the server uuid and the resource ID used in <code>openstack metric resource</code> are the same.</p>
<div class="highlight"><pre><span></span><code>$ openstack metric resource show f0a62c20-2304-4c8c-aaf5-f5bc9d385b5f
+-----------------------+-------------------------------------------------------------------+
<span class="p">|</span> Field <span class="p">|</span> Value <span class="p">|</span>
+-----------------------+-------------------------------------------------------------------+
<span class="p">|</span> created_by_project_id <span class="p">|</span> 6a180caa64894f04b1d04aeed1cb920e <span class="p">|</span>
<span class="p">|</span> created_by_user_id <span class="p">|</span> 39d9e30374a74fe8b58dee9e1dcd7382 <span class="p">|</span>
<span class="p">|</span> creator <span class="p">|</span> 39d9e30374a74fe8b58dee9e1dcd7382:6a180caa64894f04b1d04aeed1cb920e <span class="p">|</span>
<span class="p">|</span> ended_at <span class="p">|</span> None <span class="p">|</span>
<span class="p">|</span> id <span class="p">|</span> f0a62c20-2304-4c8c-aaf5-f5bc9d385b5f <span class="p">|</span>
<span class="p">|</span> metrics <span class="p">|</span> cpu: fe84c113-f98d-42ee-84fd-bdf360842bdb <span class="p">|</span>
<span class="p">|</span> <span class="p">|</span> disk.ephemeral.size: ad79f268-5f56-4ff8-8ece-d1f170621217 <span class="p">|</span>
<span class="p">|</span> <span class="p">|</span> disk.root.size: 6e021f8c-ead0-46e4-bd26-59131318e6a2 <span class="p">|</span>
<span class="p">|</span> <span class="p">|</span> memory.usage: b768ec46-5e49-4d9a-b00d-004f610c152d <span class="p">|</span>
<span class="p">|</span> <span class="p">|</span> memory: 1a4e720a-2151-4265-96cf-4daf633611b2 <span class="p">|</span>
<span class="p">|</span> <span class="p">|</span> vcpus: 68654bc0-8275-4690-9433-27fe4a3aef9e <span class="p">|</span>
<span class="p">|</span> original_resource_id <span class="p">|</span> f0a62c20-2304-4c8c-aaf5-f5bc9d385b5f <span class="p">|</span>
<span class="p">|</span> project_id <span class="p">|</span> 8d077dbea6034e5aa45c0146d1feac5f <span class="p">|</span>
<span class="p">|</span> revision_end <span class="p">|</span> None <span class="p">|</span>
<span class="p">|</span> revision_start <span class="p">|</span> <span class="m">2021</span>-11-09T10:00:46.241527+00:00 <span class="p">|</span>
<span class="p">|</span> started_at <span class="p">|</span> <span class="m">2021</span>-11-09T09:29:12.842149+00:00 <span class="p">|</span>
<span class="p">|</span> <span class="nb">type</span> <span class="p">|</span> instance <span class="p">|</span>
<span class="p">|</span> user_id <span class="p">|</span> 65bfeb6cc8ec4df4a3d53550f7e99a5a <span class="p">|</span>
+-----------------------+-------------------------------------------------------------------+
</code></pre></div>
<p>This list shows the metrics associated with the instance.</p>
<p>You are done here.</p>
<h3 id="ceilometer_running">Checking if ceilometer is running</h3>
<div class="highlight"><pre><span></span><code>$ ssh controller-0 -l root
$ podman ps --format <span class="s2">"{{.Names}} {{.Status}}"</span> <span class="p">|</span> grep ceilometer
ceilometer_agent_central Up <span class="m">2</span> hours ago
ceilometer_agent_notification Up <span class="m">2</span> hours ago
</code></pre></div>
<p>On compute nodes, there should be ceilometer_agent_compute running</p>
<div class="highlight"><pre><span></span><code>$ podman ps --format <span class="s2">"{{.Names}} {{.Status}}"</span> <span class="p">|</span> grep ceilometer
ceilometer_agent_compute Up <span class="m">2</span> hours ago
</code></pre></div>
<p>The metrics are being sent from ceilometer to a remote defined in
<code>/var/lib/config-data/puppet-generated/ceilometer/etc/ceilometer/pipeline.yaml</code>
, which may look similar to the following file</p>
<div class="highlight"><pre><span></span><code>---
sources:
- name: meter_source
meters:
- "*"
sinks:
- meter_sink
sinks:
- name: meter_sink
publishers:
- gnocchi://?filter_project=service&archive_policy=ceilometer-high-rate
- notifier://172.17.1.40:5666/?driver=amqp&topic=metering
</code></pre></div>
<p>In this case, data is sent to both STF and Gnocchi. Next step is to check
if there are any errors happening. On controllers and computes, ceilometer
logs are found in <code>/var/log/containers/ceilometer/</code>. </p>
<p>The <code>agent-notification.log</code> shows logs from publishing data, as well as
errors if sending out metrics or logs fails for some reason.</p>
<p>If there are any errors in the log file, it is likely that metrics are not
being delivered to the remote.</p>
<div class="highlight"><pre><span></span><code><span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">File</span><span class="w"> </span><span class="s">"/usr/lib/python3.6/site-packages/oslo_messaging/transport.py"</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="mf">136</span><span class="p">,</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">_send_notification</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">retry</span><span class="o">=</span><span class="n">retry</span><span class="p">)</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">File</span><span class="w"> </span><span class="s">"/usr/lib/python3.6/site-packages/oslo_messaging/_drivers/impl_amqp1.py"</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="mf">295</span><span class="p">,</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">wrap</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="n">func</span><span class="p">(</span><span class="n">self</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="o">**</span><span class="n">kws</span><span class="p">)</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">File</span><span class="w"> </span><span class="s">"/usr/lib/python3.6/site-packages/oslo_messaging/_drivers/impl_amqp1.py"</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="mf">397</span><span class="p">,</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">send_notification</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">raise</span><span class="w"> </span><span class="n">rc</span><span class="w"></span>
<span class="mf">2021</span><span class="o">-</span><span class="mf">11</span><span class="o">-</span><span class="mf">16</span><span class="w"> </span><span class="mf">07</span><span class="p">:</span><span class="mf">01</span><span class="p">:</span><span class="mf">07.063</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="n">ERROR</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="ow">not</span><span class="kr">if</span><span class="n">y</span><span class="mf">.</span><span class="n">messaging</span><span class="w"> </span><span class="n">oslo_messaging</span><span class="mf">.</span><span class="n">exceptions</span><span class="mf">.</span><span class="n">MessageDeliveryFailure</span><span class="p">:</span><span class="w"> </span><span class="ow">Not</span><span class="kr">if</span><span class="n">y</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="n">sent</span><span class="w"> </span><span class="kr">to</span><span class="w"> </span><span class="o"><</span><span class="n">Target</span><span class="w"> </span><span class="kr">to</span><span class="n">pic</span><span class="o">=</span><span class="n">event</span><span class="mf">.</span><span class="n">sample</span><span class="o">></span><span class="w"> </span><span class="n">failed</span><span class="p">:</span><span class="w"> </span><span class="n">timed</span><span class="w"> </span><span class="n">out</span><span class="w"></span>
</code></pre></div>
<p>In this case, it failes to send messages to the STF instance. The following
example shows the gnocchi api not responding or not being accessible</p>
<div class="highlight"><pre><span></span><code><span class="c">2021</span><span class="nb">-</span><span class="c">11</span><span class="nb">-</span><span class="c">16 10:38:07</span><span class="nt">.</span><span class="c">707 16 ERROR ceilometer</span><span class="nt">.</span><span class="c">publisher</span><span class="nt">.</span><span class="c">gnocchi </span><span class="k">[</span><span class="nb">-</span><span class="k">]</span><span class="c"> </span><span class="nv"><</span><span class="c">html</span><span class="nv">><</span><span class="c">body</span><span class="nv">><</span><span class="c">h1</span><span class="nv">></span><span class="c">503 Service Unavailable</span><span class="nv"><</span><span class="c">/h1</span><span class="nv">></span><span class="c"></span>
<span class="c">No server is available to handle this request</span><span class="nt">.</span><span class="c"></span>
<span class="nv"><</span><span class="c">/body</span><span class="nv">><</span><span class="c">/html</span><span class="nv">></span><span class="c"></span>
<span class="c"> (HTTP 503): gnocchiclient</span><span class="nt">.</span><span class="c">exceptions</span><span class="nt">.</span><span class="c">ClientException: </span><span class="nv"><</span><span class="c">html</span><span class="nv">><</span><span class="c">body</span><span class="nv">><</span><span class="c">h1</span><span class="nv">></span><span class="c">503 Service Unavailable</span><span class="nv"><</span><span class="c">/h1</span><span class="nv">></span><span class="c"></span>
</code></pre></div>
<p>For more gnocchi debugging, see the gnocchi section.</p>
<h3 id="gnocchi_running">Gnocchi</h3>
<p>Gnocchi sits on controller nodes and consists of three separate containers,
gnocchi_metricd, gnocchi_statsd, and gnocchi_api. The latter is for the
interaction with the outside world, such as ingesting metrics or returning
measurements.</p>
<p>Gnocchi metricd are used for re-calculating metrics, downsampling for lower
granularity, etc. Gnocchi logfiles are found under <code>/var/log/containers/gnocchi</code>
and the gnocchi API is hooked into httpd, thus the logfiles are
stored under <code>/var/log/containers/httpd/gnocchi-api/</code>. The corresponding files
there are either <code>gnocchi_wsgi_access.log</code> or <code>gnocchi_wsgi_error.log</code>.</p>
<p>In the case from above (ceilometer section), where ceilometer could not
send metrics to gnocchi, one would also observe log output for the
gnocchi API.</p>
<h3 id="query_gnocchi">Retrieving metrics from Gnocchi</h3>
<p>For a starter, let's see which resources there are.</p>
<div class="highlight"><pre><span></span><code><span class="c">openstack server list </span><span class="nb">-</span><span class="c">c ID </span><span class="nb">-</span><span class="c">c Name </span><span class="nb">-</span><span class="c">c Status</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
<span class="c">| ID | Name | Status |</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
<span class="c">| 7e087c31</span><span class="nb">-</span><span class="c">7e9c</span><span class="nb">-</span><span class="c">47f7</span><span class="nb">-</span><span class="c">a4c4</span><span class="nb">-</span><span class="c">ebcc20034faa | foo</span><span class="nb">-</span><span class="c">4 | ACTIVE |</span>
<span class="c">| 977fd250</span><span class="nb">-</span><span class="c">75d4</span><span class="nb">-</span><span class="c">4da3</span><span class="nb">-</span><span class="c">a37c</span><span class="nb">-</span><span class="c">bc7649047151 | foo</span><span class="nb">-</span><span class="c">2 | ACTIVE |</span>
<span class="c">| a1182f44</span><span class="nb">-</span><span class="c">7163</span><span class="nb">-</span><span class="c">4ad9</span><span class="nb">-</span><span class="c">89ed</span><span class="nb">-</span><span class="c">36611f75bac7 | foo</span><span class="nb">-</span><span class="c">5 | ACTIVE |</span>
<span class="c">| a91951b3</span><span class="nb">-</span><span class="c">ff4e</span><span class="nb">-</span><span class="c">46a0</span><span class="nb">-</span><span class="c">a5fd</span><span class="nb">-</span><span class="c">20064f02afc9 | foo</span><span class="nb">-</span><span class="c">3 | ACTIVE |</span>
<span class="c">| f0a62c20</span><span class="nb">-</span><span class="c">2304</span><span class="nb">-</span><span class="c">4c8c</span><span class="nb">-</span><span class="c">aaf5</span><span class="nb">-</span><span class="c">f5bc9d385b5f | foo</span><span class="nb">-</span><span class="c">1 | ACTIVE |</span>
<span class="nb">+--------------------------------------+-------+--------+</span><span class="c"></span>
</code></pre></div>
<p>To show which metrics are stored for the vm <code>foo-1</code> one would use the following
command</p>
<div class="highlight"><pre><span></span><code><span class="nv">openstack</span> <span class="nv">metric</span> <span class="nv">resource</span> <span class="k">show</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> <span class="o">--</span><span class="nv">max</span><span class="o">-</span><span class="nv">width</span> <span class="mi">75</span>
<span class="o">+-----------------------+-------------------------------------------------+</span>
<span class="o">|</span> <span class="nv">Field</span> <span class="o">|</span> <span class="nv">Value</span> <span class="o">|</span>
<span class="o">+-----------------------+-------------------------------------------------+</span>
<span class="o">|</span> <span class="nv">created_by_project_id</span> <span class="o">|</span> <span class="mi">6</span><span class="nv">a180caa64894f04b1d04aeed1cb920e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">created_by_user_id</span> <span class="o">|</span> <span class="mi">39</span><span class="nv">d9e30374a74fe8b58dee9e1dcd7382</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">creator</span> <span class="o">|</span> <span class="mi">39</span><span class="nv">d9e30374a74fe8b58dee9e1dcd7382</span>:<span class="mi">6</span><span class="nv">a180caa64894f</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="mi">04</span><span class="nv">b1d04aeed1cb920e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">ended_at</span> <span class="o">|</span> <span class="nv">None</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">id</span> <span class="o">|</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">metrics</span> <span class="o">|</span> <span class="nv">cpu</span>: <span class="nv">fe84c113</span><span class="o">-</span><span class="nv">f98d</span><span class="o">-</span><span class="mi">42</span><span class="nv">ee</span><span class="o">-</span><span class="mi">84</span><span class="nv">fd</span><span class="o">-</span><span class="nv">bdf360842bdb</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">disk</span>.<span class="nv">ephemeral</span>.<span class="nv">size</span>: <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">ad79f268</span><span class="o">-</span><span class="mi">5</span><span class="nv">f56</span><span class="o">-</span><span class="mi">4</span><span class="nv">ff8</span><span class="o">-</span><span class="mi">8</span><span class="nv">ece</span><span class="o">-</span><span class="nv">d1f170621217</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">disk</span>.<span class="nv">root</span>.<span class="nv">size</span>: <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="mi">6</span><span class="nv">e021f8c</span><span class="o">-</span><span class="nv">ead0</span><span class="o">-</span><span class="mi">46</span><span class="nv">e4</span><span class="o">-</span><span class="nv">bd26</span><span class="o">-</span><span class="mi">59131318</span><span class="nv">e6a2</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">memory</span>.<span class="nv">usage</span>: <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">b768ec46</span><span class="o">-</span><span class="mi">5</span><span class="nv">e49</span><span class="o">-</span><span class="mi">4</span><span class="nv">d9a</span><span class="o">-</span><span class="nv">b00d</span><span class="o">-</span><span class="mi">004</span><span class="nv">f610c152d</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">memory</span>: <span class="mi">1</span><span class="nv">a4e720a</span><span class="o">-</span><span class="mi">2151</span><span class="o">-</span><span class="mi">4265</span><span class="o">-</span><span class="mi">96</span><span class="nv">cf</span><span class="o">-</span><span class="mi">4</span><span class="nv">daf633611b2</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">vcpus</span>: <span class="mi">68654</span><span class="nv">bc0</span><span class="o">-</span><span class="mi">8275</span><span class="o">-</span><span class="mi">4690</span><span class="o">-</span><span class="mi">9433</span><span class="o">-</span><span class="mi">27</span><span class="nv">fe4a3aef9e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">original_resource_id</span> <span class="o">|</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">project_id</span> <span class="o">|</span> <span class="mi">8</span><span class="nv">d077dbea6034e5aa45c0146d1feac5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">revision_end</span> <span class="o">|</span> <span class="nv">None</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">revision_start</span> <span class="o">|</span> <span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">09</span><span class="nv">T10</span>:<span class="mi">00</span>:<span class="mi">46</span>.<span class="mi">241527</span><span class="o">+</span><span class="mi">00</span>:<span class="mi">00</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">started_at</span> <span class="o">|</span> <span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">09</span><span class="nv">T09</span>:<span class="mi">29</span>:<span class="mi">12</span>.<span class="mi">842149</span><span class="o">+</span><span class="mi">00</span>:<span class="mi">00</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">type</span> <span class="o">|</span> <span class="nv">instance</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">user_id</span> <span class="o">|</span> <span class="mi">65</span><span class="nv">bfeb6cc8ec4df4a3d53550f7e99a5a</span> <span class="o">|</span>
<span class="o">+-----------------------+-------------------------------------------------+</span>
</code></pre></div>
<p>To view the memory usage between Nov 18 2021 17:00 UTC and 17:05 UTC, one
would issue this command:</p>
<div class="highlight"><pre><span></span><code><span class="n">openstack</span><span class="w"> </span><span class="n">metric</span><span class="w"> </span><span class="n">measures</span><span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="o">--</span><span class="n">start</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="se">\</span><span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">stop</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">05</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="se">\</span><span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">aggregation</span><span class="w"> </span><span class="n">mean</span><span class="w"> </span>
<span class="w"> </span><span class="n">b768ec46</span><span class="o">-</span><span class="mf">5e49</span><span class="o">-</span><span class="mh">4</span><span class="n">d9a</span><span class="o">-</span><span class="n">b00d</span><span class="o">-</span><span class="mf">004f</span><span class="mh">610</span><span class="n">c152d</span><span class="w"></span>
<span class="o">+---------------------------+-------------+-------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">timestamp</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">granularity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------------+-------------+-------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">3600.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">01</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">02</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">03</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">04</span><span class="o">:</span><span class="mh">00</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">00</span><span class="o">:</span><span class="mh">14</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">00</span><span class="o">:</span><span class="mh">44</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">01</span><span class="o">:</span><span class="mh">14</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">01</span><span class="o">:</span><span class="mh">44</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">02</span><span class="o">:</span><span class="mh">14</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">02</span><span class="o">:</span><span class="mh">44</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">03</span><span class="o">:</span><span class="mh">14</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">03</span><span class="o">:</span><span class="mh">44</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">04</span><span class="o">:</span><span class="mh">14</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="mh">2021</span><span class="o">-</span><span class="mh">11</span><span class="o">-</span><span class="mh">18</span><span class="nl">T17:</span><span class="mh">04</span><span class="o">:</span><span class="mh">44</span><span class="o">+</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">28.87890625</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------------+-------------+-------------+</span><span class="w"></span>
</code></pre></div>
<p>This shows, the data is available with granularity 3600, 60 and 1 sec. The memory usage does
not change over the time, that's why the values don't change. Please
note, if you'd be asking for values with the granularity of 300,
the result will be empty</p>
<div class="highlight"><pre><span></span><code>$ openstack metric measures show --start <span class="m">2021</span>-11-18T17:00:00 <span class="se">\</span>
--stop <span class="m">2021</span>-11-18T17:05:00 <span class="se">\</span>
--aggregation mean <span class="se">\</span>
--granularity <span class="m">300</span>
b768ec46-5e49-4d9a-b00d-004f610c152d
Aggregation method <span class="s1">'mean'</span> at granularity <span class="s1">'300.0'</span> <span class="k">for</span> metric b768ec46-5e49-4d9a-b00d-004f610c152d does not exist <span class="o">(</span>HTTP <span class="m">404</span><span class="o">)</span>
</code></pre></div>
<p>More info about the metric can be actually listed by using</p>
<div class="highlight"><pre><span></span><code><span class="nv">openstack</span> <span class="nv">metric</span> <span class="k">show</span> <span class="o">--</span><span class="nv">resource</span><span class="o">-</span><span class="nv">id</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> \
<span class="nv">memory</span>.<span class="nv">usage</span> \
<span class="o">--</span><span class="nv">max</span><span class="o">-</span><span class="nv">width</span> <span class="mi">75</span>
<span class="o">+--------------------------------+----------------------------------------+</span>
<span class="o">|</span> <span class="nv">Field</span> <span class="o">|</span> <span class="nv">Value</span> <span class="o">|</span>
<span class="o">+--------------------------------+----------------------------------------+</span>
<span class="o">|</span> <span class="nv">archive_policy</span><span class="o">/</span><span class="nv">name</span> <span class="o">|</span> <span class="nv">ceilometer</span><span class="o">-</span><span class="nv">high</span><span class="o">-</span><span class="nv">rate</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">creator</span> <span class="o">|</span> <span class="mi">39</span><span class="nv">d9e30374a74fe8b58dee9e1dcd7382</span>:<span class="mi">6</span><span class="nv">a180</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">caa64894f04b1d04aeed1cb920e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">id</span> <span class="o">|</span> <span class="nv">b768ec46</span><span class="o">-</span><span class="mi">5</span><span class="nv">e49</span><span class="o">-</span><span class="mi">4</span><span class="nv">d9a</span><span class="o">-</span><span class="nv">b00d</span><span class="o">-</span><span class="mi">004</span><span class="nv">f610c152d</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">name</span> <span class="o">|</span> <span class="nv">memory</span>.<span class="nv">usage</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">created_by_project_id</span> <span class="o">|</span> <span class="mi">6</span><span class="nv">a180caa64894f04b1d04aeed1cb920e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">created_by_user_id</span> <span class="o">|</span> <span class="mi">39</span><span class="nv">d9e30374a74fe8b58dee9e1dcd7382</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">creator</span> <span class="o">|</span> <span class="mi">39</span><span class="nv">d9e30374a74fe8b58dee9e1dcd7382</span>:<span class="mi">6</span><span class="nv">a180</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="nv">caa64894f04b1d04aeed1cb920e</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">ended_at</span> <span class="o">|</span> <span class="nv">None</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">id</span> <span class="o">|</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">original_resource_id</span> <span class="o">|</span> <span class="nv">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="nv">c8c</span><span class="o">-</span><span class="nv">aaf5</span><span class="o">-</span><span class="nv">f5bc9d385b5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">project_id</span> <span class="o">|</span> <span class="mi">8</span><span class="nv">d077dbea6034e5aa45c0146d1feac5f</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">revision_end</span> <span class="o">|</span> <span class="nv">None</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">revision_start</span> <span class="o">|</span> <span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">09</span><span class="nv">T10</span>:<span class="mi">00</span>:<span class="mi">46</span>.<span class="mi">241527</span><span class="o">+</span><span class="mi">00</span>:<span class="mi">00</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">started_at</span> <span class="o">|</span> <span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">09</span><span class="nv">T09</span>:<span class="mi">29</span>:<span class="mi">12</span>.<span class="mi">842149</span><span class="o">+</span><span class="mi">00</span>:<span class="mi">00</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">type</span> <span class="o">|</span> <span class="nv">instance</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">resource</span><span class="o">/</span><span class="nv">user_id</span> <span class="o">|</span> <span class="mi">65</span><span class="nv">bfeb6cc8ec4df4a3d53550f7e99a5a</span> <span class="o">|</span>
<span class="o">|</span> <span class="nv">unit</span> <span class="o">|</span> <span class="nv">MB</span> <span class="o">|</span>
<span class="o">+--------------------------------+----------------------------------------+</span>
</code></pre></div>
<p>It shows in this case, the used archive policy is ceilometer-high-rate.</p>
<div class="highlight"><pre><span></span><code><span class="n">openstack</span><span class="w"> </span><span class="n">metric</span><span class="w"> </span><span class="n">archive</span><span class="o">-</span><span class="n">policy</span><span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="n">ceilometer</span><span class="o">-</span><span class="n">high</span><span class="o">-</span><span class="n">rate</span><span class="w"> </span><span class="o">--</span><span class="n">max</span><span class="o">-</span><span class="n">width</span><span class="w"> </span><span class="mh">75</span><span class="w"></span>
<span class="o">+---------------------+---------------------------------------------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">Field</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Value</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------+---------------------------------------------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">aggregation_methods</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">mean</span><span class="p">,</span><span class="w"> </span><span class="nl">rate:</span><span class="n">mean</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">back_window</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mh">0</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">definition</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nl">timespan:</span><span class="w"> </span><span class="mh">1</span><span class="o">:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="p">,</span><span class="w"> </span><span class="nl">granularity:</span><span class="w"> </span><span class="mh">0</span><span class="o">:</span><span class="mh">00</span><span class="o">:</span><span class="mh">01</span><span class="p">,</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nl">points:</span><span class="w"> </span><span class="mh">3600</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nl">timespan:</span><span class="w"> </span><span class="mh">1</span><span class="w"> </span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mh">0</span><span class="o">:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="p">,</span><span class="w"> </span><span class="nl">granularity:</span><span class="w"> </span><span class="mh">0</span><span class="o">:</span><span class="mh">01</span><span class="o">:</span><span class="mh">00</span><span class="p">,</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nl">points:</span><span class="w"> </span><span class="mh">1440</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nl">timespan:</span><span class="w"> </span><span class="mh">365</span><span class="w"> </span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="mh">0</span><span class="o">:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="p">,</span><span class="w"> </span><span class="nl">granularity:</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mh">1</span><span class="o">:</span><span class="mh">00</span><span class="o">:</span><span class="mh">00</span><span class="p">,</span><span class="w"> </span><span class="nl">points:</span><span class="w"> </span><span class="mh">8760</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ceilometer</span><span class="o">-</span><span class="n">high</span><span class="o">-</span><span class="n">rate</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------+---------------------------------------------------+</span><span class="w"></span>
</code></pre></div>
<p>That means, in this case, the aggregation methods one could use for querying
the metrics are just mean and rate:mean. Other methods could include min or max.</p>
<h3 id="query_alarms">Alarming</h3>
<p>Alarms can be retrieved by issuing</p>
<div class="highlight"><pre><span></span><code>$ openstack alarm list
</code></pre></div>
<p>To create an alarm, for example based on disk.ephemeral.size, one would use something
like</p>
<div class="highlight"><pre><span></span><code><span class="n">openstack</span><span class="w"> </span><span class="n">alarm</span><span class="w"> </span><span class="n">create</span><span class="w"> </span><span class="o">--</span><span class="n">alarm</span><span class="o">-</span><span class="n">action</span><span class="w"> </span><span class="s1">'log://'</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">ok</span><span class="o">-</span><span class="n">action</span><span class="w"> </span><span class="s1">'log://'</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">comparison</span><span class="o">-</span><span class="n">operator</span><span class="w"> </span><span class="n">ge</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">evaluation</span><span class="o">-</span><span class="n">periods</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">granularity</span><span class="w"> </span><span class="mi">60</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">aggregation</span><span class="o">-</span><span class="n">method</span><span class="w"> </span><span class="n">mean</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">metric</span><span class="w"> </span><span class="n">disk</span><span class="o">.</span><span class="n">ephemeral</span><span class="o">.</span><span class="n">size</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">resource</span><span class="o">-</span><span class="n">id</span><span class="w"> </span><span class="n">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="n">c8c</span><span class="o">-</span><span class="n">aaf5</span><span class="o">-</span><span class="n">f5bc9d385b5f</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">name</span><span class="w"> </span><span class="n">ephemeral</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">-</span><span class="n">t</span><span class="w"> </span><span class="n">gnocchi_resources_threshold</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">resource</span><span class="o">-</span><span class="n">type</span><span class="w"> </span><span class="n">instance</span><span class="w"> </span>\<span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">threshold</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="o">+---------------------------+----------------------------------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">Field</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Value</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------------+----------------------------------------+</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">aggregation_method</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">mean</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">alarm_actions</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="s1">'log:'</span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">alarm_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">994</span><span class="n">a1710</span><span class="o">-</span><span class="mf">98e8</span><span class="o">-</span><span class="mi">495</span><span class="n">f</span><span class="o">-</span><span class="mi">89</span><span class="n">b5</span><span class="o">-</span><span class="n">f14349575c96</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">comparison_operator</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ge</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">description</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">gnocchi_resources_threshold</span><span class="w"> </span><span class="n">alarm</span><span class="w"> </span><span class="n">rule</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">enabled</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">True</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">evaluation_periods</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">granularity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">60</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">insufficient_data_actions</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">metric</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">disk</span><span class="o">.</span><span class="n">ephemeral</span><span class="o">.</span><span class="n">size</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ephemeral</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">ok_actions</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="s1">'log:'</span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">project_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">8</span><span class="n">d077dbea6034e5aa45c0146d1feac5f</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">repeat_actions</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">False</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">resource_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">f0a62c20</span><span class="o">-</span><span class="mi">2304</span><span class="o">-</span><span class="mi">4</span><span class="n">c8c</span><span class="o">-</span><span class="n">aaf5</span><span class="o">-</span><span class="n">f5bc9d385b5f</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">resource_type</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">instance</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">severity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">low</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">state</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">insufficient</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">state_reason</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Not</span><span class="w"> </span><span class="n">evaluated</span><span class="w"> </span><span class="n">yet</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">state_timestamp</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">22</span><span class="n">T10</span><span class="p">:</span><span class="mi">16</span><span class="p">:</span><span class="mf">15.250720</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">threshold</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">1.0</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">time_constraints</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">timestamp</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2021</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">22</span><span class="n">T10</span><span class="p">:</span><span class="mi">16</span><span class="p">:</span><span class="mf">15.250720</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">gnocchi_resources_threshold</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">65</span><span class="n">bfeb6cc8ec4df4a3d53550f7e99a5a</span><span class="w"> </span><span class="o">|</span><span class="w"></span>
<span class="o">+---------------------------+----------------------------------------+</span><span class="w"></span>
</code></pre></div>
<p>The state here <code>insufficient data</code> states, the data gathered or
stored is not sufficient to compare against. There is also a state
reason given, in this case <code>Not evaluated yet</code>, which gives an explanation.</p>
<p>Another valid reason could be <code>No datapoint for granularity 60</code>. </p>
<h3 id="further_debugging">Further debugging</h3>
<p>On OpenStack installations deployed via Tripleo aka OSP Director, the log files are located
on the separate nodes under <code>/var/log/containers/{service_name}/</code>. The config files for
the services are stored under <code>/var/lib/config-data/puppet-generated/<service_name></code>
and are mounted into the containers.</p>High memory usage with collectd2021-03-22T16:00:00+01:002021-03-22T16:00:00+01:00mrungetag:www.matthias-runge.de,2021-03-22:/2021/03/22/collectd-memory-usage/<p>collectd itself is intended as lightweight collecting agent for metrics
and events. In larger infrastructure, the data is sent over the network
to a central point, where data is stored and processed further.</p>
<p>This introduces a potential issue: what happens, if the remote endpoint
to write data to is not …</p><p>collectd itself is intended as lightweight collecting agent for metrics
and events. In larger infrastructure, the data is sent over the network
to a central point, where data is stored and processed further.</p>
<p>This introduces a potential issue: what happens, if the remote endpoint
to write data to is not available. The traditional network plugin uses
UDP, which is by definition unreliable.</p>
<p>Collectd has a queue of values to be written to an output plugin, such
was <code>write_http</code> or <code>amqp1</code>. At the time, when metrics should be
written, collectd iterates on that queue and tries to write this data
to the endpoint. If writing was successful, the data is removed from
the queue. The little word <em>if</em> also hints, there is a chance that data
doesn't get removed. The question is: what happens, or what should be
done?</p>
<p>There is no easy answer to this. Some people tend to ignore missed
metrics, some don't. The way to address this is to cap the queue at a
given length and to remove oldest data when new comes in. The parameters
are <code>WriteQueueLimitHigh</code> and <code>WriteQueueLimitLow</code>. If they are unset,
the queue is not limited and will grow until memory is out. For
predictability reasons, you should set these two values to the same
number. To get the <em>right</em> value for this parameter, it would require a
bit of experimentation. If values are dropped, one would see that in
the log file.</p>
<p>When collectd is configured as part of Red Hat OpenStack Platform, the
following config snippet can be used:</p>
<div class="highlight"><pre><span></span><code><span class="n">parameter_defaults</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">ExtraConfig</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">collectd</span><span class="o">::</span><span class="n">write_queue_limit_high</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="w"></span>
<span class="w"> </span><span class="n">collectd</span><span class="o">::</span><span class="n">write_queue_limit_low</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="w"></span>
</code></pre></div>
<p>Another parameter can be used to limit explicitly the queue length in
case the amqp1 plugin is used for sending out data: the <code>SendQueueLimit</code>
parameter, which is used for the same purpose, but can differ from the
global <code>WriteQueueLimitHigh</code> and <code>WriteQueueLimitLow</code>.</p>
<div class="highlight"><pre><span></span><code><span class="n">parameter_defaults</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">ExtraConfig</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">collectd</span><span class="o">::</span><span class="n">plugin</span><span class="o">::</span><span class="n">amqp1</span><span class="o">::</span><span class="n">send_queue_limit</span><span class="o">:</span><span class="w"> </span><span class="mi">50</span><span class="w"></span>
</code></pre></div>
<p>In almost all cases, the issue of collectd using much memory could be
tracked down to a write endpoint not being available, dropping data
occasionally, etc.</p>Kubernetes on Raspberry Pi 4 on Fedora2021-01-04T11:00:00+01:002021-01-04T11:00:00+01:00mrungetag:www.matthias-runge.de,2021-01-04:/2021/01/04/k8s-raspi4-fedora/<p>Recently, I bought a couple of Raspberry Pi 4, one with 4 GB and 2
equipped with 8 GB of RAM. When I bought the first one, there was no
option to get bigger memory. However, I saw this as a game and thought
to give this a try. I …</p><p>Recently, I bought a couple of Raspberry Pi 4, one with 4 GB and 2
equipped with 8 GB of RAM. When I bought the first one, there was no
option to get bigger memory. However, I saw this as a game and thought
to give this a try. I also bought SSDs for these and USB3 to SATA
adapters. Before purchasing anything, you may want to take a look at
<a href="https://jamesachambers.com/raspberry-pi-4-usb-boot-config-guide-for-ssd-flash-drives/">James Archers page</a>.
Unfortunately, there are a couple on adapters on the marked, which
don't work that well.</p>
<h2>Deploying Fedora 33 Server</h2>
<p>Initially, I followed the <a href="https://fwmotion.com/blog/operating-systems/2020-09-04-installing-fedora-server-onto-pi4/">description</a>
to deploy Fedora 32; it works the same way for Fedora 33 Server (in my case here).</p>
<p>Because ceph requires a partition (or better: a whole disk), I used the
traditional setup using partitions and no LVM.</p>
<h2>Deploying Kubernetes</h2>
<div class="highlight"><pre><span></span><code>git clone https://github.com/kubernetes-sigs/kubespray
<span class="nb">cd</span> kubespray
</code></pre></div>
<p>I followed the documentation and created an inventory. For the container
runtime, I picked <code>crio</code>, and as <code>calico</code> as network plugin.</p>
<p>Because of <a href="https://github.com/projectcalico/calico/issues/4256">an issue</a>,
I had to patch <code>roles/download/defaults/main.yml</code>:</p>
<div class="highlight"><pre><span></span><code><span class="gh">diff --git a/roles/download/defaults/main.yml b/roles/download/defaults/main.yml</span><span class="w"></span>
<span class="gh">index a97be5a6..d4abb341 100644</span><span class="w"></span>
<span class="gd">--- a/roles/download/defaults/main.yml</span><span class="w"></span>
<span class="gi">+++ b/roles/download/defaults/main.yml</span><span class="w"></span>
<span class="gu">@@ -64,7 +64,7 @@ quay_image_repo: "quay.io"</span><span class="w"></span>
<span class="w"> </span># TODO(mattymo): Move calico versions to roles/network_plugins/calico/defaults<span class="w"></span>
<span class="w"> </span># after migration to container download<span class="w"></span>
<span class="gd">-calico_version: "v3.16.5"</span><span class="w"></span>
<span class="gi">+calico_version: "v3.15.2"</span><span class="w"></span>
<span class="w"> </span>calico_ctl_version: "{{ calico_version }}"<span class="w"></span>
<span class="w"> </span>calico_cni_version: "{{ calico_version }}"<span class="w"></span>
<span class="w"> </span>calico_policy_version: "{{ calico_version }}"<span class="w"></span>
<span class="gu">@@ -520,13 +520,13 @@ etcd_image_tag: "{{ etcd_version }}{%- if image_arch != 'amd64' -%}-{{ image_arc</span><span class="w"></span>
<span class="w"> </span>flannel_image_repo: "{{ quay_image_repo }}/coreos/flannel"<span class="w"></span>
<span class="w"> </span>flannel_image_tag: "{{ flannel_version }}"<span class="w"></span>
<span class="w"> </span>calico_node_image_repo: "{{ quay_image_repo }}/calico/node"<span class="w"></span>
<span class="gd">-calico_node_image_tag: "{{ calico_version }}"</span><span class="w"></span>
<span class="gi">+calico_node_image_tag: "{{ calico_version }}-arm64"</span><span class="w"></span>
<span class="w"> </span>calico_cni_image_repo: "{{ quay_image_repo }}/calico/cni"<span class="w"></span>
<span class="gd">-calico_cni_image_tag: "{{ calico_cni_version }}"</span><span class="w"></span>
<span class="gi">+calico_cni_image_tag: "{{ calico_cni_version }}-arm64"</span><span class="w"></span>
<span class="w"> </span>calico_policy_image_repo: "{{ quay_image_repo }}/calico/kube-controllers"<span class="w"></span>
<span class="gd">-calico_policy_image_tag: "{{ calico_policy_version }}"</span><span class="w"></span>
<span class="gi">+calico_policy_image_tag: "{{ calico_policy_version }}-arm64"</span><span class="w"></span>
<span class="w"> </span>calico_typha_image_repo: "{{ quay_image_repo }}/calico/typha"<span class="w"></span>
<span class="gd">-calico_typha_image_tag: "{{ calico_typha_version }}"</span><span class="w"></span>
<span class="gi">+calico_typha_image_tag: "{{ calico_typha_version }}-arm64"</span><span class="w"></span>
<span class="w"> </span>pod_infra_image_repo: "{{ kube_image_repo }}/pause"<span class="w"></span>
<span class="w"> </span>pod_infra_image_tag: "{{ pod_infra_version }}"<span class="w"></span>
<span class="w"> </span>install_socat_image_repo: "{{ docker_image_repo }}/xueshanf/install-socat"<span class="w"></span>
</code></pre></div>
<h2>Deploy Ceph</h2>
<p>Ceph requires a raw partition. Make sure, you have an empty partition available.</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span>root@node1 ~<span class="o">]</span><span class="c1"># lsblk -f</span>
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1
│ vfat FAT32 UEFI 7DC7-A592
├─sda2
│ vfat FAT32 CB75-24A9 <span class="m">567</span>.9M <span class="m">1</span>% /boot/efi
├─sda3
│ xfs cab851cb-1910-453b-ae98-f6a2abc7f0e0 <span class="m">804</span>.7M <span class="m">23</span>% /boot
├─sda4
│
├─sda5
│ xfs 6618a668-f165-48cc-9441-98f4e2cc0340 <span class="m">27</span>.6G <span class="m">45</span>% /
└─sda6
</code></pre></div>
<p>In my case, there are <code>sda4</code> and <code>sda6</code> not formatted. <code>sda4</code> is very
small and will be ignored, <code>sda6</code> will be used.</p>
<p>Using rook is pretty straightforward</p>
<div class="highlight"><pre><span></span><code>git clone --single-branch --branch v1.5.4 https://github.com/rook/rook.git
<span class="nb">cd</span> rook/cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl create -f cluster.yaml
</code></pre></div>Config snippets for collectd configured by TripleO2020-07-15T15:00:00+02:002020-07-15T15:00:00+02:00mrungetag:www.matthias-runge.de,2020-07-15:/2020/07/15/collectd-config/<p>This is mostly a brain dump for myself for later reference, but may
be also useful for others.</p>
<p>As I wrote in an earlier <a class="reference external" href="http://www.matthias-runge.de/2018/06/08/tripleo-collectd/">post</a>, collectd is configured on OpenStack
TripleO driven deployments by a config file.</p>
<pre class="code yaml literal-block">
<span class="nt">parameter_defaults</span><span class="p">:</span><span class="w">
</span><span class="nt">CollectdExtraPlugins</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">write_http</span><span class="w">
</span><span class="nt">ExtraConfig</span><span class="p">:</span><span class="w">
</span><span class="l-Scalar-Plain">collectd::plugin::write_http::nodes</span><span class="p-Indicator">:</span><span class="w">
</span><span class="nt">collectd</span><span class="p">:</span><span class="w">
</span><span class="nt">url …</span></pre><p>This is mostly a brain dump for myself for later reference, but may
be also useful for others.</p>
<p>As I wrote in an earlier <a class="reference external" href="http://www.matthias-runge.de/2018/06/08/tripleo-collectd/">post</a>, collectd is configured on OpenStack
TripleO driven deployments by a config file.</p>
<pre class="code yaml literal-block">
<span class="nt">parameter_defaults</span><span class="p">:</span><span class="w">
</span><span class="nt">CollectdExtraPlugins</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">write_http</span><span class="w">
</span><span class="nt">ExtraConfig</span><span class="p">:</span><span class="w">
</span><span class="l-Scalar-Plain">collectd::plugin::write_http::nodes</span><span class="p-Indicator">:</span><span class="w">
</span><span class="nt">collectd</span><span class="p">:</span><span class="w">
</span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">collectd1.tld.org</span><span class="w">
</span><span class="nt">metrics</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">true</span><span class="w">
</span><span class="nt">header</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">foobar</span>
</pre>
<p>The collectd exec plugin comes handy when launching some third party
script. However, the config may be a bit tricky, for example to execute
<cite>/usr/bin/true</cite> one would insert</p>
<pre class="code yaml literal-block">
<span class="nt">parameter_defaults</span><span class="p">:</span><span class="w">
</span><span class="nt">CollectdExtraPlugins</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">exec</span><span class="w">
</span><span class="nt">ExtraConfig</span><span class="p">:</span><span class="w">
</span><span class="l-Scalar-Plain">collectd::plugin::exec::commands</span><span class="p-Indicator">:</span><span class="w">
</span><span class="nt">healthcheck</span><span class="p">:</span><span class="w">
</span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="s">"collectd"</span><span class="w">
</span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="s">"collectd"</span><span class="w">
</span><span class="nt">exec</span><span class="p">:</span><span class="w"> </span><span class="p-Indicator">[</span><span class="s">"/usr/bin/true"</span><span class="p-Indicator">,]</span>
</pre>
Service Assurance on small OpenShift Cluster2019-07-09T16:50:00+02:002019-07-09T16:50:00+02:00mrungetag:www.matthias-runge.de,2019-07-09:/2019/07/09/Service-Assurance-on-ocp/<p>This article is intended to give an overview on how to test the
<a class="reference external" href="https://telemetry-framework.readthedocs.io/en/master/">Service Assurance Framework</a> on a small deployment of OpenShift.</p>
<p>I've started with a deployment of RHEL 7.x on a baremetal machine.</p>
<p>After using subscribtion-manager to subscribe and attach, I made sure
to have the necessary repositories …</p><p>This article is intended to give an overview on how to test the
<a class="reference external" href="https://telemetry-framework.readthedocs.io/en/master/">Service Assurance Framework</a> on a small deployment of OpenShift.</p>
<p>I've started with a deployment of RHEL 7.x on a baremetal machine.</p>
<p>After using subscribtion-manager to subscribe and attach, I made sure
to have the necessary repositories enabled</p>
<pre class="code bash literal-block">
subscribtion-manager repos --enable<span class="o">=</span>amq-interconnect-1-for-rhel-7-server-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-extras-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-ose-3.11-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-optional-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-openstack-14-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-openstack-14-optools-rpms <span class="se">\
</span> --enable<span class="o">=</span>rhel-7-server-rpms
</pre>
<p>As usual, do a <tt class="docutils literal">yum <span class="pre">-y</span> update</tt>.</p>
<p>oc cluster needs to take full control on iptables rules. Thus disable
firewalld, just in case it is running</p>
<pre class="code bash literal-block">
systemctl disable firewalld
</pre>
<p>Also install docker:</p>
<pre class="code bash literal-block">
yum install docker
</pre>
<p>Now it is time to change the default docker network. Edit <cite>/etc/docker/daemon.json</cite>
and make it read:</p>
<pre class="code literal-block">
{
"bip":"172.30.0.1/24"
}
</pre>
<p>Now it's time to enable docker daemon</p>
<pre class="code bash literal-block">
systemctl <span class="nb">enable</span> docker
</pre>
<p>Pulling images from Red Hat Service Registry requires authorization.
Log into the <a class="reference external" href="https://access.redhat.com/terms-based-registry/#/accounts">container registry</a> to generate a token and download the
docker configuration JSON file. That needs to be saved (as described
there under <cite>~/.docker/config.json</cite>.</p>
<p>Now please reboot your machine. Apparently, there is an <a class="reference external" href="https://github.com/openshift/origin/issues/21404">issue in
oc cluster</a>, which requires a workaround:</p>
<pre class="code bash literal-block">
mkdir /var/lib/minishift
mount --bind --make-rshared /var/lib/minishift/ /var/lib/minishift
</pre>
<p>and then finally, we can get OpsnShift up and running:</p>
<pre class="code bash literal-block">
oc cluster up --public-hostname<span class="o">=</span><span class="k">$(</span>hostname<span class="k">)</span> --base-dir /var/lib/minishift
</pre>
<p>That should finish successfully after a short time. Then, if you haven't done so far</p>
<pre class="code bash literal-block">
yum -y install git
git clone https://github.com/redhat-service-assurance/telemetry-framework.git
</pre>
<p>Change into <tt class="docutils literal"><span class="pre">telemetry-framework/deploy</span></tt>. You'll need a token in order to
get access to downstream containers. Log into the <a class="reference external" href="https://access.redhat.com/terms-based-registry/#/accounts">container registry</a> and create
a token. Dowload and save the secret in a file <tt class="docutils literal"><span class="pre">serviceassurance-secret.yaml</span></tt>.
Finally execute run:</p>
<pre class="code bash literal-block">
oc login -u system:admin
oc new-project sa-telemetry
oc create -f ~/telemetry-framework/deploy/serviceassurance-secret.yaml
openssl req -new -x509 -batch -nodes -days <span class="m">11000</span> <span class="se">\
</span> -subj <span class="s2">"/O=io.interconnectedcloud/CN=qdr-white.sa-telemetry.svc.cluster.local"</span> <span class="se">\
</span> -out qdr-server-certs/tls.crt <span class="se">\
</span> -keyout qdr-server-certs/tls.key
oc create secret tls qdr-white-cert --cert<span class="o">=</span>qdr-server-certs/tls.crt --key<span class="o">=</span>qdr-server-certs/tls.key
ansible-playbook <span class="se">\
</span>-e <span class="s2">"registry_path=</span><span class="k">$(</span>oc registry info<span class="k">)</span><span class="s2">"</span> <span class="se">\
</span>-e <span class="s2">"imagestream_namespace=</span><span class="k">$(</span>oc project --short<span class="k">)</span><span class="s2">"</span> <span class="se">\
</span>deploy_builder.yml
<span class="c1"># need to patch a node in order to allow the current version of the SGO to deploy a SG
</span>oc patch node localhost -p <span class="s1">'{"metadata":{"labels":{"application": "sa-telemetry", "node": "white"}}}'</span>
./import-downstream.sh
</pre>
<p>Once the containers are imported, run</p>
<pre class="code bash literal-block">
deploy.sh
</pre>
<p>Press ctrl+c once the prometheus-operator is marked as running.</p>
Collectd contributors meetup in Brussels2019-02-04T11:40:00+01:002019-02-04T11:40:00+01:00mrungetag:www.matthias-runge.de,2019-02-04:/2019/02/04/collectd-meetup-bru/<p>Last week, on January 31 and Feb 01, we had a contributors meetup of
<a class="reference external" href="https://collectd.org">collectd</a> in Brussels, just before <a class="reference external" href="https://fosdem.org/2019/">FOSDEM</a>. Thanks to our generous
sponsors <a class="reference external" href="https://www.camptocamp.com/">Camptocamp</a>, <a class="reference external" href="https://www.intel.com/">Intel</a>, and <a class="reference external" href="https://www.redhat.com/">Red Hat</a>, we were able to meet
and to talk about various topics. In total, there were 15 persons
attending, and if …</p><p>Last week, on January 31 and Feb 01, we had a contributors meetup of
<a class="reference external" href="https://collectd.org">collectd</a> in Brussels, just before <a class="reference external" href="https://fosdem.org/2019/">FOSDEM</a>. Thanks to our generous
sponsors <a class="reference external" href="https://www.camptocamp.com/">Camptocamp</a>, <a class="reference external" href="https://www.intel.com/">Intel</a>, and <a class="reference external" href="https://www.redhat.com/">Red Hat</a>, we were able to meet
and to talk about various topics. In total, there were 15 persons
attending, and if I'm not mistaken, all of them were sent by their
employers, which underlines the interest here again.</p>
<blockquote>
<ul>
<li><p class="first">There was a request or suggestion, to have a monthly video call or
a chat irc meeting to talk about progress, or to address issues
raised over reviews.
That could be a joint call monthly with the <a class="reference external" href="https://wiki.opnfv.org/display/fastpath/Barometer+Home">OPNFV Barometer</a>
community. More info and also minutes are <a class="reference external" href="https://wiki.opnfv.org/display/fastpath/Meetings">available</a>.</p>
</li>
<li><p class="first">We also talked about the concept of <a class="reference external" href="https://github.com/collectd/collectd/issues/2958">code-ownership</a>, and decided
to give it a try.</p>
</li>
<li><p class="first">Although the wiki registration is disabled, we would continue with using
the current mediawiki for now. Octo pointed out, that spammers were
causing real issues and work. If there is a request for getting a wiki
account, please get in touch with one of the maintainers.</p>
</li>
<li><p class="first">In the session we had about testing and reviving CI tests, we briefly
discussed both functional and also integration tests. Especially the
latter will require some investigation. Marc already started to set-up
and fix the CI for collectd on github.</p>
</li>
<li><p class="first">In the release process session, we went through the current release
process and talked about possible automations, or how to make it a less
time consuming process. Especially writing release notes or the changelog
took time in the past. At the end, we decided to target three releases
per year, as already happened in the past. That would be mid of March,
mid of August and mid of December, with code-freeze/feature freeze at
the beginning of the aforementioned months.</p>
<p>Contributors of new features should also write a changelog item. This
will become enforced by a bot, which octo added and enabled during
the event.</p>
</li>
<li><p class="first">There was also a brief discussion over the lack of code reviews or
a try to understand, why (new) contributors are not doing reviews. The
general suggestion was to do them anyways, since it helps the project.
If reviews are hard, then the involved code should get rewritten, since
it wasn't clearly understandable.</p>
</li>
<li><p class="first">For a upcoming future major release, there was the expressed interest
in having labels for metrics. There is a <a class="reference external" href="https://docs.google.com/document/d/173gGP3tUD3yfN2NNHxCv0BsKsacfDlSyoaQIn7MqLtQ">design document</a> open up for
discussion, and we also briefly talked about a migration plan. At the
end, a collectd 5 client should still be able to cooperate with the
new version, e.g via the network plugin.</p>
</li>
<li><p class="first">A often mentioned feature request is also the (un)loading of plugins
and with that tightly connected the ability of re-configuring plugins
at runtime and ideally having a API. This will take some further
investigation.</p>
</li>
</ul>
</blockquote>
Configuring collectd plugins with TripleO2018-06-08T08:40:00+02:002018-06-08T08:40:00+02:00mrungetag:www.matthias-runge.de,2018-06-08:/2018/06/08/tripleo-collectd/<p>A way of deploying OpenStack is to use TripleO. This takes the an
approach to deploy a small OpenStack environment, and then to take
OpenStack provided infrastructure and tools to deploy the actual
production environment. This is actually done by an addition to the
openstack command line client:</p>
<pre class="code bash literal-block">
openstack overcloud …</pre><p>A way of deploying OpenStack is to use TripleO. This takes the an
approach to deploy a small OpenStack environment, and then to take
OpenStack provided infrastructure and tools to deploy the actual
production environment. This is actually done by an addition to the
openstack command line client:</p>
<pre class="code bash literal-block">
openstack overcloud deploy <span class="se">\
</span> --templates /usr/share/openstack-tripleo-heat-templates <span class="se">\
</span> -e ....
</pre>
<p>For performance metrics, there are a few <a class="reference external" href="https://collectd.org/wiki/index.php/Table_of_Plugins">collectd plugins</a> configured
by default. If there is a need for more, just add them to
<tt class="docutils literal">CollectdExtraPlugins</tt>, as shown below. Usually, this would be done by
creating a file, e.g <tt class="docutils literal">collectd.yaml</tt> and make it read like the following
example.</p>
<pre class="code yaml literal-block">
<span class="l-Scalar-Plain">parameter_defaults</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">CollectdExtraPlugins</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">cpu</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">disk</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">df</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">hugepages</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">interface</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">memory</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">ovs_events</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">ovs_stats</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">processes</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">virt</span>
<span class="l-Scalar-Plain">ExtraConfig</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">collectd::plugin::df::ignoreselected</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">true</span>
<span class="l-Scalar-Plain">collectd::plugin::interface::ignoreselected</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">true</span>
<span class="l-Scalar-Plain">collectd::plugin::virt::connection</span><span class="p-Indicator">:</span> <span class="s">"qemu:///system"</span>
<span class="l-Scalar-Plain">collectd::plugin::virt::hostname_format</span><span class="p-Indicator">:</span> <span class="s">"hostname</span><span class="nv"> </span><span class="s">uuid"</span>
</pre>
<p>Finally, if you saved <tt class="docutils literal">collectd.yaml</tt> to <tt class="docutils literal">/home/stack/collectd.yaml</tt>
one would call it, like in the following code</p>
<pre class="code bash literal-block">
openstack overcloud deploy <span class="se">\
</span> --templates /usr/share/openstack-tripleo-heat-templates <span class="se">\
</span> ...
-e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/collectd.yaml <span class="se">\
</span> -e /home/stack/collectd.yaml
</pre>
Testing TripleO on own OpenStack deployment2018-02-16T09:30:00+01:002018-02-16T09:30:00+01:00mrungetag:www.matthias-runge.de,2018-02-16:/2018/02/16/tripleo-ovb/<p>For some use cases, it's quite useful to test <a class="reference external" href="http://tripleo.org/">TripleO</a> deployments
on a OpenStack powered cloud, rather than using a baremetal system.
The following article will show you, how to do it:</p>
<p>We're going to use <a class="reference external" href="https://github.com/openstack/tripleo-quickstart">tripleo-quickstart</a> . This also assumes, you
have downloaded your OpenStack openrc.sh handy and stored …</p><p>For some use cases, it's quite useful to test <a class="reference external" href="http://tripleo.org/">TripleO</a> deployments
on a OpenStack powered cloud, rather than using a baremetal system.
The following article will show you, how to do it:</p>
<p>We're going to use <a class="reference external" href="https://github.com/openstack/tripleo-quickstart">tripleo-quickstart</a> . This also assumes, you
have downloaded your OpenStack openrc.sh handy and stored e.g in your
home directory. I've also created another flavor, named tripleo-bm
with 12 Gigs memory and 6 vcpus. In doubt, just give it more RAM.</p>
<pre class="code bash literal-block">
git clone https://github.com/openstack/tripleo-quickstart
git clone https://github.com/openstack/tripleo-quickstart-extras
cp tripleo-quickstart-extras/config/environments/rdcloud.yml tripleo-quickstart/config/environments/mycloud.yml
</pre>
<p>This copies the configuration for use of RDO-Cloud over, to be ready for
own and required customization. You'll need to modify the file
<tt class="docutils literal"><span class="pre">tripleo-quickstart/config/environments/mycloud.yml</span></tt></p>
<pre class="code yaml literal-block">
<span class="l-Scalar-Plain">os_username</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">lookup('env','OS_USERNAME')</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">os_password</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">lookup('env','OS_PASSWORD')</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">os_tenant_name</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">lookup('env','OS_TENANT_NAME')</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">os_auth_url</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">lookup('env','OS_AUTH_URL')</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">os_region_name</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">lookup('env',</span><span class="nv"> </span><span class="s">'OS_REGION_NAME')</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">cloud_name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">rdocloud</span>
<span class="l-Scalar-Plain">latest_guest_image</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">newton</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">CentOS-7-x86_64-GenericCloud-1711</span>
<span class="l-Scalar-Plain">ocata</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">CentOS-7-x86_64-GenericCloud-1711</span>
<span class="l-Scalar-Plain">master</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">CentOS-x86_64-GenericCloud-1708</span>
<span class="l-Scalar-Plain">bmc_flavor</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">m1.small</span>
<span class="l-Scalar-Plain">baremetal_flavor</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">m1.large</span>
<span class="l-Scalar-Plain">undercloud_flavor</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">tripleo-bm</span>
<span class="l-Scalar-Plain">provision_net_cidr</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">192.168.24.0/24</span>
<span class="l-Scalar-Plain">custom_nameserver</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">192.168.36.9</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">192.168.36.1</span>
<span class="l-Scalar-Plain">undercloud_undercloud_nameservers</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">custom_nameserver</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">external_net</span><span class="p-Indicator">:</span> <span class="s">'ext-net'</span>
<span class="l-Scalar-Plain">overcloud_dns_servers</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">custom_nameserver</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">ntp_server</span><span class="p-Indicator">:</span> <span class="s">'192.168.36.1'</span>
<span class="l-Scalar-Plain">boot_from_volume</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">true</span>
<span class="l-Scalar-Plain">overcloud_image_url</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">http://images.rdoproject.org/{{ release }}/rdo_trunk/{{ dlrn_hash|default(dlrn_hash_tag) }}/overcloud-full.tar</span>
<span class="l-Scalar-Plain">ipa_image_url</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">http://images.rdoproject.org/{{ release }}/rdo_trunk/{{ dlrn_hash|default(dlrn_hash_tag) }}/ironic-python-agent.tar</span>
<span class="l-Scalar-Plain">docker_registry_host</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">trunk.registry.rdoproject.org</span>
<span class="l-Scalar-Plain">docker_registry_namespace</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">release</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">mtu</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">1350</span>
<span class="l-Scalar-Plain">mtu_interface</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">eth0</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">eth1</span>
<span class="p-Indicator">-</span> <span class="s">"{%</span><span class="nv"> </span><span class="s">if</span><span class="nv"> </span><span class="s">network_isolation|default(true)|bool</span><span class="nv"> </span><span class="s">%}eth2{%</span><span class="nv"> </span><span class="s">endif</span><span class="nv"> </span><span class="s">%}"</span>
<span class="l-Scalar-Plain">undercloud_local_mtu</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">mtu</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">overcloud_neutron_global_physnet_mtu</span><span class="p-Indicator">:</span> <span class="s">"{{</span><span class="nv"> </span><span class="s">mtu</span><span class="nv"> </span><span class="s">}}"</span>
<span class="l-Scalar-Plain">run_tripleo_validations</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">False</span>
<span class="c1"># containerized_overcloud: False</span>
</pre>
<p>Besides minor things like DNS or ntp, one probably needs to adjust are
flavors: They need to exist in your setup. When in doubt, insert a larger
flavor. Also one needs to configure <tt class="docutils literal">external_net</tt>. It should name
the external network in your OpenStack environment, like returned
by <tt class="docutils literal">openstack network list <span class="pre">--external</span></tt>. The guest images
need to exist, at least the one for master. If you don't have
an image you can fetch it <a class="reference external" href="http://cloud.centos.org/centos/7/images/">here</a>. The rest can be kept as it is.</p>
<p>Finally, to get reproducible deployments easier, I created a script <tt class="docutils literal">deploy.sh</tt>
to fire up deployments using my customization.</p>
<pre class="code bash literal-block">
<span class="nb">source</span> ~/openrc.sh
<span class="nb">export</span> <span class="nv">ENVIRONMENT</span><span class="o">=</span><span class="s2">"mycloud"</span>
<span class="nb">export</span> <span class="nv">CUSTOM_REQUIREMENTS_INSTALL</span><span class="o">=</span><span class="s2">" ansible-lint"</span>
rm -rf /var/tmp/tripleo_local
bash devmode.sh --no-gate --ovb -d -w /var/tmp/tripleo_local
</pre>
<p>If something happens, please file <a class="reference external" href="https://bugs.launchpad.net/tripleo">bugs</a></p>
Operational Tools in CentOS2016-08-22T14:25:00+02:002016-08-22T14:25:00+02:00mrungetag:www.matthias-runge.de,2016-08-22:/2016/08/22/opstools/<p>A while ago, we proposed the <a class="reference external" href="https://wiki.centos.org/SpecialInterestGroup/OpsTools">OpsTools SIG</a>. Its idea is to
provide tools for operators, system administrators, etc.</p>
<p>Now we have a repository for <em>testing</em> purposes:</p>
<pre class="code bash literal-block">
yum install http://buildlogs.centos.org/centos/7/opstools/x86_64/common/centos-release-opstools-1-2.el7.noarch.rpm
</pre>
<p>Documentation can be found on <a class="reference external" href="https://github.com/centos-opstools/opstools-doc">GitHub</a>, and …</p><p>A while ago, we proposed the <a class="reference external" href="https://wiki.centos.org/SpecialInterestGroup/OpsTools">OpsTools SIG</a>. Its idea is to
provide tools for operators, system administrators, etc.</p>
<p>Now we have a repository for <em>testing</em> purposes:</p>
<pre class="code bash literal-block">
yum install http://buildlogs.centos.org/centos/7/opstools/x86_64/common/centos-release-opstools-1-2.el7.noarch.rpm
</pre>
<p>Documentation can be found on <a class="reference external" href="https://github.com/centos-opstools/opstools-doc">GitHub</a>, and we really love pull requests.</p>
Disable "Resource Usage"-dashboard in Horizon2016-01-22T09:05:00+01:002016-01-22T09:05:00+01:00mrungetag:www.matthias-runge.de,2016-01-22:/2016/01/22/disable-metering-dashboard/<p>When using Horizon as Admin user, you probably saw the metering
dashboard, also known as "Resource Usage".</p>
<p>It internally uses Ceilometer; Ceilometer continuously collects
data from configured data sources. In a cloud environment, this
can quickly grow enormously. When someone visits the metering
dashboard in Horizon, Ceilometer then will accumulate …</p><p>When using Horizon as Admin user, you probably saw the metering
dashboard, also known as "Resource Usage".</p>
<p>It internally uses Ceilometer; Ceilometer continuously collects
data from configured data sources. In a cloud environment, this
can quickly grow enormously. When someone visits the metering
dashboard in Horizon, Ceilometer then will accumulate requested data
on the fly.</p>
<p>On the medium term, Horizon should switch to use <a class="reference external" href="http://gnocchi.xyz/">gnocchi</a>; in between,
if you're tired on waiting, just disable metering dasboard e.g by placing
the file like <tt class="docutils literal">_99_disable_metering_dashboard.py</tt> to
<tt class="docutils literal"><span class="pre">/usr/share/openstack-dashboard/openstack_dashboard/local/enabled</span></tt></p>
<pre class="code python literal-block">
<span class="c1"># The slug of the panel to be added to HORIZON_CONFIG. Required.</span>
<span class="n">PANEL</span> <span class="o">=</span> <span class="s1">'metering'</span>
<span class="c1"># The slug of the dashboard the PANEL associated with. Required.</span>
<span class="n">PANEL_DASHBOARD</span> <span class="o">=</span> <span class="s1">'admin'</span>
<span class="c1"># The slug of the panel group the PANEL is associated with.</span>
<span class="n">PANEL_GROUP</span> <span class="o">=</span> <span class="s1">'admin'</span>
<span class="n">REMOVE_PANEL</span> <span class="o">=</span> <span class="bp">True</span>
</pre>
<p>Finally, restart httpd:</p>
<pre class="code bash literal-block">
systemctl restart httpd
</pre>
Caching in Horizon with Redis2016-01-19T11:50:00+01:002016-01-19T11:50:00+01:00mrungetag:www.matthias-runge.de,2016-01-19:/2016/01/19/horizon-redis-caching/<p><a class="reference external" href="http://redis.io/">Redis</a> is a in-memory data structure store, which can be used as
cache and session backend.</p>
<p>I thought to give it a try for Horizon.
Installation is quite simple, either <tt class="docutils literal">pip install <span class="pre">django-redis</span></tt>
or <tt class="docutils literal">dnf <span class="pre">--enablerepo=rawhide</span> install <span class="pre">python-django-redis</span></tt>.</p>
<p>Then change <tt class="docutils literal">openstack_dashboard/local/local_settings.py</tt> aka.
<tt class="docutils literal"><span class="pre">/etc/openstack-dashboard …</span></tt></p><p><a class="reference external" href="http://redis.io/">Redis</a> is a in-memory data structure store, which can be used as
cache and session backend.</p>
<p>I thought to give it a try for Horizon.
Installation is quite simple, either <tt class="docutils literal">pip install <span class="pre">django-redis</span></tt>
or <tt class="docutils literal">dnf <span class="pre">--enablerepo=rawhide</span> install <span class="pre">python-django-redis</span></tt>.</p>
<p>Then change <tt class="docutils literal">openstack_dashboard/local/local_settings.py</tt> aka.
<tt class="docutils literal"><span class="pre">/etc/openstack-dashboard/local_settings</span></tt> to incorporate</p>
<pre class="code python literal-block">
<span class="n">CACHES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">"default"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"BACKEND"</span><span class="p">:</span> <span class="s2">"django_redis.cache.RedisCache"</span><span class="p">,</span>
<span class="s2">"LOCATION"</span><span class="p">:</span> <span class="s2">"redis://127.0.0.1:6379/1"</span><span class="p">,</span>
<span class="s2">"OPTIONS"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"CLIENT_CLASS"</span><span class="p">:</span> <span class="s2">"django_redis.client.DefaultClient"</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre>
<p>Make sure you also have something like</p>
<pre class="code python literal-block">
<span class="n">SESSION_ENGINE</span> <span class="o">=</span> <span class="s2">"django.contrib.sessions.backends.cache"</span>
</pre>
<p>Finally, start your redis and restart httpd:</p>
<pre class="code bash literal-block">
systemctl start redis
systemctl restart httpd
</pre>
<p>Voilà, now your Horizon should use Redis for caching.</p>
OpenStack Summit Tokyo2015-11-05T13:30:00+01:002015-11-05T13:30:00+01:00mrungetag:www.matthias-runge.de,2015-11-05:/2015/11/05/openstack-summit-tokyo/<p>Over the past week, I attended the <a class="reference external" href="https://www.openstack.org/summit/tokyo-2015/">OpenStack Summit</a> in Tokyo.</p>
<p>My primary
focus was on Horizon sessions. Nevertheless, I was lucky to
have one or two glimpses at more touristic spots in Tokyo.</p>
<img alt="temple in the area" src="http://matthias-runge.de/fedora/temple.jpg" style="width: 533px; height: 300px;" />
<div class="section" id="plugins">
<h2>Plugins</h2>
<p>The first work session for Horizon started on Wednesday with plugins.
Previously, there has been …</p></div><p>Over the past week, I attended the <a class="reference external" href="https://www.openstack.org/summit/tokyo-2015/">OpenStack Summit</a> in Tokyo.</p>
<p>My primary
focus was on Horizon sessions. Nevertheless, I was lucky to
have one or two glimpses at more touristic spots in Tokyo.</p>
<img alt="temple in the area" src="http://matthias-runge.de/fedora/temple.jpg" style="width: 533px; height: 300px;" />
<div class="section" id="plugins">
<h2>Plugins</h2>
<p>The first work session for Horizon started on Wednesday with plugins.
Previously, there has been a session presenting a way to provide
<a class="reference external" href="https://www.youtube.com/watch?v=Km99BCHfBdk">plugins</a>. It looks nearly finished, all it really needs, is documentation.
The discussion mostly focused on issues for distributors; currently, policy
checks only work, if plugins were added by addition to <tt class="docutils literal">local_settings.py</tt>;
unfortunately, that is not an option for distributors. The discussion then
went to changing configuration to <tt class="docutils literal">.ini</tt> files. The issue with it is,
configuration schema in horizon is pretty complex, and that won't change
with the <a class="reference external" href="https://review.openstack.org/#/c/100521/">proposed approach</a>. OpenStack distributors can't allow
automated changes to configuration files.</p>
<p>Most important piece for the rest of the session was, we agreed on moving
content out of Horizon core, such as</p>
<ul class="simple">
<li>Sahara</li>
<li>Trove</li>
<li>Heat</li>
<li>Ceilometer</li>
</ul>
<p>Metering support in Horizon has been quite unusable, as it takes very long
to search or aggregate collected data. The other contents were pretty much
blocked in the past, because they require significant installations and
configurations. Horizon cores were unable to provide constant reviews on
content esp. for Trove and Sahara.</p>
</div>
<div class="section" id="existential-crisis-angularjs-or-not-to-angularjs">
<h2>Existential Crisis, AngularJS or not to AngularJS</h2>
<p>The AngularJS kind of stalled during Liberty development cycle. In total,
about 300 patches have landed; it has been the observation, the new
Angular pages are slower than traditional Django pages. One reason for this
seems to be, all JavasScript is loaded on each page load, no matter if
the code is really required or not. One answer to this was to move to a
single page application as soon as possible.
Another issue is, docs or a more complete example is still missing.
Functional tests are run on existing panels, Angular panels are ignored.</p>
</div>
<div class="section" id="how-to-make-meaningful-progress-with-angularjs">
<h2>How to make meaningful progress with AngularJS</h2>
<p>This session could be seen as continuation of previous session. Final
outcome was, we'll focus on 2-3 panels in AngularJS; new panels should
be proposed with <tt class="docutils literal">DISABLED = True</tt> setting. New launch instance
workflow is still not enabled by default, currently there are 5 patches
up for review fixing bugs. The priority should lie on fixing issues
and stabilizing existing panels before pushing more Angular-based panels
to Horizon.</p>
</div>
<div class="section" id="horizon-and-async-features">
<h2>Horizon and async features</h2>
<p>Horizon does not use any message bus; for updates on asynchronous operations
a pulling mechanism is used. In this scope, an asynchronous operation is
any longer running operation, like launching an instance, create a volume
etc. The underlying API returns immediately without returning the actual
status of the operation, just something like "operation scheduled". One idea
to solve this, is to utilize zaqar as a message bus.</p>
</div>
<div class="section" id="setting-mitaka-priorities-and-non-priorities">
<h2>Setting Mitaka priorities and non-priorities</h2>
<p>Finally, we decided on <a class="reference external" href="https://etherpad.openstack.org/p/mitaka-horizon-priorities">priorities</a> for Mitaka cycle. Most important areas to
work on will be</p>
<ul class="simple">
<li>Plugins, documentation is missing</li>
<li>Angular content<ul>
<li>Users panel</li>
<li>Images panel</li>
</ul>
</li>
<li>Theming, documentation is missing</li>
<li>Dependencies, currently pbr is blocking to release XStatic packages</li>
<li>Performance</li>
</ul>
<p>The linked etherpad page will be used during Mitaka development cycle
to coordinate the work, like we used an etherpad over Liberty cycle.</p>
</div>
Pelican version 3.62015-06-22T20:00:00+02:002015-06-22T20:00:00+02:00mrungetag:www.matthias-runge.de,2015-06-22:/2015/06/22/pelican-3.6/<p>Today, I updated <a class="reference external" href="http://blog.getpelican.com">pelican</a> to version 3.6 and also added a python 3 subpackage.
You can test it in Fedora 22 by using</p>
<div class="highlight"><pre><span></span>dnf --enablerepo<span class="o">=</span>updates-testing install python3-pelican
</pre></div>
<p>If you're already using pelican,</p>
<div class="highlight"><pre><span></span>dnf --enablerepo<span class="o">=</span>updates-testing update python-pelican
</pre></div>
<p>Please leave <a class="reference external" href="https://admin.fedoraproject.org/updates/python-pelican-3.6.0-1.fc22">feedback</a></p>
<p>Upgrading from previous release might require a change …</p><p>Today, I updated <a class="reference external" href="http://blog.getpelican.com">pelican</a> to version 3.6 and also added a python 3 subpackage.
You can test it in Fedora 22 by using</p>
<div class="highlight"><pre><span></span>dnf --enablerepo<span class="o">=</span>updates-testing install python3-pelican
</pre></div>
<p>If you're already using pelican,</p>
<div class="highlight"><pre><span></span>dnf --enablerepo<span class="o">=</span>updates-testing update python-pelican
</pre></div>
<p>Please leave <a class="reference external" href="https://admin.fedoraproject.org/updates/python-pelican-3.6.0-1.fc22">feedback</a></p>
<p>Upgrading from previous release might require a change:</p>
<ol class="arabic simple">
<li>Delete the <cite>cache</cite> folder, if exists</li>
<li>Add the following to your settings file:</li>
</ol>
<div class="highlight"><pre><span></span><span class="nv">CACHE_CONTENT</span> <span class="o">=</span> True
<span class="nv">LOAD_CONTENT_CACHE</span> <span class="o">=</span> True
</pre></div>
<p>The full change list is available on <a class="reference external" href="http://blog.getpelican.com/category/news.html">pelicans news</a> page.</p>
Fedora 22 will contain Django-1.82015-04-17T11:45:00+02:002015-04-17T11:45:00+02:00mrungetag:www.matthias-runge.de,2015-04-17:/2015/04/17/django18-fedora22/<p>One of the new features in upcoming Fedora 22 will be <a class="reference external" href="https://fedoraproject.org/wiki/Changes/Django18">Django-1.8</a>.
Django project released its most recent version earlier this month, and
it's going to be a long term supported version after Django-1.4 became a
bit ancient nowadays.
Fedora had release 1.6 in which is now …</p><p>One of the new features in upcoming Fedora 22 will be <a class="reference external" href="https://fedoraproject.org/wiki/Changes/Django18">Django-1.8</a>.
Django project released its most recent version earlier this month, and
it's going to be a long term supported version after Django-1.4 became a
bit ancient nowadays.
Fedora had release 1.6 in which is now deprecated by Django upstream.</p>
<p>A few packages required patches to support Django-1.8 though:</p>
<ul class="simple">
<li>python-django-openstack-auth</li>
<li>python-django-compressor</li>
<li>python-django-nose</li>
<li>python-django-horizon</li>
</ul>
<p>Of course, they were fixed and included already in Fedora 22.</p>
Testing Horizon git snapshots2015-03-11T10:30:00+01:002015-03-11T10:30:00+01:00mrungetag:www.matthias-runge.de,2015-03-11:/2015/03/11/test-horizon-git/<div class="section" id="testing-horizon-git-checkouts">
<h2>Testing horizon git checkouts</h2>
<p>One of the cool things in Horizon is, one can easily try newest things out.
This assumes, you already have an OpenStack installation available somewhere.</p>
<p>If you haven't already installed git:</p>
<div class="highlight"><pre><span></span>yum install git
</pre></div>
<p>To clone horizons upstream git repository, run the command</p>
<div class="highlight"><pre><span></span>git clone https …</pre></div></div><div class="section" id="testing-horizon-git-checkouts">
<h2>Testing horizon git checkouts</h2>
<p>One of the cool things in Horizon is, one can easily try newest things out.
This assumes, you already have an OpenStack installation available somewhere.</p>
<p>If you haven't already installed git:</p>
<div class="highlight"><pre><span></span>yum install git
</pre></div>
<p>To clone horizons upstream git repository, run the command</p>
<div class="highlight"><pre><span></span>git clone https://github.com/openstack/horizon
<span class="nb">cd</span> horizon
cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py
</pre></div>
<p>Then please edit the file <tt class="docutils literal">openstack_dashboard/local/local_settings.py</tt>
and adjust</p>
<div class="highlight"><pre><span></span><span class="n">ALLOWED_HOSTS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'*'</span><span class="p">]</span>
<span class="o">...</span>
<span class="n">OPENSTACK_HOST</span> <span class="o">=</span> <span class="s2">"127.0.0.1"</span>
</pre></div>
<p><tt class="docutils literal">OPENSTACK_HOST</tt> has to point to your keystone instance, in this case to
127.0.0.1.</p>
<p>The development server requires a dependencies. If you didn't already
install them, just run:</p>
<div class="highlight"><pre><span></span>yum install gcc python-devel python-virtualenv openssl-devel libffi-devel which
</pre></div>
<p>To start your development server:</p>
<div class="highlight"><pre><span></span>./run_tests.sh -m collectstatic
</pre></div>
<p>This will install all required dependencies in a virtual env inside your
horizon directory. Horizon spreads static files like images and
javascript files all around in its source tree. <tt class="docutils literal">collectstatic</tt> will
collect them and place those files in under a directory named static
inside the horizon checkout. When running the development server, they
will be served from that location.</p>
<p>Finally</p>
<div class="highlight"><pre><span></span>./run_tests.sh --runserver
</pre></div>
<p>will start your Horizon instance from your git checkout. It can be accessed
via <tt class="docutils literal"><span class="pre">http://<ip>:8000</span></tt>, in most cases, that is <a class="reference external" href="http://localhost:8000">http://localhost:8000</a> .</p>
</div>
<div class="section" id="updating-your-checkout">
<h2>Updating your checkout</h2>
<p>The following snippet will pull in latest changes from git, will copy
changed static files to the right places and will run your django development
server.</p>
<div class="highlight"><pre><span></span>git fetch <span class="o">&&</span> git pull
./run_tests.sh -m collectstatic
./run_tests.sh --runserver
</pre></div>
</div>
Fedora packaging workshop2015-02-07T21:32:00+01:002015-02-07T21:32:00+01:00mrungetag:www.matthias-runge.de,2015-02-07:/2015/02/07/fedora-packaging-2/<p>This part assumes, you already have the tools installed like described
in <a class="reference external" href="http://www.matthias-runge.de/2014/10/08/fedora-packaging/">earlier part</a>.</p>
<div class="section" id="using-a-tool-to-create-a-spec">
<h2>Using a tool to create a spec</h2>
<p>As first example, we'll use a tool to create a spec file, download
the sources.</p>
<div class="highlight"><pre><span></span>rpmdev-setuptree
<span class="nb">cd</span> ~/rpmbuild
pyp2rpm -n bleach > SPECS/python-bleach.spec
</pre></div>
<p>What this actually does is …</p></div><p>This part assumes, you already have the tools installed like described
in <a class="reference external" href="http://www.matthias-runge.de/2014/10/08/fedora-packaging/">earlier part</a>.</p>
<div class="section" id="using-a-tool-to-create-a-spec">
<h2>Using a tool to create a spec</h2>
<p>As first example, we'll use a tool to create a spec file, download
the sources.</p>
<div class="highlight"><pre><span></span>rpmdev-setuptree
<span class="nb">cd</span> ~/rpmbuild
pyp2rpm -n bleach > SPECS/python-bleach.spec
</pre></div>
<p>What this actually does is to create a file structure for your builds and
change into that directory.
Finally <tt class="docutils literal">pyp2rpm</tt> goes to <a class="reference external" href="https://pypi.python.org/pypi">pypi</a>, pulls down the required information,
downloads the sources, copies them to <tt class="docutils literal">~rpmbuild/SOURCES</tt> and writes
as much information as possible to the spec file.</p>
<div class="highlight"><pre><span></span><span class="c"># Created by pyp2rpm-1.1.2</span>
%global pypi_name bleach
<span class="gh">Name</span><span class="p">:</span> python-<span class="kc">%{pypi_name}</span>
<span class="gh">Version</span><span class="p">:</span> 1.4.1
<span class="gh">Release</span><span class="p">:</span> 1<span class="nv">%{?dist}</span>
<span class="gh">Summary</span><span class="p">:</span> An easy whitelist-based HTML-sanitizing tool
<span class="gh">License</span><span class="p">:</span> ASL %(TODO: version)s
<span class="gh">URL</span><span class="p">:</span> http://github.com/jsocol/bleach
<span class="gh">Source0</span><span class="p">:</span> https://pypi.python.org/packages/source/b/<span class="kc">%{pypi_name}</span>/<span class="kc">%{pypi_name}</span>-<span class="kc">%{version}</span>.tar.gz
<span class="gh">BuildArch</span><span class="p">:</span> noarch
<span class="gh">BuildRequires</span><span class="p">:</span> python2-devel
<span class="gh">BuildRequires</span><span class="p">:</span> python-nose >= 1.3
<span class="gh">Requires</span><span class="p">:</span> python-six
<span class="gh">Requires</span><span class="p">:</span> python-html5lib >= 0.999
<span class="nd">%description</span>
Bleach is an HTML sanitizing library
that escapes or strips markup and
attributes based on a white list.
<span class="nd">%prep</span>
<span class="k">%setup</span> -q -n <span class="kc">%{pypi_name}</span>-<span class="kc">%{version}</span>
<span class="c"># Remove bundled egg-info</span>
rm -rf <span class="kc">%{pypi_name}</span>.egg-info
<span class="nd">%build</span>
<span class="nf">%{__python</span>2} setup.py build
<span class="nd">%install</span>
<span class="nf">%{__python</span>2} setup.py install --skip-build --root <span class="kc">%{buildroot}</span>
<span class="nd">%check</span>
<span class="nf">%{__python</span>2} setup.py test
<span class="nd">%files</span>
<span class="k">%doc</span> README.rst LICENSE
<span class="kc">%{python2_sitelib}</span>/<span class="kc">%{pypi_name}</span>
<span class="kc">%{python2_sitelib}</span>/<span class="kc">%{pypi_name}</span>-<span class="kc">%{version}</span>-py?.?.egg-info
<span class="nd">%changelog</span>
<span class="gu">* Sat Feb 07 2015 - 1.4.1-1</span>
- Initial package.
</pre></div>
<p>Magic, isn't it? Unfortunately, that's not completely everything:</p>
<ul class="simple">
<li>Look at the license field. Actually, the license is <a class="reference external" href="https://github.com/jsocol/bleach/blob/master/LICENSE">ASL 2.0</a>.
To make it build, you'll also need <tt class="docutils literal"><span class="pre">python-setuptools</span></tt>.</li>
<li>The license should be marked as %license and not as %doc</li>
<li>run time requirements are required for testing as well. We should add them.
The builders are not connected to the internet, thus something like
<tt class="docutils literal">pip install</tt> does not work during package build or testing.</li>
<li>The changelog entry should contain a name and an email-address.</li>
</ul>
<p>Once that is fixed, let's issue a local build:</p>
<div class="highlight"><pre><span></span>rpmbuild -ba SPECS/python-bleach.spec
</pre></div>
<p>which will building a binary package and a Source RPM package.</p>
<p>Finally, one should try a mock build, which will build the same package
in a clean environment. This will discover any forgotten dependencies.</p>
<div class="highlight"><pre><span></span>mock --rebuild ./SRPMS/python-bleach-1.4.1-1.fc21.src.rpm
</pre></div>
<p>Now that is finished, we're nearly done. It's time to check for anything
other obviously forgotten:</p>
<div class="highlight"><pre><span></span><span class="o">[</span>rpmbuilder@turing rpmbuild<span class="o">]</span>$ rpmlint ./SPECS/python-bleach.spec ./RPMS/noarch/python-bleach-1.4.1-1.fc21.noarch.rpm ./SRPMS/python-bleach-1.4.1-1.fc21.src.rpm
python-bleach.noarch: W: spelling-error Summary<span class="o">(</span>en_US<span class="o">)</span> whitelist -> white list, white-list, whistle
python-bleach.src: W: spelling-error Summary<span class="o">(</span>en_US<span class="o">)</span> whitelist -> white list, white-list, whistle
<span class="m">2</span> packages and <span class="m">1</span> specfiles checked<span class="p">;</span> <span class="m">0</span> errors, <span class="m">2</span> warnings.
</pre></div>
<p><tt class="docutils literal">rpmlint</tt> is a quite powerful linter to check for common issues.</p>
<p>The finished spec for python-bleach can be found here: <a class="reference external" href="http://www.matthias-runge.de/fedora/python-bleach.spec">http://www.matthias-runge.de/fedora/python-bleach.spec</a>.</p>
</div>
Horizon topics during Kilo development summit2014-11-10T14:45:00+01:002014-11-10T14:45:00+01:00mrungetag:www.matthias-runge.de,2014-11-10:/2014/11/10/horizon-kilo-summit/<p>The past Kilo development summit had the following things for Horizon covered.</p>
<div class="section" id="horizon-operators-deployers-and-users">
<h2>Horizon Operators, Deployers, and Users</h2>
<p>The first session was a <a class="reference external" href="https://etherpad.openstack.org/p/kilo-horizon-operators-users">meetup between Horizon developers and operators</a>.
Most named painpoint was: managing a huge number of users and resources.
Missing pagination on all kinds of pages was mentioned a …</p></div><p>The past Kilo development summit had the following things for Horizon covered.</p>
<div class="section" id="horizon-operators-deployers-and-users">
<h2>Horizon Operators, Deployers, and Users</h2>
<p>The first session was a <a class="reference external" href="https://etherpad.openstack.org/p/kilo-horizon-operators-users">meetup between Horizon developers and operators</a>.
Most named painpoint was: managing a huge number of users and resources.
Missing pagination on all kinds of pages was mentioned a few times. The
other issue seems to be, that region switching requires too many manual steps
or sometimes behaves not as expected. Overall that should be improved in terms
of user experience.</p>
<p>The last issue mentioned was: error messages often don't really help. There's
a <a class="reference external" href="https://blueprints.launchpad.net/horizon/+spec/improve-error-message-details-for-usability">blueprint to improve error messaging</a>. Developers understand, that this is
an issue, but sadly it's not going to be solved that easily.</p>
</div>
<div class="section" id="keystone-horizon-cli-federation-sso">
<h2>Keystone-Horizon-CLI/Federation/SSO</h2>
<p>A <a class="reference external" href="https://etherpad.openstack.org/p/kilo-keystone-horizon-cli-federation-sso">Keystone-Horizon cross-project session</a> was held to discuss issues around
integrating federated authentication and single sign in for Keystone and
Horizon.</p>
</div>
<div class="section" id="django-angular-playing-nice">
<h2>Django-Angular Playing Nice</h2>
<p>Thai Tran presented his ideas on making <a class="reference external" href="https://etherpad.openstack.org/p/kilo-horizon-django-angular-playing-nice">Django-Angular Playing Nice</a>.
Basic idea is to slowly replace Django parts by using pure
JavaScript and AngularJS and have just a tiny core proxying JSON-data from
underlying services. That'd be the least obstructive way to
re-implement everything in using JavaScript and AngularJS. This was
already proposed at the last summit; since then, not much has happened yet.</p>
</div>
<div class="section" id="re-implementation-in-javascript-using-angularjs">
<h2>Re-Implementation in JavaScript using AngularJS</h2>
<p>Richard Jones from Rackspace presented his <a class="reference external" href="https://github.com/r1chardj0n3s/angboard">demo</a> on re-implementing Horizon
nearly purely in JavaScript.
There were quite a few people in the audience, apparently doing more or less
the same. Unfortunately, they didn't chose to share their code or to propse
that code upstream.</p>
</div>
<div class="section" id="horizon-contributors-meetup">
<h2>Horizon-Contributors meetup</h2>
<p>We discussed a <a class="reference external" href="https://etherpad.openstack.org/p/kilo-horizon-contributors-meetup">lot topics</a>. Sadly, we shared a the same room with
keystone contributors and it was quite noisy.</p>
<div class="section" id="javascript">
<h3>JavaScript</h3>
<p>Again, using a more JavaScript-centric approach for Horizon was discussed.
AngularJS was chosen as the framework to be used. The navigation
system and panels will stay in Django. Content panel is left up to the
implementer and may be Angular.</p>
<p>There wasn't a real agreement on how to start. Since it's not entirely worked
out yet, one might need to experiment here. One proposal is, to start
simple; the other direction was, to start with the most complex piece,
"Start-Instance-Workflow". The latter might be a big complex to land during
the next six months. Launch instance is known as a big issue though.</p>
<p>We agreed, we'll need documentation, tutorials for new contributors, and
review guidelines. Richard Jones will follow-up on the OpenStack Developers
mailing list.</p>
</div>
<div class="section" id="ux">
<h3>UX</h3>
<p>A new Launch instance design was proposed. We briefly discussed adding
images for styling glance images.</p>
</div>
<div class="section" id="repo-split">
<h3>Repo-Split</h3>
<p>This is a longer going effort and required e.g unbundling embedded copies
of JavaScript libraries (which is good anyways). We will need to freeze the
code for a limited time. There are <a class="reference external" href="http://lists.openstack.org/pipermail/openstack-dev/2014-November/050043.html">concerns about naming</a> the separate
parts. Aside from breaking dependent packages we will certainly confuse
contributors and users with changing the name of <tt class="docutils literal"><span class="pre">openstack-dashboard</span></tt> to
<tt class="docutils literal">horizon</tt> and to rename former <tt class="docutils literal">horizon</tt> to something else.</p>
</div>
<div class="section" id="kilo-priorities">
<h3>Kilo priorities</h3>
<p>There are quite a few todo items left from the operators session, like:</p>
<ul class="simple">
<li>error message improvement</li>
<li>filtering, search, and pagination in tables is still an issue</li>
<li>documentation should become clearer, there are still topics not entierely
covered in docs.</li>
<li>inclusion of AngularJS will be a big task, views will be rewritten piece
by piece</li>
<li>Repo split</li>
<li>blueprints will have to use a mandatory template in the future</li>
<li>Ironic is now integrated in OpenStack, but currently does not have any
representation in Horizon</li>
</ul>
</div>
</div>
Fedora packaging workshop2014-10-08T14:20:00+02:002014-10-08T14:20:00+02:00mrungetag:www.matthias-runge.de,2014-10-08:/2014/10/08/fedora-packaging/<p>On 17th and 18th this month, we'll have a local <a class="reference external" href="http://lit-ol.de/">Linux conference</a> here. As
part of this, I'll give a short introductory workshop on packaging. The
following series of posts helps me, to sort things for me and to provide a short
reference for others and myself as well.</p>
<div class="section" id="prerequisites">
<h2>Prerequisites …</h2></div><p>On 17th and 18th this month, we'll have a local <a class="reference external" href="http://lit-ol.de/">Linux conference</a> here. As
part of this, I'll give a short introductory workshop on packaging. The
following series of posts helps me, to sort things for me and to provide a short
reference for others and myself as well.</p>
<div class="section" id="prerequisites">
<h2>Prerequisites</h2>
<p>In order to package and build packages for Fedora and <a class="reference external" href="https://fedoraproject.org/wiki/EPEL">EPEL</a>, you'll
need a few packages installed</p>
<ul class="simple">
<li>@development-tools</li>
<li>@fedora-packager</li>
<li>rpmlint</li>
</ul>
<p>You'll install those packages via</p>
<pre class="literal-block">
dnf group install development-tools
dnf group install fedora-packager
dnf install rpmlint
</pre>
<p>You'll find several warnings about not to create packages as root user. Take
them serious. There's absolutely no reason to build as root user, it's
plainly risky and dumb to do so.</p>
<p>To separate your user account from the user building rpms a bit more,
add a new user to your system:</p>
<pre class="literal-block">
useradd makerpm
</pre>
<p>Finally, your user account should become a member of <tt class="docutils literal">mock</tt> user group.</p>
<pre class="literal-block">
usermod -a -G mock makerpm
</pre>
<p>The whole process is documented on <a class="reference external" href="https://fedoraproject.org/wiki/How_to_create_an_RPM_package">Fedora Wiki</a>.</p>
</div>
Truncating log files2014-09-11T13:20:00+02:002014-09-11T13:20:00+02:00mrungetag:www.matthias-runge.de,2014-09-11:/2014/09/11/logrotate-horizon/<p>Depending on your settings, OpenStack Dashboard produces lots of log
output. Fortunately there is already a tool in place, which cleans them up
for you. Looking at <tt class="docutils literal">/var/log/httpd/</tt> you'll probably notice
files like <tt class="docutils literal"><span class="pre">access_log-(date).gz</span></tt>. They were generated by logrotate by
compressing existent logs.</p>
<p>To use …</p><p>Depending on your settings, OpenStack Dashboard produces lots of log
output. Fortunately there is already a tool in place, which cleans them up
for you. Looking at <tt class="docutils literal">/var/log/httpd/</tt> you'll probably notice
files like <tt class="docutils literal"><span class="pre">access_log-(date).gz</span></tt>. They were generated by logrotate by
compressing existent logs.</p>
<p>To use the same mechanism for OpenStack Dashboard, create a file <tt class="docutils literal"><span class="pre">/etc/logrotate.d/openstack-dashboard</span></tt>:</p>
<pre class="literal-block">
/var/log/horizon/*.log {
weekly
rotate 4
missingok
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
</pre>
<p>Make sure, your file has perms 644: <tt class="docutils literal">chmod 644 <span class="pre">/etc/logrotate.d/openstack-dashboard</span></tt>.
To test, if it works, issue <tt class="docutils literal">logrotate <span class="pre">-d</span> /etc/logrotate.conf</tt> and watch its output closely.</p>
<p>You should find lines like:</p>
<pre class="literal-block">
reading config file openstack-ceilometer
reading config file openstack-cinder
reading config file openstack-dashboard
reading config file openstack-glance
reading config file openstack-heat
</pre>
<p>and a bit further down:</p>
<pre class="literal-block">
rotating pattern: /var/log/horizon/*.log weekly (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/horizon/horizon.log
log does not need rotating
</pre>
Horizon's new features introduced in Juno cycle2014-09-08T13:20:00+02:002014-09-08T13:20:00+02:00mrungetag:www.matthias-runge.de,2014-09-08:/2014/09/08/horizon-juno-cycle-features/<p>This post intends to give an overview on what happened during Horizon's
Juno development cycle. Horizon's <a class="reference external" href="https://blueprints.launchpad.net/horizon/juno">blueprints page on launchpad</a> lists 31
implemented new features. They may be grouped into a few larger features.</p>
<div class="section" id="sahara-dashboard">
<h2>Sahara-Dashboard</h2>
<p>Apache Hadoop is a widely adopted MapReduce implementation. The aim of the
Sahara project is …</p></div><p>This post intends to give an overview on what happened during Horizon's
Juno development cycle. Horizon's <a class="reference external" href="https://blueprints.launchpad.net/horizon/juno">blueprints page on launchpad</a> lists 31
implemented new features. They may be grouped into a few larger features.</p>
<div class="section" id="sahara-dashboard">
<h2>Sahara-Dashboard</h2>
<p>Apache Hadoop is a widely adopted MapReduce implementation. The aim of the
Sahara project is to enable users to easily provision and manage Hadoop
clusters on OpenStack.</p>
<p>During the Juno development cycle, the independent Sahara dashboard was merged
into Horizon. Like all other features in Horizon, it will be shown, when
Sahara is configured through Keystone.</p>
</div>
<div class="section" id="rbac">
<h2>RBAC</h2>
<p>Horizon-2014.1 aka Icehouse version has support for RBAC for Glance and Cinder.
For example, create, access, or delete images can be limited on user
or role basis.
In Juno this RBAC system was extended to support <a class="reference external" href="https://blueprints.launchpad.net/horizon/+spec/compute-rbac">compute</a>, <a class="reference external" href="https://blueprints.launchpad.net/horizon/+spec/network-rbac">network</a>, and
<a class="reference external" href="https://blueprints.launchpad.net/horizon/+spec/heat-rbac">orchestration</a>.</p>
</div>
<div class="section" id="javascript-unbundling">
<h2>JavaScript unbundling</h2>
<p>In the past, there were quite a few JavaScript libraries copied into Horizon's
code. Benefit is, they are available directly in Horizon and developers are
in control of them. On the other side, if there is a security flaw in any of
those bundled files, Horizon devs are in charge to fix it. Many Linux
distributions have a rule not to use such bundled code at all, for
example <a class="reference external" href="https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries">Fedora</a>. As result of this feature, all bundled libraries were
removed from Horizon, and system provided libraries will be used through
python-XStatic.</p>
<p>Horizon was originally intended as a framework to enable the development
of a dashboard, like the now well known OpenStack Dashboard, which is
widely known under the name Horizon.</p>
<p>However, the Horizon framework is generic and could be used by other projects
outside of OpenStack. It is useful to build a dashboard based on
RESTful services. There is a blueprint
described on launchpad, to <a class="reference external" href="https://blueprints.launchpad.net/horizon/+spec/separate-horizon-from-dashboard">separate horizon from openstack dashboard</a>. To
enable this feature, JavaScript libraries need to become separate as well.</p>
</div>
<div class="section" id="look-and-feel-improvements">
<h2>Look and feel improvements</h2>
<p>There are quite a few blueprints striving to improve look and feel. For
example, bootstrap was updated to version 3, the color palette was centralized.
The tablesorter plugin gained a feature to sort by timestamp. Those
features make it easier to customize Horizon for individual needs.</p>
</div>
<div class="section" id="even-more">
<h2>Even more</h2>
<p>A few patches were added to enable to store metadata, like in cinder or glance,
where users can register key/pair values to describe their cloud deployment.
Another set of patches implements features for Neutron, like supporting IPv6
and Neutron subnets.</p>
</div>
How to use Django-1.5 via parallel installable python-django152014-03-26T13:00:00+01:002014-03-26T13:00:00+01:00mrungetag:www.matthias-runge.de,2014-03-26:/2014/03/26/fedora-django-1-6/<p>Last week, the package python-django15 was approved. It's a Django package
to be installed in parallel to e.g python-django. Once you installed it,
you can not use it directly.</p>
<p>For example for python-django-horizon aka. OpenStack Dashboard
I'd change the django.wsgi from <a class="reference external" href="https://github.com/openstack/horizon/blob/master/openstack_dashboard/wsgi/django.wsgi">github</a>
to</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import …</span></pre></div><p>Last week, the package python-django15 was approved. It's a Django package
to be installed in parallel to e.g python-django. Once you installed it,
you can not use it directly.</p>
<p>For example for python-django-horizon aka. OpenStack Dashboard
I'd change the django.wsgi from <a class="reference external" href="https://github.com/openstack/horizon/blob/master/openstack_dashboard/wsgi/django.wsgi">github</a>
to</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="c1">####</span>
<span class="c1"># explicitly require Django 1.5 or later</span>
<span class="kn">from</span> <span class="nn">pkg_resources</span> <span class="kn">import</span> <span class="n">require</span>
<span class="n">require</span><span class="p">(</span><span class="s1">'Django>=1.5,<1.6'</span><span class="p">)</span>
<span class="c1">####</span>
<span class="kn">import</span> <span class="nn">django.core.handlers.wsgi</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="c1"># Add this file path to sys.path in order to import settings</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)),</span> <span class="s1">'../..'</span><span class="p">))</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'DJANGO_SETTINGS_MODULE'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'openstack_dashboard.settings'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>
<span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">application</span> <span class="o">=</span> <span class="n">django</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">wsgi</span><span class="o">.</span><span class="n">WSGIHandler</span><span class="p">()</span>
</pre></div>
<p>Note the two lines enclosed in the lines of hash signs. That's all you need
to use Django-1.5 from python-django15 and have Django-1.6 installed in parallel.</p>
A stable and custom theme for Horizon2014-03-18T09:00:00+01:002014-03-18T09:00:00+01:00mrungetag:www.matthias-runge.de,2014-03-18:/2014/03/18/custom-theme-for-horizon/<p>During the OpenStack Icehouse development cycle, we gained in Horizon the
ability to use additional python packages by simply dropping in a file
in the <tt class="docutils literal">openstack_dashboard/enabled</tt> dir.</p>
<p>In the rest of the article, I'll propose a method to customize the look and
feel, without breaking during package updates …</p><p>During the OpenStack Icehouse development cycle, we gained in Horizon the
ability to use additional python packages by simply dropping in a file
in the <tt class="docutils literal">openstack_dashboard/enabled</tt> dir.</p>
<p>In the rest of the article, I'll propose a method to customize the look and
feel, without breaking during package updates. It will work, if
you have a Horizon package in Icehouse release RC1 or later.</p>
<p>Fedora and <a class="reference external" href="http://openstack.redhat.com/Main_Page">RDO</a> openstack-dashboard packages are installing the Dashboard into
<tt class="docutils literal"><span class="pre">/usr/share/openstack-dashboard</span></tt>.</p>
<p>First of all, we'll add a config <tt class="docutils literal">openstack_dashboard/enabled/_99_theme.py</tt></p>
<div class="highlight"><pre><span></span><span class="c1"># The name of the dashboard to be added to HORIZON['dashboards']. Required.</span>
<span class="n">DASHBOARD</span> <span class="o">=</span> <span class="s1">'theme'</span>
<span class="c1"># If set to True, this dashboard will be set as the default dashboard.</span>
<span class="n">DEFAULT</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c1"># A dictionary of exception classes to be added to HORIZON['exceptions'].</span>
<span class="n">ADD_EXCEPTIONS</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># A list of applications to be added to INSTALLED_APPS.</span>
<span class="n">ADD_INSTALLED_APPS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'openstack_dashboard.dashboards.theme'</span><span class="p">]</span>
</pre></div>
<p>There are two notable settings: <tt class="docutils literal">DASHBOARD = 'theme'</tt> - this is the name
of the added dashboard. We'll come back to this later. The other one is
<tt class="docutils literal">ADD_INSTALLED_APPS = ['openstack_dashboard.dashboards.theme']</tt>.
This is a python module, which can reside everywhere in the file system
(as long as it's in the python search path). I chose to put it directly
below <tt class="docutils literal">openstack_dashboard/dashboards</tt> in a dir named <tt class="docutils literal">theme</tt></p>
<p>Actually, I put a very minimum set of files into the <tt class="docutils literal">theme</tt> directory:</p>
<pre class="literal-block">
theme/
|-- dashboard.py
|-- __init__.py
|-- models.py
|-- static
| `-- dashboard
| |-- css
| | `-- font-awesome.min.css
| |-- fonts
| | |-- FontAwesome.otf
| | |-- OpenSans-Regular-webfont.eot
| | |-- OpenSans-Regular-webfont.svg
| | |-- OpenSans-Regular-webfont.ttf
| | `-- OpenSans-Regular-webfont.woff
| |-- img
| | |-- bg-login.jpg
| | |-- brand.svg
| | `-- logo.svg
| `-- less
| |-- rcue
| | |-- fonts.less
| | |-- icons.less
| | |-- login.less
| | |-- navbar.less
| `-- theme.less
|-- templates
| |-- auth
| | |-- _login.html
| | `-- login.html
| |-- base.html
| |-- _header.html
| |-- horizon
| | |-- common
| | | `-- _sidebar.html
| | |-- _nav_list.html
| | `-- _subnav_list.html
| |-- splash.html
| `-- _stylesheets.html
`-- theme_index
|-- __init__.py
|-- __init__.pyc
|-- panel.py
|-- panel.pyc
|-- urls.py
|-- urls.pyc
|-- views.py
`-- views.pyc
</pre>
<p>At first glance, that looks way more than it actually is. While most
files are self-explanatory, I'll go into details with a few files.</p>
<div class="section" id="theme-directory">
<h2>theme-directory</h2>
<p>The files <tt class="docutils literal">__init__.py</tt> and <tt class="docutils literal">models.py</tt> may be completely empty, or
just contain a comment:</p>
<div class="highlight"><pre><span></span><span class="c1"># intentionally left blank</span>
</pre></div>
<p>The more interesting file is dashboard.py:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">horizon</span>
<span class="k">class</span> <span class="nc">Theme</span><span class="p">(</span><span class="n">horizon</span><span class="o">.</span><span class="n">Dashboard</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"theme"</span><span class="p">)</span>
<span class="n">slug</span> <span class="o">=</span> <span class="s2">"theme"</span>
<span class="n">panels</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'theme_index'</span><span class="p">,</span> <span class="p">)</span>
<span class="n">default_panel</span> <span class="o">=</span> <span class="s1">'theme_index'</span>
<span class="n">nav</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">horizon</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">Theme</span><span class="p">)</span>
</pre></div>
<p>Important to note is the option <tt class="docutils literal">nav = False</tt>, which prevents this dashboard
to show up in the navigation bar; this is used e.g for contents to be linked
manually, like "Settings" or not to be linked at all, like a theme.</p>
</div>
<div class="section" id="theme-index">
<h2>theme_index</h2>
<p>As above in the <tt class="docutils literal">theme</tt> dir, <tt class="docutils literal">__init__.py</tt> and <tt class="docutils literal">views.py</tt> may be
completely empty. <tt class="docutils literal">urls.py</tt> is nearly empty as well:</p>
<div class="highlight"><pre><span></span><span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">()</span>
</pre></div>
<p><tt class="docutils literal">panels.py</tt>:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">horizon</span>
<span class="kn">from</span> <span class="nn">openstack_dashboard.dashboards.theme</span> <span class="kn">import</span> <span class="n">dashboard</span>
<span class="k">class</span> <span class="nc">ThemePanel</span><span class="p">(</span><span class="n">horizon</span><span class="o">.</span><span class="n">Panel</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">"Panel providing a theme"</span>
<span class="n">slug</span> <span class="o">=</span> <span class="s1">'theme_index'</span>
<span class="n">nav</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">dashboard</span><span class="o">.</span><span class="n">Theme</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">ThemePanel</span><span class="p">)</span>
</pre></div>
<p>This code snippet should be enough for Horizon to think, there is a real
dashboard, which just should not be included in the automatically generated
navigation.</p>
</div>
<div class="section" id="putting-all-together">
<h2>Putting all together</h2>
<p>Now we can put templates into the <tt class="docutils literal">templates</tt> directory, and static files i
to <tt class="docutils literal">static</tt>. When Horizon delivers web pages, based on templates, it will
search for the them in <tt class="docutils literal">theme/templates</tt> first; if found there, they will
be delivered, if not, Horizon will fall back to the default pages found in the
other <tt class="docutils literal">templates</tt> dirs in horizon source tree.</p>
<p>As a starter, just copy e.g <tt class="docutils literal">base.html</tt> or <tt class="docutils literal">_stylesheets.html</tt> from
<tt class="docutils literal">horizon/templates</tt> directory, to <tt class="docutils literal">templates</tt> and modify them.</p>
<p>When adding static files, you need to issue</p>
<div class="line-block">
<div class="line"><tt class="docutils literal">./manage.py collectstatic</tt></div>
</div>
<p>from <tt class="docutils literal"><span class="pre">/usr/share/openstack-dashboard</span></tt> to collect them and to copy
static files to <tt class="docutils literal"><span class="pre">/usr/share/openstack-dashboard/static</span></tt>.</p>
</div>
Using pelican for serving this blog2014-02-19T15:40:00+01:002014-02-19T15:40:00+01:00mrungetag:www.matthias-runge.de,2014-02-19:/2014/02/19/deprecating-wordpress/<p>For my own blog, I recently deprecated wordpress, in favor of using pelican.
The package was recently added to Fedora. It's quite simple and does not
require php, mysql, and a memcached running on a webserver.</p>
<p>In the past, the number of attempts to get into this host increased
significantly …</p><p>For my own blog, I recently deprecated wordpress, in favor of using pelican.
The package was recently added to Fedora. It's quite simple and does not
require php, mysql, and a memcached running on a webserver.</p>
<p>In the past, the number of attempts to get into this host increased
significantly. During Linux-Tag-Oldenburg last year, we had a wordpress
installation to serve the schedule. It just failed when more persons tried
to edit the same document.</p>
<p>Pelican uses structured text files, which are being processed once to html
files. This means, one can use awesome tools like vim and git.</p>
OpenStack Summit Hong Kong2013-11-12T19:54:00+01:002013-11-12T19:54:00+01:00mrungetag:www.matthias-runge.de,2013-11-12:/2013/11/12/openstack-summit-hong-kong/<p>From my very personal view on the past OpenStack summit in Hong Kong, it
has been a good and productive summit. Luckily, both of my sessions were
accepted:</p>
<div class="section" id="separate-openstack-dashboard-and-horizon">
<h2>Separate OpenStack Dashboard and Horizon</h2>
<p>The first session was about how to separate Horizon and OpenStack
Dashboard. It is very little known …</p></div><p>From my very personal view on the past OpenStack summit in Hong Kong, it
has been a good and productive summit. Luckily, both of my sessions were
accepted:</p>
<div class="section" id="separate-openstack-dashboard-and-horizon">
<h2>Separate OpenStack Dashboard and Horizon</h2>
<p>The first session was about how to separate Horizon and OpenStack
Dashboard. It is very little known to folks outside the Horizon project,
how both parts relate to each other.</p>
<p>Just looking at Horizon's source code, one will see mainly two
directories, horizon and openstack_dashboard. The subject is, to
distribute code from both directories in two separate projects. The
directory horizon contains the framework, which is used to build the
WebUI provided in the directory openstack_dashboard. The latter is
mostly known as Horizon. Mixing the terms is quite confusing for anyone.
For the rest, I'll use the terms WebUI and framework for OpenStack
Dashboard resp. for the code provided in the horizon dir.</p>
<p>In the past, most changes on the source code have been made in only one
of both parts, where the majority of changes were improvements at the
WebUI part. The idea behind dividing both is, that we'll be able to
promote the framework separate from OpenStack at all, and it might
attract new developers or users for this. The framework fills gaps in
the Django, and thus will be a valuable addition directly to Django or
to the Django eco-system outside the OpenStack context. In
distributions, like in Ubuntu or Fedora, both parts are separated for a
long time or have been divided since ever. When using a different WebUI,
there will be no need to handle dependencies for the unused WebUI part
at all.</p>
<p>The main question here, if we shall do this or not is simply: is the
framework mature and stable enough. Since changes in the framework
itself will affect two repositories instead of one, this is the key
question. Attendants of the session agreed, it's a good idea to split
both parts, and I'm planning to do this during the next development
cycle.</p>
</div>
<div class="section" id="plugin-architecture-for-openstack-dashboard">
<h2>Plugin architecture for OpenStack dashboard</h2>
<p>This session was more technical than the other. Currently, when adding
an additional dashboard, tab, etc. to the WebUI, it's required to change
settings.py each time. This is e.g not update safe and not packaging
friendly at all. The outcome of the session was, we (== Horizon
developers) should investigate stevedore, which is used by other
OpenStack projects for the same reasons. The same should work with a bit
of hacking for auto-discovery for Panels and PanelGroups. This is
something on my personal todo list as well, and luckily Monty Taylor
offered his help for this topic as well.</p>
</div>
Booting Fedora 20 TC4 on Wandboard Quad2013-09-05T21:18:00+02:002013-09-05T21:18:00+02:00mrungetag:www.matthias-runge.de,2013-09-05:/2013/09/05/booting-fedora-20-tc4-on-wandboard-quad/<p>Lately, I got a shiny new <a class="reference external" href="http://wandboard.org">Wandboard</a> Quad into my fingers, and it's
"enabled hardware" on Fedora 20. I took a TC4 test build
from <a class="reference external" href="http://koji.fedoraproject.org/koji/taskinfo?taskID=5896895">http://koji.fedoraproject.org/koji/taskinfo?taskID=5896895</a>:</p>
<pre class="literal-block">
wget http://kojipkgs.fedoraproject.org//work/tasks/6895/5896895/Fedora-Minimal-armhfp-20-Alpha-TC4-sda.raw.xz
xzcat Fedora-Minimal-armhfp-20-Alpha-TC4-sda.raw.xz | sudo …</pre><p>Lately, I got a shiny new <a class="reference external" href="http://wandboard.org">Wandboard</a> Quad into my fingers, and it's
"enabled hardware" on Fedora 20. I took a TC4 test build
from <a class="reference external" href="http://koji.fedoraproject.org/koji/taskinfo?taskID=5896895">http://koji.fedoraproject.org/koji/taskinfo?taskID=5896895</a>:</p>
<pre class="literal-block">
wget http://kojipkgs.fedoraproject.org//work/tasks/6895/5896895/Fedora-Minimal-armhfp-20-Alpha-TC4-sda.raw.xz
xzcat Fedora-Minimal-armhfp-20-Alpha-TC4-sda.raw.xz | sudo dd of=/dev/mmcblk0 bs=4M
sudo sync
</pre>
<p>Sadly, it's not bootable by default, we need to write a bootblock. From
the package uboot-wandboard_quad, wel'l take the file</p>
<pre class="literal-block">
/usr/share/uboot-imx6quad/u-boot.imx
</pre>
<p>and dd it to the sdcard:</p>
<pre class="literal-block">
sudo dd if=u-boot.imx of=/dev/mmcblk0 bs=1k seek=1
sudo sync
</pre>
<p>Currently, the image creation has a known bug: extlinux.conf is missing,
though we create one by hand and write it to
/boot/extlinux/extlinux.conf on the sdcard:</p>
<pre class="literal-block">
# extlinux.conf generated by anaconda
ui menu.c32
menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options.
menu title Fedora Boot Options.
menu hidden
timeout 60
#totaltimeout 9000
label Fedora (3.11.0-3.fc20.armv7hl) 20 (Rawhide)
kernel /vmlinuz-3.11.0-3.fc20.armv7hl
fdt /dtb-3.11.0-3.fc20.armv7hl/imx6q-wandboard.dtb
append console=ttymxc0,115200 root=UUID=bb2f901b-dfe1-4344-81bf-ae7fb675cead ro rhgb quiet LANG=en_US.UTF-8
initrd /initramfs-3.11.0-3.fc20.armv7hl.img
</pre>
<p>Finally, we'd need to update the UUID of the root partition:<</p>
<pre class="literal-block">
sudo blkid -oexport -sUUID /dev/mmcblk0p3
</pre>
<p>will report the name of the partition and the UUID, which we'd need to
insert to the kernel append line in extlinux.conf</p>
<p>Insert the SDCard to the card reader directly below the heat sink,
connect your serial console, and wait.
Probably, you'd need to type boot, when you're dropped to the uboot
prompt.</p>
OpenStack testing Event @Flock2013-07-29T11:48:00+02:002013-07-29T11:48:00+02:00mrungetag:www.matthias-runge.de,2013-07-29:/2013/07/29/openstack-testing-event-flock/<p>Sadly, I won't make it to the new Fedora users and developers conference
Flock this time. Back in may, I proposed an <a class="reference external" href="http://www.matthias-runge.de/wordpress/2013/05/18/openstack-testing-session-flock/">OpenStack testing
session</a>.</p>
<p>The more I'm delighted, that we have <a class="reference external" href="http://kashyapc.wordpress.com/">Kashyap Chamarthy</a>, who will
leading the session. He also added some news around the event to his
<a class="reference external" href="http://kashyapc.wordpress.com/2013/07/26/openstack-test-event-at-flock-fedora-contributors-conference-aug-9-12/">blog …</a></p><p>Sadly, I won't make it to the new Fedora users and developers conference
Flock this time. Back in may, I proposed an <a class="reference external" href="http://www.matthias-runge.de/wordpress/2013/05/18/openstack-testing-session-flock/">OpenStack testing
session</a>.</p>
<p>The more I'm delighted, that we have <a class="reference external" href="http://kashyapc.wordpress.com/">Kashyap Chamarthy</a>, who will
leading the session. He also added some news around the event to his
<a class="reference external" href="http://kashyapc.wordpress.com/2013/07/26/openstack-test-event-at-flock-fedora-contributors-conference-aug-9-12/">blog</a></p>
<p>This makes me sad another time, because I can not attend his session, so
if you're there, you should give OpenStack a try!</p>
OpenStack testing session @FLOCK2013-05-18T13:17:00+02:002013-05-18T13:17:00+02:00mrungetag:www.matthias-runge.de,2013-05-18:/2013/05/18/openstack-testing-session-flock/<p>As you might heard, we at Fedora had FUDCons (Fedora Users and
Developers conference), which is now replaced by a conference named
<a class="reference external" href="http://flocktofedora.com/">Flock</a>. The first one will be held in Charleston, South Carolina
between Aug. 9th and 12th. 2013. Coming there is a unique chance this
year, to meet many …</p><p>As you might heard, we at Fedora had FUDCons (Fedora Users and
Developers conference), which is now replaced by a conference named
<a class="reference external" href="http://flocktofedora.com/">Flock</a>. The first one will be held in Charleston, South Carolina
between Aug. 9th and 12th. 2013. Coming there is a unique chance this
year, to meet many Fedora users and developers to come together, discuss
new ideas, work to make those ideas a reality, and continue to promote
the core values of the Fedora Community: Freedom, Friends, Features, and
First.</p>
<p>OpenStack is a somehow complex thing to setup and to integrate into
Linux distributions. Thus, I proposed an <a class="reference external" href="http://flock-lmacken.rhcloud.com/proposals#50">OpenStack testing hackfest at
Flock</a>, to test the latest build for Fedora, and also to bring users
and developers together into one room. Currently, it is not decided, if
this session is accepted, so please stay tuned.</p>
How to create a custom theme for Horizon2013-02-15T17:09:00+01:002013-02-15T17:09:00+01:00mrungetag:www.matthias-runge.de,2013-02-15:/2013/02/15/how-to-create-a-custom-theme-for-horizon/<p>Based on the idea or proposal of Kieran Spear, I'll document here, what
has to be done, if one needs to customize Horizon (for whatever reason).</p>
<p>Let's say, one needs to create a corporate theme, named
horizon_bigcorp. Then we first need to change local_settings.py. In
Fedora and …</p><p>Based on the idea or proposal of Kieran Spear, I'll document here, what
has to be done, if one needs to customize Horizon (for whatever reason).</p>
<p>Let's say, one needs to create a corporate theme, named
horizon_bigcorp. Then we first need to change local_settings.py. In
Fedora and EPEL, that file is located at
<tt class="docutils literal"><span class="pre">/etc/openstack-dashboard/local_settings</span></tt></p>
<p>Append the following lines to that file</p>
<pre class="literal-block">
THEME_APP = 'horizon_bigcorp'
try:
__import__(THEME_APP)
INSTALLED_APPS = (THEME_APP,) + INSTALLED_APPS
except:
pass
</pre>
<div class="line-block">
<div class="line">Then we'll create a customization app:</div>
</div>
<pre class="literal-block">
├── __init__.py
├── __init__.pyc
├── models.py
├── models.pyc
├── static
│ └── dashboard
│ ├── img
│ │ ├── bigcorpfavicon.ico
│ │ └── bigcorplogo.png
│ └── less
│ └── bigcorptheme.less
└── templates
├── horizon
│ └── common
│ └── _sidebar.html
└── _stylesheets.html
7 directories, 9 files
</pre>
<div class="line-block">
<div class="line">Those .py files just need to be empty files.</div>
<div class="line-block">
<div class="line">The magic is in <tt class="docutils literal">_stylesheets.html</tt>, it's basically a modified copy of file <tt class="docutils literal">openstack_dashboard/templates/_stylesheets.html</tt>:</div>
</div>
</div>
<pre class="literal-block">
{% load compress %}
{% compress css %}
<link href='{{ STATIC_URL }}dashboard/less/horizon.less' type='text/less' media='screen' rel='stylesheet' />
{% endcompress %}
<link rel="shortcut icon" href="{{ STATIC_URL }}dashboard/img/favicon.ico"/>
</pre>
<p>Note, you just need a customized theme.less, if you did changes at css
(most likely). Like stylesheets, theme.less is a modified copy of it's
counterpart taken from the openstack_dashboard directory.</p>
<p>Another example, how this can be implemented can be found here:
<a class="reference external" href="https://github.com/mrunge/horizon/tree/customization">https://github.com/mrunge/horizon/tree/customization</a>, where I modified
<tt class="docutils literal">settings.py</tt> instead of changing local_settings.py.example</p>
Developing OpenStack Dashboard using Fedora2012-11-20T14:02:00+01:002012-11-20T14:02:00+01:00mrungetag:www.matthias-runge.de,2012-11-20:/2012/11/20/developing-openstack-dashboard-using-fedora/<p>Lately, I'm getting involved into developing OpenStack, especially it's
dashboard.</p>
<p>Many developers recommend using <a class="reference external" href="http://devstack.org/">devstack</a> to work on OpenStack. For
some reasons, I can't recommend that for Dashboard. My colleague <a class="reference external" href="http://berrange.com/">Dan
Berrange</a> has an <a class="reference external" href="http://berrange.com/posts/2012/11/20/what-devstack-does-to-your-host-when-setting-up-openstack-on-fedora-17/">article with all dirty details</a>.</p>
<p>Good news is, at least for OpenStack's dashboard, devstack is not …</p><p>Lately, I'm getting involved into developing OpenStack, especially it's
dashboard.</p>
<p>Many developers recommend using <a class="reference external" href="http://devstack.org/">devstack</a> to work on OpenStack. For
some reasons, I can't recommend that for Dashboard. My colleague <a class="reference external" href="http://berrange.com/">Dan
Berrange</a> has an <a class="reference external" href="http://berrange.com/posts/2012/11/20/what-devstack-does-to-your-host-when-setting-up-openstack-on-fedora-17/">article with all dirty details</a>.</p>
<p>Good news is, at least for OpenStack's dashboard, devstack is not
required in any case, it just runs on plain Fedora. I simply followed
the instructions provided for <a class="reference external" href="https://fedoraproject.org/wiki/Test_Day:2012-09-18_OpenStack">Fedora's test day</a>, and they worked
great for me, no rocket science and no engineering master required.</p>
<p>Additionally I installed git and git-review (as root):
| <tt class="docutils literal">yum <span class="pre">-y</span> install git <span class="pre">git-review</span></tt>
then go to the location where you want to put the code, for me that's
| <tt class="docutils literal">cd ~/work</tt></p>
<p>and execute
| <tt class="docutils literal">git clone <span class="pre">https://github.com/openstack/horizon.git</span> && cd horizon</tt></p>
<p>This will get the source code from github, will create a new directory
named horizon, and change to that directory.</p>
<div class="line-block">
<div class="line"><tt class="docutils literal">./manage.py runserver</tt></div>
</div>
<p>starts Django's built in development server on your host, per default on
port 8000.</p>
<p>To visit your shiny Dashboard, direct your webbrowser to
<a class="reference external" href="http://localhost:8000">http://localhost:8000</a> .</p>
<p>When finished with your desired changes, you should submit them for
review. The process around that is covered here:
<a class="reference external" href="http://wiki.openstack.org/GerritWorkflow">http://wiki.openstack.org/GerritWorkflow</a></p>
Configuring Django to use a MySQL-Server via SSL2012-07-12T12:45:00+02:002012-07-12T12:45:00+02:00mrungetag:www.matthias-runge.de,2012-07-12:/2012/07/12/configuring-django-to-use-a-mysql-server-via-ssl/<p>Currently, I'm using Django to develop some internally used
applications. For one of them, I had to use a SSL connection to access a
MySQL database. As development environment, I'm using Fedora 17, of
course.</p>
<p>During that process, I ran into two bugs:</p>
<ul>
<li><p class="first">MySQL 5.5 doesn't export HAVE_OPENSSL …</p></li></ul><p>Currently, I'm using Django to develop some internally used
applications. For one of them, I had to use a SSL connection to access a
MySQL database. As development environment, I'm using Fedora 17, of
course.</p>
<p>During that process, I ran into two bugs:</p>
<ul>
<li><p class="first">MySQL 5.5 doesn't export HAVE_OPENSSL anymore, as it has done in
earlier versions. This causes MySQL-python to assume, SSL is
deactivated during build. Patching _mysql.c from MySQL-python to
ignore that, fixes it.</p>
</li>
<li><p class="first">It seems, ssl-connection parameters in Django have to be specified
something like this:</p>
<pre class="literal-block">
'database': {
'ENGINE':'django.db.backends.mysql',
'NAME':'dbname',
'USER':'dbuser',
'PASSWORD':'xxxxxxxxxxxx',
'HOST':'host',
'OPTIONS': {'ssl':{
'key':None,
'cert':None,
'ca':None,
'cipher': 'DHE-RSA-AES256-SHA'
},
},
</pre>
</li>
</ul>
syslog-ng und logcheck bei Fedora2011-12-30T20:11:00+01:002011-12-30T20:11:00+01:00mrungetag:www.matthias-runge.de,2011-12-30:/2011/12/30/fedora-syslog-ng-und-logcheck/<p>Ich benutze syslog-ng als Syslog-Daemon und logcheck, um mich über
Auffälligkeiten in den Logs informieren zu lassen. Bei Fedora gehören
die Logfiles normalerweise dem Benutzer root und der Gruppe root.
Logcheck soll aus Sicherheitsgründen nicht als Benutzer root laufen. Bei
Fedora gibt es einen logcheck-Nutzer, der in der Gruppe adm …</p><p>Ich benutze syslog-ng als Syslog-Daemon und logcheck, um mich über
Auffälligkeiten in den Logs informieren zu lassen. Bei Fedora gehören
die Logfiles normalerweise dem Benutzer root und der Gruppe root.
Logcheck soll aus Sicherheitsgründen nicht als Benutzer root laufen. Bei
Fedora gibt es einen logcheck-Nutzer, der in der Gruppe adm ist.
logcheck darf in der Standardkonfig jedoch keine Logfiles lesen.</p>
<p>Zum einen kann man dem beikommen, indem man in der Datei
/etc/logrotate.d/syslog den folgenden Eintrag zufügt:</p>
<pre class="literal-block">
create 0640 root adm
</pre>
<p>Syslog-ng lässt sich damit jedoch noch nicht zur Mitarbeit überreden, es
überprüft die Rechte an den Log-Dateien und korrigiert diese notfallt.
Daher benötigt man für syslog-ng noch die folgende kleine Änderung im
Config-File:</p>
<pre class="literal-block">
destination d_mesg {
file("/var/log/messages"
owner("root")
group("adm")
perm(0640)
);
};
destination d_auth {
file("/var/log/secure"
owner("root")
group("adm")
perm(0640)
);
};
</pre>
Splitting up django models2011-08-25T10:07:00+02:002011-08-25T10:07:00+02:00mrungetag:www.matthias-runge.de,2011-08-25:/2011/08/25/splitting-up-django-models/<ol class="arabic">
<li><p class="first">Create models folder unter <em>myapp</em></p>
</li>
<li><p class="first">Delete models.py under <em>myapp</em></p>
</li>
<li><p class="first">Add</p>
<pre class="literal-block">
class Meta:
app_label='myapp'
</pre>
<p><p>to each model</p>
</li>
<li><p class="first">Add for each model something like</p>
<pre class="literal-block">
from myModelFile import myModel
</pre>
<p><p>to models/__init__.py</p>
</li>
</ol>