<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"><channel><title>Vitrage Specs</title><link>http://specs.openstack.org/openstack/vitrage-specs</link><description /><copyright>2021, OpenStack Vitrage Team</copyright><item><title>Aodh Notifier</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/aodh-notifier.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/aodh-notifier"&gt;https://blueprints.launchpad.net/vitrage/+spec/aodh-notifier&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Evaluator performs root cause analysis on the Vitrage Graph and may determine that an alarm should be created, deleted or otherwise updated.
Other components are notified of such changes by the Vitrage Notifier service. Among others, Vitrage Notifier is responsible for handling Aodh Alarms.&lt;/p&gt;
&lt;p&gt;This blueprint describes the implementation of Vitrage Notifier for notifying Aodh on Vitrage alarms.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+------------------+&lt;/span&gt;           &lt;span class="o"&gt;+------------------+&lt;/span&gt;          &lt;span class="o"&gt;+------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Aodh&lt;/span&gt;           &lt;span class="o"&gt;&amp;lt;--+&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Vitrage&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Raise&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Vitrage&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;
                      &lt;span class="o"&gt;+--------|&lt;/span&gt;                  &lt;span class="o"&gt;&amp;lt;----------|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alarm&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Notifier&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Alarm&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Evaluator&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Other&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;--+&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------+&lt;/span&gt;           &lt;span class="o"&gt;+------------------+&lt;/span&gt;          &lt;span class="o"&gt;+------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage should be capable of creating, deleting and otherwise updating alarms as requested by the Evaluator Engine.
The notifier is responsible for ensuring these updates are executed. Specifically we will start here with Aodh alarms.&lt;/p&gt;
&lt;p&gt;Main challenges:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There is no way to define a ‘custom alarm’ in Aodh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vitrage alarms are based on resources. There is a need to pass the resource information to Aodh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Several alarms of the same type can be triggered at the same time, each for a different resource. For example, in case there is an alarm on a host, Vitrage will raise a deduced alarm on every instance in this host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How can someone ask for notifications on updates of Vitrage alarms?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The Vitrage Notifier will be separate from the Evaluator, as the two will have different demands of scale and other performance considerations.
The Vitrage Notifier will supply an API used by the Vitrage Evaluator, containing create/delete/update alarm.&lt;/p&gt;
&lt;p&gt;In Aodh, Vitrage alarms will be defined as event alarms, this seems like the most appropriate option. The resource id will be defined in the alarm query.&lt;/p&gt;
&lt;p&gt;Vitrage deduced alarms will look like this:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 32%"/&gt;
&lt;col style="width: 68%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Property&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Value&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;alarm_actions&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;alarm_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4a3cb988-a620-4bf3-87f7-077c751c408f&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Instance is unreachable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;enabled&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;True&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;event_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vitrage.alarm.instance_unreachable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;insufficient_data_actions&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vitrage_instance_unreachable_1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ok_actions&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;project_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;5542b27142154f30b32dea6238aa81aa&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;query&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[{field’: ‘resource_id’, ‘type’: ‘’, ‘value’:
‘b0bf3635-d9e8-4624-9793-7aac82948c0a’, ‘op’: ‘eq’}]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;repeat_actions&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;False&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;severity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;moderate&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;state&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;alarm&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;event&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;user_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8ab65ef808b245e3ba234b7b3554cb94&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In this example, Vitrage triggers a deduced alarm that an instance is unreachable due to a failure in the public switch (which was detected by Nagios).
There will be several alarms with the same event_type and different instance ids in their query.&lt;/p&gt;
&lt;p&gt;There are two options how to trigger Vitrage alarms in Aodh, none is perfect.&lt;/p&gt;
&lt;section id="alternative-1"&gt;
&lt;h3&gt;Alternative 1&lt;/h3&gt;
&lt;p&gt;Vitrage will create an event alarm in Aodh.
Then, it will send a notification to the message bus. The notification will be converted to a Ceilometer event, which will trigger the Aodh alarm.&lt;/p&gt;
&lt;p&gt;The exact notification and event format are still TBD.&lt;/p&gt;
&lt;p&gt;The main problem with this solution is that the Aodh alarm will be created on-the-fly and triggered immediately, so it will be impossible for another project to register a web-hook on the alarm before it is triggered.
It will be possbile to see Vitrage alarms in list-alarms, but not to be notified when they are first triggered.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternative-2"&gt;
&lt;h3&gt;Alternative 2&lt;/h3&gt;
&lt;p&gt;Vitrage will create an event alarm in Aodh, with ‘alarm’ state. The event itself will never be sent, so the alarm state will remain ‘alarm’.&lt;/p&gt;
&lt;p&gt;The problem with this solution is that Aodh will not send a notification about the alarm being triggered. But since in Alternative 1 it is also impossible to register on the alarm, there is no real difference between the two options.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;For Alternative 1 - there is a need to define the notification-&amp;gt;event configuration&lt;/p&gt;
&lt;p&gt;For Alternative 2 - None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idan-hefetz&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests and Tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;For Alternative 1 - there is a need to document the notification-&amp;gt;event configuration&lt;/p&gt;
&lt;p&gt;For Alternative 2 - None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Vitrage wiki page: &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Vitrage"&gt;https://wiki.openstack.org/wiki/Vitrage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage use cases: &lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/vitrage-use-cases.rst"&gt;https://github.com/openstack/vitrage/blob/master/doc/source/vitrage-use-cases.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 03 Jan 2021 00:00:00 </pubDate></item><item><title>Parametrized Template</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/stein/implemented/parametrized_template.html</link><description>
 
&lt;p&gt;StoryBoard link: &lt;a class="reference external" href="https://storyboard.openstack.org/#!/story/2004056"&gt;https://storyboard.openstack.org/#!/story/2004056&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec suggests a method to quickly create Vitrage templates based on
a template that contains parameters.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage template language is powerful, yet a bit verbose and it’s quite easy
to make syntax mistakes when creating a new template from scratch. Moreover,
in real production environments, we see that many templates have a very similar
structure like “an alarm on a host is propagated to its instances”. We would
like to make it easier to generate the most common templates.&lt;/p&gt;
&lt;p&gt;Another motivation for this feature is for Heat usage. A Heat user should be
able to easily define a Vitrage template for auto-healing or auto-scaling its
stack based on specific alarms. For more information, see &lt;a class="reference external" href="https://review.openstack.org/#/c/578786/"&gt;Heat_spec&lt;/a&gt; and
&lt;a class="reference external" href="https://review.openstack.org/#/c/583951/"&gt;Heat_template&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Parts of a template, like alarm names, resource states, etc. can be written as
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameters&lt;/span&gt;&lt;/code&gt;. When creating a new template, the user will have to assign
actual values to each parameter that doesn’t have a default value. The concept
is similar to the way that parameters are used in Heat.&lt;/p&gt;
&lt;p&gt;A &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Parameters&lt;/span&gt;&lt;/code&gt; section can be added to standard templates. Each &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameter&lt;/span&gt;&lt;/code&gt;
will hold two optional fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;description&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;default&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All values will be strings.&lt;/p&gt;
&lt;p&gt;The parameters can be used inside the templates, using a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_param(param)&lt;/span&gt;&lt;/code&gt;
syntax.&lt;/p&gt;
&lt;p&gt;Vitrage &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template&lt;/span&gt; &lt;span class="pre"&gt;add&lt;/span&gt;&lt;/code&gt; API will include a new option to create a template
based on a template with parameters. The template will be added to the database
only if all parameters are set.&lt;/p&gt;
&lt;section id="example-for-a-template-with-parameters"&gt;
&lt;h3&gt;Example for a template with parameters&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
  &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;standard&lt;/span&gt;
  &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_affects_instance_prototype&lt;/span&gt;
  &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Template prototype for scenarios where a Zabbix alarm on a host affects its instances&lt;/span&gt;
&lt;span class="nt"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;host_alarm_rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Zabbix rawtext of the alarm on the host&lt;/span&gt;
  &lt;span class="nt"&gt;instance_alarm_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Name of the alarm to be created on the instance&lt;/span&gt;
  &lt;span class="nt"&gt;instance_alarm_severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Severity of the alarm to be created on the instance&lt;/span&gt;
    &lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;WARNING&lt;/span&gt;
  &lt;span class="nt"&gt;host_state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;New state to be set for the host&lt;/span&gt;
    &lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;SUBOPTIMAL&lt;/span&gt;
  &lt;span class="nt"&gt;instance_state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;New state to be set for the instance&lt;/span&gt;
    &lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;SUBOPTIMAL&lt;/span&gt;
&lt;span class="nt"&gt;definitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
      &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
      &lt;span class="nt"&gt;rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_param(host_alarm_rawtext)&lt;/span&gt;
      &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_alarm&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
      &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;vitrage&lt;/span&gt;
      &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_param(instance_alarm_name)&lt;/span&gt;
      &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;RESOURCE&lt;/span&gt;
      &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.instance&lt;/span&gt;
      &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;RESOURCE&lt;/span&gt;
      &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.host&lt;/span&gt;
      &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
  &lt;span class="nt"&gt;relationships&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_alarm&lt;/span&gt;
      &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
      &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
      &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
      &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;contains&lt;/span&gt;
      &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
      &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_contains_instance&lt;/span&gt;
   &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
      &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
      &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
      &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_instance&lt;/span&gt;
&lt;span class="nt"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host and host_contains_instance&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;raise_alarm&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;alarm_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_param(instance_alarm_name)&lt;/span&gt;
            &lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_param(instance_alarm_severity)&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;set_state&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_param(instance_state)&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host and host_contains_instance and alarm_on_instance&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;add_causal_relationship&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_alarm&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;set_state&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;SUBOPTIMAL&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="cli-example"&gt;
&lt;h3&gt;CLI Example&lt;/h3&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="go"&gt;vitrage template add --path ./host_affects_instance_prototype.yaml --param 'host_alarm_rawtext'='High CPU load on host' --param 'instance_alarm_name'='High CPU load on instance'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="go"&gt;vitrage template add --path ./host_affects_instance_prototype.yaml --params 'host_alarm_rawtext'='High CPU load on host', 'instance_alarm_name'='High CPU load on instance'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;section id="hold-a-template-prototype-catalog"&gt;
&lt;h4&gt;Hold a template prototype catalog&lt;/h4&gt;
&lt;p&gt;Define templates of type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;prototype&lt;/span&gt;&lt;/code&gt; that will be added to Vitrage database
like other templates, but will be ignored by the evaluator.&lt;/p&gt;
&lt;p&gt;There will be APIs to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add a template prorotype&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;View all template prototypes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a template based on an existing prototype name&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Advantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;At runtime, Vitrage will hold a template prototype catalog that can be used
by the end users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Since users will not add new templates very often, the advantage is not very
important.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It will be harder to use the prototype ability in Heat, since the HOT
template will have to depend on runtime information of Vitrage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will have to decide how to handle prototype updates. The same HOT template
will behave differently if the prototype in Vitrage has changed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="implement-this-feature-in-heat"&gt;
&lt;h4&gt;Implement this feature in Heat&lt;/h4&gt;
&lt;p&gt;Instead of adding template prototypes in Vitrage, the prototyping option can be
quite easily implemented in Heat. The main disadvantage is, of course, that
the feature will not be available in Vitrage.&lt;/p&gt;
&lt;p&gt;The entire Vitrage template can be written inside a Hot template, in one of two
ways:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;As part of the Vitrage Template resource in Heat. The disadvantage is that
the Heat resource will be tightly coupled with Vitrage, and any syntax
change in Vitrage should be reflected in Heat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a comment inside the Vitrage Template resource in Heat. The disadvantage
is that writing a long yaml file as a comment is less clear and may result
in syntax and alignment errors.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None. The template parameters will be given actual values, and standard
templates will be added to the database.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Parameters should be added to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vitrage&lt;/span&gt; &lt;span class="pre"&gt;template&lt;/span&gt; &lt;span class="pre"&gt;add&lt;/span&gt;&lt;/code&gt; function call, if the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;path&lt;/span&gt;&lt;/code&gt; points to a template with parameters . All parameters that are
required in the template must be set.&lt;/p&gt;
&lt;p&gt;There will be two ways to specify the parameters:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;param&lt;/span&gt;&lt;/code&gt;: Followed by a key=value pair. There can be few &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;param&lt;/span&gt;&lt;/code&gt; pairs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;params&lt;/span&gt;&lt;/code&gt;: Followed by a list of key=value parameters, separated by “,”.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;These changes will be part of Vitrage template version 3.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None.
In the future this feature may be used to write a template editor UI.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat_afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Introduce Vitrage template version 3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support template loading and parameters injection for template parameters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support template validation for templates with parameters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New parameters for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template&lt;/span&gt; &lt;span class="pre"&gt;add&lt;/span&gt;&lt;/code&gt; API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation and tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests, functional tests and tempest tests&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new template format will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 24 Apr 2020 00:00:00 </pubDate></item><item><title>Prometheus Datasource Labels Mapping</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/stein/implemented/prometheus_datasource_labels_mapping.html</link><description>
 
