<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"><channel><title>heat-specs</title><link>https://specs.openstack.org/openstack/heat-specs</link><description /><language>en</language><copyright>2026, OpenStack Foundation</copyright><item><title>Add Template “Capabilities” Annotation/Resolution/Introspection</title><link>https://specs.openstack.org/openstack/heat-specs/specs/backlog/resource-capabilities.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/resource-capabilities"&gt;https://blueprints.launchpad.net/heat/+spec/resource-capabilities&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also related to &lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/interface-types"&gt;https://blueprints.launchpad.net/heat/+spec/interface-types&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add an optional annotation to HOT which enables a template author to
define that a template implements/provides particular capabilities.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, the environment resource_registry provides an extremely flexible
but completely unconstrained interface for mapping type aliases to
implementation.&lt;/p&gt;
&lt;p&gt;This makes it difficult for those wishing to use the resource_registry for
composition, in particular if you wish to offer users the choice to pick
a particular implementation of a provider resource template.&lt;/p&gt;
&lt;p&gt;For example, consider this workflow:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Choose parent template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose a set of other templates and environments (or have this
programmatically generated, for instance by pulling templates from one or
more known locations/paths).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect that group to figure out the resource-type level
capabilities/options. These are the first major choices a user will make to
determine the nested stack implementations for each type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The user selects a nested stack choice for each one that has more than one
choice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reinspect given those major options for the full set of parameters such
that the user may be prompted for mandatory and optional parameters,
including those not exposed by the top-level parent template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The user enters in values for all of the parameters and the stack gets
created.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The topic of this spec is steps 3 and 4 above.
&lt;a class="reference external" href="https://review.openstack.org/#/c/197199"&gt;https://review.openstack.org/#/c/197199&lt;/a&gt; discusses step 5. The other steps
are already possible.&lt;/p&gt;
&lt;p&gt;The discussion below focuses on the TripleO use case, since that is what is
motivating this work (TripleO makes very heavy use of template composition via
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt;). However, the feature should be generally useful to
anyone wishing to use the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt; to build a complex environment
from a tree of interrelated templates via the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s an example of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt; mapping used for TripleO
controller node implementation:&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;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet/controller-puppet.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Net::SoftwareConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;net-config-bridge.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::ControllerPostDeployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet/controller-post-puppet.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::ControllerConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet/controller-config.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Ports::ExternalPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;network/ports/noop.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Ports::InternalApiPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;network/ports/noop.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Ports::StoragePort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;network/ports/noop.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Ports::StorageMgmtPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;network/ports/noop.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::Ports::TenantPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;network/ports/noop.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller::CinderBackend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;extraconfig/controller/noop.yaml&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can see that there are a large number of choices (and this is only a tiny
subset of the full environment), with no way for a UI to determine what
are valid choices for any of the mappings.  It would be beneficial to
describe directly in the template what valid implementations are, such that
they may be discovered by UI/CLI tools and constrained at validation time.&lt;/p&gt;
&lt;p&gt;Taking the above as a worked example, there are multiple choices to be made:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configuration Tool type (all &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;puppet/*.yaml&lt;/span&gt;&lt;/code&gt; resource)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NIC configuration (physical network, e.g bridged, bonded, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Port assignement (overlay network, where &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ports/noop.yaml&lt;/span&gt;&lt;/code&gt; assigns all
ports to a common network)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choice of (potentially multiple CinderBackend implementations)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For simplicity, the examples below will consider only the choice between puppet
and some other implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed change covers three areas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#capabilities-annotations"&gt;&lt;span class="std std-ref"&gt;Annotation&lt;/span&gt;&lt;/a&gt; - How to convey the relationship between a
resource type and templates that may potentially fufill the type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#capabilities-resolution"&gt;&lt;span class="std std-ref"&gt;Resolution&lt;/span&gt;&lt;/a&gt; - How Heat can use user settings on the stack
to choose the most applicable template to fulfill a resource type from a
list of options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#capabilities-introspection"&gt;&lt;span class="std std-ref"&gt;Introspection&lt;/span&gt;&lt;/a&gt; - How a UI can programmatically use the
annotations to present the user with an interface in which to select an
option for each eligible resource type.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The remainder of this change is broken up into those three sections. It should
be noted that all three are not necessary for a minimal viable feature. It is
possible that the implementation for mitaka only covers, for example, the
annotations and introspection APIs necessary for the user to understand the
“schema” (for lack of a better word) around selecting template implementations
for a stack.&lt;/p&gt;
&lt;section id="annotation"&gt;
&lt;span id="capabilities-annotations"/&gt;&lt;h3&gt;Annotation&lt;/h3&gt;
&lt;p&gt;Add an optional template annotation, inspired by the TOSCA
“substitution_mappings” interface &lt;a class="footnote-reference brackets" href="#id3" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, which allows an optional new block in
HOT templates where template authors may declare that a template provides a
particular set of capabilities.&lt;/p&gt;
&lt;p&gt;There are two slightly different uses of the capabilities annotation being
proposed.&lt;/p&gt;
&lt;section id="tag-based"&gt;
&lt;h4&gt;Tag-Based&lt;/h4&gt;
&lt;p&gt;For example, there may be multiple valid implementations of
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::TripleO::Controller&lt;/span&gt;&lt;/code&gt;. For the Puppet-based implementation, the
capabilities annotation on the template will indicate it:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-10-15&lt;/span&gt;

&lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;deployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The syntax used here is similar to that defined in the TOSCA spec but the names
have been adjusted to better match existing HOT conventions. The capabilities
section will not be strictly validated; it will be possible to add extra
key/value pairs that are not specified in the environment, such that templates
may be portable.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="type-based"&gt;
&lt;span id="capabilities-annotation-type"/&gt;&lt;h4&gt;Type-Based&lt;/h4&gt;
&lt;p&gt;It also may be possible to use these annotations for client-side discovery
of the list of valid templates to be passed via the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt; by
specifically referencing the name of the resource type the template may be
used as a mapping for:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-10-15&lt;/span&gt;

&lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::TripleO::Controller&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This should support a list as TripleO has already seen an example of templates
that can be used as either the computer or controller hooks:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-10-15&lt;/span&gt;

&lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="p p-Indicator"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;TripleO&lt;/span&gt;&lt;span class="p p-Indicator"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;ControllerPostDeployment&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="p p-Indicator"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;TripleO&lt;/span&gt;&lt;span class="p p-Indicator"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;ComputePostDeployment&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="resolution"&gt;
&lt;span id="capabilities-resolution"/&gt;&lt;h3&gt;Resolution&lt;/h3&gt;
&lt;p&gt;In the environment, an optional new “requires” section will be
added and support for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt; keys containing a list of
multiple implementations. Heat will then be able to resolve the
implementation that should be chosen by matching the environment
requires to the list of possible templates with (hopefully matching)
capabilities. A validation error will be thrown should either zero or multiple
implementations be found.&lt;/p&gt;
&lt;p&gt;For example, expanding on the examples from the previous section, take the
following environment file:&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;requires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;deployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet&lt;/span&gt;

&lt;span class="nt"&gt;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;puppet/controller.yaml&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;docker/controller.yaml&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;Adding annotations to the two referenced templates, we have:&lt;/p&gt;
&lt;p id="capabilities-ex-puppet"&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;puppet/controller.yaml&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-10-15&lt;/span&gt;

&lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;deployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;puppet&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p id="capabilities-ex-docker"&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;docker/controller.yaml&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-10-15&lt;/span&gt;

&lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;deployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Putting these three files together, Heat would use the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;capabilities&lt;/span&gt;&lt;/code&gt; section
to determine which of the two &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;controller.yaml&lt;/span&gt;&lt;/code&gt; files to use.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="introspection"&gt;
&lt;span id="capabilities-introspection"/&gt;&lt;h3&gt;Introspection&lt;/h3&gt;
&lt;p&gt;The functionality described in the &lt;a class="reference internal" href="#capabilities-annotations"&gt;&lt;span class="std std-ref"&gt;Annotation&lt;/span&gt;&lt;/a&gt; section
provides enough information for Heat to provide a series of introspection
queries to facilitate the user experience.&lt;/p&gt;
&lt;section id="specific-type-query"&gt;
&lt;h4&gt;Specific Type Query&lt;/h4&gt;
&lt;p&gt;Given a specific resource type name, the Heat API should be able to return a
list templates that claim to support that type (note: this is contingent on
using the &lt;a class="reference internal" href="#capabilities-annotation-type"&gt;&lt;span class="std std-ref"&gt;Type-Based&lt;/span&gt;&lt;/a&gt; annotation style described
above).&lt;/p&gt;
&lt;p&gt;A potential example of the output of such a query through the Heat client
is below:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$&lt;span class="w"&gt; &lt;/span&gt;heat&lt;span class="w"&gt; &lt;/span&gt;capabilities-find&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resource_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OS::TripleO::Controller&lt;span class="w"&gt; &lt;/span&gt;./*
puppet/controller.yaml
docker/controller.yaml
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This would recurse from the current directory inspecting the capabilities in
each template, returning a list of those which match the capabilities required
(with the possibility of passing multiple &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-c&lt;/span&gt;&lt;/code&gt; options if necessary).
This makes multiple implementations discoverable on the client side.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="capabilities-summary"&gt;
&lt;h4&gt;Capabilities Summary&lt;/h4&gt;
&lt;p&gt;There is also a need to have Heat analyze a series of templates and
environments, returning a list of all capabilities that can be specified:&lt;/p&gt;
&lt;p&gt;For example, given the &lt;a class="reference internal" href="#capabilities-ex-puppet"&gt;&lt;span class="std std-ref"&gt;Puppet&lt;/span&gt;&lt;/a&gt; and
&lt;a class="reference internal" href="#capabilities-ex-docker"&gt;&lt;span class="std std-ref"&gt;Docker&lt;/span&gt;&lt;/a&gt; example templates above:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$&lt;span class="w"&gt; &lt;/span&gt;heat&lt;span class="w"&gt; &lt;/span&gt;template-capabilities&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;puppet/controller.yaml&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;                             &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;docker/controller.yaml
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which would return:&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;'deployment'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'puppet'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'docker'&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;A similar version of the call exists if the
&lt;a class="reference internal" href="#capabilities-annotation-type"&gt;&lt;span class="std std-ref"&gt;Type-Based&lt;/span&gt;&lt;/a&gt; annotation is used:&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;'OS::TripleO::Controller'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'puppet/controller.yaml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="s1"&gt;'docker/controller.yaml'&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;The operator or UI then knows that these are the options which may be
resolved in order for the stack to be created.  Note this is related to
but not the same as the spec posted related to recursive validation &lt;a class="footnote-reference brackets" href="#id4" id="id2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;,
which is about exposing the parameters required for stack create,
not the options related to a valid composition.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;API v. Client-side&lt;/p&gt;
&lt;p&gt;The original iteration of this spec spoke in terms of having the Heat client
walk the template tree and perform the introspections described. It has since
been changed to refer to the Heat API, moving the logic server-side and
allowing non-Python clients access to this functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;p class="rubric"&gt;References&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/csd03/TOSCA-Simple-Profile-YAML-v1.0-csd03.html#_Toc419746122"&gt;http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/csd03/TOSCA-Simple-Profile-YAML-v1.0-csd03.html#_Toc419746122&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/197199"&gt;https://review.openstack.org/#/c/197199&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The main alternative discussed (see previous revision of this patch) was
adding constraints to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt;, such that valid mappings may
be defined inside the environment.  This idea was rejected because of the
desire for a more discoverable interface (e.g look for valid implementations
vs a rigidly defined list of constraints).&lt;/p&gt;
&lt;p&gt;A subsequent proposal was also rejected, which focussed on only matching
a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_type&lt;/span&gt;&lt;/code&gt; annotation in the templates, it was suggested that this
was insufficiently granular and not flexible enough.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;The implementation will require adding the new capabilities
annotation to the Mitaka HOT version, this will be optional and if
it is omitted the existing behavior will be maintained.&lt;/p&gt;
&lt;p&gt;Then support will be added to the environment to enable lists to be
passed via the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_registry&lt;/span&gt;&lt;/code&gt;, and resolved via a new requires
section.&lt;/p&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee(s):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;shardy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jdob&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-2&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;section id="changes-to-engine"&gt;
&lt;h4&gt;Changes to Engine&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update HOT to support optional new capabilities annotation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update environment code to allow lists for resource_registry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update environment to process capabilities section to filter lists&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="changes-to-heatclient"&gt;
&lt;h4&gt;Changes to heatclient&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support to python-heatclient for parsing a tree of templates, returning
a list of valid templates for a specified capability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for passing files/environment to get required capabilities&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-changes"&gt;
&lt;h4&gt;Documentation Changes&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Document new interfaces in template guide docs/HOT spec.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&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;
</description><pubDate>Thu, 04 Jun 2020 00:00:00 </pubDate></item><item><title>Support simple json format in os::mistral::workflow handle signal</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/mistral-wf-signal-json-format.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/mistral-wf-signal-json-format"&gt;https://blueprints.launchpad.net/heat/+spec/mistral-wf-signal-json-format&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently the resource os::mistral::workflow expects a specific json format
when it is signaled (either using the alarm-url or the resource-signal API
call). Since external systems don’t always enable the user to change the body
of the request they send, the workflows are not able to use the information
sent by these systems.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When signaling the OS::Mistral::Workflow resource, from an external system,
or even from ceilometer, the signaling request may have a predefined body,
which is not compatible with the json format expected by the workflow resource.
The os::mistral::workflow expects the body to be in this 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;"input"&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="s2"&gt;"params"&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="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;however, ceilometer, for example, sends this body in the request:&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;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"alarm_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"my-alarm"&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;"insufficient data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"alarm_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"895fe8c8-3a6e-48bf-b557-eede3e7f4bbd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1 datapoints are unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"reason_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s2"&gt;"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;"most_recent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&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;"threshold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s2"&gt;"disposition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"unknown"&lt;/span&gt;
     &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"previous"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This causes the problem that the workflow can’t use the information in the
request body.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The suggested change is to enable the workflow resource to parse the request
body as a simple json map, where each key will be treated as an input value.&lt;/p&gt;
&lt;p&gt;This change will not break backward compatibility as the user can choose how
the body would be parsed in the stack template.&lt;/p&gt;
&lt;p&gt;The proposal is to add a new property “use_request_body_as_input” to
os::mistral::workflow, when this property is defined in the template and is
True, then the parsing of the signal request body will be parsed as a
simple json map. If the property is not defined or defined to False, the body
will be parsed as it always has (expecting the keys “input” and “params”).&lt;/p&gt;
&lt;p&gt;Since the external systems using this signal send a predefined request, we
can assume that they are unaware of the fact they are signaling a workflow,
and so, they don’t have the need to pass “params” which is mistral workflow
specific. The params can be defined in the stack template but overriding
them using the request, will not be enabled in this case.&lt;/p&gt;
&lt;p&gt;For example in order for a workflow resource to use information from a
ceilometer alarm, it’s definition in the stack template would be something
like this:&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;my_workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::Workflow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;use_request_body_as_input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;current&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;alarm_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&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="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;reason_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;!!null&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&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;When the resource is being signaled it will check for the existence of the
“use_request_body_as_input” property and based on its definition, it will
parse the request body, to find the appropriate input values.&lt;/p&gt;
&lt;p&gt;It is worth noting that if the workflow resource is created with the property
“use_request_body_as_input” set to True, then the workflow “params” cannot
be passed to the request.&lt;/p&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;noa-koffman&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Change workflow resource to parse the request in the appropriate way based
on resource definition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add tests to see that both old and new functionality are working.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Thu, 04 Jun 2020 00:00:00 </pubDate></item><item><title>New Cinder Quota Resource Type</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/cinder-quota-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/cinder-quota-resource"&gt;https://blueprints.launchpad.net/heat/+spec/cinder-quota-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An administrator would like the ability to specify a project’s default
cinder quota in HOT template. This blueprint proposes to create a new heat
resource type for cinder volume quotas.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Today, an administrator can create a new keystone project using heat
using a template similar to this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Role&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_role&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Project&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_project&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::User&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_user&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;default_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&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;However, to specify the default cinder quota associated with the project,
the administrator would need to execute post-orchestration something
similar to:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$&lt;span class="w"&gt; &lt;/span&gt;cinder&lt;span class="w"&gt; &lt;/span&gt;--os-volume-api-version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;quota-update&lt;span class="w"&gt; &lt;/span&gt;--gigabytes&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;num_gb&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--volumes&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;num_volumes&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;project_id&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;p&gt;As an Openstack admin, I would like to manage projects holistically. Templates
that will define the project, the users to project membership and the allocated
quotas.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes to add a new resource type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Cinder::Quota&lt;/span&gt;&lt;/code&gt;
to heat to address the problem described.  A sample &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Cinder::Quota&lt;/span&gt;&lt;/code&gt;
template:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cinder_quota&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Cinder::Quota&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;gigabytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;num_gigabytes&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;num_volumes&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;snapshots&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;num_snapshots&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cinder_quota_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cinder_quota&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;&lt;strong&gt;Properties&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;project:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: OpenStack keystone project&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;gigabytes:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of disk spaces (in Gigabytes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;contraints&lt;/strong&gt;: Range minimum is -1&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;volumes:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: Quota for the number of volumes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;contraints&lt;/strong&gt;: Range minimum is -1&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;snapshots:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: Quota for the number of snapshots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;contraints&lt;/strong&gt;: Range minimum is -1&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will add a default policy rule for this resource to be limited to
administrators.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s2"&gt;"resource_types:OS::Cinder::Quota"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:project_admin"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This Quota Resource will handle create, update, and delete. For handling
create and update, the resource will call the Cinder client’s quota-set update
method, since there is no quota create call. For the handling delete, the
Resource will call the Cinder client’s quota delete method. This will reset the
quota to the default value. Note that creating multiple resources and deleting
one will reset the quota even though other resources still exist.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The administrator or the operator can change a project’s default quota manually
post project orchestration.&lt;/p&gt;
&lt;p&gt;The OS::Keystone::Project can contain an optional Quota property. However,
the addition seems out of Keystone’s scope, since Keystone has no concept of
quotas.&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:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Julian Sy - syjulian&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Yosef Hoffman - yohoffman&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andy Hsiang - yh418t&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton&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 resource type OS::Cinder::Quota&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement appropriate unit and functional tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document the new resource type&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;
</description><pubDate>Thu, 04 Jun 2020 00:00:00 </pubDate></item><item><title>New Neutron Quota Resource Type</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/neutron-quota-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/neutron-quota-resource"&gt;https://blueprints.launchpad.net/heat/+spec/neutron-quota-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An administrator would like to have the ability to specify a project’s
neutron quota in a HOT template. This blueprint proposes to create a new
heat resource type for neutron quotas.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Today, an administrator can create a new keystone project using heat
using a template similar to this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Role&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_role&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Project&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_project&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::User&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_user&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;default_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&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;However, to specify the neutron quota associated with the project, the
administrator would need to execute post-orchestration something
similar to:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$&lt;span class="w"&gt; &lt;/span&gt;os&lt;span class="w"&gt; &lt;/span&gt;quota&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--floating-ips&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--networks&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--subnets&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;project&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;p&gt;For an Openstack admin, it would be ideal to be able to manage projects
holistically, using templates that will define the project, the users to
project membership and the allocated quotas.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes to add a new resource type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Neutron::Quota&lt;/span&gt;&lt;/code&gt;
to heat to address the problem described. A sample &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Neutron::Quota&lt;/span&gt;&lt;/code&gt;
template:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;neutron_quota&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Neutron::Quota&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;floating_ips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;health_monitors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;pools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;rbac_policies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;routers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;security_groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;security_group_rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;subnetpools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;vips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;neutron_quota_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;neutron_quota&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;&lt;strong&gt;Properties&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;project:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: OpenStack keystone project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Must be a valid keystone project&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;floating_ips:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of floating IPs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;health_monitors:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of health monitors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;members:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of members&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;networks:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of networks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;pools:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of pools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;ports:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of ports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;rbac_policies:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of RBAC policies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;routers:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of routers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;security_groups:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of security groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;security_group_rules:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of security group rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;subnetpools:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of subnet pools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;subnets:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of subnets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;vips:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of vips&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A default policy rule will be added for this resource to be limited to
administrators.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s2"&gt;"resource_types:OS::Neutron::Quota"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:project_admin"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This Quota Resource will handle create, update, and delete. For handling
create and update, the resource will call the Neutron client’s quota-set update
method, since there is no quota create call. For the handling delete, the
Resource will call the Neutron client’s quota delete method. This will reset
the quota to the default value. Note that creating multiple resources and
deleting one will reset the quota even though other resources still exist.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The administrator or the operator can change a project’s default quota manually
post project orchestration.&lt;/p&gt;
&lt;p&gt;The OS::Keystone::Project can contain an optional Quota property. However,
the addition seems out of Keystone’s scope, since Keystone has no concept of
quotas.&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:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Yosef Hoffman - yohoffman&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Julian Sy - syjulian&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andy Hsiang - yh418t&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-1&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 resource type OS::Neutron::Quota&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement appropriate unit and functional 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;
</description><pubDate>Thu, 04 Jun 2020 00:00:00 </pubDate></item><item><title>New Nova Quota Resource Type</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/nova-quota-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/nova-quota-resource"&gt;https://blueprints.launchpad.net/heat/+spec/nova-quota-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An administrator would like to have the ability to specify a project’s nova
quota and a project user’s nova quota in a HOT template. This blueprint
proposes to create a new heat resource type for nova quotas.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Today, an administrator can create a new keystone project using heat
using a template similar to this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Role&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_role&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::Project&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_project&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;test_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Keystone::User&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_user&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;default_project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_role&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test_project&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;However, to specify the nova quota associated with the project, the
administrator would need to execute post-orchestration something similar to:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$&lt;span class="w"&gt; &lt;/span&gt;os&lt;span class="w"&gt; &lt;/span&gt;quota&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--cores&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--ram&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;51200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;project&amp;gt;
$&lt;span class="w"&gt; &lt;/span&gt;nova&lt;span class="w"&gt; &lt;/span&gt;quota-update&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;user&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;--floating-ips&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;project&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;p&gt;For an Openstack admin, it would be ideal to be able to manage projects
holistically, using templates that will define the project, the users to
project membership and the allocated quotas of projects and users.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes to add a new resource type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Nova::Quota&lt;/span&gt;&lt;/code&gt;
to heat to address the problem described. A sample &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Nova::Quota&lt;/span&gt;&lt;/code&gt;
template:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;nova_user_quota&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Nova::Quota&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;project&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;cores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;fixed_ips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;floating_ips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;injected_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;injected_file_content_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;injected_file_path_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;key_pairs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;metadata_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;security_groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;security_group_rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;server_groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;server_group_members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;

&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;nova_user_quota_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nova_user_quota&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;&lt;strong&gt;Properties&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;project:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: OpenStack keystone project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Must be a valid keystone project&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;user:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;: OpenStack keystone user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Must be a valid keystone user&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;cores:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of cores&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;fixed_ips:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of fixed IPs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;floating_ips:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of floating IPs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;instances:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;injected_files:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of injected files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;injected_file_content_bytes:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of injected file content bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;injected_file_path_bytes:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of injected file path bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;key_pairs:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of key pairs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;metadata_items:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of metadata items&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;ram:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the amount of ram (in megabytes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;security_groups:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of security groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;security_group_rules:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of security group rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;server_groups:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of server groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&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;server_group_members:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt;:  Quota for the number of server group members&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;constraints&lt;/strong&gt;: Range minimum is -1&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a user is provided, then the user’s quota for that project will be
updated. Otherwise, the project’s quota will be updated.&lt;/p&gt;
&lt;p&gt;A default policy rule will be added for this resource to be limited to
administrators.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s2"&gt;"resource_types:OS::Nova::Quota"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:project_admin"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This Quota Resource will handle create, update, and delete. For handling
create and update, the resource will call the Nova client’s quota-set update
method, since there is no quota create call. For the handling delete, the
Resource will call the Nova client’s quota delete method. This will reset the
quota to the default value. Note that creating multiple resources and deleting
one will reset the quota even though other resources still exist.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The administrator or the operator can change a project’s default quota manually
post project orchestration.&lt;/p&gt;
&lt;p&gt;The OS::Keystone::Project can contain an optional Quota property. However,
the addition seems out of Keystone’s scope, since Keystone has no concept of
quotas.&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:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Yosef Hoffman - yohoffman&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Julian Sy - syjulian&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andy Hsiang - yh418t&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-1&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 resource type OS::Nova::Quota&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement appropriate unit and functional 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;
</description><pubDate>Thu, 04 Jun 2020 00:00:00 </pubDate></item><item><title>Support Neutron Trunk resource</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/support-trunk-port.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-trunk-port/"&gt;https://blueprints.launchpad.net/heat/+spec/support-trunk-port/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add Heat support for Neutron trunk resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Neutron introduced a new resource called &lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/vlan-aware-vms"&gt;trunk&lt;/a&gt; in the Newton release. This
resource makes possible to connect a VM to multiple Neutron networks using a
single port called trunk parent port.&lt;/p&gt;
&lt;p&gt;A typical workflow for using a trunk is the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Prepare the used networks and ports:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-sh notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;net0
openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;net1
openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;net2
openstack&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--network&lt;span class="w"&gt; &lt;/span&gt;net0&lt;span class="w"&gt; &lt;/span&gt;port0
openstack&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--network&lt;span class="w"&gt; &lt;/span&gt;net1&lt;span class="w"&gt; &lt;/span&gt;port1
openstack&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--network&lt;span class="w"&gt; &lt;/span&gt;net2&lt;span class="w"&gt; &lt;/span&gt;port2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a trunk and set &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port0&lt;/span&gt;&lt;/code&gt; as a parent port:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-sh notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;trunk&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--parent-port&lt;span class="w"&gt; &lt;/span&gt;port0&lt;span class="w"&gt; &lt;/span&gt;trunk0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port1&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port2&lt;/span&gt;&lt;/code&gt; to the trunk and set segmentation type and ID:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-sh notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;trunk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--subport&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;port1,segmentation-type&lt;span class="o"&gt;=&lt;/span&gt;vlan,segmentation-id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;101&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trunk0
openstack&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;trunk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--subport&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;port2,segmentation-type&lt;span class="o"&gt;=&lt;/span&gt;vlan,segmentation-id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;102&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trunk0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Launch a VM by adding the parent port (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port0&lt;/span&gt;&lt;/code&gt;) only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The VM can access to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;net0&lt;/span&gt;&lt;/code&gt; using untagged traffic, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;net1&lt;/span&gt;&lt;/code&gt; using VLAN ID
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;101&lt;/span&gt;&lt;/code&gt;, and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;net2&lt;/span&gt;&lt;/code&gt; using VLAN ID &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;102&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This Blueprint proposes a change to support Neutron trunks in Heat by
introducing a new Heat resource: OS::Neutron::Trunk&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement a new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Neutron::Trunk&lt;/span&gt;&lt;/code&gt; resource under
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;engine/resources/openstack/neutron/&lt;/span&gt;&lt;/code&gt; with the following properties and
attributes:&lt;/p&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: The name of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&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;parent_port:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: ID or Name of the parent port&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: ‘neutron.port’&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;subports:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: List with 0 or more map elements containing subport details&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: list; List contents: Map value expected&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Map properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;port:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;description: ID or name of a port to be used as a subport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: ‘neutron.port’&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;segmentation_type:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;description: may be required by certain drivers like OVS, although at
this time only vlan is supported&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: custom constraint ‘neutron.trunk_segmentation_type’&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;segmentation_id:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;description: The segmentation ID on which the subport network is
presented to the instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: custom constraint ‘neutron.trunk_segmentation_id’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: A description of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&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;admin_state_up&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: Administrative state of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: Boolean&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;admin_state_up: The administrative state of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name: Name of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;port_id: ID of the trunk parent port&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;revision_number: The revision number of the trunk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sub_ports: A list of maps containing the details of port(s) associated with
the trunk&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the above change a user can use trunks by creating a HOT template similar
to the following:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my_trunk&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Neutron::Trunk&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;My_Trunk&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;parent_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my_parent_port&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;subports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my_subport&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;          segmentation_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vlan&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;          segmentation_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;101&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my_2nd_subport&lt;/span&gt;&lt;span class="p p-Indicator"&gt;},&lt;/span&gt;
&lt;span class="nt"&gt;          segmentation_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vlan&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;          segmentation_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;102&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&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;Neutron allows its backends to refuse trunk creation with a parent port already
bound. As of Newton and Ocata only the Open vSwitch backend has this
limitation. Other backends can create a trunk on both unbound and bound parent
ports. But with the OVS backend the trunk has to be created before the instance
is booted.&lt;/p&gt;
&lt;p&gt;If a user wants to write backend agnostic templates and there’s at least one
backend with the above limitation they should always create the trunk before
they boot the instance.&lt;/p&gt;
&lt;p&gt;To make sure that the trunk is created first, the trunk parent port should be
referenced by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt; as shown in the following example:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my_instance&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Nova::Server&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;my_trunk&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent_port&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The referencing method should be documented carefully as nothing prevents the
user from assign the trunk’s parent port directly to the instance, which
would result in a missing dependency relationship.&lt;/p&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&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nilles&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Additional assignees:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;botond-zoltan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;etthdvi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pike-1&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&gt;
&lt;li&gt;&lt;p&gt;Implement a new resource type: &lt;cite&gt;OS::Neutron::Trunk&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a custom constraint: &lt;cite&gt;neutron.trunk_segmentation_type&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a custom constraint &lt;cite&gt;neutron.trunk_segmentation_id&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement functional tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;Add sample templates to heat-templates repo&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A template with a trunk resource and some supports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An example where the subport(s) and the parent port has the same MAC
address; Explain in a comment why is this useful, refer to the
relevant Neutron documentation [1].&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl&gt;
&lt;dt&gt;Document changes:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add a release note to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;releasenotes/notes&lt;/span&gt;&lt;/code&gt; about the new resource type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a subsection to the Hot Template Guide about the new trunk resource,
and explain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the correct reference for the trunk: use &lt;cite&gt;get_attr&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if a port defined as a trunk subport it may not be added to an
instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mention that the MAC addresses of the subport and the parent port may
be the same, otherwise the user could have connectivity issues; Refer
to the relevant Neutron documentation [1].&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h3&gt;References:&lt;/h3&gt;
&lt;p&gt;[1]: &lt;a class="reference external" href="https://github.com/openstack/openstack-manuals/blob/master/doc/networking-guide/source/config-trunking.rst#using-trunks-and-subports-inside-an-instance"&gt;https://github.com/openstack/openstack-manuals/blob/master/doc/networking-guide/source/config-trunking.rst#using-trunks-and-subports-inside-an-instance&lt;/a&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;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 01 Nov 2018 00:00:00 </pubDate></item><item><title>The title of your blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/rocky/rocky-template.html</link><description>

&lt;p&gt;Include the URL of your story in StoryBoard:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://storyboard.openstack.org/#!/story/$STORY_ID"&gt;https://storyboard.openstack.org/#!/story/$STORY_ID&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introduction paragraph – why are we doing anything?&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&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 where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;Include where in the heat tree hierarchy this will reside.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Heat REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&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;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name &amp;lt;email&amp;gt; or None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can optionally can list additional ids if they intend on doing
substantial implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rocky-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;Include specific references to specs and/or blueprints in heat, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 28 Jun 2018 00:00:00 </pubDate></item><item><title>Heat template migrate resources’ properties</title><link>https://specs.openstack.org/openstack/heat-specs/specs/backlog/heat-template-migrate-properties.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-template-port"&gt;https://blueprints.launchpad.net/heat/+spec/heat-template-port&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Heat does not provide api/cli to migrate the given template from old heat
version to later.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat is being released inline with each Openstack release and there is a chance
that resource properties and attributes might have changed and/or deprecated
across these releases. A user may wish to migrate the template to current
version which was created during earlier version say juno. Currently heat
does not support it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Heat already having mechanism to define the translation rule for each of the
properties being deprecated by using translation.TranslationRule.
This is being implemented in resource plugins in order to support migration
to new property in place of deprecated one.&lt;/p&gt;
&lt;p&gt;This feature could be updated with below command&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt; &lt;span class="pre"&gt;orchestration&lt;/span&gt; &lt;span class="pre"&gt;template&lt;/span&gt; &lt;span class="pre"&gt;migrate&lt;/span&gt; &lt;span class="pre"&gt;-t&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;template-file&amp;gt;&lt;/span&gt; &lt;span class="pre"&gt;--output-format&lt;/span&gt;
&lt;span class="pre"&gt;[json|yaml]&lt;/span&gt; &lt;span class="pre"&gt;--output-file&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;output-file&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This command will migrate the given template file and will write the template
output mentioned in output-format.&lt;/p&gt;
&lt;p&gt;Command will provide messages of changes made to the deprecated properties in
below 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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;details&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;where:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;resource-path&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Gives the resource path in the given template.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;property&lt;/em&gt;:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Property name to migrate to current version.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;action&lt;/em&gt;:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;One of add, replace or delete.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;details&lt;/em&gt;:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Provides additional details about deprecation, if any.&lt;/p&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&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;kanagaraj-manickam
ananta&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-1&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;For those deprecated properties in resource plugins, add translation rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required API and test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update the python-openstackclient with new CLI as mentioned above.&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;
</description><pubDate>Fri, 15 Sep 2017 00:00:00 </pubDate></item><item><title>Add lock and unlock stack actions</title><link>https://specs.openstack.org/openstack/heat-specs/specs/backlog/lock-stack.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/lock-stack"&gt;https://blueprints.launchpad.net/heat/+spec/lock-stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As application vendors deploy their applications using heat stacks, they
can currently use automatic processes such as ceilometer alarms,
auto-scaling groups, etc…, as well as manual processes such as stack-update.
In some cases ,for example manual maintenance of the application,
actions done on the stack can interrupt and prolong the maintenance period.
A lock on the stack to disable and block these types of processes should
solve this issue.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;use cases:&lt;/p&gt;
&lt;p&gt;1. application vendors are interested in a “maintenance mode” for their
application. When in maintenance no topology changes are permitted.
For example a maintenance mode is required for a clustered DB app that needs a
manual reboot of one of its servers - when the server reboots
all the other servers are redistributing the data among themselves which causes
high CPU levels which in turn might cause an undesired scale
out (which will cause another CPU spike and so on…).&lt;/p&gt;
&lt;p&gt;2. some cloud-admins have a configuration stack that initializes the cloud
(Creating networks, flavors, images, …) and these resources should always
exist while the cloud exists. Locking these configuration stacks, will
prevent someone from accidentally deleting/modifying the stack or its resources
.&lt;/p&gt;
&lt;p&gt;This feature might even raise in significance, once convergence phase 2 is in
place, and many other automatic actions are performed by heat. The ability to
manually perform admin actions on the stack with no interruptions is important.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposal is to add a “Lock” operation to be performed on the stack. Similar
to: nova server “lock” or glance-image “–is-protected” flag. Once a stack is
locked, the only operations allowed on the stack is “unlock” or “lock” which
in order to change locking level - heat engine should reject any stack
operations and ignore signals that modify the stack (such as scaling) and
optionally its underlying resources.&lt;/p&gt;
&lt;p&gt;This API calls would be additional to the stack-actions API, of ‘lock’ and
‘unlock’.&lt;/p&gt;
&lt;p&gt;The lock operation should have a “level” flag with possible values of
{all, stacks} (default = all)
when level = stacks: perform heat lock - which would lock the stack and
all nested stacks (actions on the “physical” resources are still permitted).
this means any action on the stack or it’s nested stack will be blocked. but
other stack resources will not be locked.
When level = all: perform heat lock and enable lock/protect for each stack
resource that supports it (nova server, glance image,…).&lt;/p&gt;
&lt;p&gt;The lock operation should only be called once the stack is in a final state,
(a state which is not “IN_PROGRESS”, not “INIT_COMPLETE” and not
“DELETE_COMPLETE”).
when the api call is successful it will return with response code 200.
when calling the api when the stack is in an invalid state it will return a
response code 409.&lt;/p&gt;
&lt;p&gt;The unlock operation can only be called on a stack that is either locked or
failed to lock/unlock. The ability to call the unlock api both when locking
or unlocking failed, is important for transient issues that leave the stack
in a “dirty” state and we want to bring it back to it’s previous healthy one.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;In the future we might want to enable interrupting or rolling
back running processes (such as retry of stack-create or scaling) and
locking the stack, instead of waiting for the running process to finish.&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;noa-koffman
melisha
avi-vachnis&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;Changes to API:
- Support ‘lock’ and ‘unlock’ actions in the existing stack-action API.
- locking a stack, will be called by stack actions api:
HTTP POST /v1/{tenant_id}/stacks/{stack_name}/{stack_id}/actions
with the following body:
{
“lock”:{“level”: stacks }
}
- unlocking a stack will be called similarly with the following body:
{
“unlock”: null
}&lt;/p&gt;
&lt;p&gt;Changes to engine:
Develop a lock stack logic in heat which prevents stack actions
(suspend/resume), update-stack, auto-scaling,…, from taking place.
In the future we might add additional locking modes, to enable locking the
stack
from action but allowing auto-scaling or suspend and resume actions.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the stack’s ACTIONS will now contain two new actions (“LOCK” and “UNLOCK”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;new methods will be created for locking and unlocking a stack, which will&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;be similar to the suspend and resume methods.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;similarly to the existing (suspend and resume) stack actions, the new&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;methods will trigger calls to a “handle_lock” and “handle_unlock” method
in the stack resources. for resources that will not implement locking,
this method will not have any actual affect.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;appropriate stack and stack-resources states (LOCK_IN_PROGRESS,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;LOCK_COMPLETE, LOCK_FAILED, UNLOCK_IN_PROGRESS, UNLOCK_COMPLETE,
UNLOCK_FAILED) should be added.
allowed actions for each state are as follows:
LOCK_IN_PROGRESS: none
LOCK_COMPLETE: unlock, lock (in order to enable changing the locking level)
LOCK_FAILED: unlock, delete, lock
UNLOCK_COMPLETED: all actions except for unlock.
UNLOCK_FAILED: delete, unlock
UNLOCK_IN_PROGRESS: none&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;Any action of the engine on the stack, except unlocking a stack, will&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;only start after validating the stack is not locked.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;the engine should validate the stack status is in an appropriate state&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;before starting the lock process.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changes to client:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;action-lock command will be added this will include the “lock resources”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;the action-lock command will allow passing the “level” parameter using a&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;“–level” flag (which will be added), similar to stack-create command.
usage: heat action-lock &amp;lt;Name or ID of stack&amp;gt; –level=stacks&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;action-unlock command will be added used the same as action-suspend and&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;action-resume, with no parameter flags.
usage: heat action-unlock &amp;lt;Name or ID of stack&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Documentation changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;update developer.openstack.org/api-ref-orchestration-v1.html with the&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;additions to stack actions api&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add the lock stack design to wiki.openstack.org&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;add the lock and unlock actions to developers api docs:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;in …/heat/sourcecode/heat/heat.api.openstack.v1.actions.html&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&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;
</description><pubDate>Thu, 14 Sep 2017 00:00:00 </pubDate></item><item><title>The title of your blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/queens/queens-template.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/heat/+spec/example"&gt;https://blueprints.launchpad.net/heat/+spec/example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introduction paragraph – why are we doing anything?&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&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 where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;Include where in the heat tree hierarchy this will reside.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Heat REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&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;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can optionally can list additional ids if they intend on doing
substantial implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;queens-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;Include specific references to specs and/or blueprints in heat, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Aug 2017 00:00:00 </pubDate></item><item><title>Custom Resource type managed by Mistral Workflows</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/custom-resource-mistral-workflows.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/mistral-new-resource-type-workflow-execution"&gt;https://blueprints.launchpad.net/heat/+spec/mistral-new-resource-type-workflow-execution&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Allow users to define custom resource types by implementing their actions as
Mistral workflows.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat resource types are defined by Python plugins. If users want to manage some
resource that cannot be handled by the available plugins, for example a
resource external to OpenStack, they currently need to deploy software on a
server somewhere in order to manage that resource.&lt;/p&gt;
&lt;p&gt;If we provide a plugin where the actions are handled by Mistral workflows
defined by the user, then we can allow our users to manage custom resources
within Heat’s normal operation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed resource type would be defined in a template as follows:&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;custom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::ExternalResource&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;CREATE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;create_workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;create_my_custom_thing&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;update_workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;DELETE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;delete_workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;foo1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;123&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;foo2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;456&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;replace_on_change_inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;foo2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;always_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;actions - map of actions to workflows. Allowed actions are CREATE, UPDATE,
DELETE, SUSPEND, and RESUME. All actions are optional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;workflow - Workflow name or id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;params - Params to pass to the Mistral workflow execution. The parameters
depend on the workflow type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;input - values to be passed as inputs to the workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replace_on_change_inputs - a list of input names for which changes in the
input value should cause the resource to be replaced instead of updated
in-place. In this case we’ll run the CREATE workflow on the replacement
resource followed by the DELETE workflow on the existing one, instead of the
UPDATE workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;always_update - if true, the UPDATE action will always run on update, even
if there is no change in the inputs. Defaults to false.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;output - Workflow execution outputs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;For each Heat action, the resource plugin will start an execution of the
specified workflow (if any) and wait for it to complete. The output will be
collected and stored, in the CREATE and UPDATE actions. If the execution fails,
the resource action will also fail.&lt;/p&gt;
&lt;p&gt;If the outputs contain a key named &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_id&lt;/span&gt;&lt;/code&gt;, Heat will treat this as the
physical ID of the resource. This is the value returned by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_resource&lt;/span&gt;&lt;/code&gt;
intrinsic function.&lt;/p&gt;
&lt;p&gt;For actions other than CREATE, the current outputs will be passed in the
Mistral environment with the key &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat_extresource_data&lt;/span&gt;&lt;/code&gt;. If an environment
is already specified by the user in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;params&lt;/span&gt;&lt;/code&gt; then this key will be merged in.
Each time a workflow completes, its outputs will be merged into the ‘current’
outputs, so that not every action needs to regurgitate all of the previous
outputs to avoid losing existing data..&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It’s really hard to know what a good name is. It’s not clear whether this
resource belongs in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Mistral::&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Heat::&lt;/span&gt;&lt;/code&gt; namespaces, for a
start. Decent names might include ‘ExternalResource’, ‘CustomResource’,
‘WorkflowResource’.&lt;/p&gt;
&lt;p&gt;The SoftwareComponent resource allows specifying multiple actions for each
config. The equivalent here might look something 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="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;workflows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;CREATE&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;create_workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;CREATE&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UPDATE&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;update_workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;DELETE&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;delete_workflow&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;However, it’s unclear how to correctly handle the outputs when there are
multiple workflows per action. Take the output of the first action? The last
one? Some combination? Given that it’s already easy to call a workflow from
another workflow, it seems better to put this in the user’s hands and require
them to specify only one workflow per action. Mistral is designed for workflows
to call each other.&lt;/p&gt;
&lt;p&gt;The equivalent in CloudFormation, AWS::CloudFormation::CustomResource using
Lambda to manage the external resource, allows the Lambda function to determine
&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html#w1ab2c19c12d105c21"&gt;when to replace the resource&lt;/a&gt;. If it returns a new resource ID then the
resource is deemed to have been replaced, and the old one is then deleted. This
would be difficult to replicate in Heat - while a resource can raise
UpdateReplace at any time during an update, there is no mechanism for
preserving the data returned by the update workflow execution and storing it in
the &lt;em&gt;new&lt;/em&gt; resource. (Also, it would be strange if the replacement resource did
not run the CREATE workflow.) Therefore we have chosen to force the user to
choose upfront when to replace the resource based on changing input parameters,
even though this is significantly less flexible (although Lambda functions are
easier to write than Mistral workflows, so the flexibility would come with
significant complexity too).&lt;/p&gt;
&lt;p&gt;In the future we could add a separate should-update-replace workflow step, to
allow the user to run a workflow that returns True to replace or False to
update in-place.&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;gfidente
therve&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pike-2&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 new resource type&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;
</description><pubDate>Fri, 17 Mar 2017 00:00:00 </pubDate></item><item><title>Implement Zun resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/zun-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-plugin-zun"&gt;https://blueprints.launchpad.net/heat/+spec/heat-plugin-zun&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint proposes to add support for Zun resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Zun is a container management service that is currently not supported by
Heat. Resources will be added to Heat to support:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Container, an application container&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;Zun resources will be added to zun directory
in heat/engine/resources/openstack/zun/**
Zun client plugin will be added for communication with Zun, which has
his own requirements. Following resources will be added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add the following resource plugin:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Zun::Container resource&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false
-update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;image&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: true&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;command&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;cpu&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: int
-required: false
-update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;memory&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false
-update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;environment&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: map
-required: false
-default: {}&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;workdir&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;labels&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: map
-required: false
-default: {}&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;image_pull_policy&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false
-choices: [never, always, ifnotpresent]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;restart_policy&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: string
-required: false&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;interactive&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-type: boolean
-required: false
-default: false&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&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&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;&amp;lt;&lt;a class="reference external" href="mailto:sitlani.namrata%40yahoo.in"&gt;sitlani&lt;span&gt;.&lt;/span&gt;namrata&lt;span&gt;@&lt;/span&gt;yahoo&lt;span&gt;.&lt;/span&gt;in&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Pike&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 Zun client plugin for Heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Container to resources&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;
</description><pubDate>Fri, 27 Jan 2017 00:00:00 </pubDate></item><item><title>The title of your blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/pike-template.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/heat/+spec/example"&gt;https://blueprints.launchpad.net/heat/+spec/example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introduction paragraph – why are we doing anything?&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&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 where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;Include where in the heat tree hierarchy this will reside.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Heat REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&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;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can optionally can list additional ids if they intend on doing
substantial implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pike-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;Include specific references to specs and/or blueprints in heat, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 23 Jan 2017 00:00:00 </pubDate></item><item><title>StackDefinition class</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/stack-definition.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-definition"&gt;https://blueprints.launchpad.net/heat/+spec/stack-definition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Encapsulate all data about the definition of the stack - including the
template, parameter values, resource attributes &amp;amp; reference IDs - in a class
and use that in intrinsic functions instead of the Stack object itself.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A number of problems arise from the fact the we pass the
heat.engine.stack.Stack object representing the stack to Template.parse() (and
thence to the Function objects) in order to provide access to data needed to
define the stack.&lt;/p&gt;
&lt;p&gt;The main issue is that the so-called ‘lightweight stack’, used in convergence
when performing a check on a single resource, is not particularly lightweight.
In particular, in order for the resource being checked to use an attribute or
resource ID from another resource we create a heat.engine.resource.Resource
object for every resource in the stack. This occurs even though the actual
values we need are passed in over RPC and none of the Resource object’s data is
actually loaded from the database, nor any of its code used. Eliminating
loading the data from the database reduced memory use by 10%, and further
savings are likely from not creating O(n^2) Resource objects in the course of a
graph traversal.&lt;/p&gt;
&lt;p&gt;In addition, using the Stack object in this way makes it extremely unclear what
part of the interface is stable for the purposes of third-party Template
plugins and their associated Functions. Developers don’t know which aspects of
the Stack interface they need to preserve across versions, and plugin
developers don’t know what they can rely on. Many of the potential operations
that the Stack class makes possible may, in fact, be horrifically inefficient
in the convergence architecture, or may become so in future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create a new StackDefinition class that encapsulates the data needed to define
the stack. Pass this object to Template.parse() in place of the Stack object.&lt;/p&gt;
&lt;p&gt;When a resource is accessed via the StackDefinition, return a ResourceProxy
object that contains the pertinent data only.&lt;/p&gt;
&lt;p&gt;For all intents and purposes, the initial API will comprise whatever parts of
the Stack and Resource classes that are currently used by intrinsic functions
in the HOT or Cfn Template plugins. Existing interfaces will be maintained, so
that no code changes are required for any plugins using this subset of the
functionality. This includes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Template&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Environment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Parameter values&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resources&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reference ID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DB ID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UUID&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Parent (facade) resource&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Metadata&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Template&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In convergence when checking a resource, only those other resources on which
there is a direct dependency will have a proxy available, and only attributes
required by the current resource (as returned by the function.dep_attrs()
function) will have values available.&lt;/p&gt;
&lt;p&gt;Unless mentioned specifically above, no other data will be available from the
StackDefinition. This will potentially break third-party Template plugins, but
it is impossible to know to what extent this is a problem due to the undefined
surface area of the current stable API. However, anything relying on behaviour
outside of the proposed API is quite possibly highly inefficient, and
completely untested in upstream Heat. On balance, it’s worth tolerating this
breakage, early in a development cycle, in order to move to a guaranteed stable
API. Third-party Template plugin developers have the opportunity to weigh in on
this spec with requests.&lt;/p&gt;
&lt;p&gt;Future changes to the API (beyond Pike) will require a deprecation period.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Just put up with it the way it is?&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;zaneb&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pike-1&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;Encapsulate in a NodeData class the data that convergence records about a
node in the graph after traversing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teach Resource to generate its own NodeData.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a ParentResourceProxy to encapsulate data about the facade resource
and potentially load it independently of the parent stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the Stack’s template and other data into a StackDefinition class and
proxy any requests for that data to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the NodeData after processing each Resource in the legacy path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pass the StackDefinition in place of the Stack to Template.parse().&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;
</description><pubDate>Mon, 23 Jan 2017 00:00:00 </pubDate></item><item><title>Property translation mechanism fixing and improving</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/fix-translation-mechanism.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/heat/+bug/1620859"&gt;https://bugs.launchpad.net/heat/+bug/1620859&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently translation mechanism has several mistakes, depended on modifying
data before it’s using - so functions cannot be correctly translated; heavy
dependence on HOT and Cfn functions; muddy code full of tricks. This spec is
designed to discuss with community better way to re-implement translation
mechanism.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Translation mechanism (TM) has been implemented in Kilo, refactored in Newton
and still works incorrectly. There are several cases, which should be mandatory
fixed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;TM incorrectly handles functions - if TM found function in the middle of
translation path, it doesn’t resolve it and raises error, because cannot
get next item in translation path. For example, if property &lt;cite&gt;networks&lt;/cite&gt;
equals function, and translation path equals to &lt;cite&gt;[networks, network]&lt;/cite&gt;,
then &lt;cite&gt;network&lt;/cite&gt; won’t get in case of function has no get method.&lt;/p&gt;
&lt;p&gt;Current workaround suggests just to skip such translation rules, where
there is such situation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TM modifies properties data before it’s using, which is useless. At first,
modifying data is unsafe. At second, if first step will be fixed,
functions resolved and return resolved data every time they called, so
translations cannot work with them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TM depends on HOT and Cfn template formats - this makes it impossible for
third-party template format plugins to be first-class citizens in Heat, as
they are liable to break whenever someone adds a translation rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TM code has many muddy and tricky places, which should be facilitated and
made clearer.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;Before suggesting solution need to note, that changes concerned translation
mechanism, but don’t translation rules and how they specified in resource
plugins for support third-party resources.&lt;/p&gt;
&lt;p&gt;Next changes should fix TM and improve it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Make translation phase during getting properties. It assume that functions
will be resolved before translation, properties will always return
translated value.&lt;/p&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;&lt;p&gt;improve currently useless &lt;em&gt;name&lt;/em&gt; variable in &lt;cite&gt;Property&lt;/cite&gt; class, which
will store full name of property, for example &lt;cite&gt;networks.network&lt;/cite&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;operate with translation rules inside of properties - store TM object
and pass it to properties sub-schemas;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;call translation before cast to defined property type - if there’s any
translation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store translated result for already called properties - it helps doesn’t
translate property every time it’s called. Translated values will be
stored by full name as &lt;cite&gt;networks.network&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Result should not stored during validation phase.&lt;/p&gt;
&lt;p&gt;Also, instead of storing translated result in explicitly in some dict,
we can use cache instead, but there could be issues, like in &lt;a class="reference external" href="https://bugs.launchpad.net/heat/+bug/1609787"&gt;LP#1609787&lt;/a&gt;
bug.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refactor and facilitate huge code of TM due to previous steps try to do
code more clear to understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional tests to cover different risky cases.&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;Change current version TM, adding fixes for mentioned problems.&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;prazumovsky&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-3&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;Move making translation during properties get.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refactor TM to clear code and fix unnecessary dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional tests to cover risky cases.&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;
</description><pubDate>Mon, 14 Nov 2016 00:00:00 </pubDate></item><item><title>Update OS::Nova::Flavor Resource Type to Support Multi-project private flavors</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/nova-flavor-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/nova-flavor-resource"&gt;https://blueprints.launchpad.net/heat/+spec/nova-flavor-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An administrator would like the ability to associate a flavor with multiple
projects that are not the one’s creating the flavor. This blueprint proposes
an update to an existing resource type, nova flavor.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The traditional OS::Nova::Flavor allows the definition of a private
flavor, but it only associates the flavor with the project making
the request. This change allows the resource type to be used by an
Admin user to associate a private flavor with multiple projects that
are not the one’s creating the flavor.&lt;/p&gt;
&lt;p&gt;This feature becomes necessary in a large Openstack cloud operator where
there might be dozens or hundreds of regions. Managing flavors manually
across multiple regions becomes untenable. The notion of building tools that,
via orchestrating, help manage this largely distributed environment is what
the purpose of this enhancement is.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes to alter an existing resource type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Nova::Flavor&lt;/span&gt;&lt;/code&gt;
in heat to address the problem described. This will be done by taking the
existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;flavor.py&lt;/span&gt;&lt;/code&gt; and updating the resource type.&lt;/p&gt;
&lt;p&gt;From that file we will add &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PROJECTS&lt;/span&gt;&lt;/code&gt; to the list of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PROPERTIES&lt;/span&gt;&lt;/code&gt; as well
as its schema. The schema will look something like:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LIST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'List of projects.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;update_allowed&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;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&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;An alternative would be to add the association to each project manually.&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:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Chris Martin - cm876n&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional Assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Tanvir Talukder - tanvirt&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-2&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 changes to resource type OS::Nova::Flavor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement unit and functional tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document changes to existing resource type&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;
</description><pubDate>Tue, 18 Oct 2016 00:00:00 </pubDate></item><item><title>The title of your blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/ocata-template.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/heat/+spec/example"&gt;https://blueprints.launchpad.net/heat/+spec/example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introduction paragraph – why are we doing anything?&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&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 where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;Include where in the heat tree hierarchy this will reside.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Heat REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&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;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can optionally can list additional ids if they intend on doing
substantial implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;Include specific references to specs and/or blueprints in heat, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 26 Aug 2016 00:00:00 </pubDate></item><item><title>Support aodh composite alarm in heat</title><link>https://specs.openstack.org/openstack/heat-specs/specs/ocata/support-aodh-composite-alarm.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/add-aodh-composite-alarm"&gt;https://blueprints.launchpad.net/heat/+spec/add-aodh-composite-alarm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resource plugin for Aodh composite alarm.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The combination type alarm has been deprecated in aodh, because some issues
which are hard to solved. And we have deprecated OS::Aodh::CombinationAlarm
synchronously, see:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/migrate-to-use-aodh-for-alarms"&gt;https://blueprints.launchpad.net/heat/+spec/migrate-to-use-aodh-for-alarms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s recommended to use composite rule alarm which is similar with the
combination alarm in functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the following resource under resources/openstack/aodh/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Aodh::CompositeAlarm&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;description&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Description of the alarm.
- optional
- type: String
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;severity&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Severity of the alarm.
- optional
- type: Integer
- update_allowed
- constraints: one of [‘low’, ‘moderate’, ‘critical’]
- default: low&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;enabled&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;True if alarm evaluation is enabled.
- optional
- type: Boolean
- update_allowed
- default: True&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;alarm_actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A list of URLs (webhooks) to invoke when state transitions to alarm.
- optional
- type: List
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ok_actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A list of URLs (webhooks) to invoke when state transitions to ok.
- optional
- type: List
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;insufficient_data_actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A list of URLs (webhooks) to invoke when state transitions to
insufficient-data.
- optional
- type: List
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;repeat_actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;True if actions should be repeatedly notified while alarm remains
in target state.
- optional
- type: Boolean
- update_allowed
- default: True&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;time_constraints&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Describe time constraints for the alarm.
- optional
- type: List&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;composite_rule&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Composite threshold rule with JSON format.
- required
- type: Map
- update_allowed
- schema: {‘operator’: ‘or’/’and’, ‘rules’: [rule1, rule2…]}&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following is an example of composite alarm:&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;Resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;my_composite_alarm&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&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;CompositeAlarm&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;composite_rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
        &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;-&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;threshold&lt;/span&gt;
          &lt;span class="n"&gt;meter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu_util&lt;/span&gt;
          &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
          &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
          &lt;span class="n"&gt;statistic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;
          &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;
          &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ge&lt;/span&gt;
          &lt;span class="n"&gt;exclude_outliers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;-&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;threshold&lt;/span&gt;
            &lt;span class="n"&gt;meter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;
            &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
            &lt;span class="n"&gt;statistic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;
            &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;
            &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ge&lt;/span&gt;
            &lt;span class="n"&gt;exclude_outliers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
          &lt;span class="o"&gt;-&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;threshold&lt;/span&gt;
            &lt;span class="n"&gt;meter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mem_util&lt;/span&gt;
            &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
            &lt;span class="n"&gt;statistic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;
            &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;
            &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ge&lt;/span&gt;
            &lt;span class="n"&gt;exclude_outliers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
      &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;composite&lt;/span&gt; &lt;span class="n"&gt;alarm&lt;/span&gt;
      &lt;span class="o"&gt;......&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;properties&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;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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ocata-1&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 OS::Aodh::CompositeAlarm resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample template using OS::Aodh::CompositeAlarm in heat-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;
</description><pubDate>Mon, 08 Aug 2016 00:00:00 </pubDate></item><item><title>Support map_replace function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/map-replace-function.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/heat/+spec/map-replace-function"&gt;https://blueprints.launchpad.net/heat/+spec/map-replace-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint adds support for a new map_replace function.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently it’s difficult to perform key/value replacements on mappings
(e.g json parameters).  There are ways (ab)using str_replace or yaql, but
there are problems with both approaches such as avoiding partial matches
in the case of str_replace, and raising a validation error for key/value
collisions in the case of either yaql or str_replace.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This spec proposes to add a new function that can iterate over a mapping
and replace keys or values based on optional mappings for each:&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;map_replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;k1&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;k2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;K1&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;V2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In this case, the result will be evaluated to {‘K1’: ‘v1’, ‘k2’, ‘V2’}&lt;/p&gt;
&lt;p&gt;Validation checks will be added so that the replacement fails if key
collisions occur, e.g if replacing “k2” with “k1” above, the function
will fail because it’s going to overwrite an existing key.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;I tried to do this in yaql, and after some ML help I got it to work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;yaql:
   expression: let(root =&amp;gt; $) -&amp;gt; dict($root.data.service.items().select(
                                      [$[0], $root.data.ip[$[1]]]))
   data:
     service: { get_param: ServiceNetMap }
     ip: {get_param: NetIpMap}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;However this doesn’t allow for raising an error when key collisions occur,
and the syntax is pretty hard to remember.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Implement a new function and tests.&lt;/p&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;shardy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;newton-3&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement map_replace intrinsic function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add corresponding docs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add examples of usage to heat-templates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Fri, 22 Jul 2016 00:00:00 </pubDate></item><item><title>Support for the LBaaS V2</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/lbaasv2-support.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/lbaasv2-suport"&gt;https://blueprints.launchpad.net/heat/+spec/lbaasv2-suport&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently there is no support for the LBaaS V2 resources in the heat.
Add a new namespace called OS::LBaaS::* for all of the LBaaS V2 resources&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are new LBaaS V2 api in Liberty, which are needed to be supported by
heat. Since there is already LBaaS V1 api support in heat in the name space
OS::Neutron:* , we need a new namespace for the V2 api. Since LBaaS is going
be  a seperate entity in the near future, we need to do the same thing in heat
for the LBaaS V2.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We need to add the following LBaaS V2 heat resources.
1. LoadBalancer.
2. Listener.
3. Pool.
4. PoolMember.
5. HealthMonitor.&lt;/p&gt;
&lt;section id="specification"&gt;
&lt;h3&gt;Specification.&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="loadbalancer"&gt;
&lt;h3&gt;1. LoadBalancer&lt;/h3&gt;
&lt;p&gt;LBaaS V2 LoadBalancer, which creates a LoadBalancer along with the VIP.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::LBaaS::LoadBalancer&lt;/p&gt;
&lt;/section&gt;
&lt;section id="required-properties"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;vip_subnet:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Subnet ID or name of the LoadBalancer’s VIP.
String Value.
Value must be of type neutron.subnet.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="optional-properties"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of the LoadBalancer.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;description:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Description of the LoadBalancer.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;provider:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Provider of the LoadBalancer.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;vip_address:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;IP address of the LoadBalancer.
String Value.
Value must be of type ip_addr.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the LoadBalancer.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="attributes"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;provider:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Provide of the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;vip_address:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;VIP address of the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;vip_subnet_id:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;VIP’s subnet id of the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;listeners:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;List of listeners associated with the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="listener"&gt;
&lt;h3&gt;2. Listener&lt;/h3&gt;
&lt;p&gt;LBaaS V2 Listener, which creates a Listener associated with the LoadBalancer
for a particular port and protocol.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::LBaaS:: Listener&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;protocol_port:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Port of the Listener.
Integer Value.
Must be in the range of 0 to 65535&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Protocol of the Listener.
String Value.
Allowed Values - TCP, HTTP, HTTPS, TERMINATED_HTTPS&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;loadbalancer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID or name of the LoadBalancer to which Listener is associated with.
String Value.
Must be of type lbaas.loadbalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id2"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of the Listener.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;description:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Description of the Listener.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the Listener.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;default_tls_container_ref:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Default TLS container reference to retrieve TLS information.
Is mandatory if protocol is TERMINATED_HTTPS
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;sni_container_refs:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;List of TLS container references for SNI.
List Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;connection_limit:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Max number of connections a listner can take.
Intefer Value.
Update allowed.
Default value is -1.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id3"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;protocol_port:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Protocol port of the Listener.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Protocol of of the Listener.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;loadbalancers:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;List of loadBalancers associated with the Listener.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the Listener.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;default_tls_container_ref:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Default TLS container reference to retrieve TLS information.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;sni_container_refs:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;List of TLS container references for SNI.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="pool"&gt;
&lt;h3&gt;3. Pool&lt;/h3&gt;
&lt;p&gt;LBaaS V2 Pool, which creates a Pool associated with the Listener.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::LBaaS::Pool&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id4"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;lb_algorithm:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Load balancing algorithm to be used.
String Value.
Allowed Values - ROUND_ROBIN, LEAST_CONNECTIONS, SOURCE_IP
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;listener:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID or name of the listener to be associated with the Pool.
String Value.
Must be of type lbaas.listener.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Protocol of the Pool.
String Value.
Allowed Values - TCP, HTTP, HTTPS&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id5"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of the Pool.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the Pool.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;description:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Description of the Pool.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;session_persistence:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Session persistence details of the Pool.
String Value.
Update allowed.&lt;/p&gt;
&lt;p&gt;Map properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;cookie_name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of the cookie.
String Value.
Required if the type is APP_COOKIE.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type of the session persistence.
String Value.
Allowed Values -  SOURCE_IP, HTTP_COOKIE, APP_COOKIE&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id6"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the Pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;lb_algorithm:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Load balancing algorithms of the LoadBalancer.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;listeners:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;List of listener ID associated with the pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Protocol of the pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="poolmember"&gt;
&lt;h3&gt;4. PoolMember&lt;/h3&gt;
&lt;p&gt;Backend servers to be added to the Load balancing pool.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::LBaaS::PoolMember&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id7"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;pool:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID or name of the pool that this member belongs to.
String Value.
Update allowed.
Must be of type lbaas.pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;address:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;IP address of the pool member in the pool.
String Value.
Value must be of type ip_addr.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol_port:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Port on which the pool member listens for requests or connections.
Integer Value.
Must be in the range of 0 to 65535&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;subnet:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Subnet ID or name for the member.
String Value.
Must be of type neutron.subnet&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id8"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;weight:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Weight of member in the pool.
Integer Value.
Must be in the range of 0 to 256.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the PoolMember.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id9"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Administrative state of the PoolMember.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;weight:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Weight of member in the pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;address:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;IP address of the pool member in the pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;pool_id:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID of the pool that this member belongs to.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;protocol_port:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Port on which the pool member listens for requests or connections.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;subnet_id:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Subnet ID for the member.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="healthmonitor"&gt;
&lt;h3&gt;5. HealthMonitor&lt;/h3&gt;
&lt;p&gt;LBaaS V2 HealthMonitor, creates a health monitor for the Pool.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::LBaaS::HealthMonitor&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id10"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;delay:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The minimum time in milliseconds between regular connections of member.
Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;One of predefined health monitor types..
String Value.
Allowed values - PING, TCP, HTTP, HTTPS&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;max_retries:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Number of permissible connection failures before changing the member status&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;to INACTIVE.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Integer Value.
Update allowed.
Must be in the range of 1 to 10.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;timeout:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Maximum number of milliseconds for a monitor to wait for a connection to be&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;established before it times out.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;pool:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID or name of the pool tobe monitored.
String Value.
Update allowed.
Must be of type lbaas.pool.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id11"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The administrative state of the health monitor.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;http_method:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The HTTP method used for requests by the monitor of type HTTP.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;expected_codes:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The list of HTTP status codes expected in response from the member to&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;declare it healthy.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;url_path:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The HTTP path used in the HTTP request used by the monitor to test a member&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;health.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id12"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;admin_state_up:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The administrative state of this health monitor.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;delay:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The minimum time in milliseconds between regular connections of the member.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;expected_codes:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The list of HTTP status codes expected in response from the member to
declare it healthy&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;http_method:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The HTTP method used for requests by the monitor of type HTTP.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;max_retries:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Number of permissible connection failures before changing the member
status to to INACTIVE.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;timeout:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Maximum number of milliseconds for a monitor to wait for a connection to be
established before it times out.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;One of predefined health monitor types.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;url_path:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The HTTP path used in the HTTP request used by the monitor.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/neutron-lbaas"&gt;https://github.com/openstack/neutron-lbaas&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/heat"&gt;https://github.com/openstack/heat&lt;/a&gt;
&lt;a class="reference external" href="http://docs.openstack.org/developer/heat/template_guide/openstack.html"&gt;http://docs.openstack.org/developer/heat/template_guide/openstack.html&lt;/a&gt;
&lt;a class="reference external" href="http://developer.openstack.org/api-ref-networking-v2-ext.html#lbaas-v2.0"&gt;http://developer.openstack.org/api-ref-networking-v2-ext.html#lbaas-v2.0&lt;/a&gt;&lt;/p&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&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;&amp;lt;bkalebe&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Add new namespace for the following resources.
OS::LBaaS::LoadBalancer
OS::LBaaS::Listener
OS::LBaaS::Pool
OS::LBaaS::PoolMember
OS::LBaaS::HealthMonitor&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;
</description><pubDate>Fri, 08 Jul 2016 00:00:00 </pubDate></item><item><title>Properties Group</title><link>https://specs.openstack.org/openstack/heat-specs/specs/backlog/heat-property-group.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-property-group"&gt;https://blueprints.launchpad.net/heat/+spec/heat-property-group&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds PropertiesGroup for grouping set of properties of a Heat Resource plug-in.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In many of Heat resource plug-in implementations, properties are getting
defined with validation schema and there is no group concept which is required
for following reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sometimes, resource mandates to provide either PropertyA or PropertyB,
and one of them is mandatory. This can’t be defined now in Heat
Properties schema, as developer can’t set required=true for both the
properties and as part of validate() method, developer should implement
the logic whether one of these property is provided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;some plug-ins supports multiple versions of its thing, for example,
docker plug-in supports multiple versions. So some properties are only
supported in specific versions only. Now there is no generic way to
specify declaratively that some properties are required for a given client
version.&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 first problem could be solved by introducing the concept of
PropertiesGroup, which helps declarative validation as defined below:&lt;/p&gt;
&lt;p&gt;Resource class will have &lt;cite&gt;properties_groups_schema&lt;/cite&gt;, which contains list of
properties groups. Each properties group has next representation:&lt;/p&gt;
&lt;p&gt;Assume that there are two Properties: PropertyA and PropertyB, and there are
already declared with proper Property Schema. Then properties group will be
specified by logical expression in dict:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_groups_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PropertyB&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;In that way, logical expression consists of one-key dict with list-type value,
which can contain list-type properties names or properties group logical
expression. Dictionary key should be equal to one of the following operators:
“and”, “or”, “xor”.&lt;/p&gt;
&lt;p&gt;Properties groups can be nested, for example:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_groups_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AND&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="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PropertyB&lt;/span&gt;&lt;span class="p"&gt;]]},&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;propertyC&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;Here as part of ‘validation()’ phase, each of the groups in the
property_groups_schema will be validated in sequence by using the operator
across properties. This helps to bring up the complex validation logic across
dependent properties.&lt;/p&gt;
&lt;p&gt;Each group declared in the properties_groups_schema can refer the other group
in it’s properties list. So the complex validation could be:&lt;/p&gt;
&lt;p&gt;Here, each of the property entry could be defined in the form of&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[‘prp1’, ‘child_prp1’, ‘grand_child_prp1’]&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;even if property entry comprises only one item, i.e.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[‘prp1’]&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;For example, if there’s properties_schema:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;PropertySubA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="o"&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;PropertySubB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;STRING&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;Then properties_groups_schema should be next:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_groups_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PropertySubA&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PropertySubB&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;Also, properties group will support specifying API versions of &lt;cite&gt;client_plugin&lt;/cite&gt;,
used for property, i.e. property will be supported only if specified
&lt;cite&gt;client_plugin&lt;/cite&gt; API version satisfies versions in group. Then property group
will have next format:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_groups_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_VERSIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CLIENT_PLUGIN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;client_plugin&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VERSIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt; &lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;&amp;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;Example of using &lt;cite&gt;API_VERSIONS&lt;/cite&gt; as properties group:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;properties_groups_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_VERSIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CLIENT_PLUGIN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_plugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keystone'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VERSIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'1.2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2.0'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;properties_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PropertyA&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PropertyB&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;Heat engine can infer that this set of properties in the properties group is
supported only for 1.2 and 2.0 API versions, so it can check the current
&lt;cite&gt;client_plugin&lt;/cite&gt; supported and validate accordingly.&lt;/p&gt;
&lt;p&gt;Besides the validation part, all necessary changes will be added to
documentation generator to allow user learn relations between properties.&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&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&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;p&gt;Peter Razumovsky &amp;lt;prazumovsky&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Currently moved to backlog due to no community’s interest. Workable PoC placed
here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/topic:bp/property-group"&gt;https://review.openstack.org/#/q/topic:bp/property-group&lt;/a&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;Define PropertiesGroup class with required validation logic for the given
resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the resource validation logic to validate with property group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the existing resources with property_groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate property group documentation for users to understand the property
requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&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;
</description><pubDate>Thu, 23 Jun 2016 00:00:00 </pubDate></item><item><title>Register and Document Policy in Code</title><link>https://specs.openstack.org/openstack/heat-specs/specs/queens/policy-in-code.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/policy-in-code"&gt;https://blueprints.launchpad.net/heat/+spec/policy-in-code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Operators need to maintain a (possibly complex) policy.json file that might
differ only slightly from the default one,
and some values in the policy.json file are tied to config options
without explicit dependency between them.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As an operator, I would like to specify in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policy.json&lt;/span&gt;&lt;/code&gt; file only those
policies that are different from defaults.&lt;/p&gt;
&lt;p&gt;Such support was declared as cross-project OpenStack community goal
for Queens release &lt;a class="footnote-reference brackets" href="#id3" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&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;Since version 1.9.0 oslo.policy supports handling policies in the way
similar to how oslo.config handles config options &lt;a class="footnote-reference brackets" href="#id4" id="id2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.
Policies now can be declared inside Python code with provided defaults,
and registered in the policy engine.
The policy engine then loads these and the policy.json file on start,
with entries in the latter overriding the defaults specified in the code.&lt;/p&gt;
&lt;p&gt;This way, a service with default policies can run without
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policy.json&lt;/span&gt;&lt;/code&gt; file, and operators only need to fill this file in the case
their rules are different.&lt;/p&gt;
&lt;p&gt;Another nice benefit is that this allows to use values from config file in
the default policy - as example, the name of the temporary user’s role in Heat
currently is defined both in config file and default policy.json file, so
operators need to update both heat.conf and policy.json file when
changing this role.&lt;/p&gt;
&lt;p&gt;A small performance penalty during service startup is expected,
as well as marginal performance improvements during run-time,
as there’s no need to re-read a possibly large policy.json file.&lt;/p&gt;
&lt;p&gt;Sample policy file can be generated based on the registered policies
rather than needing to manually maintain one.&lt;/p&gt;
&lt;p&gt;A number of additional ways to generate policy-related files are supported
by oslo.policy &amp;gt;= 1.10:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Merged policy file - a policy file can be generated which is a merge
of registered defaults and policies loaded from a file.
This shows the effective policy in use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Redundant policies file - a list can be generated which contains policies
defined in a file which match defaults registered in code.
These are candidates for removal from the file in order to keep it
small and understandable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heat already depends on oslo.policy &amp;gt;= 1.23 in its requirements, so no bump
in dependencies is required.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None. Required to complete the cross-project goal.&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;pshchelo &amp;lt;Pavlo Shchelokovskyy&amp;gt; IRC: pas-ha&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;queens-1&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;accumulate, define and register policies in the Python code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change invocations of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Enforcer.enforce&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Enforcer.authorize&lt;/span&gt;&lt;/code&gt;
(the call signature is unchanged)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;amend genconfig tox environment to also generate sample policy.json file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove policy.json file and update DevStack / Heat’s DevStack plugin
to not use policy.json&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(see dependencies) provide configs/scripts to generate merged policy file
and redundant policy file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;amend documentation accordingly&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;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://governance.openstack.org/tc/goals/queens/policy-in-code.html"&gt;https://governance.openstack.org/tc/goals/queens/policy-in-code.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/oslo.policy/latest/user/usage.html"&gt;https://docs.openstack.org/oslo.policy/latest/user/usage.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
</description><pubDate>Thu, 23 Jun 2016 00:00:00 </pubDate></item><item><title>More flexible merging of environments</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/environment-merging.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/environment-merging"&gt;https://blueprints.launchpad.net/heat/+spec/environment-merging&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since we now support server side merging of environment files, which is good
but it only supports the same “last one wins” merge strategy that we
previously had in heatclient.&lt;/p&gt;
&lt;p&gt;In some situations more flexibility is required, e.g when composing a
deployment via multiple environment files where parameter key collisions
will occur.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Consider this scenario&lt;/p&gt;
&lt;p&gt;heat stack-create foo -f foo.yaml -e one.yaml -e two.yaml&lt;/p&gt;
&lt;p&gt;one.yaml contains&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;parameters:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ControllerServices:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Keystone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;two.yaml contains&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;parameters:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ControllerServices:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Glance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;With the current environment merging I will always get:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;parameters:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ControllerServices:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Glance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;But what I actually want is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;parameters:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ControllerServices:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Glance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;So, I need some way to specify that the heat server-side environment merging
will append to, rather than overwrite the ControllerServices parameter.
(Same problem exists for e.g json map parameters, where we probably want to
offer the option of shallow and deep merge vs just overwriting).&lt;/p&gt;
&lt;p&gt;Note this is the exact same problem faced (and fixed) by some other tools
that accept potentially overlapping sections of yaml data, such
as cloud-init[1]&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://cloudinit.readthedocs.io/en/latest/topics/merging.html"&gt;http://cloudinit.readthedocs.io/en/latest/topics/merging.html&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;Since parameters/parameter_defaults are simple key/value pairs it’s hard to
come up with an interface that adds merge strategy data within the parameters
map, so we’d probably need a separate environment section, e.g:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Specify global merge strategy for all parameters:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;merge_strategy:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;list: extend
dict: merge # we could support “merge” and “deep_merge” here?
string: append&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Specify per-parameter merge strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;merge_strategy:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;parameters:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ControllerServices: extend&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This is pretty similar to how the cloud-init “merge_how” directive works.&lt;/p&gt;
&lt;p&gt;If multiple environments specified conflicting merge_strategy values, we’d
raise a validation error.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative is basically client-side munging of templates, which would
work, but makes the templates much less portable (e.g we’ll end up
implementing a TripleO specific solution to this in tripleo-common, which
will result in our environments not working direct to heat via heatclient)&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Since jdob added support for merging a list of environment_files in
engine/service.py, this should just be a case of adding support for these
optional strategies to the _merge_environments function in that file.&lt;/p&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;ramishra&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-2&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;Update heat-engine code to support new optional merge_strategy key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comprehensive tests &amp;amp; docs for this new interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support to heatclient (not to support the merging, just to accept
the key)&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;
</description><pubDate>Thu, 16 Jun 2016 00:00:00 </pubDate></item><item><title>Enable the purge of deleted stacks for specific project</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/heat-manage-purge-deleted-tenant.html</link><description>

&lt;p&gt;Add project-id argument to heat-manage purge_deleted command in order
to be able to hard delete DB entries for a specific project.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-manage-purge-deleted-tenant"&gt;https://blueprints.launchpad.net/heat/+spec/heat-manage-purge-deleted-tenant&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently heat-manage purge_deleted command allows operators to purge
all DB entries marked as deleted and are older than an age.&lt;/p&gt;
&lt;p&gt;Usually this global purge process is setup to run periodically in a
cloud platform. However, for some specific projects, cloud operators
would like to setup the purge process with much smaller retention period.
Typical example of such project is the monitoring project that monitors
heat service.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add project-id argument for heat-manage purge_deleted command:&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="c1"&gt;# heat-manage purge_deleted --help&lt;/span&gt;
&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;heat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;manage&lt;/span&gt; &lt;span class="n"&gt;purge_deleted&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
                                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;positional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="n"&gt;age&lt;/span&gt;                   &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;long&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;preserve&lt;/span&gt; &lt;span class="n"&gt;deleted&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;            &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;granularity&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;Granularity&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;defaults&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;PROJECT_ID&lt;/span&gt;
                        &lt;span class="n"&gt;Project&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;purge&lt;/span&gt; &lt;span class="n"&gt;deleted&lt;/span&gt; &lt;span class="n"&gt;stacks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When project-id argument is set, only this project DB entries marked as deleted
will be purged. Given project-id value will not be validated, leaving
the database unchanged if incorrect.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&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;Ala Rezmerita &amp;lt;&lt;a class="reference external" href="mailto:ala.rezmerita%40orange.com"&gt;ala&lt;span&gt;.&lt;/span&gt;rezmerita&lt;span&gt;@&lt;/span&gt;orange&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-2&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 proposed change&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the corresponding functional 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;/section&gt;
</description><pubDate>Wed, 15 Jun 2016 00:00:00 </pubDate></item><item><title>OpenStack Heat Orchestration Template (HOT) Generator</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/os-hot-gen.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/os-hot-gen"&gt;https://blueprints.launchpad.net/heat/+spec/os-hot-gen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An python library used to generate a given HOT template with given version.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are different users, who needs a library to generate an valid
HOT template, as given below:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Automation&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OpenStack heat service is getting used widely in other OpenStack services such
as Murano, Magnum, Tacker, etc and some of these projects generate HOT
template during the runtime as part of the automation supported by them.&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Cloud providers&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every Cloud providers uses different designer tools for drawing topology
visually and each of these tool use it’s own way to generate the HOT template,
as heat does not provide sdk for hot template generation. It’s an redundant
effort and maintaining them over HOT template schema changes is an overhead.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;HOT template has following aspects and model each of them as python
programmable construct such as class and provide required/supporting python
api for generating HOT template by writing the python code.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Version&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;Parameters and Parameter group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resources and Properties&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intrinsic Functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outputs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An sample SDK is provided &lt;a class="reference external" href="https://github.com/mkr1481/os-hot-gen"&gt;here&lt;/a&gt; as POC.&lt;/p&gt;
&lt;p&gt;This POC has modeled almost everything of above mentioned aspects and
for functions it does provide only for get_param as an sample one, which
can be extended further for other supported functions.&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&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&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;kanagaraj-manickam&lt;/p&gt;
&lt;p&gt;jdob&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Target Milestone for completion:
newton-2&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;Make POC into stable version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new repository under OpenStack github and migrate the POC code under
it. Also, add the new repository under OpenStack heat goverenance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide example python snippets to generate sample HOT templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add option to generate the Resource properties and outputs based on given
resource type schema generated from heat service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional test cases to validate the generated HOT template using heat
template validation 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;
</description><pubDate>Mon, 13 Jun 2016 00:00:00 </pubDate></item><item><title>Migrate to use Aodh</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/migrate-to-use-aodh.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/heat/+spec/migrate-to-use-aodh-for-alarms"&gt;https://blueprints.launchpad.net/heat/+spec/migrate-to-use-aodh-for-alarms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint will migrate to use Aodh service directly for alarm resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer has moved all the alarming code and subsystem to the Aodh project:
&lt;a class="reference external" href="https://review.openstack.org/#/c/196552"&gt;https://review.openstack.org/#/c/196552&lt;/a&gt;
&lt;a class="reference external" href="https://review.openstack.org/#/c/197161"&gt;https://review.openstack.org/#/c/197161&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Although now we can use ceilometer-client to redirect to Aodh endpoint when
creating alarm resources:
&lt;a class="reference external" href="https://review.openstack.org/#/c/202938"&gt;https://review.openstack.org/#/c/202938&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But there are some reasons I believe we should to migrate to use
Aodh service directly:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Ceilometer team plans to deprecate/remove the function of redirecting,
maybe in two releases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aodh is the independent alarming service&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;1. This spec proposes to use Aodh service for alarm resources.
For mostly alarm resources (except OS::Ceilometer::CombinationAlarm)
can compatible with the current implementation.&lt;/p&gt;
&lt;p&gt;2. The problem is that we can’t manage the OS::Ceilometer::CombinationAlarm
by Aodh client, because Aodh client does not support. The combination alarm
is deprecated and disabled by default in Aodh, and the new composite rule
alarm is recommended to use. So this spec proposes to deprecate
OS::Ceilometer::CombinationAlarm and to add the new composite rule
alarm resource plug-in named ‘OS::Aodh::CompositeAlarm’&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;
&lt;a class="reference external" href="mailto:liusheng%40huawei.com"&gt;liusheng&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;newton-2&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add Aodh client plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Migrate to use Aodh service to manage the alarm resources’s lifecycle,
including threshold alarm , composite alarm, gnocchi_resources_threshold
alarm, gnocchi_aggregation_by_metrics_threshold alarm and
gnocchi_aggregation_by_resources_threshold alarm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set resource_registry to map Ceilometer alarms to Aodh alarms, to make
sure older templates with Ceilometer alarms still work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add corresponding tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify all related docs with word ‘Ceilometer’.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Tue, 24 May 2016 00:00:00 </pubDate></item><item><title>Devstack plugin support</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/devstack-plugin.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-support-devstack-plugin"&gt;https://blueprints.launchpad.net/heat/+spec/heat-support-devstack-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DevStack supports a standard mechanism for including plugins from external
repositories. So add devstack plugin for heat.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Devstack support external plugins as documented here:
&lt;a class="reference external" href="http://docs.openstack.org/developer/devstack/plugins.html"&gt;http://docs.openstack.org/developer/devstack/plugins.html&lt;/a&gt;
By enabling this plugin, we just need to properly set up devstack
local[rc] file to be able to setup heat.
A good example is ironic one:
&lt;a class="reference external" href="https://review.openstack.org/#/q/topic:ironic-devstack-plugin"&gt;https://review.openstack.org/#/q/topic:ironic-devstack-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Introduce devstack plugin.&lt;/p&gt;
&lt;p&gt;An external git repository that includes a devstack/ top level directory.
Inside this directory there can be the following files:&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;devstack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt;
        &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;
        &lt;span class="n"&gt;lib&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="n"&gt;sh&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;executed&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;devstack&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;well&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;
&lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="n"&gt;during&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Plugins&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;registered&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;adding&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;localrc&lt;/span&gt; &lt;span class="n"&gt;section&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt;
&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;They&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;

    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;localrc&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;enable_plugin&lt;/span&gt; &lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;heat&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The detailed introduction is here:
&lt;a class="reference external" href="http://docs.openstack.org/developer/devstack/plugins.html"&gt;http://docs.openstack.org/developer/devstack/plugins.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Steps to support devstack plugin in heat.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;step1: Copy devstack code to heat tree.&lt;/p&gt;
&lt;p&gt;step2: Add devstack plugin
This adds the actual devstack plugin, devstack should not run the heat code
in the devstack tree.&lt;/p&gt;
&lt;p&gt;step3: Add a heat job to use devstack plugin.
After heat has a devstack plugin in tree. Make a job to be able to test that
it works, non-voting, before we actually switch everything over and drop the
devstack code.&lt;/p&gt;
&lt;p&gt;step4. Switch all heat jobs to use devstack plugin&lt;/p&gt;
&lt;p&gt;step5. Remove heat code from project openstack-dev/devstack&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&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;dixiaoli &amp;lt;&lt;a class="reference external" href="mailto:dixiaobj%40cn.ibm.com"&gt;dixiaobj&lt;span&gt;@&lt;/span&gt;cn&lt;span&gt;.&lt;/span&gt;ibm&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-1&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;Copy devstack code to heat tree.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add devstack plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch all heat jobs to use devstack plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove heat code from project openstack-dev/devstack&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;/section&gt;
</description><pubDate>Mon, 16 May 2016 00:00:00 </pubDate></item><item><title>Enhance Heat Orchestration Over Glance Metadata</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/glance-heat-metadata-enhancements.html</link><description>

&lt;p&gt;&lt;cite&gt;bp glance-heat-metadata-enhancements
&amp;lt;https://blueprints.launchpad.net/heat/+spec/glance-heat-metadata-enhancements&amp;gt;_&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;This extends Heat’s orchestration abilities to include user-defined
key/value pairs.  This blueprint can be viewed as an extension of blueprint
&lt;cite&gt;heat-glance-image-tag-support
&amp;lt;https://blueprints.launchpad.net/heat/+spec/heat-glance-image-tag-support&amp;gt;_&lt;/cite&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;While Heat currently orchestrates many Glance image properties, its support is
incomplete. Specifically, Glance’s ability to add key/value properties to an
image at upload-time is not exposed to the HOT author.  These properties might
be used by other OpenStack components and drivers interfacing with Glance, and
are also useful for operators to learn more about the images
themselves.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Modify OS::Glance::Image to allow for user-defined key/values.  This properties
schema would have the following entry added:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PROPERTY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Arbitrary properties to associate with the image.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;update_allowed&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;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&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;As this blueprint is meant to expose Glance’s –property flag, the above schema
entry provides the form &lt;cite&gt;property: {key1: value1, key2: value2, …}&lt;/cite&gt; to the
template author.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Users wishing to apply currently unsupported metadata would need to do it after
the stack has been deployed.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Within heat/engine/resources/openstack/glance/image.py, both the PROPERTIES and
properties_schema variables would need to be modified to handle key/value
pairs.  Particularly, these key/values would be implemented as a properties
schema map.  The handle_create() method would also be extended to pass the
&lt;cite&gt;metadata&lt;/cite&gt; map to the Glance client via client.images.update. A handle_update()
method will also be implemented to avoid potentially expensive recreation of
large images.&lt;/p&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;Jaime Guerrero, &amp;lt;&lt;a class="reference external" href="mailto:jg3755%40att.com"&gt;jg3755&lt;span&gt;@&lt;/span&gt;att&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;, jaimguer&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Rusty Eddy, &amp;lt;&lt;a class="reference external" href="mailto:ge363p%40att.com"&gt;ge363p&lt;span&gt;@&lt;/span&gt;att&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;newton-2&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;Modify PROPERTIES variable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify properties_schema&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify handle_create()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement handle_update()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write tests for supported Glance and user-defined metadata&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;Since Heat is targeting migration to Glance API v2, implementation of this
blueprint will be targeted to the particular switches of that API.  Heat code
will be modified in anticipation of the features supported by Glance v2. The
blueprint for Heat’s migration to Glance v2 can be found at
&lt;cite&gt;migrate-to-glance-v2
&amp;lt;https://blueprints.launchpad.net/heat/+spec/migrate-to-glance-v2&amp;gt;_&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;Implemention will follow in the style of
&lt;cite&gt;heat-glance-image-tag-support
&amp;lt;https://blueprints.launchpad.net/heat/+spec/heat-glance-image-tag-support&amp;gt;_&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;For more information on Glance’s image metadata capabilities, please see
&lt;cite&gt;Image metadata &amp;lt;http://docs.openstack.org/image-guide/image-metadata.html&amp;gt;_&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 06 May 2016 00:00:00 </pubDate></item><item><title>Support YAQL function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/yaql-function.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/heat/+spec/yaql-function"&gt;https://blueprints.launchpad.net/heat/+spec/yaql-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint adds support of YAQL to heat.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/yaql"&gt;https://github.com/openstack/yaql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;YAQL (Yet Another Query Language) is an embeddable and extensible query
language, that allows performing complex queries against arbitrary objects.&lt;/p&gt;
&lt;p&gt;Heat currently does not have the ability to evaluate complex expressions, such
as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Select values for a key from a list of dictionary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filter the list where one or more fields match condition(s).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transform a list to dictionary or vice versa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple arithmetic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluation of boolean logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any combination of select, filter, transform, and evaluate.&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;This spec proposes to add yaql function to the heat of the such form:&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;yaql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;val1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where &lt;cite&gt;expression&lt;/cite&gt; is a valid yaql expression that will be evaluated,
&lt;cite&gt;data&lt;/cite&gt; is a dictionary with variables to which we can refer from the
&lt;cite&gt;expression&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Referencing to corresponding data:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;outputs:
  o1:
    value: {yaql: {expression: $.data.foo, data: {foo: 1}}}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;o1 will be evaluated to 1&lt;/p&gt;
&lt;p&gt;Expression evaluation:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;parameters:
  list_param:
    type: comma_delimited_list
    default: [1, 2, 3]
  bool_param1:
    type: boolean
    default true
  bool_param2:
    type: boolean
    default: false
resources:
  asg:
    type: OS::Heat::AutoscalingGroup
    properties:
      resource:
        type: OS::Nova::Server
        ...
  rg:
    type: OS::Heat::ResourceGroup
    properties:
      count: 3
      type: child.yaml
      properties:
        index: "%index%"
        ...
outputs:
  o1:
    yaql:
      expression: $.data.bool_param1 and $.data.bool_param2
      data:
        bool_param1: {get_param: bool_param1}
        bool_param2: {get_param: bool_param2}
  o2:
    yaql:
      expression: $.data.list_param.select(int($)).max()
      data:
        list_param: {get_param: list_param}
  o3:
    yaql:
      expression: int($.data.list_param[0]) + int($.data.list_param[1]))
      data:
        list_param: {get_param: list_param}
  o4:
    yaql:
      expression: $.values().where($.status="FAILED").select($.id)
      data: {get_attr: [asg, outputs, show]}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The content of child.yaml:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;parameters:
  nova_flavors:
    type: comma_delimited_list
    default: [m1.tiny, m1.small, m1.large]
  index:
    type: string
resources:
  instance:
    type: OS::Nova::Server
    properties:
      ...
      flavor:
        yaql:
          expression: $.data.nova_flavors[
            int($.data.index) mod $.data.nova_flavors.len()]
          data:
            nova_flavors: {get_param: nova_flavors}
            index: {get_param: index}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;o1 will be evaluated to false,
o2 will be evaluated to 3,
o3 will be evaluated to 3,
o4 will contain a list os servers id that are in failed state,
3 servers with m1.tiny, m1.small, m1.large flavors will be created.&lt;/p&gt;
&lt;p&gt;Add 2 config options for bounding of yaql:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;limit_iterators&lt;/cite&gt; that defines maximum number of elements in collection that
expression can take for its evaluation, and&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;memory_quota&lt;/cite&gt; that defines maximum size of memory in bytes that expression can
take for its evaluation.&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&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;&lt;a class="reference external" href="mailto:ochuprykov%40mirantis.com"&gt;ochuprykov&lt;span&gt;@&lt;/span&gt;mirantis&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;newton-1&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement yaql intrinsic function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add corresponding docs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add examples of usage to heat-templates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Fri, 08 Apr 2016 00:00:00 </pubDate></item><item><title>Resource plugins for Networking Service Function Chaining</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/sfc-heat.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/sfc-heat"&gt;https://blueprints.launchpad.net/heat/+spec/sfc-heat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resources plugin for Networking Service Function Chaining.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenStack neutron suppports Service Function Chaining (sfc) as an official
sub-project and more details are available at
&lt;a class="reference external" href="http://docs.openstack.org/developer/networking-sfc/"&gt;http://docs.openstack.org/developer/networking-sfc/&lt;/a&gt; . Heat does not provide
resource plugins for Networking Service Function Chaining and this blueprint
is created to provide required plug-ins.&lt;/p&gt;
&lt;p&gt;The proposed change is to introduce a Service Function Chaining by grouping
order of service function VM’s neutron ports to form service chain and steer
classified user traffic into chain based on service treatment required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following resource plugins under resources/openstack/neutron/ and also add
port_pair, port_pair_group, flow_classifier neutron constraints for resource
validation.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::PortPair:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;ingress&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port’&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;egress&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port’&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;service_function_parameters&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: map&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: {‘correlation’: None}&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::PortPairGroup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;port_pairs&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: []&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port_pair’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::PortChain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;port_pair_groups&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: []&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port_pair_group’&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;flow_classifiers&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: []&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.flow_classifier’&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;chain_parameters&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: map&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: {correlation: mpls}&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::FlowClassifier:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;protocol&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed_values: [tcp, udp, icmp, any]&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;ethertype&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed_values: [IPv4, IPv6]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default : Ipv4&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;source_ip_prefix&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: [correlation=mpls]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘net_cidr’&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;destination_ip_prefix&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: [correlation=mpls]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘net_cidr’&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;source_port_range_min&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints.Range: (1, 65535)&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;source_port_range_max&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints.Range: (1, 65535)&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;destination_port_range_min&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints.Range: (1, 65535)&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;destination_port_range_max&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints.Range: (1, 65535)&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;logical_source_port&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port’&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;logical_destination_port&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.port’&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;l7_parameters&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: map&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&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&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;Mohankumar (&lt;a class="reference external" href="mailto:nmohankumar1011%40gmail.com"&gt;nmohankumar1011&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;newton-1&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&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 resources related&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required custom constraints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample template in heat-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;
</description><pubDate>Tue, 05 Apr 2016 00:00:00 </pubDate></item><item><title>Tempest plugin support</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/tempest-plugin-support.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/tempest-plugin-support"&gt;https://blueprints.launchpad.net/heat/+spec/tempest-plugin-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Migrate existing integration tests to use tempest plugin, so these
tests can run under tempest framework. And add negative API tests for
heat.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Tempest support external plugin since BP &lt;a class="reference external" href="https://specs.openstack.org/openstack/qa-specs/specs/tempest/tempest-external-plugin-interface.html"&gt;Tempest External Plugin Interface&lt;/a&gt; . Basic idea for tempest plugin is that
each project can implement tempest like tests in their repo and provide
those as tempest plugin. So that those tests can be run as part of tempest run.&lt;/p&gt;
&lt;p&gt;Currently integration tests are running with tox and not compatible with
tempest plugin, it’s better to migrate our tests to support tempest plugin.
Then refstack can use tempest framework to score this project.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Introduce tempest plugin.&lt;/p&gt;
&lt;p&gt;Refractor heat_integrationtests structure:&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;heat_integrationtests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
        &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
        &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="n"&gt;Two&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Options&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="n"&gt;heat_integrationtests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;copied&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;adjust&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;heat_integrationtests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Create a entrypoint in setup.cfg:&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;entry_points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;tempest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;heat_tests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;heat_integrationtests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;HeatTempestPlugin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make functional tests compatible with tempest plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make scenario tests compatible with tempest plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change gate to use heat tempest plugin, might need some modification on
setup scripts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&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;Ethan Lynn &amp;lt;&lt;a class="reference external" href="mailto:xjunlin%40cn.ibm.com"&gt;xjunlin&lt;span&gt;@&lt;/span&gt;cn&lt;span&gt;.&lt;/span&gt;ibm&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-1&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 tempest plugin framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adapt existing integration tests to tempest plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change gate to use heat tempest plugin.&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;/section&gt;
</description><pubDate>Tue, 29 Mar 2016 00:00:00 </pubDate></item><item><title>The title of your blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/newton-template.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/heat/+spec/example"&gt;https://blueprints.launchpad.net/heat/+spec/example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introduction paragraph – why are we doing anything?&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&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 where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;Include where in the heat tree hierarchy this will reside.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Heat REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/heat-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&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;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can optionally can list additional ids if they intend on doing
substantial implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;Include specific references to specs and/or blueprints in heat, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 28 Mar 2016 00:00:00 </pubDate></item><item><title>“repeat” function for HOT templates</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/repeat-function.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/repeat-function"&gt;https://blueprints.launchpad.net/heat/+spec/repeat-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This specification introduces a “repeat” control structure for HOT
templates.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Parameters of type “comma_delimited_list” are useful to define lists of items,
but the HOT template syntax does not provide any way to map or transform those
items.&lt;/p&gt;
&lt;p&gt;For example, consider the use of a parameter to specify a list of ports to
include in a security group:&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;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&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;comma_delimited_list&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"80,443,8080"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The desired outcome, which is currently not possible to obtain, is that the
above parameter can be used to construct a resource 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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;security_group&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Neutron&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SecurityGroup&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&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;web_server_security_group&lt;/span&gt;
      &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;
          &lt;span class="n"&gt;port_range_min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
          &lt;span class="n"&gt;port_range_max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;
          &lt;span class="n"&gt;port_range_min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
          &lt;span class="n"&gt;port_range_max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;
          &lt;span class="n"&gt;port_range_min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
          &lt;span class="n"&gt;port_range_max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This proposal introduces a new function called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repeat&lt;/span&gt;&lt;/code&gt; that iterates over
the elements of a list, replacing each item into a given template.&lt;/p&gt;
&lt;p&gt;Following the security group example from the previous section, the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repeat&lt;/span&gt;&lt;/code&gt; function would be used 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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;security_group&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Neutron&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SecurityGroup&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&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;web_server_security_group&lt;/span&gt;
      &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;
            &lt;span class="n"&gt;port_range_min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;port_range_max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;port&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;Below is another example in which this function enables a solution that is
currently impossible to implement:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;my_server&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;net_name&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;networks&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;net_name&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;In this example a list of networks that an instance needs to be attached to is
given as a list in a parameter.&lt;/p&gt;
&lt;p&gt;Another interesting possibility is to generate permutations of two or more
lists. For example, the security group example above can be extended to also
support parametrized protocols 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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;security_group&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Neutron&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SecurityGroup&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&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;web_server_security_group&lt;/span&gt;
      &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;port_range_min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="n"&gt;port&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 &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;for_each&lt;/span&gt;&lt;/code&gt; argument specifies the loop variable and the list to
iterate on as a key-value pair. The loop variable has to be chosen carefully,
as any occurrences will be replaced with each of the items in the list in each
iteration.&lt;/p&gt;
&lt;p&gt;If more than one key/value pair is included in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;for_each&lt;/span&gt;&lt;/code&gt; section, then
the iterations are done over all the permutations of the elements in
the given lists, similar to how nested loops work in most programming
languages.&lt;/p&gt;
&lt;p&gt;The result of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repeat&lt;/span&gt;&lt;/code&gt; function is a new list, with its elements set to
the data generated in each of the loop iterations. When a single list is given,
the size of the resulting list is equal to the size of the input list. When
multiple lists are given as input, the size of the resulting list will be equal
to the sizes of all the input lists multipled.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative that was explored was to extend the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;str_replace&lt;/span&gt;&lt;/code&gt; function to
accomodate this functionality, but in the end it was agreed that there are
significant differences between the two usages.&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;miguelgrinberg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Write the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repeat&lt;/span&gt;&lt;/code&gt; function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit 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;
</description><pubDate>Tue, 16 Feb 2016 00:00:00 </pubDate></item><item><title>Heat custom guidelines</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/heat-custom-guidelines.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/custom-guidelines"&gt;https://blueprints.launchpad.net/heat/+spec/custom-guidelines&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Need to add custom guidelines to facilitate reviewing new resources and improve
descriptions writing.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently there are several rules on how to write descriptions of resources,
properties, attributes and methods. For facilitate reviewing and improve
description writing, need to add heat custom guidelines and start it during tox
pep8 running.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Currently there are several obvious rules of description writing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Terminator at the end of resources, properties, attributes and methods
descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No double or more whitespaces in descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resource should contain description about it’s purpose in
addition to summary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No leading whitespaces in the lines - if description string is long and
split into a few lines, whitespaces should be at the end of lines and not
at the begin of next lines.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Proposed solution is to write custom heat guidelines to cover these rules and
to add it to tox pep8 check.&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&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;prazumovsky&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-3&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 custom guideline rules for current heat descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resolve all problems, which will be found with new checks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add custom guidelines check to pep.&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;
</description><pubDate>Thu, 11 Feb 2016 00:00:00 </pubDate></item><item><title>Implement Senlin resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/senlin-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/senlin-resources"&gt;https://blueprints.launchpad.net/heat/+spec/senlin-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint proposes to add support for Senlin resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Senlin is a generic clustering service that is currently not supported by
Heat. Resources will be added to Heat to support:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Cluster - A cluster can manage a collection of nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Profile - Senlin supports object creation, deletion and update via a concept
called Profile. Each profile is in essential a driver to communicate with
certain services for object manipulation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node - A node is an object that belongs to at most one Cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Policy - A policy is a set of rules that can be checked and/or enforced when
an Action is performed on a Cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Receiver - A receiver is an abstract resource created at the senlin engine
that can be used to hook the engine to some external event/alarm 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;Senlin client plugin and Senlin resources will be added to heat.&lt;/p&gt;
&lt;section id="cluster"&gt;
&lt;h3&gt;1. Cluster&lt;/h3&gt;
&lt;p&gt;Description:
Cluster resource in senlin can create and manage objects of
the same nature, e.g. Nova servers, Heat stacks, Cinder volumes, etc.
The collection of these objects is referred to as a cluster.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Senlin::Cluster&lt;/p&gt;
&lt;/section&gt;
&lt;section id="required-properties"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;profile:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name or id of the Senlin profile.
String Value.
Will apply custom constraint ‘senlin.profile’ on it.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="optional-properties"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name of the Senlin’s cluster.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;min_size:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Minimum number of resources in the cluster.
Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;max_size:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Maximum number of resources in the cluster.
Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;desired_capacity:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Desired initial number of resources in cluster.
Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;metadata:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Metadata key-values defined for cluster.
Map Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;timeout:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The number of seconds to wait for the cluster actions.
Integer Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="profile"&gt;
&lt;h3&gt;2. Profile&lt;/h3&gt;
&lt;p&gt;Description:
Profile resource in senlin is a template describing how to create nodes in
cluster.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Senlin::Profile&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The type of Senlin Profile.
String Value.
Custom constraint ‘senlin.profile_type’.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id2"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name of the Senlin profile.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;metadata:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Metadata key-values defined for profile.
Map Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;properties:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Properties of Senlin profile.
Map value.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="policy"&gt;
&lt;h3&gt;3. Policy&lt;/h3&gt;
&lt;p&gt;Description:
Policy is a set of rules that can be checked and/or enforced when
an Action is performed on a Cluster. A policy resource can be attached to
multiple clusters.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Senlin::Policy&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id3"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The type of senlin policy.
String Value.
Custom Constraint ‘senlin.policy_type’.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id4"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name of the Senlin policy.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;description:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The description of the Senlin policy.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;properties:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The properties of the Senlin policy.
Map Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;bindings:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The clusters this policy attach to.
List value, [{cluster: String, enabled: Boolean}]
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="node"&gt;
&lt;h3&gt;4. Node&lt;/h3&gt;
&lt;p&gt;Description:
Node is an object that belongs to at most one Cluster, it can be created
based on a profile.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Senlin::Node&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id5"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;profile:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name or id of senlin profile for this node.
String Value.
Constraint with ‘senlin.profile’.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id6"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;cluster:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name or id of senlin cluster this node will attach to.
String Value.
Constraint with ‘senlin.cluster’.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;metadata:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Metadata for this node.
Map Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name of this node.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="receiver"&gt;
&lt;h3&gt;5. Receiver&lt;/h3&gt;
&lt;p&gt;Description:
Receiver is an abstract resource created at the senlin engine
that can be used to hook the engine to some external event/alarm sources.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Senlin::Receiver&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id7"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;cluster:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The name or id of senlin cluster to attach to.
String Value.
Constraint with ‘senlin.cluster’.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;action:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The action to be executed when receive a signal.
String Value.
Allowed values are [CLUSTER_SCALE_OUT, CLUSTER_SCALE_IN]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="id8"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The type of receiver.
String Value.
Default value is ‘webhook’.
Allowed values are [‘webhook’].&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of this receiver.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;params:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The parameters passed to action when receive a signal.
Map Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="attributes"&gt;
&lt;h3&gt;Attributes:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;actor:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A trusts id will include in actor.
Map value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;channel:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A ‘alarm_url’ will include in channel.
Map Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&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&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;Ethan Lynn &amp;lt;&lt;a class="reference external" href="mailto:xjunlin%40cn.ibm.com"&gt;xjunlin&lt;span&gt;@&lt;/span&gt;cn&lt;span&gt;.&lt;/span&gt;ibm&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Mikata-3&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 Senlin client plugin for Heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add OS::Senlin::Cluster resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add OS::Senlin::Profile resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add OS::Senlin::Policy resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add OS::Senlin::Node resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add OS::Senlin::Receiver resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add example templates to heat-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;
</description><pubDate>Mon, 25 Jan 2016 00:00:00 </pubDate></item><item><title>OpenStack Heat Specifications</title><link>https://specs.openstack.org/openstack/heat-specs/readme.html</link><description>

&lt;p&gt;This git repository is used to hold approved design specifications for
additions to the heat project. Reviews of the specs are done in gerrit,
using a similar workflow to how we review and merge changes to the code
itself.&lt;/p&gt;
&lt;p&gt;The layout of this repository is:&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;specs&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;release&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;Specifications are proposed for a given release by adding them to the
&lt;cite&gt;specs/&amp;lt;release&amp;gt;&lt;/cite&gt; directory and posting it for review.  The implementation
status of a blueprint for a given release can be found by looking at the
blueprint in launchpad.  Not all approved blueprints will get fully
implemented.&lt;/p&gt;
&lt;p&gt;You can find an example spec in &lt;cite&gt;specs/template.rst&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;There is a sub-directory specs/&amp;lt;release&amp;gt;/backlog to store all specs
that had been approved but are not implemented in a specific release.&lt;/p&gt;
&lt;p&gt;Movement of specs to the backlog would be done in a batch at the end of
a release cycle.&lt;/p&gt;
&lt;p&gt;Prior to the Juno development cycle, this repository was not used for spec
reviews.  Reviews prior to Juno were completed entirely through Launchpad
blueprints:&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;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;blueprints&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launchpad&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;heat&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Please note, Launchpad blueprints are still used for tracking the
current status of blueprints. For more information, see:&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;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;wiki&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wiki&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Blueprints&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For more information about working with gerrit, see:&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;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;infra&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manual&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;developers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="c1"&gt;#development-workflow&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To validate that the specification is syntactically correct (i.e. get more
confidence in the Jenkins result), please execute the following command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ tox
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After running &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox&lt;/span&gt;&lt;/code&gt;, the documentation will be available for viewing in HTML
format in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;doc/build/&lt;/span&gt;&lt;/code&gt; directory. Please do not checkin the generated
HTML files as a part of your commit.&lt;/p&gt;
</description><pubDate>Wed, 20 Jan 2016 00:00:00 </pubDate></item><item><title>Events pagination</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/events-pagination.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/heat/+spec/events-pagination"&gt;https://blueprints.launchpad.net/heat/+spec/events-pagination&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This adds support to the events index call for limit, marker,
sort_keys and sort_dir query parameters, allowing users of the API to
retrieve a subset of events.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;It is now highly probable that an event-list call could
end up attempting to return hundreds of events(especially for
AutoScalingGroup resources). At a certain point Heat
starts responding with a 500 error because the response is too large.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We should support event pagination with limit and marker query parameters.
And we should also support event sorting with sort_keys and sort_dir query
parameters. It will make the use of more convenient for event-list.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;limit: the number of events to list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;marker: the ID of the last item in the previous page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sort_keys: an array of fields used to sort the list, ‘event_time’
or ‘resource_status’, default by ‘event_time’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sort_dir: the direction of the sort, ‘asc’ or ‘desc’, default is ‘desc’&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&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;&amp;lt;huangtianhua&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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 support for pagination and sorting events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT fot the pagination and sorting events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for pagination and sorting events in python-heatclient&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write tempest api orchestration and scenario test to exercise events
pagination&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;
</description><pubDate>Sun, 17 Jan 2016 00:00:00 </pubDate></item><item><title>Support Ceilometer alarm Gnocchi rules</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/ceilometer-gnocchi-alarm.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/ceilometer-gnocchi-alarm"&gt;https://blueprints.launchpad.net/heat/+spec/ceilometer-gnocchi-alarm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gnocchi provides two new kind of Ceilometer alarm rules that allows to query
Gnocchi API instead of Ceilometer API to retreive statistics about Ceilometer
monitored metrics.&lt;/p&gt;
&lt;p&gt;This blueprint proposes to add the corresponding heat resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Ceilometer::GnocchiResourcesAlarm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Ceilometer::GnocchiMetricsAlarm&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;It’s now possible to send Ceilometer samples to Gnocchi in additional of the
traditional database and to create alarms that query Gnocchi API instead of
Ceilometer API to retreive statistics. But currently we can’t create this
kind of alarm with heat, this BP will solve this issue.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the OS::Ceilometer::GnocchiResourcesAlarm like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Ceilometer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GnocchiResourcesAlarm&lt;/span&gt;
  &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Scale&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="n"&gt;CPU&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
    &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu_util&lt;/span&gt;
    &lt;span class="n"&gt;aggregation_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;
    &lt;span class="n"&gt;granularity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;
    &lt;span class="n"&gt;alarm_actions&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;web_server_scaledown_policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alarm_url&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
    &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
    &lt;span class="n"&gt;resource_constraint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'server_group=stack_id'&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;stack_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::stack_id"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Ceilometer::GnocchiMetricsAlarm like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Ceilometer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GnocchiMetricsAlarm&lt;/span&gt;
  &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Scale&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="n"&gt;CPU&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
    &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"09ff6ad8-1704-4f18-8989-6559307dfe79"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"dea49e52-be42-4c71-bd77-fe265b1b6dbb"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;aggregation_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;
    &lt;span class="n"&gt;granularity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;
    &lt;span class="n"&gt;alarm_actions&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;web_server_scaledown_policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alarm_url&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These resources will start to live in /contrib and will move
into the supported resources when gnocchi will move into openstack namespace
after k-3.&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="usage-scenario"&gt;
&lt;h3&gt;Usage Scenario&lt;/h3&gt;
&lt;p&gt;I want to create an autoscaling group that scale down when a statistics against
cpu_util of a group of vm computed by Gnocchi, reach a certain threshold:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Ceilometer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GnocchiResourcesAlarm&lt;/span&gt;
  &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Scale&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="n"&gt;CPU&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
    &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu_util&lt;/span&gt;
    &lt;span class="n"&gt;aggregation_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;
    &lt;span class="n"&gt;granularity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;
    &lt;span class="n"&gt;alarm_actions&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;web_server_scaledown_policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alarm_url&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
    &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
    &lt;span class="n"&gt;resource_constraint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'server_group=stack_id'&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;stack_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::stack_id"&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="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;Mehdi Abaakouk &amp;lt;&lt;a class="reference external" href="mailto:sileht%40redhat.com"&gt;sileht&lt;span&gt;@&lt;/span&gt;redhat&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 the new Ceilometer alarm resources&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 id="references"&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/153291/"&gt;https://review.openstack.org/#/c/153291/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Sun, 17 Jan 2016 00:00:00 </pubDate></item><item><title>Multi-region scenario test</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/multi-region-test.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/multi-region-test"&gt;https://blueprints.launchpad.net/heat/+spec/multi-region-test&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add a scenario test for Multi-Region Orchestration.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat supports Multi-Region Orchestration through remote stacks. While remote
stacks themselves are tested with unit and functional tests, there are no
scenario tests which test the creation of remote stacks across multiple
regions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This change will add a scenario test which creates two remote stacks in
different regions and checks if their creation was successful.&lt;/p&gt;
&lt;p&gt;This will require a multinode test setup with two distinct devstack instances,
each configured with its own region. Multinode test setups are already possible
in infra, but the configuration of regions requires changes to devstack-gate
and openstack-infra/project-config to allow this test to run as a gate test.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;In case it turns out to be impossible to create a multinode test setup with
multiple regions in the openstack infrastructure, this scenario test could also
be added as a local-only test which is not ran at the gate.&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;dgonzalez&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-3&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement scenario test which does the following:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a stack containing two simple remote stacks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Both remote stacks target different regions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After sucessful creation, the output of the remote stacks is checked&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Include scenario test in devstack-gate&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configure devstack multinode setup in project-config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign regions to the devstack nodes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&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;
</description><pubDate>Wed, 30 Dec 2015 00:00:00 </pubDate></item><item><title>Support to generate hot templates based on the specified type</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/support-to-generate-hot-templates.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-to-generate-hot-templates"&gt;https://blueprints.launchpad.net/heat/+spec/support-to-generate-hot-templates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint will support to generate hot templates based on the specified
type.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently Heat only supports to generate the ‘HeatTemplateFormatVersion’
template based on the specified resource type, this is the functionality
exposed via the ‘heat resource-type-template’ command. And the link of the
API:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://developer.openstack.org/api-ref-orchestration-v1.html"&gt;http://developer.openstack.org/api-ref-orchestration-v1.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See resource_types/{type_name}/template API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The changes will support to generate hot templates based on the specified type,
since we recommend user using hot templates.&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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;Update the heat API to support passing a new option specifying
the required template type. Return the cfn template if not specify
the new option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update python-heatclient to expose this new option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests for changes.&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;
</description><pubDate>Wed, 30 Dec 2015 00:00:00 </pubDate></item><item><title>Attribute Type in schema</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/type-in-attributes-schema.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/add-type-in-attributes-schema"&gt;https://blueprints.launchpad.net/heat/+spec/add-type-in-attributes-schema&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint proposes to add type field to attribute schema.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently there is no way to find out what is the type of attribute returned
by the get_attr function. This makes it difficult for the template authors to
figure out what type of value will be returned. Indexing and Mapping on the
attributes also becomes an issue without the knowledge of the attribute type.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The changes will be made in each resource plugin to add type field in the
attribute schema. Type can be a String, Map or List. This will also generate
the docs telling the users what type of value to expect from get_attr.&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&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;ishant-tyagi
rakesh_hs&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 type field in schema of each resource plugin.&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;
</description><pubDate>Wed, 30 Dec 2015 00:00:00 </pubDate></item><item><title>Action-aware Software Configuration</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/action-aware-sw-config.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/action-aware-sw-config"&gt;https://blueprints.launchpad.net/heat/+spec/action-aware-sw-config&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Heat resources have a well-defined lifecycle, handling the lifecycle actions
CREATE, DELETE, SUSPEND, RESUME and UPDATE. Software components in a Heat
template should follow the same lifecycle-awareness and allow for users to
provide configuration hooks for the aforementioned actions.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;With the current design of Heat software orchestration, “software components”
defined through SoftwareConfig resources allow for only one configuration (e.g.
one script) to be specified. Typically, however, a software component has a
lifecycle that is hard to express in a single script. For example, software
must be installed (created), there should be support for suspend/resume
handling, and it should be possible to allow for deletion-logic. This is also
in line with the general Heat resource lifecycle.&lt;/p&gt;
&lt;p&gt;To achieve the desired behavior of having all those lifecycle hooks with the
current design, one would have to define several SoftwareConfig resources along
with several SoftwareDeployment resources, each addressing one specific
lifecycle action. Alternative, one would have to design automation scripts in a
way so they can conditionally handle each lifecycle action accordingly. Both of
those options lack some intuitiveness or impose complexity on the creation of
automation scripts. By making software components action-aware like other Heat
resources, thus leveraging more of the orchestration capabilities of the Heat
engine, creation of software configuration automation and respective Heat
templates can be simplified for users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;It is proposed to make software components (defined through SoftwareComponent
and SoftwareDeployment resources) lifecylce-action-aware by allowing users to
provide configuration scripts for one software component for all standard Heat
lifecycle actions (CREATE, DELETE, SUSPEND, RESUME, UPDATE).
Those configurations that collective belong to one software component (e.g.
Tomcat web server, MySQL database) can be defined in one place (i.e. one
&lt;em&gt;SoftwareComponent&lt;/em&gt; resource) and can be associated to a server by means of one
single SoftwareDeployment resource.&lt;/p&gt;
&lt;p&gt;The new SoftwareComponent resource will - like the SoftwareConfig resource -
not gain any new behavior, but it will also be static store of software
configuration data. Compared to SoftwareConfig, though, it will be extended to
provide several configurations corresponding to Heat lifecyle actions in one
place and following a well-defined structure so that SoftwareDeployment
resources in combination with in-instance agents can act in a lifecycle-aware
manner.&lt;/p&gt;
&lt;section id="new-softwarecomponent-resource"&gt;
&lt;span id="software-component-resource"/&gt;&lt;h3&gt;New SoftwareComponent resource&lt;/h3&gt;
&lt;p&gt;It is proposed to implement a new resource type OS::Heat::SoftwareComponent,
which is similar to the existing SoftwareConfig resource, but has a richer
structure and semantics.
As an alternative, we could choose to extend the existing “SoftwareConfig”
resource, but the overloaded semantics could cause confusion with users.
Furthermore, extension of the existing resource could raise additional
complexity when having to maintain backwards-compatibility with existing uses
of SoftwareConfig.&lt;/p&gt;
&lt;p&gt;The set of properties for OS::Heat::SoftwareComponent will be as follows:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# HOT representation of new SoftwareComponent resource&lt;/span&gt;

&lt;span class="nt"&gt;sw-config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::SoftwareComponent&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# per action configurations&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# inputs and outputs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &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;The &lt;em&gt;configs&lt;/em&gt; property is a list of configurations for the various lifecycle
operations of a software component. Each entry in that list defines the
following properties:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;This property defines a list of resource actions when the respective config
should be applied. Possible values in that list correspond to lifecycle
actions of Heat’s resource model (i.e. CREATE, DELETE, SUSPEND, RESUME, and
UPDATE).
Making this property a list of actions allows for re-using one configuration
for multiple resource actions when desired. For example, Chef recipe for
deploying some software (i.e. CREATE action) could also be used for handling
updates to software configuration properties (i.e. UPDATE action).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; One action like CREATE is only allowed to appear in the &lt;em&gt;actions&lt;/em&gt;
property of at most one config. Otherwise, the ordering of several configs
for one lifecycle action at runtime would be unclear. This constraint will be
validated in the &lt;em&gt;validate()&lt;/em&gt; method of the SoftwareComponent resource.
Allowing an action to appear in more than one config (probably with
additional annotation for ordering) is something that could be done as future
work.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;config&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;This property defines the actual configuration to be applied, analogous to
the &lt;em&gt;config&lt;/em&gt; property of OS::Heat::SoftwareConfig.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;tool&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;This property specifies the configuration tool to be used. Note that this is
analogous to the SoftwareConfig resource’s &lt;em&gt;group&lt;/em&gt; property, but it has been
suggested to use a more intuitive name here.
Having the &lt;em&gt;tool&lt;/em&gt; property for each config entry allows for mixing different
configuration tools for one software component. For example, the deployment
of software (i.e. CREATE) could be done using Chef or Puppet, but a simple
script could be used for SUSPEND or RESUME.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;The &lt;em&gt;inputs&lt;/em&gt; and &lt;em&gt;outputs&lt;/em&gt; properties will be defined global for the complete
SoftwareComponent definition instead of being provided per config hook.
Otherwise, the corresponding SoftwareDeployment resource at runtime would
potentially have different or stale attributes depending on which resource
action was last run, which would likely introduce more complexity.
Template authors will have to make sure that the defined &lt;em&gt;inputs&lt;/em&gt; and &lt;em&gt;outputs&lt;/em&gt;
cover the superset of inputs and outputs for all operation hooks. Typically,
the CREATE hook will require the broadest set of inputs and produce most
outputs.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;options&lt;/em&gt; property will also be defined globally for the complete
SoftwareComponent. This property is meant to provide extra options for the
respective configuration tool to be used. It is assumed that the same options
will apply to all invocations of a configuration for one SoftwareComponent, so
making this a per-config settings does not make sense.
Note that in case of multiple configuration tools being used in one
SoftwareComponent, options need to be namespaced so they can mapped to the
respective tools. For that reason, the &lt;em&gt;options&lt;/em&gt; map will have to contain
sub-sections for the respective tools. For example, for Chef the &lt;em&gt;options&lt;/em&gt; map
would contain a ‘chef’ entry the value of which is in turn a map of
Chef-specific options.&lt;/p&gt;
&lt;section id="example"&gt;
&lt;h4&gt;Example&lt;/h4&gt;
&lt;p&gt;The following snippet shows an example of a SoftwareComponent definition for an
application server. The SoftwareComponent defines dedicated hooks for CREATE,
UPDATE and SUSPEND operations.&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;appserver-config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::SoftwareComponent&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# per action configurations&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scripts/install_appserver.sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;script&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scripts/reconfigure_appserver.sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;script&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SUSPEND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scripts/drain_sessions.sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;script&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# inputs and outputs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;http_port&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https_port&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;default_con_timeout&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;admin_url&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;root_url&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="adaptation-of-softwaredeployment-resource"&gt;
&lt;h3&gt;Adaptation of SoftwareDeployment resource&lt;/h3&gt;
&lt;p&gt;The SoftwareDeployment resource (OS::Heat::SoftwareDeployment) will be adapted
to cope with the new SoftwareComponent resource, for example to provide the
contents of the &lt;em&gt;configs&lt;/em&gt; property to the instance in the appropriate form.
Furthermore, the SoftwareDeployment resource’s action and state (e.g. CREATE
and IN_PROGRESS) will be passed to the instance so the in-instance
configuration hook can select the right configuration to be applied (see also
&lt;a class="reference internal" href="#in-instance-hooks"&gt;&lt;span class="std std-ref"&gt;Update to in-instance configuration hooks&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The SoftwareDeployment resource creates transient configuration objects at
runtime for providing data to the in-instance tools that actually perform
software configuration. When a SoftwareComponent resource is associated to a
SoftwareDeployment resource, the complete set of configurations of the software
component (i.e. the complete &lt;em&gt;configs&lt;/em&gt; property) will be stored in that
transient configuration object, and it will therefore be available to
in-instance tools.&lt;/p&gt;
&lt;p&gt;There will be no change in SoftwareDeployment properties, but there will have
to be special handling for the &lt;em&gt;actions&lt;/em&gt; property: the &lt;em&gt;actions&lt;/em&gt; property
will be ignored when a SoftwareComponent resource is associated to a
SoftwareDeployment. In that case, the entries defined in the &lt;em&gt;configs&lt;/em&gt; property
will provide the set of actions on which SoftwareDeployment, or in-instance
tools respectively, shall react.&lt;/p&gt;
&lt;p&gt;Note: as an alternative to passing the complete set of configurations defined
in a SoftwareComponent, along with the SoftwareDeployment’s action and state
to the instance, we could make the SoftwareDeployment resource select the right
config based on its action and state and only pass this to the instance. This
could possibly allow for using the existing in-instance hooks without change.
However, at the time of writing this spec, it was decided to implement config
select in the in-instance hook since it gives more power to the in-instance
implementation for possible future enhancements.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="update-to-in-instance-configuration-hooks"&gt;
&lt;span id="in-instance-hooks"/&gt;&lt;h3&gt;Update to in-instance configuration hooks&lt;/h3&gt;
&lt;p&gt;The in-instance hooks (55-heat-config) have to be updated to select the
appropriate configuration to be applied depending on the action and state
indicated by the associated SoftwareDeployment resources.&lt;/p&gt;
&lt;p&gt;In case of a &lt;em&gt;SoftwareComponent&lt;/em&gt; being deployed, the complete set of
configurations will be made available to in-instance hooks via Heat metadata.
In addition, SoftwareDeployment resources will add their action and state
to the metadata (e.g. CREATE and IN_PROGRESS). Based on that information, the
in-instance hook will then be able to select and apply the right configuration
at runtime.&lt;/p&gt;
&lt;p&gt;As an alternative, we could choose to implement SoftwareDeployment in a way to
only pass that configuration to the instance (via Heat metadata) that
corresponds to its current action and state. In-instance tools could then
potentially remain without changes (see also note in previous section).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Without any change to current implementation, the following alternatives for
providing action-specific configuration hooks for a software component would
exist:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Use of OS::Heat::StructuredConfig&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;StructuredConfig allows for defining a map of configurations, i.e it would
allow for defining the proposed structure of the &lt;em&gt;configs&lt;/em&gt; property to be
added to SoftwareConfig. However, StructuredConfig does not define a schema
for that map and would thus allow for any free-form data which would make it
much harder to enforce well-defined handling.
In addition, this would change the semantics of the map structure in
StructuredConfig and thus it would be abuse of this resource.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Use of several SoftwareConfigs and SoftwareDeployments:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;As already outlined in the problem description, with the current design it
would be possible to define separate SoftwareConfigs and SoftwareDeployments,
each corresponding to one lifecycle resource action. However, this makes
templates much more verbose by having many resources for representing one
software component, and the overall structure does not align with the general
structure of all other Heat resources.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Use of scripts that conditionally handle actions&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;It would be possible to provide scripts that get invoked for all of a
resource’s lifecycle actions. Those scripts would have to include a lot of
conditional logic, which would make them very complicated.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="potential-follow-up-work"&gt;
&lt;h3&gt;Potential follow-up work&lt;/h3&gt;
&lt;p&gt;The current specification and implementation will only cover Heat’s basic
lifecycle operations CREATE, DELETE, SUSPEND, RESUME and UPDATE. It is
recognized that special handling might make sense for scenarios where servers
are being quiesced for an upgrade, or where they need to be evacuated for a
scaling operation. In addition, users might want to define complete custom
actions (see also &lt;a class="reference internal" href="#software-component-resource"&gt;&lt;span class="std std-ref"&gt;New SoftwareComponent resource&lt;/span&gt;&lt;/a&gt;). Handling of those
actions are out of scope for now, but can be enabled by follow-up work on-top
of the implementation of this specification. For example, an additional
property &lt;em&gt;extended_action&lt;/em&gt; could be added to SoftwareDeployment which could be
set to the extended actions mentioned above. When passing this additional
property to in-instance hooks, the hooks could then select and apply
the respective config for the specified extended action.&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;Thomas Spatzier&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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 new OS::Heat::SoftwareComponent resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adapt OS::Heat::SoftwareDeployment for new SoftwareComponent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adapt in-instance hook for selecting right configuration to be applied&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Decouple Nested Stacks</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/decouple-nested.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/decouple-nested"&gt;https://blueprints.launchpad.net/heat/+spec/decouple-nested&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As step towards the more granular architecture described in the
convegence-engine spec, it has been proposed that we could more effectively
decouple nested stacks within the existing heat architecture.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Creating a tree of many nested stacks results in the entire stack tree getting
processed, for every stack operation, by one heat-engine process, with access
to every nested stack serialized by the same global lock (that obtained to
access the top-level stack).&lt;/p&gt;
&lt;p&gt;While the arguably more complex and invasive steps described by
convergence-engine are worked out (which may take some time, and will probably
be made simpler by the decoupling described below), it’s proposed that we look
at decoupling nested stacks more effectively from their parent, such that we
can make use of the existing RPC round-robin scheduling to enable nested stacks
operations (e.g create/update/delete) to be handled in a more scalable way by
spreading the work for each stack over multiple engine processes or workers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Rework the engine RPC interfaces to enable some additional arguments to be
passed to create/update operations, such that the existing coupling (for
example passing user_creds ID’s) between parent and nested stacks can be
broken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refactor the StackResource base-class to perform operations via RPC and not
manipulate parser.Stack objects directly when performing lifecycle operations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the StackResource rework will focus on performing actions which
change the state of the stack via RPC calls (e.g those which are performed
asynchronously via an IN_PROGRESS state), leaving the existing code for stack
introspection unchanged.  This should allow a less risky transition to the
new interfaces with minimal rework of the StackResource subclasses.&lt;/p&gt;
&lt;p&gt;One area which may be left for a future enhancement is the polling for COMPLETE
state after triggering the action via RPC, e.g when we triggger a nested stack
create via an RPC call, we will poll the DB directly waiting for the CREATE
COMPLETE state in check_create_complete.  In future, it would be better to wait
for a notification to avoid the overhead of polling the DB.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Wait for the full convergence-engine vision to come together I guess, but it
seems apparent that we need a more immediate mitigation plan for the subset of
users who care primarily about these kind of workloads.&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;Steven Hardy (shardy)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-3&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;Rework RPC interfaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource create operations to create the stack via RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource delete operations to delete the stack via RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource suspend operations to suspend the stack via RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource resume operations to resume the stack via RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource check operations to check the stack via RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert StackResource update operations to update the stack via RPC&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, but this could be considered a precursor to the convergence-engine work.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Explode Nested Resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/explode-nested-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/explode-nested-resources"&gt;https://blueprints.launchpad.net/heat/+spec/explode-nested-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For many UI use-cases, it is generally resource intensive to list all
resources associated with a given stack if that stack includes stack-based
resources. It is therefore proposed that &lt;cite&gt;resource-list&lt;/cite&gt; should return all
resources associated with a given stack if requested.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, &lt;cite&gt;resource-list&lt;/cite&gt; only returns top-level resources of a given stack
but does not include resources that are inside of any nested stacks. This
makes several use cases difficult or sub-optimal because of the need to make
several API calls on resource reference links.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;When deleting a stack, a UI should be able to present the user with a list
of &lt;em&gt;all&lt;/em&gt; resources associated with a given stack to avoid confusion about
what and why certain resources were deleted due to a stack delete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A user of the API (either via CLI, curl, or other method) wants to be able
to quickly and easily list and follow the status of every resource associated
with a stack, regardless of a resource’s position in the stack hierarchy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenStack dashboard may show an incorrect, confusing topology of resources
from a stack because it knows nothing about a nested stack (e.g. a group of
servers).&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 proposed implementation would add an optional query parameter to the
&lt;cite&gt;resource-list&lt;/cite&gt; API method:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;nested_depth&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Recursion depth to limit the returned resources. This parameter
indicates that the user wishes to return nested resources as well as those
from the parent stack. Setting this parameter to a number results in the
system limiting the recursion depth. A value of &lt;cite&gt;0&lt;/cite&gt; has no effect. A value
of &lt;cite&gt;MAX&lt;/cite&gt; results in all resources being returned up to
&lt;cite&gt;max_nested_stack_depth&lt;/cite&gt;. The system will never recurse farther than
&lt;cite&gt;max_nested_stack_depth&lt;/cite&gt;, regardless of the value passed in the parameter.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;The Heat service would see this parameter and recurse through all of the
nested stacks to the specified depth and flatten the resource list data
structure. For resources that exist in nested stacks, the containing nested
stack id and parent resource name would also be included.&lt;/p&gt;
&lt;p&gt;The resulting response data would look like:&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;"resources"&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;"resource_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"db"&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="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"logical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"db"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state changed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-15T18:23:35Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"required_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"web_nodes"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CREATE_COMPLETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"physical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"4974985c-da78-444b-aeb3-9a80baccdd1a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Trove::Instance"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"lb"&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="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"logical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"lb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state changed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-15T18:30:52Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"required_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CREATE_COMPLETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"physical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"229145"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Rackspace::Cloud::LoadBalancer"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_nodes"&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="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"logical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_nodes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state changed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-15T18:25:10Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"required_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"lb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CREATE_COMPLETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"physical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c3a46e6f-f999-4f9b-a797-3043031d381a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Heat::ResourceGroup"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_node1"&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="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"logical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_node1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state changed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-15T18:25:10Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"required_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"lb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CREATE_COMPLETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"physical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c3a46e6f-f999-4f9b-a797-3043031d3811"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Rackspace::Cloud::Server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"parent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_nodes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"nested_stack_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1234512345"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_node2"&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="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"logical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_node2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state changed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-15T18:25:10Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"required_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"lb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"CREATE_COMPLETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"physical_resource_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c3a46e6f-f999-4f9b-a797-3043031d3822"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"resource_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Rackspace::Cloud::Server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"parent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"web_nodes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"nested_stack_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1234512345"&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;These changes will primarily reside in:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;heat.engine.service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.db&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;python-heatclient&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Currently, each resource that abstracts a nested stack will include a link to
the nested stack when viewed with a &lt;cite&gt;resource-show&lt;/cite&gt;. This allows a user to
implement this functionality client-side by:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;listing all of the resources in the stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;retrieving each resource individually&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if the current resource has a link to a nested stack, recurse the resources
of that stack and add them to the list/tree&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While this offers greater flexibility in how nested resources are listed for
the user’s particular use case, its very inefficient for the stated use cases
as well as very noisy from a network perspective. This specification does not
intend to remove this option, only to provide an alternative to more
efficiently satisfy several common use cases while maintaining the existing
link traversal method for use cases requiring more control over the display
of the resource hierarchy.&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;randall-burt&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;Update DB API and implementation to accept the &lt;cite&gt;nested_depth&lt;/cite&gt; parameter
for resource list and use that in logic to append resources from any
nested stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the engine to accept and then pass the &lt;cite&gt;nested_depth&lt;/cite&gt; parameter to
the DB API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the API to accept and pass the &lt;cite&gt;nested_depth&lt;/cite&gt; parameter to the
engine; try not to have to version the RPC API, please.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update python-heatclient to expose the new flag and properly format the
output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the parameters to the Heat V1 WADL&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement equivalent to AWS “Updates are not supported”</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/implement-aws-updates-not-supported.html</link><description>

&lt;p&gt;As Heat tries to maintain compatibility of its AWS resources,
a user can expect that a template using Heat’s AWS compatible resources
will work the same both on Heat and on AWS.
Currently though we are missing a specific behavior of some AWS resources
on stack update - a property of resource might not support any updates,
including UpdateReplace (that is currently our default update behavior).&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/implement-aws-updates-not-supported"&gt;https://blueprints.launchpad.net/heat/+spec/implement-aws-updates-not-supported&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;section id="aws-cloudformation"&gt;
&lt;h3&gt;AWS CloudFormation&lt;/h3&gt;
&lt;p&gt;AWS CloudFormation has a distinction between “Update requires: Replacement”
and “Update requires: Updates are not supported” for a property of a resource.
In latter case, an attempt to update this property during a stack update
will result in an error putting resource in UPDATE_FAILED state.&lt;/p&gt;
&lt;section id="example"&gt;
&lt;h4&gt;Example&lt;/h4&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;AWS::EC2::Volume&lt;/span&gt;&lt;/code&gt; resource has all properties marked as
“Update requires: Updates are not supported” in AWS docs &lt;a class="footnote-reference brackets" href="#id6" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.
This is the relevant part of AWS event when trying to increase the volume size
from 10 to 11 using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update-stack&lt;/span&gt;&lt;/code&gt; command:&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;"ResourceStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UPDATE_FAILED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"ResourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"AWS::EC2::Volume"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"ResourceStatusReason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"Update to resource type AWS::EC2::Volume is not supported."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"ResourceProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;us-west-2a&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Size&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;11&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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="heat"&gt;
&lt;h3&gt;Heat&lt;/h3&gt;
&lt;p&gt;In Heat we currently have default update behavior as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UpdateReplace&lt;/span&gt;&lt;/code&gt;.
Any updateable properties must be explicitly declared as such
and handled in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;handle_update&lt;/span&gt;&lt;/code&gt; method of a resource.
We have no clear way of completely denying any update to a resource
(including replacing it with new resource).
Thus if one e.g. follows the same scenario as in &lt;a class="reference internal" href="#example"&gt;Example&lt;/a&gt; above,
the stack update succeeds having replaced the volume.&lt;/p&gt;
&lt;p&gt;From currently implemented AWS compatible resources the following are affected:&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;AWS::EC2::Volume&lt;/span&gt;&lt;/code&gt; - Updates are not supported &lt;a class="footnote-reference brackets" href="#id6" id="id2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&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;AWS::EC2::VolumeAttachment&lt;/span&gt;&lt;/code&gt; - Updates are not supported &lt;a class="footnote-reference brackets" href="#id7" id="id3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&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;AWS::CloudFormation::WaitCondition&lt;/span&gt;&lt;/code&gt; - Updates are not supported &lt;a class="footnote-reference brackets" href="#id8" id="id4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&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;AWS::CloudFormation::Stack&lt;/span&gt;&lt;/code&gt; - Updates are not supported for
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TimeoutInMinutes&lt;/span&gt;&lt;/code&gt; property &lt;a class="footnote-reference brackets" href="#id9" id="id5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="#id2"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id7" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id3"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id8" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id4"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id9" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id5"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add a property schema attribute &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_replace_allowed&lt;/span&gt;&lt;/code&gt; with default value
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;True&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;modify &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Resource.update_template_diff_properties&lt;/span&gt;&lt;/code&gt; method to raise
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NotSupported&lt;/span&gt;&lt;/code&gt; error (a check similar to check for
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_allowed&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The properties schema of a resource then can specify
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_replace_allowed=False&lt;/span&gt;&lt;/code&gt; which would lead to resource update
failure on any attempt to update such property.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As an alternative we might mark all the properties of the AWS resource
in question as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_allowed&lt;/span&gt;&lt;/code&gt; and raise the same error in resource’s
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;handle_update&lt;/span&gt;&lt;/code&gt;. This though would make the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_allowed&lt;/span&gt;&lt;/code&gt; effectively
a no-op, confusing users and documentation.&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;Pavlo Shchelokovskyy (pshchelo)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-3&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 &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_replace_allowed&lt;/span&gt;&lt;/code&gt; property attribute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;modify the default resource update logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;amend docs generation to display the status of this attribute for a property
(probably only if it is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;False&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mark corresponding properties of AWS compatible resources as
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_replace_allowed&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;False&lt;/span&gt;&lt;/code&gt;&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement BlockDeviceMappings for AWS::EC2::Instance</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/implement-ec2instance-bdm.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/heat/+spec/implement-ec2instance-bdm"&gt;https://blueprints.launchpad.net/heat/+spec/implement-ec2instance-bdm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We should support the BlockDeviceMappings for AWS::EC2::Instance resource
to be compatible with AWSCloudFormation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Now in Heat, the AWS::EC2::Instance resource only has ‘Volumes’ property to
indicate the volumes to be attached, but there are two ways defining volumes
in AWSCloudFormation, ‘Volumes’ and ‘BlockDeviceMappings’, see:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html&lt;/a&gt;&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;‘Volumes’ support the ‘volume_id’, user can specify the volume to be
attached to the instance. This way has been implemented in Heat, but
it’s not a good way for batch creation because one volume can’t be attached
to many instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‘BlockDeviceMappings’ support the ‘snapshot_id’, user can specify
a snapshot, then a volume will be created from the snapshot, and the volume
will be attached to the instance. This way is a good way for batch creation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nova supports to create a server with a block device mapping:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/api/openstack-compute/2/content/ext-os-block-device-mapping-v2-boot.html"&gt;http://docs.openstack.org/api/openstack-compute/2/content/ext-os-block-device-mapping-v2-boot.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, we should support the ‘BlockDeviceMappings’ for AWS::EC2::Instance
resource.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add ‘BlockDeviceMappings’ property for AWS::EC2::Instance resource,
specially in which user can specify the ‘snapshot_id’.&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&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;&amp;lt;huangtianhua&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Support the BlockDeviceMappings for AWS::EC2::Instance resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest for the change&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a template for AWS::EC2::Instance with BlockDeviceMappings&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement BlockDeviceMappings for AWS::AutoScaling::LaunchConfiguration</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/implement-launchconfiguration-bdm.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/heat/+spec/implement-launchconfiguration-bdm"&gt;https://blueprints.launchpad.net/heat/+spec/implement-launchconfiguration-bdm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We should support the BlockDeviceMappings for
AWS::AutoScaling::LaunchConfiguration resource to be compatible with
AWSCloudFormation. And therefore, user can specify volumes to attach
to instances while AutoScalingGroup/InstanceGroup creation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Now in Heat, the AWS::AutoScaling::LaunchConfiguration resource doesn’t
implement ‘BlockDeviceMappings’ property to indicate the volumes to be
attached. There are two problems:&lt;/p&gt;
&lt;p&gt;1. First, it’s incompatible with AWSCloudFormation. In AWSCloudFormation,
‘BlockDeviceMappings’ support the ‘SnapshotId’, user can specify a snapshot,
then a volume will be created from the snapshot, and the volume will be
attached to the instance.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Second, user can’t specify volumes to be attached to instances which in
AutoScalingGroup/InstanceGroup while creation.&lt;/p&gt;
&lt;p&gt;So, we should support the ‘BlockDeviceMappings’ for
AWS::AutoScaling::LaunchConfiguration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement ‘BlockDeviceMappings’ property for
AWS::AutoScaling::LaunchConfiguration resource, specially in which user can
specify the ‘SnapshotId’.&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&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;&amp;lt;huangtianhua&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Support the BlockDeviceMappings for AWS::AutoScaling::LaunchConfiguration
resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest for the change&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a template for AWS::AutoScaling::LaunchConfiguration with
BlockDeviceMappings&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/implement-ec2instance-bdm"&gt;https://blueprints.launchpad.net/heat/+spec/implement-ec2instance-bdm&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Reorg AutoScalingGroup Implementation</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/reorg-autoscaling-group.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/heat/+spec/reorg-asg-code"&gt;https://blueprints.launchpad.net/heat/+spec/reorg-asg-code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This specs is about reorganize AutoScalingGroup implementation which includes
the following resource types:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;AWS::AutoScaling::LaunchConfiguration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS::AutoScaling::AutoScalingGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS::AutoScaling::ScalingPolicy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::InstanceGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::AutoScalingGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::ScalingPolicy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::ResourceGroup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The goal is to 1) reorganize the class hierarchy; 2) split and relocate sources
into subdirectories to better reflect resources’ name space; 3) make it easier
for future enhancements to each resource types.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The current class hierarchy of resource groups and scaling groups is something
like the diagram shown 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="n"&gt;CooldownMixin&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;StackResource&lt;/span&gt;
 &lt;span class="o"&gt;|&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;ResourceGroup&lt;/span&gt; &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ResourceGroup&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;+--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;InstanceGroup&lt;/span&gt; &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InstanceGroup&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;+---------+--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AutoScalingGroup&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScaling&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScalingGroup&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;+--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AutoScalingResourceGroup&lt;/span&gt; &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AutoScalingGroup&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="n"&gt;SignalResponder&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;ScalingPolicy&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScaling&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ScalingPolicy&lt;/span&gt;&lt;span class="p"&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;AutoScalingPolicy&lt;/span&gt; &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ScalingPolicy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Besides this hierarchy, there are utility functions located in the modules like
heat.scaling.template.&lt;/p&gt;
&lt;p&gt;One of the problems of this design is related to namespace as pointed out by
an existing blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/resource-package-reorg"&gt;https://blueprints.launchpad.net/heat/+spec/resource-package-reorg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another problem is that having all classes implemented in almost one file is
making the implementation difficult to digest or improve.  For example, it
may make a better sense to have InstanceGroup a subclass of ResourceGroup.
For another example, it doesn’t make much sense to have
AutoScalingResourceGroupa subclass of InstanceGroup because the subclass is
more open to other resource types as its members.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Reorganize Class Hierarchy&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The proposed change is to reorganize the class hierarchy to be something like
shown in the diagram 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="n"&gt;CooldownMixin&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                           &lt;span class="n"&gt;StackResource&lt;/span&gt;
 &lt;span class="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;ResourceGroup&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                       &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ResourceGroup&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="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;AutoScalingGroup&lt;/span&gt;                      &lt;span class="n"&gt;InstanceGroup&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScalingGroup&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InstanceGroup&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;+---------------------------------------&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AWSAutoScalingGroup&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScaling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AutoScalingGroup&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="n"&gt;SignalResponder&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="n"&gt;AWSAutoScalingPolicy&lt;/span&gt;             &lt;span class="n"&gt;AutoScalingPolicy&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AutoScaling&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ScalingPolicy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ScalingPolicy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This change will break the subclass relationships between OpenStack and AWS
implementation.&lt;/p&gt;
&lt;p&gt;As for utility/helper classes, e.g. &lt;cite&gt;CooldownMixin&lt;/cite&gt;, the first step is to
separate them into independent classes, followed by further refactoring them
into utility functions when appropriate.&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Relocate Source Files&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The AWS version will be relocated into heat/engine/resources/aws subdirectory,
including the LaunchConfiguration implementation.  The OpenStack version will
be relocated into heat/engine/resources/openstack subdirectory.&lt;/p&gt;
&lt;p&gt;The shared parent class ResourceGroup will remain in heat/engine/resources,
while the CooldownMixin class will be relocated into heat/scaling subdirectory.
The eventual layout of the modules and classes would look like this:&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;heat&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;engine&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="o"&gt;|&lt;/span&gt;
  &lt;span class="o"&gt;+--&lt;/span&gt; &lt;span class="n"&gt;resource_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ResourceGroup&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;+--&lt;/span&gt; &lt;span class="n"&gt;instance_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;InstanceGroup&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="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="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;autoscaling_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWSAutoScalingGroup&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="n"&gt;scaling_policy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AWSAutoScalingPolicy&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="n"&gt;launch_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LaunchConfiguration&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="n"&gt;openstack&lt;/span&gt;&lt;span class="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;autoscaling_group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AutoScalingGroup&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
       &lt;span class="o"&gt;+--&lt;/span&gt; &lt;span class="n"&gt;scaling_policy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AutoScalingPolicy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;scaling&lt;/span&gt;&lt;span class="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;cooldown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CooldownMixin&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;possibily&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="n"&gt;utility&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This reshuffling is optional.  We will determine whether reshuffling is
necessary indeed after the cleanup work is done.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Since this is a pure implementation level change, one rule of thumb is that “we
don’t break userland”.&lt;/p&gt;
&lt;p&gt;We can have AWS AutoScalingPolicy extend Heat AutoScalingPolicy.  However that
may mean that any future changes to Heat implementation must be very careful,
in case those changes may break the conformance of the AWS version to its
Amazon specification.&lt;/p&gt;
&lt;p&gt;The same applies to the two versions of AutoScalingGroup.  Hopefully, we may
extract common code into ResourceGroup level to minimize code duplication.
However, having a subclass relationship between these two classes is not a
good design in the long term.  The goal of the AWS version is to closely
follow the Amazon development while the goal of the Heat version is more
about user needs in the context of OpenStack.  So the current thought is to
split the implmentation although it may imply some code duplication.&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;Qiming&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;There could be other contributors interested in helping out as well.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;Extract common code to parent classes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Split AWS version and OS version of resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify test cases&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;No new dependencies to other libraries will be introduced.&lt;/p&gt;
&lt;p&gt;This work may disturb several on-going work related to AutoScalingGroups.
The following work will have to be rebased on this change.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/110379"&gt;https://review.openstack.org/110379&lt;/a&gt; Scaling group scale-down plugpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/105644"&gt;https://review.openstack.org/105644&lt;/a&gt; LaunchConfiguration bdm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/105907"&gt;https://review.openstack.org/105907&lt;/a&gt; Balancing ScalingGroup across AZs&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Stack Breakpoint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/stack-breakpoint.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-breakpoint"&gt;https://blueprints.launchpad.net/heat/+spec/stack-breakpoint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Orchestration template is a powerful automation tool when it works;  however
when it fails, troubleshooting can be quite difficult. During development,
debugging failed template is simply part of the process, but in production,
a previously working template can also fail for many reasons. Providing support
for troubleshooting template will not only increase productivity but will also
help the adoption of Heat template by allowing users to “look under the hood”
and have a better handle on the automation.&lt;/p&gt;
&lt;p&gt;Typically, the user would start by checking the logs to get some bearing on
the error.  If possible, the user may try to enhance the logs by adding more
log message in the script.  This initial approach should resolve many errors,
but difficult error may require more active debugging.  The user would need to
stop at or before the point of template failure, inspect variables, check the
environment, run command or script manually, etc.  Since the template is
declarative, the user would need to be able to recreate the error consistently.&lt;/p&gt;
&lt;p&gt;Support for troubleshooting is broad and will require many blueprints to
implement the different features to control the template flow, recreate the
error, and inspect the elements.  Related blueprints include
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/troubleshooting-low-level-control"&gt;troubleshooting-low-level-control&lt;/a&gt;, &lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/resolve-failed-stack-attributes"&gt;resolve-failed-stack-attributes&lt;/a&gt;,
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/user-visible-logs"&gt;user-visible-logs&lt;/a&gt;, &lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/user-friendly-template-errors"&gt;user-friendly-template-errors&lt;/a&gt;.  This blueprint covers the
particular scenario of how to better control the stack deployment while
troubleshooting.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;With a failing stack, currently we can stop on the point of failure by
disabling rollback:  the stack will stop when a resource fails, leaving in
place the resources that have been created successfully.  There may be some
false failures because some resources may be aborted, but they can be easily
identified by displaying the state of the resource.  This technique works well
for troubleshooting stack-create;  stack-update can be handled similarly once
the blueprint update-failure-recovery is implemented.&lt;/p&gt;
&lt;p&gt;In many cases however, the point of failure may be too late or too hard to
debug because the original cause of the failure may not be obvious or the
environment may have been changed.  If we can pause the stack at a point before
the failure, then we are in a better position to troubleshoot.  For instance,
we can check whether the state of the environment and the stack is what we
expect, we can manually run the next step to see how it fails, etc.&lt;/p&gt;
&lt;p&gt;While developing new template or resource type, it is also useful to bring up
a stack to a point before the new code is to be executed.  Then the developer
can manually execute and debug the new code.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The usage would be as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run stack-create or stack-update with one or more resource name specified
as breakpoint, for example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;heat stack-create my_stack –template-file my_template.yaml
–breakpoint failing_resource_name&lt;/p&gt;
&lt;p&gt;heat stack-update my_stack –template-file my_template.yaml
–breakpoint failing_resource_name&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The breakpoint can also be coded in the environment file pointing to
a particular resource, for example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;breakpoints:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;resource: failing_resource_name&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As the engine traverses down the dependency graph, it would stop at the
breakpoint resource and all dependent resources.  Other resources with no
dependency will proceed to completion before stopping.  Multiple breakpoints
can be set to control parallel paths in the graph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running resource-list or resource-show will show the resource at the
breakpoint as “CREATE.INPROGRESS” or “UPDATE.INPROGRESS” and the resource
is not created or updated yet.  Running event-list will show that the
breakpoint has occurred, and event-show will give more details on the
breakpoint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The breakpoint can be deleted on the command line by:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;heat stack-update my_stack –template-file my_template.yaml
–nobreakpoint failing_resource_name&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the environment file, the breakpoint can be deleted simply by deleting
the resource name in the breakpoint property.  This would take effect the
next time the environment file is specified on stack-update.  The user
is probably more likely to use the command line option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After debugging, continue the stack by (done manually, but can also be
automated by a high level debugger):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Stepping: remove current breakpoint, set breakpoint for next resource(s)
in dependency graph, resume stack-create (or stack-update).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running to completion: remove current breakpoint, resume stack-create or
stack-update by running stack-update with the same
template and parameters.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For nested stack, the breakpoint would be prefixed with the name of the
nested template.&lt;/p&gt;
&lt;p&gt;The change will include the heat client, api and environment to add the
breakpoint option.
For the Heat engine to stop at a resource, we will leverage the blueprint
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Heat/Blueprints/lifecycle-callbacks"&gt;lifecycle-callbacks&lt;/a&gt;.  Some code to set up and interface with the callback
will be needed and the details will be determined when this blueprint is
implemented.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The manual approach is simply to edit the template and delete any failing
resources until the remaining resources can be created successfully.
Then stepping each resource can be done by adding it back to the template and
running stack-update.  The full stack will need to be deleted and recreated
for each iteration.
This manual technique cannot be incorporated into high level tool.&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;Ton Ngo&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-3 or further&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;Heat client:  add option to specify breakpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat API:  add option to specify breakpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environment:  add option to specify breakpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interface with &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Heat/Blueprints/lifecycle-callbacks"&gt;lifecycle-callbacks&lt;/a&gt;&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;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Heat/Blueprints/lifecycle-callbacks"&gt;https://wiki.openstack.org/wiki/Heat/Blueprints/lifecycle-callbacks&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Stack lifecycle plugpoint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/stack-lifecycle-plugpoint.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/heat/+spec/stack-lifecycle-plugpoint"&gt;https://blueprints.launchpad.net/heat/+spec/stack-lifecycle-plugpoint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A cloud provider may have a need for custom code to examine stack requests
prior to performing the operations to create or update a stack.
Some providers may also need code to run after operations on
a stack complete. A mechanism is proposed whereby providers may easily add
pre-operation calls from heat to their own code, which is called prior to
performing the stack work, and post-operation calls, which are made after
a stack operation completes or fails.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are at least two primary use cases.
(1) Enabling holistic (whole-pattern) scheduling of the virtual resources
in a template instance (stack) prior to creating or deleting them.
This would usually include making decisions about where to host virtual
resources in the physical infrastructure to satisfy policy requirements.
It would also cover failing a stack create or update if the policies
included with the stack create or update were not satisfiable, or other
cloud provider policies being checked were not satisfiable.
As an example, an application owner requires that VMs and volumes
attached to them are deployed on the same rack. As another example,
a cloud provider may want to enforce consultation with a license server
before deploying an application. As another example, an application owner
may require that their VMs be spread across a given number of
racks.
(2) Enabling checking of policies not related to virtual resource scheduling,
with stack create or update failure if the policies would not be satisfied.
As an example, a cloud provider may want to verify that compute resources
for certain types of applications are deployed with certain security groups.
As another example, a cloud provider may want to be warned when patterns
with &amp;gt; 100 VMs are deployed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;An ordered registry of python classes which implement pre-operation and/or
post-operation methods is required. This would be done through stevedore,
with some addition to force a full (or partial) ordering on the classes.
Pre and post operation methods should not modify the parameter stack(s).
Any modifications would be considered to be a bug.
A possible exception would be to allow status changes
to the stack, to facilitate error handling.
[The no-modifications rule could be enforced, e.g. by passing deep copies to
the plugins but this might incur an unacceptable
performance cost.] Both pre-operation and
post-operation methods can both indicate failure, which would be treated like
any other stack failure. On failure of a pre-operation call, when more than
one plugin
is registered, the post-op methods would be called for all the classes already
processed, to indicate to each plugin that any decisions that
it made with respect to the stack should be un-made.&lt;/p&gt;
&lt;p&gt;All stack actions would need calls to either pre or post operations, or both.
This includes at least create, update, delete, abandon, and adopt. In a basic
design, modifications to the Stack class in parser.py are sufficient for adding
the call to the pre-operation and post-operation methods found via the
lifecycle plugin registry. The post-operation calls would need to be called in
both the normal paths and all error paths.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No other approach was identified that would allow the operator (heat provider)
to extend heat with this functionality for all stack deployments.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/lifecycle-callbacks"&gt;https://blueprints.launchpad.net/heat/+spec/lifecycle-callbacks&lt;/a&gt; describes
an approach where heat users can optionally specify callbacks for in templates
for stack and resource events.
It does not provide the ubiquitous callbacks (for all stacks) that would be
needed by the use cases described above, unless the heat provider tightly
controls the templates that users can use.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;A patch comprising a full implementation of the blueprint
(&lt;a class="reference external" href="https://review.openstack.org/#/c/89363/"&gt;https://review.openstack.org/#/c/89363/&lt;/a&gt;) is already being
reviewed, under the old pre-spec process.&lt;/p&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;William C. Arnold (barnold-8)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;Implementation: &lt;a class="reference external" href="https://review.openstack.org/#/c/89363/"&gt;https://review.openstack.org/#/c/89363/&lt;/a&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;No dependencies&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Support Cinder scheduler hints</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/cinder-scheduler-hints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/cinder-scheduler-hints"&gt;https://blueprints.launchpad.net/heat/+spec/cinder-scheduler-hints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When creating volumes with Cinder, passing scheduler hints can be necessary to
select an appropriate back-end.  This spec proposes to add a ‘scheduler_hints’
option for OS::Cinder::Volume objects, as is it already done for
OS::Nova::Server.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, it is not possible to pass hints to the Cinder scheduler when using
Heat to create volumes.&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 optional key-value map (named ‘scheduler_hints’) for
OS::Cinder::Volume resources.  A user can pass hints to the Cinder scheduler by
specifying one or more keys-values in scheduler_hints.&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="usage-scenario"&gt;
&lt;h3&gt;Usage Scenario&lt;/h3&gt;
&lt;p&gt;For instance, request creation of &lt;cite&gt;volume-A&lt;/cite&gt; on a different back-end than
&lt;cite&gt;volume-B&lt;/cite&gt; using the different_host scheduler hint:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cinder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
      &lt;span class="n"&gt;scheduler_hints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;different_host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;B&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="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;adrien-verge&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;Extend OS::Cinder::Volume to support a new ‘scheduler_hints’ option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When set, pass this option to the Cinder client&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support Cinder API version 2
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-cinder-api-v2"&gt;https://blueprints.launchpad.net/heat/+spec/support-cinder-api-v2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>support cinder volume type manage</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/cinder-volume-type.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/cinder-volume-type"&gt;https://blueprints.launchpad.net/heat/+spec/cinder-volume-type&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cinder volume type is an import parameter when creating a volume, it can
specify the volume backend and specific whether support consistency group
and so on.
Support OS::Cinder::VolumeType resource manage in heat will be good.&lt;/p&gt;
&lt;p&gt;Note that by default only users who have the admin role can manage volume
types because of the default policy in Cinder.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently volume types need to be managed externally to heat and passed into
the stack as parameters. This spec defines how we could create both the volume
and the volume type within one template.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the OS::Cinder::VolumeType resource, like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;my_volume_type&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cinder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VolumeType&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&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;volumeBackend&lt;/span&gt;
      &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;volume_backend_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lvmdriver&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that because of the admin restriction mentioned above,
the new resource will be added to /contrib.&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="usage-scenario"&gt;
&lt;h3&gt;Usage Scenario&lt;/h3&gt;
&lt;p&gt;For volume creation take the volume_type to specific the lvm-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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;my_volume&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cinder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;
   &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
     &lt;span class="n"&gt;volume_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;my_volume_type&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="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;huangtianhua &amp;lt;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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 OS::Cinder::VolumeType resource, implement its basic actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest for the change&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement check_resource workflow</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-check-workflow.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/heat/+spec/convergence-check-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Rather than working on the whole stack in-memory, in convergence we want to
distribute tasks across workers by sending out notifications when individual
resources are ready to be operated on.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The workflow has been prototyped in
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/converger.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/converger.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After calculating the traversal graph, the stack update call triggers the leaf
nodes of the graph. After each node is processed, examine the traversal graph
(which is stored in the Stack table) to determine which nodes are waiting for
this one. Store input data for each of those nodes in their SyncPoints, and
trigger a check on any which now contain their full complement of inputs.&lt;/p&gt;
&lt;p&gt;The SyncPoint for the stack works similarly, except that when complete we
notify the stack itself to mark the update as complete.&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&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;sirushtim&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Kick off the workflow from the stack update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement skeleton check_resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notify the stack of the result when complete (or on failure)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create developer 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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-prepare-traversal"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-prepare-traversal&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-lightweight-stack"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-lightweight-stack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-message-bus"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-message-bus&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Convergence workflow for dealing with locked resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-concurrent-workflow.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/heat/+spec/convergence-concurrent-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-concurrent-workflow&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When doing convergence with legacy resource plugins (which is all plugins in
Phase 1 of convergence), we may encounter a resource that is locked for
processing a previous update. We want to wait for this previous update to
complete and retrigger another update with the latest template.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;If the workflow encounters a resource that is locked by another engine, it
should first check that the other engine is still alive, and if not then break
the lock. Assuming the other engine is still working, the workflow should
neither process that resource nor trigger processing any subsequent nodes. To
ensure that processing of that graph node is retriggered once the previous
update is complete, we must check at the conclusion of every update whether the
traversal we are processing is still current.&lt;/p&gt;
&lt;p&gt;Since SyncPoints belonging to previous traversals are deleted before beginning
a new one, failing to find a SyncPoint in the database is sufficient to alert
us of a potentially-waiting new traversal. If this occurs, reload the stack to
determine the current traversal, and check the SyncPoint for the current node
to determine if it is ready. If it is, then retrigger the current node with the
appropriate data for the latest traversal (which can be found in the Stack
table).&lt;/p&gt;
&lt;p&gt;There is a race that could cause multiple triggers on the same graph node,
however it will be resolved by the lock on the resource, since only the process
that successfully acquires the lock will continue.&lt;/p&gt;
&lt;p&gt;An exception to all of this is the case where the graph node is of the update
type and the resource status is DELETE_IN_PROGRESS. In that case, we should
simply create a replacement 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&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;ananta&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Bail out when we encounter a locked resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrigger when required if a SyncPoint is not found&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace a resource that is still needed but has the status DELETE_IN_PROGRESS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create developer 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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-resource-locking"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-locking&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-stack-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-stack-data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-resource-replacement"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-replacement&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement SyncPoint DB table</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-graph-progress.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/heat/+spec/convergence-graph-progress"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As we traverse the dependency graph during an update, we need to keep a record
of our progress so that we can resume the traversal later in case it is
interrupted.&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 table, &lt;cite&gt;SyncPoint&lt;/cite&gt;, to the database with the following rows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;resource_id&lt;/cite&gt; (a Resource key)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;is_update&lt;/cite&gt; (Boolean - True for update, False for cleanup)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;traversal_id&lt;/cite&gt; (UUID)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;stack_id&lt;/cite&gt; (a Stack key)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;input_data&lt;/cite&gt; (JSON data)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first three fields should form a composite primary key. That should allow
us to do a quick get of a SyncPoint given a graph key (resource key + is_update
direction) and traversal ID (i.e.  without doing a query). The stack key
together with the traversal ID allows us to query for all of the SyncPoints
associated with a particular traversal (e.g.  to delete them if the traversal
is cancelled.)&lt;/p&gt;
&lt;p&gt;The input data will contain a map of graph keys (resource key of the Resource
that was current at the beginning of the update + is_update direction) to
resource key (may be different if the resource was replaced), RefID and
attribute data. Thus the input data pushed from previously-updated resources is
cached until such time as the current resource is ready for it. This data will
likely be serialised in JSON format, and could be quite large.&lt;/p&gt;
&lt;p&gt;A prototype for this is
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/sync_point.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/sync_point.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Updates to the input data must be atomic, and must use the “UPDATE … WHERE
…” form discussed in
&lt;a class="reference external" href="http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/"&gt;http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/&lt;/a&gt;
- which probably means adding an extra integer field that is incremented on
every write (since we can’t really query on a text field).&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&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;rh-s&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 new table and DB migration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement an API for creating and updating entries&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-push-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-push-data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-stack-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-stack-data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/heat/+bug/1415237"&gt;https://bugs.launchpad.net/heat/+bug/1415237&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Load and generate the dependency graph for a stack traversal</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-prepare-traversal.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/heat/+spec/convergence-prepare-traversal"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-prepare-traversal&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We need to precalculate the graph of dependencies between all extant resources
in the stack, including versions of resources that are now out of date.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;When applying a transformation to a stack, load all extant resources for that
stack from the DB. If one or more versions of a resource in the template
already exist, select the most up-to-date one to update provided it is in a
valid state. If no versions of a resource in the template exist in the
database, create one for it.&lt;/p&gt;
&lt;p&gt;Calculate the dependency graph, such that we will visit all of the selected
resources in dependency order to update them where neccessary and visit &lt;em&gt;all&lt;/em&gt;
of the resources in reverse dependency order to clean them up where neccessary.
Clean-up operations on a resource must always happen after any update operation
on the same resource.&lt;/p&gt;
&lt;p&gt;Finally, replace the traversal ID with a new UUID and create a SyncPoint for
each node in the graph with this traversal ID. It should also create a
SyncPoint for the stack itself, which will be used to indicate when the update
portion of the traversal is complete, at which time the stack status can be
updated.&lt;/p&gt;
&lt;p&gt;This code should largely follow the prototype in
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/stack.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/stack.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If two updates are racing, one of them will fail to atomically update the Stack
row with its own newly-generated traversal ID. In this case it should roll back
the database changes, by deleting any newly-created Resource rows that it added
as well as all of the SyncPoints.&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&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;rh-s&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 all resources from a Stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine which resources are the most up-to-date&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new resources where required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate the graph for traversal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create SyncPoints for every node in the graph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Roll back any changes made in the database if we lose the race to be the next
update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create developer 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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-config-option"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-config-option&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-graph-progress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-stack-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-stack-data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-resource-table"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-table&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Convergence Resource replacement</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-resource-replacement.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/heat/+spec/convergence-resource-replacement"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-replacement&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;During a stack update, some resources will need to be replaced (rather than
updated in-place). In general, we can’t know in advance for which resources
that will be the case, so we need to be able to create replacements on the fly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;When we detect that a resource needs to be replaced (i.e. Resource.update
raises UpdateReplace), create a new resource with the same name in the same
stack. Fill in a the &lt;cite&gt;replaces&lt;/cite&gt; and &lt;cite&gt;replaced_by&lt;/cite&gt; fields of the new and
existing resources, respectively. Do &lt;em&gt;not&lt;/em&gt; create a SyncPoint for the new
resource.&lt;/p&gt;
&lt;p&gt;Once the new Resource has been stored in the database, retrigger the current
check with the same data except passing the key of the new resource. Then
return immediately, without triggering any dependent nodes.&lt;/p&gt;
&lt;p&gt;Note that no modification of the graph stored in the Stack is required. When we
come to trigger the SyncPoints of nodes that are dependent on the replaced
resource, the replacement should just use the old resource’s graph key to
impersonate it. However the contents of the input data (not the keys) to the
next resource will contain the resource ID of the replacement, so that
dependent resources will update their dependency lists. The previous resource
will be visited again in the clean-up phase of the graph, at which point it
will be deleted.&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&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;ananta&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 a replacement resource and link it to its predecessor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trigger the check on the new resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create developer 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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Add convergence data to the Resource table</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-resource-table.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/heat/+spec/convergence-resource-table"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-table&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The convergence design requires extra data to be stored with each Resource row
in the database, in order to allow different versions of a resource to co-exist
within the same stack.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the following extra fields to the Resource table:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;needed_by&lt;/cite&gt; (a list of Resource keys)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;requires&lt;/cite&gt; (a list of Resource keys)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;replaces&lt;/cite&gt; (a single Resource key, Null by default)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;replaced_by&lt;/cite&gt; (a single Resource key, Null by default)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;current_template&lt;/cite&gt; (a single RawTemplate key)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Note, the first two fields are currently known as &lt;cite&gt;requirers&lt;/cite&gt; and
&lt;cite&gt;requirements&lt;/cite&gt;, respectively, in
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/resource.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/resource.py&lt;/a&gt;
- but those are too confusing. Once we settle on names, we should update the
simulator code as well.)&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&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;skraynev&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Database migration&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;We need to resolve &lt;a class="reference external" href="https://bugs.launchpad.net/heat/+bug/1415237"&gt;https://bugs.launchpad.net/heat/+bug/1415237&lt;/a&gt; first as that
will determine what the type of a Resource key is.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Convergence Rollback</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-rollback.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/heat/+spec/convergence-rollback"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-rollback&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We need to allow the user to cancel an update that is in progress and roll back
to the previous known good state. We also need to give users the option of
rolling back to the previous known good state in the event of a failure while
updating the stack.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Since convergence removes the Stack-level locking for updates, we can implement
rollback as a simple update to a previously-stored version of the template.
Other parts of the convergence implementation will ensure that this deals
correctly with any resources that may still be in progress. The update will
still get a new traversal ID, even though it is updating to the same template
ID that was seen previously.&lt;/p&gt;
&lt;p&gt;In the Stack table, we will store the ID of the most recent template to
successfully complete (if any) alongside the ID of the current target template
(at the completion of an update, these will be the same). Whenever either of
the stored template IDs are overwritten in such a way that we will no longer
refer to a particular Template, delete that Template from the database.&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&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;ananta&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 rollback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clean up unused 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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-concurrent-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-concurrent-workflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-parameter-storage"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-parameter-storage&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-stack-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-stack-data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Port tests from convergence simulator</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-simulator-tests.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/heat/+spec/convergence-simulator-tests"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-simulator-tests&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In coming up with the design of convergence, we built a simulator that verifies
a substantial number of test scenarios. The scenarios are defined in what
amounts to a simple DSL. If we can run the exact same scenarios against the
real Heat code base, then we can not only verify that our convergence
implementation fullfills the requirements of the simulator but also continue to
do that over time, even as we add more scenarios and even if we still have the
need to rapidly prototype design changes in the simulator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement a stub for the RPC APIs that puts messages into in-memory queues that
are drained by an event loop.&lt;/p&gt;
&lt;p&gt;Implement a fake resource type that uses an in-memory store to represent the
underlying physical resource.&lt;/p&gt;
&lt;p&gt;Provide wrappers for the global inputs to the scenario - &lt;cite&gt;reality&lt;/cite&gt;, &lt;cite&gt;verify&lt;/cite&gt;,
&lt;cite&gt;Template&lt;/cite&gt;, &lt;cite&gt;RsrcDef&lt;/cite&gt;, &lt;cite&gt;GetRes&lt;/cite&gt;, &lt;cite&gt;GetAtt&lt;/cite&gt;, &lt;cite&gt;engine&lt;/cite&gt;, &lt;cite&gt;converger&lt;/cite&gt; - that allow
them to be backed by the real equivalent classes in Heat.&lt;/p&gt;
&lt;p&gt;Finally, reimplement
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/test_converge.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/test_converge.py&lt;/a&gt;
using testtools primitives and passing the wrappers above as globals, rather
than those defined in
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/__init__.py#L24-L41"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/__init__.py#L24-L41&lt;/a&gt;&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&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;ishant-tyagi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 RPC stub and event loop&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement fake TestResource type and backend simulator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement wrappers to map the scenario DSL to real Heat classes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a unit test framework to run the scenarios&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-message-bus"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-message-bus&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, few of these tests are going to pass until Phase 1 of convergence is
substantially complete.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Add extra data to the Stack table for convergence</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-stack-data.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/heat/+spec/convergence-stack-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-stack-data&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The convergence design requires extra data to be stored with each Stack row in
order to manage concurrent updates.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the following extra fields to the Stack table:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;prev_raw_template&lt;/cite&gt; (a RawTemplate key)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;current_traversal&lt;/cite&gt; (a UUID that gets changed on each update)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;current_deps&lt;/cite&gt; (a list of edges in the dependency graph, stored as JSON)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also need to ensure that modifications to the Stack table are atomic with
respect to the &lt;cite&gt;current_traversal&lt;/cite&gt; field - if a new traversal starts then any
previous traversals should stop updating the stack data. This should be
achieved using the “UPDATE … WHERE …” form as discussed in
&lt;a class="reference external" href="http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/"&gt;http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/&lt;/a&gt;&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&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;unmesh-gurjar&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 the database migration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that updates are atomic w.r.t. &lt;cite&gt;current_traversal&lt;/cite&gt;&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Decouple AWS and OS resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/decouple-aws-os-resources.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/heat/+spec/decouple-aws-os-resources"&gt;https://blueprints.launchpad.net/heat/+spec/decouple-aws-os-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Decouple AWS and OS resources code.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The code structure of the resources folder is in some confusion.
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/reorganize-resources-code-structure"&gt;https://blueprints.launchpad.net/heat/+spec/reorganize-resources-code-structure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is too much coupling between AWS and OS resources for reorganizing to be
possible, for example modules: wait_condition.py, instance.py, user.py and
volume.py.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The new code structure will be:&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;heat&lt;/span&gt;
&lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;engine&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;aws&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;wait_condition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CloudFormation&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WaitCondition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;wait_condition_handle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CloudFormation&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WaitConditionHandle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;EC2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;EC2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VolumeAttachment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&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;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IAM&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IAM&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AccessKey&lt;/span&gt;&lt;span class="p"&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;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;EC2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;wait_condition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WaitCondition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;wait_condition_handle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WaitConditionHandle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
                    &lt;span class="p"&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;Cinder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt; &lt;span class="ow"&gt;and&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;Cinder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VolumeAttachment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;access_policy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AccessPolicy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;ha_restarter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&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;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HARestarter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;wait_condition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;volume_tasks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;volume&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="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And also the tests code will be split:&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;heat&lt;/span&gt;
 &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;
 &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
      &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;test_waitcondition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
      &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;test_os_waitcondition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
      &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;test_volume&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
      &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;test_os_volume&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&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&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;huangtianhua &amp;lt;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;Decouple AWS and OS WaitCondition related resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouple AWS and OS Volumes related resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouple AWS and OS Instances related resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouple AWS and OS Users related resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouple responding 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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Detailed Resource Show</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/detailed-resource-show.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/detailed-resource-show"&gt;https://blueprints.launchpad.net/heat/+spec/detailed-resource-show&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After creating a stack, there is currently no way to retrieve a resource’s
attributes other than outside of heat (e.g. a user can get the ID of a nova
server and call nova directly to get such attributes).&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently a template author needs to explicitly define in the outputs section
which attributes they’ll need access to after a stack is created. Without doing
so, the attributes cannot be retrieved anymore unless the user updates the
template to add such attributes to the outputs section and update the stack
afterwards.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Since the attributes of a resource are really being retrieved by heat using the
resource client, that means the user can get the resource ID from heat and
interact directly with the client (e.g. get the ID of a nova server and talk
directly to nova) to retrieve its attributes.&lt;/p&gt;
&lt;p&gt;We propose returning all resource attributes when displaying data for a
specific resource.  This way, a user will be able to issue a resource-show call
and be able to look up attributes after creating their stacks even if the
template author didn’t think about them beforehand.&lt;/p&gt;
&lt;p&gt;Because these attributes can be retrieved either by the resource’s client or by
changing the template and adding them to the outputs section, this should not
pose
any more risk of revealing sensitive data than what is already possible.&lt;/p&gt;
&lt;p&gt;This can be achieved by changing the API response to also include attributes
that can be automatically discovered (i.e. resources that have an attributes
schema).&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;# API
# the call below would also return all attributes in the resource schema
/&amp;lt;tenant_id&amp;gt;/stacks/&amp;lt;stack_name&amp;gt;/&amp;lt;stack_id&amp;gt;/resources/&amp;lt;resource_name&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;However, some resources have dynamic attributes that cannot be discovered using
their attributes schema, so this approach won’t work for those resources.  For
instance, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Heat::ResourceGroup&lt;/span&gt;&lt;/code&gt; has dynamic attributes based on what
outputs/attributes the group type exposes and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Heat::SoftwareDeployments&lt;/span&gt;&lt;/code&gt;
has an attribute for each output defined in the config resource outputs
property.&lt;/p&gt;
&lt;p&gt;For such resources, the API can be extended to accept a query param that will
hold the names of the attributes to be retrived.  Something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;# API&lt;/p&gt;
&lt;p&gt;/&amp;lt;tenant_id&amp;gt;/stacks/&amp;lt;stack_name&amp;gt;/&amp;lt;stack_id&amp;gt;/resources/
&amp;lt;resource_name&amp;gt;?with_attr=foo&amp;amp;with_attr=bar&lt;/p&gt;
&lt;p&gt;# heatclient&lt;/p&gt;
&lt;p&gt;resource-show &amp;lt;stack_name&amp;gt; &amp;lt;resource_name&amp;gt; –with-attr foo –with-attr bar&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;However, certain clients or scripts may want to consume a given attribute
directly.  For these cases, we could also add two new endpoints: one to keep
things RESTful and return only the discoverable attributes of a resource; and
another one that would only return the value of the requested attribute.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;# API&lt;/p&gt;
&lt;p&gt;/&amp;lt;tenant_id&amp;gt;/stacks/&amp;lt;stack_name&amp;gt;/&amp;lt;stack_id&amp;gt;/resources/&amp;lt;resource_name&amp;gt;/
attributes&lt;/p&gt;
&lt;p&gt;/&amp;lt;tenant_id&amp;gt;/stacks/&amp;lt;stack_name&amp;gt;/&amp;lt;stack_id&amp;gt;/resources/&amp;lt;resource_name&amp;gt;/
attributes/&amp;lt;attribute_name&amp;gt;&lt;/p&gt;
&lt;p&gt;# heatclient&lt;/p&gt;
&lt;p&gt;heat resource-attributes &amp;lt;stack-id&amp;gt; &amp;lt;resource-name&amp;gt;&lt;/p&gt;
&lt;p&gt;heat resource-attributes &amp;lt;stack-id&amp;gt; &amp;lt;resource-name&amp;gt; &amp;lt;attribute-name&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Alternatively, we can keep the current resource-show behavior the same and only
add the two new endpoints to return the attribute information.  This has the
benefit of being simpler to implement, as only changes to add the new endpoint
would be needed.  However, the drawback is that one would have to make two
separate calls to get all the available information on a given resource: one to
resource-show and another one to resource-attributes.&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;andersonvom
asifrc&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo&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 resource attributes to the engine API at format time.&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Digest Intrinsic Function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/digest-intrinsic-function.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/digest-intrinsic-function"&gt;https://blueprints.launchpad.net/heat/+spec/digest-intrinsic-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It would be useful to the user to have intrinsic functions to perform digest
operations such as MD5 or SHA-512.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Certain applications require the user to provide information in a hashed format
(e.g. Chef user resources only take hashed passwords), so it would be useful to
the user to be able to use an intrinsic function to do it for them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add another class to run existing digest algorithms (e.g. MD5, SHA-512, etc) on
user provided data and expose it in the HOT functions list.  The class would
take the name of the digest algortihm and the value to be hashed.&lt;/p&gt;
&lt;p&gt;Python’s &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hashlib&lt;/span&gt;&lt;/code&gt; natively supports md5, sha1 and sha2 (sha224, 256, 384,
512) on most platforms and this will be documented as being the supported list
of algorithms. But the cloud provider may go beyond and support more algortihms
as well, since, depending on the way Python was built, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hashlib&lt;/span&gt;&lt;/code&gt; can also use
algorithms supported by OpenSSL.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;# raw string
gravatar: { digest: [‘md5’, &lt;a class="reference external" href="mailto:'sample%40example.com"&gt;‘sample&lt;span&gt;@&lt;/span&gt;example&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;’] }&lt;/p&gt;
&lt;p&gt;# from a user supplied parameter
pwd_hash: { digest: [‘sha512’, { get_param: raw_password }] }&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There’s really no good alternative other than an intrinsic function for 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;p&gt;andersonvom&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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 class to perform digest operations;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expose new class to HOT templates;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the docs;&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Usablity enhancements to the user’s environment.</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/environment-enhancements.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/heat/+spec/env-nested-usability"&gt;https://blueprints.launchpad.net/heat/+spec/env-nested-usability&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There a number of related enhancements that we can easily do in the
way the environment interacts with template resources, lets quickly
solve these for our users, to make heat more useable.
These issues have been raised here:
&lt;a class="reference external" href="https://etherpad.openstack.org/p/heat-useablity-improvements"&gt;https://etherpad.openstack.org/p/heat-useablity-improvements&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Here are some small problems that are related to the interaction of
the environment and template resources. They are grouped here to
reduce the red-tape.&lt;/p&gt;
&lt;section id="no-way-to-specify-global-parameters"&gt;
&lt;h3&gt;No way to specify “global” parameters&lt;/h3&gt;
&lt;p&gt;When creating deep and/or complex compositions of multiple provider
templates, it becomes cubmersome if you end up passing a long list
of common parameters down through the “layers” via
properties/parameters.  If the environment had a “global_parameters”
section, you could specify those parameters which should be visible
to not only the top-level stack, but all child stacks too.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="there-is-no-way-to-transparently-replace-a-resource-with-a-provider-resource"&gt;
&lt;h3&gt;There is no way to transparently replace a resource with a provider resource.&lt;/h3&gt;
&lt;p&gt;When, for example, you replace OS::Nova::Server with
OS::My::SpecialServer via a provider resource mapped in the
environment, you can’t use the overloaded special server
transparently, because when you do get_resource: special_server, you
get a nested stack ID, not the nested server ID.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="required-mirroring-of-resource-attributes"&gt;
&lt;h3&gt;Required mirroring of resource attributes.&lt;/h3&gt;
&lt;p&gt;It is a pain to require the user to mirror a nested stack’s resource
attributes in the outputs so they can be referenced outside of the
nested stack. We should generate these attributes dynamically.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Add the concept of parameter_defaults to the environment.
This will look like the following:&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;parameter_defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&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;far&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;away&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The behaviour of these parameters will be as follows:
- if there is no parameter definition for it, it will be ignored.
- these will be passed into all nested templates
- they will only be used as a default so that they can be explicitly
overridden in the “parameters” section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support a specially named output to Template resources that is used
for references.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Modify the FnGetRefId of TemplateResource to look for an output called
“OS::stack_id”, if this is provided then return this, else the current
value.&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;Add dynamic attributes to template resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A reminder of what the resource group does:&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a_resource_group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;attr_name&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For template resources the following will be supported:&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a_resource_templ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;attr_name&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To achieve this, _resolve_attribute() will be overridden to look for
“resource.&amp;lt;res name&amp;gt;” and then drill down to that resource’s attribute.&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&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;asalkeld&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;Each item can be completed seperately.
Documentation for each feature needs to be added to the template guide.&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement ‘InstanceId’ for AutoScalingGroup</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/implement-instanceid-for-autoscalinggroup.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/implement-instanceid-for-autoscalinggroup"&gt;https://blueprints.launchpad.net/heat/+spec/implement-instanceid-for-autoscalinggroup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We should support the ‘InstanceId’ for AWS::AutoScaling::AutoScalingGroup
resource to be compatible with AWSCloudFormation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In AWSCloudFormation, user can specify ‘InstanceId’ property if he want to
create an Auto Scaling group that uses an existing instance instead of
a launch configuration, see:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now in Heat, the AWS::AutoScaling::AutoScalingGroup resource only has
‘LaunchConfigurationName’ property, will be good to implement ‘InstanceId’
property.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Change ‘LaunchConfigurationName’ to be an optional property&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ‘InstanceId’ property, optional and non-updatable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add validate for AWS::AutoScaling::AutoScalingGroup resource, make sure
choose one of the two properties&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the _get_conf_properties() function&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;if specify ‘InstanceId’, to get the attributes of the instance, and
to make a temporary launch config resource, and then return the resource
and its properties.&lt;/p&gt;
&lt;p&gt;Note that the attributes include ImageId, InstanceType, KeyName,
SecurityGroups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if without ‘InstanceId’, using the old way to get the launch config
resource and its properties.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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&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:
huangtianhua &amp;lt;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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 the ‘InstanceId’ property&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest for the change&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement ‘InstanceId’ for LaunchConfiguration</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/implement-instanceid-for-launchconfiguration.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/implement-instanceid-for-launchconfiguration"&gt;https://blueprints.launchpad.net/heat/+spec/implement-instanceid-for-launchconfiguration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We should support the ‘InstanceId’ for AWS::AutoScaling::LaunchConfiguration
resource to be compatible with AWSCloudFormation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In AWSCloudFormation, user can specify ‘InstanceId’ property if he wants the
launch configuration to use settings from an existing instance, see:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html&lt;/a&gt;
&lt;a class="reference external" href="http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/create-lc-with-instanceID.html"&gt;http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/create-lc-with-instanceID.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Will be good to implement ‘InstanceId’ property to be compatible with
AWSCloudFormation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add ‘InstanceId’ property, optional and non-updatable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change ‘ImageId’ and ‘InstanceType’ properties to optional&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the validation of ‘InstanceId’, ‘ImageId’ and ‘InstanceType’, if don’t
specify ‘InstanceId’, the other two properties are required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;According to the aws developer guide and implementation, allows three cases:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Without ‘InstanceId’, should specify ‘ImageId’ and ‘InstanceType’
properties, using the old way to create the new launch configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify ‘InstanceId’ only, the new launch configuration has
‘ImageId’, ‘InstanceType’, ‘KeyName’, and ‘SecurityGroups’
attributes from the instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify ‘InstanceId’ and other properties else, these properties will
override the attributes from the instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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&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:
huangtianhua &amp;lt;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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 the ‘InstanceId’ property&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest for the change&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement Mistral resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/mistral-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/mistral-resources-for-heat"&gt;https://blueprints.launchpad.net/heat/+spec/mistral-resources-for-heat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add support for Mistral resources which will allow to create and execute
workflows.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat doesn’t support Mistral resources currently.&lt;/p&gt;
&lt;p&gt;Mistral is a task management service, also known as Workflow as a Service.
Resources, which will be added to Heat, add new possibilities:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Workflows, which contains different tasks for execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Actions, which are a particular instructions associated with a tasks
that needs to be performed once tasks dependencies are satisfied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CronTriggers, which make possible to run workflows according to
specific rules: periodically setting a cron pattern or on external
events like Ceilometer alarm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Executions, which allows to execute given Workflows.&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;Mistral resources are not integrated, so they will be added to contrib
directory.
Mistral client plugin will be added for communication with Mistral, which has
his own requirements. Following resources will be added with next syntax:&lt;/p&gt;
&lt;p&gt;Add the OS::Mistral::Workflow resource, like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::Workflow&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="no"&gt;workflow_name:&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;type: String&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;description: String&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;input: [Value, Value, ...]&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;output: { ... }&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;on-success: [Value, Value, ...]&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;on-error: [Value, Value, ...]&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;on-complete: [Value, Value, ...]&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;policies: { ... }&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;tasks: { ... }&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &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;Where definition specifying rely on Mistral DSL v2.&lt;/p&gt;
&lt;p&gt;Add the OS::Mistral::CronTrigger resource, like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cronTrigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::CronTrigger&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my_cron_trigger&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1 0 * * *&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &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;There is some use cases, which should be described:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;To create and execute workflow follow next steps: at first we create
template with OS::Mistral::Workflow:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2013-05-23&lt;/span&gt;
&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::Workflow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;test:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;type: direct&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;tasks:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;hello:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;action: std.echo output='Hello'&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;publish:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="no"&gt;result: $&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When stack will created, to execute workflow run next command:&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;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="n"&gt;stack_name&lt;/span&gt; &lt;span class="n"&gt;workflow_name&lt;/span&gt; \
    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="s1"&gt;'Json-type execution input'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Execution state will be available in ‘executions’ attribute as a dict.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility with Ceilometer alarms, i.e. using webhook url for workflow
executing:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2013-05-23&lt;/span&gt;
&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::Workflow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;test:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;type: direct&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;tasks:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;alarm_hello:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;action: std.echo output='Alarm!'&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;publish:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="no"&gt;result: $&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Ceilometer::Alarm&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;alarm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Ceilometer::Alarm&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;meter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;cpu_util&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;statistic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;avg&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;60&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;evaluation_periods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;alarm_actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alarm_url&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;comparison_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ge&lt;/span&gt;
&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;executions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;executions&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;workflows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;available_workflows&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &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 the template, described above, workflow will begin execute when alarm
will goes to the state ‘alarm’. Output ‘execution’ contain dict with info
about all executions, which belong to the workflow. Output ‘workflows’
contain dict with all workflows’ names that belong to the workflow, e.g.
{‘test’: ‘stack_name.workflow.test’}.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using cron trigger in template. There is the definition named ‘wfdef.yaml’:&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;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2.0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;create_vm&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;direct&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;vm_name&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;image_ref&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;flavor_ref&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;vm_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;$.vm_id&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;create_server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;nova.servers_create name={$.vm_name} image={$.image_ref}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;flavor={$.flavor_ref}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;vm_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;$.id&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;on-success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;check_server_exists&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;check_server_exists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.servers_get server={$.vm_id}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;server_exists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;on-success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;wait_instance&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;wait_instance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nova.servers_find id={$.vm_id} status='ACTIVE'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;policies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This definition will be used in template, which also have cron trigger
resource:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2013-05-23&lt;/span&gt;
&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::Workflow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;wfdef.yaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;vm_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;image_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;some_image_id&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;flavor_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;some_flavor_id&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cron_trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Mistral::CronTrigger&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test_trigger&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1 0 * * *&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;workflow&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;available_workflows&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;create_vm&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;Need to note, that name is optional attribute.&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&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;&amp;lt;prazumovsky&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Assisted by:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;tlashchova&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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 Mistral client plugin for Heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Mistral workflow resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Mistral cron trigger resource&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Optimize Nova Custom Constraints</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/nova-custom-constraints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/nova-custom-constraints"&gt;https://blueprints.launchpad.net/heat/+spec/nova-custom-constraints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Optimize Nova Custom Constraints, add/apply nova server constraint,
and apply nova flavor constraint.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Many resources have property InstanceId/Server which related with nova
server, but until now we haven’t support nova server constraints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Just define nova flavor custom constraint, but not to apply it.&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add nova server custom constraint, and to apply it for resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move nova keypair and flavor custom constraints to nova.py, to make sure
all nova custom constraints defined together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply nova flavor constraints for resources.&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add/Apply nova server custom constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move nova keypair and flavor custom constraints to nova.py.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply nova flavor constraints for resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest tests for all the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>OS::Nova::Server rich network property</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/rich-network-prop.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/rich-network-prop"&gt;https://blueprints.launchpad.net/heat/+spec/rich-network-prop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Allowing port and floating IP association properties to be specified within a
OS::Nova::Server works around issues with nova port management, provides
users with a simpler way of implementing a common pattern, and allows more
templates to be neutron/nova-networking agnostic.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are a number of issues with OS::Neutron::Port which are currently
difficult to work around, including:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;On server delete Nova deletes all ports, even those which were created
before the nova boot (&lt;a class="reference external" href="https://bugs.launchpad.net/nova/+bug/1158684"&gt;https://bugs.launchpad.net/nova/+bug/1158684&lt;/a&gt;).
This causes issues on a stack-update since the port underlying a given
port resource may no longer exist once the server has been replaced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A port’s relationship with a server is exclusive, however a stack-update
which replaces a server will have the old and new servers attempting to
attach to the same port resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Two ports with the same fixed IP address cannot exist on the same network,
so a stack-update which results in a port being replaced will fail
unless the fixed IP address is changed too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::Port has a top-level &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;network&lt;/span&gt;&lt;/code&gt; property but the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;subnet&lt;/span&gt;&lt;/code&gt;
is inside the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fixed_ips&lt;/span&gt;&lt;/code&gt; property. If a network has multiple subnets
and the port resource does not specify which subnet then neutron assigns
the port to a non-deterministic subnet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users can avoid the above problems if they don’t define an OS::Neutron::Port
resource, but they must if they want to define a neutron floating IP
association. Server+port+floating-ip is such a common pattern that users
would benefit from being able to define all this in the server resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Likewise any template which associates servers with floating IPs will only
work on either a neutron or nova-networking OpenStack.&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;OS::Nova::Server has a networks property which allows a list of maps, where
the map key is one of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fixed_ip&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;network&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;uuid&lt;/span&gt;&lt;/code&gt; which
map directly to nova boot nic options.&lt;/p&gt;
&lt;p&gt;The proposed change is that new keys will be added to this map to support
fully describing ports within the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;networks&lt;/span&gt;&lt;/code&gt; items. The server resource
will take responsibility for creating and managing the port rather than
allowing nova to create the port implicitly.&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;network&lt;/span&gt;&lt;/code&gt; &lt;em&gt;existing key&lt;/em&gt; Name or UUID of network to create the nic on.
Applies to neutron and nova-network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fixed_ip&lt;/span&gt;&lt;/code&gt; &lt;em&gt;existing key&lt;/em&gt; Optional fixed IP address to assign to the
nic. Applies to neutron and nova-network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;subnet&lt;/span&gt;&lt;/code&gt; &lt;em&gt;new key&lt;/em&gt; Name or UUID of neutron subnet to create the nic on.
If specified then &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;network&lt;/span&gt;&lt;/code&gt; is optional. If &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;network&lt;/span&gt;&lt;/code&gt; is also specified
then validation will confirm whether the subnet belongs to the network.
Applies to neutron only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;floating_ip&lt;/span&gt;&lt;/code&gt; &lt;em&gt;new key&lt;/em&gt; ID of the floating IP to assign to this networks
entry. The value can be a ref from a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Neutron::FloatingIP&lt;/span&gt;&lt;/code&gt; or
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Nova::FloatingIP&lt;/span&gt;&lt;/code&gt;. Or it can be provided a string from a parameter
from an already existing floating IP. This property replaces
OS::Neutron::FloatingIPAssociation and OS::Nova::FloatingIPAssociation so
these resources which don’t represent &lt;em&gt;real&lt;/em&gt; resources can be deprecated.
Applies to neutron and nova-network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port_extra_properties&lt;/span&gt;&lt;/code&gt; Map containing extra values to the neutron port
creation which are not covered by the above or the derived properties.
Applies to neutron only.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation will be in the Server resource and will have different
paths based on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;self.is_using_neutron&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Validation will be performed so that an error is raised if a value is set
that is not supported by nova-networking.&lt;/p&gt;
&lt;p&gt;Server create in the neutron path will do the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Limit the port to have at most one fixed_ip (neutron ports allow multiple
fixed_ips). Users who require multiple fixed IPs can still create a full
port resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Derive the security groups from the Server property security_groups. This
means that all created ports will be assigned to the same list of security
groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Derive the port name from the server name and the networks list position&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a port based on the passed and derived properties, and add that
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;port-id&lt;/span&gt;&lt;/code&gt; to the nova &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nics&lt;/span&gt;&lt;/code&gt; list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store the port-id for each created port in the resource data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resource update in the neutron path will do the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Calculate which ports to update, which to create and which to delete&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resource delete in the neutron path will delete any ports stored in the
resource data.&lt;/p&gt;
&lt;p&gt;Special handling will be required for the following case:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A stack update results in server replacement, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;networks&lt;/span&gt;&lt;/code&gt; items has specified a fixed_ip which doesn’t change&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this case the handle_delete of the old server and the handle_create of the
new server will need to interact to allow the new port to be assigned the
fixed_ip which is assigned to the old port. Assigning back to the old port
may be required on rollback too.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative is to wait for bug #1158684 to be fixed in Nova, and make any
other necessary changes to OS::Neutron::Port and OS::Nova::Server to mitigate
the items listed in the &lt;a class="reference internal" href="#problem-description"&gt;Problem description&lt;/a&gt;. (Items 4., 5. and 6. likely
wouldn’t be addressed.&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;This blueprint needs a primary author to adopt it. Steve Baker will provide
implementation and review assistance if required.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;skraynev&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Assisted by:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;steve-stevebaker&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;Steps mentioned in section Proposed change describes the list of work items.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;There are no blueprint or library dependencies for this blueprint.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Software config notify deployment progress</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/software-config-progress.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/software-config-progress"&gt;https://blueprints.launchpad.net/heat/+spec/software-config-progress&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently when a deployment resource remains IN_PROGRESS there is no way of
knowing whether configuration is taking a long time, or if an unrelated
problem occured before or after. The only option is to ssh into a server to
diagnose the issue. This blueprint proposes that the server signal to heat
when any deployment activity starts.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently when a deployment resource remains IN_PROGRESS the configuration may
be taking a legitimately long time. In other cases there may be a failure due
to one of the following problems.&lt;/p&gt;
&lt;p&gt;The potential problems during server boot include:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Nova says the server has booted but the image failed to actually boot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server booted, but was not successfully assigned an IP address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nova metadata server cannot be reached on boot to poll for initial metadata&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The potential problems which occur after boot but before a specific deployment
is executed include:&lt;/p&gt;
&lt;ol class="arabic simple" start="4"&gt;
&lt;li&gt;&lt;p&gt;Misconfiguration in the installed server agent, hooks and config tools&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5. Failure to poll deployment metadata from heat (or other configured polling
source)&lt;/p&gt;
&lt;p&gt;And finally the potential problems when actually executing the deployment:&lt;/p&gt;
&lt;p&gt;6. Inability for the server to signal the results back to heat, either due to
authentication or connectivity issues.&lt;/p&gt;
&lt;p&gt;Currently there is no feedback that the actual deployment has started. If the
user had earlier feedback that deployment has started then they can eliminate
the above six failures as the cause of the deployment being IN_PROGRESS.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Currently SoftwareDeployment.signal assumes that as soon as a signal is
received the deployment task is complete. This will be changed so that the
signal details are checked for extra data which indicates that this is an
IN_PROGRESS signal rather than a COMPLETE/FAILED signal. The software-config
hooks will be modified to send an IN_PROGRESS signal before they start the
deployment task.&lt;/p&gt;
&lt;p&gt;The signal details are currently a JSON map with entries for each output
value, plus &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_stdout&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_stderr&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_status_code&lt;/span&gt;&lt;/code&gt;.
Two new entries will be expected, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_status&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_status_reason&lt;/span&gt;&lt;/code&gt;. SoftwareDeployment.signal will check for this and
if &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_status&lt;/span&gt;&lt;/code&gt; is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;IN_PROGRESS&lt;/span&gt;&lt;/code&gt; then the deployment resource will
remain in an IN_PROGRESS state. However there will be a resource event
generated to give the user some feedback that their deployment task has
started.&lt;/p&gt;
&lt;p&gt;Backwards-compatibility concerns need to be considered both with old images
running on new heat, and new images running on old heat.&lt;/p&gt;
&lt;section id="old-image-new-heat"&gt;
&lt;h3&gt;Old image, new heat&lt;/h3&gt;
&lt;p&gt;There is nothing special to consider here. The server will not signal heat
that a deployment is starting, but the deployment resource will already be in
an IN_PROGRESS state. The only implication is that the user will not see the
extra IN_PROGRESS event telling them that the deployment has started.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-image-old-heat"&gt;
&lt;h3&gt;New image, old heat&lt;/h3&gt;
&lt;p&gt;Since old heat assumes that the deployment is complete as soon as a signal is
received, the hooks need to suppress sending any IN_PROGRESS signals. This
can be achieved by the hooks checking for the input &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy_status_aware&lt;/span&gt;&lt;/code&gt;
being set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;true&lt;/span&gt;&lt;/code&gt;. Only new heat will set this input value to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;true&lt;/span&gt;&lt;/code&gt; so
the hook can check this input and behave accordingly.&lt;/p&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&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;&amp;lt;steve-stevebaker&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different
people, but we’re mostly trying to understand the timeline for implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;There are no blueprint or library dependencies for this blueprint&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Trigger an action in a software-config component</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/software-config-trigger.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/software-config-trigger"&gt;https://blueprints.launchpad.net/heat/+spec/software-config-trigger&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OS::Heat::SoftwareComponent now allows non-lifecycle configs to be specified.
This feature will make it possible to trigger these configs and monitor their
progress and results.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OS::Heat::SoftwareComponent can specify configs to execute for stack lifecycle
actions (CREATE, DELETE etc) but it can also specify any non-lifecycle
actions (eg BACKUP, FOO, BAR). However there is currently no obvious way to
trigger these non-lifecycle actions. Once this feature is complete it should
be possible to use the heat CLI tool to do the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Trigger a single config already defined in a OS::Heat::SoftwareComponent
resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor the progress of a triggered config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;View the resulting outputs of a triggered config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cancel the in-progress state of a triggered config&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;Hypothetically it is already possible to trigger a single action config in a
SoftwareComponent by interacting directly with the REST API, however there is
no way to receive the results of this trigger.&lt;/p&gt;
&lt;p&gt;Consider a SoftwareComponent which defines a config that runs on the action
BACKUP. Once stack creation is complete the following would have happened:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Config created containing the component configs, including the BACKUP
action config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Derived-config created, which will add the deployment extra inputs etc
provided by the deployment resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment created which associates the derived-config with the nova server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now to trigger BACKUP on a given server in the stack (optionally with some
extra input values set), REST API calls can be made to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fetch the original config, modify the input values (if necessary), then
create a derived-config. This leaves the stack-managed
derived-config resource untouched.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a swift TempURL to store the signal from the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a trigger deployment, specifying the derived-config, the
server, and the action BACKUP. The name of the trigger deployment is
derived from the original deployment, plus the action name (BACKUP)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The above will all be performed by a single &lt;cite&gt;heat deployment-create&lt;/cite&gt; command
where the user can specify all the values required to create a deployment,
including the config, server, name, action, overridden input values, etc.&lt;/p&gt;
&lt;p&gt;Changes will be required to move some OS::Heat::SoftwareDeployment into the
deployment create call itself.&lt;/p&gt;
&lt;p&gt;This blueprint will also depend on blueprint software-config-swift-signal
since there will need to be a signal store which is not coupled with any
stack or resources.&lt;/p&gt;
&lt;p&gt;python-heatclient will need to be modified so that all software-config and
deployment operations can be done from the command line. New convenience
commands will also be added to trigger and monitor a single action in a
component.&lt;/p&gt;
&lt;p&gt;This could also be an appropriate umbrella blueprint to switch to using RPC
instead of full REST calls for when config and deployment resources call
config and deployment APIs.&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&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;&amp;lt;steve-stevebaker&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Currently python-heatclient lacks any cli commands to manage software configs
and deployments. A prerequisite for this change is cli support for
interacting with the existing config and deployment REST API, including&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Creating a software-config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Showing a software-config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deleting a software-config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating a software-deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Showing a software-deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deleting a software-deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Listing software-deployments for a given server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once these have been implemented, new convenience commands will also be added
to trigger and monitor a single action in a component.&lt;/p&gt;
&lt;p&gt;In heat, the following changes would be required:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move some OS::Heat::SoftwareDeployment into the deployment create call
itself. Specifically, creating the derived config and the deployment could
be combined in EngineService.create_software_deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify EngineService.resource_signal so that some signal calls get
redirected to a new method EngineService.signal_software_deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional tests to confirm the above can be used.&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;Not a hard dependency, but this would benefit from blueprint
software-config-progress being implemented to provide the user with feedback
that their config trigger has started.&lt;/p&gt;
&lt;p&gt;If it is deemed inappropriate to modify EngineService.resource_signal then
some alternative external polling based signaling would be required, as
provided by blueprint software-config-swift-signal or blueprint
software-config-zaqar.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Use Zaqar for software-config metadata and signaling</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/software-config-zaqar.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/software-config-zaqar"&gt;https://blueprints.launchpad.net/heat/+spec/software-config-zaqar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zaqar provides a simple messaging service which allows heat and orchestrated
services to efficiently communicate with each other, which make it ideal for
software-config metadata distribution and signaling&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are a number of areas where having a messaging service like Zaqar
available can benefit Heat. Two of these are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Propagating server configuration metadata from heat to the servers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Signaling from servers to heat that a software configuration event has
occurred, with associated data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like OS::Nova::Server software_config_transport:POLL_TEMP_URL this will stop
servers from polling heat directly for metadata delivery which will improve
heat scalability.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;For OS::Nova::Server software_config_transport:ZAQAR_MESSAGE create a queue
dedicated to publishing metadata changes from heat to one server.
os-collect-config will need a collector which consumes messages from this
queue.&lt;/p&gt;
&lt;p&gt;For OS::Heat::SoftwareDeployment signal_transport:ZAQAR_MESSAGE create a queue
dedicated to one server signalling configuration results to one deployment
resource. heat-templates 55-heat-config will need to be modified to depend on
python-zaqarclient and push to the queue if the required deploy input values
indicate that a queue is configured.&lt;/p&gt;
&lt;p&gt;Just like signal_transport:HEAT_SIGNAL and
software_config_transport:POLL_SERVER_HEAT there will be a stack users
created for the deployment and server resources and the credentials for those
users will be given to the server. If and when Zaqar allows reading and
writing messages to signed webhooks then we can consider switching to this so
that it is not necessary to create the stack users.&lt;/p&gt;
&lt;p&gt;signal_transport:AUTO will be modified so that ZAQAR_MESSAGE is the preferred
method if there is a configured messaging endpoint.&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&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;This blueprint currently has no engineer assigned to it&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 OS::Nova::Server software_config_transport:ZAQAR_MESSAGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement OS::Heat::SoftwareDeployment signal_transport:ZAQAR_MESSAGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a Zaqar collector for os-collect-config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify software-config os-refresh-config hook to use zaqar to push
deployment signal data&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;python-zaqarclient will be added to heat/requirements.txt (this is already a
requirement for the zaqar contrib resource)&lt;/p&gt;
&lt;p&gt;python-zaqarclient will become a requirement in os-collect-config and the
heat-templates heat-config element.&lt;/p&gt;
&lt;p&gt;This could be done after blueprint software-config-trigger since that includes
some refactoring which includes moving signal_transport logic from the
resource to the deployments REST API.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Restrict Stack Update Scope</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/stack-update-restrict.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-update-restrict"&gt;https://blueprints.launchpad.net/heat/+spec/stack-update-restrict&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When updating a stack, there is currently no way to stop an update from
destroying a given resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Users can (and do) worry about stack update doing wonky things. The
update-preview endpoint addresses this partially by showing what will probably
happen. The limitation of the preview function is that resources can raise
UpdateReplace exceptions at any time, making it impossible to be &lt;em&gt;certain&lt;/em&gt; of
the results of an update until it is performed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Use the existing ‘update_policy’ resource attribute to let users protect
certain resources from being replaced during updates.&lt;/p&gt;
&lt;p&gt;If the update_policy can’t be satisfied, heat will move the stack to
‘UPDATE_FAILED’ and halt. If at all possible, constraints should be validated
before applying the update, thus moving the stack straight to ‘UPDATE_FAILED’
when the update_policy is incorrect. After the update fails, the user can
adjust the restrictions and try again.&lt;/p&gt;
&lt;p&gt;The update_policy attribute is already used for CloudFormation autoscaling
preferences, which are nested into the keys “AutoScalingScheduledAction” and
“AutoScalingRollingUpdate”. CFN preferences would be unaffected by the HOT
version of update policies.&lt;/p&gt;
&lt;p&gt;A user would specify per-resource how aggressive an update
can be with a resource. The restrictions could be on updating the resource at
all, or just on destroying the resource (including UpdateReplace).&lt;/p&gt;
&lt;p&gt;The base cases here are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Restrict destroy/replace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restrict nondestructive updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restrict both&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restrict nothing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Omit the update_policy entirely&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The keys for these restrictions would be nested into an ‘actions’ key as 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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;myresource&lt;/span&gt;&lt;span class="p"&gt;:&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;Foo&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Bar&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Baz&lt;/span&gt;
    &lt;span class="n"&gt;update_policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&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 reason for nesting the allowed actions is to avoid adding top level keys if
there are more actions that users want to restrict in the future.&lt;/p&gt;
&lt;p&gt;A user would be able to add or remove restrictions by updating the resource
template. The new restrictions would be effective for the current update. For
example, a resource that would otherwise be replaced would be protected if it
had an update policy added in the current update.&lt;/p&gt;
&lt;p&gt;Conflicting directives are possible, for example in nested stacks. If an inner
resource has “replace: true” but the outer scope has “replace: false” then heat
will transfer the stack to UPDATE_FAILED to surface the problem to the user.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternatives way to handle conflicting directives may be to honor the most
conservative applicable policy. This method would be much more confusing for
users, so failing the update would be preferable.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pitfalls"&gt;
&lt;h3&gt;Pitfalls&lt;/h3&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;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Targeted for Kilo&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;Add an actions key to update_policy&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;update-dry-run&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Support Cinder API version 2</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/support-cinder-api-v2.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-cinder-api-v2"&gt;https://blueprints.launchpad.net/heat/+spec/support-cinder-api-v2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This specification proposes to add support for the second version of the Cinder
API, which brings useful improvements and will soon replace version one.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently Heat uses only version 1 of Cinder API to create volumes.  Version
two, however, brings useful features such as scheduler hints, more consistent
responses, caching, filtering, etc.&lt;/p&gt;
&lt;p&gt;Also, Cinder is deprecating API version 1 in favor of 2 [1], which has been
available in devstack since Havana.  Supporting both would make switching
easier for users.&lt;/p&gt;
&lt;p&gt;The new API provides [2]:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;More consistent properties like ‘name’, ‘description’, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New methods (set_metadata, promote, retype, set_bootable, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Additional options in existing methods (such as the use of scheduler hints).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caching data between controllers instead of multiple database hits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filtering when listing information on volumes, snapshots and backups.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a developer I want to be able to pass scheduler hints to Cinder when
creating volumes, in order to choose back-ends more precisely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a deployer I don’t want to have to choose which Cinder API version to use.
Let Heat autodiscover the latest and use it.&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 new methods to CinderClientPlugin:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;discover_api_versions()
To query Keystone for ‘volume’ and ‘volumev2’ services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;api_version()
To get the Cinder API version currently used by Heat (this value will be set
to latest available one).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The client returned by CinderClientPlugin._create() will be made depending on
api_version().&lt;/p&gt;
&lt;p&gt;Six cinderclient methods are currently used within Heat:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;volumes.get(), volumes.extend(), backups.create() and restores.restore() that
won’t be affected by this change;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volumes.create() and volume.update() that use arguments that differ depending
on the Cinder API version: (display_name, display_description) for v1 and
(name, description) for v2.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The proposed implementation will not change current OS::Cinder::Volume
properties, since they already are ‘name’ and ‘description’ (as in new API
version).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Wait for Cinder API v1 to be deprecated and switch abruptly to v2.&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;adrien-verge&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;Discover the latest Cinder API version using Keystone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the correct Cinder client using the latest available API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use correct arguments for volumes.create() and volume.update() depending on
the used API.&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 id="references"&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;[1]: &lt;a class="reference external" href="https://wiki.openstack.org/wiki/CinderAPIv2"&gt;https://wiki.openstack.org/wiki/CinderAPIv2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[2]: &lt;a class="reference external" href="https://github.com/openstack/nova-specs/blob/master/specs/juno/support-cinderclient-v2.rst"&gt;https://github.com/openstack/nova-specs/blob/master/specs/juno/support-cinderclient-v2.rst&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Implement Trove cluster resource</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/trove-cluster-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/trove-cluster-resource"&gt;https://blueprints.launchpad.net/heat/+spec/trove-cluster-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add support for Trove cluster resource which will allow to create clusters
with Heat.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently we can’t create Trove cluster resource in Heat.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement new resource type:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Trove::Cluster&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;properties&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name())&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;datastore_type (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;datastore_version (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;instance_parameters (list, required)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;flavor (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_size (required)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;attributes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;instances (list of instances ids)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ip (IP of the cluster)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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="usage-scenario"&gt;
&lt;h3&gt;Usage Scenario&lt;/h3&gt;
&lt;p&gt;Create the OS::Trove::Cluster resource like this:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Trove&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cluster&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&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;my_cluster&lt;/span&gt;
      &lt;span class="n"&gt;datastore_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mongodb&lt;/span&gt;
      &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.6.1&lt;/span&gt;
      &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume_size&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="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume_size&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="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume_size&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;/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;tlashchova&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 Trove cluster resource&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;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Use oslo-versioned-objects to help with dealing with upgrades.</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/versioned-objects.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/heat/+spec/versioned-objects"&gt;https://blueprints.launchpad.net/heat/+spec/versioned-objects&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We are looking to improve the way we deal with versioning (of all sorts
db/rpc/rest/templates/plugins).
Nova has come up with the idea of versioned objects, that Ironic has also now
used. This has now been proposed as an oslo library:
&lt;a class="reference external" href="https://review.openstack.org/#/c/127532/"&gt;https://review.openstack.org/#/c/127532/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/kilo-crossproject-upgrades-and-versioning"&gt;https://etherpad.openstack.org/p/kilo-crossproject-upgrades-and-versioning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Versioned-objects will help us deal with DB schema being at a
different version than the code expects. This will allow Heat to be
operated safely during upgrades.&lt;/p&gt;
&lt;p&gt;Looking forward as we pass more and more data over RPC we can make use
of versioned-objects to ensure upgrades happen without spreading the
version dependant code across the code base.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Since it will take some time before versioned-objects goes into the oslo
library, the plan is to get an early version of it for Heat and
transition to oslo-versioned-objects when it is ready.&lt;/p&gt;
&lt;p&gt;Create a directory heat/objects/ that will contain wrapper objects that
are a layer above the db objects. This allows the remainder of Heat to
not having to worry about dealing with older DB objects.&lt;/p&gt;
&lt;p&gt;Once the objects are in place the rest of the code will be changed to
use the versioned objects instead of the db_api directly. This can be
done object-by-object to avoid overly large changes.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&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 objects being introduced are not stored in the database. Instead,
these objects are a replacement for sqlalchemy objects that is being used to
represent stack, resource, etc throughout Heat internals.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;It will take some time to convert heat internals over to the object
model, so the existing convention of direct database calls should be
accepted until all object models are in place.&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;Angus Salkeld &amp;lt;&lt;a class="reference external" href="mailto:asalkeld%40mirantis.com"&gt;asalkeld&lt;span&gt;@&lt;/span&gt;mirantis&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;
&amp;lt;others are welcome to help out&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;(If needed) Obtain an early version of oslo.versionedobjects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the objects for each DB object type we have.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update code that uses the DB to use versioned-objects instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write some developer docs on how to deal with older schema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transition to oslo-versioned-objects as soon as it is available.&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;oslo-versioned-objects&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Nova Server VNC Console Attribute</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/vnc-console.html</link><description>

&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/vnc-console-attr"&gt;https://blueprints.launchpad.net/heat/+spec/vnc-console-attr&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As an end user, if I want to retrieve the vnc console url of a server
resource in heat stack, I need to combine &lt;cite&gt;heat resource-list&lt;/cite&gt; and
&lt;cite&gt;nova get-vnc-console&lt;/cite&gt; to get the result. For example:&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;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stack_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# get physical_resource_id&lt;/span&gt;
&lt;span class="n"&gt;nova&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;vnc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;console&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;physical_resource_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;vnc_console_type&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;We should provide a way for template developers to show console
url(for example, vnc, rdp and spice) in stack outputs.&lt;/p&gt;
&lt;section id="usage-scenario"&gt;
&lt;h3&gt;Usage Scenario&lt;/h3&gt;
&lt;p&gt;Get novnc console url:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;
&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Nova::Server"&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fedora&lt;/span&gt;
      &lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;heat_key&lt;/span&gt;
      &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;
&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;vnc_console_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&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;console_urls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;novnc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the novnc console url can be retrieved via &lt;cite&gt;heat output-show
&amp;lt;stack&amp;gt; vnc_console_url&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Get xvpvnc console url:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;
&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Nova::Server"&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fedora&lt;/span&gt;
      &lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;heat_key&lt;/span&gt;
      &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;
&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;vnc_console_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&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;console_urls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xvpvnc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the xvpvnc console url can be retrieved via &lt;cite&gt;heat output-show
&amp;lt;stack&amp;gt; vnc_console_url&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Get spice console url:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;
&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Nova::Server"&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fedora&lt;/span&gt;
      &lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;heat_key&lt;/span&gt;
      &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;
&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;spice_console_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&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;console_urls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spice&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;html5&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="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add composite attribute &lt;cite&gt;console_urls&lt;/cite&gt; to &lt;cite&gt;OS::Nova::Server&lt;/cite&gt; resource.
When &lt;cite&gt;get_attr&lt;/cite&gt; is invoked, return the console URL according the key supplied
to this attribute, or URLs for all supported types when no key is provided.
Gracefully deal with the case when the type of the console being asked for
is not available in current deployment.&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&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;pshchelo&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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 &lt;cite&gt;get_console_urls&lt;/cite&gt; method in Nova client plugin;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add &lt;cite&gt;console_urls&lt;/cite&gt; attribute to OS::Nova::Server resource.&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;No dependency on other spec or additional library.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 22 Dec 2015 00:00:00 </pubDate></item><item><title>Support Role-based Access Control for Networks</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/support-rbac-for-networks.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/heat/+spec/support-rbac-for-networks"&gt;https://blueprints.launchpad.net/heat/+spec/support-rbac-for-networks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently there is no support about Role-based Access Control for Networks
in heat. So add a new namespace called OS::Neutron::RBACPolicy for the rbac
resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are new rbac-policies api in Liberty which needed to be supported
by heat. We need to add a new namespace for it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;we need to add the following resource&lt;/p&gt;
&lt;p&gt;RBACPolicy&lt;/p&gt;
&lt;section id="specification"&gt;
&lt;h3&gt;Specification.&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="rbacpolicy"&gt;
&lt;h3&gt;RBACPolicy&lt;/h3&gt;
&lt;p&gt;Create a RBAC policy for a given tenant.&lt;/p&gt;
&lt;p&gt;Namespace:
OS::Neutron::RBACPolicy&lt;/p&gt;
&lt;/section&gt;
&lt;section id="required-properties"&gt;
&lt;h3&gt;Required Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;object_type:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type of the object that RBAC policy affects.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;target_tenant:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID of the tenant to which the RBAC policy will be enforced.
String Value.
Update allowed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;action:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Action for the RBAC policy.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;object_id:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID or name of the RBAC object.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="supported-object-type-and-action"&gt;
&lt;h3&gt;Supported object_type and action:&lt;/h3&gt;
&lt;p&gt;SUPPORTED_TYPES_ACTIONS = {‘network’: [‘access_as_shared’]}&lt;/p&gt;
&lt;/section&gt;
&lt;section id="optional-properties"&gt;
&lt;h3&gt;Optional Properties:&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;tenant_id:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The owner tenant ID. Only required if the caller has an administrative
role and wants to create a rbac for another tenant.
String Value.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/rbac-networks"&gt;https://blueprints.launchpad.net/neutron/+spec/rbac-networks&lt;/a&gt;&lt;/p&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&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;Di XiaoLi &amp;lt;&lt;a class="reference external" href="mailto:dixiaobj%40cn.ibm.com"&gt;dixiaobj&lt;span&gt;@&lt;/span&gt;cn&lt;span&gt;.&lt;/span&gt;ibm&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-3&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 new namespace for OS::Neutron::RBACPolicy resource.&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;
</description><pubDate>Mon, 07 Dec 2015 00:00:00 </pubDate></item><item><title>Support Neutron Address Scope</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/add-neutron-address-scope.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/add-neutron-address-scope"&gt;https://blueprints.launchpad.net/heat/+spec/add-neutron-address-scope&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Provides support for Neutron address scope feature.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Address scope feature in Neutron has been available since
Liberty release:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/address-scopes"&gt;https://blueprints.launchpad.net/neutron/+spec/address-scopes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An address scope can be associated with multiple subnet pools
in a one-to-many relationship. The subnet pools under an address
scope must not overlap.&lt;/p&gt;
&lt;p&gt;This blueprint will add the neutron address scope resource in heat.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following resource under resources/openstack/neutron/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::AddressScope&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (required, name of the address scope, update_allowed)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tenant_id (optional, the owner tenant ID of the address scope)
- limited to administrator operate
- apply ‘keystone.project’ constraint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared (optional, indicating whether the address scope is shared,
default value is False, update_allowed)
- limited to administrator operate, can change unshared to shared only&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ip_version (optional, default value is 4)
- allowed values are [4, 6]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&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&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:
&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;mitaka-2&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&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 resource related&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample template in heat-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;
</description><pubDate>Mon, 30 Nov 2015 00:00:00 </pubDate></item><item><title>Improve “repeat” function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/pike/improve-repeat-function.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/improve-repeat-function"&gt;https://blueprints.launchpad.net/heat/+spec/improve-repeat-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This specification improves the “repeat” intrinsic function.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The “repeat” function now only supports to iterates over all the permutations
of the elements in the given lists if more than one key/value pair is
included in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;for_each&lt;/span&gt;&lt;/code&gt; section. Similar to how nested loops work in
most programming languages.&lt;/p&gt;
&lt;p&gt;There are some user cases that user don’t want to loop nested when using
“repeat” function. For example, there are some list parameters:
networks, subnets and ips:&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;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&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;comma_delimited_list&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"net1, net2, net3, ..., netn"&lt;/span&gt;
  &lt;span class="n"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&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;comma_delimited_list&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"sub1, sub2, sub3, ..., subn"&lt;/span&gt;
  &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;:&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;comma_delimited_list&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ip1, ip2, ip3, ..., ipn"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and user want to create a server with several nics:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;my_server&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
    &lt;span class="n"&gt;properties&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="n"&gt;some&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;
      &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;net1&lt;/span&gt;
        &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sub1&lt;/span&gt;
        &lt;span class="n"&gt;fixed_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip1&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;net2&lt;/span&gt;
        &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sub2&lt;/span&gt;
        &lt;span class="n"&gt;fixed_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip2&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;net3&lt;/span&gt;
        &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sub3&lt;/span&gt;
        &lt;span class="n"&gt;fixed_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip3&lt;/span&gt;
      &lt;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;p&gt;The “repeat” function is a good choose for this case. But now
“repeat” function will do nested loops to iterate the over all the
permutations of the elements in the given lists:
[[net1, net2, net3, …],[sub1, sub2, sub3, …], [ip1, ip2, ip3, …]]
Take the example of two items for each list:&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="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;net1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;net2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sub1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sub2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ip1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
      &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
      &lt;span class="n"&gt;fixed_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We will get the result after resolved the function:&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;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub2'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub2'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub2'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub2'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But what the user want is two nics:&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;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'fixed_ip'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ip2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'network'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'net2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'subnet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'sub2'&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="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This proposal improves the “repeat” function to support above the user case.
Add a boolean flag section “permutations” for “repeat”, and the default value
is ‘True’ to make sure the compatibility. Then the “repeat” function would be
used 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="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="n"&gt;my_server&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
     &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="p"&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;properties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="n"&gt;permutations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
           &lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
             &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nets&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;subnets&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
           &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
             &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
             &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
             &lt;span class="n"&gt;fixed_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As above, set the section ‘permutations’ to False, then the result of the
function will satisfy the user’s requirement.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Notes:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;There is a constraint for it: the length of lists should be equal.&lt;/p&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Pike-1&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 “permutations” section for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repeat&lt;/span&gt;&lt;/code&gt; function, and
implement the new replacement method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add template examples.&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;
</description><pubDate>Mon, 30 Nov 2015 00:00:00 </pubDate></item><item><title>Support Conditions function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/support-conditions.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/heat/+spec/support-conditions-function"&gt;https://blueprints.launchpad.net/heat/+spec/support-conditions-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint will provide the ability to create resource conditionally.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;AWS CloudFormation supports conditions function, it decides which
resources are created or not based on the result of the condition.
The conditions function is very useful of reusing templates, with conditions,
user can create different sets of resources in different contexts(such as a
test environment versus a production environment) with same template.&lt;/p&gt;
&lt;p&gt;Heat currently does not have the ability, the user needs many templates to
satisfy their requirements, it makes templates management become much
more complex.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Considering the user habits and compatibility with AWS CloudFormation, this
proposal will use the same style as CloudFormation for conditions function.
An example of conditions function using a hot template:&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;

&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;env_type&lt;/span&gt;&lt;span class="p"&gt;:&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;string&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;
    &lt;span class="n"&gt;allowed_values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'prod'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'for_prod'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env_type&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cirros&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;
      &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;
  &lt;span class="n"&gt;floating_ip&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;FloatingIP&lt;/span&gt;
    &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'for_prod'&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt;
  &lt;span class="n"&gt;floating_ip_attachment&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;FloatingIPAssociation&lt;/span&gt;
    &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'for_prod'&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&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;floating_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;floating_ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;floating_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;floating_ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'for_prod'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As template above only if in ‘prod’ environment, we create a floating ip
and associate it to the server, and also give the output of floating ip.
In ‘test’ environment, we create the server only. By passing the parameter
‘env_type’ we can conditionally create resources for different context.&lt;/p&gt;
&lt;p&gt;1. Add optional section Conditions/conditions for cfn/hot template.
In this section we define the conditions map, something like:&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;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;condition_name1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Intrinsic&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;condition_name2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Intrinsic&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;condition_name3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Intrinsic&lt;/span&gt; &lt;span class="n"&gt;function&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;2. Implement related condition intrinsic functions, such as
equals/not/and/or/if:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;equals: [value1, value2]
not: [{condition}]
and: [{condition1}, {condition2}, {…}]
or: [{condition1}, {condition2}, {…}]
if: [condition_name, value_if_true, value_if_false]&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Notes: the details we can see the aws doc:
&lt;a class="reference external" href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html"&gt;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. Add optional section Condition/condition in resource/outputs section
for cfn/hot template. The value of the Condition/condition should be
condition_name which defined in ‘conditions’ map. If the condition result
is True, the resource/output will be created, otherwise the resource/output
will be ignored.&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;mitaka-3&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement condition intrinsic functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Conditions/conditions map define for cfn/hot template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement conditionally create resource with condition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement conditionally given output with condition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Fri, 13 Nov 2015 00:00:00 </pubDate></item><item><title>Support for pre-delete hooks</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/pre-delete-hook.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/pre-delete-hook"&gt;https://blueprints.launchpad.net/heat/+spec/pre-delete-hook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds a new type of hook which is triggered before resource deletion.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We provide hooks for pre-create and pre-update, but not for pre-delete. Such a
hook would allow users to make specific actions when a resource is deleted,
like deregistration with external systems, and will provide the ability to
validate deletion of critical elements.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The hook will be mirrored strictly on pre-create, such as it’s called only on
resource deletion and not resource replacement. This part will be handled in a
future spec.&lt;/p&gt;
&lt;p&gt;This will look like this:&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;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;my_server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;
    &lt;span class="n"&gt;my_database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&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;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;therve&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 the new hook in the environment and add the appropriate breakpoint in
resource deletion&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;
</description><pubDate>Mon, 09 Nov 2015 00:00:00 </pubDate></item><item><title>Immutable Parameters</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/immutable-parameters.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/immutable-parameters"&gt;https://blueprints.launchpad.net/heat/+spec/immutable-parameters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Template authors should be able to mark template parameters as
updatable or non-updatable to restrict updating parameters which have
destructive effects on the application.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Sometimes a template parameter is only intended to be passed during
stack creation.  For example, updating an SSH public key name
parameter, which is passed to the keypair property of an
OS::Nova::Server, would result in the server being replaced and risk
downtime.&lt;/p&gt;
&lt;p&gt;In some cases, an application’s architecture would not be tolerant of
certain servers being rebuilt.  The template author has the freedom to
mark parameters which cause those servers to be rebuilt as immutable.&lt;/p&gt;
&lt;p&gt;This feature is targeted to Heat service providers and operators of
other services that offer a curated set of templates to end-users.
These are users who may not have a lot of expertise with the
application architecture.  Expert users have the option of editing the
template to remove the update restriction.&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 “updatable” boolean field to the parameters section in a HOT
template.  A value of False would result in the engine rejecting
stack-updates that include changes to that parameter.  When not
specified in the template, “updatable” would default to True to ensure
backwards compatibility with old templates.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Loosen the “each parameter can be in one parameter group”
restriction and use parameter groups to mark parameters as
immutable.  Adding a new updatable field is a more user-friendly
option.&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;p&gt;This would include changes to heat/engine/hot/parameters.py, where a
new updatable field would be added, and heat/engine/parameters.py,
where we would restrict updates to parameters.  Whenever a user
attempts to update a restricted parameter, they will see a
ImmutableParameterModified exception returned from the API before the
actual stack-update begins.&lt;/p&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;jasondunsmore&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-2&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 updatable field to template (heat/engine/hot/parameters.py)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restrict updates to parameters (heat/engine/parameters.py)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a ParameterUpdateNotAllowed exception (heat/common/exception.py)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit 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;
</description><pubDate>Wed, 04 Nov 2015 00:00:00 </pubDate></item><item><title>Add DISABLED SupportStatus</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/hidden-supportstatus-improvements.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/hidden-supportstatus-improvements"&gt;https://blueprints.launchpad.net/heat/+spec/hidden-supportstatus-improvements&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The deprecation process should include a way to keep users from
creating new stacks with a resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When a resource is marked HIDDEN as the final step in the deprecation
process, users can still create stacks with that resource.  This could
result in an ever-growing number of stacks with the unsupported
resource.  Since removing a resource entirely will break live stacks
that contain that resource, it would be difficult to ever remove the
resource.  Even if the resource is unsupported, some level of
maintenance would be necessary to ensure the resource continues to
load.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Modify the HIDDEN SupportStatus to disallow creation of stacks that
contain HIDDEN resources.  This will result in fewer stacks with the
unsupported resource over time, making complete removal of the
resource a future possibility.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Leave HIDDEN as-is and create a new DISABLED status with the proposed
behavior.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Some investigation is needed, but it may be possible to pass a
parameter that indicates a create is being done as a result of an
UpdateReplace exception.  When the flag is encountered for HIDDEN
resources, the create will be allowed.  It will be disallowed for new
resource creates, during stack-create and stack-update (ie. adding a
new resource to an existing stack).&lt;/p&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;jasondunsmore&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Pass a parameter during when create is called as a result of
UpdateReplace.  These types of creates will be allowed for HIDDEN
resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disallow stack-creates with stacks containing HIDDEN resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disallow stack-updates with stacks containing &lt;em&gt;new&lt;/em&gt; HIDDEN resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit 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;
</description><pubDate>Mon, 02 Nov 2015 00:00:00 </pubDate></item><item><title>Heat support in python-openstackclient</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/python-openstackclient.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-support-python-openstackclient"&gt;https://blueprints.launchpad.net/heat/+spec/heat-support-python-openstackclient&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Implement a new set of heat commands as python-openstackclient plugins.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;python-openstackclient is becoming the default command line client for many
OpenStack projects. Heat would benefit from implementing all of its client
commands as python-openstackclient plugins implemented in the python-heatclient
repository.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The intent of this spec is to identify the commands to be implemented and
establish conventions for command and argument names. This spec is not intented
to be a full and correct specification of command and argument names.
The details can be left to the code reviews for the commands themselves.&lt;/p&gt;
&lt;p&gt;The following conventions will be adopted for argument flags:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Commands which trigger lifecycle actions will have a –wait argument which
polls the event list until the stack COMPLETE/FAILED event is emitted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Single character flags will be avoided as per the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt; convention,
except for very common arguments such as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--template&lt;/span&gt;&lt;/code&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-t&lt;/span&gt;&lt;/code&gt;,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--environment&lt;/span&gt;&lt;/code&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the stack name/ID is specified it will be the first positional argument
after the full command names&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the resource name is specified it will be the second positional argument
after the stack name/ID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;show&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;list&lt;/span&gt;&lt;/code&gt; commands should show an appropriate quantity of data
by default and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--short&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--long&lt;/span&gt;&lt;/code&gt; arguments will display a different
level of details.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt;&lt;/code&gt; commands will be implemented for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt; initially
suggesting these command names:&lt;/p&gt;
&lt;section id="core-stack-commands"&gt;
&lt;h3&gt;Core stack commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;


&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="other-stack-commands"&gt;
&lt;h3&gt;Other stack commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;abandon&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;abandon&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adopt&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;adopt&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cancel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;cancel&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;preview&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&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;dry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;resume&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;resume&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;suspend&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;suspend&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;hook&lt;/span&gt; &lt;span class="n"&gt;clear&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;poll&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;hook&lt;/span&gt; &lt;span class="n"&gt;poll&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="resource-commands"&gt;
&lt;h3&gt;Resource commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&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="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;orchestration&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&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;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;orchestration&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="template-commands"&gt;
&lt;h3&gt;Template commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&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;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&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;validate&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;

&lt;span class="n"&gt;heat&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;version&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;orchestration&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;resource&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;template&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;orchestration&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;cfn&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="event-commands"&gt;
&lt;h3&gt;Event commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&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;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="software-config-commands"&gt;
&lt;h3&gt;Software config commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;deployment&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="snapshot-commands"&gt;
&lt;h3&gt;Snapshot commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;restore&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="n"&gt;restore&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="misc-commands"&gt;
&lt;h3&gt;Misc commands&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;orchestration&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;

&lt;span class="n"&gt;heat&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;openstack&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;integrate&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="n"&gt;command&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="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Continue to evolve &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt;&lt;/code&gt; commands and do not implement any &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt;
commands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead of implementing this inside python-heatclient, create a new project
which depends on python-heatclient and python-openstackclient.&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;p&gt;There are many commands to implement and implementation tasks would be easily
shared among many developers. The launchpad blueprint whiteboard will be used
to coordinate the implementation status of each command and who has assigned
themself to implement each one.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Steve Baker &amp;lt;&lt;a class="reference external" href="mailto:sbaker%40redhat.com"&gt;sbaker&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other asignees:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Bryan Jones &amp;lt;&lt;a class="reference external" href="mailto:jonesbr%40us.ibm.com"&gt;jonesbr&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-3&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&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, this is an independent piece of work&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 30 Oct 2015 00:00:00 </pubDate></item><item><title>Support neutron subnet pool in heat</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/support-neutron-subnetpool.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/subnet-pools"&gt;https://blueprints.launchpad.net/heat/+spec/subnet-pools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resource plugin for Neutron subnet pool.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Neutron now supports &lt;cite&gt;subnetpools&lt;/cite&gt; API extension. This helps in
managing the lifecycle of a subnet pool and using it during
subnet create/update as illustrated below.&lt;/p&gt;
&lt;div class="highlight-sh notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;neutron&lt;span class="w"&gt; &lt;/span&gt;subnetpool-create&lt;span class="w"&gt; &lt;/span&gt;–default-prefixlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;–pool-prefix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.10.0.0/16&lt;span class="w"&gt; &lt;/span&gt;webpool
neutron&lt;span class="w"&gt; &lt;/span&gt;subnet-create&lt;span class="w"&gt; &lt;/span&gt;–subnetpool&lt;span class="w"&gt; &lt;/span&gt;webpool&lt;span class="w"&gt; &lt;/span&gt;websubnet
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add following Resources under resources/openstack/neutron/&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::SubnetPool&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Name of the subnet pool to create.
- optional
- type: String
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;prefixes&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A list of subnet prefixes to assign to the subnet pool.
- required
- type: List
- update_allowed
- constraints: Non empty list of CIDR&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;address_scope&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;An address scope to assign to the subnet pool.
- optional
- type: String
- update_allowed
- constraints: ‘neutron.address_scope’ custom constraint&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;default_quota&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A per-tenant quota on the prefix space that can be allocated from the
subnet pool for tenant subnets.
- optional
- type: Integer
- update_allowed
- constraints: Greater than or equal to 0&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;default_prefixlen&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Size of the prefix to allocate when the cidr or prefixlen attributes
are not specified for a subnet. This would be defaulted to
min_prefixlen if not specfied.
- optional
- type: Integer
- update_allowed
- constraints: Greater than or equal to 0&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;min_prefixlen&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Smallest prefix that can be allocated from a subnet pool.
- optional
- type: Integer
- update_allowed
- constraints: Greater than or equal to 0&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;max_prefixlen&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Maximum prefix that can be allocated from a subnet pool.
- optional
- type: Integer
- update_allowed
- constraints: Greater than or equal to 0&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;is_default&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Whether this is default IPv4/IPv6 subnet pool. There can only be
one default subnet pool for each IP family.
- optional
- type: Boolean
- update_allowed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;tenant_id&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ID of the tenant who owns the subnet pool. Only administrative users
can specify a tenant ID other than their own.
- optional
- type: String&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;shared&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Whether shared across all tenants, default is False.
- optional
- type: Boolean&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Add ‘subnetpool’ and ‘prefixlen’ properties for OS::Neutron::Subnet
resource. Also, apply a custom constraint ‘neutron.subnetpool’ to
‘subnetpool’ property.&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&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;&lt;a class="reference external" href="mailto:ramishra%40redhat.com"&gt;ramishra&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-2&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 SubnetPool resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add property for Subnet resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required custom constraints (neutron.address_scope, neutron.subnetpool)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample template using SubnetPool in heat-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;
</description><pubDate>Fri, 30 Oct 2015 00:00:00 </pubDate></item><item><title>API calls for stack output</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/api-calls-for-output.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/heat/+spec/api-call-output"&gt;https://blueprints.launchpad.net/heat/+spec/api-call-output&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Current Orchestration API has no special calls for showing and listing
stack output. Also, CLI commands output-show and output-list have to call
stack.get for resolving output, which is not correct.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Current output-show and output-list CLI commands implemented only in heat
client, they have to request stack.get, which load stack from database and
resolve all outputs, which can slow down command execution. So need to add
possibility to get desired outputs without resolving all outputs. It can
be done with adding new methods to heat engine, which will resolve only
specified outputs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The changes involves next steps:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Adding new functionality to heat service, which will implements showing and
listing stack outputs. Moreover, output show should resolve only specified
output;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding new API calls for showing specified stack output and listing all
stack outputs.&lt;/p&gt;
&lt;p&gt;API for showing stack output will looks like:&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="n"&gt;stacks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stack_name&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;stack_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and will return next response:&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;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"output_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"output_value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;output_value&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;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;API for listing stack outputs will looks like:&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="n"&gt;stacks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stack_name&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;stack_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and will return next response:&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;"outputs"&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change output-show and output-list for heat client, which should call
special API for showing output and listing output instead of calling
stack.get and resolving outputs from it’s response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new API to API ref documentation (project &lt;a class="reference external" href="https://github.com/openstack/api-site"&gt;api-site&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add corresponding API tests to tempest and heat client functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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&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;&amp;lt;prazumovsky&amp;gt;
&amp;lt;ochuprykov&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 new methods to heat service for showing and listing outputs for stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new API calls for showing and listing outputs for stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change output-show and output-list heat client methods with new APIs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new API to API ref documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add corresponding API tests to tempest and heat client functional 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;
</description><pubDate>Wed, 21 Oct 2015 00:00:00 </pubDate></item><item><title>map-merge-function</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/map-merge-function.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/map-merge-function"&gt;https://blueprints.launchpad.net/heat/+spec/map-merge-function&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Create a simple Heat intrinsic function to help merge maps.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat template users (TripleO) would like the ability to merge
maps into a single map. This will help with composability with
map data constructs for configuration settings.&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 Heat intrisic function called map_merge which takes a
list of maps as an argument. The function will merge the list of
maps into a single map. Values in latter maps override those in
earlier ones.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Users could write their own functions (API version) and or create a custom
Heat resource to do something similar.&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-prince&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;-add tests
-create function
-update docs&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;p&gt;We are very interested in making use of this function within TripleO Heat
Templates to help with composability of config settings.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 21 Oct 2015 00:00:00 </pubDate></item><item><title>Config option to enable observer/get_reality</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/flag-to-enable-observer.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/heat/+spec/flag-to-enable-observe-reality"&gt;https://blueprints.launchpad.net/heat/+spec/flag-to-enable-observe-reality&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The convergence architecture requires a observer feature which will
observe the reality for stacks. Make the observer optional till it is
developed and tested thoroughly.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;To keep Heat aware of reality (changes happening in the cloud),
observers are needed. They will be responsible for observing the changes
in reality and notifying the changes. Heat will take appropriate action
based on the feedback received from observer.&lt;/p&gt;
&lt;p&gt;The development of observer feature should not interfere with the
existing Heat code base. A config option is needed in heat.conf to
enable observer. Just like the enable_convergence flag, this flag will
be used for development and testing of observer feature in Heat.&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 config option that allows observer to be enabled.&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&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;ananta
&amp;lt;folks interested&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Implement the config option.&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;
</description><pubDate>Tue, 20 Oct 2015 00:00:00 </pubDate></item><item><title>Mark Unhealthy Resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/mark-unhealthy.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/mark-unhealthy"&gt;https://blueprints.launchpad.net/heat/+spec/mark-unhealthy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add an interface to allow the user to communicate information about the health
of a resource that Heat cannot determine on its own.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The only mechanism that Heat has for evaluating the health of a resource is to
compare its properties against the output of the relevant OpenStack API. (This
happens via the stack-check command in the current architecture, but will be
automatic on updates in the proposed Phase 2 of the Convergence architecture).
However, there may exist resources that the user (or application) knows are
unhealthy where Heat has no way of determining that. The obvious example is a
server which is running as far as Nova is concerned but is, in point of fact,
borked as far as the application is concerned.&lt;/p&gt;
&lt;p&gt;Currently there is no way for an user (or application) to replace such a
resource without going performing multiple orchestration passes or renaming the
resource or both. Both are undesirable, and this leaves the user unable to take
advantage of Heat’s ability to correctly replace a resource as part of a single
workflow.&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 PATCH handler to the Resource endpoint:&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="n"&gt;stacks&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stack_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stack_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;resource_id&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 PATCH method will accept a JSON body of the form:&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;'mark_unhealthy'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'resource_status_reason'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For legacy stacks, this call will fail if it cannot acquire the stack lock. For
Convergence (phase 1) stacks, the call will fail if it cannot acquire the
resource lock. This failure mode will be indicated by raising an
ActionInProgress exception in the engine, which manifests as a 409 Conflict
response to the ReST API request.&lt;/p&gt;
&lt;p&gt;Upon receipt of this call, Heat will put the resource into the CHECK_FAILED
state if the ‘mark_unhealthy’ field is true. If the field is false, Heat will
put the resource in the CHECK_COMPLETE state if it was in the CHECK_FAILED
state; otherwise it will make no change.&lt;/p&gt;
&lt;p&gt;Presence of any other fields or a missing ‘mark_unhealthy’ field will trigger
an Invalid Request error.&lt;/p&gt;
&lt;p&gt;The status_reason field is optional. If present, the value of this field will
be used as the status_reason for the status change; otherwise an appropriate
default message will be recorded to indicate that the state change was due to
the resource being explicitly marked unhealthy.&lt;/p&gt;
&lt;p&gt;It is assumed that should any future additional operations be added using the
PATCH verb on a resource, it will be invalid for them to occur in the same call
as this one. As such, the RPC call will have a specific mark_unhealthy_resource
call rather than a general patch_resource call.&lt;/p&gt;
&lt;p&gt;Change the _needs_update() method of the StackResource and RemoteStack resource
types, such that the resource is replaced on update if it is in the
CHECK_FAILED state.  A user who wants to manually force replacement of a
&lt;em&gt;member&lt;/em&gt; of a nested stack (as opposed to the nested stack itself) should mark
the member(s) as unhealthy rather than the stack itself.  Resources of any
other type that are in a FAILED state already will be replaced on a subsequent
stack update, regardless of the action (CHECK or otherwise), and this applies
equally to both legacy and convergence stacks.&lt;/p&gt;
&lt;p&gt;Modify the InstanceGroup (and, by extension, Heat and AWS AutoscalingGroup)
types to give members in a FAILED state the highest priority for being removed
when scaling down or being updated in a rolling update. Currently, FAILED
resources are omitted when building a new template for the scaling group, so
any such resources would never be replaced by one of the same name. This change
will allow for continuity of naming in the case of a change that doesn’t
permanently remove the resource due to scaling down.&lt;/p&gt;
&lt;p&gt;Once bug 1508736 is fixed there should be no further need to make any change to
ResourceGroup. However, note that ResourceGroup and InstanceGroup both use the
same grouputils.get_members() function that filters out failed members, so the
modifications above may require changes to ResourceGroup to maintain the same
behaviour.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It might appear desirable to have a single call to both mark the resource as
unhealthy and initiate a stack update with the existing template and
environment. However, it is better to keep the API calls orthogonal, as the
user may want to make other changes to the stack at the same time. It also
considerably simplifies implementation and testing.&lt;/p&gt;
&lt;p&gt;We could add a separate healthy=False column to the database instead of
re-using CHECK_FAILED, but given that this is effectively a way of manually
providing information that is not available to stack-check, it makes sense to
re-use the same state. It also simplifies the logic in the engine, as we
already check for a FAILED state in many places, so re-using this state should
result in Heat just doing the Right Thing without having to add multiple checks
for another field.&lt;/p&gt;
&lt;p&gt;An earlier version of this proposal suggested using a SOAP-style POST request
to a “mark_unhealthy” action endpoint, rather than a PATCH request to the
resource.  This is consistent with how many OpenStack APIs operate today, but
widely regarded as a non-ReSTful abomination. The currently &lt;a class="reference external" href="https://review.openstack.org/#/c/234994/"&gt;proposed
guidelines&lt;/a&gt; of the API working group suggest a single “actions” endpoint for
POST requests of this type, where the body would be of the form:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mark_unhealthy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"unhealthy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"resource_status_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;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;However, this proposal is still controversial (and has been described, not
inaccurately, in reviews as “SOAP in ReST clothing”). The main driver behind it
seems to be a belief that projects will be unwilling to implement a fully
ReSTful interface like that proposed here.&lt;/p&gt;
&lt;p&gt;We could re-use the existing signal API instead of adding a new endpoint.
However, that would mean a mix of responsibility in handling signals between
the resource plugin (which is responsible today) and Heat (since this new
proposal is independent of resource type). It would be more consistent with the
currently-proposed API guidelines; it’s arguable whether that is a good thing
or not, since those recommendations are still very much liable to change.&lt;/p&gt;
&lt;p&gt;Alternatively, we could make this a call on a stack (rather than an individual
resource), so that the user can mark multiple resources unhealthy with a single
call. One downside of this is that it requires the resource identifier to be
included in the body of the request rather than the URL, so it could end up
harder than it needs to be to include in e.g. Mistral workflows. It’s also less
logical from a ReST perspective, and complicates error handling and reporting.
We can always add this later if it really turns out to be required.&lt;/p&gt;
&lt;p&gt;Instead of defining a particular state transition, we could allow the user to
set arbitrary resource states. This is a giant can of worms.&lt;/p&gt;
&lt;p&gt;This proposal is an alternative to the one presented in
&lt;a class="reference external" href="https://review.openstack.org/#/c/212205/"&gt;https://review.openstack.org/#/c/212205/&lt;/a&gt; which involved mechanisms to place the
member IDs of various types of scaling groups under user control. This proposal
is both more generic and more relevant to the future convergence plans than
that one.&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;ahmed-h-elkhouly &amp;lt;&lt;a class="reference external" href="mailto:ahmed.h.elkhouly%40gmail.com"&gt;ahmed&lt;span&gt;.&lt;/span&gt;h&lt;span&gt;.&lt;/span&gt;elkhouly&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 id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-3&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;Modify StackResource and RemoteStack such that they are replaced on update
when in the CHECK_FAILED state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement an RPC API to mark resources as CHECK_FAILED in both the legacy and
convergence architectures in heat-engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a ReST front end to the RPC API call in heat-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement client support for the API call&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify InstanceGroup to keep FAILED resources in the template (so that they
are replaced by another of the same name)&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;It is possible that the changes to InstanceGroup could be greatly simplified
after the completion of the blueprint scaling-group-common.&lt;/p&gt;
&lt;p&gt;The replacement of failed ResourceGroup members will not work correctly in the
case of a rolling update until bug 1508736 is fixed.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 19 Oct 2015 00:00:00 </pubDate></item><item><title>Operator Tool to migrate stacks to the convergence mode.</title><link>https://specs.openstack.org/openstack/heat-specs/specs/newton/convergence-migrate-stacks.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-migrate-stack"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-migrate-stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It would be useful for operators to make sure all stacks are being run
under the same logic in order to support the service better.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Whether or not a stack action is run under convergence is sticky,
meaning that if the current “convergence_engine” setting is True when
the stack-create is run, then that stack will always be run with the
convergence logic (the same is also true for convergence_engine=False).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This spec proposes a new tool for operators that migrates any stack created
under the legacy mode to convergence mode.&lt;/p&gt;
&lt;p&gt;This will only convert stack that are in a sane state (*_COMPLETE) and
will warn the operator if they need to re-run the command to catch
stacks currently have actions in progress.&lt;/p&gt;
&lt;p&gt;The steps the operator will need to take are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;edit /etc/heat/heat.conf change convergence_engine to what they want&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restart heat-engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run “heat-manage migrate-convergence-1 &amp;lt;stack_id&amp;gt;”&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Stacks could be left to run in both modes and eventually users would
re-create stacks thus migrating them to the new mode (this could take
a long time though).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We could automatically convert stacks on the next
stack-update. This takes the control out of the operators hands,
but has the advantage of doing this operation piecemeal and the
end-user could fix any issues that arise. (asalkeld: I think this could be
an attractive option).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Grow some balls and decide that we are going with convergence and
make this a migration script (aka no-going-back).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Extend &lt;em&gt;heat-manage&lt;/em&gt; 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="n"&gt;heat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;manage&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;convergence&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stack_id&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;This command will call code in stack.py to get stack with stack_id and
all it nested stuff. We need to set convergence = True,
prev_raw_template_id = None and remove appropriate raw template,
generate and add new traversal_id and set current_template_id for all
resources in these stacks.
Also we need to fill &lt;cite&gt;needed_by&lt;/cite&gt; and &lt;cite&gt;requires&lt;/cite&gt; columns in the database
with corresponding dependencies.&lt;/p&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;ochuprykov&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;newton-2&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 the new command to heat-manage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add code to stack.py to do the migration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;functional tests: &lt;a class="reference external" href="https://review.openstack.org/#/c/230292/"&gt;https://review.openstack.org/#/c/230292/&lt;/a&gt;&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;
</description><pubDate>Mon, 19 Oct 2015 00:00:00 </pubDate></item><item><title>Support Nova Host Aggregate</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/support-host-aggregate.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-host-aggregate"&gt;https://blueprints.launchpad.net/heat/+spec/support-host-aggregate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Provides support for Nova Host Aggregate feature.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Nova already implemented host aggregate for host resource management.
Administrator of cloud may want to use host aggregate to further partition an
availability zone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add following Resources under resources/openstack/nova/&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::HostAggregate&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (required, name for host aggregate)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;availability_zone (optional, availability zone in aggregate)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Will apply custom constraint ‘nova.availability_zone’ on it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hosts (optional, assign hosts in aggregate)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata (optional, a set of metadata for aggregate)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&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&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:
Rico Lin &amp;lt;rico-lin&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;mitaka-1&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&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 resources related&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related 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;
</description><pubDate>Fri, 16 Oct 2015 00:00:00 </pubDate></item><item><title>Multiple Environment Support</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/multi-environments.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/multi-environments"&gt;https://blueprints.launchpad.net/heat/+spec/multi-environments&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We allow the user to specify multiple environment files in the client, but
these get combined in the client so any redundant information, precendence, &amp;amp;c.
is no longer available to heat-engine. This causes problems with PATCH updates
of the environment, particularly with TripleO.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;On a PATCH update for a stack whose environment is a composite from multiple
files, a user cannot (in the general case) safely update any of the environment
files without explicitly passing all of the files previously included to the
client again (since order matters, and since the engine has no knowledge of any
given file’s position in the hierarchy. This leaves them in a similar position
to where they would be without PATCH updates to the environment: having to
remember all of the constituent parts of the stack’s environment.&lt;/p&gt;
&lt;p&gt;This is a particular problem for TripleO, which may use many environment files
even in a fairly typical deployment. If the user customises one of the default
environment files, the change is not picked up because the TripleO client does
not send environment files with its PATCH updates unless they are explicitly
specified; conversely sending the default environment file(s) again risks
overwriting user-specified environment (such as the one for network isolation)
unless the user is required to always pass all of the environment files again.&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 optional “environment_files” key to the body of a stack create or update
request. Valid content for this key is a list of filenames. The filenames
themselves may be arbitrary. The file content must be included in the “files”
section of the request, keyed by the filename, in the same way as other extra
files (scripts, nested templates) are.&lt;/p&gt;
&lt;p&gt;The “environment_files” key is outside the existing environment section to
ensure that it is only inserted by the client; this change does not modify the
environment file format itself. This prevents any issues with circular
inclusions and the like.&lt;/p&gt;
&lt;p&gt;Multiple files will be combined by the engine in the same manner as they
currently are by the client. Where environment files contain conflicting
information, the last one specified wins.&lt;/p&gt;
&lt;p&gt;Parameter values that are specified explicitly (i.e. outside the environment)
will be applied &lt;em&gt;after&lt;/em&gt; all environment files are merged, to maintain
consistency with the current approach (where the file combination is done in
the client and the parameters merged in heat-api). This means that the code to
do this must be moved from heat-api to heat-engine.&lt;/p&gt;
&lt;p&gt;On a PATCH update, any additional_environment files specified are appended to
the list. Heat will recalculate the combined environment on each stack update,
so that any changes to the “files” part of the environment are picked up.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could allow includes in the environment file format itself. However, this
would require us to deal with problems like circular includes, or to have a
different format for the included environment files vs. the ‘main’ environment.
While it would be nice to be able to record all of the environments for a given
stack in a single place that can be stored e.g. in Git, it’s probably better to
implement this purely on the client side as a CLI option to read the list of
environments from a file instead of/as well as from multiple –environment
options.&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;jdob&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Mitaka-1&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 support for combining environments + parameters in heat-engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for passing the environment_files list + params over the RPC API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for environment_files in heat-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the client to pass environments as a list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a CLI option to read the environments list from a file&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;
</description><pubDate>Tue, 13 Oct 2015 00:00:00 </pubDate></item><item><title>Pushing events to users</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/event-transport.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/event-transport"&gt;https://blueprints.launchpad.net/heat/+spec/event-transport&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently events are stored in the database and users need to use the API to
poll them and be notified of stack changes. This particularly painful for
hooks, where Heat is waiting for user input.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To let the user customize how he wants to get event, we add a key to the
environment to specify where they should go:&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;event_sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&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;zaqar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;myqueue&lt;/span&gt;
    &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;event_sinks&lt;/span&gt;&lt;/code&gt; is a list of target with a type specified, and possible options
(like &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ttl&lt;/span&gt;&lt;/code&gt; here being a Zaqar option). Zaqar will be the first
implementation available, sending all the events to the specified queue.&lt;/p&gt;
&lt;p&gt;We’ll use an entry points with stevedore to allow pluggable implementations.&lt;/p&gt;
&lt;p&gt;To not add network calls to the critical path of every single event, the
publication will be delegated to a thread and thus be asynchronous. The
drawback is that potential errors won’t be presented to users.&lt;/p&gt;
&lt;p&gt;Events will continue to go in the database.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Instead of making it a user configurable option, we could make it a global
option for the Heat administrator. It makes it less discoverable, and is
probably not necessary for every users. We also lose configurability.&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;therve&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Change the environment to handle the new element.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify environment handling the client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement sending over zaqar.&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Event message format: &lt;a class="reference external" href="https://review.openstack.org/231382"&gt;https://review.openstack.org/231382&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 09 Oct 2015 00:00:00 </pubDate></item><item><title>Convergence: Use reality when updating resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/use-reality-instead-of-old-template-properties.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/heat/+spec/get-reality-for-resources"&gt;https://blueprints.launchpad.net/heat/+spec/get-reality-for-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Make Heat aware of reality and use the reality as basis for comparison
before updating the resource. This spec is proposal to add a
get_reality/collect_reality to resource class.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Due to external factors in cloud, a provisioned resource from stack may
diverge from its original state. Since heat is unaware of this change,
it cannot act on it to bring it to desired state. Also, when user tries
to update it, the resource might end-up in error state since it is not
aware of its state and cannot carry-out any corrective action. Heat needs
to detect the changes in reality and compare with the new properties and
update the resource.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A solution discussed at L summit meet-up was to implement get_reality
and handle_get_reality. The idea is to get the resource properties from
the reality and compare it with the current properties from template +
environment, instead of comparing with old template. When a user issues
an update, the resource plugins get the current resource properties from
reality and compare with the current template. If there are any changes,
the resource is updated.&lt;/p&gt;
&lt;p&gt;The enable observer config option should be used to decide whether to
get the reality before updating the resource. This feature is enabled
only when the option is set in config.&lt;/p&gt;
&lt;p&gt;This is first part of convergence observer specification. The observer
will depend on get_reality and handle_get_reality APIs. The scope of
this change is limited to implementing mechanisms to find the changes
from reality and compare before updating a resource. The bigger effort
involves continuously monitoring the changes and continuously acting on
them.&lt;/p&gt;
&lt;p&gt;The changes will mostly reside in heat resource class and plugins if
required.&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&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;prazumovsky
ananta&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;mitaka-1&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;1. Implement get_reality/collect_reality in resource plugins. The
existing show_resource can be used to get the reality, in addition to
any other queries to reality.&lt;/p&gt;
&lt;p&gt;2. Use the existing update/handle_update to take necessary action on
resource based on output of get_reality.&lt;/p&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;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/flag-to-enable-observe-reality"&gt;https://blueprints.launchpad.net/heat/+spec/flag-to-enable-observe-reality&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 07 Oct 2015 00:00:00 </pubDate></item><item><title>Implement Magnum resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/magnum-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/magnum-resources"&gt;https://blueprints.launchpad.net/heat/+spec/magnum-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint proposes to add support for Magnum resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Magnum is a container management service that is currently not supported by
Heat. Resources will be added to Heat to support:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Baymodel, An object stores template information about the bay which is used
to create new bays consistently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bay, A collection of node objects where work is scheduled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pod, A collection of containers running on one physical or virtual machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service, An abstraction which defines a logical set of pods and a policy
by which to access them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ReplicationController, An abstraction for managing a group of PODs to
ensure a specified number of PODs are running.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node, A baremetal or virtual machine where work executes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Container, A docker container&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;Magnum resources are not integrated, so they will be added to contrib
directory.&lt;/p&gt;
&lt;p&gt;Magnum client plugin will be added for communication with Magnum, which has
his own requirements. Following resources will be added:&lt;/p&gt;
&lt;p&gt;Add the OS::Magnum::BayModel resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::BayModel&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;external_network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dns_nameserver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;docker_volume_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Int&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;network_driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;http_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;https_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;no_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;insecure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Boolean&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::Bay resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;bay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::Bay&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;baymodel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;node_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Int&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;discovery_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;bay_create_timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Int&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::Pod resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;pod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::Pod&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;bay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;SOFTWARE_CONFIG&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::Service resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::Service&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;bay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;SOFTWARE_CONFIG&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::ReplicationController resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::ReplicationController&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;bay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;SOFTWARE_CONFIG&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;manifest_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::Node resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::Node&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the OS::Magnum::Container resource&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Magnum::Node&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;String&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&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;&amp;lt;&lt;a class="reference external" href="mailto:rpothier%40cisco.com"&gt;rpothier&lt;span&gt;@&lt;/span&gt;cisco&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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 Magnum client plugin for Heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Magnum BayModel and Bay resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Magnum Pod, Service and ReplicationController resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Magnum Node and Container resources&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;
</description><pubDate>Wed, 30 Sep 2015 00:00:00 </pubDate></item><item><title>Designate Zone and RecordSet</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/heat-designate-recordset-zone.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-designate-recordset-zone"&gt;https://blueprints.launchpad.net/heat/+spec/heat-designate-recordset-zone&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds support for designate v2 RecordSet and Zone.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenStack provides DNS as a service (designate) and more details are
available at wiki &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Designate"&gt;https://wiki.openstack.org/wiki/Designate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In heat, resource plug-ins are not available for designate Zone and RecordSet.
And this blueprint is created to provide these required plug-ins.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Designate::Zone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Zone name&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;ttl:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: int&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Time To Live (Seconds) and is applicable only to Zone
of type SECONDARY.&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of zone&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;email:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Zone email and is applicable only to Zone of type
SECONDARY&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;type:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Zone type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: ‘PRIMARY’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: [‘PRIMARY’, ‘SECONDARY’]&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;masters&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: List&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: List of master name-servers and is applicable only to
Zone of type SECONDARY&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;serial:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;description: Zone serial number&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Designate::RecordSet&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;zone:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS zone id or name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: CustomConstrain(‘designate.zone’)&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;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS Name&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;type:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints:[A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP, SOA]&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;records:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: List&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS records&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;ttl:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: int&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record Time To Live (Seconds)&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of DNS record&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;Custom Constraint ‘designate.zone’&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Validate the designate zone id or name&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&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&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;kanagaraj-manickam
rh-s&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 proposed resource plug-ins and custom constraints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample templates in heat-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;
</description><pubDate>Mon, 28 Sep 2015 00:00:00 </pubDate></item><item><title>Keystone Resource plugin for Domain and Region</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/heat-keystone-domain-region.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-keystone-region-resource"&gt;https://blueprints.launchpad.net/heat/+spec/heat-keystone-region-resource&lt;/a&gt;
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-keystone-domain-resource"&gt;https://blueprints.launchpad.net/heat/+spec/heat-keystone-domain-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resource plugin for Keystone Domain and Region.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat does not provide resource plugins for keystone domain and region, which
help operator to bring the hierarchical structure in cloud user organization
and service deployment respectively. This blueprint is added to support them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following resource plugins for keystone v3 Domain and Region&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Region&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;id:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Region id&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of region&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;parent_region:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: If the region is hierarchically a child of another
region, set this parameter to the ID of the parent region.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘keystone.region’&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;enabled:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;default: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: Boolean&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: If true, the region is enabled. If false, the region is
disabled.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update OS::Keystone::Endpoint to put it under given region with custom
constraint ‘keystone.region’.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Domain&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Domain name&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of domain&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;enabled:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;default: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: Boolean&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: If true, the domain is enabled. If false, the domain is
disabled.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;NOTE: OS::Keystone::User, OS::Keystone::Project and OS::Keystone::Group are
already having reference to custom constraint ‘keystone.domain’.&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&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;kanagaraj-manickam
sirushtim&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 required custom constraints and resource plugins defined above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample templates in heat-template project&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;
</description><pubDate>Mon, 28 Sep 2015 00:00:00 </pubDate></item><item><title>Heat template-validate improvements</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/heat-template-validate.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-template-validate-improvements"&gt;https://blueprints.launchpad.net/heat/+spec/heat-template-validate-improvements&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Improves the validation of template feature to be more easier and customizable.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Template validation in heat needs be improved for following reasons:&lt;/p&gt;
&lt;p&gt;1. Heat aborts the validation of template on first occurrence of the error.
It makes user to validate template and trial-and-error approach and may goes
for many iterations.&lt;/p&gt;
&lt;p&gt;2. Heat does not report the line number at which the error occurred. Sometime,
it causes difficulties to user to spot the issue especially in big templates.&lt;/p&gt;
&lt;p&gt;3. Heat aborts the template validation when corresponding service is not
available in the heat cloud. So user like template designer/architects needs
to install all required services in heat cloud to validate it though their
intention is creating valid template.&lt;/p&gt;
&lt;p&gt;4. Sometime user wants to validate only the schematic of the template without
bother about the values used for properties. This will help the user to
create ‘proper template’&lt;/p&gt;
&lt;p&gt;5. There is no option to provide the recommendation when user uses deprecated
one, use the alternate new one.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;These issues or improvements could be implemented as below:&lt;/p&gt;
&lt;p&gt;Validate template and report warnings and errors in the template as whole
instead of failing on the first error. The output will be provided with new
sections called ‘errors’ and ‘warnings’ in list format as provided below.
And provide an option to continue on the error as below. If the option
ignore-errors is empty, all the errors will be ignored, otherwise, it
will ignore only those list of errors specified. This will solve the
first and third problem mentioned above.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template-validate&lt;/span&gt; &lt;span class="pre"&gt;--ignore-errors&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;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10 ERR100 some error occurred.&lt;/span&gt;
&lt;span class="nt"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10 WARN100 some warning occurred.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Provide the line number at which the warnings or errors reported in the form
of ‘&amp;lt;line number&amp;gt; [ERRxxx|WARNxxx] &amp;lt;error title&amp;gt;’. Here errors are like
validation error and warnings are like deprecated details, and any
recommendation resources wants to provide for a given property in a resource.
This will solve the second problem mentioned above.&lt;/p&gt;
&lt;p&gt;Provide the option to validate only the schematic of the template, which
ignores the validation of value. This will help the user to identify the
issues in the structure of the template. This could be as below, and this
will solve the fourth problem mentioned above:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template-validate&lt;/span&gt; &lt;span class="pre"&gt;--only-schematics&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;By default report all the deprecated warnings as part of validation. In case
user wants to ignore some warnings, provide an option similar to ignore-errors
as below. If there is no warnings provided, then all the warning will be
reported, otherwise, only those warnings given will be ignored. This will
solve the fifth problem.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;template-validate&lt;/span&gt; &lt;span class="pre"&gt;--ignore-warnings&lt;/span&gt;&lt;/code&gt;&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&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:&lt;/p&gt;
&lt;p&gt;kanagaraj-manickam
ishant-tyagi&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Tag the user visible HeatException with proper error code like ‘HExxx’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve the validate_template() method in heat.engine.service module
to  capture all the errors and warnings like deprecated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;while reporting, if some of these errors are part of ignore-errors list,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;those can be removed from the output response.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;if report-deprecated option is not provided, then ignore those deprecated&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;warning from the output response.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve the validate_template() method to validate the template based on
the required output like parameters, parameter_groups, description and
resources. Optimally preview_stack() method needs to be utilized in place
of resources output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve the validate_template() method to avoid the constrain validation
if the option only-schematics is provided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve the cli to parse the response and print the output in yaml or json
appropriately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&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;
</description><pubDate>Mon, 28 Sep 2015 00:00:00 </pubDate></item><item><title>Add Support for Resource Chains</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/resource-chains.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The resource registry enables template extension and customization through
the ability to map a particular template/implementation to a resource type
name. TripleO uses this pattern extensively to provide integration points
at various steps in the stack deployment that can be used to add 3rd party
integrations, such as service and driver configuration.&lt;/p&gt;
&lt;p&gt;The problem is, only one template can be specified for each of these hooks.
This spec is attempting to alleviate that by introducing a new type that
will aggregate one or more templates into a nested stack.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed change is to introduce a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ResourceChain&lt;/span&gt;&lt;/code&gt; type, similar in
behavior to the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ResourceGroup&lt;/span&gt;&lt;/code&gt;. For example:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;MyChainResource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::ResourceChain&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;lt;list&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# resource types to add to the chain's nested stack&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;lt;boolean&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# optional; default is false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;resource_properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# properties to pass each template in the chain&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Internally, Heat will create a nested stack comprised of each template
specified in the chain’s configuration.&lt;/p&gt;
&lt;p&gt;By default, each resource will be treated as having a dependency on the
resource before it in the list. If the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;concurrent&lt;/span&gt;&lt;/code&gt; property is set to
true, no dependencies between the created resources will be established.&lt;/p&gt;
&lt;p&gt;A failure in a resource creation will abort the creation of the remaining
resources in the chain (and obviously flag the chain resource as failed).
This will allow users to control the order in which the resources in the
chain will be created. If it is set to false, the resources in the chain
will be created concurrently.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_properties&lt;/span&gt;&lt;/code&gt; parameter is similar to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;properties&lt;/span&gt;&lt;/code&gt;
section of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource_def&lt;/span&gt;&lt;/code&gt; used in a resource group and will be
passed to each of the resources in the chain’s stack.&lt;/p&gt;
&lt;p&gt;Resources in the chain may be accessed by index, where the index corresponds
to the template’s location in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resources&lt;/span&gt;&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;The primary drawback is that it moves the template selection from the
resource registry out to the parameters section. There is the potential to
confuse users attempting to extend a template if some of the substitutions
are done in the registry while others are done through parameters. This will
also complicate the capabilities detection since we’ll have to take into
account templates specified not only in the registry, but through a parameter
as well.&lt;/p&gt;
&lt;p&gt;To apply this to the TripleO use cases, below is an example of how resource
chains may be used to configure which resources are created at a particular
step in the deployment:&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;ControllerDeploymentSteps&lt;/span&gt;&lt;span class="p"&gt;:&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;json&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;step1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;loadbalancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;step2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="p"&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;rabbit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;step3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;keystone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="p"&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;glance&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;yaml&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;snip&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;DeploymentStep1&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ResourceChain&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ControllerDeploymentSteps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step1&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
      &lt;span class="n"&gt;resource_properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;DeploymentStep2&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Heat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ResourceChain&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ControllerDeploymentSteps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step2&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
      &lt;span class="n"&gt;resource_properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;servers&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;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;jdob&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 resource plugin for ResourceChain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the corresponding functional 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;
</description><pubDate>Mon, 28 Sep 2015 00:00:00 </pubDate></item><item><title>Allow validation and inspection of nested resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/nested-validation.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/nested-validation"&gt;https://blueprints.launchpad.net/heat/+spec/nested-validation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently, there’s no way to recursively validate all nested templates other
than doing a stack-create and waiting for it to fail.  Additionally, there’s
no way to inspect the interfaces exposed by nested template, e.g those
accessible via parameter_defaults.  Adding more comprehensive support for
pre-create validation (e.g heat template-validate) will allow solving both
of these issues.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;heat template-validate takes an optional environment argument, but it doesn’t
parse the files and include a “files” map such as is consumed by create/update.&lt;/p&gt;
&lt;p&gt;As a result, we expliclitly ignore validation of any nested stacks, even when
they are specified in the environment.  This means it’s hard to validate
nested templates at all before create, other than perhaps by validating
each template individually (this part could probably be considered a bug).&lt;/p&gt;
&lt;p&gt;However it’s also problematic when a nested template exposes interfaces we
wish to interact with via parameter_defaults in the environment, e.g not
specified via the parent template via properties/parameters.  What is needed
is a way to validate the entire tree, and return a schema of the entire
tree, not only the parameters exposed by the top-level template.&lt;/p&gt;
&lt;p&gt;For example, consider this workflow:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Choose parent template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose a set of other templates and environments (or have this
programmatically generated e.g by pulling templates from one or more known
locations/paths)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect that group to figure out the resource-type level
capabilities/options. These are the first major choices a user will make,
to determine the nested stack implementations for each type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The user selects a nested stack choice for each one that has more than one
choice (note &lt;a class="reference external" href="https://review.openstack.org/#/c/196656/"&gt;https://review.openstack.org/#/c/196656/&lt;/a&gt; discusses approaches
for this selection to be made programmatically via the choices made in (3))&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reinspect given those major options for the full set of parameters such that
the user may be prompted for mandatory and optional parameters, including
those not exposed by the top-level parent template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The user enters in values for all of the parameters and the stack gets
created.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The topic of this spec is step 5 above, where we wish to build a schema of
parameters for the entire tree.&lt;/p&gt;
&lt;p&gt;For a more concrete example consider this pattern (which is used commonly,
e.g in TripleO) - the parent template creates a server, then passes the ID to
some nested template which then performs some configuration steps, which are
intended to be pluggable and the interfaces are not known at the time of
writing the parent template:&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;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::ControllerExtraConfigPre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;extraconfig/some_extra.yaml&lt;/span&gt;

&lt;span class="nt"&gt;parameter_defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;SomeExtraParam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"extra&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;foo"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here, any template may be hooked in via ControllerExtraConfigPre, and the
parent template need not know anything about the parameters exposed, other than
that a server ID may be passed in, any extra parameters are wired in at the
time of defining ControllerExtraConfigPre, e.g via parameter_defaults.&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;heat_template_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2015-04-30&lt;/span&gt;

&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Configure some extra config on your server&lt;/span&gt;

&lt;span class="nt"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ID of the server to apply config to&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Config specific parameters, to be provided via parameter_defaults&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;SomeExtraParam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"bar"&lt;/span&gt;

&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ExtraServerConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::StructuredConfig&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;os-apply-config&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;lt;some config&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ExtraServerDeployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::StructuredDeployment&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ExtraServerConfig&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;input_values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;ImplementationSpecificStuff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SomeExtraParam&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;Here we can see the nested template consuming both the parent provided
parameter (server) and the environment provided one (SomeExtraParam).&lt;/p&gt;
&lt;p&gt;Currently, there’s no way, other than knowledge of the templates (or
inspection/parsing by non-heat tools) to know that SomeExtraParam
is a required additional parameter when choosing extraconfig/some_extra.yaml&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Firstly, we need to fix the basic syntax/structure validation part, which will
mean passing an optional “files” map to the validate API (same as for create
and update), then instead of skipping TemplateResource validation (in
service.py validate_template()) we can recurse into the child templates and
validate (similar to what happens on pre-create except we’ll tolerate missing
parameters).&lt;/p&gt;
&lt;p&gt;Then, we need to expose additional parameter information, other than what is
currently exposed (parent template parameters only), this could be done via a
new –show-nested (-n) option:&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;heat&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;validate&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nested&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Below is a sample output when run on a group of templates with the following
properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The parent template contains a single resource named &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;level-1-resource&lt;/span&gt;&lt;/code&gt;
of type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo::Level1&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parent-p1&lt;/span&gt;&lt;/code&gt; parameter is defined by the parent template&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo::Level1&lt;/span&gt;&lt;/code&gt; template contains a parameter that must be specified
by the parent and one that has a default. The latter is meant to represent
the type of value that is specified as a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameter_default&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;level-1-resource&lt;/span&gt;&lt;/code&gt; resource contains a resource named
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;level-2-resource&lt;/span&gt;&lt;/code&gt; of type &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo::Level2&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Similarly, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo::Level2&lt;/span&gt;&lt;/code&gt; template defines a non-defaulted parameter
that must be specified by the parent and one that may optionally be
overridden through &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameter_defaults&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"parent-p1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent first parameter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent-p1"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"NestedParameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"level-1-resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo::Level1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level 1 nested template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"level-1-p1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set by parent; should have a Value field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent-set-value-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level-1-p1"&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"level-1-p2-optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not set by parent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level-1-p2-optional"&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"NestedParameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"level-2-resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo::Level2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level 2 nested template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"level-2-p2-optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not set by parent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level-2-p2-optional"&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"level-2-p1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set by parent; should have a Value field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level-1-set-value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level-2-p1"&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&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;Here we would return a new “NestedParameters” section, (potentially to
multiple levels of nesting), reflecting the parameters validation at each
step of recursion through child templates (or rather resource instantiations
of each child template, which may be used in more than one place with different
parameters).&lt;/p&gt;
&lt;p&gt;The “Default” key would be included if the nested template defines a parameter
default (as usual) or if a default is set via &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameter_defaults&lt;/span&gt;&lt;/code&gt;.
The “Value” key would be included if a value is provided by the parent
template. Note that since parameters are optional during template-validate
calls, this could be None, e.g a Value of None indicates the parent provides
a value but it was not provided as part of the template-validate call.&lt;/p&gt;
&lt;p&gt;This would mean that it’s possible to build a schema from the returned data,
such that, for example any parameters missing both “Default” and “Value” may
be identified, as these will require operator input to provide a parameter.&lt;/p&gt;
&lt;p&gt;The next category of parameters would be “defaulted but configurable” where
Default is present, but no Value - these values you may want to ask operators
for values other than the template default, and if constraints are specified
they will be exposed here (as choices, as with the existing Parameters section)&lt;/p&gt;
&lt;p&gt;Note that the key naming in the returned data structure aligns with the
existing Parameters section - when we reach a v2 API it would be good to
rework both to use more native_api_style_names.&lt;/p&gt;
&lt;p&gt;Below is the example output when the example template above is modified to
use resource groups. The only change is that the parent resource
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;level-1-resource&lt;/span&gt;&lt;/code&gt; has been replaced by a resource group named
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;level-1-groups&lt;/span&gt;&lt;/code&gt;. The definition inside of the group is identical to
the previous example.&lt;/p&gt;
&lt;p&gt;For brevity, the bulk of the output has been removed. The relevant point is
that each node in the group will be listed by index:&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="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"parent-p1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"NoEcho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent first parameter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parent-p1"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"NestedParameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"level-1-groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OS::Heat::ResourceGroup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"NestedParameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo::Level1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level 1 nested template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"Parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"level-1-p1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"level-1-p2-optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;"NestedParameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"level-2-resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo::Level2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"level 2 nested template"&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&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 id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative we’ve been working with for some time in the TripleO community
is to maintain a separate service, outside of heat, which contains logic
that is coupled to the template implementation, and knows how to wire in the
appropriate parameters, and maintains a mapping of nested template
implementations to provider resource types.&lt;/p&gt;
&lt;p&gt;This works, but you end up with a single-purpose service which is very highly
coupled to the template implementation, which is tough from a maintainability
perpective as well as a not helping the wider heat community with their
composition and interface building needs.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;There will be two stages to the implementation, first pass the files map in to
heat and make basic validation work on nested stacks via template-validate.&lt;/p&gt;
&lt;p&gt;Then the extra data outlined above will be added via the NestedParameters key,
and finally the heatclient interfaces to consume this will be added.&lt;/p&gt;
&lt;p&gt;It may be that additional usability features can be added to heatclient,
such as building a stub environment file containing parameter_defaults
related to the validation output (this has been discussed on the ML), but
since the requirement here is not fully defined, I won’t consider it in
this spec.&lt;/p&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;shardy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-2&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;Changes to API:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support for “files” map to be passed via validate call&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changes to engine:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Modify the template-validate path so TemplateResources are no longer skipped,
instead recursively validate similar to the pre-create steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update template-validate code to build NestedParameter output&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changes to heatclient:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add –show-nested option to template-validate, which collects and populates
the optional files map, and passes it to the API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Documentation changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update API docs to reflect the “files” optional argument&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;
</description><pubDate>Fri, 25 Sep 2015 00:00:00 </pubDate></item><item><title>Support neutron QoS in heat</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/support-neutron-qos.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-neutron-qos"&gt;https://blueprints.launchpad.net/heat/+spec/support-neutron-qos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Provides support for neutron QoS feature.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/quantum-qos-api"&gt;https://blueprints.launchpad.net/neutron/+spec/quantum-qos-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After the above blueprint, neutron supports an api extension for QoS,
and now provides support for attaching/detaching QoS policy to port and
network resources(with create and update).
There are two data models QoSPolicy and QoSRule, with a relationship:
QoSRule(s)-&amp;gt;QoSPolicy -&amp;gt; Port/Network. For now, neutron has implemented
one rule type, QoSBandwidthLimitRule that provides bandwidth limit on
the instance egress traffic.&lt;/p&gt;
&lt;p&gt;Administrator of a cloud may want to offer different service levels
based on the available network resources with heat, so this blueprint
will provide support for neutron resource QoS in heat, based on above
neutron resources for QoS.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add following Resources under resources/openstack/neutron/&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::QoSPolicy&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: The name of QoS policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: The description of QoS policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&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;shared:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: Boolean&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Whether this QoS policy be shared to other tenants&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: False&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;tenant_id:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: The owner tenant ID of this QoS policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;rules:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: List&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: A list of all rules for the QoS policy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::QoSBandwidthLimitRule&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;policy:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: ID or name of the QoS policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.qos_policy’&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;max-kbps:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Max bandwidth in kbps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Range(min=0)&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;max-burst-kbps:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: Integer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Max burst bandwidth in kbps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: 0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Range(min=0)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2. Add ‘qos_policy’ property for OS::Neutron::Port and OS::Neutron::Network
resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;qos_policy:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: The name or ID of QoS policy to attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: Custom Constrain ‘neutron.qos_policy’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-2&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 resources related&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add property for port and network resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample templates in heat-templates project&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;
</description><pubDate>Sat, 19 Sep 2015 00:00:00 </pubDate></item><item><title>Designate resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-designate-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-designate-resource"&gt;https://blueprints.launchpad.net/heat/+spec/heat-designate-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint adds heat resource plug-ins for OpenStack DNS as a service
(designate).&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenStack provides DNS as a service (designate) and more details are
available at wiki &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Designate"&gt;https://wiki.openstack.org/wiki/Designate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In heat, resource plug-ins are not available for designate service. And this
blueprint is created to provide required plug-ins for designate service.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Designate service provides v1 and v2 APIs[1] and it’s python client[2]
provides support only for v1. So in this blueprint, v1 support is added
with following resources.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Designate::Domain&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Domain name&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;ttl:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: int&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Time To Live (Seconds)&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of domain&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;email:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Domain email&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;serial:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;description: DNS domain serial&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Designate::Server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS Server Name&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS:Designate::Record&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;domain:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS Domain id or name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints: CustomConstrain(‘designate.domain’)&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;name:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS Name&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;type:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraints:[A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP, SOA]&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;data:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record data (Ip address)&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;ttl:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: int&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record Time To Live (Seconds)&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;description:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Description of DNS record&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;priority:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;required: False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: int&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: True&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: DNS record priority&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&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&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;Kanagaraj Manickam (kanagaraj-manickam)
Anant Patil (ananta)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 proposed resource plug-ins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement custom constrain for ‘designate.domain’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&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;[1] &lt;a class="reference external" href="http://designate.readthedocs.org/en/latest/rest.html"&gt;http://designate.readthedocs.org/en/latest/rest.html&lt;/a&gt;
[2] &lt;a class="reference external" href="https://github.com/openstack/python-designateclient"&gt;https://github.com/openstack/python-designateclient&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 16 Sep 2015 00:00:00 </pubDate></item><item><title>Implement Sahara image resource</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/sahara-image.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/sahara-image"&gt;https://blueprints.launchpad.net/heat/+spec/sahara-image&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add support for Sahara image resource which will allow to register images
in sahara and add tags.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Before creating a cluster we have to register an image in the sahara image
registry and add tags. Currently we can do this using sahara CLI or UI and
then create a stack with sahara resources (node group template, cluster
template and cluster). It would be more comfortable to register/unregister
an image using the same template when a stack is created/deleted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement OS::Sahara::ImageRegistry resource:&lt;/p&gt;
&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;image (required) - image id to register&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;username (required, update allowed) - username of privileged user in the
image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional, update allowed) - description of the image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tags (optional, update allowed) - tags to add to the image&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Usage example:&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;glance-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Glance::Image&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;sahara-icehouse-vanilla-1.2.1-ubuntu-13.10&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;disk_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;qcow2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;container_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;bare&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;http://sahara-files.mirantis.com/sahara-icehouse-vanilla-1.2.1-ubuntu-13.10.qcow2&lt;/span&gt;

&lt;span class="nt"&gt;sahara-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Sahara::ImageRegistry&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;glance-image&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'vanilla'&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'1.2.1'&lt;/span&gt;&lt;span class="p p-Indicator"&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&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;tlashchova&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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 Sahara image resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&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;
</description><pubDate>Sat, 05 Sep 2015 00:00:00 </pubDate></item><item><title>Resources docstrings improvements</title><link>https://specs.openstack.org/openstack/heat-specs/specs/mitaka/docstring-improvements.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/docstring-improvements"&gt;https://blueprints.launchpad.net/heat/+spec/docstring-improvements&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Current Resources’ descriptions are poor. Description of any resource
get from resource’s class docstring. So there is need to add docstring to
resources, which have no description and fix existing relying on
&lt;a class="reference external" href="http://legacy.python.org/dev/peps/pep-0008/"&gt;PEP rules&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Current Resources’ descriptions are poor. It’s means that new users cannot
open documentation, learn for what this or that resource is needed and begin
to use it. They have to search native documentation of resources. So,
documentation &lt;em&gt;must&lt;/em&gt; contains summary information about each resource that
orchestration uses.&lt;/p&gt;
&lt;p&gt;Besides that, some docstrings have template example, also template displays
in documentation, so there are two template’s entry for one resource. This
situation should be fixed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Solution of this problem includes next cases:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Fix all existing docstrings relying on
&lt;a class="reference external" href="http://legacy.python.org/dev/peps/pep-0008/"&gt;PEP rules&lt;/a&gt;. When this case
will be done, need to remove ignorance of PEP8 rules in tox.ini file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add docstrings of next resources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Barbican::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Ceilometer::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Cinder::Volume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Cinder::VolumeAttachment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Designate::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::AccessPolicy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::AutoScalingGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::InstanceGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::SwiftSignal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::SwiftSignalHandle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::WaitCondition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::WaitConditionHandle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Mistral::CronTrigger&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Mistral::Workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::FloatingIP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::FloatingIPAssociation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::Server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Sahara::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Swift::Container&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Trove::Cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Zaqar::Queue&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expand/fix docstrings of next resources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Cinder::EncryptedVolumeType&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Cinder::VolumeType&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Glance::Image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::RandomString&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::Stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Heat::ScalingPolicy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Magnum::BayModel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Manila::ShareNetwork&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Monasca::AlarmDefinition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Monasca::Notification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Neutron::* resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::Flavor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Nova::ServerGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Trove::Instance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;As additional issue, fix coding of internal templates, i.e. add tags for
YAML code for colorization 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&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;&amp;lt;prazumovsky&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mitaka-1&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;Fix docstrings with PEP8 rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove ignored rules from tox.ini&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add docstrings to Resource’s classes where they omitted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve and fix docstring where it needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix coding of internal 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;
</description><pubDate>Fri, 28 Aug 2015 00:00:00 </pubDate></item><item><title>Special form of get_attr which returns all attributes</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/get_attr-all-attributes.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/get-attr-all-attributes"&gt;https://blueprints.launchpad.net/heat/+spec/get-attr-all-attributes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add new functionality for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt; function which allows to return dict of
all attributes.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Current implementation of base attribute “show” returns JSON
representation of resource. Content of this representation depends on
particular resource. This output is also used in native clients for building
output of command &lt;code class="code docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;client&amp;gt;&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;resource&lt;/span&gt; &lt;span class="pre"&gt;name&amp;gt;-show&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Historically some Heat resources have attributes schema with attributes
taken from the output mentioned above. However it doesn’t mean,
that all attributes in schema are presented in “show” output.
It’s mostly related to dynamic attributes and custom attributes,
which require additional calculations, e.g. “addresses” attribute
of OS::Nova::Server that also contains related port id in output.&lt;/p&gt;
&lt;p&gt;From the other side Heat also have resources with empty attribute schema,
so only “show” attribute is available for them.&lt;/p&gt;
&lt;p&gt;In some cases to avoid using several outputs in template it will be useful
to return all attributes from attribute schema
(excluding the base attribute “show”) in one output.
This functionality should be added for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt; intrinsic function.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add some special form of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt; as next:&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;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;resource_name&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;with no extra arguments, which will returns dict of all attributes’ outputs.&lt;/p&gt;
&lt;p&gt;This behaviour of get_attr can be used only when the latest
heat_template_version is selected, so this case should be noted in the
documentation.&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&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;&amp;lt;prazumovsky&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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 new functionality to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add note to documentation about new functionality of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_attr&lt;/span&gt;&lt;/code&gt;&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;
</description><pubDate>Thu, 13 Aug 2015 00:00:00 </pubDate></item><item><title>Implement Sahara EDP resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/sahara-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/sahara-edp"&gt;https://blueprints.launchpad.net/heat/+spec/sahara-edp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add support for Job, JobBinary and DataSource sahara objects as resources
in heat.&lt;/p&gt;
&lt;p&gt;Using sahara EDP in heat we can create following resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Data&lt;/span&gt; &lt;span class="pre"&gt;source&lt;/span&gt;&lt;/code&gt; object stores a URL which designates the location of input
or output data and any credentials needed to access the location;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Job&lt;/span&gt; &lt;span class="pre"&gt;binary&lt;/span&gt;&lt;/code&gt; object stores a URL to a single script or Jar file and any
credentials needed to retrieve the file;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Job&lt;/span&gt;&lt;/code&gt; object specifies the type of the job and lists all of the
individual &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;job&lt;/span&gt; &lt;span class="pre"&gt;binary&lt;/span&gt;&lt;/code&gt; objects. Can be launched using resource-signal.&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;Currently we can’t create Sahara EDP resources in Heat.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement following resource types:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Sahara::DataSource&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (optional) - name of the data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type (required) - type of the data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;url (required) - URL for the data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional) - description of the data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user (optional) - username for accessing the data source URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;password (optional) - password for accessing the data source URL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;OS::Sahara::JobBinary&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (optional) - name of the job binary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;url (required) - URL for the job binary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional) - description of the job binary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user (optional) - username for accessing the job binary URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;password (optional) - password for accessing the job binary URL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;OS::Sahara::Job&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (optional) - name of the job&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type (required) - type of the job&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;main (optional) - ID for job’s main job-binary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lib (list, optional) - ID of job’s lib job-binary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional) - description of the job&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;executions - list of the job executions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To execute the job run the following command:&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;heat&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="n"&gt;stack_name&lt;/span&gt; &lt;span class="n"&gt;job_name&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;data&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;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;data&lt;/span&gt;&lt;/code&gt; contains execution details including data sources, configuration
values, and program arguments.&lt;/p&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&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;tlashchova&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-3&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 Sahara data source resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Sahara job binary resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Sahara job resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample templates in heat-template project&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;
</description><pubDate>Wed, 22 Jul 2015 00:00:00 </pubDate></item><item><title>“None” resource which does.. nothing!</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/none-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/noop-resource"&gt;https://blueprints.launchpad.net/heat/+spec/noop-resource&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add a “None” resource, intended to simplify mapping resource_registry
entries to an implemention which always passes, but does nothing.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, in a large tree of composable nested templates, controlled by
a number of rigidly defined parent templates, there is often the need
to provide optional interfaces where extra logic may be linked in.&lt;/p&gt;
&lt;p&gt;Simplified example derived from TripleO (this pattern is repeated in several
places):&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;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;foo/controller.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::ControllerExtraConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;noop.yaml&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here we have a nested template which creates a “controller” node, and does
some standard configuration.  Then, in some circumstances, we want to hook in
some extra configuration steps, or provide an interface which enables that.&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::TripleO::Controller&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;aproperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;123&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;extra_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::TripleO::ControllerExtraConfig&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;controller&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;The ExtraConfig “noop.yaml” implementation is just an empty template which
takes the “server” parameter.&lt;/p&gt;
&lt;p&gt;It would be nice to avoid having these “noop” templates duplicated, when
all they do is duplicate the interface expected for a “real” implementation,
you end up with multiple noop.yaml files with different parameters/outputs
which is inconvenient and error prone.&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 OS::Heat::None resource, which replaces the noop.yaml&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;resource_registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::Controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;foo/controller.yaml&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;OS::TripleO::ControllerExtraConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This resource will accept any properties, and return any attribute (as None).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative is for template authors wishing to provide interfaces for
optional additional functionality to keep maintaining multiple templates
which actually do nothing, such as is happening in TripleO at the moment.&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;shardy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-2&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;dl class="simple"&gt;
&lt;dt&gt;Changes to engine:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement noop resource and tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Documentation changes:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure docstrings are present in code so template guide is updated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 01 Jul 2015 00:00:00 </pubDate></item><item><title>Resource plugin for Monasca Alarm and Notification</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-monasca-alarm-notification.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-monasca-alarm-notification"&gt;https://blueprints.launchpad.net/heat/+spec/support-monasca-alarm-notification&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resource plugin for Monasca Alarm and Notification&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenStack provides monitoring-as-a-service (monasca) and more details are
available at wiki &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Monasca"&gt;https://wiki.openstack.org/wiki/Monasca&lt;/a&gt;
In heat, resource plug-ins are not available for monasca service. And this
blueprint is created to provide required plug-ins for monasca alarm and
notification.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following resource plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Monasca::Alarm:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: physical_resource_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description:&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;expression&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;match_by&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;severity&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed_values: [low, medium, high, critical]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: low&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;alarm_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Custom constrain ‘monasca.notification’&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;ok_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Custom constrain ‘monasca.notification’&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;undetermined_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Custom constrain ‘monasca.notification’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Monasca::Notification:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: physical_resource_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: false&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;type&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed_values: [email, webhook, pagerduty]&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;address&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom constrain ‘monasca.notification’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As monasca provides Notification separated from the Alarm,
to be compatible with other existing alarm resources in heat,
following additional resource is added, where all actions are considered as
webhook.&lt;/p&gt;
&lt;p&gt;If the user provided webhook is not exist in the monasca,
heat will create new notification with that webhook, before creating the
alarm, otherwise, the existing notification for that webhook will be used.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Monasca::AlarmI:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;name&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: physical_resource_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description:&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;description&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;expression&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;match_by&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&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;severity&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed_values: [low, medium, high, critical]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default: low&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;alarm_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Webhook URL&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;ok_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Webhook URL&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;undetermined_actions&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;type: list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;required: false&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_allowed: true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List item constrains: Webhook URL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All of these resource plugins will be supported from version ‘5.0.0’&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&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;&lt;a class="reference external" href="mailto:duanlg%40live.cn"&gt;duanlg&lt;span&gt;@&lt;/span&gt;live&lt;span&gt;.&lt;/span&gt;cn&lt;/a&gt;
kanagaraj-manickam&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 Monasca client plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement custom constrain ‘monasca.notification’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement alarm and notification resource plugins as detailed above&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the logic to load the monsaca resources only when
python-monascaclient is available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement required test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample template in the heat-templates github repo.&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;
</description><pubDate>Thu, 25 Jun 2015 00:00:00 </pubDate></item><item><title>Intrinsic function to split strings</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/native-split.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/str-split"&gt;https://blueprints.launchpad.net/heat/+spec/str-split&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From HOT 2014-10-16 we no longer support the AWS compatible Fn::Split intrinsic
function in HOT templates, which means there’s no way to split a string into
a list of components by delimiter.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The current use case is to avoid doing this in TripleO templates, but it’s
likely a generally useful addition:&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;ip_subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;IP/Subnet CIDR for the storage network IP&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;list_join&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;''&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;StoragePort&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fixed_ips&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip_address&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;StoragePort&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cidr&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;-2&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;StoragePort&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cidr&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;-1&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;This is both fragile and cumbersome, it’d be better to allow easily splitting
on the “/” delimiter.&lt;/p&gt;
&lt;p&gt;The second use-case is to enable joining of two (or more) lists together:&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;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ExtraConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;json&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[]&lt;/span&gt;

&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Heat::StructuredConfig&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;os-apply-config&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;hiera&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;hierarchy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;controller&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;object&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ceph&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;common&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ExtraConfig&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;Here, the desired behavior is to merge/append the contents of the ExtraConfig
parameter, which may be either json or comma_delimited_list type, such that the
“hierarchy” list contains both the hard-coded items and whatever list is
provided via ExtraConfig.&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 str_split intrinsic function, such that the first example becomes:&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;list_join&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;''&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;StoragePort&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fixed_ips&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ip_address&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;str_split&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;StoragePort&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cidr&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&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;This means we can strip the subnet mask from the CIDR without hard-coded
assumptions around it always being 2 digits - path based lookup by index will
be supported, e.g the same syntax as get_attr and get_param, so when an index
is specified then the list item at that index is returned, otherwise the
entire list is returned.  This is consistent with current get_attr behavior
and avoids forcing the user to use Fn::Select to extract a list item.&lt;/p&gt;
&lt;p&gt;To enable the second use-case, we can use the new str_split function, with
an enhanced version of list_join which can optionally take a list of lists,
e.g it’s capable of joining multiple lists on a delimiter:&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;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;hiera&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;hierarchy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;str_split&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;','&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;list_join&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;','&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;controller&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;object&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ceph&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;common&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ExtraConfig&lt;/span&gt;&lt;span class="p p-Indicator"&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;For the list merging I was thinking we could use the YAML &amp;lt;&amp;lt; merge directive,
but some experiements indicate this will only merge maps, not lists which
are required in this case.&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;shardy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;Changes to engine:
- Bump HOT template version for Liberty
- Enhance list_join to support optionally joining lists of lists.
- Add a new str_split function with associated tests.&lt;/p&gt;
&lt;p&gt;Documentation changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update HOT specification as part of the commits above.&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;
</description><pubDate>Mon, 22 Jun 2015 00:00:00 </pubDate></item><item><title>Add support for external resources.</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/external_resource.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/heat/+spec/external-resources"&gt;https://blueprints.launchpad.net/heat/+spec/external-resources&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We have no way to instruct Heat to use an existing (external) physical
resource id.&lt;/p&gt;
&lt;section id="use-case-1"&gt;
&lt;h3&gt;Use case 1:&lt;/h3&gt;
&lt;p&gt;When running a stack over a period of time a user might find it necessary
to operate on a server (rebuild it) out of band. But that then left
it out of sync with Heat’s perspective of it. So this is a mechanism
to tell Heat “this is the new resource id, and I am now taking control
of it”. At some stage later (s)he might want to tell Heat to take control
of it again - by removing the “external_reference” section. This fills
TripleO’s needs (and we assume many other users that have to operate
an important stack for an extended time) by allowing the
get_attr/get_resource to keep functioning when they are working on a
resource externally and for Heat to leave it alone. Then when the user
is happy with the state of it they can return it to Heat’s control.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="use-case-2"&gt;
&lt;h3&gt;Use case 2:&lt;/h3&gt;
&lt;p&gt;There is an existing resource that we would like to use get_attr
on to retrieve useful information instead of doing this manually
and passing the info in via the Parameters.&lt;/p&gt;
&lt;p&gt;In all these cases once this is done the resource can be marked
as external and any update or delete will be ignored (unless the user
removes the “external” information first).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To achieve this the user would add the following to the template:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;res_a&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nova&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
    &lt;span class="n"&gt;external_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note:
1. There is no place for “resource_data or Metadata” as these are
used by actions that once it becomes external are not possible. There
will be some resource types that will not survive going from external
to normal resources because of the missing resource data/metadata.
This will be documented as best as possible, and the use of
resource_data should be discouraged by Heat developers.&lt;/p&gt;
&lt;p&gt;2. Once the resource has the “external_id” attribute present the properties
will be ignored (but be allowed to be present). If the “external_id”
is then removed the resource will be updated with the properties.&lt;/p&gt;
&lt;section id="creating-a-resource-with-external-id"&gt;
&lt;h3&gt;Creating a resource with external_id.&lt;/h3&gt;
&lt;p&gt;This covers the second use case. Here we see that there is an
external_id and logically do an adopt and check (to make sure
the resource actually exists).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="updating-a-resource-with-external-id"&gt;
&lt;h3&gt;Updating a resource with external_id.&lt;/h3&gt;
&lt;p&gt;This covers the first use case. We overwrite the resource_id that Heat
has previously written and ignore all the properties. Check will also
be called here to make sure the resource exists. If the external_id is
different to the existing physical_resource_id then the existing one
will be deleted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="removing-the-external-id"&gt;
&lt;h3&gt;Removing the external_id.&lt;/h3&gt;
&lt;p&gt;To convert the resource into a “normal” resource the user must
remove the “external_id” attribute from the resource and do
a stack update. If the resource requires some missing resource_data
or metadata that is missing (and can’t be recovered) this will fail
and it will remain as external.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deleting-a-stack-with-a-resource-that-has-external-reference"&gt;
&lt;h3&gt;Deleting a stack with a resource that has external_reference.&lt;/h3&gt;
&lt;p&gt;When we have an external_reference, a deletion policy of RETAIN is
assumed (it will not be deleted).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The user &lt;em&gt;could&lt;/em&gt; use the current adopt/abandon mechanism, but it has
some slightly different behaviour. Also switching physical resource_id
is difficult with 2 API calls.&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;asalkeld&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-2&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;Code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation needs to be added to the template guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document limitations (resources that require resource_data
and metadata).&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;
</description><pubDate>Mon, 15 Jun 2015 00:00:00 </pubDate></item><item><title>Heat Upgrade Tests</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/upgrade-tests.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/upgrade-tests"&gt;https://blueprints.launchpad.net/heat/+spec/upgrade-tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The new direction of the grenade project is to use devstack-style
plugins to support upgrade testing. This spec aims to get upgrade
testing infrastructure in Heat’s tree.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, there aren’t any tests that check if a patch in-review
would break the upgrade of Heat from a previous release.&lt;/p&gt;
&lt;p&gt;Some of the issues a deployer may face during or post upgrade are as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The deployed database not successfully migrating to the newest schema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stacks created in an older release not updatable/deletable in new release.
A change in the update/delete workflow may render existing stacks useless
or be in an IN_PROGRESS state forever.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Physical resources disappearing when the control plane is taken down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration options removed prematurely without notice.&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;Get upgrade testing in-tree by using grenade’s external plugin mechanism.
The upgrade tests should follow what grenade calls the Theory of Upgrade
- &lt;a class="reference external" href="https://github.com/openstack-dev/grenade#theory-of-upgrade"&gt;https://github.com/openstack-dev/grenade#theory-of-upgrade&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To ease developers writing upgrade tests, we will have
(pre/during/post)-upgrade tox envs that will run tests
respectively during the (pre/during/post)-upgrade phases
in grenade.&lt;/p&gt;
&lt;p&gt;As an example, the pre-upgrade phase will create stacks before an
upgrade. The during-upgrade phase will check if the resources created by a
stack are still alive even when heat’s services are down. The post-upgrade
phase could update/delete these stacks to verify that those old stacks are
still operable.&lt;/p&gt;
&lt;p&gt;Once this infrastructure is in place, we should be able to add support
for rolling upgrades of heat-engine with the help of the existing versioned
objects mechanism in Heat. This will use Grenade’s partial-upgrade strategy
similar to what is being done for Nova.&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&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;sirushtim&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-2&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;In-tree grenade testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Project config changes to add voting grenade job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tag smoke tests in heat_integrationtests that must be run during the
grenade sanity-check(verify) phase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pre/during/post-env env sections in tox that will respectively invoke
the tests before, during and after the upgrade of Heat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get devstack to use the system level heat binaries instead of the ones
in the repository to emulate what a user would face when upgrading heat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Upgrade Impact section to heat-specs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support rolling upgrade of heat-engine.&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;Grenade external plugin mechanism &lt;a class="reference external" href="https://review.openstack.org/#/c/185050"&gt;https://review.openstack.org/#/c/185050&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 11 Jun 2015 00:00:00 </pubDate></item><item><title>Heat template functions list</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-template-function-list.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/template-function-list"&gt;https://blueprints.launchpad.net/heat/+spec/template-function-list&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add an ability to get the list of available functions for given template
by REST API and CLI&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There is no possibility to get the list of functions that are supported by
the given template version. It is useful for helping template
writers, especially for HOT builders.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following command to heat CLI:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt; &lt;span class="pre"&gt;template-function-list&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;template_version&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Where &lt;cite&gt;template_version&lt;/cite&gt; is template version given by
&lt;cite&gt;heat template-version-list&lt;/cite&gt; command output. This command returns
the list of available template versions with corresponding type
(cfn or hot) for user convenience.&lt;/p&gt;
&lt;p&gt;Corresponding REST API would be the following:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;/template_versions/&amp;lt;template_version&amp;gt;/functions&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Possible output:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Functions&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&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;Fn::GetAZs&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Returns the Availability Zones within the given region.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;get_param&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;A function for resolving parameter references.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;get_resource&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;A function for resolving resource references.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Ref&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;A function for resolving parameter references.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;…&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Needed template can be obtained by template manager via
_get_template_extension_manager() from template module. Each
template has the list of functions as class attribute. Description
of each functions will be obtained via __doc__() method of the
function class. Additional changes is needed to REST API controller
and RPC.&lt;/p&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;ochuprykov
tlashchova
skraynev&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-2&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;Update Resource REST API controller with additional capabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the heat CLI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required additional test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add documentation for CLI (python-heatclient), REST API (api-sites)&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;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/template-version-list"&gt;https://blueprints.launchpad.net/heat/+spec/template-version-list&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 04 Jun 2015 00:00:00 </pubDate></item><item><title>Heat template versions list</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-template-version-list.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/template-version-list"&gt;https://blueprints.launchpad.net/heat/+spec/template-version-list&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add an ability to get list of available template versions by
REST API and CLI&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There is no such command in heat now. It is useful for helping
end-users to write heat templates, especially for HOT builders.
Another use-case is to get list of available template versions that
are available on current deployment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the following command to heat CLI:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt; &lt;span class="pre"&gt;template-version-list&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Output may be the following:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Versions&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&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;heat_template_version.2013-05-23&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;hot&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;heat_template_version.2014-10-16&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;hot&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;heat_template_version.2015-04-30&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;hot&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;HeatTemplateFormatVersion.2012-12-12&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cfn&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;AWSTemplateFormatVersion.2010-09-09&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cfn&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Corresponding REST API would be the following:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;/template_versions&lt;/span&gt;&lt;/code&gt;&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&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;ochuprykov
tlashchova
skraynev&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;Update REST API controller with additional capabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the heat CLI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required RPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required additional test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add documentation for CLI (python-heatclient), REST API (api-sites)&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;
</description><pubDate>Thu, 04 Jun 2015 00:00:00 </pubDate></item><item><title>Conditional exposure of resources based on user roles</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/conditional-resource-exposure-roles.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/heat/+spec/conditional-resource-exposure"&gt;https://blueprints.launchpad.net/heat/+spec/conditional-resource-exposure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Expose resources as available based on actual user roles.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently we unconditionally register and present to the user all resource
plugins that we have in-tree.
As we will move in-tree some contrib/ resources that require special roles
for instantiation (e.g. Keystone resources) all users will see them
as available despite that the user might not actually be able to use them
due to RBAC restrictions.
This would be confusing to users and facilitate later stack failure
at creation instead of failing early at validation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add optional settings in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat.conf&lt;/span&gt;&lt;/code&gt;
(in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[clients]&lt;/span&gt;&lt;/code&gt; section to be used for every client or in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[client_*]&lt;/span&gt;&lt;/code&gt;
section for a specific client) specifying the list of required “special”
roles to instantiate restricted resources of this service.&lt;/p&gt;
&lt;p&gt;Use these values during validation to compare the roles with the roles from
the context to check for resource availability for the specific user who has
made the request.&lt;/p&gt;
&lt;p&gt;Default value (empty list) of the new config option will mean
show the resource as available to any user.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Keep the things as they are continuing to confuse users and fail later than
earlier for templates with resources that current user can not create without
having special roles.&lt;/p&gt;
&lt;p&gt;Long term alternative / improvement would be to wait until Keystone implements
fine grained policy control and querying as part of API.&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;Pavlo Shchelokovskyy &amp;lt;pshchelo&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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 config options for client plugins describing the required special
roles list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add an attribute to resources requiring special roles that marks them as such&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add an extra parameter to SupportStatus hinting that this resource will
likely require a special role a common user would not generally have&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;modify docs generation to flag such resources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add validation step comparing the options from config with roles from context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;functional tests&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;modify DevStack to automatically configure Heat with DevStack’s default
policies in respect to special roles for new Keystone client options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check if Keystone resources are listed if called from non-admin users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check that template containing Keystone resources is failing validation&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;blueprint keystone-based-resource-availability is implemented&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;admin-requiring resources are moved in-tree from contrib/&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 26 May 2015 00:00:00 </pubDate></item><item><title>Conditionally expose resources based on available services</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/conditional-resource-exposure-services.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/heat/+spec/keystone-based-resource-availability"&gt;https://blueprints.launchpad.net/heat/+spec/keystone-based-resource-availability&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Expose resources as available based on presence of the service.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently we unconditionally register and present to the user all resource
plugins that we have in-tree, even though the actual service might not be
installed in a particular cloud (e.g. Neutron resources on Nova-network
based cloud or Sahara resources though Sahara is not that usually installed).
This is confusing to the user as (s)he sees resources that can not actually
be used as available, and facilitates late failure of instantiated template
instead of failing at validation.&lt;/p&gt;
&lt;p&gt;The situation is only going to get worse as we move the contrib/ resources
back in-tree, and we will probably accept in-tree resources for many more
projects under the “Big Tent” governance model.&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 additional validation step in the resource class that checks
if the required endpoint is present.
Endpoints can be accessed from the request context that is already available
in the resource class as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;stack.context&lt;/span&gt;&lt;/code&gt;.
This method should be called from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Resource.__new__&lt;/span&gt;&lt;/code&gt; and raise
a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;StackResourceUnavailable&lt;/span&gt;&lt;/code&gt; exception
(new subclass of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;StackValidationError&lt;/span&gt;&lt;/code&gt;) when appropriate.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;list_resource_types&lt;/span&gt;&lt;/code&gt; method should tolerate the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;StackResourceUnavailable&lt;/span&gt;&lt;/code&gt; and do not output resources raising this as part
of available resources list.&lt;/p&gt;
&lt;p&gt;Client plugins must implement a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;service_type&lt;/span&gt;&lt;/code&gt; property to be used during
validation and also during client instantiation.&lt;/p&gt;
&lt;p&gt;Every resource type must implement the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_client_plugin&lt;/span&gt;&lt;/code&gt;
class attribute to be used in the base &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Resource&lt;/span&gt;&lt;/code&gt; class to validate
the endpoints presence in the context.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Keep the things as they are continuing to confuse users and fail later than
earlier for templates with resources for services unavailable
in the current deployment.&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;Kanagaraj Manickam &amp;lt;kanagaraj-manickam&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Assisted by:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Pavlo Shchelokovskyy &amp;lt;pshchelo&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;changes in the client plugins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_client_plugin&lt;/span&gt;&lt;/code&gt; to all resource plugins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;changes in the base resource class&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;changes in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;list_resource_types&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;show_resource_type&lt;/span&gt;&lt;/code&gt; service
methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;scenario integration tests (based on some “exotic” resource)
- check if resource is listed as available
- check if template with resource validates&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;
</description><pubDate>Fri, 22 May 2015 00:00:00 </pubDate></item><item><title>Implement batch create and update for resource group</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/resource-group-batching.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/resource-group-batching"&gt;https://blueprints.launchpad.net/heat/+spec/resource-group-batching&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add possibility to create and update resources in batches&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat doesn’t allow to create resources in batches which can lead
to unnecessary high load of the cloud for large number of resources.
In particular nova can fail while deploying large Sahara clusters
because of tons of simultaneous requests to create/update VMs and
polling those resources for status.
Also Heat partially support batch update (only for AutoscalingGroup)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add batching_policy property to ResourceGroup with similar to
rolling_update structure:&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;res_group&lt;/span&gt;&lt;span class="p"&gt;:&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;OS&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Heat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ResourceGroup&lt;/span&gt;
   &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
     &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="n"&gt;batching_policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;min_in_service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
       &lt;span class="n"&gt;max_batch_size&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;pause_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
       &lt;span class="n"&gt;batch_actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CREATE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'UPDATE_EXISTING'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'UPDATE'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;max_batch_size&lt;/cite&gt;, &lt;cite&gt;pause_time&lt;/cite&gt;, &lt;cite&gt;min_in_service&lt;/cite&gt; has the same meaning as
in rolling_update with one exception that &lt;cite&gt;min_in_service&lt;/cite&gt; can’t be applied
to batch &lt;cite&gt;CREATE&lt;/cite&gt; action and will be ignored.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;batch_actions&lt;/span&gt;&lt;/code&gt; is actions that will be batched, with the following available
options:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;CREATE&lt;/cite&gt;: apply batching on stack creation i.e. add resources in sequence by
&lt;cite&gt;max_batch_size&lt;/cite&gt; resources at every batch, possible except for the last one.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;UPDATE_EXISTING&lt;/cite&gt;: exactly the same thing as rolling update&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;UPDATE&lt;/cite&gt;: regular update, existing resources will updated in batches and if it
is needed to add some count of resources they will be added in bathes too.&lt;/p&gt;
&lt;p&gt;It is proposed to make old rolling_update property deprecated in favour of
batching_policy as batching_policy has wider possibilities including old
rolling_update.&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&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;ochuprykov&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-2&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 batching_policy property to ResourceGroup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required additional unit and functional test cases&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;
</description><pubDate>Fri, 15 May 2015 00:00:00 </pubDate></item><item><title>Adopt Oslo Guru Meditation Reports</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/guru-meditation-report.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/guru-meditation-report"&gt;https://blueprints.launchpad.net/heat/+spec/guru-meditation-report&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec adopts Oslo Guru Meditation Reports in Heat. The feature will
enhance debugging capabilities of all Heat services, by providing
an easy and convenient way to collect debug data about current threads
and configuration, among other things, to developers, operators,
and tech support in production deployments.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently,Heat doesn’t provide a way to collect state data from active service
processes. The only information that is available to deployers, developers,
and tech support is what was actually logged by the service. Additional data
could be usefully used to debug and solve problems that occur during Heat
operation. We could be interested in stack traces of green and real threads,
pid/ppid info, package version, configuration as seen by the service, etc.&lt;/p&gt;
&lt;p&gt;Oslo Guru Meditation Reports provide an easy way to add support for collecting
the live state info from any service. Report generation is triggered by sending
a special(USR1) signal to a service. Reports are generated on stderr, and can
be piped into system log based on need.&lt;/p&gt;
&lt;p&gt;Nova has supported Oslo Guru Meditation Reports.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;First, the oslo-incubator module (reports.*) should be synchronized into
heat tree. Then, each service process needs to initialize the error report
system prior to the service start().&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&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;zhangtralon&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;sync reports.* module from oslo-incubator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adopt it in all heat services under heat/bin/&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add some developer docs on how to use this feature&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;[1] oslo-incubator module: &lt;a class="reference external" href="http://git.openstack.org/cgit/openstack/oslo-incubator/tree/openstack/common/report"&gt;http://git.openstack.org/cgit/openstack/oslo-incubator/tree/openstack/common/report&lt;/a&gt;
[2] nova guru meditation reports: &lt;a class="reference external" href="https://blueprints.launchpad.net/nova/+spec/guru-meditation-report"&gt;https://blueprints.launchpad.net/nova/+spec/guru-meditation-report&lt;/a&gt;
[3] blog about nova guru reports: &lt;a class="reference external" href="https://www.berrange.com/posts/2015/02/19/nova-and-its-use-of-olso-incubator-guru-meditation-reports/"&gt;https://www.berrange.com/posts/2015/02/19/nova-and-its-use-of-olso-incubator-guru-meditation-reports/&lt;/a&gt;
[4] oslo.reports repo: &lt;a class="reference external" href="https://github.com/directxman12/oslo.reports"&gt;https://github.com/directxman12/oslo.reports&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 13 May 2015 00:00:00 </pubDate></item><item><title>Support actions for remote stack</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/support-actions-for-remote-stack.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/support-actions-for-remote-stack"&gt;https://blueprints.launchpad.net/heat/+spec/support-actions-for-remote-stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This Blueprint will support actions such as snapshot, restore, check,
cancel-update, abandon and so on for OS::Heat::Stack resource.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We support to manager OpenStack resources across multiple regions
after the Blueprint
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/multi-region-support"&gt;https://blueprints.launchpad.net/heat/+spec/multi-region-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But now we don’t support some actions such as snapshot/restore
for remote stacks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The changes will support some actions such as snapshot, restore, check,
cancel-update, abandon and so on for remote stack(OS::Heat::Stack 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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 snapshot and restore for remote stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support cancel-update for remote stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support check for remote stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support abandon for remote stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add related tests for changes.&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;
</description><pubDate>Tue, 12 May 2015 00:00:00 </pubDate></item><item><title>Uniform Resource Signals</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/uniform-resource-signals.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/uniform-resource-signals"&gt;https://blueprints.launchpad.net/heat/+spec/uniform-resource-signals&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec covers the implementation of a uniform signaling framework for
heat resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The standard way to signal a resource is to do it through a request to
heat-api. This works well for user generated signals, but it is often the case
that signals are not generated directly by the user, but instead are triggered
by a resource or a service when certain conditions are met. The difficulty in
triggering these internal signals is that the user credentials are not
available, so heat resources implement a variety of mechanisms to make signals
work in this context.&lt;/p&gt;
&lt;p&gt;For example, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Heat::ScalingPolicy&lt;/span&gt;&lt;/code&gt; resource exposes a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;alarm_url&lt;/span&gt;&lt;/code&gt;
attribute that is a EC2 signed URL, so the heat-api-cfn compatibility service
must be available for these signals to work. The
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OS::Heat::WaitConditionHandle&lt;/span&gt;&lt;/code&gt; resource, on the other side, exposes a proper
endpoint to heat-api and a token to authenticate against it, but that only
allows signals to be sent before the token expires. Unfortunately there is no
way to renew the token, so these resources cannot be used for long tasks. Other
heat resources use swift temp URLs as signals, and yet some others expose a
more traditional set of heat-owned keystone credentials that can be used to
obtain a token to authenticate against heat-api.&lt;/p&gt;
&lt;p&gt;Out of all these authentication methods, the only one that is implemented in
a base class accessible to all resources is EC2 signed URLs, the ones that are
based on a heat-api-cfn endpoint. The others are implemented as “one-offs” by
individual resources, making them hard to implement across resources without
code duplication.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The heat-engine service includes a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt; base class, from which
resources that can be signaled can inherit. To make the different types of
signals available to all resources, their implementations will be moved to this
class, which already contains the support for EC2 signed URLs.&lt;/p&gt;
&lt;p&gt;With support for using all the different types of signals implemented in
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt;, resources will be able to offer different choices of
signals, without having to deal with the particulars of each implementation.&lt;/p&gt;
&lt;p&gt;Resources will have the option to expose a single signal type, or else
implement a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;signal_transport&lt;/span&gt;&lt;/code&gt; property that gives the operator the option
to select the signal type.&lt;/p&gt;
&lt;p&gt;The credentials necessary to trigger a signal will be exposed in the resource
as an attribute called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;signal&lt;/span&gt;&lt;/code&gt;, of type map. The items included in the map
will depend on the selected signal type.&lt;/p&gt;
&lt;p&gt;The following signal types will be supported:&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;CFN_SIGNAL&lt;/span&gt;&lt;/code&gt;: The currently available EC2 signed URL signals. The signals
are triggered by sending a request to a URL. The request method and the URL
are given in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;signal&lt;/span&gt;&lt;/code&gt; attribute. The URL is based on the heat-api-cfn
service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TEMP_URL_SIGNAL&lt;/span&gt;&lt;/code&gt;: Signals based on a swift temp URL. The signals are
triggered by sending a request to a URL. The request method and the URL are
given in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;signal&lt;/span&gt;&lt;/code&gt; attribute. The URL is based on the swift service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;HEAT_SIGNAL&lt;/span&gt;&lt;/code&gt;: Signals based on the standard heat-api signal endpoint. The
process to trigger this signal involves requesting a keystone token, then
sending the signal request to heat-api with this token. The keystone
credentials necessary to obtain the token are given in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;signal&lt;/span&gt;&lt;/code&gt;
attribute. Note that these credentials are not the user’s, but those of a
temporary user created by heat.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Implement a webhook solution similar to EC2 signed URLs based on a heat-api
endpoint. This is a less flexible approach, and it has the drawback that the
authentication tokens are embedded in URLs, which are typically written to
logfiles. The nice thing about the proposed solution is that nothing prevents
a webhook signal to be added to the list of signal options in the future.&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;miguelgrinberg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;Refactor EC2 signed URL support in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt; class to allow other
signal types to be defined.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement heat-api signals in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt; class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement swift temp URL signals in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt; class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for all the signal types in wait conditions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for all the signal types in the scaling policy resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Base signals in SoftwareDeployment on the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SignalResponder&lt;/span&gt;&lt;/code&gt; class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deprecate current signals in wait condition and scaling policy resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deprecate the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_deployment_signal_transport&lt;/span&gt;&lt;/code&gt; configuration item and
replace it with one that is generic for all resources, such as
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_signal_transport&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation for the various affected resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit tests for the various affected resources.&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;
</description><pubDate>Tue, 05 May 2015 00:00:00 </pubDate></item><item><title>Python34 Support</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-python34-support.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-python34-support"&gt;https://blueprints.launchpad.net/heat/+spec/heat-python34-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec aims to bring Python 3.4 support to Heat.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat isn’t compatible with Python3.x. The blocker for Heat to migrate
was eventlet and now that eventlet fully supports python3, it is possible
for us to run Heat unit tests in a Python 3.4 environment. Once
all the dependencies of Heat are all functionally Python3 compatible, we
should be able to run integrationtests against Heat in a devstack environment.&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 step towards Python 3.4 compatibility for Heat would be to
get the unit tests running successfully in a py34 environment. We need
to add a new py34 environment in tox for this and start testing individual
test files. To avoid regressing on old test files, we should add a separate
file which will consist of all the test files that have already been
verified in a Python3 environment.&lt;/p&gt;
&lt;p&gt;All of these changes are not supposed to break existing unit tests nor
change the functionality in any way. The existing gate tests should take
care of this.&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&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;sirushtim&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1, could stretch to liberty-2 depending on how many
incompatibilities exist while running tests.&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;Use 2to6 partially to automatically fix some incompatibilities and satisfy
flake8.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a tox py34 env that will run off a meta-testfile which will consist
of test file names that have already been verified to work with py34. This
env will also use a different requirements file since there are two
dependencies qpid-python and MySQL-python which aren’t currently Python3
compatible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a voting python34-partial gate job that will run the above env.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Migrate all the unit tests to be compatible with Python 3.4 either one-by-one
or migrate tests in alphabetical order, whichever is reasonably sized and
easier to review. This also means we will fix the modules/files that each
test case imports to test and make them python34 compatible.
While migrating the tests, the strategy with mox is to use mox3 instead of
converting them to mock as much as possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once migration is complete for all the tests, delete the meta-testfile and
rename the gate job to gate-heat-python34.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove dependencies on qpid-python and MySQL-python and merge
requirements.txt for python-2.7 and python-3.4.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once dependencies of Heat are functionally Python 3.4 compatible, create a
DevStack gate job which will run the Python 3.4 version of Heat.&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;Current dependencies of Heat that are/were not compatible with Python 3.4:&lt;/p&gt;
&lt;p&gt;requirements.txt
- qpid-python: Used in install.sh. Can be removed.
- PasteDeploy: Needs to be functionally tested. The tests pass on Python 3.4
and the classifiers were just added.[1]
- oslo.messaging: Some of the drivers/executors don’t work at the moment
but are being worked on by Victor Stinner.
- oslo.db: MySQL-python dialect isn’t compatible with Python 3.4. There’s a
Python 3.4 port for MySQL-python however.
- sqlalchemy-migrate: There’s PY34 tests running for every patch of
sqlalchemy-migrate and the classifiers will be added for it.[2]&lt;/p&gt;
&lt;p&gt;test-requirements.txt
- MySQL-python: ditto - oslo.db^. Can be removed.
- mox: needs to be replaced by mox3 until we move to mock completely.&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://bitbucket.org/ianb/pastedeploy/commits/f30a7d518c6a79fcddfbe3f622337f81e41cb6a5"&gt;https://bitbucket.org/ianb/pastedeploy/commits/f30a7d518c6a79fcddfbe3f622337f81e41cb6a5&lt;/a&gt;
[2] &lt;a class="reference external" href="https://review.openstack.org/#/c/174738/"&gt;https://review.openstack.org/#/c/174738/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 20 Apr 2015 00:00:00 </pubDate></item><item><title>Enhance constraints for properties</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/enhance-neutron-constraints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/enhance-property-constraints"&gt;https://blueprints.launchpad.net/heat/+spec/enhance-property-constraints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We need more constraints for neutron properties so that we can validate them
before stack creation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Since we have many type of properties, some of them have custom constraints,
e.g. nova.flavor, glance.image etc. But still some of them have some certain
format as input, e.g. IP address, MAC address, network cidr, protocol etc.
It’s better to check input format before passing them to CLI or stack
creation. It’s helpful for users, so that they can get error message during
validation instead of stack create/update failed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add custom constraints for IP address, mac address, network cidr.
For IP address constraint, it’s going to be like this:&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;constraints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ip_addr'&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;For mac address constraint, it’s going to be like this:&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;constraints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mac_addr'&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;For CIDR constraint, it’s going to be like this:&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;constraints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'net_cidr'&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;We can apply these constraints to neutron properties or
template parameters.&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&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;Ethan Lynn&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-2&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add IPv4/IPv6 address format constraint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add mac address format constraint&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Add network cidr format constraint&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Wed, 15 Apr 2015 00:00:00 </pubDate></item><item><title>Autoscaling Group Rolling Update Hooks</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/autoscaling-batch-hooks.html</link><description>

&lt;p&gt;Hooks are included in Kilo, but don’t address a helpful use for hooks.
Currently, there are pre-create and pre-update hooks, but this would add a
special hook to OS::Heat::AutoScalingGroup to set a hook before each batch in a
rolling update.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Working with TripleO it’s often desirable to pause to check that an update is
doing what you want (which is why hooks exist at all), and the “pause_time”
provided by the rolling_updates policy can be used for a similar purpose.&lt;/p&gt;
&lt;p&gt;The problem is that you may not be able to sufficiently test the result of a
rolling update batch within the pause_time set, but you don’t have a way to
signal to heat to add more time. Or the pause_time may be excessively long,
making the update time too slow.&lt;/p&gt;
&lt;p&gt;Being able to set a breakpoint between batches is a much better solution, so
the operator can take an arbitrarily long (up to stack timeout) or short time
to confirm the upgrade went as planned.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To make debugging and verifying rolling updates easier, I propose adding a
‘batch_hook’ parameter to rolling_updates like 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="n"&gt;my_asg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"OS::Heat::AutoScalingGroup"&lt;/span&gt;
  &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;desired_capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;rolling_updates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;batch_hook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;
      &lt;span class="n"&gt;min_in_service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
      &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The batch_hook option and pause_time will be mutually exclusive, since it
doesn’t make much sense to have both a set pause time &lt;em&gt;and&lt;/em&gt; hooks between
batches.&lt;/p&gt;
&lt;p&gt;This will be confined to AutoScalingGroup, won’t break any existing templates,
and won’t affect other grouped resources.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The name “batch_hook” seems descriptive enough for me, but another option
for the parameter name would be “pre_batch_hook” to denote that the hook is
set before each batch (not after).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another alternative would be to add a hook type that would be set by in the
environment, not in the rolling_update policy. I think localizing this to
the AutoScalingGroup scaling policy is a better choice and use stack updates
to toggle the hooks for each group.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;sb~p (Ryan Brown)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;liberty-1&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;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 08 Apr 2015 00:00:00 </pubDate></item><item><title>Cinder volume encryption support</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/cinder-volume-encryption-support.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/cinder-volume-encryption"&gt;https://blueprints.launchpad.net/heat/+spec/cinder-volume-encryption&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Provides support for encrypted cinder volume creation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Cinder provide encrypted volume creation by using encrypted volume type
as described in below wiki page:
&lt;a class="reference external" href="http://docs.openstack.org/juno/config-reference/content/section_volume-encryption.html"&gt;http://docs.openstack.org/juno/config-reference/content/section_volume-encryption.html&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;Add new contrib heat resource plugin for creating the encrypted volume type
OS::Cinder::EncryptedVolumeType with following properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;provider (required)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: The class that provides encryption support. For example,
nova.volume.encryptors.luks.LuksEncryptor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cipher (optional)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: The encryption algorithm or mode. For example,
aes-xts-plain64&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;key_size (optional)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: Size of encryption key, in bits. For example, 128 or
256.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: integer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;control_location (optional)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;default: front-end&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowed-values: front-end, back-end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description: Notional service where encryption is performed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type (required)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;description: Name or id of volume type (OS::Cinder::VolumeType)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type: string&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This resource needs following actions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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 new contrib resource plugin as described in the solution section&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add test cases for new resource plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required functional test cases to validate the resource.&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Scale-out and pid support for Manage Service listing</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-manage-service-list-scale-out.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-manage-service-list-scale-out"&gt;https://blueprints.launchpad.net/heat/+spec/heat-manage-service-list-scale-out&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds pagination, sorting and filtering capability to ‘Manage service’
listing feature. In addition, each engine will be reported with pid.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In a scale out environment, cloud provider start to run many heat-engines
to serve the huge requests at the given point in time. Once many engines are
started to run, ‘Manage service’ would help cloud provider to find out the
currently running heat-engines and their status and they would expect to
retrieve these engines details with pagination and want to search them for a
given host on which engines are running, based on the status of them, etc.
These functionalities are missing in the current release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Pagination :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add following parameters in REST API and heat CLI for enabling pagination
for listing heat-engines as part of ‘Manage Service’ feature:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;marker: Starting heat-engine service id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;limit: Number of records from starting index (default=20)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;with_count: If True (default), then provide following counts in
response:
- count: Total number of heat-engines like defined in
&lt;a class="reference external" href="https://github.com/openstack/api-wg/blob/master/guidelines/counting.rst"&gt;https://github.com/openstack/api-wg/blob/master/guidelines/counting.rst&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Sorting :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add following parameters in REST API and heat CLI for sorting heat-engine
services in a given heat deployment:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sort: List of service attributes in given priority sequence.
- Allowed attributes : created_at, updated_at, status, hostname
- Default key is created_at
- Default sorting direction is desc for created_at and updated_at and
for other allowed attributes, it will be asc.
- sort key value format to be aligned with API-WG
&lt;a class="reference external" href="http://git.openstack.org/cgit/openstack/api-wg/tree/guidelines/pagination_filter_sort.rst"&gt;http://git.openstack.org/cgit/openstack/api-wg/tree/guidelines/pagination_filter_sort.rst&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Filtering :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add following parameters in REST API and heat CLI for filtering heat-engine
services:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;hostname: List of heat-engines hostname&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status: List of heat-engines service status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;To support NOT condition, each of the list entry could be in the form of
‘[not:]entry’ like ‘not:FAILED’&lt;/p&gt;
&lt;p&gt;Affected Service REST API:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/v1/​{tenant_id}​/services?&amp;lt;above&lt;/span&gt; &lt;span class="pre"&gt;mentioned&lt;/span&gt; &lt;span class="pre"&gt;parameters&lt;/span&gt; &lt;span class="pre"&gt;as&lt;/span&gt; &lt;span class="pre"&gt;http&lt;/span&gt; &lt;span class="pre"&gt;query&lt;/span&gt;
&lt;span class="pre"&gt;parameters&amp;gt;&lt;/span&gt;&lt;/code&gt;
Here, to provide the filtering parameters, ‘filter’ query parameter will be
used with it’s value similarly to –filters option used in CLI.&lt;/p&gt;
&lt;p&gt;Affected Heat CLI:
(only shown the new parameters here)
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt; &lt;span class="pre"&gt;service-list&lt;/span&gt; &lt;span class="pre"&gt;[-f&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;KEY1=VALUE1;KEY2=VALUE2...&amp;gt;]&lt;/span&gt;
&lt;span class="pre"&gt;[-l&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;LIMIT&amp;gt;]&lt;/span&gt; &lt;span class="pre"&gt;[-m&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;ID&amp;gt;]&lt;/span&gt; &lt;span class="pre"&gt;[-s&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;]&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Optional arguments:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-f &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;, –filters &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;
Filter parameters to apply on returned heat-engine services. This
can be specified multiple times, or once with
parameters separated by a semicolon.&lt;/p&gt;
&lt;p&gt;-l &amp;lt;LIMIT&amp;gt;, –limit &amp;lt;LIMIT&amp;gt;
Limit the number of heat-engine services returned.
-m &amp;lt;ID&amp;gt;, –marker &amp;lt;ID&amp;gt;
Only return heat-engines that appear after the given ID.&lt;/p&gt;
&lt;p&gt;-s &amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;, –sort &amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;
Sorting keys in the given precedence and sorting directions.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;heat-engine PID:
In addition, When multiple heat-engines are running on a given host, it is
difficult to find out the process-id for a given heat-engine. This is
required during trouble shooting issues. So new field called ‘pid’ to be
added to Service model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat-manage service list:
Add the similar enhancement done in CLI, (this is required for admin, when
all heat-engines are down and heat service-list became in-capable.)&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;DB model changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Update Service table with new column named ‘pid’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DB API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;‘service_get_all’ to be updated to handle with pagination parameters and
filtering parameters&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Object changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add pid and corresponding changes for db api changes in the Service object
methods&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RPC API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enhance ‘list_services’ to handle pagination and filtering capabilities&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat engine service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enhance the method ‘service_manage_report’ in EngineService to update the
pid of current engine.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REST API changes:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ServiceController ‘index’ to handle pagination and filtering
capabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat CLI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;‘heat service-list’ to handle pagination and filtering capabilities&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat-manage command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add the similar enhancement done in CLI.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;update documentation for REST API (api-sites), heat CLI (python-heatclient)
and heat-manage tool&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Enhance Manage Service with service-stack</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-manage-service-stack.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-manage-service-stack"&gt;https://blueprints.launchpad.net/heat/+spec/heat-manage-service-stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Retrieves IN_PROGRESS stacks being handled in the given heat-engine and
vice-versa.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In convergence mode, a given stack is being handled by one or more heat-engines
and vice-versa. Later scenario is applicable for non-convergence mode as well.
This will help operators to track the IN_PROGRESS stacks for the given
heat-engine or vice-versa. And also useful for operator during
troubleshooting issues.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To list the stacks for the given heat-engine:&lt;/p&gt;
&lt;p&gt;Update stack-list command filter argument with additional parameter engine-id
as follows:&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;stack-list&lt;/span&gt; &lt;span class="pre"&gt;-f&lt;/span&gt; &lt;span class="pre"&gt;engine-id&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;engine-id&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here, stack-list already supports to provide filter parameters multiple times.
So, user can filter stacks for multiple engines as well.&lt;/p&gt;
&lt;p&gt;Corresponding REST API would be:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;/v1/​{tenant_id}​/stacks?filter=engine_id:&amp;lt;engine-id&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here, multiple engine-id could be provided with comma separated.&lt;/p&gt;
&lt;p&gt;To list the heat-engines handing the given stack:&lt;/p&gt;
&lt;p&gt;Update heat CLI with following additional parameters:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;service-list&lt;/span&gt; &lt;span class="pre"&gt;--stack-id&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;stack-id&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;stack-id - to report the list of heat-engines handling the given stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Corresponding REST API would be:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;/v1/​{tenant_id}​/services?filter=stack_id:&amp;lt;stack-id&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;/v1/&amp;lt;tenant-id&amp;gt;/services&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Here, multiple stack-id could be provided with comma separated.&lt;/p&gt;
&lt;p&gt;NOTE: This blueprint can be extented to provide IN_PROGRESS resources in a
given heat-engine.&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;DB API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add new API ‘service_get_stacks_by’ with two parameters as described in the
solution section.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Object changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add corresponding changes for db api changes in the Service object methods&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RPC API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add corresponding RPC API for the new DB API ‘service_get_stacks_by’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REST API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Update ServiceController and StackController to handle the new REST APIs
as defined in the solution section.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat CLI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Updated required CLI as defined in the solution section.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat-manage command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add the similar enhancement done in CLI, (this is required by admin, in
case all heat-engines are down)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;update documentation for REST API, heat CLI and heat-manage tool&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update CLI and API documents to mention that engine-id parameter is
only for admin users.&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Search Resource Type</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-resource-type-search.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-resource-type-search"&gt;https://blueprints.launchpad.net/heat/+spec/heat-resource-type-search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enable filtering capabilities for resource types loaded in the given heat
deployment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Search and get resource type based on
* resource type,
* supported since,
* support status&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add Following parameters in REST API and heat CLI for filtering heat
resource type:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;resource_type: List of glob matching expression (like &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;supported_since: Heat version, since resource type is supported.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;supported_status: List of status. It could be one of UNKNOWN,
SUPPORTED, PROTOTYPE, DEPRECATED, UNSUPPORTED&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;To support NOT condition, each of the list entry could be in the form of
‘[not:]entry’ like ‘not:DEPRECATED’&lt;/p&gt;
&lt;p&gt;Affected Service REST API:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/v1/​{tenant_id}​/resource_types?filter=&amp;lt;query&lt;/span&gt; &lt;span class="pre"&gt;parameters&amp;gt;&lt;/span&gt;&lt;/code&gt;
Here, ‘filter’ query parameter will be used with it’s value similarly to
–filters option used in CLI.&lt;/p&gt;
&lt;p&gt;Affected Heat CLI:
(only shown the new parameters here)
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;`heat&lt;/span&gt; &lt;span class="pre"&gt;resource-type-list&lt;/span&gt; &lt;span class="pre"&gt;[-f&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;KEY1=VALUE1;KEY2=VALUE2...&amp;gt;]&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Optional arguments:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-f &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;, –filters &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;
Filter parameters to apply on returned resource type. This
can be specified multiple times, or once with
parameters separated by a semicolon.&lt;/p&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;update Resource Type REST API controller with additional filtering ability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update the heat CLI as described in the solution section&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required additional test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add documentation for CLI, REST API updates&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Stack resource filtering, sorting and pagination</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-stack-resource-search.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-stack-resource-search"&gt;https://blueprints.launchpad.net/heat/+spec/heat-stack-resource-search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enhance the filtering, sorting and filtering ability for resources in a given
stack.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In larger stack, heat does allow 1000 (max_resources_per_stack) by default
which is configurable, and it would help users to get the resources in a stack
if its provided with pagination, sorting and filtering abilities based on
certain resource attributes&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Pagination :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add Following parameters in REST API and heat CLI for enabling pagination
for given stack resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;marker: Starting Resource id (default=0)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;limit: Number of records from starting index (default=20)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;with_count: If True (default), then provide following counts in
response:
- count: Total number of resources in a given stack like defined in
&lt;a class="reference external" href="https://github.com/openstack/api-wg/blob/master/guidelines/counting.rst"&gt;https://github.com/openstack/api-wg/blob/master/guidelines/counting.rst&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Sorting :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add Following parameters in REST API and heat CLI for sorting resources
in a given stack:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sort: List of resource attributes in given priority sequence.
- Allowed attributes : created_at, updated_at, status, name
- Default key is created_at
- Default sorting direction is desc for created_at,
updated_at and asc for status, name.
- sort key value format to be aligned with API-WG
&lt;a class="reference external" href="http://git.openstack.org/cgit/openstack/api-wg/tree/guidelines/pagination_filter_sort.rst"&gt;http://git.openstack.org/cgit/openstack/api-wg/tree/guidelines/pagination_filter_sort.rst&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Filtering :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;dl&gt;
&lt;dt&gt;Add Following parameters in REST API and heat CLI for filtering resources in&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;a given stack:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;type: List of valid Resource type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status: List of valid resource statuses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name: Resource name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;action: List of valid resource actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uuid: List of resource uuid&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;physical_resource_id: List of physical resource id&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To support NOT condition, each of the list entry could be in the form of
‘[not:]entry’ like ‘not:FAILED’&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Affected Resource REST API:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/v1/​{tenant_id}​/stacks/​{stack_name}​/​{stack_id}​/resources&lt;/span&gt;
&lt;span class="pre"&gt;?&amp;lt;query&lt;/span&gt; &lt;span class="pre"&gt;parameters&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here, to provide the filtering parameters, ‘filter’ query parameter will be
used with it’s value similarly to –filters option used in CLI.&lt;/p&gt;
&lt;p&gt;Affected Heat CLI:
(only shown the new parameters here)
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;heat&lt;/span&gt; &lt;span class="pre"&gt;resource-list&lt;/span&gt; &lt;span class="pre"&gt;[-f&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;KEY1=VALUE1;KEY2=VALUE2...&amp;gt;]&lt;/span&gt;
&lt;span class="pre"&gt;[-l&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;LIMIT&amp;gt;]&lt;/span&gt; &lt;span class="pre"&gt;[-m&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;ID&amp;gt;]&lt;/span&gt; &lt;span class="pre"&gt;[-s&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;]&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Optional arguments:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-f &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;, –filters &amp;lt;KEY1=VALUE1;KEY2=VALUE2…&amp;gt;
Filter parameters to apply on returned resources. This
can be specified multiple times, or once with
parameters separated by a semicolon.&lt;/p&gt;
&lt;p&gt;-l &amp;lt;LIMIT&amp;gt;, –limit &amp;lt;LIMIT&amp;gt;
Limit the number of resources returned.
-m &amp;lt;ID&amp;gt;, –marker &amp;lt;ID&amp;gt;
Only return resources that appear after the given resource ID.&lt;/p&gt;
&lt;p&gt;-s &amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;, –sort &amp;lt;KEY1:asc,KEY2,KEY3&amp;gt;
Sorting keys in the given precedence and sorting directions.&lt;/p&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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;Update Resource REST API controller with additional capabilities for
pagination, sorting and filtering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the heat CLI as described in the solution section&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required RPC and DB api with required micro version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required additional test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add documentation for CLI (python-heatclient), REST API (api-sites)&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Keystone Resource plugin for Service and Endpoint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/keystone-resource-service-endpoint.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/keystone-resource-service-endpoint"&gt;https://blueprints.launchpad.net/heat/+spec/keystone-resource-service-endpoint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds resource plugin for Keystone Service and Endpoint.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In Heat based cloud deployment tool such as TripleO, vendors are automating
the creation of Keystone Region, Service and Endpoint by some-means such as
shell scripting. This is being repeated across multiple vendors and it could
automated by heat template if heat provides Resource plugin for Keystone
Region, Service and endpoint. So this blueprint is created to provide Heat
resource plugin for Keystone Service and Endpoint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add following Resources under contirb/heat_keystone by using keystone v3 API.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Service&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type (required)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Endpoint&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;region (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;service_id (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interface: ‘public’, ‘admin’ or ‘internal’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;url (required)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liberty-1&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 contrib resources for those resources defined in solution section&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add constrains for service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add sample templates in heat-template project&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;
</description><pubDate>Sun, 29 Mar 2015 00:00:00 </pubDate></item><item><title>Implement Manila resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/manila-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/add-manila-resources"&gt;https://blueprints.launchpad.net/heat/+spec/add-manila-resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add support for Manila resources in Heat.&lt;/p&gt;
&lt;p&gt;Manila provides the management of shared or distributed filesystems
(e.g. NFS, CIFS). Using Manila we can create following resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Share - unit of storage with a protocol, a size, and an access list;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Share type - administrator-defined “type of service”;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Share network - tenant-defined object that informs Manila about the
security and network configuration for a group of shares;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security service - set of options that defines a security domain for
a particular shared filesystem protocol.&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;Heat doesn’t support Manila resources currently.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add Manila client plugin and implement following resource types:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Manila::Share&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;share_protocol (required, one of: NFS, CIFS, GlusterFS, HDFS)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;size (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;snapshot (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;share_network (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;share_type (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;is_public (optional, defaults to False)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;access_rules (list, optional)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;access_to (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;access_type (optional, one of: ip, domain)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;access_level (optional, one of: ro, rw)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;availability_zone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;host&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;export_locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;share_server_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;created_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;OS::Manila::ShareType&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name (required)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;driver_handles_share_servers (required, one of true/1, false/0)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;is_public (optional, defaults to True)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;OS::Manila::ShareNetwork&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;neutron_network (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron_subnet (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova_network (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security_services (list, optional)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attributes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;segmentation_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cidr&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ip_version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;network_type&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="4"&gt;
&lt;li&gt;&lt;p&gt;OS::Manila::SecurityService&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Properties:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;type (required, one of: ldap, kerberos, active_directory)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dns (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;server (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;domain (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;password (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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&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;tlashchova&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Assisted by:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ochuprykov
kkushaev&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 Manila client plugin for Heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Manila share resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Manila share network resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Manila share type resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Manila security 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;
</description><pubDate>Thu, 26 Mar 2015 00:00:00 </pubDate></item><item><title>Cache r/o API requests to OS components during constraint validation</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/constraint-validation-cache.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/constraint-validation-cache"&gt;https://blueprints.launchpad.net/heat/+spec/constraint-validation-cache&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Heat does a lot of request to the other clients in OpenStack. These
requests leads to some overhead when we are trying to deploy a lot of instances
at the same moment. One of these requests Heat is doing during validation of
property constraints that checks external resources existence (image, flavor
or something else). In order to reduce that overhead the some kind of
validation cache has proposed in the current spec.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The detailed description of the problem is described in the following use case:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;User prepares a template with N stacks that use the same resource (image,
flavor, keypair, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User requests Heat to create the stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During custom constraint validation for resources Heat does the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Find appropriate class that validates custom constraint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request the other clients about constraint (check that the volume,
server, flavor, etc exists)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If request was successful then pass validation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This approach leads to some overhead requests because we need to request the
same info (existence of image, flavor, etc) several times. In addition, current
realization doubles this overhead because we are checking property constraints
twice (during resource creation and stack validation).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The desired use case is the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple" start="0"&gt;
&lt;li&gt;&lt;p&gt;Heat initializes a cache back-end and cache regions for each client plugin
with using dogpile.cache (cache configuration is defined in heat.conf).
Heat also registers generation functions for them (see
&lt;a class="reference external" href="http://dogpilecache.readthedocs.org/en/latest/usage.html"&gt;http://dogpilecache.readthedocs.org/en/latest/usage.html&lt;/a&gt; for more info)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User prepares a template with N stacks that use the same resource (image,
flavor, keypair, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User requests Heat to create the stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During custom constraint validation for resource Heat does the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Find appropriate class that validates custom constraint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request client plugin about the data from another OS component&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if caching is enabled then
check cache region for client plugin and
return result of API request to client with the same resource name
(volume, server, flavor, etc) and the same context.
If no results have found in cache then cache region automatically
requests the new value using generation function (see note below)
else
request the new value with using client_plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pass validation if no exceptions were raised during request&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If exception has been raised then delete the value from cache because
we need to request it every time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Note: if cache size exceeds size option in heat then we need to
flush the oldest values. This logic should be managed by cache back-end.&lt;/p&gt;
&lt;p&gt;To support the case above the following steps should be executed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The cache configuration options should be supported in heat.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cache back-end should be configured using the options in heat.conf.
Please note that using dogpile we can use several types of cache back-ends
(in-memory, memcached, file system, DB, self-written etc). Each back-end
requires specific input arguments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cache region should be configured for each client. In addition
time-to-live value and cache size options should be defined for clients
using heat.conf options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The sub-classes of heat.engine.clients.ClientPlugin should request cache
regions about new values if caching has enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The requests to client plugin should have an attribute(use_cache=False)
that allows to define should we use caching or not. It allows to use
caching for constraint validation only and avoid unintentional using of
caches.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement cache and integrate it into BaseCustomConstraint. In this case
caching will be used for custom constraint validation only but this is not
the best solution because of 2 reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Cache cannot be used in future for other purposes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ClientPlugin is more appropriate place for caching in conceptual terms.
There is no strict relationships in terms of OOP between Constraint
and cache.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement light-weight cache in client plugins. This solution was declined
during review. Please see the details below:
“client plugins are instantiated on the first access from a resource since
the Stack object is created. Since we now have decouple-nested this is
going to be of less value as every nested stack is going to recreate these
clients. And in convergence all resources will recreate the client object
as the resource actions will be rpc’d to be worked on. So given this
wouldn’t something like memcached be better?”&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;kkushaev&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 cache back-end - leverage dogpile back-end that tracks
timeouts and results of previous requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement initialization of cache regions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate caching into subtypes of ClientPlugin that make requests to other
clients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prepare tests for each step&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;
</description><pubDate>Mon, 23 Mar 2015 00:00:00 </pubDate></item><item><title>Support Cinder Custom Constraints</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/cinder-custom-constraints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/cinder-custom-constraints"&gt;https://blueprints.launchpad.net/heat/+spec/cinder-custom-constraints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Support Cinder Custom Constraints, and apply them to related resources.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Many resources have property Volume/Snapshot which related with cinder
volume/snapshot, but we haven’t support corresponding custom constraints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add cinder volume custom constraint, and to apply it for resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add cinder snapshot custom constraint, and to apply it for resources.&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add/Apply cinder volume custom constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add/Apply cinder snapshot custom constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest tests for all the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Tue, 03 Mar 2015 00:00:00 </pubDate></item><item><title>Lightweight Stack loading for convergence</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-lightweight-stack.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/heat/+spec/convergence-lightweight-stack"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-lightweight-stack&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When we load the resources for a stack from the database, we load all of them
at once. We also assume that resource names are unique within a stack (i.e.
there is only one version of each resource). In convergence there will be
multiple versions of each resource coexisting in the same stack, and we’ll want
to load only the one we’re going to perform operations on at any given time.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Allow the stack to provide cached values for all of the &lt;cite&gt;get_resource&lt;/cite&gt; and
&lt;cite&gt;get_attr&lt;/cite&gt; references in the template when they are resolved. Don’t load the
whole list of resources when this cached data is available.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Continue to load every resource from the database whenever we need resource ID
or attribute data.&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;sirushtim&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Substitute reading from a cache for loading resources when resolving template
functions&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;The cached values will be obtained by the code for
&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-push-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-push-data&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Internal oslo.messaging bus for convergence</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-message-bus.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/heat/+spec/convergence-message-bus"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-message-bus&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We need a message bus for the internal worker API of convergence.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create a new worker service within heat-engine that is dedicated to handling
internal messages to the ‘worker’ (a.k.a. ‘converger’) actor in convergence.
Messages on this bus will use the ‘cast’ rather than ‘call’ method to anycast
the message to an engine that will handle it asynchronously. We won’t wait for
or expect replies from these messages.&lt;/p&gt;
&lt;p&gt;The message types that will eventually be implemented on this bus are those
marked with the @asynchronous decorator in
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/converger.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/converger.py&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could have a separate heat-worker daemon, but there appears to be no point
in making life difficult for deployers as heat-engine can handle the same
tasks.&lt;/p&gt;
&lt;p&gt;We could mix this into the same service as the existing RPC API that is called
by heat-api, but this is messy because the two have entirely different uses.
There is already precedent for running another RPC service inside heat-engine,
although we can’t reuse that because it listens on a queue specific to the
engine id.&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;kanagaraj-manickam&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 new worker service in the engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a client API to make it easy to send messages to the worker 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;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Move Parameter data storage from Stack to RawTemplate</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-parameter-storage.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/heat/+spec/convergence-parameter-storage"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-parameter-storage&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The target state of a stack is not defined by a template alone, but by a
combination of a template and an environment (including input parameter
values). However, currently these are stored separately - there is a
RawTemplate database table for templates, but the environment is stored in the
Stack table.&lt;/p&gt;
&lt;p&gt;In order to allow the user to roll back to a previous state, we need to store
both the old template and the old environment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Move the storage of the environment from the &lt;cite&gt;parameters&lt;/cite&gt; column of the Stack
table to the RawTemplate table.  In this way, we can roll back to a previously
commanded state whenever its template is still available in the database.&lt;/p&gt;
&lt;p&gt;While we are at it, we should add an out-of-band indicator of whether the
parameters are encrypted, since we know that encrypting the parameters in the
database is something we will want to implement.&lt;/p&gt;
&lt;p&gt;We can also consider storing the user parameters and other parts of the
environment separately. The current design is a result of retrofitting the
environment where previously we only had parameters. We should probably store
the “files” section of the environment as a multipart-MIME document in a
separate column, rather than as a JSON dict as part of the environment, since
that is the format we want to allow in a future v2 API.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Instead of just storing multiple references to templates in the Stack table, we
could also include multiple versions of the environment (e.g. have a
&lt;cite&gt;previous_parameters&lt;/cite&gt; or &lt;cite&gt;previous_environment&lt;/cite&gt; row). This would save doing the
migration now, but it would be messier and more error-prone to implement
rollback in convergence.&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;ckmvishnu&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Database migration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change how environment data is loaded from the database&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;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Extract data from resources to push into dependencies</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-push-data.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/heat/+spec/convergence-push-data"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-push-data&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We currently assume that every resource in a stack is loaded in memory
concurrently, and we query it directly to determine its attribute values. This
‘pull’ system is inefficient in the convergence architechture compared to a
‘push’ system, since we hope to typically have only one resource loaded in
memory at a time.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Analyse the template to determine which attributes of a resource are needed
elsewhere. This is conceptually quite similar to the way we analyse the
template looking for dependencies, by recursively examining a snippet of
template and building up a list of dependent resources, except that instead of
only a list of resources we’ll need to include the attribute names being
referenced. In this way the code will be able to work with arbitrary template
format plugins, although it will probably require a change to the Function
plugin API. Return the result as a mapping from resource names to a list of
referenced attribute names.&lt;/p&gt;
&lt;p&gt;After a create or update event, we can use this list of attributes to query the
resource for all of the information that will be needed subsequently from it.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Load a resource from the database whenever we need to retrieve one of its
attributes.&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;skraynev&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Determine the list of attributes of a resource which are referenced in the
template&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;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Enable locking of Resources in DB</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-resource-locking.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/heat/+spec/convergence-resource-locking"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-locking&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently we enforce locking at the stack level, so only one operation can be
in progress at a time on a stack. This is not fine-grained enough, as it
prevents us from starting a new update while awaiting the result of a previous
one. Phase one of convergence is to remove this restriction by locking at the
level of individual resources.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Make rows in the Resource table lockable, by ensuring that state changes are
atomic. We’ll also need to store the ID of the engine that currently holds the
lock, so that we can use this to detect when an engine has died and clean up
appropriately.&lt;/p&gt;
&lt;p&gt;We’ll use the “UPDATE … WHERE …” form discussed in
&lt;a class="reference external" href="http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/"&gt;http://www.joinfu.com/2015/01/understanding-reservations-concurrency-locking-in-nova/&lt;/a&gt;
to ensure atomic updates.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The existing StackLock code does almost exactly what we want already, but the
downside is that it uses a separate table in the database to do so. Using that
rather than applying new semantics to the writes we are already doing would
make convergence even more database-intensive than it already is.&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;ishant-tyagi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Database migration to add the id of the engine holding the lock&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the way changes to the Resource table are written to guarantee
atomicity&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;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Implement Resource convergence create/update/delete</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-resource-operations.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-resource-operations"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-resource-operations&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We need to modify the operations (create/update/delete) of
heat.engine.resource.Resource to work in both the convergence architecture and
the legacy architecture.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create a lightweight wrapper in the worker that runs the appropriate operation
using a TaskRunner. Any code that is specific to the convergence architecture
and that shouldn’t be executed in the legacy architecture can hopefully also be
contained in this wrapper.&lt;/p&gt;
&lt;p&gt;To the extent that any changes to the create/update/delete operations
themselves are benign to the legacy architecture (for example, storing the
extra data needed by convergence in the Resource table), they should be
implemented as part of the existing operations.&lt;/p&gt;
&lt;p&gt;The prototype
&lt;a class="reference external" href="https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/resource.py"&gt;https://github.com/zaneb/heat-convergence-prototype/blob/resumable/converge/resource.py&lt;/a&gt;
should give a good indication of the types of changes that will be neccessary.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative would be to build separate create/update/delete operations for
convergence as part of the Resource class. We could do that if it proved
necessary, but it seems preferable to keep to a single code path as much as
possible.&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;unmesh-gurjar&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Make any necessary changes to the Resource.create/update/delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement TaskRunner wrapper and call it from the relevant workflow code&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-check-workflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 13 Feb 2015 00:00:00 </pubDate></item><item><title>Stack Tags</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/stack-tags.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-tags"&gt;https://blueprints.launchpad.net/heat/+spec/stack-tags&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This feature will allow attributing a set of simple string-based tags
to stacks and optionally the ability to hide stacks with certain tags
by default.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat should be usable by cloud providers for behind-the-scenes orchestration of
cloud infrastructure, without exposing the user to the resulting
automatically-created stacks.&lt;/p&gt;
&lt;p&gt;For example, creation of a Nova server might include, by default, creation and
configuration of a network, subnet, port, and security group.  The “server
create” function in the cloud portal would make a call to Heat instead of Nova.
When the user clicks the “server create” button in the cloud portal, Heat would
then orchestrate the Nova server creation along with calls to other services
and then wire it all up.&lt;/p&gt;
&lt;p&gt;Sahara already uses Heat for its internal orchestration, and currently when we
instantiate a OS::Sahara::Cluster resource in a template, the user also sees
the underlying stack created by Sahara.  It would be nice if operators of
Sahara service also could add such specific tags to their internally created
stacks to hide them from common user by default.  That also might concern Trove
when it moves to using Heat orchestration internally.&lt;/p&gt;
&lt;p&gt;As other services use heat behind the scenes, they would set specific tags to
such stacks (e.g. source:nova, source:sahara, etc) which, optionally, could be
configured not to be displayed by default, effectively hiding them from regular
users of the API.  Since Heat seems to be no longer a purely user-facing
orchestration service, it makes sense to use these tags as a means to prevent
cluttering of the user’s stacks and avoid confusion.&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 “tag” flag to the stack-create API, which, if given, will create the
stack with such tags.  Also add a configuration option that will allow
operators to hide specific tags from the default stack list.&lt;/p&gt;
&lt;p&gt;Add a “show_hidden” flag to the stack-list API, which, if passed, will
result in listing both hidden and non-hidden stacks.  By default, only
non-hidden stacks will be displayed in the stack-list output.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Using Nova plug-ins for orchestration (not the best tool for the job).&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;jasondunsmore&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 “stack_tag” table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “tags” parameter to stack-create (engine and API).  Note: Tag
names must not contain a comma, as specified in the spec:
&lt;a class="reference external" href="https://review.openstack.org/#/c/155620/"&gt;https://review.openstack.org/#/c/155620/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ability to update stack tags during stack-update (engine and
API).  It should be possible to remove all tags from a stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “show_hidden” parameter to stack-list in engine (engine and
API).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “tags” parameter to stack-list in engine (engine and API).
Passing a tag name will result in only stacks containing that tag
being shown.  If multiple tags are passed, they will be combined
using the AND boolean expression.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “tags-any” parameter to stack-list in engine (engine and API).
Passing a tag name will result in only stacks containing that tag
being shown.  If multiple tags are passed, they will be combined
using the OR boolean expression.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “not-tags” parameter to stack-list in engine (engine and API).
Passing a tag name will result in only stacks NOT containing that
tag being shown.  If multiple tags are passed, they will be combined
using the AND boolean expression.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a “not-tags-any” parameter to stack-list in engine (engine and
API).  Passing a tag name will result in only stacks NOT containing
that tag being shown.  If multiple tags are passed, they will be
combined using the OR boolean expression.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add an API to list tags, ie. “heat tag-list” (engine and API).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure tags show up in the “heat stack-show &amp;lt;stack&amp;gt;” output (engine
and API).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add docs for new API parameters to “api-site” project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests to ensure that other stack operations continue to
work as expected with hidden stacks, eg. stack-show, resource-list,
stack-list pagination…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Register a configuration parameter that contains a list of tags to
hide by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement changes to the DB/service/RPC to hide stacks according to
the configuration parameter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add “show_hidden” parameter to stack-list in python-heatclient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add “–tags”, “–tags-any”, “–not-tags”, and “–not-tags-any”
options to filter stack-list output by tag in python-heatclient.&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;
</description><pubDate>Wed, 11 Feb 2015 00:00:00 </pubDate></item><item><title>Improvements in deprecation process</title><link>https://specs.openstack.org/openstack/heat-specs/specs/liberty/deprecating-improvements.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/deprecating-improvements"&gt;https://blueprints.launchpad.net/heat/+spec/deprecating-improvements&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These changes should make deprecation process obvious and safe for users.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Current deprecation process contains some issues:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;there is no clear information for all deprecated properties and
attributes, when each one was deprecated and will be deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;there are no notes about how and when we plan to remove support for option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;undeletable code in property/attribute schemas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backward compatibility with old templates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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;Suggested changes should solve issues mentioned above:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Need to add new page in Heat documentation with detailed description of
deprecation process.
Add new page in Heat documentation to Developers Documentation section
named ‘Heat support status usage’ with description of using support status
for resources, properties and attributes:
- how long legacy option will be available
- what will happen, when deprecation period is over
- how to use support_status for properties, attributes and resources
- what will happen with deprecated resources
Also, add information about support_status parameter in Heat Resource
Plug-in Development Guide page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve SupportStatus.
Add to SupportStatus &lt;cite&gt;previous_status&lt;/cite&gt; option for displaying previous
status of object and it’s version:&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;support_status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SupportStatus&lt;/span&gt;&lt;span class="p"&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;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEPRECATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2015.2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;previous_status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SupportStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2014.1'&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;Also, add HIDDEN status for DEPRECATED objects, which become absolutely
obsolete. Objects with this status will be hidden from documentation and
resource-type-list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improvement in documentation status code.
Improve generating documentation for new SupportStatus option
&lt;cite&gt;previous_status&lt;/cite&gt;. Documentation must show full life cycle of resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Besides that, next features can be implemented:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Add option in attribute/property schema, which shows legacy names:&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;property_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;....&lt;/span&gt;
        &lt;span class="n"&gt;legacy_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;subnet_id&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;/li&gt;
&lt;li&gt;&lt;p&gt;Add migration mechanism, which allows to support two following cases:
- New stacks deployed from old templates continue to work during
the period the element is in the deprecated state.
- Old stacks are correctly interpreted by new code after the element
was deprecated.
- When deprecation period ends, templates should be updated, otherwise
Validation Error will be raised. Old created stacks will be available, but
can not be updated with old templates. For comfortable work will be
recommended to update old stacks with new templates.&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;Optionally we may add an API which updates old template and returns user new
updated template or information about which option should be changed.&lt;/p&gt;
&lt;p&gt;Note, that it doesn’t make sense if we start returning validation error on old
templates.&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;&amp;lt;prazumovsky&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Assisted by:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;skraynev&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&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 section in documentation about how we deprecate options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add status HIDDEN to SupportStatus and improve documentation generating.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add parameter previous_status and improve SupportStatuses for heat objects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add option “legacy_names” for property schema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create auto-upgrade mechanism for old 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;
</description><pubDate>Thu, 05 Feb 2015 00:00:00 </pubDate></item><item><title>Add a config option to enable Convergence</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/convergence-config-option.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-config-option"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-config-option&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The new convergence architecture is a major change to the code base. In order
to decouple landing the necessary changes from the release cycle while
maintaining stability for end users, we need to develop it alongside existing
code and tests and avoid breaking existing code until such time as convergence
can pass the functional test suite.&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 config option that allows the operator to enable the convergence code
path for new stacks. The option will initially be off by default. We will
enable it as soon as convergence has landed and is in a working state (passes
functional tests), provided that doing so does not create an undue level of
risk (i.e. if this happened to occur right before feature freeze, we would
likely delay changing the default until after the release).&lt;/p&gt;
&lt;p&gt;Also add a flag to the Stack table to indicate whether each stack should use
existing legacy code path or convergence code path. All pre-existing stacks
will continue using the legacy code path. New stacks will use the code path
selected by the operator via the config option.&lt;/p&gt;
&lt;p&gt;At some point in the future, we will create a tool that allows us to populate
existing legacy stacks with the additional data required to start using them
with the convergence code. Once we have such a migration tool we can deprecate
the legacy code path, and after an appropriate interval and once all of the
legacy ‘unit’ tests that require it have been converted to functional tests we
can remove that code path altogether.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;In addition to the config option, we could also allow the user to select on
each stack create whether to use the legacy or convergence code. This could
make funtional testing easier, as we wouldn’t need to change the configuration
to test the two parts. However, the downside is that it exposes to the user
what should be an implementation detail.&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;prazumovsky&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 config option&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;
</description><pubDate>Mon, 02 Feb 2015 00:00:00 </pubDate></item><item><title>Native Keystone Resources</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/keystone-resources.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/keystone-resources"&gt;https://blueprints.launchpad.net/heat/+spec/keystone-resources&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Some cloud operators would like to be able to use Heat templates to manage
users, projects and roles in Keystone. Currently we can only create users, and
only through an AWS IAM resource type.&lt;/p&gt;
&lt;p&gt;This was discussed on the mailing list in the thread beginning here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://lists.openstack.org/pipermail/openstack-dev/2015-January/055554.html"&gt;http://lists.openstack.org/pipermail/openstack-dev/2015-January/055554.html&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;Implement the following native resource types:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::User&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name())&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_project_id (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;email (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;domain (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;password (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enabled (default True)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;groups (list)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;roles (list)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;domain (optional - domain or project or both must be specified)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;project (optional - domain or project or both must be specified)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;role&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Group&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name())&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;domain (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;roles (list)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;domain (optional - domain or project or both must be specified)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;project (optional - domain or project or both must be specified)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;role&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Role&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name())&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OS::Keystone::Project&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name (optional - defaults to self.physical_resource_name())&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;domain (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enabled (default True)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since in the default policy.json configuration these APIs are available only to
administrative users, the plugin would be in the /contrib tree and not
installed by default.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Another possible data model would be to have a separate RoleAssignment resource
(or similar) to grant roles to users or groups, rather that having the roles
listed in the user or group resources. A similar thing could apply to the list
of users in a group, which could be implemented instead as a GroupMembership
resource.&lt;/p&gt;
&lt;p&gt;However, there are a couple of problems with that data model. The first is that
adding a user to a group or granting a role to a user/group does not create a
physical resource with its own UUID. This makes it difficult for Heat to manage
the resources.&lt;/p&gt;
&lt;p&gt;The second issue is that such an approach tends to create dependency problems
for users - for example in this model if another resource depends on a User,
then Heat may begin creating it before the User has been assigned a Role that
it may need to perform the operation. This is possibly less of an issue with
Keystone resources than it has proven with Neutron resources, but it is a known
anti-pattern in Heat data modelling.&lt;/p&gt;
&lt;p&gt;A similar issue occurs with Users and Groups - an alternative implementation
would be for the Group definition to contain a list of Users rather than for
the User definition to contain a list of Groups. The advantage of that is that
it more closely follows how the API is implemented, but this way was chosen
because it is more likely to automatically generate correct dependencies:
anything that depends on a User will always wait for all groups to be assigned.
Both approaches are likely to make some (different) subset of use cases
awkward, but the only solution would be a separate GroupMembership resources
type and that would suffer from all of the problems with a RoleAssignment
discussed above.&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;kanagaraj-manickam&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;User plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Project plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Group plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Role plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom constraint for keystone.project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom constraint for keystone.group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom constraint for keystone.role&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom constraint for keystone.domain&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;
</description><pubDate>Mon, 02 Feb 2015 00:00:00 </pubDate></item><item><title>Apply Neutron Custom Constraints</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/apply-neutron-custom-constraints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/apply-neutron-constraints"&gt;https://blueprints.launchpad.net/heat/+spec/apply-neutron-constraints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apply neutron port/subnet/network/router custom constraints.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Neutron port/subnet/router custom constraints are defined, but not to apply.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Neutron network custom constraint only apply to OS::Sahara::* resources,
should apply to other related resources.&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Apply neutron subnet constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron port constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron router constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron network constraint.&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&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;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Apply neutron subnet constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron port constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron router constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply neutron network constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add UT/Tempest tests for changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;
</description><pubDate>Tue, 18 Nov 2014 00:00:00 </pubDate></item><item><title>Using Barbican as secret backend</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/barbican-as-secret-backend.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/barbican-as-secret-backend"&gt;https://blueprints.launchpad.net/heat/+spec/barbican-as-secret-backend&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We store some secret data in the Heat database using a simple symmetric
encryption with a static key. To improve security of the storage, we should
optionally support using Barbican to store those secrets.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat uses a simple encrypt mechanism to store secret data in its database, with
the key specified in the configuration. While it provides some security, a
compromised Heat node will give the attacker access to all the users’ secrets.&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 flag to the Heat configuration specifying that Barbican must be used
for storing secret. When set, Heat will query the service catalog for the
Barbican service, and will store the secrets in the user project, with
predictable prefixes.&lt;/p&gt;
&lt;p&gt;We already support 2 different methods of decryption, ‘heat’ being the legacy
one, and ‘oslo_v1’ being the current version. Current values encrypted using
those methods will keep getting decrypted the same way. When we use Barbican,
the encryption method will be set to ‘barbican_v1’ and the value will be the
reference of the secret.&lt;/p&gt;
&lt;p&gt;It should require a refactoring, as data encryption is today managed at the
SQLAlchemy data layer, whereas it may be easier to manage it above, especially
as we need user credentials to talk to Barbican.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There seems to be an effort to create a key management shim that may use local
secure storage as an option. We may want to wait for that effort.&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;therve&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;Extract encryption management from the SQLAlchemy layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move Barbican client out of contrib&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a configuration option to send secrets to the Barbican 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;
</description><pubDate>Mon, 10 Nov 2014 00:00:00 </pubDate></item><item><title>Signaling SoftwareDeployment resources via Swift</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/software-config-swift-signal.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/software-config-swift-signal"&gt;https://blueprints.launchpad.net/heat/+spec/software-config-swift-signal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently the only option for signaling a deployment resource requires making
an authenticated API request to heat. A SoftwareDeployment resource
signal_transport: TEMP_URL_POLL will allow unauthenticated signaling using a
similar approach to OS::Heat::SwiftSignal.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OS::Heat::SoftwareDeployment signal_transport options currently both require
resource scoped credentials and network connectivity from the server to a
heat API to work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Like OS::Heat::SwiftSignal, signal_transport:TEMP_URL_POLL would create a
long-lived swift TempURL which is polled by heat until the object contains
the expected data from the nova server performing the configuration
deployment. Initially, “long-lived” will mean expiring in year 2038.&lt;/p&gt;
&lt;p&gt;Implementing a signal_transport:TEMP_URL_POLL would have the following
benefits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Each OS::Heat::SoftwareDeployment resource would not need to create a
stack user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Making swift objects accessible from nova servers is more likely to be
provided for by the cloud operator, compared to access to keystone and heat
APIs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, heat.conf default_software_config_transport option will be added so that
operators can choose the most appropriate transport for their cloud. Choosing
the default will depend on whether the cloud supports keystone v3, swift and
the cloudformation endpoint.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Blueprint software-config-zaqar will implement signal_transport:ZAQAR_MESSAGE
which would be the preference for clouds which offer a zaqar endpoint. Since
Swift is much more widely deployed than Zaqar then ZAQAR_MESSAGE should be
recommended first, followed by TEMP_URL_POLL.&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;&amp;lt;steve-stevebaker&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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 TempURL creation and polling in SoftwareDeployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement TempURL POSTing in heat-templates 55-heat-config (may not be
required if interface is identical to CFN_SIGNAL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document implications for using TEMP_URL_POLL and AUTO in the
software-deployment section of the hot-guide.&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;No dependencies on new libraries or existing blueprints.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 22 Oct 2014 00:00:00 </pubDate></item><item><title>Stack lifecycle scheduler hint blueprint</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/stack-lifecycle-scheduler-hint.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-lifecycle-scheduler-hint"&gt;https://blueprints.launchpad.net/heat/+spec/stack-lifecycle-scheduler-hint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A heat provider may have a need for custom code to examine stack requests
prior to performing the operations to create or update a stack. After the
custom code completes, the provider may want to provide hints to the nova
scheduler with stack related identifiers, for processing by any custom
scheduler plug-ins configured for nova.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A heat provider may have a need for custom code to examine stack
requests prior to performing the operations to create or update a stack.
An example would be a holistic scheduler that schedules a stack’s member
compute resources as group. This would be done using a custom plugin
invoked through the stack lifecycle plugpoint. After the custom code
completes, when the create or update is being processed, any custom
schedulers configured for nova would need to map nova create requests
back to any decisions made during the call to the custom stack
lifecycle plugin. Current heat includes no identifiers in a nova
create request that can be used to map back to a Server or Instance
resource within a heat stack.&lt;/p&gt;
&lt;p&gt;It is out of scope for this spec, but worth noting that cinder scheduler
hints are now supported by heat and may need similar treatment. See
&lt;a class="reference external" href="https://review.openstack.org/#/c/126282/"&gt;https://review.openstack.org/#/c/126282/&lt;/a&gt; and
&lt;a class="reference external" href="https://review.openstack.org/#/c/126298/"&gt;https://review.openstack.org/#/c/126298/&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;When heat processes a stack, and the feature is enabled,
the stack id, root stack id, stack resource id,
stack resource name and the path in the stack (as a list of tuples,
(stackresourcename, stackname)) will be passed to nova by heat as
scheduler hints, to the configured schedulers for nova.&lt;/p&gt;
&lt;p&gt;The behavior changes will be optional, default disabled, and controlled
through a new heat config variable.&lt;/p&gt;
&lt;p&gt;These five scheduler hints will be added to server creates done using
either resource class Server (OS::Nova::Server) or resource class
Instance (AWS::EC2::Instance). heat_root_stack_id will be set to the
id of the root stack of the resource, heat_stack_id will be
set to the id of the resource’s parent stack,
heat_stack_name will be set to the id of the resource’s
parent stack, heat_path_in_stack will be set to a list of
tuples, (stackresourcename, stackname) with list[0] being
(None, rootstackname), and heat_resource_name will be set to
the resource’s name&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No reasonable alternatives were identified.
Similar function could be achieved if the lifecycle plugin modified the stack
(and changes were persisted). This would be bad behavior. It would conflict
with convergence when it lands, and scheduler decisions would become visible
to the heat user (unless somehow redacted on query).&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;A patch comprising a full implementation of the blueprint
(&lt;a class="reference external" href="https://review.openstack.org/#/c/96889/"&gt;https://review.openstack.org/#/c/96889/&lt;/a&gt;) is already being
reviewed, under the old pre-spec process.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;William C. Arnold (barnold-8)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-3&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;Implementation: &lt;a class="reference external" href="https://review.openstack.org/#/c/96889/"&gt;https://review.openstack.org/#/c/96889/&lt;/a&gt;
Documentation: Add good documentation to heat in tree docs&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No dependencies&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 22 Oct 2014 00:00:00 </pubDate></item><item><title>Reorganize the code structure of resources folder</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/reorganize-resources-code-structure.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/heat/+spec/reorganize-resources-code-structure"&gt;https://blueprints.launchpad.net/heat/+spec/reorganize-resources-code-structure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reorganize the resources code structure to make it more clear.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The code structure of the resources folder is in some confusion.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The new code structure will be:&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;heat&lt;/span&gt;
&lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;engine&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;aws&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;ec2&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res1&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res2&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;autoscaling&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res1&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res2&lt;/span&gt;
     &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;nova&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res1&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res2&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;neutron&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res1&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res2&lt;/span&gt;
          &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;cinder&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res1&lt;/span&gt;
               &lt;span class="o"&gt;|----&lt;/span&gt;&lt;span class="n"&gt;res2&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&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;huangtianhua &amp;lt;&lt;a class="reference external" href="mailto:huangtianhua%40huawei.com"&gt;huangtianhua&lt;span&gt;@&lt;/span&gt;huawei&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&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;Put the AWS resources to folder resources/aws&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put the OpenStack resources to folder resources/openstack&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;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/decouple-aws-os-resources"&gt;https://blueprints.launchpad.net/heat/+spec/decouple-aws-os-resources&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 21 Oct 2014 00:00:00 </pubDate></item><item><title>Add support for SR-IOV-PORT</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/add-pciport-resource.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/neutron-resource-add-pci-port"&gt;https://blueprints.launchpad.net/heat/+spec/neutron-resource-add-pci-port&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When creating Neutron SR-IOV ports, these ports should have their own resource
types. This spec proposes to add vnic_type to OS::Neutron::Port objects.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A neutron port is a virtual port that is either attached to a linux bridge or
an openvswitch bridge on a compute node. With the introduction of PCI
Passthrough SR-IOV support, the intermediate virtual bridge is no longer
required. Instead, the SR-IOV port is associated with a virtual function
that is supported by the vNIC adaptor.&lt;/p&gt;
&lt;p&gt;Currently a PCI port can be created by setting the value_specs property
in OS::Neutron::Port. However, having a new resource type will simplify
the templates for the user and allow for different constraints in the
future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add support for vnic_type OS::Neutron::Port.
Provider resources will be used to create a PCI resource.
OS::Neutron::Port will be modified to suport the vnic type.&lt;/p&gt;
&lt;p&gt;The properties for OS::Neutron::Port will be as follows:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sriov_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Neutron::Port&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my_net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;vnic_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;direct&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The vnics type supported are normal, direct and macvtap&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Implement a new resource OS::Neutron::PciPort. This will reside with the
current Neutron::Port and reuse as much of Neutron::Port as possible.&lt;/p&gt;
&lt;p&gt;The properties for OS::Neutron::PciPort will be as follows:&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;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sriov_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;OS::Neutron::PciPort&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="nt"&gt; get_param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my_net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;vnic_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;direct&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Rob Pothier&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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;modify OS::Neutron::Port https://review.openstack.org/#/c/129353/&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;
</description><pubDate>Mon, 06 Oct 2014 00:00:00 </pubDate></item><item><title>Convergence</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/convergence.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence"&gt;https://blueprints.launchpad.net/heat/+spec/convergence&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clouds are noisy - servers fail to come up, or die when the underlying
hypervisor crashes or suffers a power failure. Heat should be resilient
and allow concurrent operations on any sized stack.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are multiple problems that face users of Heat with the current model.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;stacks that fail during creation / update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Physical resources may (silently) stop working - either
disappearing or have an error of some sort (e.g. loadbalancer that
isn’t forwarding traffic, or nova instance in ERROR state). When this
happens a subsequent update that depends on a presumably “active”
resource is likely to fail unexpectedly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat engines are also noisy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;they get restarted when servers need to get updated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;they may fail due to hardware or network failure (see under
hypervisor failure)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat engine failures show up as a _FAILED stack, which is a
problem for the user, but it should not be as whatever happened is a
temporary problem for the operator, and not resolvable by the user.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large stacks exceed the capacity of a single heat-engine process
to update / manage efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large clusters - e.g. 10K VMs should be directly usable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack updates lock state until the entire thing has converged again
which prevents admins making changes until its completed&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This makes it hard/impossible to do autoscaling as autoscaling
decisions may be more frequent than the completion time from
each event&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Concern: Why would you make a controller that makes decisions
so frequently that it does not have time to observe the
effects of one decision before making the next?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large admin teams are forced to use an external coordination
service to ensure they don’t do expensive updates except when
there is scheduled time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reacting to emergencies is problematic&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="user-stories"&gt;
&lt;h3&gt;User Stories&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Users should only need to intervene with a stack when there
is no right action that Heat can take to deliver the current
template+environment+parameters. E.g. if a cinder volume attached to a
non-scaling-group resource goes offline, that requires administrative
intervention -&amp;gt; STACK_FAILED&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Examples that this would handle without intervention&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nova instances that never reach ACTIVE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron ports that aren’t reachable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Servers in a scaling group that disappear / go to ERROR in
the nova api&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Examples that may need intervention&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;servers that are not in a scaling group which go to ERROR
after running for a while or just disappear&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scaling groups that drop below a specified minimum due to
servers erroring/disappearing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat users can expect Heat to bring a stack into line with the
template+parameters even if the world around it changes after
STACK_READY - e.g. due to a server being deleted by the user.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;That said, there will be times where users will want to disable
this feature.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Operators should not need to manually wait-or-prepare heat engines
for maintenance: assume crash/shutdown/failure will happen and have
that be seamless to the user.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Stacks that are being updated must not be broken / interrrupted
in a user visible way due to a heat engine reboot/restart/redeploy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users should be able to deploy stacks that scale to the size of
the backend storage engine - e.g. we should be able to do a million
resources in a single heat stack (somewhat arbitrary number as a
target). This does not mean a 1 million resource single template,
but a single stack that has 1 million resources in it, perhaps by
way of resource groups and/or nested stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users need to be able to tell heat their desired template+parameters
at any time, not just when heat believes the stack is ‘READY’.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Autoscaling is a special case of ‘user’ here in that it tunes
the sizes of groups but otherwise is identical to a user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Admins reacting to problematic situations may well need to make
‘overlapping’ changes in rapid fire.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users deploying stacks with excess of 10K instances (and thus
perhaps 50K resources) should expect Heat to deploy and update said
stacks quicky and gracefully, given appropriate cloud capacity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Existing stacks should continue to function. “We don’t break
user-space”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During stack create, the creation process is stuck waiting for a signal
that will never come due to out of band user actions. An update is
issued to remove the signal wait.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During stack create, software initialization is failing because of
inadequate amounts of space allocated in volumes. Update is issued to
allocate larger volumes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During stack delete, the deletion process is waiting indefinitely to
delete an undeletable resource. Update is issued to change the deletion
policy and not try to remove the physical resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This specification is primarily meant to drive an overall design. Most
of the work will be done under a set of sub-blueprints:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move from using in-process-polling to observe resource state, to an
observe-and-notify approach. This will be the spec &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;convergence-observer&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move from a call-stack implementation to a continual-convergence
implementation, triggered by change notification. This will be the spec
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;convergence-engine&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run each individual convergence step with support from the taskflow
library via a distributed set of workers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prior to, and supporting, that work will be database schema changes.
The primary changes are to separate desired and observed state, and to
support the revised processing technique.  To separate desired and
observed state we will: (1) clone the table named resource, making a
table named resource_observed (the table named resource_data seems
more like part of the implementation of certain kinds of resources and
so does not need to be cloned), and (2) introduce a table named
resource_properties_observed.  For the resource_observed table, the
columns named status, status_reason, action, and rsrc_metadata will be
removed.  The raw template will be part of the desired state.  A given
resource’s properties, in the desired state, are computed from the
template and effective environment (which includes the stack
parameters).  In the observed state a resource’s properties are held
in the resource_properties_observed table; it will have the following
fields.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;id VARCHAR(36)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;stack_id VARCHAR(36)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resource_name VARCHAR(255)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prop_name VARCHAR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prop_value VARCHAR&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Upon upgrade of the schema and engines, existing stacks will automatically
start using the convergence model.&lt;/p&gt;
&lt;p&gt;No required changes will be made to existing API’s, including the resource
plugin API.&lt;/p&gt;
&lt;section id="convergence-engine"&gt;
&lt;h3&gt;Convergence Engine&lt;/h3&gt;
&lt;p&gt;A new set of internal RPC calls will be created to allow per-resource
convergence operations to be triggered by the observers. A new set of
public API calls will also be needed to trigger convergence on a stack
or resource manually.&lt;/p&gt;
&lt;p&gt;There was a plan previously to only use the existing stack-update to
enable a manual convergence. This would result in a somewhat awkward
user experience that would require more of the user than is necessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="observer-engine"&gt;
&lt;h3&gt;Observer Engine&lt;/h3&gt;
&lt;p&gt;A new set of internal RPC calls will be created to trigger immediate
observation of reality by the observer. A new set of public API calls will
also be needed to trigger observation of a stack or resource manually.&lt;/p&gt;
&lt;p&gt;Note that this will build on top of the calls introduced in
the`stack-check` blueprint by allowing a resource-check as well.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model"&gt;
&lt;h3&gt;Data Model&lt;/h3&gt;
&lt;p&gt;Heat will need a new concept of a &lt;cite&gt;desired state&lt;/cite&gt; and an &lt;cite&gt;observed state&lt;/cite&gt;
for each resource. Storage will be expected to serialize concurrent
modification of an individual resource’s states, so that on the
per-resource level we can expect consistency.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="scheduling"&gt;
&lt;h3&gt;Scheduling&lt;/h3&gt;
&lt;p&gt;Heat stacks contain dependency graphs that users expect to be respected
during operations. Mutation of the goal state must be scheduled in the
same manner as it is now, but will be moved from a central task scheduler
to a distributed task scheduler.&lt;/p&gt;
&lt;p&gt;On creation of a stack, for instance, the entire stack will be parsed
by the current engine. Any items in the graph that have no incomplete
parents will produce a direct message to the convergence engine queue,
which is handled by all convergence engines. The message would instruct
the worker that this resource should exist, and the worker will make
the necessary state changes to record that. Once it is recorded, a job
to converge the resource will be created.&lt;/p&gt;
&lt;p&gt;The converge job will create an observation job. Once the reality is
observed to match desired state, the graph will be checked for children
which now have their parents all satisfied, and if any are found, the
convergence process is started for them. If we find that there are no
more children, the stack is marked as COMPLETE.&lt;/p&gt;
&lt;p&gt;This may produce a situation where a user with larger stacks is given
an unfair amount of resources compared to a user with smaller stacks,
because the larger stack will fill up the queue before the smaller one,
leading to long queue lengths. For now, quotas and general resource
limits will have to be sufficient to prevent this situation.&lt;/p&gt;
&lt;p&gt;Updates will work in the exact same manner. Removed items will still be
enumerated by searching for all existing resources in the new graph,
and appropriately recording the desired state as “should not exist”
for anything not in the new graph.&lt;/p&gt;
&lt;p&gt;Rollbacks will be enabled in the same manner as they currently are,
with the old stack definition being kept around and re-applied as the
rollback operation. If concurrent updates are done, the rollback is
always to the previous stack definition that reached a COMPLETE state. &lt;a class="footnote-reference brackets" href="#id2" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stack deletes happen in reverse. The stack would be recorded as “should
not exist”, which will inform the convergence jobs that the scheduling
direction is in reverse.  The childless nodes of the graph would be
recorded as “should not exist” and then parents with no more children
in an active state recorded as “should not exist”.&lt;/p&gt;
&lt;p&gt;This will effectively render the convergence engine a garbage collector,
as physical resources will be left unreferenced in the graph, in a state
where they can be deleted at any time. Given the potential for cost
to the user, these resources must remain visible to the user garbage
collection must be given a high priority.&lt;/p&gt;
&lt;p&gt;Note that the state of “should not exist” does not change the meaning
of deletion policies expressed in the template.  That will still result
in a rename and basic de-referencing if there is a policy preventing
actual deletion.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;The rollback design needs further discussion as it isn’t clear
that this would be sufficient to not violate user expectations.
We can copy the current implementation and keep a copy of the last
known “COMPLETE” template, and roll back by asserting that if
a user has asked for rollback. Otherwise the fact that we allow
relatively fast updates with convergence should allow users to
get a better rollback experience by using version control on
templates and environment files.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Improve current model with better error handling and retry support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Does not solve locking/concurrency problems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does not solve large stack scalability problems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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;p&gt;This work will be broken up significantly and spread between many developers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;The bulk of this work should be completed in the “K” cycle, with the
sub-blueprints landing significant amounts of change throughout Juno.&lt;/p&gt;
&lt;p&gt;In particular, the DB schema changes to separate desired and observed
state will come first.  Once that is done we can make a major
improvement without much change in the code structure; simply by
updating the observed state as soon as each change is made we fix the
worst problem (that a partially successful stack update does not
accurately record the resulting state).  Later comes the major code
re-org.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Blueprints&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;convergence-observer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;convergence-engine&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Taskflow&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Any specific needs for taskflow should be added here.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Convergence Observer</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/convergence-observer.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/convergence-observer"&gt;https://blueprints.launchpad.net/heat/+spec/convergence-observer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a step toward implementing the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;convergence&lt;/span&gt;&lt;/code&gt; specification, Heat
will split operations which fall into the “observing reality” category
into a separate “observer” process.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;External systems hosting the physical resources of a stack will change
independent of operations in Heat. There is a need to have a way to record
and respond to these changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Observer is responsible for managing the model of reality&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;polls nova/neutron/etc using resource &lt;cite&gt;check&lt;/cite&gt; methods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;conceptually polls heat stack descriptions to update internal resources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data model will need to store “observed state”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REST API will need to display “observed state”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that no change will be necessary to the resource plugin API. Also
note that subscribing to notifications will be done in a separate
blueprint named &lt;cite&gt;convergence-continuous-observer&lt;/cite&gt;.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&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;p&gt;Work should be spread between all developers as much as possible to help
spread awareness of how things work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;Modify data model to record resource state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify public API to display observed state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new observer RPC API calls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new observer entry point&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move “check_active” and “check” calls to use observer API&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;ul class="simple"&gt;
&lt;li/&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Hidden Parameters Encryption</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/encrypt-hidden-parameters.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/encrypt-hidden-parameters"&gt;https://blueprints.launchpad.net/heat/+spec/encrypt-hidden-parameters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Encrypt template parameters that were marked as hidden before storing them in
database.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Heat template parameters can be marked as hidden, but currently these values
are stored in database in plain text.&lt;/p&gt;
&lt;p&gt;A template author currently marks a parameter as hidden so that it will not be
logged or displayed to the user in user interfaces.&lt;/p&gt;
&lt;p&gt;The problem itself is that these are probably sensitive pieces of data and thus
it would provide some safety against a database attacker if they were encrypted
in the database.&lt;/p&gt;
&lt;p&gt;Leaving sensitive customer data at rest unencrypted provides many more options
for that data to get in the wrong hands or be taken outside the company.  It is
quick and easy to do a MySQL dump if the DB linux system is compromised, which
has nothing to do with Heat having a vulnerability.  Encrypting the data helps
in case if a leak of arbitrary DB data does surface in Heat.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provide a configuration option to enable/disable hidden parameter encryption.
(Default is to disable parameter encryption)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encrypt parameters that were marked as hidden before storing Stack data in
the database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decrypt parameters as soon as the stack data is read from database and
use decrypted parameters to create Stack object.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This implementation uses same key and encryption mechanism that is currently
being used for encrypting/decrypting user credentials, trust tokens, and
resource data. (Encryption key is defined in Heat configuration file)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Instead of encrypting hidden parameters, we could encrypt all the parameters
as a dictionary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encrypt full disk where entire MySQL database is being stored or encrypt
files where specific tables are stored.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another alternative is to use CryptDB:&lt;/p&gt;
&lt;p&gt;www.cs.berkeley.edu/~istoica/classes/cs294/11/papers/sosp2011-final53.pdf&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate Barbican with Heat and use Barbican to store secrets.&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;vijendar-komalla&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;Modify Stack ‘store’ method to encrytpt parameters before storing in database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify Stack ‘load’ method to decrypt parameters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a migration script to encrypt parameters that are already stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a tool/script to change the encryption key and re-encrypting all the
parameters&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;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Add log translation hints for Heat</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/log-translation-hints.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/Heat/+spec/log-translation-hints"&gt;https://blueprints.launchpad.net/Heat/+spec/log-translation-hints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To update Heat log messages to take advantage of oslo’s new feature of
supporting translating log messages using different translation domains.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Current oslo libraries support translating log messages using different
translation domains and oslo would like to see hints in all of our code
by the end of juno. So Heat should handle the changes out over the release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Since there are too many files need to change, so divide this bp into dozens of
patches according to Heat directories(which need applying this change).&lt;/p&gt;
&lt;p&gt;For each directory’s files, we change all the log messages as follows.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.error(_(” to “LOG.error(_LE”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.warn(_(” to “LOG.warn(_LW(“.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.info(_(” to “LOG.info(_LI(“.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.critical(_(” to “LOG.critical(_LC(“.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that this spec and associated blueprint are not to address the problem of
removing translation of debug messages.&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&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;liusheng&amp;lt;&lt;a class="reference external" href="mailto:liusheng%40huawei.com"&gt;liusheng&lt;span&gt;@&lt;/span&gt;huawei&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-3&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;For each directory’s files, we change all the log messages as follows.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.error(_(” to “LOG.error(_LE”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.warn(_(” to “LOG.warn(_LW(“.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.info(_(” to “LOG.info(_LI(“.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change “LOG.critical(_(” to “LOG.critical(_LC(“.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We handle these changes in the following order:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;├── contrib           #TODO1
├── heat
│   ├── api        #TODO2
│   ├── cloudinit  #TODO3
│   ├── cmd
│   ├── common     #TODO4
│   ├── db         #TODO5
│   ├── doc
│   ├── engine     #TODO6
│   ├── locale
│   ├── openstack  #TODO7
│   ├── rpc        #TODO8
│   ├── scaling    #TODO9
│   ├── tests      #TODO10
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add a HACKING check rule to ensure that log messages to relative domain.
Using regular expression to check whether log messages with relative _L*
function.&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;log_translation_domain_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"(.)*LOG\.info\(\s*_LI\(('|&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;log_translation_domain_warning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"(.)*LOG\.(warn|warning)\(\s*_LW\(('|&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;log_translation_domain_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"(.)*LOG\.error\(\s*_LE\(('|&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;log_translation_domain_critical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"(.)*LOG\.critical\(\s*_LC\(('|&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;[1]https://blueprints.launchpad.net/oslo/+spec/log-messages-translation-domain-rollout&lt;/p&gt;
&lt;p&gt;[2]https://wiki.openstack.org/wiki/LoggingStandards&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Implement More Custom Constraints for Neutron</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/neutron-custom-constraint.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/neutron-custom-constraint"&gt;https://blueprints.launchpad.net/heat/+spec/neutron-custom-constraint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now only network constraint is supported for neutron, we need more constraints
like subnet, port, router etc.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Many resources have some properties related with network, now neutron custom
constraints only support network constraint, haven’t support subnet/port/router
constraints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add 3 custom constraints to neutron.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;‘neutron.subnet’ for subnet constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‘neutron.port’ for port constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‘neutron.router’ for router constraint.&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&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;Ethan Lynn&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement subnet constraint for neutron&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement port constraint for neutron&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement router constraint for neutron&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/glance-parameter-constraint"&gt;https://blueprints.launchpad.net/heat/+spec/glance-parameter-constraint&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Display more user information in stack lists</title><link>https://specs.openstack.org/openstack/heat-specs/specs/juno/stack-display-fields.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/stack-display-fields"&gt;https://blueprints.launchpad.net/heat/+spec/stack-display-fields&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stacks are launched by users but scoped to tenants, so users in the same tenant
currently have no way to know who stacks belong to.  The same is especially
true to unscoped stack lists.  Since humans are much better with names than
they are with numbers, it would be great if this list also contained other
information to allow for better identification of stack owners.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There is currently no way to know what user created a stack, since only the
tenant ID is displayed with a stack and multiple users can be in the same
tenant.&lt;/p&gt;
&lt;p&gt;Also, when listing unscoped stacks (with the flag &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;global_tenant=True&lt;/span&gt;&lt;/code&gt;), all
stacks are returned, regardless of the tenant who owns them.  This list
contains information about the stacks, including some info about the stack
owner (e.g. the Tenant ID is included, but usernames are not).&lt;/p&gt;
&lt;p&gt;This is helpful for cloud providers to be able to more easily support their
customers.  However, humans are better at dealing with names than with numbers,
so returning just the Tenant ID is not ideal.&lt;/p&gt;
&lt;p&gt;In order to make it possible for supporters to easily identify their clients,
it would be great to also include the username of the stack owners in the stack
information.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed implementation would add the extra information when formatting a
stack.&lt;/p&gt;
&lt;p&gt;Currently, the username is already saved to the database but not parsed back
into the stack when loaded from the DB.  This would parse it back from the DB
into the stack at all times, but only exposed to the API response when
formatting stacks to a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;global_tenant&lt;/span&gt;&lt;/code&gt; call:&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;"stacks"&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;"creation_time"&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;"description"&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;"id"&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;"links"&lt;/span&gt;&lt;span class="p"&gt;:&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="s2"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"TENANT_ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"stack_owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"USERNAME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Additional&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;
      &lt;span class="s2"&gt;"stack_owner_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"USER_ID"&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="s2"&gt;"stack_name"&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;"stack_status"&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;"stack_status_reason"&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;"updated_time"&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="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;The necessary changes will primarily reside in:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;heat.api.openstack.v1.views.stacks_view.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.engine.api.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.engine.parser.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.engine.service.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat.rpc.api.py&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, since this is just field additions.&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 assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rblee88&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;andersonvom&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-2&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;Read username into the Stack back from the DB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Display username when displaying stacks&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;
</description><pubDate>Mon, 22 Sep 2014 00:00:00 </pubDate></item><item><title>Heat-manage service list</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/heat-manage-service-list.html</link><description>

&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/heat/+spec/heat-manage-service-list"&gt;https://blueprints.launchpad.net/heat/+spec/heat-manage-service-list&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds the ability to heat-manage command to list the running status of
heat-engines deployed in a given cloud environment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In a given enterprise cloud environment, Heat to support horizontal scaling,
multiple heat-engines will be deployed and executed. Once these engines are
deployed on multiple hosts, there is no way an admin can find these
heat engines details like&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;what is the node on which heat engine is running,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what is the running status of each engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How long the heat-engines 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;Heat already provides heat-manage command to take care of the database syncing
and archiving. As part of this blue print, ‘service list’ is added to provide
the following details:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Heat-engine node name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat-engine running status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat-engine host (message queue)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heat-engine last updated time of running status.&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&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;Kanagaraj Manickam (kanagaraj-manickam)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&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 required db migration script to add the new table ‘Services’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ‘Service’ model in the sqlalchemy and required db api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the heat-engine service for updating the db at given periodic interval&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ‘service list’ to heat.cmd.manage and it required help&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add heat service REST API as contrib (extension) api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add heat service-list command in heat CLI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add required test cases&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;
</description><pubDate>Fri, 19 Sep 2014 00:00:00 </pubDate></item><item><title>Make tempest orchestration scenario tests the heat functional tests</title><link>https://specs.openstack.org/openstack/heat-specs/specs/kilo/functional-tests.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/heat/+spec/functional-tests"&gt;https://blueprints.launchpad.net/heat/+spec/functional-tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Having all OpenStack functional tests in tempest is no longer scalable,
so heat functional tests need to live in the heat repository.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Existing tempest orchestration scenario tests need to be moved into the heat
repository in a way which requires no dependency on the tempest code, and
which can be done with minimal development effort.&lt;/p&gt;
&lt;p&gt;The heat gate needs to switch over to running the heat functional tests,
as well as whatever orchestration tests remain in tempest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed plan for this work will be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Forklift tempest.scenario.orchestration into heat functionaltests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy and modify any supporting tempest code into a subpackage of
functionaltests to make it possible for the tests to run&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace configuration loaded from tempest.conf with a solution which
initially requires no configuration file, specifically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Tests will be run with credentials sourced from the environment, which
heatclient does by default anyway&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration which refers to cloud resources will hard-code values
which correspond to values set up by devstack, and tests will fail
if cloud resources with those names do not exist. This applies to
configuration values:
image_ref, keypair_name, instance_type, network_for_ssh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;build_timeout will be given a default value which is overridable from
an environment variable&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify devstack, devstack-gate and openstack-infra/config to check and
gate on the heat functional tests. This job will replace the current
heat-slow job&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure there are no tempest.api.orchestration tests running in the heat-slow
job, specifically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Do not tag test_nova_keypair_resources as a slow test&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify test_neutron_resources to run with cirros, or rewrite it as a
functional test&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete the heat-slow job, and tests in tempest.scenario.orchestration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The following alternative design points could be considered:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A dedicated conf file to replace the current tempest.conf, or read
test configuration values from heat.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Failing tests instead of skipping for missing credentials or required cloud
resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modifying tox.ini to filter out functional tests on a unit test run instead
of skipping based on current environment&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;Steve Baker &amp;lt;&lt;a class="reference external" href="mailto:sbaker%40redhat.com"&gt;sbaker&lt;span&gt;@&lt;/span&gt;redhat&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="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Juno-3, but work can continue during feature freeze&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;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&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;devstack&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 25 Aug 2014 00:00:00 </pubDate></item></channel></rss>