&lt;p&gt;StoryBoard link (task #28682):
&lt;a class="reference external" href="https://storyboard.openstack.org/#!/story/2004682"&gt;https://storyboard.openstack.org/#!/story/2004682&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the method of mapping Prometheus’s alert labels into
Vitrage, in a way that will allow Vitrage to identify the resource that the
alarm was raised on.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage holds an entity graph with resources and alarms. Each alarm should be
connected to its resource in the graph, in order to support alarm correlation.
In Prometheus, an alert is based on a metric, where each metric can have different
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Labels&lt;/span&gt;&lt;/code&gt;. The labels contain enough information to identify the
resource, however for each alert Vitrage may need to use one or more different
label(s).&lt;/p&gt;
&lt;p&gt;The purpose of this blueprint is to define a way for Vitrage to easily
determine the identification method for every Prometheus alert.&lt;/p&gt;
&lt;p&gt;In the use cases that are described below, we would like to create a Prometheus
alarm vertex in Vitrage and connect it with an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;on&lt;/span&gt;&lt;/code&gt; edge to the right
resource in the graph.&lt;/p&gt;
&lt;section id="prometheus-alert-structure"&gt;
&lt;h3&gt;Prometheus alert structure&lt;/h3&gt;
&lt;p&gt;A Prometheus alert contains several fields, including:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;annotations&lt;/span&gt;&lt;/code&gt; - annotations including &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;description&lt;/span&gt;&lt;/code&gt; of the alert.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;labels&lt;/span&gt;&lt;/code&gt; - a list of one or more labels. The labels are generated from alert rule and
alert metrics that the alert is based on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;status&lt;/span&gt;&lt;/code&gt; - the current status of the alert: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;firing&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resolved&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of a Prometheus alert:&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"The average amount of CPU time spent in idle mode, per second, over the last minute (in seconds)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"High average CPU time on idle mode"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"endsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-30T09:43:52.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"generatorURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://devstack-rocky-release-4:9090/graph?g0.expr=100+%2A+%281+-+avg+by%28instance%29+%28irate%28node_cpu_seconds_total%7Bjob%3D%22node%22%2Cmode%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+20&amp;amp;g0.tab=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"alertname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"AvgCPUTimeOnIdleMode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"135.248.18.109:9100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"warning"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"receivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"vitrage"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nt"&gt;"startsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-26T15:22:07.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"firing"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A full description of Prometheus alert structure can be found in &lt;a class="reference external" href="https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/"&gt;prometheus_alert_description&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alerts-based-on-libvirt-metrics"&gt;
&lt;h3&gt;Alerts based on libvirt metrics&lt;/h3&gt;
&lt;p&gt;All libvirt alerts have the following labels:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt;: holds the hostname/ip of where the exporter is running&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;domain&lt;/span&gt;&lt;/code&gt;: libvirt name that the exporter is scraping&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alert-based-on-libvirt-cpu-metrics"&gt;
&lt;h4&gt;Alert based on libvirt CPU metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Test alert to test libvirt exporter.\n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"High cpu usage on vm"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"endsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-30T09:44:05.91446215Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"generatorURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://devstack-rocky-release-4:9090/graph?g0.expr=rate%28libvirt_domain_info_cpu_time_seconds_total%5B1m%5D%29+%2A+10000+%3E+13&amp;amp;g0.tab=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"alertname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"HighCpuOnVmAlert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"instance-00000004"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"135.248.18.109:9177"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"job"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"libvirt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"critical"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"receivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"vitrage"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nt"&gt;"startsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-26T15:23:05.91446215Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"firing"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Vitrage resource&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vitrage resource can be uniquely identified by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;domain&lt;/span&gt;&lt;/code&gt; labels.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alert-based-on-libvirt-network-metrics"&gt;
&lt;h4&gt;Alert based on libvirt network metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Another test alert to test libvirt exporter.\n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"High traffic on bridge"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"endsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-30T09:43:50.91446215Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"generatorURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://devstack-rocky-release-4:9090/graph?g0.expr=rate%28libvirt_domain_interface_stats_receive_bytes_total%5B5m%5D%29+%3E+0&amp;amp;g0.tab=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"alertname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"HighTrafficOnBridge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"instance-00000004"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"135.248.18.109:9177"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"job"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"libvirt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"source_bridge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"br-int"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"target_device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"tap456ab233-f4"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"receivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"vitrage"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nt"&gt;"startsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-26T15:22:05.91446215Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"firing"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Vitrage resource&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Short term: raise the alarm on the node or instance. Vitrage resource can be
uniquely identified by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;domain&lt;/span&gt;&lt;/code&gt; labels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Long term: Vitrage should hold a resource for br-int and the alarm should be
connected to that resource. Vitrage resource can be uniquely identified by
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;domain&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;source_bridge&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;target_device&lt;/span&gt;&lt;/code&gt; labels.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="node-metrics"&gt;
&lt;h3&gt;Node metrics&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;All Node metrics have a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; that holds the address of exporter.
The exporter can scrape metrics from the instance it is running on.
In this case ‘’instance`` label represents the resource address.
Also, It can scrape different metrics not from the instance (e.g. network metrics).
In this case &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; is just an address of the exporter and other labels
indicates to the resource.&lt;/p&gt;
&lt;section id="alert-based-on-node-cpu-metric"&gt;
&lt;h4&gt;Alert based on node CPU metric&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CPU metrics are scraped from the instance so &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; label represents the resource address.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"The average amount of CPU time spent in idle mode, per second, over the last minute (in seconds)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"High average CPU time on idle mode"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"endsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-30T09:43:52.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"generatorURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://devstack-rocky-release-4:9090/graph?g0.expr=100+%2A+%281+-+avg+by%28instance%29+%28irate%28node_cpu_seconds_total%7Bjob%3D%22node%22%2Cmode%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+20&amp;amp;g0.tab=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"alertname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"AvgCPUTimeOnIdleMode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"135.248.18.109:9100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"warning"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"receivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"vitrage"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nt"&gt;"startsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-26T15:22:07.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"firing"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Vitrage resource&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vitrage resource can be uniquely identified by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; label.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alert-based-on-node-filesystem-metric"&gt;
&lt;h4&gt;Alert based on node filesystem metric&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Prometheus alert example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"\"Consider ssh'ing into the instance and removing files or clean\ntemp files\"\n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/dev/vda1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"mount_point"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"runbook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"troubleshooting/filesystem_alerts_inodes.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"High number of inode usage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"92.42%"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"endsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-30T09:43:52.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"generatorURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://devstack-rocky-release-4:9090/graph?g0.expr=node_filesystem_files_free%7Bfstype%3D~%22%28ext.%7Cxfs%29%22%2Cjob%3D%22node%22%7D+%2F+node_filesystem_files%7Bfstype%3D~%22%28ext.%7Cxfs%29%22%2Cjob%3D%22node%22%7D+%2A+100+%3C%3D+100&amp;amp;g0.tab=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"alertname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"HighInodeUsage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/dev/vda1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"fstype"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ext4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"135.248.18.109:9100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"job"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"mountpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nt"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"critical"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nt"&gt;"receivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"vitrage"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nt"&gt;"startsAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2018-12-26T15:22:07.589431274Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"firing"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Vitrage resource&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Short term: raise the alarm on the node or instance. Vitrage resource can be
uniquely identified by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt; label.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Long term: Vitrage should hold a resource for ext4 and the alarm should be
connected to that resource. Vitrage resource can be uniquely identified by
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;instance&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;device&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fstype&lt;/span&gt;&lt;/code&gt; labels.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A configuration file that maps the Prometheus labels to a corresponding
Vitrage resource with specific properties (id or other unique properties).
The mapping will most likely be defined by the alert name and other fields.&lt;/p&gt;
&lt;section id="prometheus-configuration-file-structure"&gt;
&lt;h3&gt;Prometheus configuration file structure&lt;/h3&gt;
&lt;p&gt;The configuration file contains a list of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;alerts&lt;/span&gt;&lt;/code&gt;.
Each alert contains &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;key&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;key&lt;/span&gt;&lt;/code&gt; contains labels which uniquely identify each alert.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource&lt;/span&gt;&lt;/code&gt; specifies how to identify in Vitrage the resource that the alert is on.
It contains one or more Vitrage property names and corresponding Prometheus alert labels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration file example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;alerts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;alertname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;HighCpuOnVmAlert&lt;/span&gt;
    &lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;libvirt&lt;/span&gt;
  &lt;span class="nt"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;instance_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;domain&lt;/span&gt;
    &lt;span class="nt"&gt;host_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;alertname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;HighTrafficOnBridge&lt;/span&gt;
    &lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;libvirt&lt;/span&gt;
  &lt;span class="nt"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;instance_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;domain&lt;/span&gt;
    &lt;span class="nt"&gt;host_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;alertname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;AvgCPUTimeOnIdleMode&lt;/span&gt;
  &lt;span class="nt"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;alertname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;HighInodeUsage&lt;/span&gt;
    &lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;node&lt;/span&gt;
  &lt;span class="nt"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;7mode3294 (Muhamad Najjar)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Load configuration file and use it in the Prometheus transformer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentations and tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests, functional tests and tempest tests&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new configuration will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Prometheus datasource: &lt;a class="reference external" href="https://github.com/openstack/vitrage/tree/master/vitrage/datasources/prometheus"&gt;https://github.com/openstack/vitrage/tree/master/vitrage/datasources/prometheus&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prometheus alerting rules: &lt;a class="reference external" href="https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/"&gt;https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prometheus libvirt exporter: &lt;a class="reference external" href="https://github.com/CanonicalLtd/prometheus-openstack-exporter"&gt;https://github.com/CanonicalLtd/prometheus-openstack-exporter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prometheus node exporter: &lt;a class="reference external" href="https://github.com/prometheus/node_exporter"&gt;https://github.com/prometheus/node_exporter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 27 Feb 2019 00:00:00 </pubDate></item><item><title>Service List API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/stein/implemented/services_list_and_statuses.html</link><description>
 
&lt;p&gt;StoryBoard link: &lt;a class="reference external" href="https://storyboard.openstack.org/#!/story/2004897"&gt;https://storyboard.openstack.org/#!/story/2004897&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec adds a new api for listing all vitrage services and their status.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In a production cloud environment, Vitrage will have multiple services
deployed on multiple hosts. This will enable an admin to find these services
and get details like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;what is the node on which vitrage service is running,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what is the running status of vitrage service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How long the vitrage services are running successfully.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A new api command &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vitrage&lt;/span&gt; &lt;span class="pre"&gt;service&lt;/span&gt; &lt;span class="pre"&gt;list&lt;/span&gt;&lt;/code&gt; will be added that will list all
the vitrage services that are currently running, where are they running, their
status and how long are they running.&lt;/p&gt;
&lt;section id="example-of-a-response"&gt;
&lt;h3&gt;Example of a response&lt;/h3&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23161&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ApiWorker worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23153&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"EvaluatorWorker worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23155&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"EvaluatorWorker worker(1)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23157&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"EvaluatorWorker worker(2)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23158&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"EvaluatorWorker worker(3)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:33+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23366&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MachineLearningService worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:35+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23475&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"PersistorService worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:15+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23164&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SnmpParsingService worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:14:30+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vitrageuWSGI worker 1"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:14:30+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25699&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vitrageuWSGI worker 2"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"Created At"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2019-02-10T11:07:32+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"controller-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Process Id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23352&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"VitrageNotifierService worker(0)"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="cli-example"&gt;
&lt;h3&gt;CLI Example&lt;/h3&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="go"&gt;+----------------------------------+------------+--------------+---------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| Name                             | Process Id | Hostname     | Created At                |&lt;/span&gt;
&lt;span class="go"&gt;+----------------------------------+------------+--------------+---------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| ApiWorker worker(0)              |      23161 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| EvaluatorWorker worker(0)        |      23153 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| EvaluatorWorker worker(1)        |      23155 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| EvaluatorWorker worker(2)        |      23157 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| EvaluatorWorker worker(3)        |      23158 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| MachineLearningService worker(0) |      23366 | controller-1 | 2019-02-10T11:07:33+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| PersistorService worker(0)       |      23475 | controller-1 | 2019-02-10T11:07:35+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| SnmpParsingService worker(0)     |      23164 | controller-1 | 2019-02-10T11:07:15+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| vitrageuWSGI worker 1            |      25698 | controller-1 | 2019-02-10T11:14:30+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| vitrageuWSGI worker 2            |      25699 | controller-1 | 2019-02-10T11:14:30+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;| VitrageNotifierService worker(0) |      23352 | controller-1 | 2019-02-10T11:07:32+00:00 |&lt;/span&gt;
&lt;span class="go"&gt;+----------------------------------+------------+--------------+---------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;
The cloud operator must pre-install zookeeper or other tooz backend component.
Otherwise, an exception will be raised when users call the service REST API.&lt;/p&gt;
&lt;p&gt;If vitrage is running in k8s cluster then this api might be redundant.
Since k8s handles pods health and topology. We might make the service api
communicate with the k8s api in this case to get all vitrage services and
their statuses.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;New api will be added to vitrage to list the services.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;In order to support the api we will need a backend to store the information.
We will use the tooz library that supports multiple backends see &lt;a class="reference external" href="https://docs.openstack.org/tooz/latest/"&gt;Tooz&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div/&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;The deployer must pre-install zookeeper or other tooz backend component
In order to support the API.&lt;/p&gt;
&lt;p&gt;When deploying a container then hostname must be changed
so api will be readable.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;We need to think what to do in case of a container deployment.
docker by default has a hostname of the container id but it can be changed.&lt;/p&gt;
&lt;p&gt;We might use an optional environment variable (e.g HOST_HOSTNAME) for host name
if exist in case of a container that can be passed to the container.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Eyal&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add tooz support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add new API to vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add &lt;cite&gt;service list&lt;/cite&gt; to vitrage client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation and tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Depends on the tooz library with a backend configured.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests, functional tests and tempest tests&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 27 Feb 2019 00:00:00 </pubDate></item><item><title>Short Template Format</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/stein/implemented/short_template_format.html</link><description>
 
&lt;p&gt;StoryBoard link: &lt;a class="reference external" href="https://storyboard.openstack.org/#!/story/2004871"&gt;https://storyboard.openstack.org/#!/story/2004871&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec suggests a shorter format for Vitrage template files.
The new format should be shorter, read faster and written more easily.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage template language is powerful, yet a bit verbose and it’s quite easy
to make syntax mistakes when creating a new template from scratch.
We would like to make it easier to generate any template.&lt;/p&gt;
&lt;p&gt;For more information on the current format, see &lt;a class="reference external" href="https://docs.openstack.org/vitrage/latest/contributor/vitrage-template-format.html"&gt;Template_format&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Several simplifications that will result in a shorter template file
while preserving it’s capabilities.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Remove &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;definitions&lt;/span&gt;&lt;/code&gt; level nesting, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;entities&lt;/span&gt;&lt;/code&gt; will directly replace it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;relationships&lt;/span&gt;&lt;/code&gt;, these will be represented inline in the condition,
example usage &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;condition:&lt;/span&gt; &lt;span class="pre"&gt;host_ssh_alarm&lt;/span&gt; &lt;span class="pre"&gt;[&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;]&lt;/span&gt; &lt;span class="pre"&gt;host&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;entities&lt;/span&gt;&lt;/code&gt; will be changed from a list to a dictionary, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template_id&lt;/span&gt;&lt;/code&gt;
is removed and the entity key will be used instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;actions&lt;/span&gt;&lt;/code&gt; the field &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;action_type&lt;/span&gt;&lt;/code&gt; is removed and the action key will be used instead&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In each action &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;action_target&lt;/span&gt;&lt;/code&gt; nesting level is removed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;scenarios&lt;/span&gt;&lt;/code&gt; removed the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;scenario&lt;/span&gt;&lt;/code&gt; nesting level&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Action &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_state&lt;/span&gt;&lt;/code&gt; will be replaced with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_suboptimal&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_error&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_ok&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;raise_alarm&lt;/span&gt;&lt;/code&gt; action will have a new optional field &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;causing_alarm&lt;/span&gt;&lt;/code&gt; this will add a causal relationship
between the new alarm and the causing alarm, de-necessitating the use of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;add_causal_relationship&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="example-for-a-short-format-template"&gt;
&lt;h3&gt;Example for a short format template&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;3&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix alarm for network interface and ssh affects host instances&lt;/span&gt;
 &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix alarm for network interface and ssh affects host instances&lt;/span&gt;
&lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;host_network_alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
  &lt;span class="nt"&gt;rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host network interface is down&lt;/span&gt;
 &lt;span class="nt"&gt;host_ssh_alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
  &lt;span class="nt"&gt;rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host ssh is down&lt;/span&gt;
 &lt;span class="nt"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.instance&lt;/span&gt;
 &lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.host&lt;/span&gt;
&lt;span class="nt"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm [ on ] host&lt;/span&gt;
   &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;set_suboptimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_network_alarm [ on ] host AND host_ssh_alarm [ on ] host&lt;/span&gt;
   &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;add_causal_relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_network_alarm&lt;/span&gt;
        &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm [ on ] host AND host [ contains ] instance&lt;/span&gt;
   &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;raise_alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
        &lt;span class="nt"&gt;alarm_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance is down&lt;/span&gt;
        &lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;WARNING&lt;/span&gt;
        &lt;span class="nt"&gt;causing_alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
     &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;set_error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="example-for-an-equivalent-template-in-the-previous-format"&gt;
&lt;h3&gt;Example for an equivalent template in the previous format&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
 &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;standard&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix alarm for network interface and ssh affects host instances&lt;/span&gt;
 &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix alarm for network interface and ssh affects host instances&lt;/span&gt;
&lt;span class="nt"&gt;definitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
   &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
   &lt;span class="nt"&gt;rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host network interface is down&lt;/span&gt;
   &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_network_alarm&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
   &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
   &lt;span class="nt"&gt;rawtext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host ssh is down&lt;/span&gt;
   &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
   &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;vitrage&lt;/span&gt;
   &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance is down&lt;/span&gt;
   &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;RESOURCE&lt;/span&gt;
   &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.instance&lt;/span&gt;
   &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;RESOURCE&lt;/span&gt;
   &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.host&lt;/span&gt;
   &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
 &lt;span class="nt"&gt;relationships&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_network_alarm&lt;/span&gt;
   &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
   &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
   &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;network_alarm_on_host&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
   &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
   &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
   &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ssh_alarm_on_host&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
   &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;contains&lt;/span&gt;
   &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
   &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_contains_instance&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
   &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
   &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
   &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_instance&lt;/span&gt;
&lt;span class="nt"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ssh_alarm_on_host&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;set_state&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;SUBOPTIMAL&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;network_alarm_on_host AND ssh_alarm_on_host&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;add_causal_relationship&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_network_alarm&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ssh_alarm_on_host AND host_contains_instance&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;raise_alarm&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;alarm_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance is down&lt;/span&gt;
            &lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;WARNING&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;set_state&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ERROR&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ssh_alarm_on_host AND host_contains_instance AND alarm_on_instance&lt;/span&gt;
     &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;add_causal_relationship&lt;/span&gt;
          &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_ssh_alarm&lt;/span&gt;
            &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance_alarm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.
Templates will be stored in the same data model.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;These changes will be part of Vitrage template version 3.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idan_hefetz&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Introduce Vitrage template version 3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support template validation and loading&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation and tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests, functional tests and tempest tests&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new template format will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 27 Feb 2019 00:00:00 </pubDate></item><item><title>Vitrage-graph fast failover</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/rocky/implemented/graph_fast_failover.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/vitrage-fast-failover"&gt;https://blueprints.launchpad.net/vitrage/+spec/vitrage-fast-failover&lt;/a&gt;&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;vitrage-graph high availability should meet these requirements:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Single active instance of vitrage-graph (managed by pacemaker).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize quickly upon failover without requesting updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In case of a long downtime, vitrage-graph startup will request
collector updates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage-graph is active standby. Currently on a failover, vitrage-graph
needs to pull all the data again from the collector data-sources.
This takes a considerable amount of time, in which data is inconsistent.
As we wish to continue working with an in-memory graph (due to performance),
vitrage-graph service will remain active-standby. Therefore, downtime must
be minimized in failover events.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;after every get_all, vitrage-graph stores a full entity graph snapshot in
the db, so the majority of events do not need to be replayed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vitrage-graph sends each processed event to vitrage-persistor so these
are stored in the order of handling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upon init vitrage-graph queries the db table graph_snapshots, fetching the
latest entry, it will be used if it is not older than snapshot_interval.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Init with a snapshot - on failover&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unpickle stored snapshot to get the graph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the processor on all the events (from events table) that occurred after
the snapshot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the evaluators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Process all the events that are waiting in the message bus.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Init without a snapshot - a fresh start (This is the current behaviour).&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Start with a new empty graph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RPC to Collector to run get_all for all drivers, then process the events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Process all the events that are waiting in the message bus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable evaluator and iterate all graph.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Using a persistent graph database can improve vitrage-graph high availability
as fail-over will be quick due to running active-active. This may be a
preferred solution in terms of high availability, but overall, when comparing
performance compared to in-memory networkx, the degradation is not reasonable&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;May require minor changes, TBD.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;This will be enabled by default.
Deployer may disable in by adding the following to vitrage.conf
[persistancy]
enable_persistancy=false&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idan-hefetz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Additional tempest will be added for fail-over, as persistence is already
covered by existing tempest.
Unit tests will not be affective here as changes are mostly in the init process
and scheduler. This feature mostly reuses existing (tested) functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 13 Nov 2018 00:00:00 </pubDate></item><item><title>kubernetes Datasource Driver - get_all implementation</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/rocky/implemented/k8s-datasource.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/k8s-datasource"&gt;https://blueprints.launchpad.net/vitrage/+spec/k8s-datasource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the kubernetes datasource, and its
implementation for get_all nodes (VM’s).&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Kubernetes nodes should be added to Vitrage Graph via Vitrage Datasources.
This requires writing a Datasource for kubernetes.&lt;/p&gt;
&lt;p&gt;The datasource should support get_all: periodic query all kubernetes nodes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Kubernetes datasource will be configured with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Poll interval in seconds (default: 600)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every poll-interval seconds, Kubernetes Driver will call kubernetes client to retrieve all nodes.
The nodes will be converted to Vitrage datasource events and passed to Vitrage
Graph queue.&lt;/p&gt;
&lt;p&gt;Example of kubernetes client return call for list_nodes()&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;
  &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt;
  &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt;
      &lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;managed&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;
    &lt;span class="n"&gt;creationTimestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="n"&gt;T07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
    &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;arch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amd64&lt;/span&gt;
      &lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linux&lt;/span&gt;
      &lt;span class="n"&gt;failure&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;regionOne&lt;/span&gt;
      &lt;span class="n"&gt;failure&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;zone0&lt;/span&gt;
      &lt;span class="n"&gt;is_control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;
      &lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bcmt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bcmt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;
    &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;resourceVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10714282"&lt;/span&gt;
    &lt;span class="n"&gt;selfLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bcmt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;
    &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;68011206&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d4d6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;11e7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;c63&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa163e2e2123&lt;/span&gt;
  &lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;externalID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="n"&gt;c40aab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;80e9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;bb6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a280&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;27976&lt;/span&gt;&lt;span class="n"&gt;bfc811f&lt;/span&gt;
    &lt;span class="n"&gt;providerID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;///&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="n"&gt;c40aab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;80e9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;bb6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a280&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;27976&lt;/span&gt;&lt;span class="n"&gt;bfc811f&lt;/span&gt;
    &lt;span class="n"&gt;taints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NoExecute&lt;/span&gt;
      &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;is_control&lt;/span&gt;
      &lt;span class="n"&gt;timeAdded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;
      &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;
  &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;172.16.1.12&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InternalIP&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.5.138.49&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InternalIP&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bcmt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hostname&lt;/span&gt;
    &lt;span class="n"&gt;allocatable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;
      &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3779500&lt;/span&gt;&lt;span class="n"&gt;Ki&lt;/span&gt;
      &lt;span class="n"&gt;pods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"110"&lt;/span&gt;
    &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;
      &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3881900&lt;/span&gt;&lt;span class="n"&gt;Ki&lt;/span&gt;
      &lt;span class="n"&gt;pods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"110"&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastHeartbeatTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kubelet&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;sufficient&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;
      &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KubeletHasSufficientDisk&lt;/span&gt;
      &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"False"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OutOfDisk&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastHeartbeatTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kubelet&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;sufficient&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;
      &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KubeletHasSufficientMemory&lt;/span&gt;
      &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"False"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MemoryPressure&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastHeartbeatTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kubelet&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="n"&gt;pressure&lt;/span&gt;
      &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KubeletHasNoDiskPressure&lt;/span&gt;
      &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"False"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DiskPressure&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastHeartbeatTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;
      &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kubelet&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;posting&lt;/span&gt; &lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
      &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KubeletReady&lt;/span&gt;
      &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"True"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Ready&lt;/span&gt;
    &lt;span class="n"&gt;daemonEndpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;kubeletEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10250&lt;/span&gt;
    &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;172.16.1.4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gcr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hyperkube&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;172.16.1.4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gcr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hyperkube&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="mf"&gt;.7.4&lt;/span&gt;
      &lt;span class="n"&gt;sizeBytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;615424570&lt;/span&gt;
    &lt;span class="n"&gt;nodeInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;architecture&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amd64&lt;/span&gt;
      &lt;span class="n"&gt;bootID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;883&lt;/span&gt;&lt;span class="n"&gt;c98a9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;f9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;af7d&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a448ad817249&lt;/span&gt;
      &lt;span class="n"&gt;containerRuntimeVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;1.12.6&lt;/span&gt;
      &lt;span class="n"&gt;kernelVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.10.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;514.21.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;el7&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;
      &lt;span class="n"&gt;kubeProxyVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="mf"&gt;.7.4&lt;/span&gt;
      &lt;span class="n"&gt;kubeletVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="mf"&gt;.7.4&lt;/span&gt;
      &lt;span class="n"&gt;machineID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10783&lt;/span&gt;&lt;span class="n"&gt;ea106f742728fede153a98b035d&lt;/span&gt;
      &lt;span class="n"&gt;operatingSystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linux&lt;/span&gt;
      &lt;span class="n"&gt;osImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Red&lt;/span&gt; &lt;span class="n"&gt;Hat&lt;/span&gt; &lt;span class="n"&gt;Enterprise&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="mf"&gt;7.3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Maipo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;systemUUID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="n"&gt;C40AAB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;80E9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;BB6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;A280&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;27976&lt;/span&gt;&lt;span class="n"&gt;BFC811F&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Relevant data will be extracted:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Creation Timestamp.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Addresses (IP’s)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;kubernetes ID (uid)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;providerID&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;New vertices will be added to the entity graph. This might be duplicate vertices.
(VM’s from Nova and kubernetes).
Proposed solution is resource equivalence. (planned for future work)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Kubernetes driver should be configured.(get access to master node)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Idan-kinory&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Datasource configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Datasource main blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/k8s-datasource"&gt;https://blueprints.launchpad.net/vitrage/+spec/k8s-datasource&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 13 Nov 2018 00:00:00 </pubDate></item><item><title>Vitrage-Collector on demand</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/rocky/implemented/rpc-collector.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/rpc-collector"&gt;https://blueprints.launchpad.net/vitrage/+spec/rpc-collector&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A simpler implementation of Vitrage high availability, collector service
should meet these new requirements:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;collector should be active-active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dependency between the collector and graph services should be removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vitrage-graph should be able to request updates from the collector when needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The current implementation, where vitrage collector and vitrage graph are
always restarted simultaneously, is not desired, but is due to the lack of a
better triggering event for get_all. In addition message bus may overload
occasionaly due to this behaviour, when vitrage-graph is down and does not
consume the messages.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Collector receives synchronous RPC and retrieves a list of all the events.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;vitrage-collector implementation:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Remove timers for get_all and get_changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_all and get_changes can be called by RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_all and get_changes receive a list parameter &lt;cite&gt;datasource_names&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will return all the entities from all the specified data-sources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will open a thread to write all the events to the Persistor message queue
in the background.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove dependency between the collector and graph services (.service files)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;vitrage-graph implementation:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Should manage the RPC calls to get_all and get changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add appropriate timers calling get_all and get_changes by RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List of events should be processed using an event coordinator
(before &lt;cite&gt;TwoPrirityQueue&lt;/cite&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A snapshot should be taken after each get_all once the events have been processed.
So the majority of events do not need to be replayed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;vitrage-collector could be restarted individually from vitrage-graph&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idan-hefetz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;New behaviour is already covered by existing tempest&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 13 Nov 2018 00:00:00 </pubDate></item><item><title>Nova Entity Transformer</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/nova-entity-transformer.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/nova-entity-transformer"&gt;https://blueprints.launchpad.net/vitrage/+spec/nova-entity-transformer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When an entity event is being introduced into Vitrage graph, it must
be transformed into a type which can be handled by the graph.
The Entity transformer is responsible for converting an entity event
into entity wrapper. Each entity type has his own transformer.&lt;/p&gt;
&lt;p&gt;All transformers should be written in python and added to vitrage.conf.
The Entity Transformer Engine allows a service provider to extend
support for other entities by writing a designated transformer for each
entity type.&lt;/p&gt;
&lt;p&gt;The first transformers to implement are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Nova Instance transformer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nova Host transformer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In Vitrage graph, each (instance of an) entity is represented as a vertex.
Therefore, the output of a transformer is a vertex for the given entity
(an “entity vertex”).
In addition, the transformer also returns a list of (vertex, edge)-pairs.
The vertex in each pair describes a neighbor with limited properties, and the
edge represents the connection between both vertices, describing their
relationship.&lt;/p&gt;
&lt;p&gt;There are different Entity Types that should be supported by Vitrage:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Openstack types (Nova.instance, Nova.host and etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Non-Openstack types (Nagios tests, Physical resources and etc.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: in Vitrage Graph, each vertex contains a dictionary of key-value pairs
which represents the entity properties. Similarly, each edge contains a
dictionary of key-value pairs which represents aspects of the relation between
two vertices.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;When the Entity Processor receives a new entity event, it asks the Entity
Transformer to convert the event into an object which the processor can then
enter into the Vitrage Graph.&lt;/p&gt;
&lt;p&gt;Transformer Operation: When receiving an entity event, the Transformer Engine
first recognizes the entity type and accordingly activates the corresponding
transformer. Each transformer inherits from the Transformer base class and
implements the three methods:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Method that returns an entity wrapper&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method that returns key fields and their order.The key fields are mandatory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method that returns a key by given an entity event&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="output-object"&gt;
&lt;h3&gt;Output Object&lt;/h3&gt;
&lt;p&gt;The transformer returns an Entity Wrapper, which is a tuple containing an
entity vertex and a list of (vertex,edge) pairs that describe the entity
neighbors (relationships).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Entity (source) vertex description:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mandatory properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;key&lt;/span&gt;&lt;/code&gt; - For Openstack entities this is the Openstack ID. For non-Openstack&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;entities this is an ID which will generated by Vitrage&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Type&lt;/span&gt;&lt;/code&gt; - Resource Physical Resource Alarm Tests Results&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Sub&lt;/span&gt; &lt;span class="pre"&gt;Type&lt;/span&gt;&lt;/code&gt; -  Alarm Name, host, instance, switch and etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Entity&lt;/span&gt; &lt;span class="pre"&gt;Name&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Is&lt;/span&gt; &lt;span class="pre"&gt;Deleted&lt;/span&gt;&lt;/code&gt;- needed for graph maintenance and marks items that can be&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;gathered by the garbage collector&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Optional properties (vertex metadata)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;State&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Project&lt;/span&gt; &lt;span class="pre"&gt;ID&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The optional properties list is flexible and can be changed as needed.
In addition, each entity type can have its own relevant properties.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(vertex, edge) Pairs:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pair describes a entity’s neighbor vertex and their relationship.
Relationships can be both physical, virtual or (in the future) logical&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Target&lt;/span&gt; &lt;span class="pre"&gt;vertex&lt;/span&gt; &lt;span class="pre"&gt;description&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;The vertex in the pair must have sufficient data to help specify uniquely
which vertex in the Vitrage Graph will be connected to this entity.
Currently, the minimal information needed for this is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ID - For each entity, must have the data which vertex it connects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type - Resource Physical Resource Alarm Tests Results&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sub Type -  Alarm Name, host, instance, switch and etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Edge&lt;/span&gt; &lt;span class="pre"&gt;description&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Source ID  Entity ID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Target ID - For each entity, must have the data which vertex it connects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relation Type  - contains, run, attached and etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Event Type:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The type of the event as it happened. Possible options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;CREATE - New entity is created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UPDATE - The entity has been updated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DELETE  - When the entity is deleted&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;liat har-tal&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;All code will be tested&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Vitrage project &amp;lt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Vitrage"&gt;https://wiki.openstack.org/wiki/Vitrage&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Synchronizer</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-synchronizer.html</link><description>&lt;figure class="align-center"&gt;
&lt;a class="reference internal image-reference" href="../../_images/synchronizer_init.jpg"&gt;&lt;img alt="Architecture summary" src="../../_images/synchronizer_init.jpg" style="width: 100%;"/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;section id="synchronizer"&gt;
 
&lt;p&gt;The synchronizer is a vitrage inner module which supplies both a snapshot (all the entities)
of openstack services via poll requests, or,
change notifications for entities which comprise the same OS services,
via push notifications.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Enable vitrage and to maintain the most up-to-date view of OS services, Nagios, etc., it samples.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;periodically samples OS services, Nagios, etc., and produces up to date entities once changed (in contrast to deltas)&lt;/p&gt;
&lt;section id="design"&gt;
&lt;h3&gt;design&lt;/h3&gt;
&lt;section id="interacting-with-the-module"&gt;
&lt;h4&gt;interacting with the module&lt;/h4&gt;
&lt;section id="get-all-notifications"&gt;
&lt;h5&gt;get all notifications&lt;/h5&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;list of entity types&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="change-notifications"&gt;
&lt;h5&gt;change notifications&lt;/h5&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;registration:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;supply a list of entity types and a callback function for the synchronizer to invoke for sending information back concurrent immediate    execution (a call for this function is would not block the caller)done by the vitrage graph manager&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;push notifications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="synchronizers-response"&gt;
&lt;h5&gt;synchronizers response&lt;/h5&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;either list-all and notifications response contains entities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;each entity must contain:keyparent/child keytypetimestamp?CRUD action (new entity/updated/…)state (active/shutdown/…)project (role)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="synchronizer-plugins"&gt;
&lt;h4&gt;synchronizer plugins&lt;/h4&gt;
&lt;p&gt;kinds of plugins:&lt;/p&gt;
&lt;section id="message-bus-plugin"&gt;
&lt;h5&gt;Message bus plugin&lt;/h5&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;register for message bus notifications via the oslo-messaging library&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="collector-plugin"&gt;
&lt;h5&gt;Collector plugin&lt;/h5&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------------------------------------------------------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                                                                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="n"&gt;vitrage&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;    &lt;span class="o"&gt;^&lt;/span&gt;                                                      &lt;span class="o"&gt;^&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;                                                      &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------------------------------------------------------------------------------------+&lt;/span&gt;
                         &lt;span class="o"&gt;|&lt;/span&gt;                                                      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------------------------------------------------------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="n"&gt;synchronizer&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;                                                      &lt;span class="o"&gt;|&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;                                                      &lt;span class="o"&gt;|&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;+--------+-----------------------+&lt;/span&gt;     &lt;span class="n"&gt;collect&lt;/span&gt;          &lt;span class="o"&gt;+-------+------------+&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;notifications&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;                    &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;worker&lt;/span&gt;                     &lt;span class="o"&gt;+---+-------------+&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;worker&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;                    &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;+--------------------------------+&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="o"&gt;+------------------+-+&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                          &lt;span class="n"&gt;notification&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="n"&gt;collect&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                    &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="n"&gt;notifications&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                    &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+------------------------------------------------------------+&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;----------+&lt;/span&gt;  &lt;span class="o"&gt;+------------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                         &lt;span class="n"&gt;collector&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;+----------------------------+&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;hash0&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;hash1&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;hash2&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;hash3&lt;/span&gt;&lt;span class="o"&gt;|...&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-----+&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;+----------^-----------------+&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="n"&gt;hash1&lt;/span&gt; &lt;span class="o"&gt;==&amp;gt;&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;propagate&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                        &lt;span class="o"&gt;|&lt;/span&gt;                         &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;+-----------+---------------+&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;sampling&lt;/span&gt;  &lt;span class="o"&gt;^&lt;/span&gt;             &lt;span class="o"&gt;&amp;lt;------------+&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;+----------|----------------+&lt;/span&gt;                   &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;                                    &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                                                            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;                                    &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+------------------------------------------------------------+&lt;/span&gt;  &lt;span class="o"&gt;+-----------+&lt;/span&gt;  &lt;span class="o"&gt;+------------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                         &lt;span class="o"&gt;|&lt;/span&gt;                                                                      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------------------------------------------------------------------------------------+&lt;/span&gt;
                          &lt;span class="o"&gt;|&lt;/span&gt;
              &lt;span class="o"&gt;+-----------+-------------------+&lt;/span&gt;
              &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;OS&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;
              &lt;span class="o"&gt;+-------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;samples OS services, Nagios, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;via each OS service REST API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;method of collection:
retrieve OS service elements list. For the purposes of:change
notifications - as part of the periodic collection of the latest snapshot
we’d use this method of collection against OS services which doesn’t
propagates change notification.run on its own collection subprocesses
how to discover a change once a snapshot is collected, we’d like to know
which entity was changed from the latest time a snapshot was taken in order
to enable this, we’d keep a baseline - a data structure which contains for each OS service entity (such as a vm instance), its ID + it latest collection timestamp or a hash which represents its latest state.by comparing the latest snapshot of elements against the baseline, we’d know for which entity we’d like to propagate a notification for.collect deltas for services which reveals this functionality for the purposes of change notifications this is the easy case, where change notifications are simply passed on to whoever registered for them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deployment - as a library&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="consumer-flow"&gt;
&lt;h4&gt;consumer flow&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;new plugin:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;write my_plugin.py:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;my_plugin(synchronizer.BasePlugin): …
register my_plugin class path in conf file
install an egg which contains a my_plugin.py
restart vitrage service&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;initial configuration:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;configure nova, heat, etc. to send message bus notifications for vitrage too (consumption of msg bus notification by the listener removes it from the queue)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configure active entity types&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configure message bus credentials for the msg bus listener&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configure nagios credentials&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;register for ‘change notification’ - for a streaming change notifications, upon synchronizer initialization, the consumer would supply the queue on which the notifications would be returned to upon synchronizer initialization which would spawn subprocesses which would call the ‘get all’ periodically in order to supply the graph with the latest snapshot.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit Tests - Tox
Integration Tests - Tempest&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Vitrage Template Validation API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/newton/template-validate-api.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/template-validate-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/template-validate-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An API for validating templates&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We would like to be able to validate a single template (or several templates)
through api before uploading it to Vitrage.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create API to validate Vitrage templates in terms of content and syntax.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;By given a full path to template file, validate a single template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By given a full path to directory, validate all template files inside it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The template validate API returns a result that contains the following fields:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;status - validation succeeded/failed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;file path - the full path to the template file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;message - error message&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status code&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="template-validate"&gt;
&lt;h4&gt;Template Validate&lt;/h4&gt;
&lt;p&gt;Validate Vitrage template(s)&lt;/p&gt;
&lt;section id="post"&gt;
&lt;h5&gt;POST /&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="headers"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-Agent (String)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Content-Type (String): application/json&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;path (string(255), required) - the path to template file or directory&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;POST /v1/template/?path=[file/dir path]
Host: 135.248.18.122:8999
User-Agent: keystoneauth1/2.3.0 python-requests/2.9.1 CPython/2.7.6
Content-Type: application/json
Accept: application/json
X-Auth-Token: 2b8882ba2ec44295bf300aecb2caa4f7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="status-code"&gt;
&lt;h4&gt;Status code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;400 - Bad request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns a JSON object that is a list of results.
Each result describes the full validation (syntax and content) of one template file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="response-examples"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"validation failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"file path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/tmp/templates/basic_no_meta.yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Template syntax validation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metadata is a mandatory section."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"status code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"validation OK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"file path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/tmp/templates/basic.yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Template validation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Template validation is OK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;"status code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;liat har-tal &amp;lt;&lt;a class="reference external" href="mailto:liat.har-tal%40nokia.com"&gt;liat&lt;span&gt;.&lt;/span&gt;har-tal&lt;span&gt;@&lt;/span&gt;nokia&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Depends on the template validation blueprints&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tempest tests also need to be added in order to test:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Validate single template&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate several templates&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Get Aodh Alarms From Message Bus Notifications</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/aodh-message-bus-notifications.html</link><description>
 
&lt;p&gt;Get Aodh alarms immediately via notification from the message bus.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently Aodh datasource queries Aodh alarms periodically. It is not in time
and it is also not efficient, since most query will get no change when the
interval of alarm evaluation in Aodh is larger than the interval of pulling
Aodh alarm in Vitrage.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Aodh &lt;cite&gt;update_method&lt;/cite&gt; in vitrage config file will be configured with:&lt;/p&gt;
&lt;p&gt;/etc/vitrage/vitrage.conf&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;aodh&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;update_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add a new notification topic in Aodh config file:&lt;/p&gt;
&lt;p&gt;/etc/aodh/aodh.conf&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;oslo_messaging_notifications&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;topics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vitrage_notifications&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vitrage listener will get the alarm events from the message bus. Aodh driver
will filter the needed event types, enrich the events and then send them to
the queue for the Aodh transformer to create, update or delete the entity
vertex.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;performance improvement of getting Aodh alarms&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Config &lt;cite&gt;update_method&lt;/cite&gt; as ‘push’ in &lt;cite&gt;Aodh&lt;/cite&gt; section in vitrage config file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the &lt;cite&gt;vitrage_notifications&lt;/cite&gt; topic in &lt;cite&gt;oslo_messaging_notifications&lt;/cite&gt;
section in Aodh config file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dongwenjuan &amp;lt;&lt;a class="reference external" href="mailto:dong.wenjuan%40zte.com.cn"&gt;dong&lt;span&gt;.&lt;/span&gt;wenjuan&lt;span&gt;@&lt;/span&gt;zte&lt;span&gt;.&lt;/span&gt;com&lt;span&gt;.&lt;/span&gt;cn&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation will be modified to describe how to configure the notification
topics in Aodh when using devstack to deploy OpenStack env.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Vitrage Multi Tenancy Support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/multi-tenancy-support.html</link><description>
 
&lt;p&gt;When a tenant uses Vitrage APIs we would like to show him only the data that is relevant to him.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage needs to show in its API an CLI only the data relevant to that tenant (it can’t show all the data due to irrelevancy and privacy of each tenant).
Thus for each datasource and entity we need to know what relevant data to show for that tenant.
We would also like to show all of the data if someone adds the all_tenants property.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Here is a description, for each of the Vitrage APIs, how it should behave for each tenant:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Get alarms:&lt;/dt&gt;&lt;dd&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Find all the alarms with the requested project_id (if the project is admin then show also alarms that has no project_id property)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find all the resources with the requested project_id and return all the alarms that are attached to them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge the results from the previous steps and return it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Get RCA:&lt;/dt&gt;&lt;dd&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Find all the alarms that this alarm has caused, recursively. When reaching an alarm that is not of same project_id (or on resource of same project_id), stop the recursion, including this last alarm in the response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find all the alarms that caused this alarm, recursively. When reaching an alarm that is not of same project_id (or on resource of same project_id), stop the recursion, including this last alarm in the response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge the results from the previous steps and return it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Get Topology:&lt;/dt&gt;&lt;dd&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Find all the connected components for project_id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each component, select 1 entity and find all paths (without cycles) to “openstack.cluster” entity. Add all of the vertices in the path to the component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge all the components and return it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Remark: API and CLI needs to behave the same.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40alcatel-lucent.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Static Data Source Configuration</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/static-datasource-configuration.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/static-datasource-config-format"&gt;https://blueprints.launchpad.net/vitrage/+spec/static-datasource-config-format&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The configuration of static data source has a lot in common with entity and
relationships definition in evaluator template. This blueprint proposes a
refactoring to reuse the template format and parsing methods in static data
source. By doing so, we may reduce the work in maintenance and bring in new
features more easily.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently the configuration of static data source use a dedicated format, which
has a lot of overlapping with the evaluator templates.&lt;/p&gt;
&lt;p&gt;In static configuration, there are &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;entities&lt;/span&gt;&lt;/code&gt; and their &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;relationships&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entities&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {entity}&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {entity}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In each entity&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;relationship&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;relationship&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In evaluator templates we define: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;entities&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;relationship&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;scenarios&lt;/span&gt;&lt;/code&gt;. Each scenario has a condition and actions.&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;definitions&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- entities&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {entity}&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {entity}&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- relationships&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {relationship}&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;- {relationship}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Though serving different purpose, they both&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Describe &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;entities&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;relationships&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use a dedicated key (id/template_id) to reference the items&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Include a source entity and target entity in relationship&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The main differences between the two are&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Evaluator templates defines a topology and scenarios based on it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Static config defines a topology and &lt;strong&gt;adds&lt;/strong&gt; it to the graph&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We may define the static configuration using the same format as the evaluator
templates. And then simulate an entity discovery from the same file.&lt;/p&gt;
&lt;p&gt;By reusing the template parsing engine and workflow, we may reduce the work
in maintenance and bring in new features more easily.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Refactoring the static data source template and use the same parser as in
evaluator template.&lt;/p&gt;
&lt;p&gt;Discover entities from the static data source template.&lt;/p&gt;
&lt;p&gt;For backward compatibility, static data source will take over the control of the
default configuration folder &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/vitrage/static_datasource&lt;/span&gt;&lt;/code&gt; which was used
by static physical datasource.&lt;/p&gt;
&lt;p&gt;Both legacy format and new format will be placed in the same folder. static
datasource parse the file and check the existence of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;meta&lt;/span&gt;&lt;/code&gt; to decide which
engine to use. If not found, proxy the job to static physical datasource and
print a deprecation warning.&lt;/p&gt;
&lt;p&gt;Static physical datasource will be disabled by default and throws exception if
running standalone.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Fix the issues found in static data source without refactoring the format. This
will keep best back-compatibility but will cause redundant work with scenario
evaluator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Backward compatibility with old format will be kept.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This introduces a new feature and a minor version incremental is required.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;New format of static data source configuration should be applied by the end
user.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Old parser will be kept but a deprecated warning will be prompt.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yujunz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Reuse the parser of evaluator template in static data source configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Discover entities from the configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add deprecated warning on old format.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes shall be covered by new unit test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;New format of the template shall be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Vitrage ID</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/vitrage-id.html</link><description>
 
&lt;p&gt;Vitrage ID will be standard generated UUID.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently Vitrage ID is actually a set of properties. This can create duplicates and is very misleading.
Furthermore it will impair us once we have history, since same alarms can happen multiple times. Thus,
it should be the same as any other service in Openstack and provide an ID based on Openstack UUID.
generating algorithm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Changing Vitrage ID from it’s current algorithm to an OpenStack compliant “UUIDUtils” generated UUID.&lt;/p&gt;
&lt;p&gt;All the documentations and examples in Vitrage project should be updated to use an OpenStack compliant UUID.&lt;/p&gt;
&lt;p&gt;A few Mock Json files exist for “mock api” requests purposes, for example, alarms.sample.json.
They contain the “old” Vitrage ID. The “mock” api should be deleted, and the same should go with
these file. We can also just fix the examples in the mock.&lt;/p&gt;
&lt;p&gt;Alarm IDs: When creating Vitrage ID for an alarm, we also need to put it in the metadata when
updating AODH / other. Afterwards, when getting the updated alarm back, we will to update the
alarm ID in Vitrage, In case we will have simultaneous multiple alarm engines, we might need to
have an “ServiceName / ID” map for the alarm, and the Alarm ID in Vitrage will be “Vitrage ID”.&lt;/p&gt;
&lt;p&gt;Template IDs should be changed back from a calculated String to generated uuid, in scenario_repository.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Datasources:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;key / value tests : fix field names.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transformers: No change is needed in the Transformers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processor: Checking if an entity exists in the graph: The entity is currently queried in the
Graph according to its Vitrage ID. Instead, it will be queried according to the parameters set.
If the entity exists, it’s original Vitrage ID will be used. Otherwise, a new UUID will be
generated for vitrage ID via openstack UUIDUtils’ generate_uuid.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Update all necessary tests.&lt;/p&gt;
&lt;p&gt;No changes are needed in Evaluator Action / Recipes or in Consistency enforcer.&lt;/p&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Performance needs to be tested, since after the development of this blueprint, all graph queries will use parameters
instead of a single index.&lt;/p&gt;
&lt;p&gt;As long as Vitrage uses an in memory graph database, starting from this change, standard HA will be buggy,
to say the least. An entity’s Vitrage ID will have different values in each HA “instance”. Using Pacemaker
equivalent HA (stonith) will solve this.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;doffek &amp;lt;&lt;a class="reference external" href="mailto:dany.offek%40gmail.com"&gt;dany&lt;span&gt;.&lt;/span&gt;offek&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Aodh : Need to change the notification from Vitrage to Aodh.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;All documentation regarding the creation of Vitrage ID will be updated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Integration with Mistral</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/integration-with-mistral.html</link><description>&lt;p&gt;This work is licensed under a Creative Commons Attribution 3.0 Unported
License.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://creativecommons.org/licenses/by/3.0/legalcode"&gt;http://creativecommons.org/licenses/by/3.0/legalcode&lt;/a&gt;&lt;/p&gt;
&lt;section id="integration-with-mistral"&gt;
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/integration-with-mistral"&gt;https://blueprints.launchpad.net/vitrage/+spec/integration-with-mistral&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Support executing Mistral workflows from Vitrage.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage provides insights about the state of the cloud, but is not meant to be
a policy engine. In order to take corrective actions, for example, we need to
integrate an external engine like Mistral - the OpenStack workflow engine.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;It will be possible to define in Vitrage templates that under certain
conditions, a Mistral workflow should be executed. This gives the user the
power to decide, for example, that different corrective actions should be taken
based on the root cause of the problem (as identified by Vitrage).&lt;/p&gt;
&lt;p&gt;Note that this blueprint is based on the external-actions blueprint, that
handles the more general case.&lt;/p&gt;
&lt;section id="examples"&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_down_alarm_on_host&lt;/span&gt;
   &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_mistral&lt;/span&gt;
       &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;wf1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Discussed in the external-actions blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:
ifat-afek&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the Mistral notifier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the documentation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new action should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Add action list panel for entity click action</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/rocky/approved/add-action-list-panel.html</link><description>&lt;p&gt;This work is licensed under a Creative Commons Attribution 3.0 Unported
License.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="http://creativecommons.org/licenses/by/3.0/legalcode"&gt;http://creativecommons.org/licenses/by/3.0/legalcode&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="add-action-list-panel-for-entity-click-action"&gt;
 
&lt;p&gt;The URL of the launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/add-action-list-panel"&gt;https://blueprints.launchpad.net/vitrage/+spec/add-action-list-panel&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The Vitrage Dashboard’s Entity Graph provides users with visual convenience.
As a result, the cloud administrator or Vitrage users can easily identify the
different situations for each entity. However, the Entity Graph is now provided
for visual functionality and still has a small range of actions that can be
taken in context.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-changes"&gt;
&lt;h2&gt;Proposed changes&lt;/h2&gt;
&lt;p&gt;For each entity in the current entity graph, the user can see information about the
entity through a click action. We will add an action list panel that provides
multiple actions to the user through existing click actions. Users can click an
entity to see a list of available actions from the drop-down menu. The drop-down
menu is located at the bottom of the existing Info panel and configures the action
list based on a setting file. The user can select one of these action lists and enter
the specific parameters required to execute the action through the additional UI.&lt;/p&gt;
&lt;p&gt;Examples of actions that can be provided:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Execute Mistral : If the user selects Mistral, a drop-down menu that is included in
the new UI displays a list of workflows currently stored in Mistral. When the user
selects a workflow from the list, the user can enter various parameter values
(for example, Workflow_name, Workflow_input, params). Then ask them to run the
workflow from Mistral server to the API. The functional scope of
Mistral will be expanded in the future.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance Test : The user can perform tests by clicking entities such as Nova,
Neutron, and others displayed in the Entity Graph. Like Mistral, the user can view
a list of test scenarios in a new UI, enter various parameter values for testing,
and then request performance testing through the Openstack Rally API.
The range of performance support for this feature will be expanded in the future.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch web page of monitoring tool : The web of the monitoring tool monitoring
the VM or the physical node entity is displayed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open related UI for other projects : If the user requests an action from other project
through the action list panel, the results of the action request(e.g. Execute Workflow,
Performance Test) can be checked through the UI of other project. Therefore, this action
opens the UI related with the action in the other project(e.g. Workflow’s ‘Workflow
Executions’ panel from Mistral) in a new tab to see the results of the request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The overall workflow is as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-----------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Vitrage&lt;/span&gt; &lt;span class="n"&gt;Dashboard&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+------------------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Entity&lt;/span&gt; &lt;span class="n"&gt;Click&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;        &lt;span class="o"&gt;+-----------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+---------+--------+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;Other&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="s1"&gt;'s    |&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------------------+&lt;/span&gt;        &lt;span class="o"&gt;+-----------^-----------+&lt;/span&gt;
            &lt;span class="o"&gt;|&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;|&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-----------+&lt;/span&gt;        &lt;span class="o"&gt;+-----------+-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;Panel&lt;/span&gt;   &lt;span class="o"&gt;+--------&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;Parameter&lt;/span&gt; &lt;span class="n"&gt;UI&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------+-----------+&lt;/span&gt;        &lt;span class="o"&gt;+-----------------------+&lt;/span&gt;
            &lt;span class="o"&gt;|&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Other&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="s1"&gt;'s UI   |&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Users can click an entity to see a list of actions that can be
performed through the drop-down at the bottom of the Info panel.
The action list is composed of the settings file configured by the user.
This means that the list of actions depends on user’s environment.
Also, depending on the entity type, the action may be restricted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the user selects an action from the action list, a detailed action
list(e.g. Workflow list, Test scenario list) and a UI for inputting
parameters are displayed. The user can then select detailed actions and enter
parameters in the corresponding UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter all the parameters in the parameter UI and press the OK button to
request it from the other project.(e.g. Mistral, Rally)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The result of the user’s request can be viewed in a new tab with the
related project’s UI.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An example configuration file is shown below:&lt;/p&gt;
&lt;div class="highlight-ini notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;[ACTION_LIST]&lt;/span&gt;
&lt;span class="na"&gt;mistral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[Mistral Endpoint]&lt;/span&gt;
&lt;span class="na"&gt;rally&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[Rally Endpoint]&lt;/span&gt;
&lt;span class="na"&gt;monitor_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[Monitoring Tool URL]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If the user does not enter information for a specific action in the above mentioned
setting file, the action list will not include the corresponding action.
This determines whether the project is installed to request action.
Therefore, the action list is configured based on the setting file, so if
the user wants to receive the action, the user should input the information according
to the user’s environment.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;When the user clicks an entity in the entity graph, a panel is added to
display a list of actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Additional actions for the action list can be configured by the user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the user selects an action, the UI for entering the required parameter
values and selecting detailed actions(e.g. workflow list, test scenario)
appears.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;MinWookKim &amp;lt;&lt;a class="reference external" href="mailto:delightwook%40dcn.ssu.ac.kr"&gt;delightwook&lt;span&gt;@&lt;/span&gt;dcn&lt;span&gt;.&lt;/span&gt;ssu&lt;span&gt;.&lt;/span&gt;ac&lt;span&gt;.&lt;/span&gt;kr&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add a new panel for entity clicks in the entity graph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;See a list of actions that use the new panel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The action list can be selected and requested from an other project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure the settings file to organize the action list.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New UI. (action list UI, prameter UI)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request API through action list panel and check other project action.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Configuration for additional action list, usage for
adding actions should be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Mistral"&gt;https://wiki.openstack.org/wiki/Mistral&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/rally/latest/"&gt;https://docs.openstack.org/rally/latest/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 Jun 2018 00:00:00 </pubDate></item><item><title>Datasource Scaffold</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/rocky/implemented/datasource-scaffold.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/datasource-scaffold"&gt;https://blueprints.launchpad.net/vitrage/+spec/datasource-scaffold&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A command line tool to generate skeleton of new datasource. A skeleton contains
stubs of required classes and methods as described in the &lt;a class="reference external" href="http://docs.openstack.org/developer/vitrage/add-new-datasource.html"&gt;design specs&lt;/a&gt;,
without detail implementation. It aims to bootstrapping the development of new
datasource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="http://docs.openstack.org/developer/vitrage/add-new-datasource.html"&gt;design specs&lt;/a&gt; has given detail instructions on how to add a new data
source. However, there is much overhead to create it from scratch. Developers
used to copy from existing datasource as a start. It is sometimes out of date
and always contains many specific codes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create templates for the datasource skeleton with placeholders of names and
render the Python source file on demand.&lt;/p&gt;
&lt;p&gt;Example template in &lt;a class="reference external" href="http://jinja.pocoo.org"&gt;Jinja2&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;oslo_config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;vitrage.common.constants&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UpdateMethod&lt;/span&gt;

&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="n"&gt;_DATASOURCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'{{ name }}'&lt;/span&gt;

&lt;span class="c1"&gt;# define needed options&lt;/span&gt;
&lt;span class="n"&gt;OPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Transformer with the path to your transformer classes&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'transformer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'vitrage.datasources.{{ name }}_datasource.transformer.'&lt;/span&gt;
                       &lt;span class="s1"&gt;'{{ name|capitalize }}Transformer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{ name|capitalize }} transformer class path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Providing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;name=foo&lt;/span&gt;&lt;/code&gt;, it will generate the skeleton source file in Python:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;oslo_config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;vitrage.common.constants&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UpdateMethod&lt;/span&gt;

&lt;span class="n"&gt;FOO_DATASOURCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'foo'&lt;/span&gt;

&lt;span class="c1"&gt;# define needed options&lt;/span&gt;
&lt;span class="n"&gt;OPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Transformer with the path to your transformer classes&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'transformer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'vitrage.datasources.foo_datasource.transformer.'&lt;/span&gt;
                       &lt;span class="s1"&gt;'FooTransformer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Foo transformer class path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Create and maintain a sample datasource to allow user to modify as base. In this
way, developer is likely to miss some string replacement somewhere as we
experienced in the &lt;a class="reference external" href="https://review.openstack.org/#/c/396974"&gt;abandoned patch set&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yujunz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create datasource skeleton template
- driver
- transformer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create unit test skeleton template
- test driver
- test transformer
- mock configuration
- mock driver
- trace generator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Templates for datasource with different update methods&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes shall be covered by new unit test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;How to use the generator will be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Thu, 17 May 2018 00:00:00 </pubDate></item><item><title>Vitrage Alarm Counts API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/alarm-counts-api.html</link><description>
 
&lt;p&gt;Extend the Vitrage REST API to support a GET of the Active Alarm Counts, for
each alarm severity level, in Vitrage.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Provide REST API access to the Vitrage Active Alarm Counts in support of the
Horizon blueprint, “Vitrage Alarm Banner in Top Navbar”.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Support the following REST API to Vitrage for calculating and returning
the Active Alarm Counts for each alarm severity level:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;

&lt;span class="n"&gt;Headers&lt;/span&gt;
        &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Keystone&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;
        &lt;span class="n"&gt;Accept&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;Parameters&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;Parameters&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;Body&lt;/span&gt;
        &lt;span class="n"&gt;all_tenants&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;shows&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;
                      &lt;span class="n"&gt;summed&lt;/span&gt; &lt;span class="n"&gt;across&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt; &lt;span class="n"&gt;tenants&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
                      &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;Examples&lt;/span&gt;
        &lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;
        &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;135.248.19.18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8999&lt;/span&gt;
        &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b8882ba2ec44295bf300aecb2caa4f7&lt;/span&gt;
        &lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
        &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;

&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;Body&lt;/span&gt;
        &lt;span class="n"&gt;Returns&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;containing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
        &lt;span class="n"&gt;different&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt; &lt;span class="n"&gt;severities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;Examples&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"critical_alarm_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"major_alarm_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"minor_alarm_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"warning_alarm_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NOTE: The vitrage CLI and client will be updated for this new API.
e.g. “vitrage alarm count”&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;For performance reasons, maintain the Active Alarm Counts in Vitrage Entity
Graph, and just return these counts when the REST API command is received.&lt;/p&gt;
&lt;p&gt;Although decided against this due to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;keeping a counter, in addition to the graph, might be buggy (multi threading
issues etc.),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calculating the counter means traversing once all of the vertices in the graph,
get all alarms, and count. It shouldn’t be too expensive, it’s just like
‘get alarms’ api,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;since the result of this api is used for ui query (and not for notification or
corrective actions for example), the performance is not that critical.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Extending REST API with new GET /v1/alarm/count API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None … just extending API, no changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;Horizon will use this API to populate the counts in its new “Vitrage
Alarm Banner” in its Top Navbar; a proposed Horizon blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;gwaines&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement new REST API in Vitrage API:  GET /v1/alarm/count API,
to calculate and return the Vitrage Active Alarm Counts for each
alarm severity level,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update Vitrage client for new API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the new “vitrage alarm count” CLI command&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes shall be covered by new unit test and tempest test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Update to Vitrage API Documentation; i.e. the new API will be added under
&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/contributor/vitrage-api.rst"&gt;https://github.com/openstack/vitrage/blob/master/doc/source/contributor/vitrage-api.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 02 Feb 2018 00:00:00 </pubDate></item><item><title>Refactor execute-mistral action</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/refactor-execute-mistral.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/refactor-execute-mistral-definition"&gt;https://blueprints.launchpad.net/vitrage/+spec/refactor-execute-mistral-definition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The definition of the execute-mistral action should be changed, to better
support the integration of Vitrage and Mistral.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;With the current execute-mistral action definition, it is possible to pass
string values to the Mistral workflow, but not dynamic attributes like the id
or ip address of the instance that was matched in the template condition.
We should enhance the template language to support passing dynamic attributes
to Mistral.&lt;/p&gt;
&lt;p&gt;Another issue is that the structure of the action definition should be changed.
In the current structure, optional input parameters to the workflow appear on
the same level as the ‘workflow’ property, which is a mandatory part of the
action definition:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_mistral&lt;/span&gt;
    &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;evacuate_host&lt;/span&gt;
      &lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;10&lt;/span&gt;
      &lt;span class="nt"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Instead, we should gather all optional parameters (timeout and force) under
an ‘input’ section.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The first part of the change is to create a new ‘input’ section, under which
all input parameters of the workflow should be placed. A new versioning
mechanism should be introduced to Vitrage templates, to allow validating and
loading of both the old format and the new format. At the first stage both
formats will be supported, but in a version or two we should deprecate the old
format.&lt;/p&gt;
&lt;p&gt;The second part is to define a way to describe which attribute of a specific
entity should be passed to the workflow. The suggested solution is to use
a syntax that is similar to the HOT template.&lt;/p&gt;
&lt;p&gt;We will introduce a get_attr() function with the following parameters:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource&lt;/span&gt; &lt;span class="pre"&gt;template_id&lt;/span&gt;&lt;/code&gt;: the id of the resource inside the template. Note
that the resource must be part of the condition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;attribute&lt;/span&gt;&lt;/code&gt;: the name of the attribute to use. The attribute will be taken
from the resource vertex in the graph, if the condition is met.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_down_alarm_on_host&lt;/span&gt;
    &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_mistral&lt;/span&gt;
          &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;evacuate_host&lt;/span&gt;
            &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="nt"&gt;host_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_attr(host, "id")&lt;/span&gt;
              &lt;span class="nt"&gt;host_ip_addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;get_attr(host, "ip_address")&lt;/span&gt;
              &lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;10&lt;/span&gt;
              &lt;span class="nt"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One alternative is to replace the get_attr with a shorter syntax. In this case,
we will refer to an entity attribute by the entity template-id and the
attribute name. For example, host.ip_address will mark the ip_address
attribute of the instance.&lt;/p&gt;
&lt;p&gt;The example above will look like:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_mistral&lt;/span&gt;
    &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;evacuate_host&lt;/span&gt;
      &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;host_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host.id&lt;/span&gt;
        &lt;span class="nt"&gt;host_ip_addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host.ip_address&lt;/span&gt;
        &lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;10&lt;/span&gt;
        &lt;span class="nt"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This looks much nicer, but has two main disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It is not clear, just by looking at the template, that this is a reference to
an attribute. What if the user wants to pass a string which is “host.id”?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is less generic. On the other hand, if we add get_attr as a function
syntax, we will be able to add other functions in the future with a similar
syntax.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;The suggested change is not backward-compatible with Pike. Vitrage templates
should be enhanced to support versioning, and both the old version and the new
one should be supported for now.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support versioning in Vitrage templates. Allow per-version validators and
loaders for specific actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move optional input parameters under ‘input’ section&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support get_attr&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The changes in the action definition should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/vitrage/latest/contributor/vitrage-template-format.html"&gt;Vitrage template format:&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 24 Jan 2018 00:00:00 </pubDate></item><item><title>Add CRUD support for template addition</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/template-CRUD.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/crud-templates"&gt;https://blueprints.launchpad.net/vitrage/+spec/crud-templates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adding CRUD support means that templates can be added/removed in real time when Vitrage is up.&lt;/p&gt;
&lt;p&gt;Templates added/removed via API will be stored in the database so they remain after restarting Vitrage.
sqlalchemy will be used for DB management.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Vitrage templates are loaded from a specific folder during Vitrage startup.
Adding/removing templates while Vitrage services are running requires restart of the vitrage-graph service.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Templates should be stored in the database instead of specific folder in file system,
In that way they can be modified (add/delete) while vitrage is up.&lt;/p&gt;
&lt;p&gt;The evaluator will preform a live update to the entity graph according to actions specified in the added/removed templates.&lt;/p&gt;
&lt;p&gt;Template add:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Validate template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store template in database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notify evaluator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entity graph evaluation with new actions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Delete:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Delete template from database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notify evaluator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entity graph evaluation to undo templates actions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Update - not supported at this stage.
In order to update template use add and delete template.&lt;/p&gt;
&lt;p&gt;A few changes should be made in order to implement CRUD support&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support template Add/Remove commands in vitrageclient (Vitrage API)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API handler: Store/Delete Templates to and from the Database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Graph cloning logic should be extracted to base class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new DB table called templates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Template DB Table:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+----------------+--------------+------+-----+---------+-------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Extra&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+----------------+--------------+------+-----+---------+-------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;PRI&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;status_details&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;file_content&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+----------------+--------------+------+-----+---------+-------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;A new database table.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;PUT and DELETE methods will be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;New CLI commands added:&lt;/p&gt;
&lt;p&gt;Vitrage template add&lt;/p&gt;
&lt;p&gt;Vitrage template delete&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ikinory&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;API support for add/remove template&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement database table via SQLAlchemy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement queries to database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests as explained in “Testing”.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;API:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;template add:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;add all types of templates : standard, equivalence, definition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add corrupted template and check for failed to add.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add a folder of templates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;template delete:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;check all types of templates : standard, equivalence, definition.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;template list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;template show:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;compare cli template content to original file content&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;e2e:&lt;/dt&gt;&lt;dd&gt;&lt;dl&gt;
&lt;dt&gt;evaluate the added/ deleted templates on the entire graph.&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;test evaluator reload templates:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;example:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;1.raise trigger alarm (template is not loaded yet).&lt;/p&gt;
&lt;p&gt;2.add the relevant template.&lt;/p&gt;
&lt;p&gt;3.check action is executed.&lt;/p&gt;
&lt;p&gt;This checks that the evaluators are reloaded and run on all existing vertices.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Template add and delete should be added. Modify template validate and list.&lt;/p&gt;
&lt;p&gt;Changes should be added to:&lt;/p&gt;
&lt;p&gt;API description: vitrage/doc/source/contributor/vitrage-api.rst&lt;/p&gt;
&lt;p&gt;CLI description: doc/source/contributor/cli.rst&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 24 Jan 2018 00:00:00 </pubDate></item><item><title>Snmp Parsing Service</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/snmp-parsing-service.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/snmp-support"&gt;https://blueprints.launchpad.net/vitrage/+spec/snmp-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the implementation of SNMP parsing service for transforming SNMP alarm
messages to alarm details and distributing them to corresponding datasource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The following use case should be supported:&lt;/p&gt;
&lt;p&gt;Vitrage datasources module provides the ability to handle alarms from part of monitored systems,
but currently there is no system that reports alarms by SNMP communication.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A SNMP service module is presented here, which provides service to parse alarms reported from SNMP
managed system and sends them to the OpenStack message bus, for further processing by the datasources.&lt;/p&gt;
&lt;p&gt;Since snmp service is a common service for alarm datasource, the service powers on just after api,
graph and notifier service. After successfully powered on, SNMP parsing service can receive and
decode alarm messages. Decoded alarm details are made up of alarm/object info and corresponding value,
e.g. alarm_code. The SNMP parsing service parses alarm datasource info according to corresponding
OID, then constructs message after marking datasource information and distributes messages to the
RabbitMQ queue. According to the values of OID, the alarm datasource can extract information by decoded
alarm details.&lt;/p&gt;
&lt;p&gt;The configuration for snmp service:
[snmp_parsing]&lt;/p&gt;
&lt;p&gt;# snmp listening port (integer value)
snmp_listening_port = xxx&lt;/p&gt;
&lt;p&gt;# traps oid mapping yaml file path(string value)
#oid_mapping = /etc/vitrage/snmp_parsing_conf.yaml&lt;/p&gt;
&lt;p&gt;An example of config for snmp_parsing_conf.yaml:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;oid: 1.3.6.1.4.1.3902.4101.1.3.1.12  # for example
system: iaas_platform  # for example
datasource: new_datasource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oid: xxxx
system: xxx
datasource: xxx&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;The snmp parsing service does not support lost notifications at the moment. If one
needs the solution in the future, the service should be enhanced.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;xupeipei&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add a new SNMP parsing service&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new SNMP configuration should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 23 Jan 2018 00:00:00 </pubDate></item><item><title>Webhooks</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/webhooks.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/configurable-notifications"&gt;https://blueprints.launchpad.net/vitrage/+spec/configurable-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Evaluator performs root cause analysis on the Vitrage Graph and may
determine that an alarm should be created, deleted or otherwise updated.
Other components are notified of such changes by the Vitrage Notifier service.
Among others, Vitrage Notifier is responsible for sending http post
notifications on Vitrage deduced alarms.&lt;/p&gt;
&lt;p&gt;This blueprint describes the implementation of Vitrage Notifier for
webhooks on Vitrage alarms and state changes.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage should support webhooks for notfications, which are sent on raised
alarms, deactivated alarms, state changes, RCA or other to any
registered targets.
Furthermore any registered recipient should supply a regex to filter the alarms
sent to that recipient.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Needed definitions in Vitrage config file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DEFAULT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;notifiers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webhook&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vitrage listener will get the alarm events from the message bus and the webhook
notifier will send http post notifications on raised deduced alarms and deleted deduced alarms.&lt;/p&gt;
&lt;p&gt;The filtered notifications will be sent to the destinations that are written in
the database, as configured via API requests.&lt;/p&gt;
&lt;p&gt;The notifications will be sent only on alarms which meet the regex filter specified in the
webhook specification.&lt;/p&gt;
&lt;p&gt;The format of sent notifications will be hard coded.&lt;/p&gt;
&lt;p&gt;As Vitrage notifiers are pluggable, you can write your own notifier and use it.
Specifically in this case, you can inherit the webhook base class and implement your own webhook notifier.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;New DB table, to represent registration details
Preliminary columns :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Date&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Headers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filter&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;An API which supports adding, removing and listing webhooks&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;To use webhooks one needs to define it in the Vitrage config file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;Future support for webhooks in Horizon&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nivo&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add DB table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement notifier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update docs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires tempest tests and unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The usage of webhooks will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Example on http post notifications in AODH
&lt;a class="reference external" href="https://github.com/openstack/aodh/blob/master/aodh/notifier/rest.py#L60-L109"&gt;http post request&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 03 Jan 2018 00:00:00 </pubDate></item><item><title>DB Support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/db-support.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/db-support"&gt;https://blueprints.launchpad.net/vitrage/+spec/db-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is a need in Vitrage for persistent DB. The main reasons are history and
high availability, but there are additional uses for persistent DB, such as
saving the registered rest notifications recipients, and improving performance
using DB capabilities.
We will use sqlalchemy for DB management, same as Nova, Heat, Aodh and other
projects.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage should support persistent db management.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The development will happen in a few stages. To enable faster development
of Vitrage History / HA / Vitrage notifications, in the first stage only basic
sqlalchemy support will be developed.&lt;/p&gt;
&lt;p&gt;Note : A good example of sqlalchemy implementation can be found in :&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/aodh/blob/master/aodh/storage/impl_sqlalchemy.py"&gt;https://github.com/openstack/aodh/blob/master/aodh/storage/impl_sqlalchemy.py&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Basic configuration in vitrage.conf :&lt;/p&gt;
&lt;p&gt;# The SQLAlchemy connection string to use to connect to the database.&lt;/p&gt;
&lt;p&gt;# Example:&lt;/p&gt;
&lt;p&gt;# connection = mysql://root:pass@127.0.0.1:8999/vitrage&lt;/p&gt;
&lt;p&gt;#connection = &amp;lt;None&amp;gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# The SQL mode to be used for MySQL sessions. This option, including the&lt;/p&gt;
&lt;p&gt;# default, overrides any server-set SQL mode. To use whatever SQL mode is set&lt;/p&gt;
&lt;p&gt;# by the server configuration, set this to no value. Example: mysql_sql_mode=&lt;/p&gt;
&lt;p&gt;# (string value)&lt;/p&gt;
&lt;p&gt;# Additonal modes and their functionality :&lt;/p&gt;
&lt;p&gt;# &lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-combo"&gt;https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-combo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;#mysql_sql_mode = TRADITIONAL&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Timeout before idle SQL connections are reaped. (integer value)&lt;/p&gt;
&lt;p&gt;#idle_timeout = 3600&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Minimum number of SQL connections to keep open in a pool. (integer value)&lt;/p&gt;
&lt;p&gt;#min_pool_size = 1&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Maximum number of SQL connections to keep open in a pool. Setting a value of&lt;/p&gt;
&lt;p&gt;# 0 indicates no limit. (integer value)&lt;/p&gt;
&lt;p&gt;#max_pool_size = 5&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Maximum number of database connection retries during startup. Set to -1 to&lt;/p&gt;
&lt;p&gt;# specify an infinite retry count. (integer value)&lt;/p&gt;
&lt;p&gt;#max_retries = 10&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Interval between retries of opening a SQL connection. (integer value)&lt;/p&gt;
&lt;p&gt;#retry_interval = 10&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# If set, use this value for max_overflow with SQLAlchemy. (integer value)&lt;/p&gt;
&lt;p&gt;#max_overflow = 50&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Verbosity of SQL debugging information: 0=None, 100=Everything. (integer&lt;/p&gt;
&lt;p&gt;# value)&lt;/p&gt;
&lt;p&gt;# Minimum value: 0&lt;/p&gt;
&lt;p&gt;# Maximum value: 100&lt;/p&gt;
&lt;p&gt;#connection_debug = 0&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Add Python stack traces to SQL as comment strings. (boolean value)&lt;/p&gt;
&lt;p&gt;#connection_trace = false&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# If set, use this value for pool_timeout with SQLAlchemy. (integer value)&lt;/p&gt;
&lt;p&gt;#pool_timeout = &amp;lt;None&amp;gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Enable the experimental use of database reconnect on connection lost.&lt;/p&gt;
&lt;p&gt;# (boolean value)&lt;/p&gt;
&lt;p&gt;#use_db_reconnect = false&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Seconds between retries of a database transaction. (integer value)&lt;/p&gt;
&lt;p&gt;#db_retry_interval = 1&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# If True, increases the interval between retries of a database operation up to&lt;/p&gt;
&lt;p&gt;# db_max_retry_interval. (boolean value)&lt;/p&gt;
&lt;p&gt;#db_inc_retry_interval = true&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# If db_inc_retry_interval is set, the maximum seconds between retries of a&lt;/p&gt;
&lt;p&gt;# database operation. (integer value)&lt;/p&gt;
&lt;p&gt;#db_max_retry_interval = 10&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;# Maximum retries in case of connection error or deadlock error before error is&lt;/p&gt;
&lt;p&gt;# raised. Set to -1 to specify an infinite retry count. (integer value)&lt;/p&gt;
&lt;p&gt;#db_max_retries = 20&lt;/p&gt;
&lt;section id="step-1"&gt;
&lt;h3&gt;Step 1&lt;/h3&gt;
&lt;p&gt;Build a basic sqlalchemy implementation for connecting to the DB,
Create a Vitrage schema in the db and required tables (from Vitrage history
spec and Vitrage httppost registration spec). Each developer should add
and test his own tables to the schema.&lt;/p&gt;
&lt;p&gt;The schema and tables should be created dynamically from Vitrage, each time
Vitrage loads. Vitrage will test existence of the database tables and if they
do not exist, create them, using a “model” data representation.
Testing validity of existing tables or even fixing them is not required in the
first stage.&lt;/p&gt;
&lt;p&gt;Cinder Data Model example :
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/db/sqlalchemy/models.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/db/sqlalchemy/models.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Create DAO that will perform hard coded CRUD on the tables.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="step-2"&gt;
&lt;h3&gt;Step 2&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Upgrade / versioning with alembic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generic sql support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pagination for big queries, such as all of the entity graph or events table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;p&gt;Not today.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h2&gt;Data model impact&lt;/h2&gt;
&lt;p&gt;This whole design is one big Data Model impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h2&gt;REST API impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h2&gt;Security impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h2&gt;Pipeline impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h2&gt;Other end user impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h2&gt;Performance/Scalability Impacts&lt;/h2&gt;
&lt;p&gt;Proper Indexes should be applied, and, according to performance testing
during development, multiply table data to smaller indexed tables for better data
polling performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h2&gt;Other deployer impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h2&gt;Developer impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;/section&gt;
&lt;section id="assignee-s"&gt;
&lt;h2&gt;Assignee(s)&lt;/h2&gt;
&lt;p&gt;Primary assignees:
danoffek.
alexey_weyl.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h2&gt;Work Items&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a basic SQLAlchemy implementation to connect to the DB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Data Model for events and other tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create simple CRUD methods for event storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRUD templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests as explained in “Testing”.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;See “Step 2”&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Data selection queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Table create with indexes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(should not run in the gate or regularly) Performance tests on large table data with
multiple inserts per seconds over a period of an hour.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tempest tests: Each developer should create his own DB tempest tests.
Example: Create alarms / resources events, and poll the system afterwards. In case the data
wasn’t stored in the events table properly, errors should be issued.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The DB configuration should be documented in an .rst file, and there should be a
link to it from
&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/installation-and-configuration.rst"&gt;https://github.com/openstack/vitrage/blob/master/doc/source/installation-and-configuration.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Nov 2017 00:00:00 </pubDate></item><item><title>Event Persistor</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/event-persistor.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/event-persistor"&gt;https://blueprints.launchpad.net/vitrage/+spec/event-persistor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The presistor service listens to the RabbitMQ2 (on a different topic) and
asynchronously writes the events to a relational database. All events are
stored after the filter/enrich phase.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In order to support some of the main future use cases of Vitrage, including full
HA support, alarm history and RCA history, we will need to store the events
that arrive from the collector in a persistent database.
Explained in &lt;a class="reference external" href="https://docs.openstack.org/vitrage/latest/contributor/vitrage-ha-and-history-vision.html"&gt;Vitrage HA and History Vision&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Example of a use case for the stored data:
Reconstructing the graph from the historic data that controlled by the processor,
and will be used in two cases:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Upon failure, in order to initiate the standby vitrage-graph process&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For RCA history&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add &lt;a class="reference external" href="arelationaldatabasetabletostorethefiltered/enrichedevents."&gt;event&lt;/a&gt; table in Vitrage database.
Both Datasource driver and Service listener (collector) passes the filtered/enriched
events to the persistor via &lt;a class="reference external" href="newtopicinrabbitMQ2forthePersistor."&gt;vitrage_persistor&lt;/a&gt; topic.
Add a Persistor service which listens to &lt;a class="reference external" href="newtopicinrabbitMQ2forthePersistor."&gt;vitrage_persistor&lt;/a&gt; topic and writes the
events to &lt;a class="reference external" href="arelationaldatabasetabletostorethefiltered/enrichedevents."&gt;event&lt;/a&gt; table.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;The table will have the following fields:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 19%"/&gt;
&lt;col style="width: 48%"/&gt;
&lt;col style="width: 33%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;INTEGER, Auto-Increment&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;19588&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;collector_timestamp&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The time the event filtered/enriched in the driver&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2017-10-09 09:19:50&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;payload&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The enriched event sent from the collector&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;JSON representation of the event&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;7mode3294&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new topic &lt;a class="reference external" href="newtopicinrabbitMQ2forthePersistor."&gt;vitrage_persistor&lt;/a&gt; in rabbitMQ2 for the Persistor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;a class="reference external" href="arelationaldatabasetabletostorethefiltered/enrichedevents."&gt;event&lt;/a&gt; table in Vitrage database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Both Datasource driver and Service listener (collector) passes the filtered/enriched
events to the persistor via &lt;a class="reference external" href="newtopicinrabbitMQ2forthePersistor."&gt;vitrage_persistor&lt;/a&gt; topic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a Persistor service which listens to &lt;a class="reference external" href="newtopicinrabbitMQ2forthePersistor."&gt;vitrage_persistor&lt;/a&gt; topic and writes the
events to &lt;a class="reference external" href="arelationaldatabasetabletostorethefiltered/enrichedevents."&gt;event&lt;/a&gt; table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by additional unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/vitrage/latest/contributor/vitrage-ha-and-history-vision.html"&gt;https://docs.openstack.org/vitrage/latest/contributor/vitrage-ha-and-history-vision.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Nov 2017 00:00:00 </pubDate></item><item><title>Parallel evaluation of Vitrage templates</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/parallel-evaluation.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/parallel-evaluation"&gt;https://blueprints.launchpad.net/vitrage/+spec/parallel-evaluation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently Vitrage sequentially processes and evaluates incoming events.
While it is a necessity to run sequential processing, template evaluation
for a single event is independent and can be paralleled.
The challenge is NetworkX in-memory graph held by a single process, thus
preventing parallelism, this can be addressed by creating evaluator worker
processes that maintain clones of the graph.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Each and every graph change triggers evaluation of all relevant template
conditions, thus run time of event processing is dependent upon the number
of loaded templates.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Processor receives an event, from either the datasource or evaluator queue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processor updates the graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluator is triggered to run relevant templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluation may result in an event writen to the evaluator queue&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The above flow runs on in memory NetworkX graph in a single thread&lt;/p&gt;
&lt;figure class="align-center"&gt;
&lt;a class="reference internal image-reference" href="../../../_images/parallel_current.jpg"&gt;&lt;img alt="Problem description" src="../../../_images/parallel_current.jpg" style="width: 100%;"/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;One or more EvaluatorWorker processes will be added to vitrage-graph service.
These processes keep their own graph instance. A new component
EvaluatorManager manages the communication with the EvaluatorWorkers.
Per each graph change resulted in the processor, it will request the
EvaluatorManager to inform all the EvaluatorWorkers, so in effect these hold
an identical graph clone.
Each EvaluatorWorker runs a portion of the templates, writing its results to
evaluator queue.&lt;/p&gt;
&lt;p&gt;The flow will be as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Processor receives an event, from either the datasource or evaluator queue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processor updates the graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EvaluatorManager is triggered, sending the event to the N EvaluatorWorkers,
via N multiprocessing queues, then waits for their ack signal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each EvaluatorWorker updates it’s own graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In each EvaluatorWorker the evaluator is triggered to run a portion of the
templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluation may result in an event writen to the evaluator queue&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;figure class="align-center"&gt;
&lt;a class="reference internal image-reference" href="../../../_images/parallel_future.jpg"&gt;&lt;img alt="Proposed change" src="../../../_images/parallel_future.jpg" style="width: 100%;"/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Each EvaluatorWorker holds a clone of the in memory Entity Graph, hence memory
consumption will increase as the configured number of workers increases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idan-hefetz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;processor should not hold a ScenarioEvaluator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create EvaluatorManager&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create EvaluatorWorker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change main in graph.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change GraphService to handle these changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose the best way to assign tasks to workers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by additional unit test&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Nov 2017 00:00:00 </pubDate></item><item><title>Add Nova reset-state notifier</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/support_mark_down_action_for_instances.html</link><description>
 
&lt;p&gt;Include the URL of your launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/add-nova-reset-state-notifier"&gt;https://blueprints.launchpad.net/vitrage/+spec/add-nova-reset-state-notifier&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When a host is marked as down, all the servers which are launched at the host
should be with error status. Nova notifier will be extended to reset server
state.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As Vitrage works as the OPNFV Doctor Inspector component, when Vitrage
receives alarm notifications from the Doctor monitor, it should map the
physical resources to virtual resources and set their states appropriately.
For the host down scenario, currently Vitrage only support to mark host down,
the states of the servers which are launched at the host are still ‘Ok’ in
Nova. And also in a real scenario, notifying Nova would help the user to get
a clear picture of the state of its instances. So Nova notifier should be
extended to call ‘reset-state’ API to reset server state.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Reuse ‘mark_down’ action type and set ‘instance’ as ‘action_target’ in Vitrage
template which will call Nova api: ‘reset-state’ to set instance state.&lt;/p&gt;
&lt;section id="doctor-example"&gt;
&lt;h3&gt;Doctor Example&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_down_alarm_on_host and host_contains_instance and alarm_on_instance&lt;/span&gt;
   &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;mark_down&lt;/span&gt;
       &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;instance&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;To use the Nova notifier, there is a need to define it in the Vitrage config
file, and in addition use the ‘mark_down’ action for instances in Vitrage
template.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dong wenjuan &amp;lt;&lt;a class="reference external" href="mailto:dong.wenjuan%40zte.com.cn"&gt;dong&lt;span&gt;.&lt;/span&gt;wenjuan&lt;span&gt;@&lt;/span&gt;zte&lt;span&gt;.&lt;/span&gt;com&lt;span&gt;.&lt;/span&gt;cn&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the ‘mark_down’ action for instances and tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the host_down_scenario template for calling Nova reset-state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and tempest tests need to be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The usage of the ‘mark_down’ action for instances will be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/opnfv/doctor/blob/master/docs/development/design/inspector-design-guideline.rst"&gt;Doctor inspector design guideline&lt;/a&gt;
&lt;a class="reference external" href="https://specs.openstack.org/openstack/vitrage-specs/specs/pike/external-actions.html"&gt;Support external actions in Vitrage templates&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Nov 2017 00:00:00 </pubDate></item><item><title>Include template definitions from an external file</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/implemented/template-include.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/definition-templates"&gt;https://blueprints.launchpad.net/vitrage/+spec/definition-templates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Define special template files that contain only definitions
(entities / relationships and not scenarios), that can then be included within
other template files and used there to create new scenarios.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A lot of templates were redefining the same entities and relationships for use
in their scenarios.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new file (or a set of files) into a “def_templates” directory. These
files are the same as templates but do not contain scenarios or an “include”
section (only definitions):&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host_defs&lt;/span&gt;
 &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;basic def_template example&lt;/span&gt;
&lt;span class="nt"&gt;definitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
     &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nagios&lt;/span&gt;
     &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
     &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;RESOURCE&lt;/span&gt;
     &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.host&lt;/span&gt;
     &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;resource&lt;/span&gt;
 &lt;span class="nt"&gt;relationships&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm&lt;/span&gt;
     &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;resource&lt;/span&gt;
     &lt;span class="nt"&gt;relationship_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;on&lt;/span&gt;
     &lt;span class="nt"&gt;template_id &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add an “include” section within templates, which states the name that should be
included at it appears in the metadata of the definition template. Multiple
definition templates can be added:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host_scenario&lt;/span&gt;
 &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;basic template with an include section example&lt;/span&gt;
&lt;span class="nt"&gt;definitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
 &lt;span class="nt"&gt;relationships&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;span class="nt"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host_defs&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;span class="nt"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;alarm_on_host&lt;/span&gt;
    &lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;set_state&lt;/span&gt;
        &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;SUBOPTIMAL&lt;/span&gt;
        &lt;span class="nt"&gt;action_target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;resource11&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.
Should be addressed in a future template CRUD implementation&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None - Old template formats will still be supported. Introduces an alternative
version.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;Template UI should be changed to show definition template files.&lt;/p&gt;
&lt;section id="topology-view"&gt;
&lt;h4&gt;Topology view&lt;/h4&gt;
&lt;p&gt;No impact&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rca-view"&gt;
&lt;h4&gt;RCA view&lt;/h4&gt;
&lt;p&gt;No impact&lt;/p&gt;
&lt;/section&gt;
&lt;section id="entity-graph"&gt;
&lt;h4&gt;Entity graph&lt;/h4&gt;
&lt;p&gt;No impact&lt;/p&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h4&gt;Summary&lt;/h4&gt;
&lt;p&gt;No impacts&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nivolas&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;In scope:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Loading definition templates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validating definition templates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following items are not in scope:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Definition templates with scenarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recursive includes (a definition template can not include other definition
templates).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by additional unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation on how to define definition template files and when to use them&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Nov 2017 00:00:00 </pubDate></item><item><title>Proactive RCA fault model</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/queens/approved/proactive-rca.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/proactive-rca"&gt;https://blueprints.launchpad.net/vitrage/+spec/proactive-rca&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint proposes a solution for proactive RCA. It aims to be an
umbrella for all related blueprints.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Vitrage relies on the monitored events for root cause analysis. It
may deduce alarms on virtual resources, but it is always in a confirmed state.
But in the real world, things could be more complicated. Suppose there are two
possible causes (A or B) for fault C. When fault C is monitored, it is
suspicious that A or B could happen and be the root cause. We need a way to
take action in such case to find the root cause more proactively.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A fault model with deductive reasoning is proposed here to resolve the problem above.&lt;/p&gt;
&lt;section id="fault-model"&gt;
&lt;h3&gt;Fault model&lt;/h3&gt;
&lt;p&gt;Given the template defined for the fault model above.&lt;/p&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-e7b793ed50592b302dc5fe4b7b5addb40df42bb7.png" alt="digraph G {     // styles     style=&amp;quot;filled&amp;quot;;     color=&amp;quot;lightgrey&amp;quot;;      A -&amp;gt; C [label=&amp;quot;causes&amp;quot;];     B -&amp;gt; C [label=&amp;quot;causes&amp;quot;]; }" class="graphviz"/&gt;&lt;/div&gt;
&lt;p&gt;The underlying entity graph could be breakdown as&lt;/p&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-61189d2fa4b56762e9a1c60498d882f1c9235254.png" alt="digraph G {     // styles      node [style=&amp;quot;filled&amp;quot;, color=&amp;quot;lightgrey&amp;quot;]      // equivalences      subgraph cluster_2 {         label=&amp;quot;Fault A&amp;quot;;         a_m -&amp;gt; a_v [label=&amp;quot;eq&amp;quot;][dir=&amp;quot;both&amp;quot;];     }      subgraph cluster_3 {         label=&amp;quot;Fault B&amp;quot;;         b_m -&amp;gt; b_v [label=&amp;quot;eq&amp;quot;][dir=&amp;quot;both&amp;quot;];     }      subgraph cluster_4 {         c_m -&amp;gt; c_v [label=&amp;quot;eq&amp;quot;][dir=&amp;quot;both&amp;quot;];         label=&amp;quot;Fault C&amp;quot;;     }      // expanded RCA rule      a_m -&amp;gt; c_m [label=&amp;quot;causes&amp;quot;];     a_v -&amp;gt; c_m [label=&amp;quot;causes&amp;quot;];     a_m -&amp;gt; c_v [label=&amp;quot;causes&amp;quot;];     a_v -&amp;gt; c_v [label=&amp;quot;causes&amp;quot;];     b_m -&amp;gt; c_m [label=&amp;quot;causes&amp;quot;];     b_v -&amp;gt; c_m [label=&amp;quot;causes&amp;quot;];     b_m -&amp;gt; c_v [label=&amp;quot;causes&amp;quot;];     b_v -&amp;gt; c_v [label=&amp;quot;causes&amp;quot;]; }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="deductive-reasoning"&gt;
&lt;h3&gt;Deductive reasoning&lt;/h3&gt;
&lt;p&gt;Suppose we received a series of events in the following order:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;t0: initial status, no faults&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;t1: fault C active monitored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;t2: fault A active and fault B inactive is reported from diagnose action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;t3: fault C inactive monitored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;t4: fault A inactive returned from diagnostic action&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let’s illustrate the deductive reasoning in graphs with following legend.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cluster: aggregate fault&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nodes: raw fault&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;edges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;dashed: the target state is deduced from source state by Vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dotted: the target state is updated by diagnose action triggered by source state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;border:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;dashed: suspect&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;colors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;lightgrey: fault in undefined state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;red: fault in confirmed state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;labels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Fault&lt;/span&gt; &lt;span class="pre"&gt;A&lt;/span&gt;&lt;/code&gt;: aggregated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a_v&lt;/span&gt;&lt;/code&gt;: deduced by Vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a_m&lt;/span&gt;&lt;/code&gt;: monitored&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="t0-initial-status"&gt;
&lt;h4&gt;t0: initial status&lt;/h4&gt;
&lt;p&gt;All faults undefined, no reasoning&lt;/p&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-62e35ec87dac9522ae6c9c653cd014ee8d0b8f0e.png" alt="digraph G {     node [style=&amp;quot;filled&amp;quot;, color=&amp;quot;lightgrey&amp;quot;]      // fixed layout with cluster and invisible edges     subgraph cluster_1 {label=&amp;quot;Fault A&amp;quot; a_m a_v}     subgraph cluster_2 {label=&amp;quot;Fault B&amp;quot; b_m b_v}     subgraph cluster_4 {label=&amp;quot;Fault C&amp;quot; c_m c_v}     a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     b_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     c_v -&amp;gt; c_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;] }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="t1-downstream-fault-monitored-upstream-fault-deduced"&gt;
&lt;h4&gt;t1: downstream fault monitored, upstream fault deduced&lt;/h4&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Vitrage deduces that fault A and fault B are active in suspect state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;execute diagnose action to confirm suspect state&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-01daada0c836f8caeb47fedac6e605e6501e646e.png" alt="digraph G {     node [style=&amp;quot;filled&amp;quot; color=&amp;quot;lightgrey&amp;quot;]      // fixed layout with cluster and invisible edges     subgraph cluster_1 {label=&amp;quot;Fault A&amp;quot; color=&amp;quot;red&amp;quot; graph[style=&amp;quot;dashed&amp;quot;] a_m a_v}     subgraph cluster_2 {label=&amp;quot;Fault B&amp;quot; color=&amp;quot;red&amp;quot; graph[style=&amp;quot;dashed&amp;quot;] b_m b_v}     subgraph cluster_4 {label=&amp;quot;Fault C&amp;quot; color=&amp;quot;red&amp;quot; c_m c_v}     a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     b_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     c_v -&amp;gt; c_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]      // downstream fault monitored     c_m [color=&amp;quot;red&amp;quot;];      // upstream fault deduced, in suspect state     c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;dashed&amp;quot;];     a_v [color=&amp;quot;red&amp;quot; style=&amp;quot;dashed&amp;quot;]      // upstream fault deduced, in suspect state     c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;dashed&amp;quot;];     b_v [color=&amp;quot;red&amp;quot; style=&amp;quot;dashed&amp;quot;] }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="t2-diagnose-action-executed-upstream-fault-confirmed"&gt;
&lt;h4&gt;t2: diagnose action executed, upstream fault confirmed&lt;/h4&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;monitored states updated by diagnose action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;as a side-effect, Vitrage will deduce that fault C is active in parallel of monitored fault C&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-1d6cdd78c38ee34a2cc1515379c1ae6c7c6516e8.png" alt="digraph G {     node [style=&amp;quot;filled&amp;quot;, color=&amp;quot;lightgrey&amp;quot;]      // fixed layout with cluster and invisible edges     subgraph cluster_1 {label=&amp;quot;Fault A&amp;quot; color=&amp;quot;red&amp;quot; a_m a_v}     subgraph cluster_2 {label=&amp;quot;Fault B&amp;quot; color=&amp;quot;green&amp;quot; b_m b_v}     subgraph cluster_4 {label=&amp;quot;Fault C&amp;quot; color=&amp;quot;red&amp;quot; c_m c_v}     //a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     b_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     //b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     c_v -&amp;gt; c_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]      // old status     c_m [color=&amp;quot;red&amp;quot;];     a_v [color=&amp;quot;red&amp;quot; style=&amp;quot;dashed&amp;quot;]     b_v [color=&amp;quot;red&amp;quot; style=&amp;quot;dashed&amp;quot;]      // diagnose action executed     a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot;, style=&amp;quot;dotted&amp;quot;]     b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot;, style=&amp;quot;dotted&amp;quot;]      // upstream fault confirmed     a_m [color=&amp;quot;red&amp;quot;]     b_m [color=&amp;quot;green&amp;quot;]      // downstream fault deduced as a side effect     a_m -&amp;gt; c_v [label=&amp;quot;deduce&amp;quot;, style=&amp;quot;dashed&amp;quot;]     c_v [color=&amp;quot;red&amp;quot;] }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="t3-downstream-recovery-monitored-upstream-recovery-deduced"&gt;
&lt;h4&gt;t3: downstream recovery monitored, upstream recovery deduced&lt;/h4&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;from the fault model, we can deduce fault A and fault B are inactive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;execute diagnose action to resolve status inconsistency between fault A deduced (inactive) and monitored (active)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-f85f08faac852848539a57ca9efa94df104417fe.png" alt="digraph G {     node [style=&amp;quot;filled&amp;quot;, color=&amp;quot;lightgrey&amp;quot;]      // fixed layout with cluster and invisible edges     subgraph cluster_1 {label=&amp;quot;Fault A&amp;quot; color=&amp;quot;green&amp;quot; graph[style=&amp;quot;dashed&amp;quot;] a_m a_v}     subgraph cluster_2 {label=&amp;quot;Fault B&amp;quot; color=&amp;quot;green&amp;quot; b_m b_v}     subgraph cluster_4 {label=&amp;quot;Fault C&amp;quot; color=&amp;quot;green&amp;quot; c_m c_v}     a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     b_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     c_v -&amp;gt; c_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]      // old status     a_m [color=&amp;quot;red&amp;quot;]     b_m [color=&amp;quot;green&amp;quot;]     c_v [color=&amp;quot;red&amp;quot;]      // downstream recovery monitored     c_m [color=&amp;quot;green&amp;quot;]      // upstream recovery deduced     c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;dashed&amp;quot;]     a_v [color=&amp;quot;green&amp;quot;]      // upstream recovery deduced     c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;dashed&amp;quot;]     b_v [color=&amp;quot;green&amp;quot;] }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="t4-upstream-recovery-confirmed"&gt;
&lt;h4&gt;t4: upstream recovery confirmed&lt;/h4&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../../_images/graphviz-eee29a26453014a295d2f0ac757bfc16301d4122.png" alt="digraph G {     node [style=&amp;quot;filled&amp;quot;, color=&amp;quot;lightgrey&amp;quot;]      // fixed layout with cluster and invisible edges     subgraph cluster_1 {label=&amp;quot;Fault A&amp;quot; color=&amp;quot;green&amp;quot; a_m a_v}     subgraph cluster_2 {label=&amp;quot;Fault B&amp;quot; color=&amp;quot;green&amp;quot; b_m b_v}     subgraph cluster_4 {label=&amp;quot;Fault C&amp;quot; color=&amp;quot;green&amp;quot; c_m c_v}     //a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     b_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; a_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     c_m -&amp;gt; b_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;invis&amp;quot;]     //a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     b_v -&amp;gt; b_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]     c_v -&amp;gt; c_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;invis&amp;quot;]      // old status     a_v [color=&amp;quot;green&amp;quot;]     b_v [color=&amp;quot;green&amp;quot;]     b_m [color=&amp;quot;green&amp;quot;]     c_m [color=&amp;quot;green&amp;quot;]      // upstream recovery confirmed     a_v -&amp;gt; a_m [label=&amp;quot;diagnose&amp;quot; style=&amp;quot;dotted&amp;quot;]     a_m [color=&amp;quot;green&amp;quot;]      // upstream recovery confirmed     a_m -&amp;gt; c_v [label=&amp;quot;deduces&amp;quot; style=&amp;quot;dashed&amp;quot;]     c_v [color=&amp;quot;green&amp;quot;] }" class="graphviz"/&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="changes-required"&gt;
&lt;h3&gt;Changes required&lt;/h3&gt;
&lt;p&gt;The main change would be allowing raise alarms in suspect status which can be used to trigger a diagnostic action.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support for diagnose action, like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;an immediate pull from data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;force a push from data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;launch external tools to get state and post events to Vitrage API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suspect states for alarm&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;for deduced alarm, it is suspect if the source is from downstream&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for aggregated alarm, it is suspect if inconsistency is detected among underlying alarms (deduced and monitored)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Specially, it is not suspect if &lt;strong&gt;newer&lt;/strong&gt; monitored state is different from &lt;strong&gt;old&lt;/strong&gt; suspect deduced state. Because a
suspect state means it could be either active or inactive. So it is reasonable to trust the latest update from monitor.&lt;/p&gt;
&lt;p&gt;However, when we bring in proactive RCA, the entity numbers in the graph may grow a lot. We shall need to create
deduced alarm for each monitored alarm and set suspect state in some condition. The relationships (edges) will also
grow. So there are some additional work to be done to improve user experience, such as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Aggregate underlying entity graph to simplify user view&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new API for querying aggregated entity graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplify the template definition by defining fault model&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="backward-compatibility"&gt;
&lt;h3&gt;Backward compatibility&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;fully functional&lt;/strong&gt; proactive RCA fault model requires every fault can be monitored with a diagnose action. But the
deductive reasoning procedure is also applicable for fault model lacking diagnose action or missing monitoring on some
fault.&lt;/p&gt;
&lt;p&gt;For example, if there is no diagnose action for confirming Fault A, the deductive reasoning will still continue once
the status of Fault A get updated passively from monitor.&lt;/p&gt;
&lt;p&gt;If there is no monitor for Fault A, then it will stay in suspect status. It helps the user to narrow down the scope of
root cause to make manual investigation easier.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yujunz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;no&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;See dependent blueprints.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The implementation of proactive RCA depends on several blueprints. They will be listed below once got approved.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;See dependent blueprints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;See dependent blueprints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/vitrage-fault-model"&gt;https://etherpad.openstack.org/p/vitrage-fault-model&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/vitrage-ptg-queens"&gt;https://etherpad.openstack.org/p/vitrage-ptg-queens&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 07 Nov 2017 00:00:00 </pubDate></item><item><title>Support External Actions in Vitrage Templates</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/external-actions.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/support-external-actions"&gt;https://blueprints.launchpad.net/vitrage/+spec/support-external-actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently, the Vitrage templates support the following actions: raise alarm,
set state, mark causal relationship and mark-down.
The implementation of mark-down is patchy (update a property on the vertex and
call the notifier).&lt;/p&gt;
&lt;p&gt;We need a way to define in the template an external action that should be
taken. One example is the mark-down. Another example is to execute a Mistral
workflow or a Congress policy.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The following use cases should be supported:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;mark-down&lt;/strong&gt;. This is an existing use case. If a mark-down action exists,
Vitrage will call Nova mark-down API. The behavior should remain the same
after the change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execute a Mistral workflow&lt;/strong&gt;. The user should be able to execute a Mistral
workflow based on Vitrage insights.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execute other external actions&lt;/strong&gt;, like a Congress policy.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new action for each external engine we would like to support. The action
will have metadata with parameters to be sent to the engine.&lt;/p&gt;
&lt;section id="examples"&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_nova&lt;/span&gt;
  &lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;api_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;mark-down&lt;/span&gt;
    &lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;execute_mistral&lt;/span&gt;
  &lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;evacuate_host&lt;/span&gt;
    &lt;span class="nt"&gt;failed_host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The idea behind adding a new external_* action for each engine is to emphasize
that Vitrage supports a predefined set of external actions, and specifically
it does not support runinng scripts.&lt;/p&gt;
&lt;p&gt;The internal implementation will be identical for Nova, Mistral, Congress, etc.
During the template loading phase, the execute_* action will be converted to
a generic Execute action, with a notifier parameter. The template validator
will verify that the wanted notifier is enabled in vitrage.conf, otherwise
the template loading will fail.&lt;/p&gt;
&lt;p&gt;When executing the Execute action, the evaluator will send an event to the
message bus of the wanted notifier. This way, only the Mistral notifier will
handle the execute_mistral actions.&lt;/p&gt;
&lt;p&gt;Note that currently only the Vitrage graph sends notification to the notifier.
This behavior will be changed, so notifications will be sent both from the
graph (for deduced alarms and set state) and from the evaluator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There are two alternatives:&lt;/p&gt;
&lt;section id="send-message-bus-notifications"&gt;
&lt;h4&gt;Send Message bus notifications&lt;/h4&gt;
&lt;p&gt;Vitrage can have a message bus notifier, that will send notifications about
raise/delete alarm, set state and mark causal-relationship. Mistral will be
configured to execute certain workflows based on the notifications received
from Vitrage.&lt;/p&gt;
&lt;p&gt;Advantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;No extra configuration needed in Vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can work with the current notifiers mechanism&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Messgae bus notifications might get lost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less powerful. In Vitrage template the user can decide to execute a workflow
based on a combination of alarms or a specific topology. Once Mistral gets
the notifications, the topology context is no longer there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mark-down use case is not supported by this solution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="configuration-done-on-the-specific-notifier"&gt;
&lt;h4&gt;Configuration Done on the specific notifier&lt;/h4&gt;
&lt;p&gt;A Mistral notifier will be written and receive notifications from the graph.
It will be configured by a yaml file that will determine which workflow to
execute per specific alarm.&lt;/p&gt;
&lt;p&gt;Advantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;No extra configuration needed in Vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can work with the current notifiers mechanism&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No lost messages&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Less powerful. In Vitrage template the user can decide to execute a workflow
based on a combination of alarms or a specific topology. In Mistral notifier
we no longer have this context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mark-down use case is not supported by this solution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="calculate-the-action-target"&gt;
&lt;h3&gt;Calculate the action_target&lt;/h3&gt;
&lt;p&gt;Every “regular” action (raise_alarm, set_state, add_causal_relationship) has
an action_target block. The action_target has no meaning for the external
actions, since they are managed by an external engine that does not have a
“target” terminology.&lt;/p&gt;
&lt;p&gt;The problem is that the action_target is essential for
the subgraph-matching calculations, in order to calculate the connected
components.&lt;/p&gt;
&lt;section id="the-proposed-solution"&gt;
&lt;h4&gt;The proposed solution&lt;/h4&gt;
&lt;p&gt;For external actions, we will automatically calculate an action
target. The target will be selected arbitrarily from the set of possible
targets. In complex conditions that involve {and, or, not} finding the target
might not be trivial. Some more-complex conditions will not be supported for
external actions, due to this reason.&lt;/p&gt;
&lt;p&gt;The calculation method:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;And condition - any vertex that is part of the condition can be a target&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not condition - no vertex that is part of the condition can be a target&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or condition - the target should be a vertex that appears in any “positive”
part (i.e. one that does not have a ‘not’ in front of it) of the Or condition&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h4&gt;Examples:&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In some cases it is impossible to find a valid target. They are
marked with ‘/’.&lt;/p&gt;
&lt;p&gt;The template validation should fail in these cases, for &lt;strong&gt;all kinds&lt;/strong&gt; of
actions.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 77%"/&gt;
&lt;col style="width: 23%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Condition&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Possible targets&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_in_error_status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a, b&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or a_contains_c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or a_contains_c or a_contains_d&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_in_error_status or a_contains_c or a_contains_d&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or a_contains_c or b_contains_d&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Not Supported&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_contains_b and a_contains_c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a, b, c&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b and a_contains_c and a_contains_d&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a, b, c, d&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or (a_contains_c and a_contains_d)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or (a_contains_c and b_contains_d)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a,b&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;not a_contains_b&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Not Supported&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;not a_in_error_status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Not Supported&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or not a_contains_c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Not Supported&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or (a_contains_c and not a_contains_d)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;a_contains_b or (not a_contains_c and not a_contains_d)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Not Supported&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="alternatives-to-calculating-the-action-target"&gt;
&lt;h3&gt;Alternatives to calculating the action_target&lt;/h3&gt;
&lt;p&gt;We can decide that an external action requires an action_target like all other
actions. This will simplify the implementation, but is logically wrong.
The action_target will serve as a “helper entity” for the subgraph-matching,
and it should not be the end user’s role to help fixing implementation issues.
As far as the external engine is concerned, the action_target has no meaning.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;A new Execute action will be added to the evaluator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;We should introduce a versioning mechanism to the templates. This will be done
when modifying the implementation of mark-down.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Enhance the template language (template loading and validation)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the external actions from the evaluator&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new action should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 16 Aug 2017 00:00:00 </pubDate></item><item><title>OSProfiler Support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/osprofiler-support.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/osprofiler-support"&gt;https://blueprints.launchpad.net/vitrage/+spec/osprofiler-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/developer/osprofiler/index.html"&gt;OSProfiler&lt;/a&gt; is an OpenStack cross-project profiling library. It allows user
to generate 1 trace per request which is processed in multiple services.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;It is quite common that Vitrage is integrated in a large system to provide a
complete solution e.g. as inspector in &lt;a class="reference external" href="https://wiki.opnfv.org/display/doctor"&gt;OPNFV/Doctor&lt;/a&gt; for fault management.&lt;/p&gt;
&lt;p&gt;When performance is a critical issue, it is very complicated to analyse the
event processing workflow and locate the bottleneck in case something works
slowly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add osprofiler support in vitrage and vitrage-client.&lt;/p&gt;
&lt;p&gt;OSProfiler will help to generate a tree of calls (see &lt;a class="reference external" href="http://doctor.surge.sh/"&gt;example&lt;/a&gt;) which is
intuitive to understand what exactly is going on.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Explained in &lt;a class="reference external" href="https://osprofiler.readthedocs.io/en/latest/#why-not-cprofile-and-etc"&gt;why not cprofile and etc&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Additional HTTP header inserted by profiler should be checked when it is
enabled. Besides that, there is no impact on the business logic in api handler.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yujunz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add configuration options for osprofiler&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add initialization of osprofiler in service startup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add osprofiler wsgi middleware to trace HTTP calls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trace RPC calls&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the changes proposed in &lt;a class="reference external" href="https://review.openstack.org/#/q/topic:bug/1560704"&gt;similar topic in ironic&lt;/a&gt; for an overview.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Covered by unit test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Add to developer guide on how to use osprofiler.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Wed, 16 Aug 2017 00:00:00 </pubDate></item><item><title>Keycloak support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/keycloak.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/keycloak-support"&gt;https://blueprints.launchpad.net/vitrage/+spec/keycloak-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As part of an on going effort to make vitrage to be able to work also in a non
OpenStack environment (in addition to the default OpenStack environment).
We should be able to make vitrage work with a different authorization server
instead of keystone. An optional authorization server can be Keycloak which is
an open source Identity and Access Management solution aimed at modern
applications and services&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage at the moment can only work in an OpenStack environment because it needs
Keystone for authorization. We should support other authorization such as Keycloak.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;New auth_mode in api section in Vitrage config file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;auth_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keycloak&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;New keycloak section with the auth_url in Vitrage config:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;keycloak&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;auth_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;keycloak&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;]:[&lt;/span&gt;&lt;span class="n"&gt;keycloak&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Vitrage server will use a new middleware which will authenticate with the
Keycloak server once an api request is received.&lt;/p&gt;
&lt;p&gt;A new auth plugin will be added to the vitrage client which will get the token
from the Keycloak server and sent it with the api request.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;When using the client we should use the keycloak-plugin&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;To use the Keycloak Authorization there is a need to define it in the
Vitrage config file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eyalb1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create Keycloak plugin in client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Keycloak plugin in server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The usage of the KeyCloak authorization will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/contributor/keycloak-config.rst"&gt;keycloak-config.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 06 Aug 2017 00:00:00 </pubDate></item><item><title>Define and handle equivalence among entities</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/entity-equivalence.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/entity-equivalence"&gt;https://blueprints.launchpad.net/vitrage/+spec/entity-equivalence&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Define equivalence among entities to allow mapping two or more entities to same
object and handle it properly in scenario evaluator. It is inspired by Idan
Hefetz’s proposal about &lt;a class="reference external" href="https://goo.gl/FfDLi8"&gt;ZTE use case of alarm deduction&lt;/a&gt;, but designed in a
generic way to allow extending to RESOURCE equivalence in future.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Introducing entity equivalence will enhance the extensibility of Vitrage,
making it suitable for more use cases, such as&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;early &lt;a class="reference external" href="https://review.openstack.org/#/c/423000/"&gt;deduction&lt;/a&gt; of alarm before it is reported and deal with the real
alarm followed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/alarm-aggregation"&gt;aggregation&lt;/a&gt; of equivalent alarms from multiple monitors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aggregation of resource information from multiple data sources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new file (or a set of files) that define equivalence between entities&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity equivalence example&lt;/span&gt;
&lt;span class="nt"&gt;equivalences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;equivalence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
       &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nagios&lt;/span&gt;
       &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
       &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
       &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
       &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;vitrage&lt;/span&gt;
       &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
 &lt;span class=" -Error"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;equivalence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These definitions will take effect globally, i.e. for every other template&lt;/p&gt;
&lt;p&gt;The evaluator will duplicate every scenario for every equivalent alarm
automatically. For example, in case of the condition:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nagios_host_problem_on_host&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;host_contains_vm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Two conditions will be created internally:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nagios_host_problem_on_host&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;host_contains_vm&lt;/span&gt;
&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;zabbix_host_problem_on_host&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;host_contains_vm&lt;/span&gt;
&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vitrage_host_problem_on_host&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;host_contains_vm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The idea is that the user will write a single condition, and all equivalent
conditions will be created and evaluated automatically.&lt;/p&gt;
&lt;p&gt;Equivalences should be defined explicitly. Including one entity in two or more
equivalence definition will result in implicit chaining, thus is considered
invalid. For example, if &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;eq&lt;/span&gt; &lt;span class="pre"&gt;b&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;b&lt;/span&gt; &lt;span class="pre"&gt;eq&lt;/span&gt; &lt;span class="pre"&gt;c&lt;/span&gt;&lt;/code&gt; are defined separately, it
will logically result in an implicit &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;eq&lt;/span&gt; &lt;span class="pre"&gt;c&lt;/span&gt;&lt;/code&gt;. This will introduce unnecessary
complexity in creating templates and should be restricted in validator.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;section id="separate-file-vs-embedded-definition"&gt;
&lt;h4&gt;Separate file vs embedded definition&lt;/h4&gt;
&lt;p&gt;Instead of creating a separate file, we may embed the equivalence definitions in
templates by adding a new section &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalences&lt;/span&gt;&lt;/code&gt;. Entities that are equivalent
to each other are grouped in arrays of their &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template_id&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity equivalence example&lt;/span&gt;
&lt;span class="nt"&gt;definitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nt"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
     &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nagios&lt;/span&gt;
     &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
     &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nagios_host_problem&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
     &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix&lt;/span&gt;
     &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
     &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zabbix_host_problem&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALARM&lt;/span&gt;
     &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;vitrage&lt;/span&gt;
     &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;host_problem&lt;/span&gt;
     &lt;span class="nt"&gt;template_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;vitrage_host_problem&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
 &lt;span class="nt"&gt;relationships&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
 &lt;span class="nt"&gt;equivalences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;nagios_host_problem&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;zabbix_host_problem&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;vitrage_host_problem&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="nt"&gt;scenarios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In this way, there will be fewer duplication of entity definitions.&lt;/p&gt;
&lt;p&gt;However, given the fact that once an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalent&lt;/span&gt;&lt;/code&gt; edge is added between two
alarms, then it &lt;em&gt;logically&lt;/em&gt; means that they are equivalent in &lt;em&gt;all&lt;/em&gt; other
templates as well. Even if they are not specified this way in the other
templates. Then template will be less clear without the equivalence information
embedded in it.&lt;/p&gt;
&lt;p&gt;The duplication of entity definition might be resolved by implementing an
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;import&lt;/span&gt;&lt;/code&gt; feature in other blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="adding-equivalent-edge-vs-not"&gt;
&lt;h4&gt;Adding equivalent edge vs not&lt;/h4&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalent&lt;/span&gt;&lt;/code&gt; edges could be created between every two equivalent alarms.
Since all related scenarios have been duplicated, This does not bring extra
value in the evaluator.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalent&lt;/span&gt;&lt;/code&gt; edge could be useful for future evolution such as alarm
aggregation, UI optimization, alarm deduction. It may be implemented in those
blueprints.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;There are currently three views in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vitrage-dashboard&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;section id="topology-view"&gt;
&lt;h4&gt;Topology view&lt;/h4&gt;
&lt;p&gt;No impact&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rca-view"&gt;
&lt;h4&gt;RCA view&lt;/h4&gt;
&lt;p&gt;More alarms and more &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;causes&lt;/span&gt;&lt;/code&gt; edges&lt;/p&gt;
&lt;div class="admonition-todo admonition" id="id1"&gt;
&lt;p class="admonition-title"&gt;Todo&lt;/p&gt;
&lt;p&gt;(yujunz) include example graph&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="entity-graph"&gt;
&lt;h4&gt;Entity graph&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;separate vertices for equivalent alarms (nagios, zabbix, vitrage)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;more edges (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalent&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;on&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h4&gt;Summary&lt;/h4&gt;
&lt;p&gt;The impacts on RCA view and Entity graph will only be relevant to cases where
both &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalence&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vitrage-dashboard&lt;/span&gt;&lt;/code&gt; are used. We will handle it in
future blueprints.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yujunz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;validate and parse equivalence definition in templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;duplicate scenarios in the scenario repository&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;no changes in sub-graph matching or the evaluator&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following items are not in scope&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;aggregation of equivalent alarms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;add-equivalent&lt;/span&gt;&lt;/code&gt; action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;support alarm equivalence in UI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement causal tree model for alarm deduction enhancement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resource equivalence&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation will be covered by additional unit test&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;documentation on how to define equivalence and when to use it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;declare limitation on resource equivalence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list known issues when use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;equivalence&lt;/span&gt;&lt;/code&gt; with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vitrage-dashboard&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Wed, 19 Jul 2017 00:00:00 </pubDate></item><item><title>Resource List API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/resource-list-api.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/resource-list-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/resource-list-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An API to list the resources with specified type or all the resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently Vitrage has the APIs for getting topology and alarms. But user may
want to get specified resources which he cares about.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add an API to list resources. If user specify the resource type, list the
resources with the given type.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="resource-list"&gt;
&lt;h4&gt;Resource List&lt;/h4&gt;
&lt;p&gt;Returns resource list&lt;/p&gt;
&lt;section id="get-v1-resources"&gt;
&lt;h5&gt;GET /v1/resources/&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="headers"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-Agent (String)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;resource_type - (string, optional) the type of resource. defaults to return all resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;all_tenants - (boolean, optional) shows the resources of all tenants (in case the user has the permissions).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8999&lt;/span&gt;
&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keystoneauth1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.3.0&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.9.1&lt;/span&gt; &lt;span class="n"&gt;CPython&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.6&lt;/span&gt;
&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b8882ba2ec44295bf300aecb2caa4f7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="status-code"&gt;
&lt;h4&gt;Status code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;400 - Bad request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns a list with all the resources requested.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="response-examples"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RESOURCE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"is_placeholder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"is_deleted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"update_timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-01T12:46:41Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0683517e1e354d2ba25cba6937f44e79"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"nova.instance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dc35fa2f-4515-1653-ef6b-03b471bb395b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"vitrage_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RESOURCE:nova.instance:dc35fa2f-4515-1653-ef6b-03b471bb395b"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;dong wenjuan &amp;lt;&lt;a class="reference external" href="mailto:dong.wenjuan%40zte.com.cn"&gt;dong&lt;span&gt;.&lt;/span&gt;wenjuan&lt;span&gt;@&lt;/span&gt;zte&lt;span&gt;.&lt;/span&gt;com&lt;span&gt;.&lt;/span&gt;cn&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the API and tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the client and tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and tempest tests need to be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 19 Jul 2017 00:00:00 </pubDate></item><item><title>Resource show API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/resource-show-api.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/resource-show-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/resource-show-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An API to show the details of the specified resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As a user, I want to get the details of a specified resource.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add an API to show the details of specified resource.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="resource-show"&gt;
&lt;h4&gt;Resource show&lt;/h4&gt;
&lt;p&gt;Returns details of the resource&lt;/p&gt;
&lt;section id="get-v1-resources-vitrage-id"&gt;
&lt;h5&gt;GET /v1/resources/vitrage_id&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="headers"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-Agent (String)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;vitrage_id&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;GET /v1/resources/`&amp;lt;vitrage_id&amp;gt;`
Host: 127.0.0.1:8999
User-Agent: keystoneauth1/2.3.0 python-requests/2.9.1 CPython/2.7.6
Accept: application/json
X-Auth-Token: 2b8882ba2ec44295bf300aecb2caa4f7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="status-code"&gt;
&lt;h4&gt;Status code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;404 - Not Found&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns details of the requested resource.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="response-examples"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RESOURCE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"is_placeholder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"is_deleted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"update_timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-01T12:46:41Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0683517e1e354d2ba25cba6937f44e79"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"nova.instance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dc35fa2f-4515-1653-ef6b-03b471bb395b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"vitrage_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RESOURCE:nova.instance:dc35fa2f-4515-1653-ef6b-03b471bb395b"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;dong wenjuan &amp;lt;&lt;a class="reference external" href="mailto:dong.wenjuan%40zte.com.cn"&gt;dong&lt;span&gt;.&lt;/span&gt;wenjuan&lt;span&gt;@&lt;/span&gt;zte&lt;span&gt;.&lt;/span&gt;com&lt;span&gt;.&lt;/span&gt;cn&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the API and tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the client and tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and tempest tests need to be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 19 Jul 2017 00:00:00 </pubDate></item><item><title>SNMP Notifications</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/snmp-notifications.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/snmp-notifications"&gt;https://blueprints.launchpad.net/vitrage/+spec/snmp-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Evaluator performs root cause analysis on the Vitrage Graph and may
determine that an alarm should be created, deleted or otherwise updated.
Other components are notified of such changes by the Vitrage Notifier service.
Among others, one Vitrage Notifier is responsible for sending SNMP traps on
Vitrage deduced alarms.&lt;/p&gt;
&lt;p&gt;This blueprint describes the implementation of Vitrage Notifier for notifying
SNMP on Vitrage deduced alarms.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage should support registering for SNMP notifications, and sending traps
on raised alarms and deactivated alarms to any registered targets.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Due to definition in Vitrage config file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DEFAULT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;notifiers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snmp&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vitrage listener will get the alarm events from the message bus and the SNMP
notifier will send SNMP traps on raised deduced alarms and deleted deduced alarms.&lt;/p&gt;
&lt;p&gt;The traps will be sent to destinations specified in consumers yaml file.&lt;/p&gt;
&lt;p&gt;The traps will be sent only on alarms specified in yaml file which contains
oid mapping for each alarm name.&lt;/p&gt;
&lt;p&gt;The format of sent traps will be specified in another yaml file.&lt;/p&gt;
&lt;p&gt;All those yaml files’ paths should be specified in Vitrage config:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;snmp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;consumers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;consumers&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;alarm_oid_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;oid_tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The SNMP notifier is pluggable, you can implement your own SNMP sender and use
it (it must inherit from the base class), when there is a default implementation.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;To use the SNMP notifier there is a need to define it in the Vitrage config
file, and in addition create three yaml files and define them in Vitrage config file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;annarez&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create SNMP notifier&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create SNMP sender&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;create base class&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create unit test for SNMP sender&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;test snmp notifier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;test snmp sender&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The usage of the SNMP notifier will be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/notifier-snmp-plugin.rst"&gt;notifier-snmp-plugin.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 19 Jul 2017 00:00:00 </pubDate></item><item><title>Template not operator Support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/pike/implemented/template-not-operator-support.html</link><description>
 
&lt;p&gt;We would like the templates language to support the “not” operator in addition
to “and” and “or” operators.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Today the templates language support the “and” and “or” operators, but this is
not enough.
Many scenarios can’t be described by those two operators, and thus we would
like to add a support for the “not” operator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Remark: positive vertex = vertex that has an edge with “is_deleted”=False property.&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;negative vertex = the opposite of positive vertex. Meaning that the&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vertex has only edges with “is_deleted”=True property.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;The following changes needs to be done to support the “not” operator.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;In the template validation. Check that the “Not” operator can appear only
in the following way:&lt;/p&gt;
&lt;p&gt;“Not” operator can appear before edges.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scenario Evaluator:&lt;/p&gt;
&lt;p&gt;check if “not” operator appears on an element, and add a property named
“negative_condition” on it, and updated it’s “is_delete” property to True.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Networkx Algorithm:&lt;/p&gt;
&lt;p&gt;In the subgraph_matching method. If the match is not a “negative condition”
then perform regular subgraph_matching.
Otherwise, if the match is a “negative condition” then perform
subgraph_matching on a negative edges.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The performance of the subgraph matching algorithm is a bit slower due to
the steps above.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40nokia.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;nokia&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Added tests that are checking different uses of the “not” operator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Added documentation in Vitrage:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/not_operator_support.rst"&gt;https://github.com/openstack/vitrage/blob/master/doc/source/not_operator_support.rst&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 19 Jul 2017 00:00:00 </pubDate></item><item><title>Event API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/event-api.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/support-inspector-sb-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/support-inspector-sb-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint defines an API for sending events to Vitrage datasources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As a reference implementation to OPNFV Doctor Inspector project, Vitrage has
to implement the Inspector SB API. This is a REST API that each monitoring
service should call in order to push events to the Inspector.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;New API will be added to allow sending events to the Vitrage datasources.
The events will be sent to Oslo message bus, and will be consumed by the one of
the datasource drivers according to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;type&lt;/span&gt;&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;For example, the Doctor datasource will handle events of type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;compute.host.down&lt;/span&gt;&lt;/code&gt;,
while the Nova instance datasource will handle events of type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;compute.instance.delete.start&lt;/span&gt;&lt;/code&gt;.
(Using this API for Nova is not a real use case, but can be used for debugging).&lt;/p&gt;
&lt;p&gt;For the Doctor datasource, the events will contain the details defined in the
Doctor specification. Future datasources may also use this API in order to send
their own events to Vitrage.&lt;/p&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="post-v1-0-event"&gt;
&lt;h4&gt;POST /v1.0/event/&lt;/h4&gt;
&lt;p&gt;Post an event to Vitrage message queue, to be consumed by a datasource driver.&lt;/p&gt;
&lt;section id="headers"&gt;
&lt;h5&gt;Headers&lt;/h5&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-Agent (String)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Content-Type (String): application/json&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h5&gt;Path Parameters&lt;/h5&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h5&gt;Query Parameters&lt;/h5&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h5&gt;Request Body&lt;/h5&gt;
&lt;p&gt;An event to be posted. Will contain the following fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;time: a timestamp of the event. In case of a monitor event, should specify when the fault has occurred.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: the type of the event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;details: a key-value map of metadata.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A list of some potential details, copied from the Doctor SB API reference:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;hostname: the hostname on which the event occurred.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;source: the display name of reporter of this event. This is not limited to monitor, other entity can be specified such as ‘KVM’.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cause: description of the cause of this event which could be different from the type of this event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;severity: the severity of this event set by the monitor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status: the status of target object in which error occurred.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;monitorID: the ID of the monitor sending this event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;monitorEventID: the ID of the event in the monitor. This can be used by operator while tracking the monitor log.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;relatedTo: the array of IDs which related to this event.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h5&gt;Request Examples&lt;/h5&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;135.248.18.122&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8999&lt;/span&gt;
&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keystoneauth1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.3.0&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.9.1&lt;/span&gt; &lt;span class="n"&gt;CPython&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.6&lt;/span&gt;
&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b8882ba2ec44295bf300aecb2caa4f7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'event'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'time'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'2016-04-12T08:00:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'compute.host.down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'details'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'hostname'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'compute-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'source'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sample_monitor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'cause'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'link-down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'severity'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'critical'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'monitor_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'monitor-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'monitor_event_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'123'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;section id="status-code"&gt;
&lt;h6&gt;Status code&lt;/h6&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;400 - Bad request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h6&gt;Response Body&lt;/h6&gt;
&lt;p&gt;Returns an empty response body if the request was OK.
Otherwise returns a detailed error message (e.g. ‘missing time parameter’).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes will be tested by unit tests and tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.opnfv.org/display/doctor/Doctor+Home"&gt;https://wiki.opnfv.org/display/doctor/Doctor+Home&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://artifacts.opnfv.org/doctor/docs/requirements/05-implementation.html"&gt;http://artifacts.opnfv.org/doctor/docs/requirements/05-implementation.html&lt;/a&gt;
section 4.5.6&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/doctor-datasource"&gt;https://blueprints.launchpad.net/vitrage/+spec/doctor-datasource&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 16 Jan 2017 00:00:00 </pubDate></item><item><title>Collectd Data Source</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/collectd-datasource.html</link><description>&lt;dl&gt;
&lt;dt&gt;This work is licensed under a Creative Commons Attribution 3.0 Unported&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;License.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://creativecommons.org/licenses/by/3.0/legalcode"&gt;http://creativecommons.org/licenses/by/3.0/legalcode&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="collectd-data-source"&gt;
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/collectd-datasource"&gt;https://blueprints.launchpad.net/vitrage/+spec/collectd-datasource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the datasource that will receive notifications from
collectd.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage should be able to accept a collectd notification.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The Collectd datasource will receive notifications in the following format:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"compute-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"plugin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ovs_events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"plugin_instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"br-ex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gauge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"type_instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"link_status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"link state of "&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="s2"&gt;" interface has been changed to "&lt;/span&gt;&lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"WARNING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1482409029.062524&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"46c7eba7753efb0e6f6a8de24c949c52"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Upon receiving such a notification, the Collectd datasource will create a
corresponding alarm in Vitrage. When receiving an ok
notification, the alarm will be deleted.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;In addition, a new evaluator template will be added in order to:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create deduced alarms on the VMs running on the host&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the states of the host and the VMs to ERROR&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eyal bar ilan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the Collectd datasource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a template for creating deduced alarms on the VMs and calling Nova
mark host down&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes will be tested by unit tests&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://collectd.org/"&gt;https://collectd.org/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Tue, 27 Dec 2016 00:00:00 </pubDate></item><item><title>Doctor Data Source</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/ocata/doctor-datasource.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/doctor-datasource"&gt;https://blueprints.launchpad.net/vitrage/+spec/doctor-datasource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the datasource that will receive notifications from
OPNFV Doctor monitor&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In order for Vitrage to be accepted as a reference implementation for the
OPNFV Doctor Inspector component, it should be able to receive alarm
notifications from the Doctor monitor.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The Doctor datasource will receive notifications in the format defined by
Doctor SB API (see the reference below):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'event'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'time'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'2016-04-12T08:00:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'compute.host.down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'details'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'hostname'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'compute-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'source'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sample_monitor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'cause'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'link-down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'severity'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'critical'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'monitor_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'monitor-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'monitor_event_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'123'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Upon receiving such a notification, the Doctor datasource will create or
delete a corresponding alarm in Vitrage, based on the ‘status’ field.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;In addition, a new evaluator template will be added in order to:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create deduced alarms on the VMs running on the host&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the states of the host and the VMs to ERROR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call Nova force-down API to mark that the host is down&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The Doctor monitor sends its alarms in REST format. Another blueprint discusses
the SB API that should be added to Vitrage in order to support it.
See &lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/support-inspector-sb-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/support-inspector-sb-api&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the Doctor datasource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a template for creating deduced alarms on the VMs and calling Nova
mark host down&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The changes will be tested by unit tests, and later on also by Doctor test
scripts.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.opnfv.org/display/doctor/Doctor+Home"&gt;https://wiki.opnfv.org/display/doctor/Doctor+Home&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://artifacts.opnfv.org/doctor/docs/requirements/05-implementation.html"&gt;http://artifacts.opnfv.org/doctor/docs/requirements/05-implementation.html&lt;/a&gt;
section 4.5.6&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 25 Dec 2016 00:00:00 </pubDate></item><item><title>Vitrage Entity Graph Consistency Validator</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/entity-graph-consistency-validator.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/entity-graph-consistency-validator"&gt;https://blueprints.launchpad.net/vitrage/+spec/entity-graph-consistency-validator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Entity Graph may have mistakes, such as an incorrect resource state, and
we would like to detect and repair such errors.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The Entity Graph is a living graph which is updated all the time with the data
received from the synchronizer(s). The Entity Graph may have errors and become
inconsistent compared to the state of the Cloud, which may occur due to:
(1)     The Vitrage Resource Processor may perform incorrect operations during
graph updates, for example due to problems resulting from multi-threading.
(2)     Missing updates from the synchronizer(s).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We would like to check the Entity Graph each set interval (configurable) and
validate the consistency of its resources and state. If the Entity Graph is
incorrect, it will repair it. When needed, it might consult the synchronizer(s)
to retrieve missing data.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40alcatel-lucent.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 22 Dec 2016 00:00:00 </pubDate></item><item><title>NetworkX Performance Improvement</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/networkx-performance-improvement.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/networkx-performance-improvement"&gt;https://blueprints.launchpad.net/vitrage/+spec/networkx-performance-improvement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many CRUD operations can be performed on the Entity Graph simultaneously.
This can cause inconsistency regarding the resources and states on the graph.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Many CRUD operations can be performed on the Entity Graph simultaneously.
This can cause inconsistency regarding the resources and states on the graph.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We would like to have graph versioning, which will held two copies of the
Entity Graph: (1) Stable copy of the last consistent graph, and (2) Dynamic
copy of the graph which is updated by the Vitrage Resource Processor.
Every set interval the changes inserted to the dynamic graph will be updated
to the stable graph, resulting in the stable graph being up to date.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40alcatel-lucent.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 22 Dec 2016 00:00:00 </pubDate></item><item><title>Vitrage System Health Visualization</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/ui-system-health-visualization.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage-dashboard/+spec/ui-system-health-sunburst"&gt;https://blueprints.launchpad.net/vitrage-dashboard/+spec/ui-system-health-sunburst&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A macro view to show the general health of the system.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Missing visualization of the system status.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We will present the system health in sunburest graph with color and labels
that represnt their status&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alon-heller &amp;lt;&lt;a class="reference external" href="mailto:alon.heller%40alcatel-lucent.com"&gt;alon&lt;span&gt;.&lt;/span&gt;heller&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 22 Dec 2016 00:00:00 </pubDate></item><item><title>Vitrage Resource Processor</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-resource-processor.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/vitrage-resource-processor"&gt;https://blueprints.launchpad.net/vitrage/+spec/vitrage-resource-processor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When Vitrage initializes we need to create the Entity Graph on which the
Vitrage will run it’s algorithms (sub graph matching, BFS, DFS etc.) and
perform the actions (RCA, deduced alarms etc.). After the initialization
of the graph, the resources changes are being processed and pushed to the
Entity Graph.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage does not have a full Entity Graph of the resources and their state
when it initializes.
Vitrage needs to be consistent with the updated and new resources.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;When Vitrage initializes we need to build the up to date entity graph, so we
can run the different algorithms on it and perform the required actions.
To perform we require the full resources list from the synchronizer.
In order for the Entity Graph to be constructed, it will need updates on
changes in the cloud (e.g., machine creation/termination), and guidance on how
resources should be linked to each other (e.g., a virtual machine resides on
a physical host, which in turn belongs to an availability zone, etc.).
For this purpose, each synchronizer will also update a configuration file -
the entity graph template - which specifies for each resource what and how to
locate the specific resources to link to.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40alcatel-lucent.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;
dan-ofek &amp;lt;&lt;a class="reference external" href="mailto:dan.ofek%40alcatel-lucent.com"&gt;dan&lt;span&gt;.&lt;/span&gt;ofek&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 22 Dec 2016 00:00:00 </pubDate></item><item><title>Template Validator</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-template-validator.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/template-validator"&gt;https://blueprints.launchpad.net/vitrage/+spec/template-validator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage Evaluator serves as workflow manager controlling the analysis and
activation of templates and execution of template actions.&lt;/p&gt;
&lt;p&gt;Template Validator ensures that a new template is correct. Meaning, it conforms
with Vitrage Template Standard.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Templates do not always meet the Vitrage Template Standard. For example,
unsupported action, invalid alarm name, incorrect graph template and etc.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Template validator is a part of Vitrage Evaluator. It receives a template,
runs over it and checks its correctness.
If the template is valid, it notify the Evaluator Engine which inserts the
template into the template DB. Otherwise, insertion is failed.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;A template editor that prevent invalid templates.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The validator runs when a new template is added through API create call.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 22 Dec 2016 00:00:00 </pubDate></item><item><title>Nagios Synchronizer Plugin - get_all implementation</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/synchronizer-nagios-get-all.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/synchronizer-nagios-get-all"&gt;https://blueprints.launchpad.net/vitrage/+spec/synchronizer-nagios-get-all&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the Nagios plugin for Vitrage Synchronizer, and its
implementation for get_all nagios services (tests).&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Nagios test results should be added to Vitrage Graph via Vitrage Synchronizer.
This requires writing a Synchronizer plugin for Nagios.&lt;/p&gt;
&lt;p&gt;The plugin should support two modes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;get_all: query the results of all Nagios tests and send corresponding events to the Synchronizer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notifications: notify the Synchronizer upon a change in one of Nagios test results&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blueprint refers to get_all implementation.&lt;/p&gt;
&lt;p&gt;As a first stage, we will support only Nagios 3.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The current Nagios plugin will support Nagios 3.x.&lt;/p&gt;
&lt;p&gt;Nagios plugin will be configured with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Nagios URI, for example:
&lt;a class="reference external" href="http://10.45.1.10/monitoring/nagios/cgi-bin/status.cgi?host=all&amp;amp;limit=0"&gt;http://10.45.1.10/monitoring/nagios/cgi-bin/status.cgi?host=all&amp;amp;limit=0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nagios credentials&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Poll interval in seconds (default: 60)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every poll-interval seconds, Nagios plugin will call Nagios URI to query the
results of Nagios services (tests). It will parse the returned html (there is
no REST API for Nagios 3.x), create Nagios events and send them to Vitrage
Graph queue.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Nagios event will look like that:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 28%"/&gt;
&lt;col style="width: 46%"/&gt;
&lt;col style="width: 27%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;resource_name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;name of Nagios host&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;compute-0-0.local&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;os-glance-00.local&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ilo.node14&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;resource_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;type of Nagios host&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nova.host&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova.instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;service&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;name of Nagios service (test)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;CPU load&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check_ceph_health&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;the status of the service&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WARNING&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRITICAL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UNKNOWN&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;last_check&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;last time the service was checked&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2016-01-04 19:17:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;duration&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;duration since the last status change&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1d 2h 55m 48s&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;attempt&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;how many attempts were made&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1/3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;status_info&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;additional information&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;OK - 15min load 1.66&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;at 32 CPUs&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;vitrage_entity_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;the source of information&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;nagios
(constant value)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Nagios plugin should be configured with Nagios URI, credentials and poll
interval.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests and Tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Nagios Configuration should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Nagios Configuration:
&lt;a class="reference external" href="https://github.com/openstack/vitrage/blob/master/doc/source/nagios-config.rst"&gt;https://github.com/openstack/vitrage/blob/master/doc/source/nagios-config.rst&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Synchronizer main blueprint:
&lt;a class="reference external" href="https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-synchronizer.rst"&gt;https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-synchronizer.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 27 Nov 2016 00:00:00 </pubDate></item><item><title>Heat Datasource Driver - get_all implementation</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/newton/heat-datasource.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/heat-datasource-get-all"&gt;https://blueprints.launchpad.net/vitrage/+spec/heat-datasource-get-all&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the Heat driver for Vitrage Datasource, and its
implementation for get_all Stacks and Stack Resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat stacks should be added to Vitrage Graph via Vitrage Datasources.
This requires writing a Datasource driver for heat.&lt;/p&gt;
&lt;p&gt;The driver should support two modes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;get_all: query all Heat Stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notifications: notify the datasource upon a change in a stack definition or state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blueprint refers to get_all implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Heat driver will be configured with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Poll interval in seconds (default: 600)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every poll-interval seconds, Heat Driver will call Heat list all stacks API. The stacks will be converted to Vitrage datasource events and passed to Vitrage Graph queue.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Heat event will be sent to Vitrage Graph queue with the following properties:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 14%"/&gt;
&lt;col style="width: 45%"/&gt;
&lt;col style="width: 41%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stack_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The stack UUID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;e47e1be6-3598-46e6-bb63-0cc9a4e35ad7&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The stack name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;mystack&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The stack description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;mydescription&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;user_project_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The ID of the tenant that owns the alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;5542b27142154f30b32dea6238aa81aa&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;owner&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The ID of the user that owns the alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;5555527142154f30b32dea6238aa81aa&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The stack status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;in progress / failed&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;status_reason&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The stack status reason&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Stack create started ….&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Heat driver should be configured&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dan-offek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests and Tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Datasource main blueprint:
&lt;a class="reference external" href="https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-datasource.rst"&gt;https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-datasource.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 21 Jul 2016 00:00:00 </pubDate></item><item><title>Vitrage Get Template List API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/newton/template-list-api.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/template-list-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/template-list-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An API for list all templates loaded from templates lib, both those that passed validation and those that did not&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We would like to be able to list all templates loaded from /etc/vitrage/templates,
both those that passed validation and those that did not before uploading it to Vitrage.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create API to list all Vitrage loaded templates.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Valid template - template that passed validation and loaded into Scenario Repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Invalid template = template that did not pass validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The template list API returns a table with the following columns:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;uuid - a unique id generated by Vitrage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name - template’s name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status - pass validation or not&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status details&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;date - when template validation occurred (before template loading is executed)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="template-list"&gt;
&lt;h4&gt;Template List&lt;/h4&gt;
&lt;p&gt;Returns template list&lt;/p&gt;
&lt;section id="get"&gt;
&lt;h5&gt;GET /&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="headers"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-Agent (String)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;135.248.18.122&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8999&lt;/span&gt;
&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keystoneauth1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.3.0&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.9.1&lt;/span&gt; &lt;span class="n"&gt;CPython&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.6&lt;/span&gt;
&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b8882ba2ec44295bf300aecb2caa4f7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="status-code"&gt;
&lt;h4&gt;Status code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;400 - Bad request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns a table that is a list of all templates.
Each row describes a template and its status.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="response-examples"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 25%"/&gt;
&lt;col style="width: 5%"/&gt;
&lt;col style="width: 32%"/&gt;
&lt;col style="width: 14%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;uuid&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;status details&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;67bebcb4-53b1-4240-ad05-451f34db2438
4cc899e6-f6cb-43d8-94a0-6fa937e41ae2
0548367e-711a-4c08-9bdb-cb61f96fed04
33cb4400-f846-4c64-b168-530824d38f3e
a04cd155-0fcf-4409-a27c-c83ba8b20a3c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vm_down_causes_suboptimal_application
host_cpu_load_causes_vm_problem
switch_connectivity_issues
host_nic_down
disconnected_storage_problems&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;failed
pass
pass
pass
pass&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Entity definition must contain template_id field
Template validation is OK
Template validation is OK
Template validation is OK
Template validation is OK&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2016-06-29T12:24:16Z
2016-06-29T12:24:16Z
2016-06-29T12:24:16Z
2016-06-29T12:24:16Z
2016-06-29T12:24:16Z&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;liat har-tal &amp;lt;&lt;a class="reference external" href="mailto:liat.har-tal%40nokia.com"&gt;liat&lt;span&gt;.&lt;/span&gt;har-tal&lt;span&gt;@&lt;/span&gt;nokia&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tempest tests also need to be added in order to test:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Get template list&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 30 Jun 2016 00:00:00 </pubDate></item><item><title>Aodh Synchronizer Plugin - get_all implementation</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/synchronizer-aodh-get-all.html</link><description>
 
&lt;p&gt;launchpad blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/synchronizer-aodh-get-all"&gt;https://blueprints.launchpad.net/vitrage/+spec/synchronizer-aodh-get-all&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint describes the Aodh plugin for Vitrage Synchronizer, and its
implementation for get_all Aodh alarms.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Aodh alarms should be added to Vitrage Graph via Vitrage Synchronizer.
This requires writing a Synchronizer plugin for Aodh.&lt;/p&gt;
&lt;p&gt;The plugin should support two modes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;get_all: query all Aodh alarms and send corresponding events to the Synchronizer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notifications: notify the Synchronizer upon a change in an Aodh alarm definition or state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blueprint refers to get_all implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Aodh plugin will be configured with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Poll interval in seconds (default: 60)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every poll-interval seconds, Aodh plugin will call Aodh list all alarms API. The alarms will be converted to Vitrage Synchronizer events and passed to Vitrage Graph queue.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Aodh event will be sent to Vitrage Graph queue with the following properties:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 14%"/&gt;
&lt;col style="width: 45%"/&gt;
&lt;col style="width: 41%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;alarm_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm UUID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;e47e1be6-3598-46e6-bb63-0cc9a4e35ad7&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;CpuUtilAlarm1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Alarm when cpu is eq a avg of 300.0 over 60 seconds&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;enabled&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Is the alarm enabled&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;true/false&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;project_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The ID of the project or tenant that owns the alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;5542b27142154f30b32dea6238aa81aa&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;repeat_actions&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Should actions be re-triggered on each evaluation cycle&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;true/false&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;severity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm severity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;low/moderate/critical&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;state&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm state&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ok/alarm/insufficient data&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;time_constraints&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Optional. Evaluate the alarm within this time constraint&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The alarm type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;threshold/event&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;user_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The ID of the user who created the alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8ab65ef808b245e3ba234b7b3554cb94&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;resource_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Optional. The resource id in the query of the alarm rule&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;b0bf3635-d9e8-4624-9793-7aac82948c0a&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;sync_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The source of information&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;aodh (constant value)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Aodh threshold alarms will include in addition:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 14%"/&gt;
&lt;col style="width: 45%"/&gt;
&lt;col style="width: 41%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;state_timestamp&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The date of the last alarm state changed&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2016-03-01T17:13:08.847812&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;timestamp&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The date of the last alarm definition update&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2016-03-01T17:13:08.847812&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;threshold_rule&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The threshold rule, for a threshold alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;dictionary&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Aodh event alarms will include in addition:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 14%"/&gt;
&lt;col style="width: 45%"/&gt;
&lt;col style="width: 41%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;event_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Event type for event alarm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;compute.instance.update&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;timestamp&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Does not exist in Aodh? current time will be used&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2016-03-01T17:13:08.847812&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Gnocchi alarms, combination alarms and composite alarms are still TBD.&lt;/p&gt;
&lt;p&gt;TBD: how this information will be transformed to a Vitrage Graph vertex&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;Aodh plugin should be configured&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat-afek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This blueprint requires unit tests and Tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Aodh Configuration should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Synchronizer main blueprint:
&lt;a class="reference external" href="https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-synchronizer.rst"&gt;https://github.com/openstack/vitrage-specs/blob/master/specs/mitaka/vitrage-synchronizer.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 03 Mar 2016 00:00:00 </pubDate></item><item><title>Evaluator Engine</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-evaluator-engine.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/evaluator-engine"&gt;https://blueprints.launchpad.net/vitrage/+spec/evaluator-engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage Evaluator serves as workflow manager controlling the analysis and activation of templates and execution of template actions.&lt;/p&gt;
&lt;p&gt;Evaluator engine is the main core of Vitrage evaluator which responsible for managing the templates, executing them over Vitrage Graph and running their action.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+---------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;&amp;lt;------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Vitrage&lt;/span&gt; &lt;span class="n"&gt;Graph&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;+-------+-------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Vitrage&lt;/span&gt; &lt;span class="n"&gt;Evaluator&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+--------------+------+&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                           &lt;span class="o"&gt;|&lt;/span&gt;
               &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;+------+&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
               &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;RCA&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
               &lt;span class="o"&gt;+-----------------&amp;gt;&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                                 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;+------+&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                                 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;+------+&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+---------------------+&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Deduce&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;&amp;lt;----------+&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Alarm&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Vitrage&lt;/span&gt; &lt;span class="n"&gt;Notifier&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;+------+&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt;                           &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;          &lt;span class="o"&gt;+---------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+---------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage requires a component that is responsible for managing and executing templates, which are the basis for the different algorithms used in Vitrage, such as RCA.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;When a new &lt;strong&gt;instance&lt;/strong&gt; is added/removed/updated in the Vitrage Graph, find the templates relevant to this change and compare the pattern specified in each template to the new graph structure. For each pattern match found, execute the actions specified in the template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a new &lt;strong&gt;alarm&lt;/strong&gt; is added/removed/updated in the Vitrage Graph, find the templates relevant to this change and compare the pattern specified in each template to the new graph structure. For each pattern match found, execute the actions specified in the template.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Managing Templates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Users can perform CRUD actions on templates, in order to make changes to the use cases Vitrage supports. Specifically, when adding a template it should be added and stored in graph format and saved in NetworkX (Graph-based in-memory DB). Similarly, this template can be modified or deleted as well. The functionality added here should have a corresponding set of API calls for users to perform these actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Executing Templates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When a change takes place in the Vitrage Graph, it informs the Evaluator Engine of the change. The engine will then search for templates relevant to this change and compare the pattern specified in each template to the new graph structure. For each pattern match found, execute the actions specified in the template.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;The templates are saved in NetworkX graph-base in memory DB.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The functionality added here for &lt;strong&gt;managing&lt;/strong&gt; templates should have a corresponding set of API calls for users to perform these actions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;API with Vitrage Graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API with Vitrage Notifier&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 15 Feb 2016 00:00:00 </pubDate></item><item><title>Vitrage Get Topology API</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-api-get-topology.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/vitrage-api-get-topology"&gt;https://blueprints.launchpad.net/vitrage/+spec/vitrage-api-get-topology&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage needs to supply an api for listing a full or partial resources and alarms topology.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We would like to be able to retrieve the Vitrage topology, which will include both the resources and their appropriate alarms&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create API to retrieve the resources and alarms topology :&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Retrieve the full topology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List partial topology with filter :&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Full connected components of a given element&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connected component of a given element, filtered according to edges of specific type(s) (i.e., labels and properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;section id="list-versions"&gt;
&lt;h4&gt;List Versions&lt;/h4&gt;
&lt;p&gt;Lists the supported versions of the Vitrage API.&lt;/p&gt;
&lt;section id="get"&gt;
&lt;h5&gt;GET /&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="headers"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="path-parameters"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="query-parameters"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-body"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="request-examples"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;
&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;135.248.19.18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8999&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b8882ba2ec44295bf300aecb2caa4f7&lt;/span&gt;
&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="response"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="status-code"&gt;
&lt;h4&gt;Status code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="response-body"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns a JSON object with a ‘links’ array of links of supported versions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="response-examples"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"versions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"v1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                 &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http://135.248.19.18:8999/v1/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
               &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CURRENT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-11-29"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="get-topology"&gt;
&lt;h4&gt;Get  topology&lt;/h4&gt;
&lt;p&gt;Get the topology for the node.
Its possible to filter the edges vertices and depth of the
graph&lt;/p&gt;
&lt;section id="get-v1-0-topology"&gt;
&lt;h5&gt;GET /v1.0/topology/&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h4&gt;Headers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;X-Auth-Token (string, required) - Keystone auth token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept (string) - application/json&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="id2"&gt;
&lt;h4&gt;Path Parameters&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id3"&gt;
&lt;h4&gt;Query Parameters&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;edges (string(255), optional) - name of edges to filter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vertices (string, optional) - name of vertices to filter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;depth (int, optional) - the depth of graph required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;graph type ([tree,graph], optional) - The type of graph required
defaults to graph&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="id4"&gt;
&lt;h4&gt;Request Body&lt;/h4&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id5"&gt;
&lt;h4&gt;Request Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;GET /v1/topology/?graph_type=tree&amp;amp;depth=4&amp;amp;edges=vm&amp;amp;edges=host&amp;amp;edges=zone
&amp;amp;vertices=contains
Host: 135.248.19.18:8999
Content-Type: application/json
X-Auth-Token: 2b8882ba2ec44295bf300aecb2caa4f7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="id6"&gt;
&lt;h5&gt;Response&lt;/h5&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="id7"&gt;
&lt;h4&gt;Status Code&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;200 - OK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;400 - Bad request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="id8"&gt;
&lt;h4&gt;Response Body&lt;/h4&gt;
&lt;p&gt;Returns a JSON object that describes a graph with nodes
and links. If a tree representation is asked then returns
a Json tree with nodes and children.&lt;/p&gt;
&lt;p&gt;An error of cannot represent as a tree will be return if the
graph is not a tree. (400 - Bad request)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id9"&gt;
&lt;h4&gt;Response Examples&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"host4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RUNNING"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"host1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"zone0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RUNNING"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"host6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"host0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RUNNING"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vm6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"host3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"zone1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"SUBOPTIMAL"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"node1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RUNNING"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dan-ofek &amp;lt;&lt;a class="reference external" href="mailto:dan.ofek%40alcatel-lucent.com"&gt;dan&lt;span&gt;.&lt;/span&gt;ofek&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Depends on the blueprints of the graph and the synchronizer&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tempest tests also need to be added to test “get full topology” and “get partial topology” API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new api should be documented&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 27 Dec 2015 00:00:00 </pubDate></item><item><title>Vitrage CLI</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-cli.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/python-vitrageclient/+spec/vitrage-cli"&gt;https://blueprints.launchpad.net/python-vitrageclient/+spec/vitrage-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage Project introduces a Root Cause Analysis (RCA) engine
for organizing, analyzing and expanding OpenStack alarms &amp;amp; events.&lt;/p&gt;
&lt;p&gt;In order to communicate with Vitrage a command line utility can be used
that will issue some REST command to the API service.&lt;/p&gt;
&lt;p&gt;The CLI will use a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python-vitrageclient&lt;/span&gt;&lt;/code&gt; which is a client library built
on the Vitrage API.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-----------------+&lt;/span&gt;                     &lt;span class="o"&gt;+-----------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;CLI&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;RCA&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Vitrage&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;vitrage&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;CRUD&lt;/span&gt; &lt;span class="n"&gt;Templates&lt;/span&gt; &lt;span class="o"&gt;|+--------------------&amp;gt;&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;service&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Topology&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------------+&lt;/span&gt;                     &lt;span class="o"&gt;+-----------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As a user I would like to be able to see the root cause of any alerts or events in the system.
A command line utility will be used to communicate with Vitrage API service.
The CLI will 3 types of commands:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;RCA - find the root cause for an alert/event&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRUD Templates -  Create/Read/Update/Delete Templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Topology - get the topology of the system&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The CLI and the vitrage client is part of a new project for Root Cause Analysis
called vitrage&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;No data is stored or cached.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Will implement the api of vitrage-api service&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versioning-impact"&gt;
&lt;h3&gt;Versioning impact&lt;/h3&gt;
&lt;p&gt;Discuss how your change affects versioning and backward compatibility:&lt;/p&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The User will be able to interact using any HTTP rest client.
The User will also have a UI.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployer-impact"&gt;
&lt;h3&gt;Deployer impact&lt;/h3&gt;
&lt;p&gt;A new project called Vitrage will deploy the vitrage client and CLI&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;A new UI will be added to Horizon to support the Vitrage project
a separate blueprint will be supplied.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;All code will be tested.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Vitrage"&gt;Vitrage project&lt;/a&gt;
the get topology api blueprint &lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/get-topology-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/get-topology-api&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 21 Dec 2015 00:00:00 </pubDate></item><item><title>Vitrage Support for Deduced Alarms</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-support-deduced-alarms.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/support-deduced-alarms"&gt;https://blueprints.launchpad.net/vitrage/+spec/support-deduced-alarms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage should support raising deduced alarms.
When an alarm is raised on a certain resource, we might conclude that it results in problems in other related
resources. In this case, we would like to raise deduced alarms on these other resources, even if we got no indication
of a problem from other sources of information.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are cases where we know that a failure in one resource should result in problems in other resources. For example,
high CPU load on a host may cause suboptimal performance of all instances running on this host, thus performance
problems in the applications running on these instances. As far as Nova is concerned, all instances are up and
running, and there is no indication of a problem.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The Vitrage Evaluator serves as workflow manager controlling the analysis and activation of templates and execution
of template actions. One of its responsibilities is to listen to changes in Vitrage Graph, and upon a change execute
the matching templates. This is a general mechanism that should work for all kinds of templates and perform several
kinds of actions.&lt;/p&gt;
&lt;p&gt;The aim of this blueprint is to make sure deduced alarms functionality works properly end to end.&lt;/p&gt;
&lt;p&gt;Whenever a new alarm is raised, Vitrage Graph is updated with a new vertex for this alarm, connected to the relevant
resource. Then, the vitrage evaluator engine looks for templates that could match this new alarm. If deduced alarms
templates are found, the engine will try to find a full match for the entire template in Vitrage Graph. If found,
the engine will ask the notifier to raise new alarms according to the template.&lt;/p&gt;
&lt;p&gt;Example for a graph with deduced alarms:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Original&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;+-----------+&lt;/span&gt;               &lt;span class="o"&gt;+------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="n"&gt;High&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;on&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;CPU&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+-----------&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Host&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------+&lt;/span&gt;               &lt;span class="o"&gt;+-----+------+&lt;/span&gt;
                                  &lt;span class="o"&gt;|&lt;/span&gt;
                                  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt;
&lt;span class="n"&gt;Deduced&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;                     &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                         &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------+&lt;/span&gt;               &lt;span class="o"&gt;+-----&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;on&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Suboptimal&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+-----------&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Instance&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Performance&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-----------+&lt;/span&gt;               &lt;span class="o"&gt;+------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat_afek &amp;lt;&lt;a class="reference external" href="mailto:ifat.afek%40alcatel-lucent.com"&gt;ifat&lt;span&gt;.&lt;/span&gt;afek&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The blueprint includes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Define the exact syntax for deduced alarms templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call the notifier to raise alarms&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Vitrage Graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vitrage Engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vitrage Notifier&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This change needs to be tested by unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Vitrage"&gt;https://wiki.openstack.org/wiki/Vitrage&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 16 Nov 2015 00:00:00 </pubDate></item><item><title>Vitrage RCA Support</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/vitrage-support-rca.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/support-rca"&gt;https://blueprints.launchpad.net/vitrage/+spec/support-rca&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vitrage should support RCA calculation.
This feature will allow us to track the cause-and-effect path of an alarm raised in OpenStack. In order to track the
local causal relationships between alarm-pairs we shall use one or more RCA templates which will specify which alarms
cause which alarms.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In case of a major failure in the system, we might get a lot of alarms, which will be hard to track. We would like to
identify the root cause of the alarms, so the user can focus on understanding and fixing this alarm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The Vitrage Evaluator serves as workflow manager controlling the analysis and activation of templates and execution
of template actions. One of its responsibilities is to listen to changes in Vitrage Graph, and upon a change execute
the matching templates. This is a general mechanism that should work for all kinds of templates and perform several
kinds of actions.&lt;/p&gt;
&lt;p&gt;The aim of this blueprint is to make sure RCA functionality works properly end to end.&lt;/p&gt;
&lt;p&gt;Whenever the Vitrage Graph is updated, we will calculate RCA and optionally connect alarm vertices with “causes” edges.
When RCA relations are queried for a certain alarm (i.e. which alarm(s) caused it and which alarm(s) were caused by it),
we will traverse the already-existing “causes” edges and return the RCA tree.&lt;/p&gt;
&lt;p&gt;Example for a graph with causes edges:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt; &lt;span class="o"&gt;+---------------+&lt;/span&gt;              &lt;span class="o"&gt;+-------------+&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;on&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+----------&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;switch&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;+------+--------+&lt;/span&gt;              &lt;span class="o"&gt;+-------+-----+&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;causes&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;attached&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;                               &lt;span class="n"&gt;v&lt;/span&gt;

 &lt;span class="o"&gt;+---------------+&lt;/span&gt;              &lt;span class="o"&gt;+-------------+&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;on&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+----------&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;host&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;+------+--------+&lt;/span&gt;              &lt;span class="o"&gt;+-------+-----+&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;causes&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt;                               &lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;                               &lt;span class="n"&gt;v&lt;/span&gt;

 &lt;span class="o"&gt;+---------------+&lt;/span&gt;              &lt;span class="o"&gt;+-------------+&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;on&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;+----------&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;instance&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;+---------------+&lt;/span&gt;              &lt;span class="o"&gt;+-------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could re-calculate the RCA relationship whenever someone queries it, but this would be inefficient. Calculating
in advance and keeping the results in Vitrage Graph makes more sense.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The API is defined in a separate blueprint: &lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/rca-api"&gt;https://blueprints.launchpad.net/vitrage/+spec/rca-api&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Performance should be tested.
Most of the performance risk is in the common blueprints like &lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/networkx-graph-driver"&gt;https://blueprints.launchpad.net/vitrage/+spec/networkx-graph-driver&lt;/a&gt;
(see also &lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/networkx-performance-improvement"&gt;https://blueprints.launchpad.net/vitrage/+spec/networkx-performance-improvement&lt;/a&gt;). However, we will also need
to have specific tests for RCA.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="horizon-impact"&gt;
&lt;h3&gt;Horizon impact&lt;/h3&gt;
&lt;p&gt;We should develop horizon UI plugin for viewing the RCA relationship. This should be described in a separate blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ifat_afek &amp;lt;&lt;a class="reference external" href="mailto:ifat.afek%40alcatel-lucent.com"&gt;ifat&lt;span&gt;.&lt;/span&gt;afek&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The blueprint includes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Define the exact syntax for RCA templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mark the causal relationship between two alarms. We would implement it using an action that adds a “causes” edge between the alarm vertices in Vitrage Graph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define and implement the method to query the RCA relations for a given alarm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Vitrage Graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vitrage Engine&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This change needs to be tested by unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Vitrage"&gt;https://wiki.openstack.org/wiki/Vitrage&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 16 Nov 2015 00:00:00 </pubDate></item><item><title>Vitrage Resource Processor</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/entity-graph-change-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/entity-graph-change-notifications"&gt;https://blueprints.launchpad.net/vitrage/+spec/entity-graph-change-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When the Entity Graph is changed, different services would like to be informed of the change, and perform operations
accordingly.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When the Entity Graph is changed, different services would like to be informed of the change, and perform operations
accordingly. Such as:
(1) When edges vertices are added removed, the Vitrage Evaluator will run the subgraph matching algorithm on the
graph to find the templates which are matching and perform required actions.
(2) When properties of existing edges vertices are modified, this can also impact subgraph matching outcome and thus
the Vitrage Evaluator will need to be notified.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;For each CRUD operation on the Entity Graph, we will support adding listeners that can be notified, and receive updates
when each change occurs. The update must include information about each change.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;alexey_weyl &amp;lt;&lt;a class="reference external" href="mailto:alexey.weyl%40alcatel-lucent.com"&gt;alexey&lt;span&gt;.&lt;/span&gt;weyl&lt;span&gt;@&lt;/span&gt;alcatel-lucent&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 11 Nov 2015 00:00:00 </pubDate></item><item><title>NetworkX Graph driver</title><link>http://specs.openstack.org/openstack/vitrage-specs/specs/mitaka/networkx-graph-driver.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/vitrage/+spec/networkx-graph-driver"&gt;https://blueprints.launchpad.net/vitrage/+spec/networkx-graph-driver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Graph Driver is the defined API for access and manipulation of the underlying graph used for storing the Entity Graph.
This API should be implemented for the NetworkX graph package and possibly for other graph tools, allowing Vitrage a seamless transition between different underlying graph implementations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Vitrage will have a graph data structure that will hold a list of physical and virtual entities and their relationships to one another, in what we call the Entity Graph.
The specific implementation of this graph should be interchangeable allowing a stateless or state-full implementations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Graph Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a Graph Driver, which defines a set of graph methods, to be implemented over NetworkX.
This blueprint describes the addition of the Graph Driver and NetworkX Driver.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;                                   &lt;span class="o"&gt;+-------------------+&lt;/span&gt;
                                   &lt;span class="o"&gt;|&lt;/span&gt;                   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------+&lt;/span&gt;       &lt;span class="o"&gt;+-------&amp;gt;&lt;/span&gt;   &lt;span class="n"&gt;NetworkX&lt;/span&gt; &lt;span class="n"&gt;Driver&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;                   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Graph&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;Impl&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;+-------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|-------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;Driver&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;+-------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;                   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+------------------+&lt;/span&gt;       &lt;span class="o"&gt;+-------&amp;gt;&lt;/span&gt;   &lt;span class="n"&gt;Other&lt;/span&gt; &lt;span class="n"&gt;Drivers&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;
                                   &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BulbFlow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                                   &lt;span class="o"&gt;+-------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Specification of the Graph Driver API:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Note that the entity graph is a property graph, where edges and vertices can also have a set of key-value properties, which can be added, updated and removed as well.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;Graph CRUD&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;init&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;num_of_edges&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;num_of_vertices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;copy //deep copy of the graph&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;Vertex CRUD&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add_vertex&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add_vertices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_vertex&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_vertex&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove_vertex&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;Edges CRUD&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add_edge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_edge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_edge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove_edge&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;Graph algorithms&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;subgraph_matching (sub-graph isomorphism)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BFS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DFS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;strong&gt;2. NetworkX Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NetworkX is a pure python library for graphs. It is stateless and suitable for operation on large real world graphs.
The NetworkX Driver will implement Graph Driver&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:
None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create the GraphDriver skeleton&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement Graph Driver for NetworkX&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing of GraphDriver over NetworkX&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This change needs to be tested by unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Tue, 10 Nov 2015 00:00:00 </pubDate></item></channel></rss>