<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"><channel><title>Charm Specs</title><link>https://specs.openstack.org/openstack/charm-specs</link><description /><language>en</language><copyright>2024, OpenStack Charm Team</copyright><item><title>Enable Audit Middleware that comes with keystonemiddleware</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/audit-middleware.html</link><description>

&lt;p&gt;This is a requirement from one of the customers to enable audit middleware.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, manual changes are made to the configuration to enable audit
middleware.  This specification is for a configuration option that can be used
to enable audit middleware in a charm.  This can be applied, as required, to
applicable OpenStack charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Update existing charms to enable this feature.&lt;/p&gt;
&lt;p&gt;The customer in question is currently running bionic queens. This spec is a
basis for that request.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Do it manually.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;For each of the OpenStack charms that provides API, we need to do the
following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add a configuration option to enable or disable audit middleware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We need to add the specific sections that need to go into 3 files.&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;/etc/&amp;lt;project&amp;gt;/&amp;lt;project&amp;gt;.conf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;project&amp;gt;/api-paste.ini&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;project&amp;gt;/api_audit_map.conf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test to see if the corresponding files are changed correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Templates for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;project&amp;gt;/api_audit_map.conf&lt;/span&gt;&lt;/code&gt; file can be found in
&lt;a class="reference external" href="https://github.com/openstack/pycadf/tree/master/etc/pycadf"&gt;https://github.com/openstack/pycadf/tree/master/etc/pycadf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For further details on the implementation see
&lt;a class="reference external" href="https://docs.openstack.org/keystonemiddleware/latest/audit.html"&gt;https://docs.openstack.org/keystonemiddleware/latest/audit.html&lt;/a&gt;.&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;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “audit-middleware” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;audit-middleware
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Understand the changes required for each project, maybe by changing by hand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common changes will be implemented in the charmhelpers library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write tests in charmhelpers for these changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each of the projects:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;sync the new charmhelpers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the relevant updated templates.&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;/etc/&amp;lt;project&amp;gt;/&amp;lt;project&amp;gt;.conf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;project&amp;gt;/api-paste.ini&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;project&amp;gt;/api_audit_map.conf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write the amulet or zaza tests to ensure that the changes are good.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories will need to be created. However, multiple git
repositories will need to be touched for this implementation to work&lt;/p&gt;
&lt;p&gt;These are the initial charms that are within the scope of this specification:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-nova-cloud-controller"&gt;https://github.com/openstack/charm-nova-cloud-controller&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-glance"&gt;https://github.com/openstack/charm-glance&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-cinder"&gt;https://github.com/openstack/charm-cinder&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-gnocchi"&gt;https://github.com/openstack/charm-gnocchi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-heat"&gt;https://github.com/openstack/charm-heat&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-ironic"&gt;https://github.com/openstack/charm-ironic&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-neutron-api"&gt;https://github.com/openstack/charm-neutron-api&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/charm-panko"&gt;https://github.com/openstack/charm-panko&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following repo will also need to be updated, so ensure that similar
information is stored in one central place, rather than duplicating the
contents in the above repositories.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/juju/charm-helpers"&gt;https://github.com/juju/charm-helpers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Initial work was tried in the following commits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/arif-ali/charm-nova-cloud-controller/commit/3743f00384de56efe8b0a4ee2ab2e40de68b5e7f"&gt;https://github.com/arif-ali/charm-nova-cloud-controller/commit/3743f00384de56efe8b0a4ee2ab2e40de68b5e7f&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/arif-ali/charm-helpers/commit/258cf87c83cca2faf601dd99285cd226e2e67b48"&gt;https://github.com/arif-ali/charm-helpers/commit/258cf87c83cca2faf601dd99285cd226e2e67b48&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;It will be documented within each of the charms’ &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;config.yaml&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Enable API auditing for security compliance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit tests will be added to charm-helpers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional tests will need to be added for the new option, and checking that
the configuration is changed correctly, and then disabled.&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;There are no further dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Ceph Storage Action</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/ceph-storage-action.html</link><description>

&lt;p&gt;We should allow the user to specify the class of storage that a given
storage device should be added to. This action would allow adding a list
of osd-devices into specified Ceph buckets.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;All osd-devices are currently added to the same default bucket making it
impossible to use multiple types of storage effectively. For example, users
may wish to bind SSD/NVMe devices into a fast/cache bucket, 15k spindles into
a default bucket, and 5k low power spindles into a slow bucket for later
use in pool configuration.&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 action that includes additional metadata into the osd-devices list
allowing for specification of bucket types for the listed devices. These OSDs
would be added to the specified bucket when the OSD is created.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User could specify a pre-build usage profile and we could map device types
onto that profile by detecting the device type and deciding, based on the
configured profile, what bucket the device should go into.&lt;/p&gt;
&lt;p&gt;This solution is being discarded because of the difficulty of designing
and implementing usage profiles to match any use case automigically. It will
also require a lot of work to correctly identify the device type and decide
where to place it in the desired profile.&lt;/p&gt;
&lt;p&gt;In addition, it would require that we only support a single “profile” within
a deployed ceph-osd cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm could define additional storage attach points in addition to
osd-devices that would allow the user to specify what bucket they
should add devices to.&lt;/p&gt;
&lt;p&gt;The reason for discarding this solution is that it was determined to be too
limiting because of only supporting a fixed number of bindings, in addition
to making changes harder because of backwards compatibility requirements.&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;Chris MacNaughton &amp;lt;&lt;a class="reference external" href="mailto:chris.macnaughton%40canonical.com"&gt;chris&lt;span&gt;.&lt;/span&gt;macnaughton&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Contact:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Chris Holcombe &amp;lt;&lt;a class="reference external" href="mailto:chris.holcombe%40canonical.com"&gt;chris&lt;span&gt;.&lt;/span&gt;holcombe&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “storage-action” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;storage-action
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Create a bucket with the required name. We do this so that we can create
pool in the specified bucket type. This would be handled within the ceph-mon
charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an action that returns a list of unused storage devices along with
their device types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an action that takes &lt;cite&gt;osd-devices&lt;/cite&gt; and &lt;cite&gt;storage-type&lt;/cite&gt;, that would
be an enum into the buckets that we create. Rather than be a user specified
string, this would be an enumerated list in the ceph charms provided through
the shared charms_ceph library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the ability for other charms to request the bucket that should back
their created pools when creating pools through the broker.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will require additional documentation be added around how to use the
action correctly and what to expect from it. This documentation will be added
to the charm README&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This should have no security impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;There will need to be new unit tests and functional tests to ensure that
the necessary buckets are created and that the disks are added to them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Cinder subordinate charm cinder-nimblestorage</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/cinder-nimblestorage.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Cinder has a great number of drivers for different backends. Almost all
currently available commercial storage arrays and many other software only
solutions have a driver available, if not already in the upstream cinder
project, as an installable package that enables cinder with the extra driver.&lt;/p&gt;
&lt;p&gt;Because of how many possibilities exist, a model was developed where a separate
subordinate charm will be deployed to take care of the specifics of the driver
and pass configuration to the main cinder charm over a relation so that cinder
can write to its own configuration file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Instead of changing the cinder charm, this proposal aims to create a separate
subordinate charm specific for the nimblestorage driver. This cinder
installation would enable access to Nimblestorage devices. The following points
are of condiderable importance for the development of this subordinate charm:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The new implementation should not conflict with current implementation. Both
should co-exist, even in the same deployment if possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new charm should implement all features currently existing in the cinder
charm, regarding the nimblestorage functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that because the Nimblestorage driver is part of the cinder-common
package, no additional packages need to be installed for this charm to work.&lt;/p&gt;
&lt;p&gt;This charm would be supported in the Ussuri release of Openstack and newer.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;At the time of this writing, there exist no alternatives.&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;Gustavo Sanchez &amp;lt;&lt;a class="reference external" href="mailto:gustavo.sanchez%40canonical.com"&gt;gustavo&lt;span&gt;.&lt;/span&gt;sanchez&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: gustavosr98&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Luciano Lo Giudice &amp;lt;&lt;a class="reference external" href="mailto:luciano.logiudice%40canonical.com"&gt;luciano&lt;span&gt;.&lt;/span&gt;logiudice&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: lmlogiudice&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-cinder-nimblestorage” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-cinder-nimblestorage
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The charm, as listed above. Plus, both unit and functional tests will be
written.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Presently, the following repository hosts the charm code:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-cinder-nimblestorage"&gt;https://opendev.org/openstack/charm-cinder-nimblestorage&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Once this charm is completed, charm-guide will be updated to reference it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security aspect is going to change in relation to the current solution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by both unit and functional tests.
Functional tests would require Nimblestorage hardware.&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 in addition to the ones that exist in the current solution.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Cinder subordinate charm cinder-solidfire</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/cinder-solidfire.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Cinder has a great number of drivers for different backends. Almost all
currently available commercial storage arrays and many other software only
solutions have a driver available, if not already in the upstream cinder
project, as an installable package that enables cinder with the extra driver.&lt;/p&gt;
&lt;p&gt;Because of how many possibilities exist, a model was developed where a separate
subordinate charm will be deployed to take care of the specifics of the driver
and pass configuration to the main cinder charm over a relation so that cinder
can write to its own configuration file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Instead of changing the cinder charm, this proposal aims to create a separate
subordinate charm specific for the solidfire driver. This cinder
installation would enable access to Solidfire devices. The following points
are of condiderable importance for the development of this subordinate charm:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The new implementation should not conflict with current implementation. Both
should co-exist, even in the same deployment if possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new charm should implement all features currently existing in the cinder
charm, regarding the solidfire functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that because the Solidfire driver is part of the cinder-common package, no
additional packages need to be installed for this charm to work.&lt;/p&gt;
&lt;p&gt;This charm would be supported in the Ussuri release of Openstack and newer.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;At the time of this writing, there exist no alternatives.&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;Gustavo Sanchez &amp;lt;&lt;a class="reference external" href="mailto:gustavo.sanchez%40canonical.com"&gt;gustavo&lt;span&gt;.&lt;/span&gt;sanchez&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: gustavosr98&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Luciano Lo Giudice &amp;lt;&lt;a class="reference external" href="mailto:luciano.logiudice%40canonical.com"&gt;luciano&lt;span&gt;.&lt;/span&gt;logiudice&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: lmlogiudice&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-cinder-solidfire” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-cinder-solidfire
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The charm, as listed above. Plus, both unit and functional tests will be
written.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Presently, the following repository hosts the charm code:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-cinder-solidfire"&gt;https://opendev.org/openstack/charm-cinder-solidfire&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Once this charm is completed, charm-guide will be updated to reference it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security aspect is going to change in relation to the current solution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by both unit and functional tests.
Functional tests would require Solidfire storage hardware.&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 in addition to the ones that exist in the current solution.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Memory Fragmentation Tuning</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/memory-fragmentation-tuning.html</link><description>

&lt;p&gt;In some high memory pressure scenarios, the memory shortage would make the high
order pages hard to be allocated and also the page allocation would go to the
synchronous frequently reclaim thanks to the default gap between
min&amp;lt;-&amp;gt;low&amp;lt;-&amp;gt;high is too small to wake up the kswapd (asynchronous reclaim)
earlier.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In the OpenStack compute node, especially the hyperconverged machine with the
Ceph OSDs using a lot of page cache. It is easy to have the memory allocation
stall issue. The issue would lead to several issues: The new instance cannot be
brought up (KVM needs to allocate order sixth pages) or VM stuck, etc. The
reasons are:&lt;/p&gt;
&lt;p&gt;1). Compaction for big order page
If the THP (Transparent Huge Page) is used with the VM, it will be more severe
than the persistent huge pages reserved for the VM’s dedicated usage. The THP
needs to allocate the 2MB (x86) huge pages at run time. Moreover, this is the
order 9 (2^9 * 4K = 2MB). In running system, it will be hard to get the
continuous 512 (2^9) 4K pages according to /proc/pagetypeinfo.&lt;/p&gt;
&lt;p&gt;2). Synchronous reclaim.
There are three levels of watermark inside the system: 1). min 2). low 3).
high. When the number of free pages lowers down to the low watermark. The
kswapd will be wakened up to do the asynchronous reclaim. Furthermore, it
will not be stopped until the number of free pages reaches the high watermark.
However, when the memory allocation is strong enough, the free pages will
continue to lower down to the min watermark. At this point, the number of min
pages is reserved for emergency usage, and the allocation will go into the
direct-reclaim (synchronous) mode. This will stall the process.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;In the past experience, the 1GB gap between min&amp;lt;-&amp;gt;low&amp;lt;-&amp;gt;high watermark is a
good practice in the server environment. The bigger gap can wake up the kswapd
earlier and avoid the synchronous reclaim. Moreover, this can alleviate the
latency. The sysctl parameters related to the watermark gap calculation:&lt;/p&gt;
&lt;p&gt;vm.min_free_kbytes
vm.watermark_scale_factor&lt;/p&gt;
&lt;p&gt;For the Ubuntu kernel before 4.15 (Bionic), the only way to tune the watermark
is to modify the vm.min_free_kbytes. The gap would be 1/4 of the
vm.min_free_kbytes. However, increasing the min_free_kbytes is the minimum
watermark reservation increase, which will decrease the actual memory that the
runtime system can use.&lt;/p&gt;
&lt;p&gt;For Ubuntu kernel after 4.15, vm.watermark_scale_factor can be used to increase
the gap without increasing the min watermark reservation. The gap is calculated
by “watermark_scale_factor/10000 * managed_pages”.&lt;/p&gt;
&lt;p&gt;The proposed solution is to set the 1GB watermark gap by using the above two
parameters when the compute node is rebooted.&lt;/p&gt;
&lt;p&gt;The feature will be designed in flexible ways:
1). There will be a switch to turn on/off the feature. By default, it is turned
off. For some small memory compute nodes (&amp;lt;32GB), the 1GB low memory is too
many.&lt;/p&gt;
&lt;p&gt;2). The manual config has a higher priority to overwrite the default
calculation.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The config can be set up in the run time with the following command:
juju deploy cs:sysconfig-2
juju add-relation sysconfig nova-compute
juju config sysconfig sysctl=”{vm.extfrag_threshold: 200,
vm.watermark_scale_factor: 50}”&lt;/p&gt;
&lt;p&gt;However, each system might have different memory capacities. The
watermark_scale_factor needs to be calculated 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:
- Gavin Guo &amp;lt;&lt;a class="reference external" href="mailto:gavin.guo%40canonical.com"&gt;gavin&lt;span&gt;.&lt;/span&gt;guo&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “memory-fragmentation-tuning” for all patches related to
this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;memory-fragmentation-tuning
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Implement the watermark_scale_factor value calculation to set up the gap to
1GB.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git Repository is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The documentation is needed to include the switch to turn on/off the feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The use of this feature exposes no other security attack surface.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;To verify if the calculated watermark value is correct. Also, in different
kernel versions, different parameters should be used (min_free_kbytes v.s.
watermark_scale_factor).&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, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Sharing SSH auth credentials across cloud-compute-related applications</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/ncc-migration-ssh-auth-sharing.html</link><description>

&lt;p&gt;Some cloud environments require different configuration settings
(e.g. allocation ratios) for different hosts, yet still need to allow
SSH-based migration between hosts. The proposed change in this spec
would allow sharing of credentials across multiple applications
related to the cloud-compute relation.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At present, the nova-cloud-controller charm gathers SSH public keys
for all cloud-compute-related applications. These SSH keys are then
shared as needed, but only to peers within the same related
application.&lt;/p&gt;
&lt;p&gt;While this is likely a sane default, especially considering that
different applications may represent different classes of compute
hosts which don’t allow migration between them (e.g. SRIOV
vs. non-SRIOV), there are cases where there is no fundamental reason
to disallow migration.&lt;/p&gt;
&lt;p&gt;In cases like this, at present it’s necessary to manually modify
configuration files, perhaps setting them immutable, to provide the
different configuration values needed for the different types of
hosts, yet still allow them to perform migrations between each other.&lt;/p&gt;
&lt;p&gt;Thus, it is believed it would be beneficial to allow for sharing all
SSH keys across all nova-compute applications to overcome those
limitations.&lt;/p&gt;
&lt;p&gt;This specification is meant to address an implementation for the
following feature request on Launchpad:
&lt;a class="reference external" href="https://bugs.launchpad.net/charms/+source/nova-cloud-controller/+bug/1468871"&gt;https://bugs.launchpad.net/charms/+source/nova-cloud-controller/+bug/1468871&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;Share SSH keys across all nova-compute applications through the
cloud-compute relation with the nova-cloud-controller charm.&lt;/p&gt;
&lt;p&gt;The code will now also have to go through each cloud-compute
relation whenever there is an update to a node or SSH key, in
order to keep the SSH keys on all compute nodes of all relations
consistent.&lt;/p&gt;
&lt;section id="upgrade-impact"&gt;
&lt;h3&gt;Upgrade Impact&lt;/h3&gt;
&lt;p&gt;Upon upgrading the nova-cloud-controller charm version, the
upgrade-charm hook code will cycle through all cloud-compute
relations and set the relation data with all SSH authorized
keys and known hosts to all compute nodes in the relations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-impact"&gt;
&lt;h3&gt;Performance Impact&lt;/h3&gt;
&lt;p&gt;Performance is slightly impacted as the hooks will take longer both
on the nova-cloud-controller charm to set a now higher number of
SSH keys and on each the nova-compute charms to process that higher
number of SSH keys received on the relation. The number of hooks
executed remains the same.&lt;/p&gt;
&lt;p&gt;On cloud-compute-relation-changed hooks, when a change on SSH keys
is triggered by the compute node, or if a new compute node is added,
the code will also take slightly longer due to cycling through all
the relations to make all SSH keys on all compute nodes consistent,
where before it only needed to update the relation pertaining to the
compute node that triggered the change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One alternative may be to write a subordinate charm simply for the
purpose of sharing SSH keys and known hosts entries. While this could
in theory be done, it is less than ideal because that effectively
would create two sources of truth regarding which hosts should share
credentials with which hosts, and it would effectively replicate a
non-trivial amount of logic already handled by
charm-nova-cloud-controller.&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;Rodrigo Barbieri &amp;lt;&lt;a class="reference external" href="mailto:rodrigo.barbieri%40canonical.com"&gt;rodrigo&lt;span&gt;.&lt;/span&gt;barbieri&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;
Paul Goins &amp;lt;&lt;a class="reference external" href="mailto:paul.goins%40canonical.com"&gt;paul&lt;span&gt;.&lt;/span&gt;goins&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “migration-ssh-auth-sharing” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;migration-ssh-auth-sharing
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Allow for sharing across all cloud-compute-related applications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;The changes would be isolated to the charm-nova-cloud-controller
repository.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The release notes for the new charm release that includes this change
should mention the new behavior.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security concerns are raised given that all the nova-compute charm
applications are part of the same environment and connected to the
same nova-cloud-controller nodes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;This functionality can be tested via unit tests. Functional tests may
be overly cumbersome for this particular feature, although direct
testing in a lab environment should also be done as a sanity check.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>SR-IOV Port Live Migration</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/numa-live-migration.html</link><description>

&lt;p&gt;A recent change in Nova for Train release introduced the ability to
live migrate instances with NUMA topology (CPU Pinning and Huge Pages
also considered). This spec is to discuss and ensure support of that
feature in a charm deployment.&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 the ability to live migrate instances
with NUMA topology.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;In Nova several features depend of the internal NUMA topology
object. As indicated in the problem description an operator may ask
the desir of migrating such instances.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;NUMA awareness when flavor is configured with &lt;cite&gt;hw:numa_nodes=N&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU Pinning, when flavor is confiugred with &lt;cite&gt;hw:cpu_policy=dedicated&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Huge Pages, when flavor is configured with &lt;cite&gt;hw:mem_page_size=large&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The support of this improvement will be considered as tech-preview for
Ubuntu 19.10/Train and production-ready for Ubuntu 18.04 LTS/Train and
Ubuntu 20.04 LTS/Ussuri.&lt;/p&gt;
&lt;p&gt;No changes are expected to any of the charms. The aim here is to
validate behavior and provide additional documentations.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An operator could identify a destination host with the same
characteristics as the source host and ensure that the host CPUs where
the guest vCPUs are pinned on are free. Also, in case of huge pages
usage, ensure the availability of the huge pages in the destination
host.&lt;/p&gt;
&lt;p&gt;By default the availibity of live migrate instances with NUMA topology
is disabled in Nova but operators can enable that behavior using:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;workaround/enable_numa_live_migration=True&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;It is to note that this option is not currently exposed in
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-nova-compute&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Sahid Orentino Ferdjaoui &amp;lt;lp:sahid-ferdjaoui&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “numa-live-migration” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;numa-live-migration
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation consists of the following items:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Validate behavior using NUMA awarness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate behavior using CPU Pinning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate behavior using Huge Pages.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Any additional documentation will be considered for &lt;cite&gt;charm-deployment-guide&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;n/a&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;See support of NUMA aware live migration spec [0].&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[0] &lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/stein/approved/numa-aware-live-migration.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/stein/approved/numa-aware-live-migration.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Enable clean removal of a ovn-central unit from the cluster</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/ovn-central-downscaling.html</link><description>

&lt;p&gt;Add capability to ovn-central charm to gracefully leave Southbound and
Northbound clusters. This should be performed automatically in the process
of unit’s teardown. In addition, there should be an action that enables
user to manually kick specified cluster member in case that the unit was not
able to gracefully leave the cluster on its removal.&lt;/p&gt;
&lt;p&gt;It’s important to keep in mind that each ovn-central unit is always part of two
clusters simultaneously, Northbound and Southbound. Any action in regards to
leaving or kicking of the unit must be performed on both of them.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently there’s no clean way to remove ovn-central unit from the cluster. As
described in &lt;a class="reference external" href="https://bugs.launchpad.net/charm-ovn-central/+bug/1948680"&gt;LP#1948680&lt;/a&gt;, removed units do not properly leave the Southbound
and Northbound clusters. Remaining active cluster members will still expect
them and their continued presence will affect fault tolerance of the whole
cluster. For example starting with a cluster of five ovn-central units and
removing two of them will cause the cluster to behave as a cluster of five
members with two faults, not a cluster of three members with no fault.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Part of the solution to this problem is to invoke “ovs-appctl cluster/leave”
command when the unit is in the process of shutting down. This will ensure
that remaining cluster members will reconfigure themselves and will no longer
expect the leaving unit to come back. These two commands should be executed
for the unit to leave both clusters:&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;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnnb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt; &lt;span class="n"&gt;OVN_Northbound&lt;/span&gt;
&lt;span class="n"&gt;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnsb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt; &lt;span class="n"&gt;OVN_Southbound&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;However there’s also a possibility that departing unit won’t be able to execute
“cluster/leave” command properly during the teardown so there should also be
an explicit action to kick “zombie” cluster members that were left behind after
their ovn-central unit disappeared.&lt;/p&gt;
&lt;section id="action-kick"&gt;
&lt;h3&gt;Action: kick&lt;/h3&gt;
&lt;p&gt;This action will enable user to kick specific members from the Southbound and
Northbound OVN clusters. It will require user to supply a short version of an
ID of the server that should be kicked from the cluster. Since the ovn-central
unit is member in two clusters, under two unique identities, this action will
accept following parameters:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;–sb-identity &amp;lt;ID&amp;gt; - ID of the server in Southbound cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;–nb-identity &amp;lt;ID&amp;gt; - ID of the server in Northbound cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;–i-really-mean-it - This option signifies that user is aware of destructive
nature of this action&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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;juju&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;action&lt;/span&gt; &lt;span class="n"&gt;ovn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;central&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;kick&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="n"&gt;fe&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;really&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Above example would translate to unit executing following commands:&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;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnsb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kick&lt;/span&gt; &lt;span class="n"&gt;OVN_Southbound&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="n"&gt;fe&lt;/span&gt;
&lt;span class="n"&gt;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnnb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kick&lt;/span&gt; &lt;span class="n"&gt;OVN_Northbound&lt;/span&gt; &lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This action will be executable on any unit that’s still participating in
the OVN cluster, it does not have to be leader and it only needs to be
executed once. The only problematic part is that user will have to provide
Southbound and Northbound IDs which are not really exposed via juju. To allow
user to correlate specific ovn-central unit with its cluster identities, we
propose a new action called “cluster-status”&lt;/p&gt;
&lt;/section&gt;
&lt;section id="action-cluster-status"&gt;
&lt;h3&gt;Action: cluster-status&lt;/h3&gt;
&lt;p&gt;Prerequisite for this action is to add two new data attributes to the peer
relation between ovn-central units implemented by &lt;a class="reference external" href="https://opendev.org/x/charm-interface-ovsdb/src/branch/master/src/lib/ovsdb.py"&gt;OVSDB Interface&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sb-identity: Short version of the UUID that unit uses in Southbound cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nb-identity: Short version of the UUID that unit uses in Northbound cluster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each unit will publish its Northbound and Southbound ID via the peer relation.&lt;/p&gt;
&lt;p&gt;The action itself will convey outputs of following commands with minor
formatting changes:&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;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnsb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;OVN_Southbound&lt;/span&gt;
&lt;span class="n"&gt;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;appctl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&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;ovn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ovnnb_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;OVN_Northbound&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example output of one of these commands looks something 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;f3be&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;OVN_Southbound&lt;/span&gt;
&lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="n"&gt;eb6ddc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6910&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b8da&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ce3d90815183&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;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f3be&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f3be898b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e8e4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4719&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b344&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;902444227&lt;/span&gt;&lt;span class="n"&gt;dd7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.1.88&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;
&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt;
&lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;follower&lt;/span&gt;
&lt;span class="n"&gt;Term&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;Leader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d33d&lt;/span&gt;
&lt;span class="n"&gt;Vote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d33d&lt;/span&gt;

&lt;span class="n"&gt;Election&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;
&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Entries&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;yet&lt;/span&gt; &lt;span class="n"&gt;committed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Entries&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;yet&lt;/span&gt; &lt;span class="n"&gt;applied&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Connections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;d33d&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;d33d&lt;/span&gt;
&lt;span class="n"&gt;Disconnections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&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;d33d&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d33d&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.0.92&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="mi"&gt;839&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="n"&gt;ago&lt;/span&gt;
    &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.3.144&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="mi"&gt;81662711&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="n"&gt;ago&lt;/span&gt;
    &lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.1.86&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="mi"&gt;1221658&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="n"&gt;ago&lt;/span&gt;
    &lt;span class="n"&gt;f3be&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f3be&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.1.88&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The only proposed change in the following output would be in the “Servers”
section. There, we would drop information about “last msg” as it is not very
informative because cluster followers (non-leaders) don’t keep active
heartbeats between each other. Instead of it, we would add information about
which unit the specific server belongs to.&lt;/p&gt;
&lt;p&gt;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;Servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;d33d&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d33d&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.0.92&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ovn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;central&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;ea4&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.3.144&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ovn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;central&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fbfc&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.1.86&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ovn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;central&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;f3be&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f3be&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.5.1.88&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UNKNOWN&lt;/span&gt;  &lt;span class="c1"&gt;# in case that this identity does not belong to any other related juju unit&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With these information, user can effectively use action “kick” to remove
undesirable members from the cluster.&lt;/p&gt;
&lt;p&gt;These features would be supported on Openstack Yoga (and later) on Ubuntu
22.04 LTS.&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;Martin Kalcok &amp;lt;&lt;a class="reference external" href="mailto:martin.kalcok%40canonical.com"&gt;martin&lt;span&gt;.&lt;/span&gt;kalcok&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ovn-central-downscaling” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ovn-central-downscaling
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 automatic execution of “ovs-appctl cluster/leave” command when
ovn-central unit is removed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement announcing of Southbound and Northbound identity via
&lt;a class="reference external" href="https://opendev.org/x/charm-interface-ovsdb/src/branch/master/src/lib/ovsdb.py"&gt;OVSDB Interface&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement “cluster-status” juju action in ovn-central charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement juju action “kick” that will enable removal of arbitrary cluster
members from Southbound and/or Northbound clusters&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/x/charm-ovn-central"&gt;https://opendev.org/x/charm-ovn-central&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/x/charm-interface-ovsdb.git"&gt;https://opendev.org/x/charm-interface-ovsdb.git&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;README.md of the ovn-central charm will have to be updated to include
information about new juju actions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This change does not pose any direct security risk. The action “kick” can be
dangerous when used incorrectly so it will include “–i-really-mean-it”
required flag, to signify to the user that it needs to be used carefully.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Aside from unit tests, this change will have to be accompanied also with
functional tests that will verify that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;removing unit will remove it from Southbound and Northbound clusters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;using juju action “kick” will remove the specified members from the clusters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;juju action “cluster-status” displays correct information&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 Oct 2023 00:00:00 </pubDate></item><item><title>Pausing Charms with subordinate hacluster without sending false alerts</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/pausing-charms-hacluster-no-false-alerts.html</link><description>

&lt;p&gt;Overall, the goal is to leave “warning” alerts instead of “critical” that
will help a human operator understand that all services are not completely
healthy while reducing the criticality due to an on-going operation. Nrpe
checks will be reconfigured once services under a maintenance operation
are set back to normal (resume).&lt;/p&gt;
&lt;p&gt;The following logic will be applied when pausing/resuming a unit:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Pausing a principal unit, pauses the subordinate hacluster;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resuming a principal unit, resumes the subordinate hacluster;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pausing a hacluster unit,  pauses the principal unit;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resuming a hacluster unit, resumes the principal unit;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;We need to stop sending false alerts when a hacluster subordinate of an
Openstack charm unit is paused or when the principal unit is also paused
for maintenance. This may help operations to receive more effective alerts.&lt;/p&gt;
&lt;p&gt;There are several charms that use hacluster and NRPE that may benefit from
this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-designate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nova-cloud-controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-openstack-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-swift-proxy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="pausing-principal-unit"&gt;
&lt;h3&gt;Pausing Principal Unit&lt;/h3&gt;
&lt;p&gt;If eg. 3 keystone units (keystone/0, keystone/1 and keystone/2) are deployed
and keystone/0 is paused:&lt;/p&gt;
&lt;p&gt;1) haproxy_servers on the other units (keystone/1 and keystone/2) will alert,
because apache2 service on keystone/0 is down&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;haproxy, apache2.service and memcached.service in keystone/0 will also alert&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3) it’s possible that corosync and pacemaker have the VIP placed on the same
unit at which point the service will fail as haproxy is disabled. So hacluster
subordinate unit should also be paused.&lt;/p&gt;
&lt;p&gt;Note: Services affected when pausing a principal unit may change depending on
the principal charm&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pausing-hacluster-unit"&gt;
&lt;h3&gt;Pausing hacluster unit&lt;/h3&gt;
&lt;p&gt;Pausing hacluster set the cluster node, e.g keystone, in standby mode.
A standby node will have its resources stopped (hacluster, apache2) which will
fire false alerts. To solve this issue, the units of hacluster should inform
the keystone unit that they are paused. A way of doing this is through the ha
relation.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;section id="pausing-pausing-principal-unit"&gt;
&lt;h3&gt;Pausing Pausing Principal Unit&lt;/h3&gt;
&lt;p&gt;Pause action on a principal unit should share the event with its peers to
modify the behavior on them (until the resume action is triggered).  It should
also share the status (paused/resumed) to the subordinate unit to be able to
catch-up the same status.&lt;/p&gt;
&lt;p&gt;File actions.py in the principal unit&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pause_unit_helper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;register_configs&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c1"&gt;# Logic added to share the event with peers&lt;/span&gt;
    &lt;span class="n"&gt;inform_peers_if_ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_api_unit_ready&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_nrpe_joined&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
      &lt;span class="n"&gt;update_nrpe_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# logic added to inform hacluster subordinate unit has been paused&lt;/span&gt;
    &lt;span class="n"&gt;relid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paused&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resume_unit_helper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;register_configs&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c1"&gt;# Logic added to share the event with peers&lt;/span&gt;
    &lt;span class="n"&gt;inform_peers_if_ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_api_unit_ready&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_nrpe_joined&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
      &lt;span class="n"&gt;update_nrpe_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# logic added to inform hacluster subordinate unit has been resumed&lt;/span&gt;
    &lt;span class="n"&gt;relid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After pausing a principal unit, it will change the unit-state-{unit_name}
to NOTREADY. E.g:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju show-unit keystone/0 --endpoint cluster&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;keystone/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="nt"&gt;workload-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;17.0.0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;machine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;opened-ports&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;5000/tcp&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;public-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:~openstack-charmers-next/keystone-562&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;leader&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;relation-info&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;endpoint&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;cluster&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;related-endpoint&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;cluster&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;application-data&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;local-unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;in-scope&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;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;admin-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;egress-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;10.5.2.64/32&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;ingress-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;internal-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;private-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;public-address&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;10.5.2.64&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;unit-state-keystone-0&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;NOTREADY&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note: unit-state-{unit_name} field is already implemented, I’m just proposing
to use this field and change the value to NOTREADY when a unit is paused and
return to READY when resumed.&lt;/p&gt;
&lt;p&gt;With every unit knowing which one is paused, it is possible to change the
script check_haproxy.sh to accept a flag to warn the keystone units that
are paused. The bash script is not able now to receive flags.&lt;/p&gt;
&lt;p&gt;Check_haproxy.sh could be rewritten from Bash to Python to accept a flag
to warn specific hostname (e.g. check_haproxy.py –warning keystone-0) is
under maintenance.&lt;/p&gt;
&lt;p&gt;The file nrpe.py on charmhelpers/contrib/charmsupport should have changes
to first check if there is any paused unit in the cluster and then add the
warning flag if necessary&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_haproxy_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;span class="sd"&gt;    Add checks for each service in list&lt;/span&gt;

&lt;span class="sd"&gt;    :param NRPE nrpe: NRPE object to add check to&lt;/span&gt;
&lt;span class="sd"&gt;    :param str unit_name: Unit name to use in check description&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"check_haproxy.py"&lt;/span&gt;

    &lt;span class="n"&gt;peers_states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_peers_unit_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;units_not_ready&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;peers_states&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;UNIT_NOTREADY&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_unit_paused_set&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;units_not_ready&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_unit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;units_not_ready&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;" --warning &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;units_not_ready&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;shortname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'haproxy_servers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Check HAProxy {&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;}'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;unit_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;check_cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;shortname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'haproxy_queue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Check HAProxy queue depth {&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;}'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;unit_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;check_cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'check_haproxy_queue_depth.sh'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When a principal unit changes the state e.g READY to NOTREADY, it’s necessary
to rewrite the nrpe files on the other principal units in the cluster because,
otherwise, they won’t be able to warn that a unit is under maintenance.&lt;/p&gt;
&lt;p&gt;File responsible for hooks in the classic charms:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nd"&gt;@hooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cluster-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@restart_on_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;restart_map&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;stopstart&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_changed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# logic added to update nrpe_config in all principal units when&lt;/span&gt;
    &lt;span class="c1"&gt;# a status is changed&lt;/span&gt;
    &lt;span class="n"&gt;update_nrpe_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note: In reactive charms, it might be slightly different using handlers, but
the mean idea is to update_nrpe_config every time that a config in the cluster
is changed. This will prevent false alerts in the other units in the cluster.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="services-from-principal-unit"&gt;
&lt;h3&gt;Services from Principal Unit&lt;/h3&gt;
&lt;p&gt;Removing the .cfg files, when the unit is paused, for those services at
/etc/nagios/nrpe.d would stop sending critical errors. The downside of this
approach is that it won’t have user friendly messages in Nagios saying that
the specific services (apache2, memcached and etc) is under maintenance, on
the other hand, it’s simpler to be achieved.&lt;/p&gt;
&lt;p&gt;File responsible for hooks in a classic charm:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nd"&gt;@hooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'nrpe-external-master-relation-joined'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nrpe-external-master-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_nrpe_config&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# logic before change&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;

    &lt;span class="n"&gt;nrpe_setup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NRPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy_nrpe_checks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# added logic to remove services&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_unit_paused_set&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_init_service_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;nrpe_setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;_services&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;current_unit&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_init_service_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;nrpe_setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;_services&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;current_unit&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# end of added logic&lt;/span&gt;

    &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_haproxy_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nrpe_setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nrpe_setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The new logic to remove those services is presented below.&lt;/p&gt;
&lt;p&gt;File charmhelpers/contrib/charmsupport/nrpe.py&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# added logic to remove apache2, memcached and etc...&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_init_service_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init_is_systemd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;nrpe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;shortname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'process check {&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;}'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;unit_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;check_cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'check_systemd.py &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The status of the services will disappear from nagios after some minutes.
When the resume action is used, the services are restored initially as
PENDING, but after some minutes the check is done.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h3&gt;Pausing hacluster unit&lt;/h3&gt;
&lt;p&gt;File actions.py in charm-hacluster:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""Pause the hacluster services.&lt;/span&gt;
&lt;span class="sd"&gt;    @raises Exception should the service fail to stop.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
    &lt;span class="n"&gt;pause_unit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# logic added to inform keystone that unit has been paused&lt;/span&gt;
    &lt;span class="n"&gt;relid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paused&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""Resume the hacluster services.&lt;/span&gt;
&lt;span class="sd"&gt;    @raises Exception should the service fail to start."""&lt;/span&gt;
    &lt;span class="n"&gt;resume_unit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# logic added to inform keystone that unit has been resumed&lt;/span&gt;
    &lt;span class="n"&gt;relid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pausing a hacluster would result in sharing a new variable paused that can be
used in the principal units.&lt;/p&gt;
&lt;p&gt;File responsible for hooks in a classic charm:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nd"&gt;@hooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@restart_on_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;restart_map&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;restart_functions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;restart_function_map&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ha_changed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="c1"&gt;# Added logic to pause keystone unit when hacluster is paused&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rid&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;related_units&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'paused'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;clustered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'clustered'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;clustered&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;is_db_ready&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;pause_unit_helper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;register_configs&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'False'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;resume_unit_helper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;register_configs&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

                &lt;span class="n"&gt;update_nrpe_config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;inform_peers_if_ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_api_unit_ready&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;# inform subordinate unit that is paused or resumed&lt;/span&gt;
                &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_unit_paused_set&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;By informing peers and updating the nrpe config this will be enough to trigger
the necessary logic to remove the services checks.&lt;/p&gt;
&lt;p&gt;In a situation where the principal unit is paused, hacluster should also be
paused. For this to happen, it can use the ha-relation-changed from
charm-ha-cluster:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nd"&gt;@hooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha-relation-joined'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'ha-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'peer-availability-relation-joined'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'peer-availability-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'pacemaker-remote-relation-changed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ha_relation_changed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserted logic&lt;/span&gt;
    &lt;span class="c1"&gt;# pauses if the principal unit is paused&lt;/span&gt;
    &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'paused'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;pause_unit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'False'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resume_unit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# share if the subordinate unit status&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rel_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relation_ids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ha'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;relation_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;relation_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;clustered&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"yes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;paused&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_unit_paused_set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One alternative to services from the principal unit checks is to change
systemd.py in charm-nrpe to accept flag -w like the proposal for the
check_haproxy.py&lt;/p&gt;
&lt;p&gt;This way would not be necessary to remove the .cfg files for services from
the principal unit, but would be necessary to adapt the function
&lt;cite&gt;add_init_service_checks&lt;/cite&gt; to be able to accept services with the warning flag.&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;gabrielcocenza&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “pausing-charms-hacluster-no-false-alerts” for all patches
related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;pausing-charms-hacluster-no-false-alerts
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;charmhelpers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;nrpe.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check_haproxy.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-designate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nova-cloud-controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-openstack-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-swift-proxy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nrpe (Alternative)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;systemd.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-hacluster&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;actions.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git Repository is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;It will be necessary to document the impact of pausing/resuming a
subordinate hacluster and the side effect on Openstack API charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit and functional tests. For functional
tests, it will use a bundle with keystone, hacluster, nrpe and nagios.&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, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Align Prometheus metrics exporters to any LMA stack</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/prometheus-metrics-exporter.html</link><description>

&lt;p&gt;The main objective of this spec is to improve the observability of bind
and haproxy across the OpenStack Charms using Prometheus that is a popular
tool for metrics gathering. Currently, OpenStack charms (except Ceph) do not
support metrics gathering on their components.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The goal of this spec is to standardize the Juju interfaces required
(and their logic) on OpenStack charms in order to facilitate
Prometheus metrics collection (via Prometheus charms) and dashboards
exports (via Grafana charms), no matter which LMA stack is used.&lt;/p&gt;
&lt;p&gt;The alert rules that will be configured on prometheus for monitoring bind and
haproxy are not part of this scope.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;section id="prometheus-scrape-interface"&gt;
&lt;h3&gt;Prometheus-scrape interface&lt;/h3&gt;
&lt;p&gt;This interface is reactivated form the
&lt;a class="reference external" href="https://github.com/canonical/prometheus-k8s-operator/blob/main/lib/charms/prometheus_k8s/v0/prometheus_scrape.py"&gt;prometheus_scrape library&lt;/a&gt;,
which is used in the new &lt;a class="reference external" href="https://charmhub.io/topics/canonical-observability-stack"&gt;COS&lt;/a&gt;.
It is written for the Operator framework, so it will be necessary to wrap
&lt;cite&gt;MetricsEndpointConsumer(Object)&lt;/cite&gt; to &lt;cite&gt;PrometheusScrapeRequires(Endpoint)&lt;/cite&gt; and
&lt;cite&gt;MetricsEndpointProvider(Object)&lt;/cite&gt; to &lt;cite&gt;PrometheusScrapeProvides(Endpoint)&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;The interface &lt;a class="reference external" href="https://github.com/openstack-charmers/charm-interface-prometheus-scrape"&gt;charm-interface-prometheus-scrape&lt;/a&gt;
already implements the &lt;cite&gt;PrometheusScrapeProvides(Endpoint)&lt;/cite&gt; part and thus it
can be used to relate reactive charms with &lt;a class="reference external" href="https://github.com/canonical/prometheus-k8s-operator"&gt;prometheus-k8s-operator&lt;/a&gt;
charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bind"&gt;
&lt;h3&gt;Bind&lt;/h3&gt;
&lt;p&gt;BIND service does not support a built-in Prometheus metrics exporter.
However, this service can expose a statistics channel, used by the
bind-exporter to retrieve metrics to Prometheus
(see &lt;a class="reference external" href="https://github.com/prometheus-community/bind_exporter"&gt;bind-exporter service&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;To take advantage of the bind exporter, changes need to be made in the
charm designate-bind.&lt;/p&gt;
&lt;section id="charm-designate-bind"&gt;
&lt;h4&gt;Charm designate-bind&lt;/h4&gt;
&lt;p&gt;This charm needs to expose a statistics service for bind whenever it is related
with the prometheus charm.&lt;/p&gt;
&lt;p&gt;The &lt;cite&gt;stats.conf&lt;/cite&gt; will have the following content:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;statistics-channels {
  inet &amp;lt;stats-listen-net&amp;gt; port &amp;lt;stats-port&amp;gt; allow { &amp;lt;client-ip&amp;gt;; };
};
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where stats-listen-net, stats-port and client-ip default values are 127.0.0.1,
8053 and 127.0.0.1, respectively. This will open a statistics channel in bind
that &lt;cite&gt;prometheus_scrape interface&lt;/cite&gt; can expose metrics for prometheus to
collect.&lt;/p&gt;
&lt;p&gt;This new configuration file will be included at &lt;cite&gt;/etc/bind/named.conf&lt;/cite&gt;
appending the following content:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;include "/etc/bind/stats.conf";
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When prometheus is removed, it will trigger the reactive endpoint logic for
departed that will be responsible for removing the &lt;cite&gt;stats.conf&lt;/cite&gt;, &lt;cite&gt;named.conf&lt;/cite&gt;
files and removing it from the restart_map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration options&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;no configurations will be available. The charm will automatically configure
ports and listen network (localhost).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Relations:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The charm-designate-bind will support the &lt;cite&gt;prometheus_scrape interface&lt;/cite&gt;
to relate directly with prometheus charm and will have all the logic necessary
to install the &lt;a class="reference external" href="https://launchpad.net/prometheus-bind-exporter-snap"&gt;snap&lt;/a&gt;
responsible for the prometheus bind exporter. The charm will interact with the
snap by setting listen-address and stats-groups.&lt;/p&gt;
&lt;p&gt;Furthermore, charm-designate-bind would also relate to the Grafana charm
to share a rendered template with an optimized Grafana dashboard.&lt;/p&gt;
&lt;p&gt;Provides:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;bind-exporter:prometheus_scrape&lt;/strong&gt; - The relation connecting this charm with
the prometheus charm, while providing hostname and port through which it will
collect all the metrics in Prometheus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;grafana:grafana-dashboard&lt;/strong&gt; - The relation connecting this charm with the
Grafana charm and at the same time responsible for creating a new dashboard
from charm resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;a class="reference external" href="https://github.com/juju/charm-helpers/blob/bf9c2d83ed579ffb369abbb687fbdf2de62b4d54/charmhelpers/contrib/openstack/ha/utils.py#L353"&gt;render_grafana_dashboard&lt;/a&gt;
function from charmhelpers will be responsible for rendering the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;This charm requires no action&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="haproxy"&gt;
&lt;h3&gt;HAproxy&lt;/h3&gt;
&lt;p&gt;HAProxy enterprise Edition and from &lt;a class="reference external" href="https://www.haproxy.com/blog/haproxy-exposes-a-prometheus-metrics-endpoint/"&gt;version 2.0&lt;/a&gt;
also HAProxy community edition has built-in support to export metrics to
Prometheus via Prometheus exporter.&lt;/p&gt;
&lt;p&gt;To take advantage of the Prometheus exporter, changes need to be made in the
&lt;cite&gt;haproxy.cfg&lt;/cite&gt; file in the stats section.&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;listen stats&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;mode http&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;stats enable&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;bind {{ stats_exporter_host }}:{{ stats_exporter_port }}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;option http-use-htx&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;http-request use-service prometheus-exporter if { path /metrics }&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To see more information about &lt;cite&gt;stats_exporter_host&lt;/cite&gt; and
&lt;cite&gt;stats_exporter_port&lt;/cite&gt;, see the Charmhelpers &amp;gt;&amp;gt; &lt;cite&gt;haproxy.cfg&lt;/cite&gt; section below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For the legacy charms the implementation should be split into five parts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;editing &lt;cite&gt;haproxy.cfg&lt;/cite&gt; config file -  by &lt;cite&gt;charmhelpers&lt;/cite&gt; in classic charms
and by &lt;cite&gt;charms.openstack&lt;/cite&gt; for reactive charms (see section below)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rendering Grafana dashboard template - by &lt;cite&gt;charmhelpers&lt;/cite&gt; (see
section below)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adding configuration options - by charm itself&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adding and managing relations changes - by charm itself&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;providing Grafana dashboard template (JSON) - by charm itself via resource&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="charmhelpers"&gt;
&lt;h4&gt;Charmhelpers&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;haproxy.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The charmhelpers library implements the code responsible for creating the
context of &lt;cite&gt;haproxy.cfg&lt;/cite&gt;, because of that it will be also responsible for
adding parts needed to enable prometheus exporter. The prometheus exporter
will be enabled only if these conditions are met:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ubuntu Focal or above (haproxy version &amp;gt;= 2.0)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Haproxy-exporter relation exists&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If both conditions are satisfied, then two values will be needed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;stats_exporter_host&lt;/strong&gt; - obtain IP address from relation
(aka. using “get_relation_ip”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;stats_exporter_port&lt;/strong&gt; - obtain from “haproxy-exporter-stats-port”
(provided automatically by the charm)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: In reactive charms this can be done by charms.openstack instead
of charmhelpers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The dashboard template will be provided as a juju resource in a JSON file.
This way it’s not necessary to produce a release of charmhelpers library in
order to update the dashboard and gives more flexibility to edit the template
as necessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="charms"&gt;
&lt;h4&gt;Charms&lt;/h4&gt;
&lt;p&gt;The following charms will benefit from these changes, however the list may not
be considered exhaustive at the time of writing.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nova-cloud-controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-openstack-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-swift-proxy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-designate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-gateway&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-percona-cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-vault&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ironic-api&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configuration options&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No configurations will be available. The charm will configured
automatically the port to Prometheus exporter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Relations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Provides:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;haproxy-exporter:prometheus_scrape&lt;/strong&gt; - The relation connecting this charm
with the Prometheus charm, while providing hostname and port through which it
will collect all the metrics in Prometheus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;grafana:grafana-dashboard&lt;/strong&gt; - The relation connecting this charm with the
Grafana charm and at the same time responsible for creating a new dashboard
from charm resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;a class="reference external" href="https://github.com/juju/charm-helpers/blob/bf9c2d83ed579ffb369abbb687fbdf2de62b4d54/charmhelpers/contrib/openstack/ha/utils.py#L353"&gt;render_grafana_dashboard&lt;/a&gt;
function from charmhelpers will be responsible for rendering the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;No actions required.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&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://snapcraft.io/docs/go-plugin"&gt;https://snapcraft.io/docs/go-plugin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.haproxy.com/blog/haproxy-exposes-a-prometheus-metrics-endpoint/"&gt;https://www.haproxy.com/blog/haproxy-exposes-a-prometheus-metrics-endpoint/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&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:
- Robert Gildein &amp;lt;&lt;a class="reference external" href="mailto:robert.gildein%40canonical.com"&gt;robert&lt;span&gt;.&lt;/span&gt;gildein&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “prometheus-metrics-exporter” for all patches related
to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;prometheus-metrics-exporter
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The Proposed Change and Repositories sections describe the working items.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://launchpad.net/prometheus-haproxy-exporter-snap"&gt;prometheus-haproxy-exporter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://snapcraft.io/prometheus-bind-exporter"&gt;prometheus-bind-exporter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-interface-prometheus-scrape"&gt;charm-interface-prometheus-scrape&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-designate-bind"&gt;charm-designate-bind&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/juju/charm-helpers"&gt;charm-helpers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-hacluster"&gt;charm-hacluster&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ceilometer"&gt;charm-ceilometer&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ceph-radosgw"&gt;charm-ceph-radosgw&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-keystone"&gt;charm-keystone&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-neutron-api"&gt;charm-neutron-api&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-nova-cloud-controller"&gt;charm-nova-cloud-controller&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-openstack-dashboard"&gt;charm-openstack-dashboard&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-cinder"&gt;charm-cinder&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-glance"&gt;charm-glance&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-heat"&gt;charm-heat&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-swift-proxy"&gt;charm-swift-proxy&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-designate"&gt;charm-designate&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-neutron-gateway"&gt;charm-neutron-gateway&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-percona-cluster"&gt;charm-percona-cluster&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-designate-vault"&gt;charm-vault&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ironic-api"&gt;charm-ironic-api&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation on how to use prometheus-exporter for HAProxy and
prometheus-bind-exporter for BIND will be necessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests and functional test.
The functional test will be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Add support for managing Quorum Queues</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/rabbitmq-quorum-queue-support.html</link><description>

&lt;p&gt;The RabbitMQ project is moving away from classic queues n favour of quorum
queues (see &lt;a class="reference external" href="https://blog.rabbitmq.com/posts/2021/08/4.0-deprecation-announcements/"&gt;4_0_deprecations&lt;/a&gt;). Quorum queues provide greater data safety
and are based on the widely adopted &lt;a class="reference external" href="https://raft.github.io/"&gt;Raft consensus algorithm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OpenStack does not currently support creating quorum queues but there is
a change up for review to add support for them &lt;cite&gt;Oslo Messaging Quorum Queues&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;WARNING: There is not complete feature parity between classic queues and
quorum queues. For example quorum queues do not support message TTLs which
maybe an issue with notifications in OpenStack queues which often build up.
See &lt;cite&gt;_feature_comparison&lt;/cite&gt; for more details.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Quorum queues are available with RabbitMQ 3.8.0 or later (eg Focal). A
deployment using the existing rabbitmq-server charm on focal will already
support the creation of quorum queues. The replication of the queues needs
to be managed externally in the event that rabbitmq server cluster is
expanded or shrunk. This spec covers the features needed to manage
quorum queues throughout the rabbit clusters life-cycle. For example if a
rabbitmq-server unit is lost and it was hosting a mirror of a quorum
queue then a new mirror on another unit should be added.&lt;/p&gt;
&lt;p&gt;NOTE: When a client connects to rabbitmq-server via the amqp relation they
declare the vhost that they want access to. The rabbitmq-server charm ensures
the vhost exists and provides the client with credentials to use the vhost. It
is up to the client to create any queues it needs and it is at the point that
the queue is created that its type is defined.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add functionality to the peer joined, departed and broken hooks to rebalance
queues in the event of a peer being added or lost. These hooks will most
likely utilise the add_member, delete_member, grow and shrink options
to the rabbitmq-queues command.&lt;/p&gt;
&lt;p&gt;Charm actions to manually add or remove members from a quorum queue should
also be added to aid with pro-active maintenance of the cluster like taking
a unit down for maintenance.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Classic queues are still supported so an alternative would be to continue
to use them in all cases.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “quorum_queues” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;quorum_queues
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 functions to rabbit utils to identify all quorum queues across all
vhosts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add function to rabbit utils to report which nodes are hosting a queue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend peer departed hook to identify which queues have a mirror hosted on
the leaving node and for each queue add a mirror on another node if possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Report queues with insufficient mirrors in charms workload status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add actions to allow queues mirrors to be moved.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories needed&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Actions will need to be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add functional test to create quorum queues and check there are sufficient
replicas after cluster is shrunk and expanded.&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;For OpenStack to utilise quorum queues &lt;cite&gt;Oslo Messaging Quorum Queues&lt;/cite&gt; needs
to land and each OpenStack client charm will need to grow support for the
&lt;cite&gt;rabbit_quorum_queue&lt;/cite&gt; option.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Release Notes Migration to Reno</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/release-notes-migration-to-reno.html</link><description>

&lt;p&gt;The OpenStack Charms project has a ever increasing velocity with improvements
and new features being committed by disperse group of people each cycle.&lt;/p&gt;
&lt;p&gt;Currently we manage our release notes in a central document and it is typically
put together manually at the end of each cycle.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Putting together the release notes document involves manual labor and the
current process is error prone with high risk of leaving important information
out of the release notes at release time.&lt;/p&gt;
&lt;p&gt;The upstream OpenStack release process has been heavily automated in recent
cycles and we are currently barred from announcing our release notes to the new
release-announce mailing list.  Our repositories must be aligned with upstream
automated release tools to gain access.  Modernizing the way we do release
notes is one of the steps needed to accomplish this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To address these issues I propose we do a stepwise migration towards committing
release notes along with code changes throughout our charm repositories.&lt;/p&gt;
&lt;p&gt;Prior work we can make use of exists upstream in the Reno [0] project, with
developer tooling, linters and gate jobs. The use of this methodology and
tooling is widespread among other OpenStack projects.&lt;/p&gt;
&lt;p&gt;As a first step I propose we enable the use of reno on the following
repositories during the cycle leading up to the 18.11 Charm release:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nova-compute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the 18.11 Charm release we evaluate and decide on further adoption.&lt;/p&gt;
&lt;p&gt;0: &lt;a class="reference external" href="https://docs.openstack.org/reno/latest/"&gt;https://docs.openstack.org/reno/latest/&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None defined.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-reno” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-reno
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 necessary boiler plate for use with reno to affected charm repositories&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add tox environment that enables developer to run reno tooling from virtual
environment, relieving developer from the responsibility of installing and
maintaining it in their developer environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add tox environment that enables gating on existence and correctness of
release notes artifacts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Research ways to best coordinate and extract release notes artifacts from
multiple charm repositories and combine them in one (charm-guide) at release
time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create preliminary guidelines for use of developers and reviewers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories are needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Preliminary guidelines for use of developers and reviewers must be created.
Communication with the community is also necessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This change does not introduce any additional security risks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The process for creating release notes files and committing them with code
changes will be discussed with the community as it is implemented.&lt;/p&gt;
&lt;p&gt;Gate jobs checking for existence and correctness of the release notes will be
implemented.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Reno - &lt;a class="reference external" href="https://docs.openstack.org/reno/latest/"&gt;https://docs.openstack.org/reno/latest/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Service Discovery</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/service-discovery.html</link><description>

&lt;p&gt;Many optional services may now be deployed as part of an OpenStack Cloud,
with each service having a different optional features that may or may
not be enabled as part of a deployment.&lt;/p&gt;
&lt;p&gt;Charms need a way to discover this information so that services can be
correctly configured for the options chosen by the charm user.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Charms need to be able to determine what other services are deployed
within an OpenStack Cloud so that features can be enabled/disabled as
appropriate.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;notifications for ceilometer (really don’t want notifications enabled
when ceilometer is not deployed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;misc panels within the openstack dashboard (fwaas, lbaas, l3ha, dvr
etc… for neutron).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notifications for designate (disable when designate is not deployed).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Services and features of services are determined by the API endpoint
charms that register them into the service catalog via the keystone charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The keystone charm will expose a new provides interface ‘cloud-services’
which is a rich-ish description of the services deployed with registered
endpoints.&lt;/p&gt;
&lt;p&gt;The identity-service relations would also advertise the same data as the
cloud-services relations so that charms already related to keystone don’t
have to double relate (identity-service is a superset of cloud-services).&lt;/p&gt;
&lt;p&gt;By default, a registered endpoint of type ‘A’ will result in service type
‘A’ being listed as part of the deployed cloud on this interface.&lt;/p&gt;
&lt;p&gt;Services may also enrich this data by providing ‘features’ (optional)
alongside their endpoint registration - these will be exposed on the
cloud-service and identity-service relations.&lt;/p&gt;
&lt;p&gt;Data will look something like (populated with real examples - key and
proposed values):&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;services&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;'object-store'&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;'network'&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;'volumev2'&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;'compute'&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;'metering'&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;'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="s"&gt;'orchestration'&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;'dns'&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;Example - advertise features supported by the networking service, allowing
features to be enabled automatically in the dashboard:&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;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="s"&gt;'dvr'&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;'fwaas'&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;'lbaasv2'&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;'l3ha'&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;Example - allow ceilometer to know that the deployed object-store is radosgw
rather than swift:&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;object-store&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;'radosgw'&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;Values will be parseable as a json/yaml formatted list.&lt;/p&gt;
&lt;p&gt;By using the basic primitive of tags, we get alot of flexibility with
type/feature being easily express-able.&lt;/p&gt;
&lt;p&gt;Interface will be eventually consistent in clustered deployments -
all keystone units will present the same data.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Each charm could query the keystone service catalog; however this is very
much a point in time check, and the service catalog may change after the
query has been made. In addition the keystone service catalog does not
have details on what optional features each service type may have enabled
and keystone services will be restarted during deployment as clusters
get built out etc.&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;james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “service-discovery” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;service-discovery
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Core (keystone charm):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add cloud-services relation to keystone charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add service and feature discover handler to keystone charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update keystone interface to advertise services and features in
keystone charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create cloud-services reactive interface&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enablement:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update ceilometer charm for radosgw discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update openstack-dashboard charm to automatically enable panels
for deployed services and features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm for designate discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update cinder charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update glance charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update radosgw charm to advertise ‘radosgw’ feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm to advertise networking features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This change is internal for use across the OpenStack charms, no documentation
updates are required for end-users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security implications for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Implementation will include unit tests for all new code written; amulet
function tests will be updated to ensure that feature is being implemented
correctly across the charm set.&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 external dependencies&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Extended Swift Cluster Operations</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/swift-extended-cluster-operations.html</link><description>

&lt;p&gt;The Swift charms currently support a subset of operations required to support
a Swift cluster over time. This spec proposes expanding on what we already have
in order to support more crucial operations such as reconfiguring the
rings post-deployment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;To deploy a Swift object store using the OpenStack charms you are required to
deploy both the swift-proxy and swift-storage charms. The swift-proxy charm
performs two key roles - running the api endpoint service and managing the
rings - while the swift-storage charm is responsible for the running the swift
object store services (account, container, object).&lt;/p&gt;
&lt;p&gt;As they stand, these charms currently support a base set of what is required to
effectively maintain a Swift cluster over time:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;deploy swift cluster with configurable min-part-hours, replica count,
partition-power and block storage devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;once deployed the only changes that can be made are the addition of
block devices and modification of min-part-hours. Changes to
partition-power or replicas are ignored by the charm once the rings
have already been initialised.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This forces operators to manually apply changes like adjusting the
partition-power to accommodate for additional storage added to the cluster.
This poses great risk since manually editing the rings/builders and syncing
them across the cluster could easily conflict with the swift-proxy charm’s
native support for doing this resulting in a broken cluster.&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 here is to extend the charm support for ring management in order
to be able to support making changes to partition-power, replicas and possibly
others and have the charm safely and automatically apply these changes and
distribute aross the cluster.&lt;/p&gt;
&lt;p&gt;Currently we check whether the rings are already initialised and if they are
we ignore the partition power and replica count configured in the charm i.e.
changes are not applied. To make it possible to do this we will need to remove
these blocks and implement the steps documented in [0] and [1]. I also propose
that charm impose a cluster size limit (number of devices) above which we
refuse to make changes until the operator has paused the swift-proxy units i.e.
placed them into “maintenance mode” which will shutdown the api services and
block any restarts until the units are resumed. The user will also have the
option to set disable-ring-balance=true if they want check that their changes
have been applied successfully (to the builder files) prior to having the rings
rebuilt and sycned across the cluster.&lt;/p&gt;
&lt;p&gt;For the swift-storage charms, where currently one can only add devices but not
remove, the proposal is to support removing devices. This will entail
messaging the swift-proxy on the storage relation which an updated list of
devices and a new setting ‘purge-missing-devices’ to instruct the swift-proxy
to remove devices from the ring that are no longer configured. We will also
need to ensure that the device cache located on the swift-storage unit from
which we are removing a device is also updated to no longer include the
device since not doing so would block the device from being re-added in the
future. As an extension to this we should also extend the
swift-storage-relation-broken to support removing devices associated with that
unit/host from the rings and sycning these changes across the cluster.&lt;/p&gt;
&lt;p&gt;[0] &lt;a class="reference external" href="https://docs.openstack.org/swift/latest/ring_partpower.html"&gt;https://docs.openstack.org/swift/latest/ring_partpower.html&lt;/a&gt;
[1] &lt;a class="reference external" href="https://docs.openstack.org/swift/latest/admin/objectstorage-ringbuilder.html#replica-counts"&gt;https://docs.openstack.org/swift/latest/admin/objectstorage-ringbuilder.html#replica-counts&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Juju charm actions are another way to implement operational actions to be
performed on the cluster but do not necessarily fit all cases. Since ring
management is at the core of the existing charm (hook) code itself, the
proposal is to extend this code rather than move and rewrite it as an action.
However, there will likely be a need for some actions to be defined as
post-modification checks and cleanups which would be well suited to an
action and not directly depend on the charm ring manager.&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;hopem&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic swift-charm-extended-operations for all patches related to
this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;swift-charm-extended-operations
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 modifying partition-power&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for modifying replicas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for removing devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for removing an entire swift-storage host&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;All of the above additions will need to be properly documented in the charm
deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Each additional level of support will need very thorough testing against a
real Swift object deployed with the charms that contains data and is of a
reasonable scale. All code changes will be accompanied by unit tests and
where possible functional tests.&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, 26 Oct 2023 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 Oct 2023 00:00:00 </pubDate></item><item><title>Ceph RADOS Gateway (RGW) Multi-site Sync Policies</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/ceph-radosgw-multisite-sync-policies.html</link><description>

&lt;p&gt;Multi-site sync policies provide fine-grained control of data movement
between buckets in different zones. The sync policy can be configured at the
zonegroup level, but it can also be configured at the bucket level.&lt;/p&gt;
&lt;p&gt;By default, no sync policies are configured in the multi-site scenario, and
all the buckets are synced from the primary zone to the secondary zones.&lt;/p&gt;
&lt;p&gt;The goal is to allow selective sync of buckets between zones. This is
important, for security purposes, when configuring secondary zones in
the multi-site scenario.&lt;/p&gt;
&lt;p&gt;More info about multi-site sync policies here:
&lt;a class="reference external" href="https://docs.ceph.com/en/latest/radosgw/multisite-sync-policy"&gt;https://docs.ceph.com/en/latest/radosgw/multisite-sync-policy&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The current &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm does not support configuration of multi-site
sync policies. At the moment, we do not have the option to stop particular
buckets syncing from primary zone to secondary zones.&lt;/p&gt;
&lt;p&gt;Adding sync policies to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm will give us more control
over how the data is synced from primary RGW zone to secondary RGW zones. This
can be generally useful for syncing only essential buckets to the secondary
cluster. It is particularly valuable for one-way data synchronizations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Allow configuration of a default zonegroup sync policy.&lt;/p&gt;
&lt;p&gt;This would allow all the buckets sync disabled by default, in the zonegroup.
And, for particular buckets, having the possibility to enable syncing to
secondary zones via bucket level sync policies. This is very useful when
having selective data sync to secondary RGW zones.&lt;/p&gt;
&lt;p&gt;By default, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm will not configure any sync policies
to maintain backwards compatibility with the existing functionality.&lt;/p&gt;
&lt;p&gt;Sync policies can be created by the command &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-admin&lt;/span&gt; &lt;span class="pre"&gt;sync&lt;/span&gt; &lt;span class="pre"&gt;group&lt;/span&gt;
&lt;span class="pre"&gt;create&lt;/span&gt;&lt;/code&gt;. A sync policy group can be in three states:&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;enabled&lt;/span&gt;&lt;/code&gt;, sync is allowed and enabled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;allowed&lt;/span&gt;&lt;/code&gt;, sync is allowed (but not enabled).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;forbidden&lt;/span&gt;&lt;/code&gt;, sync is not allowed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the sync policy group, we need to configure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;data-flows, via command &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-admin&lt;/span&gt; &lt;span class="pre"&gt;sync&lt;/span&gt; &lt;span class="pre"&gt;group&lt;/span&gt; &lt;span class="pre"&gt;flow&lt;/span&gt; &lt;span class="pre"&gt;create&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pipes, via command &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-admin&lt;/span&gt; &lt;span class="pre"&gt;sync&lt;/span&gt; &lt;span class="pre"&gt;group&lt;/span&gt; &lt;span class="pre"&gt;pipe&lt;/span&gt; &lt;span class="pre"&gt;create&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A data-flow defines the flow of data between the different zones, and it can
define:&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;symmetrical&lt;/span&gt;&lt;/code&gt; data flow, in which multiple zones sync data from each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;directional&lt;/span&gt;&lt;/code&gt; data flow, in which the data moves in one way from one zone
to another.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A pipe defines the actual buckets that can use these data flows, and the
properties that are associated with it (for example: source object prefix).&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;p&gt;Two new configs will be added to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm:&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;sync-policy-state&lt;/span&gt;&lt;/code&gt;, allows to configure the state of the default sync
policy group (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enabled&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;allowed&lt;/span&gt;&lt;/code&gt;, or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;forbidden&lt;/span&gt;&lt;/code&gt;). This will be
configured in the primary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; application, and it will dictate
the default zonegroup sync policy. This config will be empty, by default.
If it’s empty, sync policies are not configured in the zonegroup. This way,
we maintain backwards compatibility with the existing functionality of the
charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-flow-type&lt;/span&gt;&lt;/code&gt;, defines the data flow type that will be
configured in the default sync policy group between primary zone and a
secondary zone. This config will be &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;symmetrical&lt;/span&gt;&lt;/code&gt; by default, and it is
used only when the primary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; application has config option
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-state&lt;/span&gt;&lt;/code&gt; non-empty, and multi-site sync policies are configured.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implement the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;primary-relation-changed&lt;/span&gt;&lt;/code&gt; hook, where we configure the
default sync policy (if the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-state&lt;/span&gt;&lt;/code&gt; config is set). If the
default policy is created:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A data flow with each secondary zone is configured. The data flow type is
obtained from the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-flow-type&lt;/span&gt;&lt;/code&gt; config passed on the relation
data by the secondary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A pipe with each secondary zone is configured. The pipe allows all the
buckets to use the previously defined data flow.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three Juju actions will be added to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm:&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;enable-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to enable
sync with bucket level sync policy. This is meant to be used in conjunction
with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;allowed&lt;/span&gt;&lt;/code&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-state&lt;/span&gt;&lt;/code&gt; config, which allows buckets syncing,
but it’s disabled by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;disable-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to forbid
sync with bucket level sync policy. This is useful when you want to disable
syncing for some buckets only, regardless of the default zonegroup sync
policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;reset-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to reset
bucket level sync policy. After this is executed, the buckets will be synced
according to the default zonegroup sync policy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the Juju actions are executed on the primary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; application,
any bucket level sync policies are automatically propagated from the primary
RGW site to all the secondary RGW sites.&lt;/p&gt;
&lt;p&gt;On the other hand, if we execute the Juju actions on the secondary
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; applications, the bucket level sync policies are not
propagated to any other RGW site.&lt;/p&gt;
&lt;p&gt;All these new Juju actions can be executed only on the primary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt;
application. They will fail if they are executed on the secondary
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; applications.&lt;/p&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee: ionutbalutoiu&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-radosgw-multisite-sync-policies” for all patches
related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw-multisite-sync-policies
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 two new charm configs to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-state&lt;/span&gt;&lt;/code&gt;, which allows to configure the state of the default
sync policy group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-policy-flow-type&lt;/span&gt;&lt;/code&gt;, defines the type of data flow that will be
configured in the default sync policy group between the primary zone and a
secondary zone.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;primary-relation-changed&lt;/span&gt;&lt;/code&gt; hook with all the details
described in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Implementation&lt;/span&gt;&lt;/code&gt; section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add three Juju actions to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to enable
sync with bucket level sync policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;disable-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to forbid
sync with bucket level sync policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;reset-buckets-sync&lt;/span&gt;&lt;/code&gt;, takes a comma-separated list of buckets to reset
bucket level sync policy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ceph-radosgw"&gt;https://opendev.org/openstack/charm-ceph-radosgw&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The new charm configs, and Juju actions will be documented in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm.&lt;/p&gt;
&lt;p&gt;Also, additional documentation to charm deployment guide should be added for
the new optional multi-site sync policies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;If used, this will improve the security of multi-site Ceph RGW deployment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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 new dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 25 Oct 2023 00:00:00 </pubDate></item><item><title>Unify ceph nova-compute credentials</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/approved/unify-ceph-nova-compute-credentials.html</link><description>

&lt;p&gt;Ceph credentials should be the same across all nova-compute charm apps
to allow live-migration of VMs booted from image (and stored in ceph
via use of libvirt-image-backend=rbd config) to succeed.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently every nova-compute charm app registers a ceph credential named
after the charm app itself. Therefore, if a cloud has two nova-compute charm
apps named nova-compute-haswell and nova-compute-skylake, then their ceph
credentials will be the respective names.&lt;/p&gt;
&lt;p&gt;The result of this is that live-migrating a VM booted from image where both
nova-compute charm apps have been configured to use libvirt-image-backend=rbd
(resulting in the image being stored in ceph) fails because the libvirt XML
for the instance will have the ceph credential and key associated with the
name on the source, to which the destination does not possess the key to access
the image, resulting in a failed migration due to permission denied error, as
documented in &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;In order to solve the problem, all nova-compute charm apps need to have access
to the same ceph credentials and by extent, to the same key, allowing
credentials specified in the libvirt XML to be compatible with both the host
and destination.&lt;/p&gt;
&lt;p&gt;To achieve that, it is necessary to move away from having ceph credentials
deriving their name from the nova-compute charm app names. Here we propose
a new name to be a common one between all of
them: ‘nova-compute-ceph-auth-&amp;lt;secret-uuid-first-block&amp;gt;’.&lt;/p&gt;
&lt;p&gt;There are many reasons for choosing the above-mentioned new credentials name:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;As part of the name transition, it is necessary to make changes to the
libvirt secret entry. The secret entry in libvirt consists of:&lt;/p&gt;
&lt;p&gt;secret UUID - name/usage - key&lt;/p&gt;
&lt;p&gt;For each registered libvirt secret, we can only update the key. In order
to allow continued function of existing VMs as we upgrade the charms
performing the credential transition, we cannot delete and replace the
entire secret. It is necessary then to add a new secret with the new
credentials and new UUID, while also preserving the old secret.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The upgrade path from the old name to the new name is simpler if every
single existing name is handled as old. For example, if we chose
‘nova-compute’ to be the new name, then deployments that had nova-compute
charm apps named ‘nova-compute’ would need to be handled differently. The
main technical difficulty of this approach is again, the libvirt secret
management limitations, preventing us from adding a new libvirt secret
with the same name and a new UUID, nor can we achieve the desired
functionality while avoiding the need of adding a new secret UUID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Having a credential name that is very unlikely to clash with any
charm app name avoids the situation described above. By using the first
block of the secret UUID in the credential name we also make it easier to
identify the credential as being the new one. If more credential names are
required to be performed in the future, by following this pattern we can
easily have versioning between them.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="charm-impact"&gt;
&lt;h3&gt;Charm Impact&lt;/h3&gt;
&lt;p&gt;Only the nova-compute charm is affected by the code changes. The ceph-mon
charm does not require code changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="upgrade-impact"&gt;
&lt;h3&gt;Upgrade Impact&lt;/h3&gt;
&lt;p&gt;On upgrade, transitioning from old credentials to new credentials consists of:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Every nova-compute unit needs to send the new application-name to
ceph-mon. Ceph-mon will then register the new credential when receiving
it for the first time (subsequent receipt of the new application-name
will not need to re-register the new credentials, as they would already
exist) and send back the key of the new credentials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nova-compute units, upon receiving the updated key, will rewrite the
config files with the new credentials, keys and UUID, and invoke libvirt
to register the new secret. New VMs created from this point onwards will
use the new credentials.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The nova-compute units will retain their old credentials key file in their
/etc/ceph folder and registered in libvirt, so existing workloads are not
affected and allows the units to be able to receive live-migration of
non-rebooted instances.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="existing-workloads-impact"&gt;
&lt;h3&gt;Existing Workloads Impact&lt;/h3&gt;
&lt;p&gt;Existing running VMs will have their old credentials declared in their
libvirt XML and continue to run fine as the old credentials as retained.
A full power cycle of those VMs is required to update their libvirt XML
and switch to the new credentials. Those VMs cannot be migrated to
nova-compute nodes operated by different nova-compute charm apps until
rebooted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="scale-out-impact"&gt;
&lt;h3&gt;Scale-out Impact&lt;/h3&gt;
&lt;p&gt;New nodes deployed with the updated charm need to install both old and new
credentials. To achieve this, the nova-compute code will need to send the old
application-name on ceph-relation-joined, then upon successful configuration
of the old credential, send the new application-name and trigger the upgrade
path. The end result is that a newly deployed node will have both old and new
credentials and can receive migration of non-rebooted VMs that are still using
the old credentials. This was a concern already pointed out by &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;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="revert-downgrade-possibility"&gt;
&lt;h3&gt;Revert/Downgrade Possibility&lt;/h3&gt;
&lt;p&gt;Unfortunately, downgrading and reverting the changes in case something
unexpected happens is not smooth, but is fairly straightforward. The
main problem is that the current code does not have a way to re-send
the application-name to ceph-mon outside of the ceph-relation-joined hook
function, so this information has to be exchanged manually through the
juju relation-set command. This is enough to revert all the changes.&lt;/p&gt;
&lt;p&gt;If something went wrong during the upgrade or downgrade, then libvirt secrets
may need to be manually maintained to address a potential error or conflict of
names, UUID, or re-set the keys.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="charm-configuration-options"&gt;
&lt;h3&gt;Charm Configuration Options&lt;/h3&gt;
&lt;p&gt;No charm config options are affected or have to be added for this change.
The change, however, only affects users that have the config
libvir-image-backend set to ‘rbd’.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="configuration-files"&gt;
&lt;h3&gt;Configuration Files&lt;/h3&gt;
&lt;p&gt;The config files are affected in the following way:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;/etc/ceph/secret.xml&lt;/em&gt; - This file will be updated to have the new UUID
and credential name. It is only used for the secret to be registered in
libvirt once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;/etc/ceph/ceph.client.nova-compute-ceph-auth-&amp;lt;secret-uuid-first-block&amp;gt;&lt;/em&gt; -
This file will be added with the key for the new credentials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;/etc/nova/nova.conf&lt;/em&gt; - The properties rbd_user and rbd_secret_uuid will be
updated with the new credentials and UUID respectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="non-charm-configuration"&gt;
&lt;h3&gt;Non-Charm Configuration&lt;/h3&gt;
&lt;p&gt;The relation-data changes between the nova-compute and ceph charms affect
the following 2 fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;application_name&lt;/em&gt; - Ceph-mon will receive the application name
nova-compute-ceph-auth-&amp;lt;secret-uuid-first-block&amp;gt; instead of the
nova-compute charm app name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;key&lt;/em&gt; - Nova-compute will receive the new credential’s key instead of the
old credential’s key.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="openstack-versions"&gt;
&lt;h3&gt;OpenStack Versions&lt;/h3&gt;
&lt;p&gt;This feature will be enabled for Yoga and newer OpenStack releases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="operating-system-versions"&gt;
&lt;h3&gt;Operating System Versions&lt;/h3&gt;
&lt;p&gt;This feature will be enabled for Ubuntu 20.04 (focal) and newer Ubuntu
releases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="juju-version-dependencies"&gt;
&lt;h3&gt;Juju Version Dependencies&lt;/h3&gt;
&lt;p&gt;This feature has no dependency on Juju versions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;A design alternative is possible to achieve the same result, although
with some advantages and disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Change the relation-data to exchange a dictionary containing all
nova-compute charm app names and keys between all nova-compute units. To
achieve this, either the nova-cloud-controller needs to be involved (as it
already currently is for exchanging SSH keys), or a new relation needs to be
created between nova-compute between different charm apps. This alternative
requires more code changes and relation data structure changes, but the end
result is generally more consistent and resilient against unexpected
behavior, such as hook errors or hooks running out of order.&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;ganso&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “lp2028559” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;lp2028559
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories are required for this work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;As part of this effort, the following documentation will need to be updated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Charm Guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Release Notes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The changes required in the charm do not introduce any additional security
implications beyond the security requirements and compromises already in place.&lt;/p&gt;
&lt;p&gt;The extra credentials in ceph and extra keys in nova-compute are subject to the
same vulnerability as the existing credentials and keys.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests and functional tests will be implemented for this feature. The
functional tests will validate whether the nova-compute nodes have
credential files for both the name derived from their charm app name, and
the new proposed unique name.&lt;/p&gt;
&lt;p&gt;Currently there are not multiple nova-compute charm apps configured in
the CI, nor their presence supported by the functional tests code, nor any
live-migration tests. As future work there could be live-migration tests
across different nova-compute charm apps.&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 code changes in nova-compute charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional tests to zaza-openstack-tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide user documentation on impact of 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;No hardware, software or version dependencies are required for this change
to be functional.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&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://launchpad.net/bugs/2028559"&gt;https://launchpad.net/bugs/2028559&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://launchpad.net/bugs/2037003"&gt;https://launchpad.net/bugs/2037003&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
</description><pubDate>Tue, 24 Oct 2023 00:00:00 </pubDate></item><item><title>Ceph RADOS Gateway (RGW) Cloud Sync</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2024.1/backlog/ceph-radosgw-cloud-sync.html</link><description>

&lt;p&gt;Ceph RGW has a module called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Cloud&lt;/span&gt; &lt;span class="pre"&gt;Sync&lt;/span&gt;&lt;/code&gt; which allows syncing zone data to
a remote cloud service. The sync is unidirectional, data is not synced back
from the remote zone. The goal of this module is to enable syncing data to
multiple cloud providers. The currently supported cloud providers are those
that are compatible with AWS (S3).&lt;/p&gt;
&lt;p&gt;More info about Ceph &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Cloud&lt;/span&gt; &lt;span class="pre"&gt;Sync&lt;/span&gt;&lt;/code&gt; here:
&lt;a class="reference external" href="https://docs.ceph.com/en/latest/radosgw/cloud-sync-module"&gt;https://docs.ceph.com/en/latest/radosgw/cloud-sync-module&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Cloud&lt;/span&gt; &lt;span class="pre"&gt;Sync&lt;/span&gt;&lt;/code&gt; module is built atop of the multi-site framework that allows
for forwarding data and metadata to a different external tier.&lt;/p&gt;
&lt;p&gt;More info about Ceph sync modules here:
&lt;a class="reference external" href="https://docs.ceph.com/en/quincy/radosgw/sync-modules"&gt;https://docs.ceph.com/en/quincy/radosgw/sync-modules&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The current &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm does not support the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; module.
Given the fact that the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; module is built atop of the multi-site
framework, we can leverage the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-multisite&lt;/span&gt;&lt;/code&gt; Juju relation
interface.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; module is enabled via a new relation with the primary
ceph-radosgw application. The deployment is similar with the existing RGW
multi-site replication steps:
&lt;a class="reference external" href="https://ubuntu.com/ceph/docs/setting-up-multi-site"&gt;https://ubuntu.com/ceph/docs/setting-up-multi-site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only differences being:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Both &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;primary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;secondary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; (with the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; enabled zone) are related to the same Ceph cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When data is replicated from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;primary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; zone, the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;secondary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; zone will write into a remote S3, instead of Ceph
storage. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;secondary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; zone will have the appropriate S3
credentials configured for this task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data sync is unidirectional, therefore the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;secondary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; zone
will be read-only.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More info about how to configure the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; module here:
&lt;a class="reference external" href="https://docs.ceph.com/en/latest/radosgw/cloud-sync-module/#how-to-configure"&gt;https://docs.ceph.com/en/latest/radosgw/cloud-sync-module/#how-to-configure&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 a new relation, called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt;, to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm. The
new relation will implement the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-multisite&lt;/span&gt;&lt;/code&gt; relation
interface.&lt;/p&gt;
&lt;p&gt;In the new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; relation, when the secondary multi-site secondary
zone is created, we need to pass &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--tier-type=cloud&lt;/span&gt;&lt;/code&gt; to the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-admin&lt;/span&gt; &lt;span class="pre"&gt;zone&lt;/span&gt; &lt;span class="pre"&gt;create&lt;/span&gt;&lt;/code&gt; command in order to have the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt;
module enabled. Besides this, we need to add the S3 target credentials via
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--tier-config&lt;/span&gt;&lt;/code&gt; parameter of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-admin&lt;/span&gt; &lt;span class="pre"&gt;zone&lt;/span&gt; &lt;span class="pre"&gt;modify&lt;/span&gt;&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;These steps are documented at:
&lt;a class="reference external" href="https://docs.ceph.com/en/latest/radosgw/cloud-sync-module"&gt;https://docs.ceph.com/en/latest/radosgw/cloud-sync-module&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Ceph &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; module allows multiple S3 targets to be configured in
the same zone tier config. For this, we have &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;profiles&lt;/span&gt;&lt;/code&gt; in the tier config.
Each profile maps a single source bucket (or multiple buckets via prefix) to
one S3 destination (Many-To-One mapping). The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;profiles&lt;/span&gt;&lt;/code&gt; in the tier config
are optional.&lt;/p&gt;
&lt;p&gt;A profile contains info about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;source_bucket&lt;/span&gt;&lt;/code&gt;, either a bucket name, or a bucket prefix (if ends with
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt;) that defines the source bucket(s) for this profile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;target_path&lt;/span&gt;&lt;/code&gt;, a string that defines how the target path is created. The
target path specifies a prefix to which the source object name is appended. The
target path is configurable, and it can include any of the following variables:&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;$sid&lt;/span&gt;&lt;/code&gt;: unique string that represents the sync instance 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;$zonegroup&lt;/span&gt;&lt;/code&gt;: the zonegroup name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;$zonegroup_id&lt;/span&gt;&lt;/code&gt;: the zonegroup 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;$zone&lt;/span&gt;&lt;/code&gt;: the zone name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;$zone_id&lt;/span&gt;&lt;/code&gt;: the zone 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;$bucket&lt;/span&gt;&lt;/code&gt;: source bucket name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;$owner&lt;/span&gt;&lt;/code&gt;: source bucket owner ID&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;target_path&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;rgwx-${zone}-${sid}/${owner}/${bucket}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;connection_id&lt;/span&gt;&lt;/code&gt;, ID of the connection (with credentials) that will be used
for this profile.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new charm config, called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-target-path&lt;/span&gt;&lt;/code&gt;, will be added
to configure the target path for all the profiles. This allows a consistent
target path for the configured &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; zone.&lt;/p&gt;
&lt;p&gt;The profiles are configured through the use of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; Juju applications
together with the new config option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-target-path&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is mandatory to have a default S3 target for all the buckets that don’t
have a profile configured. The rationale is that every bucket needs to have
a sync target, and the default target is the fallback for any bucket that
doesn’t have a profile configured. A new charm config will be added, called
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-default-s3-target&lt;/span&gt;&lt;/code&gt; for this purpose.&lt;/p&gt;
&lt;p&gt;It is obvious that we need to handle S3 credentials for the S3 targets
configured in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; zone. For this purpose, we will use the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; charm (&lt;a class="reference external" href="https://github.com/canonical/s3-integrator"&gt;https://github.com/canonical/s3-integrator&lt;/a&gt;). The
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm will have new relation with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt;
charm.&lt;/p&gt;
&lt;p&gt;Each deployed application of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; charm will handle
credentials for a single S3 target. When relating multiple &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt;
applications to the same &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;secondary-ceph-radosgw&lt;/span&gt;&lt;/code&gt; cloud-sync application,
the tier config will be updated with profiles for each S3 target.&lt;/p&gt;
&lt;p&gt;For example, the following Juju deployment commands:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Assuming ceph-mon is already deployed&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
juju&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw&lt;span class="w"&gt; &lt;/span&gt;primary-ceph-radosgw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;realm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zonegroup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;east&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;primary

juju&lt;span class="w"&gt; &lt;/span&gt;relate&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw:mon&lt;span class="w"&gt; &lt;/span&gt;ceph-mon:radosgw

juju&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw&lt;span class="w"&gt; &lt;/span&gt;secondary-ceph-radosgw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;realm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zonegroup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;east&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;primary-cloud-sync&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'cloud-sync-target-path=${bucket}'&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;--config&lt;span class="w"&gt; &lt;/span&gt;cloud-sync-default-s3-target&lt;span class="o"&gt;=&lt;/span&gt;minio-dev

juju&lt;span class="w"&gt; &lt;/span&gt;relate&lt;span class="w"&gt; &lt;/span&gt;secondary-ceph-radosgw:mon&lt;span class="w"&gt; &lt;/span&gt;ceph-mon:radosgw

juju&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;s3-integrator&lt;span class="w"&gt; &lt;/span&gt;minio-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://10.7.133.248:9000&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;s3-uri-style&lt;span class="o"&gt;=&lt;/span&gt;path

juju&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;s3-integrator&lt;span class="w"&gt; &lt;/span&gt;minio-production&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://10.7.133.250:9000&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;s3-uri-style&lt;span class="o"&gt;=&lt;/span&gt;path&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'bucket=production*'&lt;/span&gt;

juju&lt;span class="w"&gt; &lt;/span&gt;relate&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw-cloud-sync:s3-credentials&lt;span class="w"&gt; &lt;/span&gt;minio-dev:s3-credentials
juju&lt;span class="w"&gt; &lt;/span&gt;relate&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw-cloud-sync:s3-credentials&lt;span class="w"&gt; &lt;/span&gt;minio-production:s3-credentials

&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# After all applications' units are idle&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
juju&lt;span class="w"&gt; &lt;/span&gt;relate&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw-cloud-sync:cloud-sync&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw:primary

juju&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;minio-dev/leader&lt;span class="w"&gt; &lt;/span&gt;sync-s3-credentials&lt;span class="w"&gt; &lt;/span&gt;--string-args&lt;span class="w"&gt; &lt;/span&gt;access-key&lt;span class="o"&gt;=&lt;/span&gt;MY_DEV_ACCESS_KEY&lt;span class="w"&gt; &lt;/span&gt;secret-key&lt;span class="o"&gt;=&lt;/span&gt;MY_DEV_SECRET_KEY
juju&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;minio-production/leader&lt;span class="w"&gt; &lt;/span&gt;sync-s3-credentials&lt;span class="w"&gt; &lt;/span&gt;--string-args&lt;span class="w"&gt; &lt;/span&gt;access-key&lt;span class="o"&gt;=&lt;/span&gt;MY_PROD_ACCESS_KEY&lt;span class="w"&gt; &lt;/span&gt;secret-key&lt;span class="o"&gt;=&lt;/span&gt;MY_PROD_SECRET_KEY
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will render the following tier config in the cloud sync zone:&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="c1"&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="s2"&gt;"primary-cloud-sync"&lt;/span&gt;&lt;span class="p"&gt;,&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="nt"&gt;"tier_config"&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;"connections"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minio-dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://10.7.133.248:9000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-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;"host_style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"access_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MY_DEV_ACCESS_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MY_DEV_SECRET_KEY"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minio-production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://10.7.133.250:9000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"host_style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"access_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MY_PROD_ACCESS_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MY_PROD_SECRET_KEY"&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;"profiles"&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;"connection_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minio-production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;"source_bucket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production*"&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_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${bucket}"&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;"connection_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minio-dev"&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_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${bucket}"&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="c1"&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;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: ionutbalutoiu&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-radosgw-cloud-sync” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ceph-radosgw-cloud-sync
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Add two new charm configs to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt;:&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;cloud-sync-default-s3-target&lt;/span&gt;&lt;/code&gt;, the default S3 target for buckets that
don’t have a profile configured in the tier config.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-target-path&lt;/span&gt;&lt;/code&gt;, string that defines how the target path is
created. The target path specifies a prefix to which the source object
name is appended.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new relation called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm.
The new relation implements the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw-multisite&lt;/span&gt;&lt;/code&gt; interface.
The cloud-sync secondary zone will be configured with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--tier-type=cloud&lt;/span&gt;&lt;/code&gt;,
and connection info for the S3 targets will be fetched from the relation
with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; charm.&lt;/p&gt;
&lt;p&gt;When the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; relation is established, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt;
cloud-sync application will be blocked until a relation with the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; application is created, which provides S3 credentials for
the configured &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-default-s3-target&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new relation called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-credentials&lt;/span&gt;&lt;/code&gt;, implementing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3&lt;/span&gt;&lt;/code&gt; interface,
used to fetch S3 credentials for each S3 target in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; tier
config.&lt;/p&gt;
&lt;p&gt;The name of related &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-integrator&lt;/span&gt;&lt;/code&gt; application will be used as the
profile name configured in the tier config. From the relation data, we also
fetch the source bucket(s) for each profile.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ceph-radosgw"&gt;https://opendev.org/openstack/charm-ceph-radosgw&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The config options (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-default-s3-target&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync-target-path&lt;/span&gt;&lt;/code&gt;) will be documented in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt; charm.&lt;/p&gt;
&lt;p&gt;Also, additional documentation to charm deployment guide should be added for
the new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-sync&lt;/span&gt;&lt;/code&gt; relation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-radosgw&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Ceph &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Cloud&lt;/span&gt; &lt;span class="pre"&gt;Sync&lt;/span&gt;&lt;/code&gt; module requires S3 connection credentials for the
configured S3 targets. These credentials are fetched from the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3-credentials&lt;/span&gt;&lt;/code&gt; relation with an application that implements the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s3&lt;/span&gt;&lt;/code&gt;
relation interface.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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 new dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 23 Oct 2023 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2023.1/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 23 May 2023 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/2023.2/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 23 May 2023 00:00:00 </pubDate></item><item><title>Swift Backup Driver for Cinder</title><link>https://specs.openstack.org/openstack/charm-specs/specs/yoga/implemented/cinder-backup-swift.html</link><description>

&lt;p&gt;It is possible to use swift API for cinder backup purposes. In one of the
configurations the swift API provider is deployed via non-Juju means. This
spec is aimed to address this use-case specifically.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Cinder has support for backing up volumes via Swift API. In order to use it
a URL is needed along with authentication details.&lt;/p&gt;
&lt;p&gt;The following methods are supported to use to authenticate against a swift
endpoint:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;v2 auth (URL, username, password, tenant);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;v3 auth (URL, username, password, project domain, project, user domain,
username, password);&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The backup to swift functionality is supported on all versions of OpenStack
supported at the time of writing. It was &lt;a class="reference external" href="https://blueprints.launchpad.net/cinder/+spec/volume-backups"&gt;added in 2013.1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Backup configuration should be added to cinder.conf and can be propagated from
the cinder-backup-like charm to the cinder charm. Extending the existing
cinder-backup charm is not favorable as it is ceph-specific.&lt;/p&gt;
&lt;p&gt;Config options for the swift backend are &lt;a class="reference external" href="https://docs.openstack.org/cinder/rocky/configuration/block-storage/backup/swift-backup-driver.html"&gt;present here&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 a new subordinate charm in reactive framework. This charm will be
deployed alongside cinder deployments. This will be a subordinate charm to
cinder, that installs cinder-backup and configures cinder to use swift as
a backend for volume backups.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;config options for configuring the swift backend.
Following configs need to be modeled in the charm.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;backup_swift_url&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_auth_url&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_auth_version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_tenant&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_user_domain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_project_domain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_container&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_object_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_block_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_swift_ca_cert_file&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implement a new interface cinder-backup in reactive framework for sending
cinder-backup external backend configuration.&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;extend cinder-backup to support swift options (discarded as it is already
Ceph-specific);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;extend cinder-backup to support clusters not deployed via charms by creating
proxy charms (discarded as cinder-backup is Ceph-specific and proxy charms
add additional complexity).&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;yoshikadokawa
alitvinov&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “cinder-backend-swift” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cinder-backend-swift
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 a new reactive subordinate charm, cinder-backup-swift&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement a new reactive charm interface, cinder-backup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write unit tests;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write functional tests using the zaza test framework (a functional tests
should include deploying swift via swift-proxy and swift-storage charms with
config options used to connect to it from the cinder-backend-swift charm).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;The existing classic-style charm in the following repository:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack/charm-cinder-backup-swift
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will be replaced by the new reactive charm.&lt;/p&gt;
&lt;p&gt;New git repository:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack/charm-interface-cinder-backup
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The charm should contain documented options and authentication methods for the
target Swift cluster.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The Swift endpoint might be TLS-terminated, therefore, an option to
provide a CA certificate is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;unit tests;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;functional tests (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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This charm will support OpenStack Queens and
Ubuntu 18.04 Bionic as its baseline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new project will need to be created based on the OpenStack Project
&lt;a class="reference external" href="https://docs.openstack.org/infra/manual/creators.html"&gt;Creator’s Guide&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Nov 2022 00:00:00 </pubDate></item><item><title>NVidia Virtual GPU support in Nova</title><link>https://specs.openstack.org/openstack/charm-specs/specs/yoga/implemented/nvidia-vgpu-support.html</link><description>

&lt;p&gt;Graphical Processing Units (GPUs) are optimized for performing various
mathematical operations in silicon. These optimizations allow for extremely
fast floating point operations that benefit various workloads such as graphics
rendering, machine learning and others. Hardware manufacturers such as
Nvidia [0] and Intel [1] offer physical GPU (pGPU) cards that can be virtually
partitioned into virtual Graphics Processing Units (vGPUs), enabling multiple
guests to make use of a single physical GPU installed in the system.&lt;/p&gt;
&lt;p&gt;Recent changes in Nova [2][3][4][5] introduced partial support for exposing
physical GPUs as virtual GPUs to Nova instances. This spec is about enabling
this support for NVidia hardware in a charm deployment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Machine Learning workloads benefit heavily from the hardware capabilities of
GPUs. The common configuration for running ML based workloads leverage
Kubernetes, which has poor multi-tenancy support and is often run on top of
OpenStack to provide elastic resources and provide multi-tenant isolation.&lt;/p&gt;
&lt;p&gt;Currently, deployments of Charmed OpenStack must use GPU passthrough [6] in
order to enable a guest to make use of a GPU. This limits deployments to
require one physical card for each guest that they intend to run on the
hypervisor. vGPU support enables multiple guests to make use of the installed
pGPUs which enables deployments to increase the number of guests which can
leverage the system.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The Nova project within OpenStack has provided vGPU support since the Queens
release. [2][3] The Nova project continues to iterate over the design of vGPU
support, making enhancements to allow multiple vGPU types in the Ussuri
release. [4][5]&lt;/p&gt;
&lt;p&gt;The Nova project provides support for vGPUs for allocation and assignment. The
vGPU support upstream has evolved and thus, there are different capabilities
available in different releases of OpenStack. The primary difference is whether
or not multiple GPU devices are supported and how to specify which devices
should be used for virtual GPU types.&lt;/p&gt;
&lt;p&gt;A new nova-compute-nvidia-vgpu charm, subordinate to nova-compute, will be
created. It will install the NVidia host software and set it up if and only if
the presence of one or several such pGPU cards is detected. Indeed deploying
the subordinate charm “blindly” to all compute hosts, no matter which of them
provide NVidia pGPU cards or not, simplifies Day-0 and Day-1 operations. If no
supported pGPU card is found, the subordinate charm will simply state so in
its unit status message.&lt;/p&gt;
&lt;p&gt;The proprietary software package (.deb) [7] to be installed on host will be
passed to the subordinate charm as a charm resource.&lt;/p&gt;
&lt;p&gt;To configure vGPUs, a new config option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vgpu-device-mappings&lt;/span&gt;&lt;/code&gt; will be added
to the nova-compute-nvidia-vgpu charm. The format of this configuration value
will be a YAML-formatted dict (or JSON-formatted, since JSON is valid YAML)
where the key is the vgpu_type and the value is a list of device addresses.
E.g.&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;juju config nova-compute-nvidia-vgpu vgpu-device-mappings="$(cat &amp;lt;&amp;lt; EOF
vgpu_type1:
  - device_address1
  - device_address2
vgpu_type2:
  - device_address3
EOF
)"
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;is equivalent to&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;juju config nova-compute-nvidia-vgpu vgpu-device-mappings=\
    "{'vgpu_type1': ['device_address1', 'device_address2'], 'vgpu_type2': ['device_address3']}"
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;vGPU support will be added to the following Operating System versions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Bionic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Focal&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vGPU support will be enabled for the following OpenStack releases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Queens (bionic only)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rocky (migration path only)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stein (migration path only)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Train (migration path only)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ussuri&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Victoria&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wallaby&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Xena&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yoga (and newer)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Juju 2.9 or newer is required.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Using PCI passthrough [6] virtual machines can have direct access of the
physical GPUs installed in the compute host. This limits however deployment to
require one physical card for each guest.&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;Aurelien Lourot &amp;lt;lp:aurelien-lourot&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “vgpu-support” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review -t vgpu-support
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation consists of the following items:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a nova-compute-nvidia-vgpu subordinate charm with a
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vgpu-device-mappings&lt;/span&gt;&lt;/code&gt; config option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let the subordinate charm feed the principal charm with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;vGPU-related Nova configuration bits, using a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;subordinate_configuration&lt;/span&gt;&lt;/code&gt;
key in order to pass a JSON blob [8][9] over a new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-vgpu&lt;/span&gt;&lt;/code&gt; relation.
The JSON blob will be a 1:1 mapping of the wanted Nova
configuration, [3][5] essentially containing the enabled vGPU types and the
device addresses for each vGPU type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data around installed packages and services in order to properly implement
pausing, resuming and upgrading (examples of this mechanism can be found
here [10][11]).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let the subordinate charm install the proprietary host software [7] whenever
the required hardware is found:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;in the install hook,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;after a reboot, either via a hook or an action.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let the subordinate charm perform any necessary action for setting up the
proprietary software. [7]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;See “Documentation” and “Testing” sections below.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-nova-compute&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-nova-compute-nvidia-vgpu&lt;/span&gt;&lt;/code&gt; (new)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-guide&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-deployment-guide&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation will be written for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-guide&lt;/span&gt;&lt;/code&gt; and/or
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-deployment-guide&lt;/span&gt;&lt;/code&gt; explaining the usage of this feature, i.e. how to
use and configure the charms. Useful links around these topics will be
provided:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;guest flavors,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;proprietary guest software, [7]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;license server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Special care will be taken to prevent injecting arbritrary Nova configuration
through the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vgpu-device-mappings&lt;/span&gt;&lt;/code&gt; config option.&lt;/p&gt;
&lt;p&gt;The proprietary host software [7] will only be installed if suitable hardware
is found.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Gate tests (unit and functional tests) will be added in order to cover the
new charm’s behaviour without any special hardware.&lt;/p&gt;
&lt;p&gt;If needed and possible, functional tests exercising special GPU hardware and
NVidia proprietary software [7] will be written and run periodically.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;We depend on proprietary NVidia software [7] to be provided to the subordinate
charm as a .deb resource file.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;[0]: &lt;a class="reference external" href="https://docs.nvidia.com/grid/5.0/pdf/grid-vgpu-user-guide.pdf"&gt;https://docs.nvidia.com/grid/5.0/pdf/grid-vgpu-user-guide.pdf&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[1]: &lt;a class="reference external" href="https://01.org/igvt-g"&gt;https://01.org/igvt-g&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[2]: &lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/add-support-for-vgpu.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/add-support-for-vgpu.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[3]: &lt;a class="reference external" href="https://docs.openstack.org/nova/queens/admin/virtual-gpu.html"&gt;https://docs.openstack.org/nova/queens/admin/virtual-gpu.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[4]: &lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/ussuri/implemented/vgpu-multiple-types.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/ussuri/implemented/vgpu-multiple-types.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[5]: &lt;a class="reference external" href="https://docs.openstack.org/nova/ussuri/admin/virtual-gpu.html"&gt;https://docs.openstack.org/nova/ussuri/admin/virtual-gpu.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[6]: &lt;a class="reference external" href="https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/app-pci-passthrough-gpu.html"&gt;https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/app-pci-passthrough-gpu.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[7]: &lt;a class="reference external" href="https://docs.nvidia.com/grid/index.html"&gt;https://docs.nvidia.com/grid/index.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[8]: &lt;a class="reference external" href="https://opendev.org/openstack/charm-nova-compute/src/branch/master/hooks/charmhelpers/contrib/openstack/context.py#L1508"&gt;https://opendev.org/openstack/charm-nova-compute/src/branch/master/hooks/charmhelpers/contrib/openstack/context.py#L1508&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[9]: &lt;a class="reference external" href="https://opendev.org/openstack/charm-ceilometer-agent/src/branch/master/hooks/ceilometer_hooks.py#L85"&gt;https://opendev.org/openstack/charm-ceilometer-agent/src/branch/master/hooks/ceilometer_hooks.py#L85&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[10]: &lt;a class="reference external" href="https://opendev.org/openstack/charm-nova-compute/src/branch/master/hooks/nova_compute_utils.py#L76"&gt;https://opendev.org/openstack/charm-nova-compute/src/branch/master/hooks/nova_compute_utils.py#L76&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;[11]: &lt;a class="reference external" href="https://opendev.org/openstack/charm-ceilometer-agent/src/branch/master/hooks/ceilometer_hooks.py#L86"&gt;https://opendev.org/openstack/charm-ceilometer-agent/src/branch/master/hooks/ceilometer_hooks.py#L86&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Nov 2022 00:00:00 </pubDate></item><item><title>Virtual TPM Enablement</title><link>https://specs.openstack.org/openstack/charm-specs/specs/yoga/implemented/vtpm-support.html</link><description>

&lt;p&gt;Increasingly, applications and Operating Systems are using TPM devices to
store secrets. In order to run these application in a virtual machine, it
is necessary to be able to expose a virtual TPM device within the guest.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Guests requiring access to TPMs for secret storage are unable to do so in an
OpenStack Charms deployed cloud.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Nova is able to provide virtual TPM devices to guests starting in the Victoria
release &lt;a class="footnote-reference brackets" href="#id7" 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;a class="footnote-reference brackets" href="#id8" 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;. TPM devices are provided to libvirt/qemu guests via the
swtpm library.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; charm should be able to install and configure the
necessary libraries for providing emulated TPM devices. It will do so by
default for new installations and installations that upgrade to a version of
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; charm which has the feature set enabled. This will cause
the nova-compute service on the local machine to report that it has the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;COMPUTE_SECURITY_TPM_1_2&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;COMPUTE_SECURITY_TPM_2_0&lt;/span&gt;&lt;/code&gt; traits.&lt;/p&gt;
&lt;p&gt;While the compute nodes will report that they have the necessary traits, new
instances will not have TPM devices attached unless the flavor and/or image has
the appropriate properties configured. It is considered an administrative
decision to determine which images or flavors should have TPM devices enabled
and is out of scope for this implementation.&lt;/p&gt;
&lt;p&gt;The above also makes it generally safe to enable by default for users who
upgrade their charms to a version that has this capability enabled. While it
may be safe to enable by default, initial versions will ship with the feature
disabled by default in order to prevent package installation errors on charm
or OpenStack upgrade.&lt;/p&gt;
&lt;section id="charm-configuration-options"&gt;
&lt;h3&gt;Charm Configuration Options&lt;/h3&gt;
&lt;p&gt;The following configuration options will be available on the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt;
charm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A new config option will be introduced in order to enable or disable vTPM
support:&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;enable&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vtpm&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;boolean&lt;/span&gt;
  &lt;span class="n"&gt;default&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;Enable&lt;/span&gt; &lt;span class="n"&gt;emulated&lt;/span&gt; &lt;span class="n"&gt;Trusted&lt;/span&gt; &lt;span class="n"&gt;Platform&lt;/span&gt; &lt;span class="n"&gt;Module&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;hypervisors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Barbican&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;
    &lt;span class="n"&gt;capability&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="configuration-files"&gt;
&lt;h3&gt;Configuration Files&lt;/h3&gt;
&lt;p&gt;The swtpm package in Ubuntu does not use the tss/tss user/group that is the
default for qemu, nova, etc. Instead, the swtpm package configures the
user/group as swtpm/swtpm as the swtpm user does not need the same level of
permissions that the existing tss user has. This requires some additional
changes to configuration files.&lt;/p&gt;
&lt;p&gt;Enabling virtual TPM support using OpenStack charms will require the following
configuration files to be updated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;/etc/libvirt/qemu.conf&lt;/em&gt; - the &lt;cite&gt;swtpm_user&lt;/cite&gt; and &lt;cite&gt;swtpm_group&lt;/cite&gt; values need to
be set to the same users that the swtpm software package expects. This will
cause the qemu configuration file to look 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="c1"&gt;##########################################################################&lt;/span&gt;
&lt;span class="c1"&gt;# [ WARNING ]&lt;/span&gt;
&lt;span class="c1"&gt;# Configuration file maintained by Juju. Local changes may be overwritten.&lt;/span&gt;
&lt;span class="c1"&gt;##########################################################################&lt;/span&gt;

&lt;span class="c1"&gt;# File installed by Juju nova-compute charm&lt;/span&gt;
&lt;span class="n"&gt;cgroup_device_acl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="s2"&gt;"/dev/null"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/full"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/zero"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s2"&gt;"/dev/random"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/urandom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s2"&gt;"/dev/ptmx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/kvm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/kqemu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s2"&gt;"/dev/rtc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/hpet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/dev/net/tun"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s2"&gt;"/dev/vfio/vfio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;swtpm_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"swtpm"&lt;/span&gt;
&lt;span class="n"&gt;swtpm_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"swtpm"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;/etc/nova/nova-compute.conf&lt;/em&gt; - similar to the qemu config changes, the
nova services need to specify which user and group should be configured in
libvirt for qemu instances. It will also have the global flag for enabled
or not enabled:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;##########################################################################&lt;/span&gt;
&lt;span class="c1"&gt;# [ WARNING ]&lt;/span&gt;
&lt;span class="c1"&gt;# Configuration file maintained by Juju. Local changes may be overwritten.&lt;/span&gt;
&lt;span class="c1"&gt;##########################################################################&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DEFAULT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;compute_driver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;libvirt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LibvirtDriver&lt;/span&gt;
&lt;span class="n"&gt;swtpm_enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;swtpm_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;swtpm&lt;/span&gt;
&lt;span class="n"&gt;swtpm_group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;swtpm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="non-charm-configuration"&gt;
&lt;h3&gt;Non-Charm Configuration&lt;/h3&gt;
&lt;p&gt;Enabling vTPM support in the nova compute charm will cause the nova hypervisor
to report the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;COMPUTE_SECURITY_TPM_1_2&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;COMPUTE_SECURITY_2_0&lt;/span&gt;&lt;/code&gt;
traits to the placement service. Additional steps need to be taken by the
cloud operator/administrator in order to make this feature available to guests
by configuring the appropriate properties on images or flavors.&lt;/p&gt;
&lt;p&gt;Nova uses information from the extra specs configured on the flavor or
properties set on an image in order to determine whether or not to add a vTPM
device. As such, the hypervisor may be configured to have the necessary
traits exposed to allow for a vTPM device, but the device will not be
provisioned for a guest unless the operator appropriately configures the
images and/or flavors.&lt;/p&gt;
&lt;p&gt;Refer to the Nova documentation &lt;a class="footnote-reference brackets" href="#id8" 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; for the specific extra specs and
properties that need to be set to provide vTPM devices to guests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="barbican"&gt;
&lt;h3&gt;Barbican&lt;/h3&gt;
&lt;p&gt;The swtpm library which provides emulated TPM devices encrypts secrets
locally in files on the file system. Nova uses the Barbican key manager
service for secret storage, which is already available as a charmed
application.&lt;/p&gt;
&lt;p&gt;Conveniently, the default configuration for Nova will use the barbican
services from the keystone catalog to store the necessary secrets. These
secrets are scoped per project and the interactions with the secret store will
happen with appropriate context of the user. As such, there’s no additional
information that the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; charm requires in order to configure
the nova compute services so additional relations are unnecessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="openstack-versions"&gt;
&lt;h3&gt;OpenStack Versions&lt;/h3&gt;
&lt;p&gt;This feature will be enabled for Wallaby and newer OpenStack releases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="operating-system-versions"&gt;
&lt;h3&gt;Operating System Versions&lt;/h3&gt;
&lt;p&gt;This feature will be enabled for Ubuntu 20.04 (focal) and Ubuntu 22.04 (jammy).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="juju-version-dependencies"&gt;
&lt;h3&gt;Juju Version Dependencies&lt;/h3&gt;
&lt;p&gt;This feature has no dependency on Juju versions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There are no alternatives for vTPM support within the charms that integrates
nicely with OpenStack while using the OpenStack charms for 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;billy-olsen&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-vtpm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-vtpm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add configuration changes to nova-compute charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional tests to zaza-openstack-tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide user documentation around enabling the feature and how to use&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories are required for this work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;As part of this effort, the following documentation will need to be updated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Charm Deployment Guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm Readme&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm Guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Release Notes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The changes required in the charm do not introduce any security implications
above and beyond what is outlined in the Nova specification for enabling
emulated vTPM devices &lt;a class="footnote-reference brackets" href="#id7" id="id4" 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="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests and functional tests will be implemented for this feature. The
functional tests will validate the various TPM device configurations and
validate that the TPM device is available within the guest.&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;Nova Wallaby version or greater.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;swtpm TPM emulator &lt;a class="footnote-reference brackets" href="#id9" id="id5" 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;a class="footnote-reference brackets" href="#id10" id="id6" 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;li&gt;&lt;p&gt;Focal-Wallaby support depends on swtpm package being backported to either
the Wallaby Ubuntu Cloud Archive or Focal. Ubuntu developers have indicated
a willingness to backport swtpm to Focal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="footnote-list brackets"&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;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="#id4"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/victoria/implemented/add-emulated-virtual-tpm.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/victoria/implemented/add-emulated-virtual-tpm.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;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="#id2"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="#id3"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/nova/latest/admin/emulated-tpm.html"&gt;https://docs.openstack.org/nova/latest/admin/emulated-tpm.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;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="https://bugs.launchpad.net/ubuntu/+source/swtpm/+bug/1948748"&gt;https://bugs.launchpad.net/ubuntu/+source/swtpm/+bug/1948748&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id10" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id6"&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="https://github.com/stefanberger/swtpm"&gt;https://github.com/stefanberger/swtpm&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Nov 2022 00:00:00 </pubDate></item><item><title>designate-bind: Configurable Service IPs</title><link>https://specs.openstack.org/openstack/charm-specs/specs/zed/implemented/designate-bind-service-ip.html</link><description>

&lt;p&gt;Original LP bug: &lt;a class="reference external" href="https://bugs.launchpad.net/charm-designate-bind/+bug/1804057"&gt;https://bugs.launchpad.net/charm-designate-bind/+bug/1804057&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The problem described by the Bootstack team is that when designate-bind [1]
unit get redeployed, there is a chance that they’ll receive a new IP address.
This is a problem if the previous IP address was used in other, non-juju,
parts of the infrastructure to reference the DNS service provided by the
designate (e.g. if the IPs were used in upstream DNS server for zone delegation
or if they were used in forwarding/firewall rules). Suggested solution is to
allow configuration of static IP addresses that would be preserved on the units
even after redeployment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The possibility of unit’s IP address change requires that each deployment
needs to keep track of all the external systems that reference designate-bind
units by the IP addresses and manually change these references whenever the
unit gets redeployed. These manual actions present an opportunity for human
error and introduce a delay to the update process as, for example, it takes
time for SOA DNS records to propagate depending on their timeout values.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The core of the solution should be a new config option in designate-bind
charm that would allow to specify static IP addresses from reserved pool not
controlled by the DHCP. This config option would be called service-ips and it
would contain a list of comma separated IP addresses that could be statically
configured on the “DNS frontend” facing interface of the designate-bind units
in addition to the address assigned normally by the DHCP.&lt;/p&gt;
&lt;p&gt;There are two alternative solutions suggested in the original launchpad issue
and comments. One Solution would have the designate-bind charm handle the
address assignment and distribution itself, the other suggested solution would
be based on using hacluster subordinate charm [2] that would manage service
IPs as a resource.&lt;/p&gt;
&lt;p&gt;Hacluster-based solution offers certain advantages so it’s listed as a main
proposed solution.&lt;/p&gt;
&lt;section id="hacluster-based-solution"&gt;
&lt;h3&gt;Hacluster based solution&lt;/h3&gt;
&lt;p&gt;This solution proposes to use the hacluster subordinate charm. The
service-ips would be configured via &lt;cite&gt;juju config&lt;/cite&gt; on the designate-bind charm,
but designate-bind would not be in charge of managing the IPs. Instead, the
relation with charm-hacluster would be used to create each service IP as a
cluster resource in pacemaker [3]. These resources could be configured with
colocation rules such as they would never be placed on the same host if there
was another host without assigned Service IP. This can be achieved by
specifying a negative colocation score for the resources [6] (see score
calculations at [7]).&lt;/p&gt;
&lt;p&gt;Another restriction for the Service IP cluster resource might be the actual
network configuration on the designate-bind units. The Service IP must be
within the network configured on the unit and multiple units do not necessarily
need to be on the same network. Cluster resource constraint “location” [9]
can be used to configure cluster resources to prefer or avoid certain hosts.&lt;/p&gt;
&lt;p&gt;At the cost of adding load to the designate-bind unit by running
charm-hacluster, this solution is rather elegant and keeps most of the logic
and responsibility out of the charm’s code. Additional benefit is that even in
degraded state, when some of the units are down, all the Service IPs would
remain functional as the hacluster charm would move them to the unit that is
up.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This alternative solution would manage everything within the designate-bind
charm without addition of new dependencies.&lt;/p&gt;
&lt;p&gt;As the designate-bind units support HA deployments and are typically deployed
in pairs (e.g. ns1.example.org, ns2.example.org), we need to manage how the
units will choose IP from the service-ips list. This responsibility could be
handled by the leader unit. When the leader unit comes online, it can pick the
first IP address from the list and mark it as “used”. Then, when additional
units join the cluster, the service IP will be chosen for them by the leader,
marked as used, and shared via relationship data. The callback in the leader
unit that chooses the IP address from service-ips, should implement some form
of lock, to prevent collision if two units join the cluster relation at the
same time. Leader unit should use &lt;cite&gt;leader-set&lt;/cite&gt; [8] to store information about
“used” IP addresses to ensure preservation of this information in case that
the leader unit changes.&lt;/p&gt;
&lt;p&gt;Actual configuration of the additional IP address on each designate-bind unit
could be done using netplan which supports defining static IP on the interface
that has DHCP enabled. It’s done by adding an &lt;cite&gt;addresses&lt;/cite&gt; field to the
interface object while also leaving the option &lt;cite&gt;dhcp4: True&lt;/cite&gt; [4].&lt;/p&gt;
&lt;p&gt;If a designate-bind unit is removed from the cluster, the leader unit should
return the previously assigned IP address to the pool of available service IPs.&lt;/p&gt;
&lt;p&gt;In case that more units join the designate-bind cluster than there are
available Service IP addresses, the unit without the service IP should be put
into the blocked state with appropriate message.&lt;/p&gt;
&lt;p&gt;In case that the service-ips option is modified and the new number of IP
addresses is less than the current number of deployed designate-bind units, the
leader should redistribute available IP addresses and units without it should
be put into the blocked state with appropriate message.&lt;/p&gt;
&lt;p&gt;In case that the service-ips option is changed from having values to empty
value, the leader unit should trigger reconfiguration on all the designate-bind
units that would remove previously statically configured IP addresses. If there
are units that were previously blocked due to the lack of available service
IPs, they should be brought back to the active state.&lt;/p&gt;
&lt;p&gt;In case that the service-ips option is not set at all, no special action should
be performed by the leader unit.&lt;/p&gt;
&lt;p&gt;Optional: In addition to the configuration change, a confirmatory juju action
could be implemented that would apply the “service-ips” config values. Without
the action, no changes to the live configuration would be made. Reasoning for
this is that it would serve as a confirmation by the user that the change is
intended and it would prevent unwanted changes to the “service-ips”
configuration and possible outages. Another benefit of this action would be
that it could be applied 1 unit at a time so if there was something wrong with
the configuration it would not affect the whole cluster at the same time but
only one unit.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="further-information"&gt;
&lt;h3&gt;Further Information&lt;/h3&gt;
&lt;p&gt;Regardless of the approach taken, user should only interact with this new
feature by using &lt;cite&gt;juju config&lt;/cite&gt; command, for example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ juju config designate-bind service-ips=”10.0.10.10,10.0.10.20”
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Basic checks should be performed on the supplied IP addresses:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Validate that the supplied values are valid IPs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate that the Service IP belongs to the subnet configured on the unit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://jaas.ai/designate-bind/36"&gt;https://jaas.ai/designate-bind/36&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="https://jaas.ai/hacluster"&gt;https://jaas.ai/hacluster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] &lt;a class="reference external" href="https://github.com/openstack/charm-interface-hacluster#requires"&gt;https://github.com/openstack/charm-interface-hacluster#requires&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4] &lt;a class="reference external" href="https://askubuntu.com/questions/1031278/does-netplan-support-dhcp-and-static-addresses-on-one-interface"&gt;https://askubuntu.com/questions/1031278/does-netplan-support-dhcp-and-static-addresses-on-one-interface&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5] &lt;a class="reference external" href="https://github.com/openstack/charm-designate-bind/blob/master/src/metadata.yaml#L23"&gt;https://github.com/openstack/charm-designate-bind/blob/master/src/metadata.yaml#L23&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[6] &lt;a class="reference external" href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/s1-colocationconstraints-haar"&gt;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/s1-colocationconstraints-haar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[7] &lt;a class="reference external" href="https://www.thegeekdiary.com/managing-resource-startup-order-in-pacemaker-cluster-managing-constraints/"&gt;https://www.thegeekdiary.com/managing-resource-startup-order-in-pacemaker-cluster-managing-constraints/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[8] &lt;a class="reference external" href="https://charm-helpers.readthedocs.io/en/latest/api/charmhelpers.core.hookenv.html#charmhelpers.core.hookenv.leader_set"&gt;https://charm-helpers.readthedocs.io/en/latest/api/charmhelpers.core.hookenv.html#charmhelpers.core.hookenv.leader_set&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[9] &lt;a class="reference external" href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/ch-resourceconstraints-haar"&gt;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/ch-resourceconstraints-haar&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;martin-kalcok &amp;lt;&lt;a class="reference external" href="mailto:martin.kalcok%40canonical.com"&gt;martin&lt;span&gt;.&lt;/span&gt;kalcok&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;designate-bind-serivce-ips
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add configuration option &lt;cite&gt;service-ips&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handler for &lt;cite&gt;service-ips&lt;/cite&gt; config change event that configures apropriate
IP addresses on designate-bind units&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Work will be located in the main designate bind repository:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-designate-bind"&gt;https://opendev.org/openstack/charm-designate-bind&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;&lt;cite&gt;To Be Updated&lt;/cite&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit and Functional tests will be needed to verify this new functionality.&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, 08 Nov 2022 00:00:00 </pubDate></item><item><title>Enablement of Keystone OpenID Connect Support</title><link>https://specs.openstack.org/openstack/charm-specs/specs/zed/implemented/keystone-openidc.html</link><description>

&lt;p&gt;Keystone Charm support pluggable backends that use Keystone federations to
enable a variety of providers for the account users and groups. This spec
attempts to discuss how to enable support for &lt;a class="reference external" href="https://openid.net/connect/"&gt;OpenID Connect&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;When deploying the OpenStack charms in an enterprise environment currently
it’s only possible to bring up the central database of users into Keystone via
LDAP or Federation, this last one method support only SAML integration, hence
environments where users are exposed with OpenID Connect (e.g. Google Apps),
Charmed OpenStack provides no solution.&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 solution is to make OpenID Connect available to Charmed OpenStack
in a new subordinate charm to keystone.&lt;/p&gt;
&lt;p&gt;The new feature would be supported on OpenStack Yoga (and later) on Ubuntu
22.04 LTS.&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;Allow operators to configure OpenID Connect federation with some support
backed into the Keystone charm directly.&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;Felipe Reyes &amp;lt;&lt;a class="reference external" href="mailto:felipe.reyes%40canonical.com"&gt;felipe&lt;span&gt;.&lt;/span&gt;reyes&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “keystone-openidc” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;keystone-openidc
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 a new operator framework subordinate charm, keystone-openidc, that
implements keystone-fid-service-provider and websso-fid-service-provider
relations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a charm option that allows the operator to pass a custom HTML template
to be used as a Single Sign On template, this template will be used by
OpenStack Horizon to render the login screen (see &lt;a class="reference external" href="https://docs.openstack.org/keystone/latest/admin/federation/configure_federation.html#add-the-callback-template-websso"&gt;Configuring Horizon as a
WebSSO Frontend&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new snap with a OpenID Connect provider software such as &lt;a class="reference external" href="https://pagure.io/ipsilon"&gt;Ipsilon&lt;/a&gt;
or &lt;a class="reference external" href="https://github.com/IdentityPython/oidc-op"&gt;Oidc-op&lt;/a&gt;, this snap will be designed with the intention of being deployed
and used for testing purposes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new charm that deploys a OpenID Connect provider for testing
purposes, openidc-test-fixture, this charm will be similar to
&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-ldap-test-fixture"&gt;ldap-test-fixture&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend current functional tests using the zaza testing framework&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="timeline"&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;p&gt;The goal is to implement this change in the OpenStack Charms 22.04 release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;During the intial development the code will be managed here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-keystone-openidc"&gt;https://github.com/openstack-charmers/charm-keystone-openidc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-openidc-test-fixture"&gt;https://github.com/openstack-charmers/charm-openidc-test-fixture&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/snap"&gt;https://github.com/openstack-charmers/snap&lt;/a&gt;-&amp;lt;openidc-provider&amp;gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When ready the charm keystone-openidc will be managed via OpenDev gerrit at:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-keystone-openidc"&gt;https://opendev.org/openstack/charm-keystone-openidc&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The charm should contain documented options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create charm options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create charm relations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create charm README&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the &lt;a class="reference external" href="https://opendev.org/openstack/charm-deployment-guide/"&gt;deployment-guide&lt;/a&gt; to include a section that explains how to
configure Charmed OpenStack to authenticate against a OpenID Connect
provider.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The OpenStack Identity Service (Keystone) has to interact exclusively with
OpenID Connect providers served over valid HTTPS endpoints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be tested by unit tests.&lt;/p&gt;
&lt;p&gt;Functional tests would be covered by zaza testing framework.&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;This enablement depends on &lt;a class="reference external" href="https://launchpad.net/ubuntu/+source/libapache2-mod-auth-openidc"&gt;libapache2-mod-auth-openidc&lt;/a&gt; available in Ubuntu
since 18.04 (Bionic) in the Universe pocket. To maintain the security and
availability of this component in the long term a Main Inclusion Request
(MIR) will be submitted.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Nov 2022 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/zed/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Nov 2022 00:00:00 </pubDate></item><item><title>Charmstore to Charmhub Migration</title><link>https://specs.openstack.org/openstack/charm-specs/specs/yoga/implemented/charmhub-migration.html</link><description>

&lt;p&gt;This spec proposes a new, better, but alternative means for maintaining and
releasing OpenStack charms in a world with a new charm store (charmhub.io)
which provides richer mechanisms for charm delivery.&lt;/p&gt;
&lt;p&gt;A new charm store, charmhub, has been introduced that shares features and
capabilities with snaps. The legacy charm store, jaas.ai, is planned to be
retired and all projects delivering charms should migrate to charmhub. One of
the compelling features of charmhub is the ability to offer multiple tracks for
releases.&lt;/p&gt;
&lt;p&gt;The charms themselves are written to support multiple releases of OpenStack
from pre-Mitaka to Xena. This is convenient and straightforward for having
development working only on one branch at a time for a charm, but requires that
code and dependencies work towards the lowest common supported denominator.
This is problematic as these charms depend on python libraries that are moving
forward and dropping support for legacy python versions such as Python 2, 3.5
and beyond, which causes maintenance challenges for current charms.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, OpenStack Charms are delivered in two charmstore namespaces -
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers-next&lt;/span&gt;&lt;/code&gt;. The use of two
namespaces predates the existence of channels within the jaas.ai charm store.
These namespaces are equivalent to the stable and edge channels respectively.&lt;/p&gt;
&lt;p&gt;The git repositories hosting the source code for the OpenStack charms generally
live on opendev.org git servers. The repositories contain branches of each
stable charm release and an unstable development branch (master). A post-merge
job in the CI system publishes an updated version of the charm to the jaas.ai
charm store after any change is merged. Changes landing in the master
development branch are published in the openstack-charmers-next namespace and
changes landing in the most recent stable branch are published in the
openstack-charmers namespace.&lt;/p&gt;
&lt;p&gt;One of the challenges with the current approach is that the two branches must
focus on the lowest common denominator for dependencies; meaning that most
python libraries leveraged and included in the charms must be limited to
versions that support older python releases that are still included on older
OpenStack releases. As the world of Python library development moves on,
support for older python versions are being deprecated and removed causing a
variety of maintenance headaches for the current charms.&lt;/p&gt;
&lt;p&gt;Another challenge with this approach is that each new feature introduced adds
potential risk to older install bases. In order to mitigate this, the gate
testing of the OpenStack Charms runs a broad sampling of tests across a
multitude of OpenStack and base distro releases. New contributors are often
running into challenges with the CI system and needing to debug older releases
even when their patches are not relevant to these older versions.&lt;/p&gt;
&lt;p&gt;One of the positive sides to this arrangement is that development primarily
only needs to consider 2 branches at a time - the master development branch
and the most recent stable branch. All patches are primarily targeted at the
master development branch and relevant bug fixes are backported to a single
release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;OpenStack charms will adopt a model of release and delivery which takes
advantage of the various delivery channels offered by charmhub which closely
matches channels in the &lt;a class="reference external" href="https://snapcraft.io/docs/channels"&gt;Snap store&lt;/a&gt;. Note, that not all charms will support
all releases/versions of a specific service and charms will only adopt branches
and tracks for those releases which are relevant to the service itself.&lt;/p&gt;
&lt;section id="tracks"&gt;
&lt;h3&gt;Tracks&lt;/h3&gt;
&lt;p&gt;Tracks will be set up to track git branches in the upstream repositories and
will result in a track per release of the charm payload (e.g. the software
service it delivers). When the primary software payload of the charm uses
well-known release names, the release name will be used in lieu of version
numbers for the track name. When the primary software payload of the charm does
not use well-known release names, the version of the software will be used.&lt;/p&gt;
&lt;p&gt;For example, the nova-compute charm delivers nova hypervisor services and the
charm tracks will correspond to the OpenStack release of the nova services
installed (e.g. ussuri, victoria, etc.).&lt;/p&gt;
&lt;p&gt;As another example, the OVN Central charm delivers OVN as the payload and OVN
uses release names/versions of YY.MM. In this scenario, the OVN charm Central
charm will provide a track corresponding to the YY.MM naming schema (e.g.
21.03, 21.09, etc).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="risk-levels"&gt;
&lt;h3&gt;Risk Levels&lt;/h3&gt;
&lt;p&gt;The charmhub store also has the ability to allow the developers and users to
provide and consume different risk levels. This feature was also available in
the legacy charmstore, however it was not leveraged by the release process
until very recently. There are 4 risk levels available within any track: edge,
beta, candidate, and stable. The CI system will automatically publish a new
charm for any change which lands in the corresponding git branch to the edge
risk level.&lt;/p&gt;
&lt;p&gt;Charms will be promoted through the edge -&amp;gt; beta -&amp;gt; candidate -&amp;gt; stable risk
levels by a human actor, not through an automated script. Tooling may be
developed to assist in this process, but automatic promotion is out of scope at
this time. Future enhancements may include triggering a promotion of a build
upon the introduction of git tags, but that is considered out of scope for this
work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="branches"&gt;
&lt;h3&gt;Branches&lt;/h3&gt;
&lt;p&gt;The charmhub store also provides for a further subdivision of tracks and risk
levels into branches, which are meant to provide temporary, short-lived,
releases for bug fixing purposes. There are various possibilities to consider
regarding how branch flows should be worked into the development flow of
OpenStack charms.&lt;/p&gt;
&lt;p&gt;For the purposes of this work, branches are explicitly out of scope and should
be considered separately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="git-branches"&gt;
&lt;h3&gt;Git Branches&lt;/h3&gt;
&lt;p&gt;Git branches will need to be created for the various tracks that are delivered
in Charmhub. The relationship between git branches and charmhub tracks are
one-to-many, meaning that a change landing in one branch may result in a charm
being published into multiple tracks. This is useful when the tracks provide
logically different targets, while the branch serves the same functionality.
For example, the latest master branch of development will logically point to
the latest OpenStack release as well as the latest/edge release.&lt;/p&gt;
&lt;p&gt;Additionally, the charms in each of the git branches and tracks are intended to
support the targeted release N and the previous release N-1 for upgrade
purposes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="openstack-charms"&gt;
&lt;h3&gt;OpenStack Charms&lt;/h3&gt;
&lt;p&gt;For those charms specifically delivering OpenStack services a new git branch
will be created for each OpenStack release the charm supports. This branch will
be named in the form of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;stable/&amp;lt;openstack-release&amp;gt;&lt;/span&gt;&lt;/code&gt; for all stable versions
of OpenStack. Branches will only be created back to the Queens release of
OpenStack. Each of these branches will be created from the tip of the current
stable charms release (stable/21.10) as a base. These branches will differ from
each other regarding the primary version of software that they are targeting as
well as the default configuration values for the track they are deployed from.&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;Git Branch&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Charmhub Track(s)&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;stable/queens
stable/rocky
stable/stein
stable/train&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;train&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/ussuri&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ussuri&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stable/victoria&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;victoria&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/wallaby&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;wallaby&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stable/xena&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;xena&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/yoga&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;yoga&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;zed, latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="ceph-charms"&gt;
&lt;h3&gt;Ceph Charms&lt;/h3&gt;
&lt;p&gt;Currently, Ceph updates are delivered through the Ubuntu Cloud Archive which
ties the ceph charms to OpenStack versions, causing some challenges in defining
tracks per Ceph release. In scenarios where services are co-located (e.g.
nova-compute and ceph-osd), updating the source repository for the ceph-osd
charm will have unintended consequences on the nova-compute services and their
versions. Rather than introduce complex pinning or a new package archive, the
charms used to deliver Ceph will track the OpenStack release names in addition
to the Ceph release names, up to the Octopus release. This is expected to make
the migration easier for users.&lt;/p&gt;
&lt;p&gt;The development git branches will be created corresponding to the appropriate
Ceph version where the product was delivered. In order to make it easier for
users to migrate, Ceph charms may have a single branch delivered to multiple
Charmhub tracks.&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;Git Branch&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Charmhub Track(s)&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;stable/luminous&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;luminous, queens, rocky&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/mimic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;mimic, stein&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stable/nautilus&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;nautilus, train&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/octopus&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;octopus&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stable/pacific&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;pacific&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;quincy, latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On the newer branches, a mapping can be made to safely convert a Ceph release
name into a cloud-archive pocket in a way that doesn’t unintentionally upgrade
either one, with the assumption that a valid mapping between OpenStack and Ceph
versions is clearly documented. What that mapping should look like:&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;Ceph Release&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;OpenStack Release&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;Luminous&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Queens&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Mimic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Stein&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Nautilus&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Train&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Octopus&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Ussuri&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Pacific&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Wallaby (mid-cycle Openstack, more support)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Unstable / Quincy&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yoga&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The above works because we can include distro (bionic-queens) with Rocky
safely, and we can include Pacific’s focal-wallaby with Xena safely, as the
Xena packages have higher versions.&lt;/p&gt;
&lt;p&gt;The Ceph charms include the following charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph-fs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-iscsi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-mon&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-osd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-proxy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-rbd-mirror&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provider-specific-subordinate-charms"&gt;
&lt;h3&gt;Provider-specific Subordinate Charms&lt;/h3&gt;
&lt;p&gt;Some services such as Cinder and Neutron allow for provider specific
subordinate charms to be used in order to allow for a specific SDN, storage
plugin, etc. These provider-specific subordinate charms are considered
supporting charms rather than OpenStack specific charms, however they are often
enabling specific functionality for a specific storage backend. As such, they
will follow the OpenStack Charms track schema.&lt;/p&gt;
&lt;p&gt;These charms will include the following subordinate charms, and as of this
writing include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cinder-ceph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-lvm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-netapp&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-purestorage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-openvswitch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-api-plugin-arista&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-api-plugin-ovn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;keystone-saml-mellon&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="ovn-charms"&gt;
&lt;h3&gt;OVN Charms&lt;/h3&gt;
&lt;p&gt;OVN is a networking SDN which is used as the primary SDN for Charmed OpenStack
deployments. OVN has been provided through the Ubuntu Cloud Archive as well as
the Ubuntu archives. The OVN charms are a bit of a mix when it comes to
providing source versions. Standalone charms such as OVN Dedicated Chassis and
OVN Central have source options which allow for configuring the archive to use
for package installation. As a subordinate charm, OVN Chassis will adopt the
version that is installed alongside the principal charm.&lt;/p&gt;
&lt;p&gt;As OVN is a general SDN and not implemented specifically for OpenStack, the
tracks in charmhub should closely follow the versions of the software delivered
rather than the OpenStack release. This may be a bit confusing at first for
users migrating, but this should be addressed with clear documentation as well
as tooling to help the end-users select the appropriate track to upgrade their
charms to. Additionally, tracks will be put in place labelled
openstack-{release-name} to ease the migration burden.&lt;/p&gt;
&lt;p&gt;OVN charms will have the following sets of branches and tracks:&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;Branch&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Track(s)&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;stable/20.03&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;20.03, ussuri, victoria&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/20.12&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;20.12, wallaby&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;stable/21.09&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;21.09, xena&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable/22.03&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;22.03&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="supporting-charms"&gt;
&lt;h3&gt;Supporting Charms&lt;/h3&gt;
&lt;p&gt;In the OpenStack ecosystem, there are other core services which are required to
produce an OpenStack cloud. These services include messaging, database, and
certificate management services. While they are critical to the functionality
of an OpenStack cloud, they are not tied to specific releases of OpenStack and
these charms should result in tracks which are appropriate for their specific
behavior.&lt;/p&gt;
&lt;p&gt;These charms consist of the following services, and will result in tracks that
are based on the versions of software provided. These services are generally
delivered from the Ubuntu archives (not the Ubuntu Cloud Archive) and will
track the versions of their versions in Ubuntu.&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;Charm&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Branch&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Track(s)&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;hacluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/bionic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.1.x&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;hacluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/focal&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.0.3, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;hacluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.0.5, latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;pacemaker-remote&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/bionic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.1.x&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;pacemaker-remote&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/focal&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.0.3, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;pacemaker-remote&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.0.5, latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;rabbitmq-server&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/bionic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3.6&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;rabbitmq-server&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/focal&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3.8, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;rabbitmq-server&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3.9, latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;vault&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/1.5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.5&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;vault&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/1.6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.6&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;vault&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/1.7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.7&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;vault&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;percona-cluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/bionic&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;5.7, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;percona-cluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;mysql-innodb-cluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/jammy&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8.0, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;mysql-innodb-cluster&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="trilio-charms"&gt;
&lt;h3&gt;Trilio Charms&lt;/h3&gt;
&lt;p&gt;Trilio Charms will also need to be migrated to the charmhub delivery mechanism.
While implemented for OpenStack, the Trilio software is versioned separately
from the OpenStack releases and should use Trilio specific tracks.&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;trilio-data-mover&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;stable/4.0&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;4.0&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;trilio-data-mover&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.1, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;trilio-data-mover&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.2 (?), latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;trilio-dm-api&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;trilio-dm-api&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.1, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;trilio-dm-api&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.2 (?), latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;trilio-horizon-plugin&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;trilio-horizon-plugin&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.1, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;trilio-horizon-plugin&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.2 (?), latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;trilio-wlm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;trilio-wlm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable/4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.1, latest/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;trilio-wlm&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.2 (?), latest/edge&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="installation-sources"&gt;
&lt;h3&gt;Installation Sources&lt;/h3&gt;
&lt;p&gt;Most charms in the OpenStack charm collection provide a config option that
allows the user to set the archive or repository that debian packages/snaps are
installed from. This is generally provided via either the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-origin&lt;/span&gt;&lt;/code&gt;
or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;source&lt;/span&gt;&lt;/code&gt; charm config option, which defaults to install using the local
installations default distribution repositories.&lt;/p&gt;
&lt;p&gt;In order to ensure that the tracks are installing the appropriate versions of
packages, the default value for this config option will be set to the
appropriate installation source for the track. If a track spans multiple distro
releases (e.g. the cloud-archive at the LTS release crossover), the charm will
need to be able to determine whether this should be sourced from the
cloud-archive or the distribution, whichever is appropriate.&lt;/p&gt;
&lt;p&gt;Primarily, this will affect the tracks that use the Ussuri Ubuntu Cloud Archive
and the Yoga Ubuntu Cloud Archive as an installation source.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="latest-track"&gt;
&lt;h3&gt;Latest Track&lt;/h3&gt;
&lt;p&gt;The ‘latest’ track in charmhub is its own track, and like other tracks - charms
can be pushed to the track and the various risk levels within the track. While
it is a full blown track, to end users it is a means to get the “latest”
version of a piece of software. However, the risk level must be taken into
consideration for which version should be installed.&lt;/p&gt;
&lt;p&gt;The latest track will be used into two ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;latest/stable&lt;/span&gt;&lt;/code&gt; track will be used to park the stable 21.10 charms
release until (at least) the 22.10 release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At 22.10, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;latest/stable&lt;/span&gt;&lt;/code&gt; track will follow the current stable release,
and for 22.10 this will be the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;zed&lt;/span&gt;&lt;/code&gt; track.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reasoning is that the 21.10 charms’ metadata advertise focal support,
against &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;all&lt;/span&gt;&lt;/code&gt; architecturees and so it difficult to replace until a jammy,
and greater, charm can be released to the channel. However, the zed charms will
only support jammy and kinetic, and so they can be released alongside the
existing 21.10 charms. Then existing 21.10 charms won’t upgrade as the new
charms will not support focal. Therefore, it is safe to re-use the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;latest/stable&lt;/span&gt;&lt;/code&gt; track at that point.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="risks"&gt;
&lt;h3&gt;Risks&lt;/h3&gt;
&lt;p&gt;The purpose of each risk level for each track is as follows:&lt;/p&gt;
&lt;section id="edge"&gt;
&lt;h4&gt;Edge&lt;/h4&gt;
&lt;p&gt;For each charm, the latest/edge channel will always map the current master
development branch.&lt;/p&gt;
&lt;p&gt;Currently, for stable branches, the edge track will not be used, as the
Launchpad builders will push directly to the stable track. This is in keeping
with the existing policy of requiring 2 x +2 reviews on gerrit for stable
branches. At some future point, automation/policy will be introduced to enable
pushing to edge to start with and then having testing/policy to promote to more
stable risks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="beta"&gt;
&lt;h4&gt;Beta&lt;/h4&gt;
&lt;p&gt;The beta risk level will be used for milestone releases during the charm
development cycle.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="candidate"&gt;
&lt;h4&gt;Candidate&lt;/h4&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;track&amp;gt;/candidate&lt;/span&gt;&lt;/code&gt; channel will be used to track the next software
release as it enters the final weeks of development and stabilizes in
preparation for a release.  Note that this is on the next stable release track.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="stable"&gt;
&lt;h4&gt;Stable&lt;/h4&gt;
&lt;p&gt;The stable track will track the stable, tested, released version of the charm.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="technology-preview-charms"&gt;
&lt;h3&gt;Technology Preview Charms&lt;/h3&gt;
&lt;p&gt;Charms are initially released in the “Technology Preview” state. Charms which
are in the technology preview state should not be promoted into the stable
channel until it is determined it is stable for the corresponding payload
release. Once it has graduated, all releases which have qualified as graduated
from technology preview will then be promoted to the stable channel. It is
possible that not all tracks of a charm will have a stable risk level. Charms
which are still in technology preview will only promote those charms to the
beta channel until it is determined that the charm has reached maturity, at
which point it can be promoted to the candidate and/or stable channels as
appropriate.&lt;/p&gt;
&lt;p&gt;For example, a charm such as ovn-chassis may be delivered as technology preview
in the Stein release track but may not reach maturity until the Train release
track. The Train release track of the charm will be promoted to the stable
channel but the Stein release track will only have the charm in the beta
channel.&lt;/p&gt;
&lt;p&gt;Special consideration is needed for those charms considered Technology Preview
at the time of this transition. Technology Preview charms are not promulgated
in the charm store and are available under the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers&lt;/span&gt;&lt;/code&gt;
namespace. Charmhub does not have namespaces in the same way and these charms
exist but are prefixed with the ‘openstack-charmers’ name, e.g.
openstack-charmers-ironic-api. These charms will be created in charmhub and
promoted to the beta channel.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="continuous-integration"&gt;
&lt;h3&gt;Continuous Integration&lt;/h3&gt;
&lt;p&gt;Charmhub will deliver charms that are built for specific architectures.
OpenStack charms to date, are built using python modules on amd64 architectures
and distributed as such. This is generally acceptable as they are primarily
source charms which have deliveries, but can pose some interesting challenges
for non-amd64 architectures with native extensions.&lt;/p&gt;
&lt;p&gt;The OpenStack CI system is currently composed of a Zuul-CI system which is used
to trigger a variety of pep8 (pycodestyle), unit and functional tests for each
patch proposed to a charm. Post-merge hooks are registered which trigger a
Jenkins task to publish the charm to the legacy charm store.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="publishing-charms"&gt;
&lt;h3&gt;Publishing Charms&lt;/h3&gt;
&lt;p&gt;For newer charms, delivered through charmhub, they are expected to have
platform specific charms so that native extensions or tooling required by the
charm can be built for the appropriate target architecture. Launchpad now
offers charm recipes, which can be used to build and publish charms in a
similar manner to snap recipes. Changes merged into a repository will trigger a
build of the charm on all supported architectures and publish the resulting
charm to Charmhub. Leveraging this service removes a step from the OpenStack
Charmers maintained CI system for publishing charms to the charm store and
results in completely eliminating the need for jenkins in the CI
infrastructure.&lt;/p&gt;
&lt;p&gt;The Launchpad charm recipes require that the git trees are known and stored in
Launchpad itself. In order to continue to use the upstream OpenStack gerrit
review system, which is standard for OpenStack services and has been standard
for the charms for years, each charm project in Launchpad will be configured to
mirror the source from the upstream opendev git system.&lt;/p&gt;
&lt;p&gt;A charm recipe will be created for each branch of each charm such that upon a
patch being merged in the upstream gerrit repository, the Launchpad service
will update the mirrored (a.k.a. imported) repository, detect that new changes
are present, initiate a charm build and publish these results to the
appropriate channel(s) in charmhub.&lt;/p&gt;
&lt;p&gt;Note that charm recipes in Launchpad will only build by default once per hour.
While there is normally a slight delay in publishing charms to the charm store,
there is one publish per change to the charm. In the Launchpad build model,
multiple changes can be queued up and included in a single build unless builds
are explicitly requested within the hour time window. This is considered
acceptable for charm development and publishing purposes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-charms"&gt;
&lt;h3&gt;Testing Charms&lt;/h3&gt;
&lt;p&gt;With the introduction of branches and tracks per OpenStack release, the need to
test a multitude of OpenStack releases for each change is no longer required.
Instead, targeted tests for the branch will be run. For example, a change
proposed to the Keystone charm in the stable/xena branch will run only tests
relevant to the Xena release of OpenStack.&lt;/p&gt;
&lt;p&gt;Reducing the releases that are running in the gate allows for the charm to be
focused on the specific payload release and need not worry about spurious
failures on older releases.&lt;/p&gt;
&lt;p&gt;The branches may also include tests that exercise the N-1 version of the
release software, in order to validate that the upgrade of N-1 to N are
functioning properly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="charmcraft"&gt;
&lt;h3&gt;Charmcraft&lt;/h3&gt;
&lt;p&gt;In order to leverage the charm recipes in Launchpad, all of the charms will
need to be built using the charmcraft tool. Charmcraft, however, was designed
to build and publish operator framework charms, which excludes the majority of
the charms in the OpenStack charms collection.&lt;/p&gt;
&lt;p&gt;Charmcraft has recently grown parity with the snapcraft toolset, which allows a
variety of plugins to be used instead of the default charm plugin. The ‘dump’
plugin is appropriate to use for classic charms, however it is unsuitable for
reactive charms. In the long term, a new plugin should be created for building
reactive charms using charmcraft. In the short term, the various steps for
producing a charm can be overridden using the ‘override-build’,
‘override-stage’, and ‘override-prime’ steps which will use the existing tox
infrastructure to build, stage, and prime the reactive charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation for the OpenStack Charms and Ceph Charms are generally available
as a solution level, with charm README files serving as the primary source of
documentation within the Charm store and the published OpenStack Charm Guide,
OpenStack Charms Deployment Guide and Ubuntu Ceph Documentation providing
solution level documentation.&lt;/p&gt;
&lt;p&gt;The release notes need to clearly identify the change to use and leverage
Charmhub as well as referencing migration documentation. Migration
documentation needs to be clearly outlined to make it simple for users to
migrate from using the Charm Store to Charmhub.&lt;/p&gt;
&lt;p&gt;Developer documentation should also be provided in the OpenStack Charm Guide to
provide details for developers wishing to contribute new features, bug fixes,
etc.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There aren’t really any good alternatives. When the charmstore to charmhub
cut-over is implemented, the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm&lt;/span&gt;&lt;/code&gt; command will stop working,
which means that the entire build and publishing system in Jenkins will simply
stop working too. So the only real alternative is to re-work the Jenkins
software to use charmcraft and then use that to push to the charm store.&lt;/p&gt;
&lt;p&gt;This means continuing to maintain Jenkins and not take advantage of the
Launchpad builders to build architecture aware charms.&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;Alex Kavanagh&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="produce-charmcraft-recipes-for-classic-and-reactive-charms"&gt;
&lt;h4&gt;Produce ‘charmcraft’ recipes for classic and reactive charms&lt;/h4&gt;
&lt;p&gt;Launchpad can be used to build charms when branches in git repositories are
changed. These builds are controlled by recipes. Part of the work will be to
ensure that these recipes work for all of the charms. They will be centrally
controlled and ‘synced’ into charms as part of the development cycle.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write classic recipe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write reactive charm recipe using charm-tools &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add recipes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;release-tools&lt;/span&gt;&lt;/code&gt; repository.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="produce-helper-tools-library-to-manage-launchpad-projects-recipes"&gt;
&lt;h4&gt;Produce helper tools/library to manage launchpad projects/recipes&lt;/h4&gt;
&lt;p&gt;In order to manage the charms, recipes and mapping of git repository branches
to charmhub tracks/channels, a suite of tools and configuration will be
produced to manage the complexity of the number of charms, branches and tracks.&lt;/p&gt;
&lt;p&gt;Essential functionality will be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;display gap between config and actual in git repositories and launchpad
recipes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Show desired tracks vs actual tracks for charms (in charmhub) to generate
‘requests’ for new tracks, or for tracks to be deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update existing recipes against the configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new recipes as required against the config.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Initially, the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;release-tools&lt;/span&gt;&lt;/code&gt; repository will be the collecting
point for the tools, but it has become a bit of a dumping ground for related
tools and needs a major re-organistion. In the fullness of time, these tools
may be broken out into their own repository where changes to the config
automatically updates the recipes.&lt;/p&gt;
&lt;p&gt;Additionaly, the manage the recipes a separate &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charmhub-lp-tools&lt;/span&gt;&lt;/code&gt; tool will
be created to automate recipe creation, updates, deletes and changed, and to
authorize uploads to the charmhub.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://github.com/openstack-charmers/release-tools
https://github.com/openstack-charmers/charmhub-lp-tools
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation for the tools, configuration schemas and how the system works
will be inside the repository in the form of Markdown files. This is to ensure
that the documentation ‘lives’ with the code. Where possible documentations
for the schemas (config files) will be in the config files themselves.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;p&gt;The user that runs the tool must have a launchpad account in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers&lt;/span&gt;&lt;/code&gt; team, and a charmhub account in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers&lt;/span&gt;&lt;/code&gt; team.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The possibility to break the charmstore and charmhub is pretty high, so the
tools and process will be developed incrementally against ‘test’ charms and low
priority ‘real’ charms.&lt;/p&gt;
&lt;section id="stage-1"&gt;
&lt;h4&gt;Stage 1&lt;/h4&gt;
&lt;p&gt;Initially copies of the existing charms will be registered into the charmhub
(under new names), to test the recipes and ability to build charms. This is to
verify that the charm build recipes work for classic and reactive charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="stage-2"&gt;
&lt;h4&gt;Stage 2&lt;/h4&gt;
&lt;p&gt;Selecting two charms (notionally, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-dynamic-routing&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;manila-generic&lt;/span&gt;&lt;/code&gt;), break the link to the charmstore and ensure that tracks,
branches and recipes can be created such that updates to the charms git
repositories result in built charms in the correct tracks.&lt;/p&gt;
&lt;p&gt;This will allow the correct changes to the charms to be enumerated and captured
in the release-tools repository.&lt;/p&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 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://github.com/canonical/charmhub-unofficial-docs"&gt;Charmhub unofficial docs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://snapcraft.io/docs/channels"&gt;Snapcraft channels&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://help.launchpad.net/Code/Git#Mirroring_repositories_from_other_sites"&gt;Mirroring repositories from other sites&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Dec 2021 00:00:00 </pubDate></item><item><title>Enablement of Ceph Dashboard</title><link>https://specs.openstack.org/openstack/charm-specs/specs/xena/implemented/ceph-dashboard.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The ceph-mon charm provides the cluster monitor daemon for the Ceph
distributed file system. It currently does not support enablement of
the Ceph Manager built-in Dashboard. It is a web-based Ceph management
and monitoring application through which you can inspect and administer
various aspects and resources within the cluster. It is implemented as
a Ceph Manager Daemon module.&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 solution is to make the dashboard available and default enabled
in a new subordinate charm to ceph-mon. SSL endpoint termination would be done
using the certificates relation or by providing the ssl_cert, ssl_key and
ssl_ca configuration options. User management would be done with the use of
charm actions.&lt;/p&gt;
&lt;p&gt;The upstream documentation of Ceph mentions Dashboard is supported,
(&lt;a class="reference external" href="https://docs.ceph.com/en/latest/mgr/dashboard/"&gt;https://docs.ceph.com/en/latest/mgr/dashboard/&lt;/a&gt;). The new feature would be
supported on Ceph Octopus, OpenStack Victoria (and later) on Ubuntu 20.04 LTS.&lt;/p&gt;
&lt;p&gt;The subordinate charm will enable access to the dashboard via the hostnames of
the mon units. However, the hostname may not map to the desired network space,
the operator may not be able to resolve the juju unit hostnames and the failure
of a single mon unit may make the dashboard inaccessable if the operator was
accessing the dashboard via that mon. To resolve these issues
the dashboard charm will support a relation to an OpenStack loadbalancer
application (as yet unwritten) which will manage an haproxy instance and a
vip via the hacluster subordinate. If this relation is present the dashboard
standby units will be configured to return a 500 enabling haproxy to determine
the active dashboard unit. Both the loadbalancer and the dashboard charm
will support SSL endpoint termination via a relation to vault or via
configuration options. The delivery of the dashboard subordinate should be the
initial focus of this work with the loadbalacer following soon after.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Grafana offers some visualization possibilities, but it is limited to view
only experience.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="out-of-scope"&gt;
&lt;h3&gt;Out of Scope&lt;/h3&gt;
&lt;table class="docutils align-default" id="id1"&gt;
&lt;caption&gt;&lt;span class="caption-text"&gt;Features&lt;/span&gt;&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 50.0%"/&gt;
&lt;col style="width: 50.0%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Feature&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;In Scope&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;Multi-User and Role Management&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Single Sign-On (SSO)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;SSL/TLS support&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Auditing&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Embedded Grafana Dashboards&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Monitoring (Prometheus &amp;amp; Alertmanager)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;iSCSI&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;RBD&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;RBD mirroring&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;CephFS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Object Gateway&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;✓&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;NFS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;Liam Young &amp;lt;&lt;a class="reference external" href="mailto:liam.young%40canonical.com"&gt;liam&lt;span&gt;.&lt;/span&gt;young&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-dashboard” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ceph-dashboard
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 a new operator framework subordinate charm, ceph-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a charm option for toggling ceph mgr dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a relation that implements SSL endpoint configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add actions to manage user accounts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create admin user&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;extend current functional tests using the zaza test framework (a functional
test should include deploying ceph-mon with ceph-dashboard added, without
user management actions)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create generic service loadbalancer charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a relation to a loadbalancer service which will provide a HA vip
for accessing the dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="timeline"&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;p&gt;The goal is to implement this change in the OpenStack Charms 21.10 release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;During initial development the code will be managed here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-ceph-dashboard"&gt;https://github.com/openstack-charmers/charm-ceph-dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When ready the charm will be managed via OpenDev gerrit.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-ceph-dashboard"&gt;https://opendev.org/openstack/charm-ceph-dashboard&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The charm should contain documented options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create charm options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create charm actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create charm relations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create charm README&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update of the official charm deployment guide: [0]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[0]: &lt;a class="reference external" href="https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/"&gt;https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The Dashboard endpoint has to be TLS-terminated, therefore, an option to
provide a CA certificate is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests.
Functional tests would require ceph OSD hardware or software emulation.
This is possible through Ceph cluster deployment. The deployment of the
ceph cluster would be independent from the OpenStack bundle.&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;This charm will support OpenStack Victoria and
Ubuntu 20.04 Focal as its baseline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new project will need to be created based on the OpenStack Project
&lt;cite&gt;Creator’s Guide &amp;lt;https://docs.openstack.org/infra/manual/creators.html&amp;gt;&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Nov 2021 00:00:00 </pubDate></item><item><title>Cinder subordinate charm cinder-lvm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/xena/implemented/cinder-lvm.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Cinder has a great number of drivers for different backends. Almost all
currently available commercial storage arrays and many other software only
solutions have a driver available, if not already in the upstream cinder
project, as an installable package that enables cinder with the extra driver.&lt;/p&gt;
&lt;p&gt;Because of how many possibilities exist, a model was developed where a separate
subordinate charm will be deployed to take care of the specifics of the driver
and pass configuration to the main cinder charm over a relation so that cinder
can write to its own configuration file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Instead of changing the cinder charm, this proposal aims to create a separate
subordinate charm specific for the lvm driver. The following points are of
condiderable importance for the development of this subordinate charm:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The new implementation should not conflict with current implementation. Both
should co-exist, even in the same deployment if possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new charm should implement all features currently existing in the cinder
charm, regarding the lvm functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New LVM capabilities in the exisiting cinder charm are to be considered
deprecated and will be removed at a future release.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that because the LVM driver is part of the cinder-common package, no
additional packages need to be installed for this charm to work.&lt;/p&gt;
&lt;p&gt;This charm will support the then Queens release of Openstack and newer.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;At the time of this writing, there exist no alternatives.&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;Andre Ruiz &amp;lt;&lt;a class="reference external" href="mailto:andre.ruiz%40canonical.com"&gt;andre&lt;span&gt;.&lt;/span&gt;ruiz&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: andre-ruiz&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Luciano Lo Giudice &amp;lt;&lt;a class="reference external" href="mailto:luciano.logiudice%40canonical.com"&gt;luciano&lt;span&gt;.&lt;/span&gt;logiudice&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt; - LP ID: lmlogiudice&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-cinder-lvm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-cinder-lvm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The charm, as listed above. Plus, both unit and functional tests will be
written.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Presently, the following repository hosts the charm code:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-cinder-lvm"&gt;https://github.com/openstack-charmers/charm-cinder-lvm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eventually, it will be moved to the _openstack_ namespace.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Once this charm is completed, charm-guide will be updated to reference it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security aspect is going to change in relation to the current solution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by both unit and functional tests. No special
hardware is expected to be needed to test this charm.&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 in addition to the ones that exist in the current solution.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Nov 2021 00:00:00 </pubDate></item><item><title>Service Restart Control In Charms</title><link>https://specs.openstack.org/openstack/charm-specs/specs/xena/implemented/controlled-service-restarts.html</link><description>

&lt;p&gt;Openstack charms continuously respond to hook events from their peers
related applications which frequently result in configuration
changes and subsequent service restarts. This is all fine until these
applications are deployed at large scale and having these services restart
simultaneously can cause (a) service outages and (b) excessive load on
external applications e.g. databases or rabbitmq servers. In order to
mitigate these effects we would like to introduce the ability for charms
to apply controllable patterns to how they restart their services.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;An example scenario where this sort of behaviour becomes a problem is where
we have a large number, say 1000, of nova-compute units all connected to the
same rabbitmq server. If we make a config change e.g. enable debug logging
on that application this will result in a restart all nova-* services on
every compute host in tandem which will in turn generate a large spike of
load on the rabbit server as well as making all compute operations block
until these services are back up. This could also clearly have other
knock-on effects such as impacting other applications that depend on
rabbitmq.&lt;/p&gt;
&lt;p&gt;There are a number of ways that we could approach solving this problem but
for this proposal we choose simplicity by attempting to use all information
already available to an application unit combined with some user config to
allow units to decide how best to perform these actions.&lt;/p&gt;
&lt;p&gt;Every unit of an application already has access to some information that
describes itself with respect to its environment e.g. every unit has a unique
id and some applications have a peer relation that gives them information
about their neighbours. Using this information coupled with some extra
config options on the charm to vary timing we could provide the operator
the ability to control service restarts across units using nothing more
than basic mathematics and no juju api calls.&lt;/p&gt;
&lt;p&gt;For example, let’s say an application unit knows it has id 215 and the user
has provided two options via config; a modulo value of 2 and an offset of
10. We could then do the following:&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;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;215&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;which, when applied to all units, would result in 50% of the cluster
restarting its services 10 seconds after the rest. This should hopefully
alleviate some of the pressure resulting from cluster-wide synchronous
restarts, ensuring that part of the cluster is always responsive and
making restarts happen quicker.&lt;/p&gt;
&lt;p&gt;As mentioned above we will require two new config options to any charm for
which this logic is supported:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;service-restart-offset (default to 10)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;service-restart-modulo (default to 1 so that default behaviour is same as&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;before)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The restart logic will skip for any charms not implementing these options.&lt;/p&gt;
&lt;p&gt;Over time some units may be deleted from and added back to the cluster
resulting in non-contiguous unit ids. While for applications deployed at
large scale this is unlikely to be significantly impactful, since subsequent
adds and deletes will cancel each other out, it could nevertheless be a
problem so we will check for the existance of a peer relation on the
application we are running and, if one exists, use the info in that relation
to normalise unit ids prior to calculating delays.&lt;/p&gt;
&lt;p&gt;Lastly, we must consider how to behave when the charm is being used to upgrade
Openstack services whether directly using config (“big bang”) or using actions
defined on a charm. For the case where all services are upgraded at once we
will leave it to the operator to set/unset the offset parameters. For the case
where actions are being used, and likely only a subset of units are being
upgraded at once, we will ignore the control settings i.e. delays will not
be used.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To implement this change we will extend the restart_on_change() decorator
implemented across the openstack charms so that when services are stop/started
or restarted they will include a time.sleep(delay) where delay is
calculated from unit id combined with two new config options;
service-restart-offset and service-restart-modulo. This calculation will be
done in a new function that will be implemented in contrib.openstack the
output of which will be passed into the restart_on_changed() decorator.&lt;/p&gt;
&lt;p&gt;Since a decorator is used we do not need to worry about multiple restarts of
the same service. We do, however, need to consider how apply offsets when
stop/start and restarts are performed manually as is the case in the action
managed upgrades handler.&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;hopem&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “controlled-service-restarts” for all patches related to
this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;controlled-service-restarts
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 charmhelpers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sync into openstack charms and add new config opts&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;These new settings will be properly documented in the charm config.yaml as
well as in the charm deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be provided in charm-helpers and functional tests will be
updated to include config that enables this feature. Scale testing to prove
effectiveness and determine optimal defaults will also be required.&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>Wed, 10 Nov 2021 00:00:00 </pubDate></item><item><title>OpenStack Endpoint Load Balancer</title><link>https://specs.openstack.org/openstack/charm-specs/specs/xena/implemented/openstack-load-balancer.html</link><description>

&lt;p&gt;To enable Openstack services for a single cloud to be installed in a highly
available configuration without requiring that each unit of a service is in
the same broadcast domain.&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;As a cloud administrator I would like to simplify my deployment so that I
don’t have to manage a corosync and pacemaker per OpenStack API service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud where all services will be
in a single broadcast domain. I see no need to use the new central
loadbalancer and would like to continue to have each service manage its
own VIP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I would like to spread my control plane across N racks
for redundancy. Each rack is in its own broadcast domain. I do not want the
users of the cloud to require knowledge of this topology. I want the
endpoints registered in Keystone to work regardless of a rack level failure.
I am using network spaces to segregate traffic in my cloud and the OpenStack
loadbalancer has access to all spaces so I only require one set of
loadbalancers for the deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I would like to spread my control plane across N racks
for redundancy. Each rack is in its own broadcast domain. I do not want the
users of the cloud to require knowledge of this topology. I want the
endpoints registered in Keystone to work regardless of a rack level failure.
I am using network spaces to segregate traffic in my cloud. I want the
segregation to extend to the load balancers and so will be requiring a set
of load balancers per network space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new internal cloud and have no
interest in IPv6, I wish to deploy a pure IPv4 solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud. I appreciate that it has
been 18 years since the IETF brought us IPv6 and feel it maybe time to
enable IPv6 within the cloud. I am happy to have some IPv4 where needed
and am looking to deploy a dual stack IPv4 and IPv6.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud. I appreciate that it has
been 18 years since the IETF brought us IPv6 and wish to never see an IPv4
address again. I am looking to deploy a pure IPv6 cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I wish to use DNS HA in conjunction with the OpenStack
loadbalancer so that loadbalancer units can be spread across different
subnets within each network space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I would like to have the OpenStack load balancers
look after HA and so will be deploying in an Active/Passive deployment.
I will need to use a VIP for the loadbalancer in this configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I have an existing hardware loadbalancers I wish to
use. I do not want to have to update it with the location of each API
service backend. Instead I would like to have the OpenStack load balancers
in an Active/Active configuration and have the hardware loadbalancers
manager traffic between haproxy instance in the OpenStack loadbalancer
service. I do not need to use a VIP for the loadbalancer in this
configuration. My hardware loadbalancers utilise vip(s) which will need
to be registered as the endpoints for services in Keystone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator haproxy statistics are fascinating to me and I
want the statistics from all haproxy instances to be aggregated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I would like haproxy to be able to perform health
checks on the backends which assert the health of a service more
conclusively than simple open port checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I want to be able to configure max connections
and timeouts as my cloud evolves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a charm author of a service which is behind the OpenStack load balancer
I would like the ability to tell the loadbalancer to drain connection to a
specific unit and take it out of service. This will allow the unit to go
into maintenance mode.&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;section id="new-interface-openstack-api-endpoints"&gt;
&lt;h3&gt;New interface: openstack-api-endpoints&lt;/h3&gt;
&lt;p&gt;This interface allows a backend charm hosting API endpoints to inform
the OpenStack loadbalancer which services it’s hosting and on which IP
address and port frontend API requests should be sent to on the backend
unit.  It also allows the backend charm to inform the loadbalancer which
frontend port should be used for each service.&lt;/p&gt;
&lt;p&gt;Example - neutron-api (single API endpoint per unit):&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;endpoints&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;service-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;network&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;9696&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;9689&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example - nova-cloud-controller (multiple API endpoints per unit):&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;endpoints&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;service-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;nova&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8774&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;8764&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&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;service-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;nova-placement&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8778&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;8768&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A single instance of the OpenStack Loadbalancer application will only service
a single type of OpenStack API endpoint (public, admin or internal).  The
charm will use the network space binding of the frontend interface to determine
which IP or VIP (if deployed in HA configuration) should be used by the
backend API service for registration into the Cloud endpoint catalog.&lt;/p&gt;
&lt;p&gt;Having processed the requests from all backend units, the loadbalancer now
needs to tell the backend application the external IP being used to listen for
connections for each endpoint service type:&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;endpoints&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;service-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;nova&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-ip&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;98.34.12.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8774&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;service-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;nova-placement&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-ip&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;98.34.12.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8778&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The backend service now updates the endpoints in the Keystone registry to point
at the IPs passed back by the loadbalancer.&lt;/p&gt;
&lt;p&gt;This interface is provided by each backend API charm and consumed via
the backend interface on the OpenStack loadbalancer charm.  Each backend
charm would provide three instances of this interface type:&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;provides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;public-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;admin-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;internal-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Taking this approach means that the backend charm can continue to be the
entry point/loadbalancer for some endpoint types, and push the loadbalancing
for other entry points out to the OpenStack Loadbalancer charm (or multiple
instances).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="updates-to-keystone-endpoint-calculation-code"&gt;
&lt;h3&gt;Updates to keystone endpoint calculation code&lt;/h3&gt;
&lt;p&gt;Currently the following competing options are used to calculate which EP should
be registered in Keystone:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;os-*-network set do resolve_address old method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dnsha use dnsha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;os-*-hostname set use hostname&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;juju network space binding via extra-bindings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prefer ipv6 via configuration option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;presence of {public,internal,admin}-backend relations to
openstack loadbalancers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="openstack-loadbalancer-charm"&gt;
&lt;h3&gt;OpenStack Loadbalancer charm&lt;/h3&gt;
&lt;p&gt;New charm - OpenStack Loadbalancer - with corresponding tests &amp;amp; QA CI/setup.&lt;/p&gt;
&lt;/section&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;Extend existing HAProxy charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use DNS HA.&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;unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “osbalancer” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;osbalancer
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-openstack-loadbalancer-charm"&gt;
&lt;h4&gt;Provide OpenStack Loadbalancer Charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write draft interface for LB &amp;lt;-&amp;gt; Backend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests for Keystone endpoint registration code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write Keystone endpoint registration code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-mistral"&gt;
&lt;h4&gt;Mojo specification deploying and testing Mistral&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying LB in an HA configuration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Mistral charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-openstack-loadbalancer
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The OpenStack Loadbalancer charm should contain a README with instructions on
deploying the charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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>Wed, 10 Nov 2021 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/yoga/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Nov 2021 00:00:00 </pubDate></item><item><title>Ceph Benchmarking</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/ceph-benchmarking.html</link><description>

&lt;p&gt;Proposing a new charm, ceph-benchmarking, and additions to the Zaza test
framework, in order to provide a simple repeatable method for testing ceph
performance.&lt;/p&gt;
&lt;p&gt;This new charm will allow for A/B testing. Performance can be compared between
a deployment with a feature turned on and a deployment with the feature turned
off in order to make informed choices on feature usage.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://tracker.ceph.com/projects/ceph/wiki/Benchmark_Ceph_Cluster_Performance"&gt;Benchmark Ceph Cluster Performance&lt;/a&gt; will be used as template for the various
tests.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;It is often unclear what performance one should expect from a software stack
like Ceph. For example, it is difficult to give performance expectations in
absolute terms (e.g. IOPS, throuput, etc), because performance is hardware and
technology dependent. It may also be difficult to determine which suite of
features to use and what their relative cost / benefit quotient might be.&lt;/p&gt;
&lt;p&gt;The proposed changes will allow for acquiring relative performance (IOPs) on a
given set of hardware that can be compared with various features turned on or
off. Testing can be performed on hardware prior to a production deployment in
order to give a before and after perspective on how the Ceph cluster performs
in order to assist in bottleneck detection.&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;ceph-benchmarking charm&lt;/p&gt;
&lt;p&gt;A charm with several actions to run Ceph performance benchmarking tests and
gather their results. (e.g. ‘rados bench’, ‘rbd bench’, ‘fio’, ‘swift bench’)
The new charm will utilised the Ops Framework and leverage ops_openstack code
base.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Proposed actions and parameters&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;net-iperf&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;IP(s) of Ceph cluster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fio-disk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;disk(s)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;readwrite&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;blocksize&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iodepth&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rados-bench&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;pool&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;duration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;task (write, random, sequential)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rbd-bench&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;pool&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;image&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fio-ceph&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;readwrite&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;blocksize&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iodepth&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;swift-bench&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Additions to the Zaza test framework&lt;/p&gt;
&lt;p&gt;The Zaza test framework uses libjuju under the hood and allows for standing
up deployments from bundles and executing suites of tests against them. Test
targets for each action on the new charm will be added allowing for a suite
of Ceph performance tests to be repeated as often as desired.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;All of the tests in &lt;a class="reference external" href="https://tracker.ceph.com/projects/ceph/wiki/Benchmark_Ceph_Cluster_Performance"&gt;Benchmark Ceph Cluster Performance&lt;/a&gt; can be run manually.
The goal is to make this process more efficient.&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: David Ames (thedac)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-benchmarking” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review -t ceph-benchmarking
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;ceph-benchmarking charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zaza targets&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;The ceph-benchmarking charm will initially reside in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-charmers&lt;/span&gt;&lt;/code&gt;
namespace and may eventually move to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt; namespace:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/charm-ceph-benchmarking"&gt;https://github.com/openstack-charmers/charm-ceph-benchmarking&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Additions to Zaza will be added to the zaza-openstack-tests repository:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/zaza-openstack-tests"&gt;https://github.com/openstack-charmers/zaza-openstack-tests&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation will be written for the usage of ceph-benchmarking and related
Zaza tests. The actions for the charm will be documented in the charm’s README.
The usage of the actions with or without Zaza will be an appendix to the
charm-guide and / or the deployment-guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The various tests may leave behind test detritus. Cleanup will be attempted
where possible, but the operator will need to take responsibility for any
security implications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The proposed changes are the tests themselves. The Zaza targets will provide
functional testing for the ceph-benchmarking charm.&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://tracker.ceph.com/projects/ceph/wiki/Benchmark_Ceph_Cluster_Performance"&gt;Benchmark Ceph Cluster Performance&lt;/a&gt; is the template for the various tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>Magnum</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/charm-magnum-spec.html</link><description>

&lt;p&gt;Magnum is an OpenStack API service, developed by the OpenStack Containers team,
making container orchestration engines (COEs) such as Docker Swarm, Kubernetes,
and Apache Mesos available as first class resources in OpenStack.&lt;/p&gt;
&lt;p&gt;It uses Heat to orchestrate an OpenStack image, which contains the
COE (for example: Docker and Kubernetes), and it runs that image in either
virtual machines or bare metal in a cluster configuration.&lt;/p&gt;
&lt;p&gt;Also, Magnum offers complete life-cycle management of COEs in an OpenStack
environment, integrated with other OpenStack services. This allows a seamless
experience for OpenStack users who wish to run containers in an OpenStack
environment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There is currently no charm that lets you easily deploy Magnum as part of
Charmed OpenStack.&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 set of reactive charms that enables the deployment of all required
Magnum components. Changes will also be made to existing charms to integrate
with the new Magnum charms.&lt;/p&gt;
&lt;p&gt;Baseline supported OpenStack version will be Ussuri.&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;p&gt;The implementation consists of the following new charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;magnum&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provides the Magnum API. OpenStack administrators and Openstack Dashboard
will call into this API to provision and manage Kubernetes clusters (or
any other COE).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requires relations to AMQP, certificates, database and Keystone.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;magnum-dashboard&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a new subordinate charm for Openstack Dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implements the necessary changes to enable Magnum UI in Horizon&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation also requires changes to the following charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;keystone&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add Magnum to the list of valid services.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;oprinmarius&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “magnum-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;magnum-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation section describes the working items.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-magnum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-magnum-dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-keystone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Each charm will contain a README with instructions on deploying the charm.
In addition, an appendix will be added to the deployment guide which will
outline various deployment scenarios, hardware and networking requirements
and config options.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;magnum&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Requires keystone, database and rabbitmq credentials which will be
stored in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;magnum.conf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The API endpoints for Magnum will optionally be accessible via TLS,
either by creating a relation to Vault / easy-rsa, or by manually
supplying the TLS key/cert via config&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>Cinder Ceph Replication</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/cinder-ceph-replication.html</link><description>

&lt;p&gt;Cinder replication allows Disaster Recovery (DR) via the Ceph RBD driver.
During a failover scenario, the Cinder Ceph RBD driver will promote the
secondary Ceph images to primary and use those going forward.&lt;/p&gt;
&lt;p&gt;The Ceph RBD driver implements the Cinder replication mechanism. More info
about it here:
&lt;a class="reference external" href="https://docs.openstack.org/cinder/victoria/contributor/replication.html"&gt;https://docs.openstack.org/cinder/victoria/contributor/replication.html&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There are two possible Ceph RBD mirroring modes (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt;), and
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; charm knows to do only &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt; mode. More info about
RBD mirroring modes here:
&lt;a class="reference external" href="https://docs.ceph.com/en/latest/rbd/rbd-mirroring/#enable-mirroring"&gt;https://docs.ceph.com/en/latest/rbd/rbd-mirroring/#enable-mirroring&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt; mirroring mode is required for the Ceph replication mechanism,
because the Ceph RBD driver will explicitly enable mirroring for each Ceph
image, and set the required image features (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exclusive-lock&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;journaling&lt;/span&gt;&lt;/code&gt;). When mirroring mode is set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt;, mirroring is enabled
by default on all the Ceph images in the pool, and the Ceph clients will not
take care of this part.&lt;/p&gt;
&lt;p&gt;We want &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt; mirroring mode (instead of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt;) for the Cinder
replication mechanism, because we don’t want all the Cinder Ceph images
blindly mirrored. The mirroring will be orchestrated via the Cinder volume
types. More info about this here:
&lt;a class="reference external" href="https://docs.openstack.org/cinder/ussuri/contributor/replication.html#volume-types-extra-specs"&gt;https://docs.openstack.org/cinder/ussuri/contributor/replication.html#volume-types-extra-specs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, Cinder needs connection credentials to the remote cluster where the
images are mirrored, to be able to perform a failover. This information needs
to go into the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder.conf&lt;/span&gt;&lt;/code&gt;, under the backend section with replication
enabled.&lt;/p&gt;
&lt;p&gt;Right now, if &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; has a relation with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt;, it
instructs its clients from the other relation (implementing the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-client&lt;/span&gt;&lt;/code&gt; interface) to use the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exclusive-lock&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;journaling&lt;/span&gt;&lt;/code&gt;
features, by default, for all the images in the pool.&lt;/p&gt;
&lt;p&gt;We need to have the RBD mirroring features, enabled by default for all the
images, only when mirroring mode is set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt;. When the mirroring mode
is set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt;, the Ceph client will explicitly set the RBD mirroring
features on each image, if needed.&lt;/p&gt;
&lt;p&gt;Therefore, we need to ignore the advertised default RBD image features from
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm, if the Ceph clients will have the mirroring mode set
to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt; charm should have a new config option called
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt; that should be passed as part of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;create-pool&lt;/span&gt;&lt;/code&gt;
broker request to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm will forward the broker request with the new
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt; flag to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; charm, which should
be able to handle it and enable the requested mirroring mode for the pool.&lt;/p&gt;
&lt;p&gt;Also, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; charm should use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt; mirroring mode if it
doesn’t find any mode explicitly set in the broker request. This
functionality should maintain the backwards compatibility of the charm.&lt;/p&gt;
&lt;p&gt;On top of this, the Ceph clients implementing the new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt;
config option (for example &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt; charm) should not use the
advertised default RBD mirroring features from the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm, when
mirroring mode is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt;. We can safely assume that these clients will
take care of explicitly setting those image features.&lt;/p&gt;
&lt;p&gt;When all of the above are in place, Cinder needs to be able to connect to the
mirrored images, in the remote cluster, when a failover happens. It will
promote the mirrored image to primary and use that going forward.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt; charm will get the connection credentials to the remote
Ceph cluster through a new relation with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm. The new
relation will implement the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-client&lt;/span&gt;&lt;/code&gt; interface, and it will
be named &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-replication-device&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Also, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; needs to be able to connect to the Ceph cluster where
the Cinder volumes are mirrored (otherwise, the VMs won’t be able to access
Cinder volumes after a failover).&lt;/p&gt;
&lt;p&gt;At the moment, the interface &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph-key&lt;/span&gt;&lt;/code&gt; is used by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt; to
grant access to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; for the main Ceph backend. We need to grant
access to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; for the secondary backend (with the replicated
devices).&lt;/p&gt;
&lt;p&gt;Thus, we extend the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-access&lt;/span&gt;&lt;/code&gt; relation (that implements the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph-key&lt;/span&gt;&lt;/code&gt; interface), and we set a new relation variable called
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;keyrings&lt;/span&gt;&lt;/code&gt;. This is a list of Ceph keys corresponding to the Cinder main
and replication backends. This new relation variable is only set when Cinder
replication is enabled, otherwise fallback to setting the previous relation
data.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&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;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;ionutbalutoiu (primary)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oprinmarius&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “cinder-ceph-replication” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cinder-ceph-replication
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;cinder-ceph&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provides a new config option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirror-mode&lt;/span&gt;&lt;/code&gt; (with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pool&lt;/span&gt;&lt;/code&gt; as the
default value), and it will send this to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; as part of the
broker request to create the pool (which is going to be forwarded to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implements a new relation, using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-client&lt;/span&gt;&lt;/code&gt; interface, with the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm. The relation is called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-replication-device&lt;/span&gt;&lt;/code&gt;.
This is going to be used to get the connection information to the remote
Ceph cluster where the pool is mirrored. This information will go into the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder.conf&lt;/span&gt;&lt;/code&gt; as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replication_device&lt;/span&gt;&lt;/code&gt; config option, under the backend
with replication enabled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-access&lt;/span&gt;&lt;/code&gt; relation. If replication is enabled, make sure
to set the list of Ceph keys (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;keyrings&lt;/span&gt;&lt;/code&gt;) for both Cinder main and
replication backends.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Handles the extended &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-access&lt;/span&gt;&lt;/code&gt; relation. If more than a single Ceph
key is set as part of the relation data, make sure that both of them are
configured.&lt;/p&gt;
&lt;p&gt;Makes sure that the previous relation data is handled as well (to maintain
backwards compatibility).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-mon&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Forwards the broker requests to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; with information
about the RBD mirroring mode.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-rbd-mirror&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Handles the new RBD mirroring mode flag from the forwarded broker
request given by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt; charm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-helpers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Update the broker request handler to take into consideration the new
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt; flag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CephContext&lt;/span&gt;&lt;/code&gt; to ignore advertised default RBD features from the
relation with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-mon&lt;/span&gt;&lt;/code&gt;, if the client charm implements the new
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt; flag, and that’s set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;image&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Ceph relation name parameter to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CephContext&lt;/span&gt;&lt;/code&gt; constructor. The
current implementation assumes that the clients will name their relation
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph&lt;/span&gt;&lt;/code&gt;. This will remove the hard-coded value, and make it the default
parameter value. Thus, we will maintain the backwards compatibility.&lt;/p&gt;
&lt;p&gt;This is going to be useful for charms that implement the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-client&lt;/span&gt;&lt;/code&gt;
interface, but the relation name is not &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-cinder-ceph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-nova-compute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-ceph-mon&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-ceph-rbd-mirror&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;juju/charm-helpers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rbd-mirroring-mode&lt;/span&gt;&lt;/code&gt; config option will be documented in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt; charm, and in the Ceph RBD mirroring charm deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder-ceph&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It requires connection credentials to the remote Ceph cluster where the
images are being mirrored by the Ceph RBD mirroring daemon.&lt;/p&gt;
&lt;p&gt;These are passed to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder&lt;/span&gt;&lt;/code&gt; principal charm via the container-scoped
relation. They will go into the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cinder.conf&lt;/span&gt;&lt;/code&gt;, under the backend with
replication enabled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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 new dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>OpenStack Compute Nodes Juju Availability Zones Sync</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/compute-nodes-az-sync.html</link><description>

&lt;p&gt;For some providers, Juju may set the environment variable
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;JUJU_AVAILABILITY_ZONE&lt;/span&gt;&lt;/code&gt; with information about the availability zone of the
machine deployed.&lt;/p&gt;
&lt;p&gt;OpenStack has the concept of availability zones too, and it would be useful
for Juju operators to have the option of automatically sync the Juju
availability zones with the OpenStack availability zones.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At the moment, a Juju operator needs to manually sync the nova-compute Juju
machines’ availability zones (AZs), with the OpenStack AZs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new Juju action to the nova-cloud-controller charm will be implemented to
automatically sync the Juju AZs with the OpenStack AZs. The availability zone
for each Juju unit is exposed to the nova-cloud-controller charm through the
cloud-compute relation.&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;ionutbalutoiu&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “compute-nodes-az-sync” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;compute-nodes-az-sync
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;nova-compute&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Set a new relation variable called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;availability_zone&lt;/span&gt;&lt;/code&gt; in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-compute&lt;/span&gt;&lt;/code&gt; relation (used to relate to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-cloud-controller&lt;/span&gt;&lt;/code&gt;
application). This variable will take the value of the automatic Juju
variable &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;JUJU_AVAILABILITY_ZONE&lt;/span&gt;&lt;/code&gt;, if this is set by the underlying
provider.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-cloud-controller&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Implement a new Juju action called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync-compute-availability-zones&lt;/span&gt;&lt;/code&gt; used
to sync the Juju availability zones, set by the remote units in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud-compute&lt;/span&gt;&lt;/code&gt; relation, with the OpenStack availability zones.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-nova-compute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-nova-cloud-controller&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The new Juju action needs to be documented in the appropriate docs that
reference the nova-cloud-controller actions. This is the only user-facing
change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-cloud-controller&lt;/span&gt;&lt;/code&gt; charm does not install the Nova client Python
library. This is needed for the new Juju action, so it is added to the charm
Python dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>Deferred Service Restarts</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/deferred-service-restarts.html</link><description>

&lt;p&gt;When a charm or package is upgraded services are restarted. This can impact the
data plane causing outages. This spec is aimed at giving the cloud operator the
option of deferring these restarts to a later, more convenient, time.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;One example of the issue would be a charm upgrade which includes a minor
template change. Charm upgrades are executed on all units of an application
simultaneously (the cloud operator has no control over this). The charms are
designed to restart services when configuration files are changed so the same
set of services, across all units, will be simultaneously restarted.&lt;/p&gt;
&lt;p&gt;Another example is when a package update is triggered by the charm, it may be
useful to defer any service restarts until after a lengthy package update
completes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add charm configuration option to control automatic service restarts.&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;enable-auto-restarts&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;boolean&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="l l-Scalar l-Scalar-Plain"&gt;True&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Allow the charm and packages to restart services automatically when&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;required&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add charm action to run service restarts.&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;restart-services&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Restarts services this charm manages.&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;deferred-only&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;boolean&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="l l-Scalar l-Scalar-Plain"&gt;false&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;Only restart deferred services.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;services&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;""&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;Optional space seperated list of services to restart. If unset&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;then it applies to all services the charm controls.&lt;/span&gt;
&lt;span class="nt"&gt;show-deferred-restarts&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;Show the outstanding restarts&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If a charm has &lt;cite&gt;enable-auto-restarts&lt;/cite&gt; disabled this will be reflected in the
charms workload status message. The starts that have been requested, but
deferred, by either the charm or a package update can be seen by running
the &lt;cite&gt;show-deferred-restarts&lt;/cite&gt; action.&lt;/p&gt;
&lt;p&gt;To block restarts, charms will first check whether &lt;cite&gt;enable-auto-restarts&lt;/cite&gt;
has been disabled and only perform the restart if permitted. Ideally preventing
services from being stopped or restarted would be done within systemd but this
does not seem to be possible in a clean way. Relying on the charm to police
itself is not ideal as there are many places a restart command can emanate from
and there is always the risk that a future charm update will introduce a
restart call that does not honour &lt;cite&gt;enable-auto-restarts&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Packages may try and restart a service during an update. To stop this from
happening a custom &lt;cite&gt;/usr/sbin/policy-rc.d&lt;/cite&gt; script will be installed to block
the package changes from causing any restarts. Charms will indicate which
services they want to block restarts for by writing a file to
&lt;cite&gt;/etc/policy-rc.d&lt;/cite&gt;.  &lt;cite&gt;/usr/sbin/policy-rc.d&lt;/cite&gt; will collect all the files from
&lt;cite&gt;/etc/policy-rc.d&lt;/cite&gt; to construct a list of services which are not permitted to
be restarted.&lt;/p&gt;
&lt;p&gt;The flow for deferring restarts:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Operator updates application to set &lt;cite&gt;enable-auto-restarts=False&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;cite&gt;/usr/sbin/policy-rc.d&lt;/cite&gt; file is written&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A charm specific file is placed in &lt;cite&gt;/etc/policy-rc.d&lt;/cite&gt; which list which
services should be blocked from restarting.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The flow for re-enabling restarts:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Operator updates application to set &lt;cite&gt;enable-auto-restarts=True&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The charm specific file is removed from &lt;cite&gt;/etc/policy-rc.d&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optionally, the operator runs the &lt;cite&gt;restart-services&lt;/cite&gt; action against each
application unit.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The existing &lt;cite&gt;Pause&lt;/cite&gt; and &lt;cite&gt;Resume&lt;/cite&gt; actions will continue to operate as they
do now irrespective of the value of &lt;cite&gt;enable-auto-restarts&lt;/cite&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The problem could be handled if Juju were to implement a feature allowing charm
updates to be performed on a unit by unit basis.&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;gnuoy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “deferred-restarts” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;deferred-restarts
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 &lt;cite&gt;policy-rc.d&lt;/cite&gt; script and add to charm-helpers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write functions in charm-helpers for managing the masking of services
and files in &lt;cite&gt;/etc/policy-rc.d&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each charm will need to add the new action and configuration option and the
charm will need to gate any service interupting restarts on the value of
&lt;cite&gt;enable-auto-restarts&lt;/cite&gt; in a similar way to the existing &lt;cite&gt;is_unit_paused_set&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories are required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The new actions will need to be documented in the charm-guide and the upgrade
sections updated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The regularly scheduled upgrade testing would be a good place to test this
feature.&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>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>NetApp Data ONTAP as Manila storage backend</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/implemented/manila-netapp.html</link><description>

&lt;p&gt;The existing Manila NetApp Clustered Data ONTAP driver should be used to
configure the shares storage backend.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There isn’t any backend configuration charm that relates to the principal
Manila charm, and configures the NetApp storage backend.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new subordinate charm that relates to the Manila principal charm, and sends
the proper NetApp Data ONTAP backend configuration.&lt;/p&gt;
&lt;p&gt;The new charm is a backend configuration charm that allows relevant config
options to connect to an already deployed NetApp Data ONTAP cluster. The config
options need to suffice for the Manila backend configuration.&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;ionutbalutoiu&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “manila-netapp” for all the patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;manila-netapp
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;manila-netapp&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Brand new subordinate charm that implements the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;manila-plugin&lt;/span&gt;&lt;/code&gt;
interface, and it relates to the principal Manila charm. The charm is
responsible to do the appropriate backend configuration to have
NetApp Data ONTAP as Manila shares storage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;openstack/charm-manila-netapp&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This change will require new documentation to the charm-guide, in addition
to new charm documentation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The Manila NetApp  driver needs the admin credentials to manage the external
storage cluster. These credentials will be stored in the charm config, and
they will be part of the Manila backend configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be added to cover the new charm functionality.&lt;/p&gt;
&lt;p&gt;New functional tests will be added to validate the new charm, including
end-to-end testing of the entire solution.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The packages that are required for this work are already included in the
Ubuntu archives. There are no other new, external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/xena/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sat, 31 Jul 2021 00:00:00 </pubDate></item><item><title>Ceph BlueStore Compression</title><link>https://specs.openstack.org/openstack/charm-specs/specs/victoria/implemented/ceph-bluestore-compression.html</link><description>

&lt;p&gt;The Ceph BlueStore storage backend has support for inline compression.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Ceph charms currently do not provide documentation, validation or support
for enabling BlueStore inline compression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Ceph supports configuring compression through per-pool properties and global
configuration options. What configuration to use depends on the type of data
and the characteristics of the underlying storage devices in use.&lt;/p&gt;
&lt;p&gt;To accomodate this we should allow Ceph consuming charms to configure
compression on a per-pool basis and have centrally managed defaults for any
options not provided.&lt;/p&gt;
&lt;p&gt;The following configuration options will be added:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-algorithm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-required-ratio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-min-blob-size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-min-blob-size-hdd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-min-blob-size-ssd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-max-blob-size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-max-blob-size-hdd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bluestore-compression-max-blob-size-ssd&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Support will be provided for Ceph Mimic and onwards on Ubuntu 18.04 LTS and
onwards.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-bluestore-compression” for all patches related to this
spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ceph-bluestore-compression
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 the Ceph broker API to support providing compression options on pool
requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add context that can be used by both consuming and providing charms to map
charm configuration options into CephBrokerRq op properties as well as Jinja2
template context data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-client&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; reactive interfaces to
support relaying compression options for pool creation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add charm configuration options to control global compression defaults to the
ceph-osd charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add charm configuration options to control compression on pool creation to
the following charms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-ceph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-iscsi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for copying compression properties on pool mirroring to the
ceph-rbd-mirror charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establish a performance baseline and perform benchmark for use in a
hyper-converged deployment topology and document results and recommendations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories are required to implement this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The individual configuration options will get a description that explains basic
usage.&lt;/p&gt;
&lt;p&gt;A new appendix or section should be added to the deployment-guide to document
results of benchmark and recommendations for deployment of Ceph with BlueStore
Compression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Apart from enabling code paths in Ceph that was previously not exposed in the
charms, there are no security specific considerations for this feature work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Existing charm gates should be extended to validate the operation of the new
charm configuration options.&lt;/p&gt;
&lt;p&gt;No special hardware is required to validate the feature.&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, 29 Oct 2020 00:00:00 </pubDate></item><item><title>Ceph Erasure Coded Pool Support</title><link>https://specs.openstack.org/openstack/charm-specs/specs/victoria/implemented/ceph-erasure-coding.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Ceph Erasure Coded pools provide an alternative to Replicated pools with
comparable performance whilst requiring less raw block device storage for
the same effective usable capacity.&lt;/p&gt;
&lt;p&gt;The Ceph charms and charms that consume ceph services don’t currently
provide support for use of Erasure Coded pools.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The ceph-{mon,proxy} broker will be extended to support the creation of
erasure-coded pools.  Some code exists in the broker to support EC pools
however it has never been tested so may require some updates and refactoring.&lt;/p&gt;
&lt;p&gt;Some existing support exists in both charmhelpers and charms.ceph to support
the creation of erasure coded pools; however it is largely untested and will
need to be validated and updated as part of the work to enable support
for Erasure Coding in the OpenStack Charms.  Existing gaps include support
for EC overwrites (required for most RBD use-cases) and providing the
minimum size for the EC pool.&lt;/p&gt;
&lt;p&gt;Erasure Coding has been supported by Ceph for some time however overwrites
(required for RBD uses cases) where not implemented until Luminous so the
minimum version requirement for Ceph is Luminous as shipped with Ubuntu
18.04 LTS.&lt;/p&gt;
&lt;p&gt;Ceph deployments must be using Bluestore - Filestore based deployments
cannot support RBD use-cases without the use of a cache tier (which is
not supported in charmed deployments).&lt;/p&gt;
&lt;p&gt;Consuming charms will be updated to include new configuration options to
support the use of EC pools - this includes the following charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;glance (rbd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-ceph (rbd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute (rbd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-iscsi (rbd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-fs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="docutils align-default" id="id1"&gt;
&lt;caption&gt;&lt;span class="caption-text"&gt;Erasure Coding charm options&lt;/span&gt;&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 25.0%"/&gt;
&lt;col style="width: 5.0%"/&gt;
&lt;col style="width: 15.0%"/&gt;
&lt;col style="width: 55.0%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Option&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Default Value&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;pool-type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;replicated&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Ceph pool type to use for storage - valid values are ‘replicated’ and ‘erasure-coded’.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;Name for the EC profile to be created for the EC pools. If not defined a profile name will be generated based on the name of the pool used by the application.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-rbd-metadata-pool&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;Name of the metadata pool to be created (for RBD use-cases).  If not defined a metadata pool name will be generated based on the name of the data pool used by the application.  The metadata pool is always replicated (not erasure coded).&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-k&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Number of data chunks that will be used for EC data pool. K+M factors should never be greater than the number of available AZs for balancing.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-profile-m&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Number of coding chunks that will be used for EC data pool. K+M factors should never be greater than number of available AZs for balancing.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-locality&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;(lrc plugin - l) Group the coding and data chunks into sets of size l. For instance, for k=4 and m=2, when l=3 two groups of three are created. Each set can be recovered without reading chunks from another set.  Note that using the lrc plugin does incur more raw storage usage than isa or jerasure in order to reduce the cost of recovery operations.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-profile-crush-locality&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;(lrc plugin) The type of the crush bucket in which each set of chunks defined by l will be stored. For instance, if it is set to rack, each group of l chunks will be placed in a different rack. It is used to create a CRUSH rule step such as ‘step choose rack’. If it is not set, no such grouping is done.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-durability-estimator&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;(shec plugin - c) The number of parity chunks each of which includes each data chunk in its calculation range. The number is used as a durability estimator. For instance, if c=2, 2 OSDs can be down without losing data.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-profile-helper-chunks&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;(clay plugin - d) Number of OSDs requested to send data during recovery of a single chunk. d needs to be chosen such that k+1 &amp;lt;= d &amp;lt;= k+m-1. The larger the d, the better the savings.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-scalar-mds&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;(clay plugin) Specifies the plugin that is used as a building block in the layered construction. It can be one of: jerasure, isa or shec.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-profile-plugin&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;jerasure&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;EC plugin to use for this applications pool. These plugins are available: jerasure, lrc, isa, shec, clay.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;ec-profile-technique&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;reed_sol_van&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;EC profile technique used for this applications pool - will be validated based on the plugin configured via ec-profile-plugin. Supported techniques are ‘reed_sol_van’, ‘reed_sol_r6_op’, ‘cauchy_orig’, ‘cauchy_good’, ‘liber8tion’ for jerasure, ‘reed_sol_van’, ‘cauchy’ for isa and ‘single’, ‘multiple’ for shec.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;ec-profile-device-class&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;string&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;td&gt;&lt;p&gt;Device class from CRUSH map to use for placement groups for erasure profile - valid values: ssd, hdd or nvme (or leave unset to not use a device class).&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;RBD use cases require a metadata pool which is always configured as
a replicated pool in addition to the underlying EC coded pool for
volume data storage.  The consuming application is configured to use
the metadata pool, with the data pool being configured via
‘ceph.conf’ for the specific application - for example:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;rbd default data pool = glance
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As OpenStack services specify a full path to an application specific
ceph.conf configuration file, the default data pool configuration
does not need to be scoped to a specific client identifier.&lt;/p&gt;
&lt;p&gt;The ceph-mon interface implementations for both reactive and operator
framework charms will be updated to include support for EC.&lt;/p&gt;
&lt;p&gt;OpenStack version support will be validated as part of the implementation
of this specification.&lt;/p&gt;
&lt;p&gt;This feature is not dependent on a specific version of Juju.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;EC pools can be created post deployment using actions provided by the ceph-mon
charm. However other than forking the consuming charms, no way currently exists
to provide the required configuration to Ceph and OpenStack services to consume
EC pools in RBD use-cases.&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;james-page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;gnuoy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ceph-erasure-coding” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review -t ceph-erasure-coding
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Ceph core EC enablement:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charms.ceph: Review and add required features for RBD EC pool usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charmhelpers: Review and add required features for RBD EC pool usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-mon: Resync updates to charms.ceph + charmhelpers and update
the broker code base to support any required changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-proxy: Resync updates to charms.ceph + charmhelpers and update
the broker code base to support any required changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interfaces:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-interface-ceph-client: Update to add support for EC pool and
profile creation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ops-interface-ceph-client: Update to add support for EC pool and
profile creation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-ceph-mds: Update to add support for EC pool and
profile creation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-ceph-rbd-mirror: Review for any EC pool requirements
based on support for EC in ceph rbd-mirror.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenStack RBD use cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;glance: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-ceph: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceph RBD use cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph-iscsi: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-rbd-mirror: Validate EC pools are not supported with rbd-mirror,
document in release notes and charm deployment guide.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other use cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.  All pools aside from the .data pool
must continue to be replicated pools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw: Validate support for multi-site RADOS gateway replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-fs: Add required configuration option support and updates to the
ceph broker interaction to support EC pools. Add functional testing
to cover at least earliest and latest supported releases as part of a
recheck-full pre-commit test run.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories are required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The charm deployment guide will be updated to detail use of the OpenStack
Charms with Ceph Erasure Coded pools.  This will include details on how
to structure zones within a Ceph deployment using EC pools as the requirements
are potentially quite different to replicated pools.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security attack surface is exposed by use of this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;No special hardware is required for testing of EC pools.&lt;/p&gt;
&lt;p&gt;Functional tests will be added to consuming charms to validate the creation
and use of EC pools across OpenStack and Ceph use-cases.&lt;/p&gt;
&lt;p&gt;Performance testing of EC pools will be undertaken as part of this
spec to benchmark EC pool configurations against replicated pool
configurations.&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 on other specs.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 29 Oct 2020 00:00:00 </pubDate></item><item><title>Ceph iSCSI Gateway with Operator Framework</title><link>https://specs.openstack.org/openstack/charm-specs/specs/victoria/implemented/ceph-iscsi-with-op-framework.html</link><description>

&lt;p&gt;The aim of this piece of work is to produce an Ceph iSCSI Gateway charm
written in the operator framework.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There is currently no charmed mechanism for providing Ceph backed block devices
to clients which cannot mount rbd devices directly. In addition a new charm
framework is under development and this charm is an opportunity to test it for
writing OpenStack charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To write a ceph-iscsi charm using the operator framework. The charm will
be marked as a preview charm but should have functional equivalence with a
corresponding OpenStack charm written using the reactive framework.&lt;/p&gt;
&lt;p&gt;The ceph-iscsi charm should interact with the Juju environment via the
operator framework. This means that calls to libraries like
charmhelpers.core.hookenv should be avoided. This applies to all aspects
of the charm including interfaces.&lt;/p&gt;
&lt;p&gt;What versions of the operating system are affected or required?
Focal or Bionic + HWE Kernel&lt;/p&gt;
&lt;p&gt;What version of Juju is required?
2.7+&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Write the charm using classic or reactive framework.&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;Liam Young &amp;lt;lp:gnuoy&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ceph-iscsi
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation consists of the following items:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Validate that Ubuntu ceph-iscsi packages are working on Focal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plan charm interfaces, supporting modules etc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decide how dependencies are to be handled (pip, git submodulees etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decide on how framework and dependency versions will be
pinned during development and upon release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write basic charm to deploy and configure gateway services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write functional tests to perform a multipath mount a iscsi volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write README&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Certificates interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security checklist&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add pause  &amp;amp; resume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement ceph-iscsi api security (admin_password, trusted_ips etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;zaza tests for creating nd mounting a target, doing basic i/o and
initiator reconnect testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add iscsi target create action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure update statue detects missing or incomplete relations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add series upgrade&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;This will almost certainly change but:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/ceph-iscsi"&gt;https://github.com/openstack-charmers/ceph-iscsi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/ops-openstack"&gt;https://github.com/openstack-charmers/ops-openstack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/oper-interface-ceph-client"&gt;https://github.com/openstack-charmers/oper-interface-ceph-client&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Any additional documentation will be considered for &lt;cite&gt;charm-deployment-guide&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The gateway api will be secured with a password and access limited to the IP
addresses of the other gateways.&lt;/p&gt;
&lt;p&gt;The certificates interface will also be implemented to encrypt the api
endpoint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The charm will have the standard lint, unit and functional tests. The
functional tests will be written in zaza.&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;The operator framework having sufficient maturity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A way to reuse existing code is identified. It would probably be unacceptable
to add a third version of common functions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 29 Oct 2020 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/wallaby/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 29 Oct 2020 00:00:00 </pubDate></item><item><title>CephFS NFS with Manila</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ussuri/implemented/ceph-fs-nfs-with-manilla.html</link><description>

&lt;p&gt;CephFS should be used to provide shared storage to OpenStack servers
via Manila.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The existing CephFS charm doesn’t have any usable integration with
Manila.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To add support for CephFS as a shared filesystem for an OpenStack Charm
deployed OpenStack, a few things are required. Primarily, a new charm will
be needed to bridge the NFS to CephFS protocols. The best option for this
application is Ganesha. In addition to charming Ganesha, additional work
will need to be done to improve the testability and supportablity of the
existing CephFS charm.&lt;/p&gt;
&lt;p&gt;To allow the new Ganesha charm to integrate with Manila, a new
remote-manila-plugin interface will be added to the existing Manila charm
that will act exactly the same as the existing manila-plugin interface, but
will not be container scoped. This remote-manila-plugin interface will be used
to disable the manila-share service on the Manila charm. The new manila-ganesha
charm will configure the manila-share service in addition to Ganesha.&lt;/p&gt;
&lt;p&gt;Access to the Ganesha network will include security groups restricting tenants
on the provider network from being able to access anything over that network
excepting their own NFS share, and IP restrictions will be used on the NFS
shares to restrict tenants from being able to access each others’ shares.
This provider network will be documented as requiring creation by the OpenStack
administrator. The network will need to be created to match the space that the
Ganesha charm provides its NFS service over.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As an alternative to installing Ganesha as the NFS gateway, it is possible to
implement a shared filesystem via CephFS and Manila directly. This approach
is not preferred because of the requirement to add the ceph-fs clients to all
tenants that would like to access the shared filesystems. In addition, letting
clients connect directly to Ceph reqiures exposing the Ceph cluster (mons and
OSDs) directly to tenant workloads, dramatically increasing the security
exposure to the shared storage.&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 bundle overlay to add Ceph backed storage to Manila with Ganesha would look
like:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;applications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;manila-ganesha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;manila-ganesha&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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&lt;/span&gt;
&lt;span class="nt"&gt;relations&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="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ceph-mon&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;ganesha&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;manila-ganesha:remote-manila-plugin&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;manila:remote-manila-plugin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A more complete bundle could look like:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nt"&gt;applications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ceph-mon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:~openstack-charmers-next/ceph-mon&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;3&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ceph-osd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:~openstack-charmers-next/ceph-osd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;3&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;osd-devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'10g'&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ceph-mds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:~openstack-charmers-next/ceph-mds&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;manila-ganesha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;manila-ganesha&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;manila&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:~openstack-charmers-next/manila&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;num_units&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="nt"&gt;relations&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="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ceph-mon&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;manila-ganesha&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;ceph-mon&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-osd&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;manila-ganesha:remote-manila-plugin&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;manila:remote-manila-plugin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Chris.MacNaughton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-cephfs-manila” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-cephfs-manila
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;New Manila-Ganesha charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates to the Manila charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improvements to CephFS charm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;There will be a few new repositories needed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-manila-ganesha&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, charm-manila and charm-ceph-fs charm will be updated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This change will require new documentation to the charm-guide, in addition
to new documentation in the new charms. Additionally, charm-ceph-fs will
need updated documentation to illustrate new functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This change will require some validation of the permission model and
restrictions on the ceph storage provided by manila to ensure that accessing
a share doesn’t break tenant restrictions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be added to each charm to cover any new functionality.&lt;/p&gt;
&lt;p&gt;New functional tests will be added to each of the new and existing charms to
validate functionality, including end-to-end testing of the entire solution.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The packages that are required for this work are already included in the
Ubuntu archives in Universe. The required packages in Universe (ganesha-nfs)
will be proposed for inclusion to Main as a part of this work. There are no
other new, external dependencies. The first release that will be supported for
Manila with CephFS and Ganesha is Bionic Rocky.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Jul 2020 00:00:00 </pubDate></item><item><title>ML2/OVS Mellanox Hardware Offload</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ussuri/implemented/mellanox-hw-offload.html</link><description>

&lt;p&gt;High end networking adapters such as the Mellanox Connect-X series support
up to 200Gbps networking; instances using traditional software virtualized
networking via OVS and virtio-net cannot achieve networking throughput of
more than 10Gbps without a high CPU load; it’s possible to use SR-IOV to
increase performance to nearer 100Gbps but that has limitations in terms
of the flexibility of networking options (no support for overlay networks)
and no support for security groups.&lt;/p&gt;
&lt;p&gt;The Mellanox Connect-X 5+ supports hardware offload via a feature called
ASAP2; integrated with Open vSwitch (OVS), this pushes the network data
path from the kernel directly onto a high performance embedded switch
on the network card.  This will allow instances to achieve much higher network
performance with very low CPU overheads as well as utilizing as much
of the overall network capacity to the hypervisor as possible.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Hardware offload support is not currently enabled in the OpenStack charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The neutron-openvswitch charm will be updated to support configuration of
Mellanox Connect-X 5+ network adapters to support hardware offloading
(card needs to be placed in switchdev mode on boot);  OVS will
be configured to make use of hardware offloading where possible.&lt;/p&gt;
&lt;p&gt;A new tool (mlnx-switchdev-boot) will be developed to configure the
Connect-X card in the right mode on boot prior to it being used by OVS
for networking.  This may be superseded at some future date by features
in networkd and/or netplan.&lt;/p&gt;
&lt;p&gt;This feature does make use of a number of leading edge features across the
hypervisor software stack:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Linux Kernel &amp;gt;= 5.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OVS &amp;gt;= 2.11.0&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This limits the scope of support to OpenStack Stein or later in-conjunction
with the Ubuntu LTS hardware enablement kernel from Ubuntu 19.10.&lt;/p&gt;
&lt;p&gt;The Connect-X series of cards also supports Virtual Function (VF) Link
Aggregation (LAG) providing upstream switch/cable/port resilience for
hardware offloaded ports which are supported using a VF on the
underlying network card - this is driven by the normal configuration
process for bonding network devices via Linux - in this case the
Physical Functions (PF’s) for the network cards.&lt;/p&gt;
&lt;p&gt;The existing SR-IOV VF configuration code and scripts in the
neutron-openvswitch charm is a little inconsistent and not very reliable
on reboot; this change will cover refactoring the SR-IOV VF code into
a new tool (sriov-netplan-shim) dealing with configuration of VF
functions via the charm and on reboot.  This tool will be superceeded
by SR-IOV support in netplan at some future date.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The most recent kernel and OVS versions don’t yet support connection
tracking offload which means that security groups cannot be offloaded
to the network card switch; this is under development and will land in
a later release of OVS and Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The total number of hardware offloaded ports a hypervisor can support
is limited by the total number of VF’s that the underlying network
cards can support.&lt;/p&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It’s worth noting that for VLAN or flat networking requirements, it’s
possible to achieve high throughput networking to instances by using
SR-IOV which is already supported by the neutron-openvswitch charm.&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 assignees:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;wgrant
james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “mlnx-hardware-offload” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;mlnx-hardware-offload
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Develop and test tool for configuration of Connect-X adapters for hardware
offload support.&lt;/p&gt;
&lt;p&gt;Update neutron-openvswitch to support configuration of OVS in hardware
offload mode.&lt;/p&gt;
&lt;p&gt;Add appendix to charm deployment guide to detail configuration and use
of OpenStack with Mellanox Connect-X 5+ cards in hardware offload mode.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new repository (mlnx-switchdev-mode) will be required for tooling to
configure the Mellanox Connect-X networking cards on boot.  This tool
has scope outside of the OpenStack charms project so can be developed
on github.&lt;/p&gt;
&lt;p&gt;A new repository (sriov-netplan-shim) will be required for tooling to
configure SR-IOV VF functions; this tool will superceed the existing
SR-IOV VF configuration code in the neutron-openvswitch charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation of this feature will be provided in the charm deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security risks are introduced by this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Testing of this feature requires specific hardware in the form of Mellanox
Connect-X 5+ networking cards.&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;Linux &amp;gt;= 5.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OVS &amp;gt;= 2.11.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mellanox Firmware &amp;gt;= 16.26.1040&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Jul 2020 00:00:00 </pubDate></item><item><title>MySQL 8</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ussuri/implemented/mysql8.html</link><description>

&lt;p&gt;Introduce charmed and enterprise grade MySQL 8 + InnoDB + MySQL Router as a
database solution for OpenStack models with the intention of making it the
default as of Ubuntu 20.04.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Percona XtraDB Cluster is in Universe, has failed a Main Inclusion Request
process, and will not be carried into the next LTS relative to Charmed
OpenStack deployments.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;These will be wholly new charms, not based in any way on existing MySQL or
Percona-Cluster charms, and without a charm upgrade path.&lt;/p&gt;
&lt;p&gt;Instead of in-place upgrades a migration solution will be provided to allow
existing Ubuntu 18.04 LTS deployments using the percona-cluster charm to
migrate databases directly to an Ubuntu 20.04 LTS deployment based on
mysql-innodb-cluster. Full details will be provided as an update to this spec.&lt;/p&gt;
&lt;p&gt;The charms will be promulgated to the following locations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cs:mysql-innodb-cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cs:mysql-router&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What versions of the operating system are affected or required?
19.10 (Eoan) and 20.04&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?
Train and above&lt;/p&gt;
&lt;p&gt;What version of Juju is required?
Juju 2.7+&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative is to bring percona-cluster into main for 20.04.&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;thedac&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “mysql8” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;mysql8
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation consists of the following charms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;mysql-innodb-cluster&lt;/p&gt;
&lt;p&gt;The primary charm that will handle the mysql implementation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Install MySQL 8&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handle InnoDB clustering&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interface-mysql-innodb-cluster&lt;/p&gt;
&lt;p&gt;The peer relationship for mysql-innodb-cluster&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interface-mysql-shared provides&lt;/p&gt;
&lt;p&gt;The interface mysql-shared provides side&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mysql-router&lt;/p&gt;
&lt;p&gt;The subordinate charm that will relate to the application charm and to
mysql-innodb-cluster.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Proxies DB requests and responses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interface-mysql-router&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The interface between the application and mysql-router&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mysqlsh snap&lt;/p&gt;
&lt;p&gt;The mysqlsh tool that manages the mysql innodb cluster&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;snapped from upstream source&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-mysql-innodb-cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-mysql-innodb-cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-mysql-router&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-mysql-router&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mysqlsh-snap&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Each charm and interface will contain a README with instructions on deploying
and relating the charm.&lt;/p&gt;
&lt;p&gt;Potentially an OpenStack deployment guide appendix to discuss clustering and
cluster management.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;MySQL 8 will now be in main with security auditing which percona-cluster never
had.&lt;/p&gt;
&lt;p&gt;The code reviews of the work items should include a security conscious review
approach.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests for each repository.&lt;/p&gt;
&lt;p&gt;Zaza functional tests for each charm. This will include end to end testing with
applications, mysql-router and mysql-inndob-cluster.&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;Eoan+ mysql8 packaging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MySQL shell&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Jul 2020 00:00:00 </pubDate></item><item><title>Enablement of S3 storage backend for Gnocchi</title><link>https://specs.openstack.org/openstack/charm-specs/specs/victoria/implemented/gnocchi-s3.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The gnocchi charm is a multi-tenant times eries, metrics and resources
database. It currently only supports connections to a Ceph storage
backend. For anyone using a S3 storage backend, this is an issue.&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 solution is to make the choice of storage backend a
configuration option. The relation between gnocchi and ceph-mon would become
an optional one, that would be activated only when Ceph is the selected
backend.&lt;/p&gt;
&lt;p&gt;The upstream documentation of Gnocchi mentions that S3 storage backends are
supported, along with others, such as Swift, Redis and Ceph
(&lt;a class="reference external" href="https://gnocchi.xyz/install.html"&gt;https://gnocchi.xyz/install.html&lt;/a&gt;). The new feature would be supported on
OpenStack Stein (and later) on Ubuntu 18.04 LTS.&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: camille.rodriguez&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “s3-storage” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;s3-storage
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 charm option for selecting S3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add options for S3 in the configuration file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;S3 endpoint URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 region name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 access key id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 secret access key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prefix to namespace metric bucket: s3_bucket_prefix = gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maximum time to wait checking data consistency when writing toi
S3: s3_check_consistency_timeout = 60&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The maximum number of connections to keep in a connection pool:
s3_max_pool_connections = 50&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make the Ceph relation and configuration optional, dependent on the
charm option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement https endpoint for S3&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="timeline"&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;p&gt;The goal is to implement this change in the OpenstStack Charms 20.08 release.
The freeze date for this release is July 24th 2020, for a release on Augusti
5th (see release schedule). This change should be proposed for merging ati
least two weeks ahead of freeze, so ideally submitted by July 10th 2020.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Changes will be pushed to the existing gnocchi charm repository:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://git.openstack.org/openstack/charm-gnocchi"&gt;https://git.openstack.org/openstack/charm-gnocchi&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update of the charm options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update of the charm README&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns. The feature will be compatible
with an HTTPS endpoint to allow for encryption.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests.
Functional tests would require S3 storage hardware or software emulation.
This is possible through a Swift deployment, or with RADOS Gateway. The
deployment of the storage backend with S3 capability would be independent
from the OpenStack bundle, to represent a real scenario.&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 outside of this specification.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Jul 2020 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/victoria/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 09 Jul 2020 00:00:00 </pubDate></item><item><title>Routed Provider Networks for Neutron Charms</title><link>https://specs.openstack.org/openstack/charm-specs/specs/queens/implemented/routed-provider-networks-neutron-charms.html</link><description>

&lt;p&gt;As L3-oriented fabrics get more widely deployed in DCs there is a need to
support multi-segment networks in Neutron charms. Routed provider networks
were implemented in Neutron itself in order to model deployments with multiple
isolated L2 networks each with their own VLANs (switch fabrics) and network
or compute nodes attached to those networks.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Deployments that have machines connected to separate switch fabrics and hence
provider networks need to be aware of multiple subnets attached to different
L2 segments. While VLAN IDs on different switch fabrics may match, they
define isolated broadcast domains and should have different subnets
used on them for proper addressing and routing to be implemented.&lt;/p&gt;
&lt;p&gt;Provider Networks in Neutron used to have a single segment but starting with
&lt;a class="reference external" href="https://specs.openstack.org/openstack/neutron-specs/specs/newton/routed-networks.html"&gt;Newton&lt;/a&gt;
there is support for multi-segment networks which are called routed provider
networks. From the data model perspective a subnet is associated with a
network segment and a given provider network becomes multi-segment as a
result of subnet to segment assignments. This concept is the same as creating
a Virtual Routing and Forwarding (VRF) instance because end hosts on an L3
network are assumed to be in a single address space but possibly different
subnets and routing needs to be implemented to make sure all hosts and
instances are mutually L3-reachable.&lt;/p&gt;
&lt;p&gt;Considerations for routed provider networks include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;scheduling (Neutron needs to use Nova Placement API);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;subnets become segment-aware;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ports become segment-aware;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IP address to port assignment is deferred until a segment is known;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;placement with IP address exaustion awareness;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;live migration and evacutation of instances (constrain to the same L2);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DHCP and meta-data agent scheduling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/newton/implemented/neutron-routed-networks.html"&gt;nova spec&lt;/a&gt;
for routed provider networks contains a detailed overview of the
implemenation details to address the above points, including usage of
&lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/newton/implemented/generic-resource-pools.html"&gt;generic resource pools.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In order to account for IPv4 address ranges associated with segments Neutron
uses Nova placement API to create IPv4 inventories and update them if needed.
Neutron also creates a Nova host aggregate per segment.&lt;/p&gt;
&lt;p&gt;There are several points to consider when it comes to charm modifications to
support this functionality:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“segments” service plugin enablement (unconditionally or via an option);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment scenarios in conjunction with other features (L3 HA, DVR, BGP);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Floating IP usage;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Impact on existing deployments (upgrades).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, from the Charm and Juju perspective the following needs to be addressed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Handling of physnet mappings on different switch fabrics using Juju AZs or
tag contraints;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appropriate placement of units to make sure necessary agents are deployed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="deployment-scenarios"&gt;
&lt;h3&gt;Deployment Scenarios&lt;/h3&gt;
&lt;p&gt;Deployment scenarios should include both setups with charm-neutron-gateway and
without it. Moreover, for the use-case where charm neutron-gateway is present
we need to account for DVR and L3 HA cases.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;provider networks at networks nodes only (SNAT and FIP sub-cases);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/neutron/blob/master/doc/source/admin/deploy-ovs-provider.rst"&gt;provider networks on compute nodes without dedicated network nodes;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/neutron/blob/master/doc/source/admin/deploy-ovs-ha-vrrp.rst"&gt;OVS HA using VRRP;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/neutron/blob/master/doc/source/admin/config-dvr-ha-snat.rst"&gt;DVR and L3 HA using VRRP;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/neutron/blob/master/doc/source/admin/config-bgp-dynamic-routing.rst"&gt;Deployments with dynamic routing agents;&lt;/a&gt;&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;Given that there are certain limitations in how routed provider networks are
implemented in Newton release this spec is targeted at Ocata release.&lt;/p&gt;
&lt;section id="segments-service-plugin"&gt;
&lt;h3&gt;Segments Service Plugin&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/ocata/networking-guide/config-routed-networks.html#example-configuration"&gt;A related Ocata documentation section&lt;/a&gt; contains 3 major configuration requirements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“segments” needs to be added to the service_plugins list (neutron-api);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A compute placement API section needs to be added to neutron.conf;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Physical-network related config options on gateway and compute nodes need to
match a given switch fabric configuration (see a section on that below);&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The proposed approach, therefore, is as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unconditionally render “segments” service_plugin in charm-neutron-api if a
deployed OpenStack version is Ocata or newer;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Nova placement API section rendering to charm-neutron-api if a deployed
OpenStack version is Ocata or newer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason for unconditional addition of the segments service plugin is due to
how feature is implemented and documented.&lt;/p&gt;
&lt;p&gt;Unless a &lt;a class="reference external" href="https://developer.openstack.org/api-ref/network/v2/#create-subnet"&gt;subnet is associated with a segment&lt;/a&gt;, a provider network is considered
to be single-segment and old behavior applies. There is also a requirement
that either all subnets associated with a network need to have a segment or
none of them must have one. This is documented both in &lt;a class="reference external" href="https://docs.openstack.org/neutron/pike/admin/config-routed-networks.html"&gt;public documentation&lt;/a&gt;
and in &lt;a class="reference external" href="https://github.com/openstack/neutron/blob/49d614895f44c44f9e1735210498facf1886c404/neutron/services/segments/exceptions.py#L26-L29"&gt;code.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The Networking service enforces that either zero or all subnets on a
particular network associate with a segment. For example, attempting
to create a subnet without a segment on a network containing subnets
with segments generates an error.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This distiction is what allows unconditional addition of this service plugin
for the standard ML2 core plugin.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="multiple-l2-networks-switch-fabrics"&gt;
&lt;h3&gt;Multiple L2 Networks (Switch Fabrics)&lt;/h3&gt;
&lt;p&gt;Each network segment includes &lt;a class="reference external" href="https://github.com/openstack/neutron/blob/3e34db0c19cdcc86cd5f1b72d6374c3eca0faa7e/neutron/db/models/segment.py#L30-L54"&gt;network type information&lt;/a&gt; this means that for ML2 plugin flat_networks and network_vlan_ranges
options there may be different values depending on a switch fabric. In this
case, there need to be multiple copies of the same charm deployed as
applications with different names to create per-fabric configurations. This
can be modeled in Juju in terms of availability zones although this mapping
is not exact because there may be several availability zones on the same
switch fabric or there may be a fabric per availability zone. In a general
case, tags contraints can be used in Juju to provide placement metadata
related to switch fabrics. Either way, to achieve the separation of config
namespaces the following charms may need per-fabric configuration:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-openvswitch (subordinate, provider networks or DVR cases);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-nova-compute (as a primary for neutron-ovs charm - defines placement);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-gateway (in scenarios where it is deployed).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neutron charms (ovs or gateway) contain the following fabric-specific options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;bridge-mappings;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;flat-provider-networks;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vlan-ranges;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable-local-dhcp-and-metadata (needs to be true everywhere);&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Albeit it would be tempting to assume that this configuration will be the same
for all nodes in a given deployment and that switches the nodes will be
connected to will have identical configuration, we need to account for a
general case.&lt;/p&gt;
&lt;p&gt;Multi-application approach allows to avoid any charm modifications besides
charm-neutron-api and have the following content in bundle.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;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;data-port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;data-port&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;br-data:bond1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;vlan-ranges&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab1:2:3 provider-fab2:4:5 provider-fab3:6:7&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;bridge-mappings-fab1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;bridge-mappings-fab1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab1:br-data&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;bridge-mappings-fab2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;bridge-mappings-fab2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab2:br-data&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;bridge-mappings-fab3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;bridge-mappings-fab3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab3:br-data&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges-fab1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;vlan-ranges-fab1&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab1:2:3&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges-fab2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;vlan-ranges-fab2&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab2:4:5&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges-fab3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nl"&gt;&amp;amp;vlan-ranges-fab3&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;provider-fab3:6:7&lt;/span&gt;

&lt;span class="c1"&gt;# allocate machines such that there are enough&lt;/span&gt;
&lt;span class="c1"&gt;# machines in attached to each switch fabric&lt;/span&gt;
&lt;span class="c1"&gt;# fabrics do not necessarily correspond to&lt;/span&gt;
&lt;span class="c1"&gt;# availability zones&lt;/span&gt;
&lt;span class="nt"&gt;machines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&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="nt"&gt;constraints&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;tags=compute,fab1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"1"&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;constraints&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;tags=compute,fab1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&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="nt"&gt;constraints&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;tags=compute,fab1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"3"&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;constraints&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;tags=compute,fab1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"4"&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;constraints&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;tags=compute,fab1&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"5"&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;constraints&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;tags=compute,fab2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"6"&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;constraints&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;tags=compute,fab2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"7"&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;constraints&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;tags=compute,fab2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"8"&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;constraints&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;tags=compute,fab2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"9"&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;constraints&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;tags=compute,fab3&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"10"&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;constraints&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;tags=compute,fab3&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"11"&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;constraints&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;tags=compute,fab3&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"12"&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;constraints&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;tags=compute,fab3&lt;/span&gt;
&lt;span class="w w-Error"&gt; &lt;/span&gt;&lt;span class="nt"&gt;services&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-compute-kvm-fab1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:nova-compute&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&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="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="c1"&gt;# ...&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;default-availability-zone&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;az1&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;to&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;0&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;1&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;2&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;3&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;4&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;nova-compute-kvm-fab2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:nova-compute&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&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="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="c1"&gt;# ...&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;default-availability-zone&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;az2&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;to&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;5&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;6&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;7&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;8&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;nova-compute-kvm-fab3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:nova-compute&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&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="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="c1"&gt;# ...&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;default-availability-zone&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;az3&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;to&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;9&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&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;11&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;12&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;neutron-openvswitch-fab1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:neutron-openvswitch&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;data&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;\*overlay-space-fab1&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="nt"&gt;bridge-mappings&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;\*bridge-mappings-fab1&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges&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;\*vlan-ranges-fab1&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;prevent-arp-spoofing&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;data-port&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;\*data-port&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;enable-local-dhcp-and-metadata&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;neutron-openvswitch-fab2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:neutron-openvswitch&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;data&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;\*overlay-space-fab2&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="nt"&gt;bridge-mappings&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;\*bridge-mappings-fab2&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges&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;\*vlan-ranges-fab2&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;prevent-arp-spoofing&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;data-port&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;\*data-port&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;enable-local-dhcp-and-metadata&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;neutron-openvswitch-fab3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;charm&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;cs:neutron-openvswitch&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;num_units&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;bindings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;data&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;\*overlay-space-fab3&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="nt"&gt;bridge-mappings&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;\*bridge-mappings-fab3&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;vlan-ranges&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;\*vlan-ranges-fab3&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;prevent-arp-spoofing&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;data-port&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;\*data-port&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nt"&gt;enable-local-dhcp-and-metadata&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="c1"&gt;# each of the apps needs to be related appropriately&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above bundle part is for a setup without charm-neutron-gateway, although
it can be added easily using the same approach. Given that there are no
relations between charm-neutron-gateway and charm-neutron-openvswitch there
is no problem with relating per-fabric services. What has to be kept in mind
is the infrastructure routing for overlay networks on different fabrics so
that VXLAN or other tunnels can be created between endpoints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documented-requirements-and-limitations"&gt;
&lt;h3&gt;Documented Requirements and Limitations&lt;/h3&gt;
&lt;p&gt;The Ocata Routed Provider Networks &lt;a class="reference external" href="https://docs.openstack.org/ocata/networking-guide/config-routed-networks.html#limitations"&gt;guide mentions scheduler limitations,&lt;/a&gt;
however, they are made in reference to Newton and are likely outdated. Looking
at the &lt;a class="reference external" href="https://docs.openstack.org/newton/networking-guide/config-routed-networks.html"&gt;Newton documentation&lt;/a&gt; it is certain that this documentation section was
not updated for Ocata.&lt;/p&gt;
&lt;p&gt;Minimum API version requirements are present in the Pike &lt;a class="reference external" href="https://github.com/openstack/neutron/blame/stable/pike/doc/source/admin/config-routed-networks.rst#L144-L148"&gt;release documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Floating IP usage is not possible with routed provider networks at the time
of writing (Pike) due to the fact that a routed provider network cannot be
used with &lt;a class="reference external" href="https://developer.openstack.org/api-ref/network/v2/#external-network"&gt;external-net extension.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This might be considered a serious limitation, however:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployments that rely on routed provider networks are inherently L3-oriented
and it is likely that NAT functionality will not be required that often
anyway alleviating the need for floating IPs;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routed provider networks are not enforced at deployment time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An &lt;a class="reference external" href="https://pad.lv/1667329"&gt;RFE&lt;/a&gt; exists to address this limitation based on
&lt;a class="reference external" href="https://specs.openstack.org/openstack/neutron-specs/specs/newton/subnet-service-types.html"&gt;subnet service types&lt;/a&gt; and &lt;a class="reference external" href="https://docs.openstack.org/newton/networking-guide/config-bgp-dynamic-routing.html"&gt;dynamic routing&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;N/A&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;dmitriis&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “1743743-fe-routed-provider-networks” for all patches related
to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1743743&lt;/span&gt;-fe-routed-provider-networks
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 “segments” to service_plugins in charm-neutron-api for Ocata+;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add section-placement to charm-neutron-api and import it in Ocata+ templates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Release notes should mention that this functionality can be used.&lt;/p&gt;
&lt;p&gt;It might be worthwhile to create a dedicated guide to cover how different
OpenStack network deployment scenarios map to charm options.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No apparent security risks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The following functional test can be introduced even on a single fabric but
with different VLANs used to simulate separate fabrics and L3 connectivity:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;deploy a bundle with two neutron-openvswitch and nova-compute charms and
configure them with different provider network settings as described above;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create a multi-segment network as described &lt;a class="reference external" href="https://docs.openstack.org/neutron/pike/admin/config-routed-networks.html#create-a-routed-provider-network"&gt;in the documentation;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create several instances with interfaces attached to the routed provider
network created above and make sure that L3 connectivity is provided
externally between segments;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;verify L3 connectivity between instances.&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, 23 Feb 2020 00:00:00 </pubDate></item><item><title>Keystone Fernet Token Implementation</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/implemented/keystone-fernet-tokens.html</link><description>

&lt;p&gt;Fernet tokens were added to OpenStack to solve the problem of keystone being
required to persist tokens to the a common database (cluster) like UUID tokens,
and solve the problem of size for PKI or PKIZ tokens.&lt;/p&gt;
&lt;p&gt;From &lt;a class="reference external" href="https://docs.openstack.org/keystone/pike/admin/identity-fernet-token-faq.html"&gt;Fernet - Frequently Asked Questions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A fernet token is a bearer token that represents user authentication.  Fernet
tokens contain a limited amount of identity and authorization data in a
&lt;a class="reference external" href="http://msgpack.org/"&gt;MessagePacked&lt;/a&gt; payload.  The payload is then wrapped as a Fernet message for
transport, where &lt;a class="reference external" href="https://github.com/fernet/spec"&gt;Fernet&lt;/a&gt; provides the required web safe characteristics for
use in URLs and headers.  The data inside the fernet token is protected using
symmetric encryption keys, or fernet keys.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Keystone has had support for Fernet tokens since Kilo, so all services support
fernet token authorization.  In the upcoming Rocky release the sql token driver
and uuid token provider will be removed.  The main part of the work on this
task is changing the keystone charm to enable configuration of fernet tokens,
provide the initialisation of fernet tokens, provide rotation of fernet keys
and their subsequent synchronisation to other keystone units.&lt;/p&gt;
&lt;p&gt;There are also some issues around what aspects should be configurable vs
controlled by the charm.  The &lt;a class="reference internal" href="#proposed-change-label"&gt;&lt;span class="std std-ref"&gt;Proposed Change&lt;/span&gt;&lt;/a&gt; section provides
more details about this.&lt;/p&gt;
&lt;p&gt;Finally, upgrading an existing OpenStack implementation from another token
system to Fernet tokens is discussed, and the support the charm(s) will need to
implement to support this, along with documentation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;span id="proposed-change-label"/&gt;&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;section id="theory-of-operation"&gt;
&lt;h3&gt;Theory of Operation&lt;/h3&gt;
&lt;p&gt;The keystone-charm will, with the appropriate configuration options, configure
keystone to generate fernet tokens.&lt;/p&gt;
&lt;p&gt;In order to generate tokens, fernet keys are used. These are generated by
keystone and have an expiry date.  The key repository is a directory, and each
key is an integer number, with the highest number being the primary key.  Key
‘0’ is the staged key, that will be the next primary.  Other keys are secondary
keys.&lt;/p&gt;
&lt;p&gt;New tokens are only ever generated from the primary key, whilst they secondary
keys are used to validate existing tokens.  The staging key is not used to
generate tokens, but can be used to validate tokens as the staging key might be
the new primary key on the master due to a rotation and the keys have not yet
been synchronised across all the units.&lt;/p&gt;
&lt;p&gt;Fernet keys need to be rotated at periodic intervals, and the keys need to be
synchronised to each of the other keystone units.  Keys should only be rotated
on the master keystone unit, and must be synchronised &lt;em&gt;before&lt;/em&gt; they are rotated
again.  “&lt;em&gt;Over rotation&lt;/em&gt;” occurs if a unit rotates its keys such that there is
no suitable decoding key on another unit that can decode a token that has been
generated on the master.  This happens if two key rotations are done on the
master before a synchronisation has been successfully performed.  This should
be avoided.  Over rotations can also cause validation keys to be removed
&lt;em&gt;before&lt;/em&gt; a token’s expiration which would result in failed validations.&lt;/p&gt;
&lt;p&gt;There are 3 parts to the &lt;strong&gt;Key Rotation Strategy&lt;/strong&gt;:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The rotation frequency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The token lifespan (set with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[token]&lt;/span&gt; &lt;span class="pre"&gt;expiration&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The number of active keys: (set with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[fernet_tokens]&lt;/span&gt; &lt;span class="pre"&gt;max_active_keys&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There needs to be at least 3 keys as a minumum.  The actual number of keys is
determined by the &lt;em&gt;token lifespan&lt;/em&gt; and the &lt;em&gt;rotation frequency&lt;/em&gt;.  The
&lt;em&gt;max_active_keys&lt;/em&gt; must be one greater than the &lt;em&gt;token lifespan&lt;/em&gt; / &lt;em&gt;rotation
frequency&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To quote from the &lt;a class="reference external" href="https://docs.openstack.org/keystone/queens/admin/identity-fernet-token-faq.html"&gt;FAQ&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The number of max_active_keys for a deployment can be determined by
dividing the token lifetime, in hours, by the frequency of rotation in
hours and adding two. Better illustrated as:&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;token_expiration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="n"&gt;rotation_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="n"&gt;max_active_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_expiration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;rotation_frequency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In the keystone charm, there is already the config parameter
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;token-expiration&lt;/span&gt;&lt;/code&gt; in seconds, and there will be a proposed config item of
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fernet-max-active-keys&lt;/span&gt;&lt;/code&gt;.  Thus, the &lt;em&gt;rotation frequence&lt;/em&gt; will be calucated
as:&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;token_expiration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;   &lt;span class="c1"&gt;# actually 3600, as it's in seconds&lt;/span&gt;
&lt;span class="n"&gt;max_active_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="n"&gt;rotation_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token_expiration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_active_keys&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Thus, the fernet-max-active-keys can never be less than 3 (which will be
enforced in the charm), which would make the rotation frequency the &lt;em&gt;same&lt;/em&gt; as
the token expiration time.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="upgrading-an-existing-system"&gt;
&lt;h3&gt;Upgrading an Existing System&lt;/h3&gt;
&lt;p&gt;To upgrade an existing system to use Fernet tokens, the keystone charm should
be upgraded first.  The (new) configuration option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;token-provider&lt;/span&gt;&lt;/code&gt; has a
&lt;em&gt;no&lt;/em&gt; default value set, which means on a pre-rocky install the token type will
remain as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UUID&lt;/span&gt;&lt;/code&gt;.  In order to move a pre-rocky install to Fernet, the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;token-provider&lt;/span&gt;&lt;/code&gt; option should be set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fernet&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note that if a pre-rocky system is upgraded to rocky, then the default token
type will be &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fernet&lt;/span&gt;&lt;/code&gt;.  The rocky cycle removes support for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UUID&lt;/span&gt;&lt;/code&gt; tokens.
Thus upgrading a system to rocky will automatically use fernet as the only
token type.  The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;token-provider&lt;/span&gt;&lt;/code&gt; option is only valid for pre-rocky systems.&lt;/p&gt;
&lt;p&gt;Note that althought the charms enable token cachinng with memcache by default,
this is only for the default of 300 seconds as the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;token_cache_time&lt;/span&gt;&lt;/code&gt; is not
being set (see &lt;a class="reference external" href="https://github.com/openstack/keystonemiddleware/blob/master/doc/source/middlewarearchitecture.rst#improving-response-time"&gt;(Keystone) Middleware Architecture: Improving response time&lt;/a&gt;
for further details.  The impact of this is that some services may try to
re-authenticate during the upgrade, and depending on which keystone unit they
“pick”, and what stage the upgrade is at, will determine whether the action
succeeds.  As different services may be part of the same action, this might
lead to &lt;em&gt;odd&lt;/em&gt; failure modes.  However, once the system is upgraded, after the
default of 300 seconds, &lt;em&gt;all&lt;/em&gt; services will continue to operate normally.&lt;/p&gt;
&lt;p&gt;Therefore, there &lt;em&gt;may&lt;/em&gt; be some percieved outage of the openstack control plane.
Already running instances will not be affected and all services will continue
to operate normally as soon as they request new tokens from keystone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="additional-configuration-items"&gt;
&lt;h3&gt;Additional Configuration Items&lt;/h3&gt;
&lt;p&gt;The following configuration items will be needed in the keystone charm.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;token-provider&lt;/strong&gt; - the token system to use: Either ‘uuid’ or ‘fernet’.  The
default will not be set.  Pre-rocky systems will have a default of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;uuid&lt;/span&gt;&lt;/code&gt;.
On rocky systems, the configuration option has no effect. As the default is
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;uuid&lt;/span&gt;&lt;/code&gt; for pre-rocky systems, the token-provider won’t change on an upgrade
unless the operator sets the configuration value to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;fernet&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;fernet-max-active-keys&lt;/strong&gt; - the maximum active keys configured in keystone.
This controls the key rotation trigger times based on this config item and
the config item &lt;em&gt;token-expiration&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="keystone-actions"&gt;
&lt;h3&gt;Keystone Actions&lt;/h3&gt;
&lt;p&gt;The following action will be required:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;purge-tokens&lt;/strong&gt; – purge existing tokens from the database.  This is used
after upgrading from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UUID&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Fernet&lt;/span&gt;&lt;/code&gt; tokens,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="internal-cron-jobs"&gt;
&lt;h3&gt;Internal Cron Jobs&lt;/h3&gt;
&lt;p&gt;The charm will set up a cron job to rotate the keys and then synchronise them
to the other peered units.  The cron job will call &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;juju&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;&lt;/code&gt; from within the
charm to rotate the keys and then synchronise the keys to the other peered
units.  It will also only perform this action if it is the leader.  The cron
job will run on &lt;em&gt;all&lt;/em&gt; peered units, but only have an effect on the leader.&lt;/p&gt;
&lt;p&gt;Synchronisation of the Fernet keys will be via Juju leader settings.  The keys
are small, and “leader settings” provides a convenient and secure mechanism to
synchronise the keys between units without having to explicitly provide
networking for all keystone peered units.  The delay in transferring the keys
using hooks is not an issue as the synchronisation does not need to be
immediate; indeed, it could be just before the next key rotation in the worst
case, although, this is extremely unlikely to be the case.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;In the Openstack rocky release, &lt;em&gt;fernet&lt;/em&gt; is the only token provider available.
Therefore, there is no alternative.&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;ajkavanagh&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignees:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “fernet-keystone-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;fernet-keystone-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 fernet token functionality to the keystone-charm.  This includes:
* setup
* upgrade
* rotate / sync actions
* cron job for automatic rotate / sync.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Fernet token information to the documentation:
* charm-store text for keystone charm
* Notes in the charm guide re: uuid vs Fernet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update tests:
* Amulet/bundle for actions / verify installation.
* Update other bundles to ensure defaults
* Upgrade from uuid to Fernet tokens.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation will be provided as part of the keystone charm and notes in charm
guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;A change of token provider does have security implications and well tested and
proved best practices for using the fernet token provider will be implemented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be developed along with new code.  Functional tests will be
implemented.  A scenario test for change of token provider will also be
written.&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 external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 23 Feb 2020 00:00:00 </pubDate></item><item><title>Neutron Dynamic Routing</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/implemented/neutron-dynamic-routing.html</link><description>

&lt;p&gt;OpenStack supports dynamic routing, specifically BGP. BGP forms a significant
part of the routing infrastructure for many TelCos and large other
organizations with complex networks. Our charms need to grow support for
dynamic routing.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In a typical setup with Neutron Gateway, infrastructure routers do not have
knowledge of the private networks allocated to OpenStack tenants. As a result,
services external to OpenStack do not know how to route traffic to OpenStack
instances. As OpenStack networks are elastic and therefore can evolve in many
ways, a way of communicating changes between OpenStack and external routers is
needed.&lt;/p&gt;
&lt;p&gt;Since networks in OpenStack are self serviced, any addition or removal of
OpenStack network should not depend on network administrator’s actions.
Network limitations should be set up front. This is further facilitated by
the use of subnet pools in OpenStack.&lt;/p&gt;
&lt;p&gt;Other implications include decoupling subnets from layer 2, allowing different
next-hops for floating IPs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Neutron dynamic routing solves this problem by introducing a BGP speaker, which
then peers with the existing infrastructure router(s) and announces the
next-hop virtual routers for OpenStack owned networks. This allows dynamic
routing changes to be communicated to the physical infrastructure based on
changes in OpenStack networks. Since OpenStack Networks are managed by users,
address scope limitations need to be in place.&lt;/p&gt;
&lt;p&gt;A new charm is proposed called neutron-dynamic-routing which will configure and
deploy the neutron-bgp-dragent (Neutron BGP dynamic routing agent). The
neutron-bgp-dragent is a BGP speaker which can be peered with existing routers
in the BGP infrastructure. This charm will require interfaces for AMQP and
potentially neutron-api-plugin (TBD). For testing purposes it will also make
use of the bgp interface to peer with the quagga charm, both written by Frode
Nordahl (See Testing below.)&lt;/p&gt;
&lt;section id="requirements"&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;p&gt;The charm will need to select an interface on the provider network for
communication with OpenStack. It may also need to select an interface to speak
with BGP routers in the infrastructure.&lt;/p&gt;
&lt;p&gt;High availability is accomplished by deploying N number of units of
neutron-dynamic-routing with care for placement on different physical hosts.
This will introduce multiple neutron-bgp-dragents. BGP infrastructure routers
will need to be manually informed of each neutron-bgp-dragent.&lt;/p&gt;
&lt;p&gt;IPv4 and IPv6 support is handled with separate bgp-speakers defined for each.&lt;/p&gt;
&lt;p&gt;The charm will need to support both DVR and centralized OpenStack routing.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="outside-the-scope"&gt;
&lt;h3&gt;Outside the scope&lt;/h3&gt;
&lt;p&gt;It is important to understand what the OpenStack dynamic routing implementation
does &lt;em&gt;not&lt;/em&gt; do and lies outside of the scope of this spec.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It does not provide ingress BGP to OpenStack, it is purely egress
advertisement of OpenStack owned networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not automatically advertise all OpenStack networks or whole subnet
pools. A considerable amount of administrator configuration is still
required, including associating OpenStack networks with the bgp-speaker. See
the &lt;a class="reference external" href="https://docs.openstack.org/neutron-dynamic-routing/latest/contributor/testing.html"&gt;Testing documentation&lt;/a&gt;
for a sense of the administrative overhead required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not provide a mechanism for injecting arbitrary BGP routes (for
example for /32 FIPs). It merely advertises OpenStack networks that have been
associated with the bgp speaker.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Floating IPs, and NAT in general, are one approach to this problem, but there
are couple of drawbacks. For starters, NAT comes with a performance price as
number of connections grows. In cloud, where many VMs can establish connections
to various external peers, this can require significant memory and cpu
resources. Neutron gateway doesn’t really scale without manual intervention. On
top of that, if only NAT is used, peers can’t really know which instance
established connection, they only know connection came ‘from the cloud’.
Same problems apply to DVR.&lt;/p&gt;
&lt;p&gt;Static routes on physical gateways are the closest thing to BGP solution. The
only drawback is operational; in case address scope in Neutron changes, these
changes need to be implemented on physical routers too.&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;thedac&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Additional work:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;dragent
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;New charm neutron-dynamic-routing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A new reactive charm will be developed to configure and deploy the
neutron-bgp-dragent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update neutron-api charm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The neutron-api charm will need to load the service_plugin
neutron_dynamic_routing.services.bgp.bgp_plugin.BgpPlugin and subsequently run
a db migrate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential need for new neutron-api-plugin interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is unclear at this time if a relationship to neutron-api will be required.
If it is required no layered interface for neutron-api-plugin yet exists and
will need to be created.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New charm quagga&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For testing purposes the new quagga charm will act as a BGP peer to validate
and test neutron-dynamic-routing. Frode Nordahl has already begun work on this
project: &lt;a class="reference external" href="https://github.com/openstack-charmers/charm-quagga"&gt;https://github.com/openstack-charmers/charm-quagga&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New interface bgp&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For testing purposes the new bgp interface will define the peering relationship
between neutron-dynamic-routing and the quagga charm. Frode Nordahl has already
begun work on this project: &lt;a class="reference external" href="https://github.com/openstack-charmers/interface-bgp"&gt;https://github.com/openstack-charmers/interface-bgp&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new repository for the neutron-dynamic-routing charm is needed.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-neutron-dynamic-routing
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A new repository for the quagga charm is needed.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack-charmers/charm-quagga
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A new repository for the bgp interface is needed.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack-charmers/interface-bgp
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;An update to the charm deployment guide will be required.&lt;/p&gt;
&lt;p&gt;Upstream documentation is found at the following:
&lt;a class="reference external" href="https://docs.openstack.org/neutron-dynamic-routing/latest/"&gt;https://docs.openstack.org/neutron-dynamic-routing/latest/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;The neutron-dynamic-routing charm is dependent on the OpenStack implementation
of BGP. Which uses a simple string as a password.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The neutron-dynamic-routing charm will need to be tested with a BGP peer. Frode
Nordahl has begun work on the quagga charm which will act as an infrastructure
BGP router allowing for testing and validation.&lt;/p&gt;
&lt;p&gt;A mojo spec, or other suitably automated test, will be a requirement for this
feature 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&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 23 Feb 2020 00:00:00 </pubDate></item><item><title>Swift Global Cluster</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/approved/swift-global-cluster.html</link><description>

&lt;p&gt;Add support for Swift Global Cluster feature to Swift charms.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At the moment Swift charms do not support the Swift Global Cluster feature
which is already available in the upstream:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/swift/latest/overview_global_cluster.html"&gt;https://docs.openstack.org/swift/latest/overview_global_cluster.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a result it is not possible to deploy Swift clusters in a multi-region mode
using Swift charms.&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 can be split to the following items:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add new config options to swift-storage charm to handle the following
parameters:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“region”:&lt;/p&gt;
&lt;p&gt;purpose: specifies region to request membership
data type: int
valid values: natural number&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“account-server-port-rep”:&lt;/p&gt;
&lt;p&gt;purpose: specifies listening port of the swift-account-replicator service
data type: int
valid values: 0 - 65535&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“container-server-port-rep”:&lt;/p&gt;
&lt;p&gt;purpose: specifies listening port of the swift-container-replicator service
data type: int
valid values: 0 - 65535&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“object-server-port-rep”:&lt;/p&gt;
&lt;p&gt;purpose: specifies listening port of the swift-object-replicator service
data type: int
valid values: 0 - 65535&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add new config options to swift-proxy charm to handle the following
parameters:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“enable-multi-region”:&lt;/p&gt;
&lt;p&gt;purpose: specifies whether the Swift Global Cluster feature should be used
data type: boolean
valid values: True / False&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“read-affinity”:&lt;/p&gt;
&lt;p&gt;purpose: specifies which backend servers to prefer on reads
data type: string
valid values: matches “^rd+z?(d+)?=d+(,s?rd+z?(d+)?=d+)*$” pattern&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“write-affinity”:&lt;/p&gt;
&lt;p&gt;purpose: specifies which backend servers to prefer on writes
data type: string
valid values: matches “^rd+(,s?rd+)*$” pattern&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“write-affinity-node-count”:&lt;/p&gt;
&lt;p&gt;purpose: specifies how many local objects will be tried before falling back
to non-local ones
data type: string
valid values: matches “^d+(s*sreplicas)?$” pattern&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Update template files to contain options required by the Swift Global
Cluster feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename and change location of template configuration files responsible for
Swift account, container and object services to match the schema required by
the Swift Global Cluster feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend relation data exchanged between swift-storage and swift-proxy nodes
with the region and other replication information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement ‘rings-distributor’ - ‘rings-consumer’ relation based on a common
interface (‘swift-global-cluster’) in swift-proxy charm to handle rings
distribution across all proxy nodes participating in the multi-region
deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update test files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the documentation with information on how to setup Swift in
multi-region mode.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;At the moment there is no alternative to the Swift Global Cluster feature.&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;tkurek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “swift-global-cluster” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;bug/1815879
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="update-swift-proxy-charm"&gt;
&lt;h4&gt;Update swift-proxy charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update ‘config.yaml’ file to add new options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update template files with new options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘metadata.yaml’ file to add the new relation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add hook files as symlinks to the ‘swift_hooks.py’ file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘swift_hooks.py’ file with hook definitions for the new relation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update test files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘README.md’ file to describe the feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update other files (if needed) to implement the feature&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-swift-storage-charm"&gt;
&lt;h4&gt;Update swift-storage charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update ‘config.yaml’ file to add new options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename and change location of template configuration files responsible for
Swift account, container and object services to match the schema required by
the feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘metadata.yaml’ file to add extra bindings (‘cluster’ and
‘replication’)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘swift_storage_relation_joined’ hook definition with extended relation
data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update test files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ‘README.md’ file to describe the feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update other files (if needed) to implement the feature&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories will be required to implement this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The README files of swift-proxy and swift-storage charms should be updated with
instructions on how to setup Swift in multi-region mode.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security implications for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit and functional tests of swift-proxy and swift-storage charms will need to
be updated to support implementation of this feature.&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 external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 23 Feb 2020 00:00:00 </pubDate></item><item><title>Masakari</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/masakari.html</link><description>

&lt;p&gt;Masakari provides an API and ENGINE which receive messages from MONITORS
(agents) on compute nodes to enable:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;instance evacuation on host failure (masakari-hostmonitor) - requires shared
storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;instance restart on certain instance errors (masakari-instancemonitor)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;openstack related process monitoring and restarting
(masakari-processmonitor)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This spec is for two charms which will install the masarki api and engine, and
monitors respectively.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;If an openstack hypervisor fails, there is no method of automatic recovery.
Masakari provides a way of migrating instances from a failed host to a
functional host, when used in conjunction with a cluster manager.
There are similar issues with instance and process failures which masakari
addresses.&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 using corosync and pacemaker on each hypervisor, along with
masakari-hostmonitor has been validated. Unfortunately a cluster where each
node runs the full cluster stack is only recommended up to around 16 nodes:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Remote/#_overview"&gt;http://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Remote/#_overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The scale issue with this initial solution can be mitigated by breaking
compute nodes up into smaller clusters but this should be seen as a work
around.&lt;/p&gt;
&lt;p&gt;They suggested approach to scale to a greater number of nodes is by using
pacemaker-remote on the hypervisors rather than the full cluster stack.
Unfortunately masakari-hostmonitors does not currently work with
pacemaker-remote due to the following bug:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/masakari-monitors/+bug/1728527"&gt;https://bugs.launchpad.net/masakari-monitors/+bug/1728527&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This work will involve the following new charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;masakari (provides api, engine and python-masakariclient)
The masakari charm will have identity-service, amqp and shared-db relations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;masakari-monitors (optionally provides one or all of hostmonitor,
instancemonitor, processmonitor)
The masakari-monitors charm will be related to nova-compute via the juju-info
relation and related to keystone via the identity-credentials relation. The
monitors needs credentials for posting notifications to the masakari api
service. When not using pacemaker_remote masakari-monitors will rely on the
hacluster charm having been related to the nova-compute charm via juju-info.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pacemaker-remote.
This charm simple installs the pacemaker remote service and requires a
relation with fully fledged cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This work will involve the following new relations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;hacluster &amp;lt;-&amp;gt; pacemaker-remote
This relation will allow the pacemaker-remote charm to inform the hacluster
charm of the location of remote nodes to be added to the cluster. It will
also be used to expose the pacemaker-remotes stonith information and
whether or not the pacemaker remote node should run resources. In the case
of a masakri deployment the pacemaker-remote nodes should be set to
not run resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following charm updates:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;hacluster charm.
The hacluster charm need to be able to support adding pacemaker-remote nodes
to the cluster and also confgiuring resources such that if requested no
resources are run on the remote nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hacluster charm.
The hacluster charm need to be able to support creating maas stonith devices&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional work:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fix masakari-hostmonitors to work with pacemaker remote
As mentioned masakari-hostmonitors does not work wih pacemaker-remote at the
moment. A patch will need to be written to fix this and ideally landed
upstream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write maas stonith driver.
It is important that instances that are using shared storage are only running
on one compute node at a time to avoid a split-brained cluster leading to
two instances writting to the same storage simultaniously which would result
in data corruption.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These charms will support TLS for API communications&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Although not as feature rich as masakari much of the functionality can be
achieved using pacemaker/corosync resource configuration.&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;gnuoy&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;admcleod&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “masakari” or “masakari-monitors” as appropriate for all
patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;masakari
git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;masakari-monitors
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Masakari charm cleanup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add domain id information to identity-credentials relation. The keystone
charm and the identity-credentials interface will both need updating.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Masakari-monitors charm cleanup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add pacemaker-remote charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add pacemaker-remote interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add functional and unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mojo specs for full stack functional testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write patch to fix pacemaker-remote support in masakari-hostmonitors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write Maas stonith plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend hacluster charm to support registering pacemaker_remote nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend hacluster charm to support only running resources on a subset
of available nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extend hacluster charm to support creating maas stonith devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write deployment guide instructions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new charms and interfaces to OpenStack gerrit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://git.openstack.org/openstack/charm-masakari"&gt;https://git.openstack.org/openstack/charm-masakari&lt;/a&gt;
&lt;a class="reference external" href="https://git.openstack.org/openstack/charm-masakari-monitors"&gt;https://git.openstack.org/openstack/charm-masakari-monitors&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Both charms will contain README.md files with instructions&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;We will have credentials for the cloud stored on the compute node.  Dropping
from the guest to the host in this case could allow a user to compromise the
cloud by signally the masakari api about one or more false compute node
failures. Keystone credentials which are used by the placement api are
already stored on the compute node so this does not increase the attack
surface but is worth mentioning for completeness.&lt;/p&gt;
&lt;p&gt;We will need to enable a certificate relation in the nova compute host to
facilitate the use of a vault charm to enable masakari ssl functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of zaza and Mojo specification.&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;Requires cluster management such as corosync or pacemaker. At the very least,
hacluster charm is required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shared storage is required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some administrative intervention will be required after a host failure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 23 Feb 2020 00:00:00 </pubDate></item><item><title>Ceph PG Auto Tuning</title><link>https://specs.openstack.org/openstack/charm-specs/specs/train/implemented/ceph-pg-autotune.html</link><description>

&lt;p&gt;In the Nautilus release, Ceph has introduced placement group (PG) autotuning.
The charms should support this module allowing a Ceph cluster to grow or shrink
naturally.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;If an existing cluster is incorrectly sized at deploy time, it is very
difficult for an operator to resolve the imbalance. PG Autotuning was
designed to remove the black-magic of PG tuning.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new configuration option (pg-autotune) will be introduced to enable the new
pg_autoscaler module. This config option will have no effect for Ceph releases
before Nautilus and will have no default.&lt;/p&gt;
&lt;p&gt;In a new Ceph deployment with a release greater than Nautilus, a null value for
‘pg-autotune’ will cause the autoscaler module to be enabled and configured on
all pools, with the global default additionally configured as ON. In an upgrade
to Nautilus, a null value will not cause the autoscaler module to be loaded,
nor will pool metadata change.&lt;/p&gt;
&lt;p&gt;For an existing deployment to enable the autoscaler, an administrator should
change the config value to ‘True’, after which the charm will process the new
option, as well as updating the existing pools as necessary.&lt;/p&gt;
&lt;p&gt;The ceph-mon charms already handle sizing the default placement groups via the
expected ratios so the required data is already present.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The current solution is a viable alternative, as long as the expectations about
pool sizing is correct at deploy time. Other alternatives include manual
operator intervention to resolve an incorrectly sized pool.&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;chris.macnaughton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “pg-autotune” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;pg-autotune
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Enable the pg_autoscaler manager module if the Ceph version is
Nautilus or higher&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disable the autoscaler globally, by default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the autoscaler and configure pools when toggled via configuration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories will need to be created.&lt;/p&gt;
&lt;p&gt;The charms.ceph and charm-ceph-mon repositories will be the primary focus of
this development.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;There will be a new configuration option added to toggle on the
autoscaler for the Ceph cluster. This configuration option should additionally
be called out in the README for the ceph-mon charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;There are no expected security risks associated with this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;An additional test-case will be added enabling this config option to ensure
that the functionality works as expected. Additionally, the functionality will
be validated via inspection of Ceph’s suggestions for auto-tuning.&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 new dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 20 Dec 2019 00:00:00 </pubDate></item><item><title>OVN</title><link>https://specs.openstack.org/openstack/charm-specs/specs/train/implemented/charm-openstack-ovn.html</link><description>

&lt;p&gt;OVN provides open source network virtualization for Open vSwitch (OVS):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Logical switches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IPv4 and IPv6 logical routers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;L2/L3/L4 ACLs (Security Groups)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple tunnel overlays (Geneve, STT and VXLAN)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logical L4 load-balancing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOR-based L2 logical-physical gateways (VTEP)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Software-based L2/L3 logical-physical gateways&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OVN integration components exists for OpenStack Neutron, Kubernetes and
others.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There is currently no charms available that lets you easily deploy the
services required to make use of OVN.&lt;/p&gt;
&lt;p&gt;This will also benefit OPNFV’s JOID installer in providing another scenario in
its deployment.&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 reactive charms that adds support for deploying OVN and
integration with OpenStack.&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;p&gt;The implementation consists of the following charms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ovn-central&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Principal charm that deploys &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovn-northd&lt;/span&gt;&lt;/code&gt;, the OVN central control
daemon, and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovsdb-server&lt;/span&gt;&lt;/code&gt;, the Open vSwitch Database (OVSDB).&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;ovn-northd&lt;/span&gt;&lt;/code&gt; daemon is responsible for translating the high-level
OVN configuration into logical configuration consumable by daemons such
as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovn-controller&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;ovn-northd&lt;/span&gt;&lt;/code&gt; process talks to OVN Northbound- and Southbound-
databases.&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;ovsdb-server&lt;/span&gt;&lt;/code&gt; exposes endpoints over relations implemented by the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovsdb&lt;/span&gt;&lt;/code&gt; interface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The charm supports clustering of the OVSDB, you must have a odd number of
units for this to work.  Note that write performance decreases as you
increase the number of units.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running multiple &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovn-northd&lt;/span&gt;&lt;/code&gt; daemons is supported and they will operate
in active/passive mode.  The daemon uses a locking feature in the OVSDB to
automatically choose a single active instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The charm MUST configure TLS transport between OVSDB and its clients
supporting both charm static configuration or with help from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vault&lt;/span&gt;&lt;/code&gt; and
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tls-certificates&lt;/span&gt;&lt;/code&gt; interface.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ovn-chassis&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Subordinate charm that deploys the OVN local controller and Open vSwitch
Database and Switch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It connects up to the OVN Southbound database over the OVSDB protocol, down
to the unit local Open vSwitch database over the OVSDB protocol and to the
unit local Open vSwitch daemon via OpenFlow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each hypervisor, software gateway or other units in need of OVN networking
runs its own independent copy of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovn-controller&lt;/span&gt;&lt;/code&gt; daemon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modules to integrate with specific software, such as OpenStack
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-compute&lt;/span&gt;&lt;/code&gt; and Kubernetes &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;worker&lt;/span&gt;&lt;/code&gt;, should all be added to this
subordinate charm.  Which module(s) to activate should be determined at
runtime through presence of optional relations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A LXD profile will be required for this charm to enable container
placement of OVN/OVS components.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ovn-dedicated-chassis&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Principal charm for deployments that require a dedicated software gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This charm will be built from the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovn-chassis&lt;/span&gt;&lt;/code&gt; subordinate codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-api-plugin-ovn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Subordinate charm that deploys the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;networking-ovn&lt;/span&gt;&lt;/code&gt; component on
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-api&lt;/span&gt;&lt;/code&gt; units and augments Neutron’s configuration for use with
the OVN ML2 plugin.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;octavia-ovn-provider&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Subordinate charm that deploys the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;networking-ovn&lt;/span&gt;&lt;/code&gt; component on
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; units and augments Octavia’s configuration for use with the
OVN provider driver.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation consists of the following interfaces:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ovsdb&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interface that facilitates a provider charm to publish connection
properties of a OVSDB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interface that facilitates a requirer charm to consume a remote OVSDB.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;octavia-provider&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interface that facilitates a provider subordinate charm to publish
information about a Octavia provider driver to and to trigger restart of
the Octavia service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interface that facilitates the Octavia charm to add provider information
and react to restart requests from a subordinate provider charm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The charms should be implemented in such a way so that the non-OpenStack
specific components can be deployed with other software components such as the
Charmed Distribution of Kubernetes.&lt;/p&gt;
&lt;p&gt;Wherever possible and relevant, existing interfaces or charm libraries should
be consumed or extended to work with the new charms.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ovn-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ovn-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#implementation"&gt;Implementation&lt;/a&gt; section&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-ovn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ovn-controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-ovn-dedicated-controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-neutron-api-plugin-ovn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-octavia-ovn-provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-ovsdb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charm-interface-octavia-provider&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Each charm should contain a README with instructions on deploying the charm.&lt;/p&gt;
&lt;p&gt;In addition to that a appendix will be added to the deployment guide with
details about how to deploy OpenStack with OVN.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Communication between OVSDB and its clients is authenticated and secured by the
use of TLS and PKI.  This must be implemented using secure best practices.&lt;/p&gt;
&lt;p&gt;TLS configuration should be possible both statically through configuration and
through automatic certificate provisioning with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vault&lt;/span&gt;&lt;/code&gt; and the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tls-certificates&lt;/span&gt;&lt;/code&gt; interface.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be implemented using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt; framework.&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;There may be need for changes to the layout of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openvswitch&lt;/span&gt;&lt;/code&gt; source
package to cater for running the ovsdb-server process without having the
package attempting to configure the switching components.  This will help
with container placement of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovsdb&lt;/span&gt;&lt;/code&gt; charm without requiring a LXD
profile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There may be need for changes to the layout of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;netwokring-ovn&lt;/span&gt;&lt;/code&gt; source
package to cater for Octavia provider driver enablement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 20 Dec 2019 00:00:00 </pubDate></item><item><title>Policy overrides using the policy.d directory</title><link>https://specs.openstack.org/openstack/charm-specs/specs/train/implemented/policy-d-override.html</link><description>

&lt;p&gt;The objective is to provide a mechanism where operators can modify the policies
of OpenStack services in order to manage the permissions of the tenants and
users of the system.  It is NOT intended that the facility described in this
specification is used to manage the permissions of the services themselves.
This must remain wholly the domain of the charms, and the facility described
here should not be (ab)used.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The preferred approach has always been to use charm options to enable a more
controlled approach to modifying the policy of a service by providing templates
that the options modify - i.e. a controlled approach that always results in
consistent policy files.&lt;/p&gt;
&lt;p&gt;However, over time, it has become apparent that there will always be an aspect
of the policy of a service that an operator wants to tweak or change that the
charm authors hadn’t considered, and the cycle time to introduce the option
exceeds the expectations of the delay that an operator is willing to tolerate.&lt;/p&gt;
&lt;p&gt;Therefore, it has been recognised that there are aspects of the configuration
files that the charms control need to be more fluidly modifiable by operators.
These tend to be orthogonal to the act of deployment and instead are to do with
operating the cloud.&lt;/p&gt;
&lt;p&gt;So, the objective is to provide to operators with a mechanism to override the
policy defaults without (hopefully) breaking the system functioning. The policy
defaults are either coded in the service via “policy-in-code” and/or via a
default policy YAML file provided by the charm/service.&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;This functionality will be supported on Ubuntu Xenial and later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This functionality will be supported on OpenStack queens and later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Juju version 2.0 or later is required for resource support.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The addition of &lt;em&gt;policy overrides&lt;/em&gt; needs to be provided in the set of target
charms (see later).  In order to do this efficiently most of the work needs to
be performed in &lt;em&gt;charm-helpers&lt;/em&gt; with minimal work done in each charm.&lt;/p&gt;
&lt;p&gt;A config option boolean &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;use-policyd-override&lt;/span&gt;&lt;/code&gt; (default &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;False&lt;/span&gt;&lt;/code&gt;) will
control whether the resource file is used.  If &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;False&lt;/span&gt;&lt;/code&gt; then the resource file
is ignored - i.e. it doesn’t matter whether it is present/damaged or not.&lt;/p&gt;
&lt;p&gt;If config option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;use-policyd-override&lt;/span&gt;&lt;/code&gt; is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;True&lt;/span&gt;&lt;/code&gt; then the Juju status will
be prefixed with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;"PO:"&lt;/span&gt;&lt;/code&gt; indicating that the policies are overridden by the
attached resource file.  This is intentionally kept short so that other
information can also be seen on the status line.  A info log is also generated
to the Juju log to indicate that policies are overridden.&lt;/p&gt;
&lt;p&gt;Juju resources will be used to attach a zipped file (using pkzip or equivalent)
to the juju application using the resource name &lt;em&gt;policy-override&lt;/em&gt;.  The
charm(s) associated with the application will verify the contents of the
zipped file and update the contents of the policy directory (default
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;service-name&amp;gt;/policy.d&lt;/span&gt;&lt;/code&gt; with the files in the zipped resource file.&lt;/p&gt;
&lt;p&gt;The resource name will be &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policyd-override&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Conceptually, the charm &lt;em&gt;owns&lt;/em&gt; the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;service-name&amp;gt;/policy.d/&lt;/span&gt;&lt;/code&gt;.
Subordinate charms will &lt;strong&gt;not&lt;/strong&gt; have the facility to override policies; this
should be performed in the principal charm.  The consequence of this
‘ownership’ is that the charm &lt;em&gt;will&lt;/em&gt; remove files from the directory if they
are not put there by the charm itself (for its own override purposes) or via
this policy override system.  i.e. &lt;em&gt;ad hoc&lt;/em&gt; dropping of files into the
directory will most likely be removed during the next &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;upgrade-charm&lt;/span&gt;&lt;/code&gt; hook
leading to unexpected results.  Changes to the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;service-name&amp;gt;/policy.d/&lt;/span&gt;&lt;/code&gt; directory are logged to the charm’s debug
log.&lt;/p&gt;
&lt;section id="templates-in-the-resource-file"&gt;
&lt;h3&gt;Templates in the Resource File&lt;/h3&gt;
&lt;p&gt;The policy override feature essentially comes in two parts; charm-helpers (and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charms.openstack&lt;/span&gt;&lt;/code&gt;) and calling the support functions from the charm.  One
slightly contentious issue is around using templates to allow context variables
(built from the relations’ data and config in a charm) to be baked into
a policy override file prior to being dropped into the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policy.d&lt;/span&gt;&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;This is not the author’s preferred mechanism which is to instead use the
existing template facility to render rules into the charm’s default policy file
(in the same was as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;admin_required&lt;/span&gt;&lt;/code&gt; is done in the keystone &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policy.json&lt;/span&gt;&lt;/code&gt;
file) and then refer to these in the stack override files.  That is, templates
are still controlled in the charm and not in the drop-in overrides.&lt;/p&gt;
&lt;p&gt;However, it is fairly trivial to &lt;em&gt;offer&lt;/em&gt; a string substitution capability in
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-helpers&lt;/span&gt;&lt;/code&gt; functions, even if this is not &lt;em&gt;used&lt;/em&gt; when called by the
charm.  The author believes that this should be the default condition, and only
allow the template facility to be enabled when a policy override requirement
cannot be satisfied in any other way.&lt;/p&gt;
&lt;p&gt;Template and substitution will offered so that files in the resource file with
either &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.j2&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.tmpl&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.tpl&lt;/span&gt;&lt;/code&gt; extensions are processed by a charm
provided string substitution function which may be a Jinja template function
using the context, or just a simple text substitution with some defined
variables.  This will be under the control of the charm.  The substituted
string returned by the charm-supplied function is then processed as per
a static yaml file with all the following validation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="validation"&gt;
&lt;h3&gt;Validation&lt;/h3&gt;
&lt;p&gt;The charm will attempt some validation of the attached resource file:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;That the file is a valid zip file (note that any directories are ignored.
The zip file is flattened to remove directories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Files that don’t have a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.yaml&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.yml&lt;/span&gt;&lt;/code&gt; extension are ignored.  This
allows documentation to be added to the zip file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The remaining, flattened, identified yaml files are checked to have unique
names.  If not, then the validation fails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each file is (attempted to be) loaded using the Python yaml &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;safe_load&lt;/span&gt;&lt;/code&gt;
function.  If this fails, then validation fails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each of the policy overrides will be checked against a blacklist that the
charm maintains.  This blacklist will be on a per-charm basis, and will
initially blacklist changing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;admin_required&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloud_admin&lt;/span&gt;&lt;/code&gt;.  This is
to ensure that the charms themselves do not get locked out of the OpenStack
system that they maintain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If validation fails then the &lt;strong&gt;whole&lt;/strong&gt; policy override fails and the
charm proceeds as if &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;use-policyd-override&lt;/span&gt;&lt;/code&gt; is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;False&lt;/span&gt;&lt;/code&gt;.  The
application/charm(s) active status will show &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;"PO&lt;/span&gt; &lt;span class="pre"&gt;(broken):&lt;/span&gt; &lt;span class="pre"&gt;..."&lt;/span&gt;&lt;/code&gt;.
Note that there will &lt;strong&gt;not&lt;/strong&gt; be a hook error.  The rationale is that
policy overrides are an &lt;em&gt;operator&lt;/em&gt; facility and the charm attempts to apply
them, but should only indicate that they have not been applied so that the
operator can change the policy overrides.  A message will be logged to
charm’s log explaining the validation failure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If charm validation succeeds then the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;service-name&amp;gt;/policy.d/&lt;/span&gt;&lt;/code&gt;
directory is cleared (apart from other charm intrinsic policy overrides) and
then new files written to the directory.  The payload service will be
restarted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="openstack-service-support"&gt;
&lt;h3&gt;OpenStack Service Support&lt;/h3&gt;
&lt;p&gt;The policy override feature appeared in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;oslo.policy&lt;/span&gt;&lt;/code&gt; for the ocata release,
and was picked up by keystone and nova initially.  In order for it to be
supported, the OpenStack service needs to support the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Enforcer&lt;/span&gt;&lt;/code&gt; class to be
able to make use of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;policy.d&lt;/span&gt;&lt;/code&gt; override directory (which is the
default).&lt;/p&gt;
&lt;p&gt;The following service projects (that have Canonical charms) examined and have
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Enforcer&lt;/span&gt;&lt;/code&gt; class at the queens release:&lt;/p&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;neutron&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aodh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;designate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;heat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;horizon (openstack-dashboard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;manila&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;octavia&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;panko&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;zaqar&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following service projects do not have &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Enforcer&lt;/span&gt;&lt;/code&gt; class support at
present (stein):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;swift&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Services where it doesn’t apply:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This work will affect a number of charms.  &lt;a class="reference external" href="https://bugs.launchpad.net/charm-keystone/+bug/1741723"&gt;Bug#1741723&lt;/a&gt; records the charms
that (most likely) need the policy override facility.  The principal ones that
are the scope of this work are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;designate (reactive charm)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;glance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;keystone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-cloud-controller&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The nature of the implementation should make it relatively easy to implement
this on further charms.  Designate is included to provide a proof-of-concept
for reactive charms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;N/A&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;ajkavanagh (irc: tinwood)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “policy-overrides” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;policy-overrides
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The changes will be implemented in:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-helpers (contrib.openstack)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charms.openstack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;individual charms (keystone, glance, &lt;em&gt;etc.&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following work items have been identified with this work:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-helpers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;helpers to read zip file, perform validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;helpers to update policy.d directory with validated files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;helper to call from install and upgrade hooks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;helper to call from config-changed hook handler to determine whether to
enable or disable the policy overrides.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;helper to merge into update-status to determine whether policy is
overridden or not.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;charms.openstack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mix-in that calls out to charm-helpers to perform validation and
update/control of policy.d directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method to integrate into install and upgrade hooks to call relevant
functions in the mix-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method to integrate with config-changed hook to determine whether to
enable or disable the policy overrides (probably call out to
charm-helpers).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;keystone charm (&lt;em&gt;in the first instance&lt;/em&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Link into the helper functions in charm-helpers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional test to verify that policy can be overridden and that files
appear in the policy.d directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;designate charm (reactive example)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add in mix-in to designate main class, and any required helper calls (it’s
not clear yet how much additional support will be needed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional test to verify that policies can be overridden with a file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;The following repositories will be affected:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/juju/charm-helpers"&gt;charm-helpers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charms.openstack"&gt;charms.openstack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-cinder"&gt;cinder&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-designate"&gt;designate&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-glance"&gt;glance&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-keystone"&gt;keystone&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-neutron-api"&gt;neutron-api&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://opendev.org/openstack/charm-nova-cloud-controller"&gt;nova-cloud-controller&lt;/a&gt; charm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the testing frameworks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack-charmers/zaza"&gt;zaza&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https:////github.com/openstack-charmers/zaza-openstack-tests"&gt;zaza-openstack-tests&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The following documents will require an update:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;charm-guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deployment-guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;README in charms affected by change&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Although a file is being uploaded to the controller (and thus as a resource to
the charms), the Python zip module is used to examine the contents, and
potential yaml files are read with the YAML module’s &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;safe_load&lt;/span&gt;&lt;/code&gt; is used to
verify that the contents are yaml.  This is then written to relevant files in
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/&amp;lt;service-name&amp;gt;/policy.d/&lt;/span&gt;&lt;/code&gt; directory.  Thus the files in the zip
file aren’t copied to the file directory.  It is thus thought that, as no 3rd
party module are used, and no files are directly copied, that there should not
be a security issue with this approach.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit tests will be added to charm-helpers and charms.openstack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functional tests will be added to those charms that support the zaza testing
framework.  This will verify that the overrides are put into the appropriate
directory and that the service is restarted.  A service action (e.g. list
users) will be verified as working, then disabled, and then working again.
A framework will be put into zaza-openstack-tests to support this.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actual policy overrides are not checked.  This is the domain of the payload
(service) and outside of the scope of testing for this feature which is simply
to drop appropriately formatted yaml files into the policy.d directory.&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 dependencies&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 20 Dec 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ussuri/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 20 Dec 2019 00:00:00 </pubDate></item><item><title>OpenStack with OVN</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/charm-openstack-ovn.html</link><description>

&lt;p&gt;Openstack can be deployed with a number of SDN solutions (e.g. ODL). OVN
provides virtual-networking for Open vSwitch (OVS). OVN has a lot of desirable
features and is designed to be integrated into Openstack, among others.&lt;/p&gt;
&lt;p&gt;Since there is already a networking-ovn project under openstack, it is the
obvious next step to implement a Juju charm that provides this service.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, Juju charms have support for deploying openstack, either with it’s
default SDN solution (Neutron), or with others such as ODL. This project
will expand the deployment scenarios under Juju for openstack by including OVN
in the list of available SDN solutions.&lt;/p&gt;
&lt;p&gt;This will also benefit OPNFV’s JOID installer in providing another scenario in
its deployment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Charms implementing neutron-api, ovn-controller and neutron-ovn will need to
be implemented. These will be written using the new reactive framework
of Juju.&lt;/p&gt;
&lt;section id="charm-neutron-ovn"&gt;
&lt;h3&gt;Charm : neutron-ovn&lt;/h3&gt;
&lt;p&gt;This charm will be deployed alongside nova-compute deployments. This will be
a subordinate charm to nova-compute, that installs and runs openvswitch and
the ovn-controller.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="charm-ovn-controller"&gt;
&lt;h3&gt;Charm : ovn-controller&lt;/h3&gt;
&lt;p&gt;This charm will deploy ovn itself. It will start the OVN services
(ovsdb-server, ovn-northd). Since there can only be a single instance of
ovsdb-server and ovn-northd in a deployment, we can also implement passive
HA, but this can be included in further revisions of this charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="charm-neutron-api-ovn"&gt;
&lt;h3&gt;Charm : neutron-api-ovn&lt;/h3&gt;
&lt;p&gt;This charm will provide the api only integration of neutron to OVN. This charm
will need to be subordinate to the existing neutron-api charm. The main task
of this charm is to setup the “neutron.conf” and “ml2_ini.conf” config files
with the right parameters for OVN. The principal charm, neutron-api, handles
the install and restart for neutron-server.&lt;/p&gt;
&lt;p&gt;Refer for more information : &lt;a class="reference external" href="https://docs.openstack.org/networking-ovn/latest/install/manual.html"&gt;https://docs.openstack.org/networking-ovn/latest/install/manual.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;N/A&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;Aakash KT&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charm-os-ovn” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-os-ovn
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 neutron-api-ovn charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement ovn-controller charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement neutron-ovn charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a bundle to deploy OpenStack OVN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create documentation for above three charms&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Yes, three new repositories will need to be created :
* charm-neutron-api-ovn
* charm-ovn-controller
* charm-neutron-ovn&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will require creation of new documentation for the covered scenario of
openstack + ovn in Juju.
A README file for the bundle needs to be written.
Add documentation in charm-deployment guide to detail how to deploy OVN with
OpenStack.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Communications to and from these charms should be made secure. For eg.
communication between ovn-central and ovn-edges to be made secure using
self-signed certs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;For testing at Juju level, we can use the new “juju-matrix” tool.
For testing functionality at OpenStack level, Mojo should be used. This will
help validate the deployment.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This charm will support OpenStack Queens as its baseline.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 27 Sep 2019 00:00:00 </pubDate></item><item><title>OpenStack Endpoint Load Balancer</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/openstack-load-balancer.html</link><description>

&lt;p&gt;To enable Openstack services for a single cloud to be installed in a highly
available configuration without requiring that each unit of a service is in
the same broadcast domain.&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;As a cloud administrator I would like to simplify my deployment so that I
don’t have to manage a corosync and pacemaker per OpenStack API service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud where all services will be
in a single broadcast domain. I see no need to use the new central
loadbalancer and would like to continue to have each service manage its
own VIP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I would like to spread my control plane across N racks
for redundancy. Each rack is in its own broadcast domain. I do not want the
users of the cloud to require knowledge of this topology. I want the
endpoints registered in Keystone to work regardless of a rack level failure.
I am using network spaces to segregate traffic in my cloud and the OpenStack
loadbalancer has access to all spaces so I only require one set of
loadbalancers for the deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I would like to spread my control plane across N racks
for redundancy. Each rack is in its own broadcast domain. I do not want the
users of the cloud to require knowledge of this topology. I want the
endpoints registered in Keystone to work regardless of a rack level failure.
I am using network spaces to segregate traffic in my cloud. I want the
segregation to extend to the load balancers and so will be requiring a set
of load balancers per network space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new internal cloud and have no
interest in IPv6, I wish to deploy a pure IPv4 solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud. I appreciate that it has
been 18 years since the IETF brought us IPv6 and feel it maybe time to
enable IPv6 within the cloud. I am happy to have some IPv4 where needed
and am looking to deploy a dual stack IPv4 and IPv6.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I am designing a new cloud. I appreciate that it has
been 18 years since the IETF brought us IPv6 and wish to never see an IPv4
address again. I am looking to deploy a pure IPv6 cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I wish to use DNS HA in conjunction with the OpenStack
loadbalancer so that loadbalancer units can be spread across different
subnets within each network space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I would like to have the OpenStack load balancers
look after HA and so will be deploying in an Active/Passive deployment.
I will need to use a VIP for the loadbalancer in this configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud architect I have an existing hardware loadbalancers I wish to
use. I do not want to have to update it with the location of each API
service backend. Instead I would like to have the OpenStack load balancers
in an Active/Active configuration and have the hardware loadbalancers
manager traffic between haproxy instance in the OpenStack loadbalancer
service. I do not need to use a VIP for the loadbalancer in this
configuration. My hardware loadbalancers utilise vip(s) which will need
to be registered as the endpoints for services in Keystone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator haproxy statistics are fascinating to me and I
want the statistics from all haproxy instances to be aggregated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I would like haproxy to be able to perform health
checks on the backends which assert the health of a service more
conclusively than simple open port checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a cloud administrator I want to be able to configure max connections
and timeouts as my cloud evolves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a charm author of a service which is behind the OpenStack load balancer
I would like the ability to tell the loadbalancer to drain connection to a
specific unit and take it out of service. This will allow the unit to go
into maintenance mode.&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;section id="new-interface-openstack-api-endpoints"&gt;
&lt;h3&gt;New interface: openstack-api-endpoints&lt;/h3&gt;
&lt;p&gt;This interface allows a backend charm hosting API endpoints to inform
the OpenStack loadbalancer which services it’s hosting and on which IP
address and port frontend API requests should be sent to on the backend
unit.  It also allows the backend charm to inform the loadbalancer which
frontend port should be used for each service.&lt;/p&gt;
&lt;p&gt;Example - neutron-api (single API endpoint per unit):&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;endpoints&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;service-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;network&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;9696&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;9689&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example - nova-cloud-controller (multiple API endpoints per unit):&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;endpoints&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;service-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;nova&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8774&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;8764&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&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;service-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;nova-placement&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8778&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-port&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;8768&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;backend-ip&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;10.10.10.2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;check-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;http&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A single instance of the OpenStack Loadbalancer application will only service
a single type of OpenStack API endpoint (public, admin or internal).  The
charm will use the network space binding of the frontend interface to determine
which IP or VIP (if deployed in HA configuration) should be used by the
backend API service for registration into the Cloud endpoint catalog.&lt;/p&gt;
&lt;p&gt;Having processed the requests from all backend units, the loadbalancer now
needs to tell the backend application the external IP being used to listen for
connections for each endpoint service type:&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;endpoints&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;service-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;nova&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-ip&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;98.34.12.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8774&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;service-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;nova-placement&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-ip&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;98.34.12.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;frontend-port&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;8778&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The backend service now updates the endpoints in the Keystone registry to point
at the IPs passed back by the loadbalancer.&lt;/p&gt;
&lt;p&gt;This interface is provided by each backend API charm and consumed via
the backend interface on the OpenStack loadbalancer charm.  Each backend
charm would provide three instances of this interface type:&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;provides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;public-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;admin-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;internal-backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;openstack-api-endpoints&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Taking this approach means that the backend charm can continue to be the
entry point/loadbalancer for some endpoint types, and push the loadbalancing
for other entry points out to the OpenStack Loadbalancer charm (or multiple
instances).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="updates-to-keystone-endpoint-calculation-code"&gt;
&lt;h3&gt;Updates to keystone endpoint calculation code&lt;/h3&gt;
&lt;p&gt;Currently the following competing options are used to calculate which EP should
be registered in Keystone:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;os-*-network set do resolve_address old method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dnsha use dnsha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;os-*-hostname set use hostname&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;juju network space binding via extra-bindings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prefer ipv6 via configuration option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;presence of {public,internal,admin}-backend relations to
openstack loadbalancers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="openstack-loadbalancer-charm"&gt;
&lt;h3&gt;OpenStack Loadbalancer charm&lt;/h3&gt;
&lt;p&gt;New charm - OpenStack Loadbalancer - with corresponding tests &amp;amp; QA CI/setup.&lt;/p&gt;
&lt;/section&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;Extend existing HAProxy charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use DNS HA.&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;unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “osbalancer” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;osbalancer
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-openstack-loadbalancer-charm"&gt;
&lt;h4&gt;Provide OpenStack Loadbalancer Charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write draft interface for LB &amp;lt;-&amp;gt; Backend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests for Keystone endpoint registration code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write Keystone endpoint registration code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-mistral"&gt;
&lt;h4&gt;Mojo specification deploying and testing Mistral&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying LB in an HA configuration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Mistral charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-openstack-loadbalancer
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The OpenStack Loadbalancer charm should contain a README with instructions on
deploying the charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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>Wed, 25 Sep 2019 00:00:00 </pubDate></item><item><title>Renaming the lxd charm to nova-lxd</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/approved/lxd-to-nova-lxd-rename.html</link><description>

&lt;p&gt;The initial ‘push’ to rename the charm to &lt;em&gt;nova-lxd&lt;/em&gt; is:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The name &lt;em&gt;nova-lxd&lt;/em&gt; better reflects that the charm is used with nova.
It is confusing for users that the (currently named) &lt;em&gt;lxd&lt;/em&gt; charm must
be used with the &lt;em&gt;nova-compute&lt;/em&gt; charm, and can’t be used in a different
environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It releases the name &lt;em&gt;lxd&lt;/em&gt; for use as a general purpose charm for LXD,
that could be created to allow clusters of LXD machines to configured
with Juju and MaaS.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The name of the charm as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; is causing some confusion in the
community as potential users are unaware that it is an OpenStack specific
charm for nova as a subordinate.  Therefore, changing the name of the
charm to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt; will help mitigate this confusion.&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;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm will be copied to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt; with all of its existing
functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm will be converted to a no-op charm with a blocked
status message indicating that the user should use the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt; charm
instead.  The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm will then be removed entirely after another
cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Making the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm a no-op also has the advantage that
existing installations will be &lt;em&gt;unable&lt;/em&gt; to upgrade to the newer ‘no-op’ lxd
charm as the relations will not match, thus forcing the operator to
investigate as well as not breaking existing installations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The charm name will be switched with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;juju&lt;/span&gt; &lt;span class="pre"&gt;upgrade-charm&lt;/span&gt; &lt;span class="pre"&gt;lxd&lt;/span&gt;
&lt;span class="pre"&gt;--switch=nova-lxd&lt;/span&gt;&lt;/code&gt; method of changing a charm and this will be tested
during upgrades.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No alternatives suggested.&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: ajkavanagh&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “nova-lxd-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;nova-lxd-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;There are the following, logically separate, pieces of work in this
specification:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Turning the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm into a ‘no-op’ charm with a &lt;em&gt;blocked&lt;/em&gt;
status message.  For the avoidance of doubt, Juju will &lt;em&gt;refuse&lt;/em&gt; to upgrade
an existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm to this charm.  The purpose of the &lt;em&gt;blocked&lt;/em&gt;
message is for new deployments where the deployment bundle &lt;em&gt;should&lt;/em&gt; use
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt;, but instead refers to the old name.  In this case, the charm
will not do anything as a subordinate except to show the &lt;em&gt;blocked&lt;/em&gt; message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating the new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt; charm by copying the existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt;
charm repository over.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create project for nova-lxd charm on OpenStack on gerrit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create launchpad project for nova-lxd charm&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;New git repository:  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack/charm-nova-lxd&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will be created as part of creating the charm-nova-lxd project on
openstack.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add notes the Charm Deployment Guide about the new charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add notes to the upgrades section to discuss how to upgrade from
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt;, what issues may occur, and how to recover the
situation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None noted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;As the charm is just being renamed, there should be no issues with unit and
functional tests.  They will not change as part of the specification.&lt;/p&gt;
&lt;p&gt;However, the various bundles that use the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxd&lt;/span&gt;&lt;/code&gt; charm will need to be updated
to refer to a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nova-lxd&lt;/span&gt;&lt;/code&gt; charm for the 19.04 release.  These are contained
in:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;github: openstack-charmers/openstack-bundles - openstack-lxd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;github: openstack-charmers/openstack-charm-testing
- README-lxd.md
- README-multihypervisor.md
- bundles/lxd/*
- bundles/multi-hypervisor/*&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Testing on a MaaS will be necessary for the modified openstack-lxd bundles.&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 noted.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 27 Aug 2019 00:00:00 </pubDate></item><item><title>Ceph RBD Mirror Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/ceph-rbd-mirror.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;RBD image mirroring can be used to provide a solution for Ceph cluster disaster
recovery. Ceph has a daemon called
&lt;a class="reference external" href="http://docs.ceph.com/docs/mimic/rbd/rbd-mirroring/"&gt;rbd-mirror&lt;/a&gt; which can
be placed on a primary and a backup cluster and provide asynchronous
replication of RBD images in a given pool.&lt;/p&gt;
&lt;p&gt;rbd-mirror can work in two modes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pool (all images in a given pool are synchronized);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;image (per-image synchronization).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The scenario targeted by this spec involves an operator when it comes to
performing promote/demote actions and the DR procedure is operator-driven
as opposed to a full automatic failover in the event of a outage at the
primary site.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Promotion/demotion of pools will be operator driven&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;RADOS objects are not mirrored so for mirroring radosgw objects which
use RADOS objects or gnocchi metrics stored in RADOS objects different
backup mechanisms are required - this spec covers RBD images only.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;RBD mirroring relies on the use of the exclusive-lock and journaling
features of RBD; these are only supported in the userspace integration
libraries as used by libvirt and qemu for native KVM virtualization.
This requirement excludes the use of this feature with LXD based clouds
which disable the majority of RBD features for compatibility with the
Linux kernel RBD driver.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The initial RBD mirror charm will only support mirroring of whole
pools.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;section id="high-level-design"&gt;
&lt;h3&gt;High Level Design&lt;/h3&gt;
&lt;p&gt;As rbd-mirror is a separate package and the service itself acts as an RBD
client it makes sense to implement the target functionality in a separate
principle charm (ceph-rbd-mirror). The charm will accept parameters on which
pools to replicate and be able to be related to multiple ceph-mon applications
in separate clusters.&lt;/p&gt;
&lt;p&gt;The charm will relate to a local ceph cluster and a remote ceph cluster
typically using a cross model relation.&lt;/p&gt;
&lt;p&gt;A new interface type (‘rbd-mirror’) will be created to support this
integration; this will be provided by the ceph-mon charm, and consumed by
the new ceph-rbd-mirror charm for both local and remote cluster connections.&lt;/p&gt;
&lt;p&gt;Each rbd-mirror daemon requires a key for connectivity to the local cluster
(named uniquely for the daemon) and a key for connectivity to the remote
cluster (named globally for all rbd-mirror daemons).  Multiple ceph
configurations will also be maintained on the ceph-rbd-mirror units -
‘ceph’ to reference the local cluster and ‘remote’ to reference the
remote cluster.  Configuration files and keys will be prefixed inline
with this naming - for example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ ls /etc/ceph
    ceph.conf
    ceph.client.rbd-mirror.&amp;lt;hostname&amp;gt;.keyring
    remote.conf
    remote.client.rbd-mirror.keyring
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to support resilience and scale-out of rbd mirroring, multiple
units of the charm may be deployed; as a result this feature will only
be supported with Ceph Luminous or later (which support multiple instances
of the rbd-mirror service).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="deployment-and-scalability-considerations"&gt;
&lt;h3&gt;Deployment and Scalability Considerations&lt;/h3&gt;
&lt;p&gt;From the deployment perspective the charm units should have high-bandwidth
and low-latency L3 connectivity to access and replication networks of both
clusters to be able to keep up with the changes to Ceph pools it tries to
replicate. At minimum, static routes will need to be configured on the node
running rbd-mirror daemon but that is outside of the scope of this spec.&lt;/p&gt;
&lt;p&gt;Multiple units of the ceph-rbd-mirror charm may be used to scale out
replication traffic.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No alternative solutions have been considered.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This feature relies on use of a Juju version which supports cross model
relations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&amp;lt;tbd&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “rbd-mirror” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;rbd-mirror
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 a new reactive charm called ceph-rbd-mirror.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the following relation:
* rbd-mirror - ceph-mon (local and cross model).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add “cluster” endpoint to extra-bindings in metadata.yaml to allow binding
the “cluster” endpoint to a ceph replication space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph-mon relations should retrieve cluster details and cephx keys via the
broker protocol implemented in Ceph charms (code reuse).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config options to specify pool names for replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate creation of pools on a backup cluster if they are not present.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add actions to promote and demote pools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable RBD journaling feature as documented in rbd-mirror docs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write functional tests via zaza framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-ceph-rbd-mirror
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-rbd-mirror&lt;/span&gt;&lt;/code&gt; charm should contain a README with instructions on
deploying the charm and on limitations related to scalability and networking.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Users created for replication must not have admin privileges - they only
need to be able to write to the pools they require on the target cluster.
This is supported through the existing group based permissions system
in the ceph-mon broker using the ‘rbd’ profile for mon and osd permissions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be done using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Fri, 03 May 2019 00:00:00 </pubDate></item><item><title>Keystone Federation</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/keystone-federation.html</link><description>

&lt;p&gt;Keystone can be configured to integrate with a number of different identity
providers in a number of different configurations. This spec attempts to
discuss how to implement pluggable backends that utilise Keystone
federations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;When deploying the OpenStack charms to an enterprise customer they are likely
to want to integrate OpenStack authentication with an existing identity
provider like AD, LDAP, Kerberos etc. There are two main ways that Keystone
appears to achieve this integration: backends and federation. Although this
spec is concerned with federation it is useful to go over backends to in an
attempt to distinguish the two.&lt;/p&gt;
&lt;p&gt;The following are not covered here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Integration with Kerberos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Horizon SSO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Federated LDAP via SSSD and mod_lookup_identity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keystone acting as an IdP in a federated environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="backends"&gt;
&lt;h3&gt;Backends&lt;/h3&gt;
&lt;p&gt;When keystone uses a backend it is Keystone itself which knows how to manage
that backend, how to talk to it and how to deal with operations on it. This
limits the number of backends that keystone can support as each new backend
needs new logic in Keystone itself. This approach also has negative security
implications. Keystone may need an account with the backend (an LDAP username
and password) to perform lookups, these account details will be in clear text
in the keystone.conf. In addition, all users passwords with flow through
keystone.&lt;/p&gt;
&lt;p&gt;The keystone project highlights SQL and LDAP (inc AD) as their supported
backends. The status of support for these is as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;SQL: Currently supported by the keystone charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LDAP: Currently supported by the keystone and keystone-ldap subordinate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These backends are supported with the Keystone v2 API if they are used
exclusively. To support multiple backends then Keystone v3 API needs to be used
and each backend is associated with a particular Keystone domain. This allows
for service users to be in SQL but users to be in ldap for example.&lt;/p&gt;
&lt;p&gt;Adding a new backend is achieved by writing a keystone subordinate charm and
relating it to keystone via the keystone-domain-backend interface.&lt;/p&gt;
&lt;p&gt;Enabling a backend tends to be achieved via the keystone.conf&lt;/p&gt;
&lt;/section&gt;
&lt;section id="federation"&gt;
&lt;h3&gt;Federation&lt;/h3&gt;
&lt;p&gt;With federation Keystone trusts a remote Identity provider. Keystone
communicates with that provider using a protocol like SAML or OpenID connect.
Keystone relies on a local Apache to manage communication and Apache passes
back to keystone environment variables like REMOTE_USER. Keystone is abstracted
from the implementation details of talking to the identity provider and never
sees the users password. When using Federation, LDAP may still be the ultimate
backend but it is fronted by something providing SAML/OpenID connectivity like
AD federation service or Shibboleth.&lt;/p&gt;
&lt;p&gt;Each Identity provider must be associated with a different domain within
keystone. The keystone v3 API is needed to support federation.&lt;/p&gt;
&lt;p&gt;Compatible Identity Providers:
(&lt;a class="reference external" href="https://docs.openstack.org/ocata/config-reference/identity/federated-identity.html#supporting-keystone-as-a-sp"&gt;https://docs.openstack.org/ocata/config-reference/identity/federated-identity.html#supporting-keystone-as-a-sp&lt;/a&gt;
):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OpenID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SAML&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;Both Keystone backends and federated backends may need to add config to the
keystone.conf and/or the Apache WSGI vhost. As such, it makes sense for both
types to share the existing interface particularly as the existing interface
is called keystone-domain-backend which does not differentiate between the
two.&lt;/p&gt;
&lt;p&gt;This spec covers changes add support for federation using either SAML or
OpenID, to the keystone charm. This will involve extending the
keystone-domain-backend interface to support passing configuration snippets to
the Apache vhosts and creating subordinate charms which implement OpenID and
SAML.&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;Add support for federation via OpenID and SAML directly to the keystone
charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new interface for federation via OpenID and SAML&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;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “keystone_federation” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;keystone_federation&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Create deployment scripts to create test env for OpenID or SAML integration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extend keystone-domain-backend&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The keystone-domain-backend interface will need to provide the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Modules for Apache to enable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration for principle to insert into Apache keystone wsgi vhosts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subordinate triggered restart of Apache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auth method(s) to be added to keystone’s [auth] methods list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration for principle to insert into keystone.conf&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configure Keystone to consume new interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keystone charm will need to be updated to respond to events outlined in the
interface description above&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New keystone-openid and keystone-saml subordinates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The new subordinates will need to expose all the configuration options needed
for connecting to the identity provider. It will then need to use the
interface to pass any required config for Apache or Keystone up to the
keystone principle.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;New projects for the interface and new subordinates will be needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will require documentation in the READMEs of both the subordinates and
the keystone charm. A blog walking through the deployment and integration
would be very useful.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Although a Keystone back-end will determine who has access to the entire
OpenStack deployment, this specific charm will only change Keystone and Apache
parameters, avoiding default values and leave the configuration to the user
should be enough.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The code must be covered by unit tests. Ideally amulet tests would be extended
to cover this new functionality but deploying a functional openid server for
keystone to use may not be practical. It must be covered by a Mojo spec though.&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, 03 May 2019 00:00:00 </pubDate></item><item><title>Keystone Charm Goal State Support</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/keystone-goal-state.html</link><description>

&lt;p&gt;Charms install and configure a piece of software on a unit in a model.  How the
software should be set up is determined by a set of information sources.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit operating environment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Application level configuration options&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Set in the model and available to the charm at a early stage&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subordinate relations to charms installed on the same unit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Peer/Cluster relation to other units of same application in same model&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relations to units of other applications in the same model&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-model relations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In its simplest form a charm’s sole goal is to as quickly as possible install
a piece of software, write its configuration and fire it up enabling the end
user to make use of the software.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;As the deployment progresses the charm learns more about its broader
environment in pace with its &lt;cite&gt;relation-joined&lt;/cite&gt; and &lt;cite&gt;relation-changed&lt;/cite&gt; hooks
being fired.  Some of these relations may fundamentally change how the software
should be set up or behave.  Which dependencies and requirements a piece of
software needs met before it can be brought to a operational state also relies
heavily on which relations the charm has.&lt;/p&gt;
&lt;p&gt;At present you may find that by the time a deployment is complete a charm has
reconfigured and restarted it’s services several times, each time it may also
have notified it’s peers and relations to do the same.  These activities
prolong the deployment time, and causes race conditions and transient errors on
depending services.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To address some of these issues Juju has introduced a &lt;cite&gt;goal-state&lt;/cite&gt; command to
the hook environment.  This can be used by a charm to get a upfront view of
what Juju is going to deploy.&lt;/p&gt;
&lt;section id="scope"&gt;
&lt;h3&gt;Scope&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Introduce &lt;cite&gt;goal-state&lt;/cite&gt; support in Keystone charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When available, make use of the early view of deployment to streamline charm
operation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="limitations"&gt;
&lt;h3&gt;Limitations&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The feature has dependency on support from Juju.  At the time of this writing
this feature is only supported by Juju 2.4.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When charm is deployed with versions of Juju without goal state support it
falls back to inferring information about the deployment from configuration
options and as relations appear.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Goal state gives us a peek into a future, the reality of that future can
change beneath us if modifications are applied to the model before deployment
completes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the event of goal state changing mid-deployment, the benefits of the
goal state optimizations may be minimized or in worst case make deploy time
longer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Some of these issues can be alleviated by introducing configuration options
that give the charm a hint of expected scale.  But this approach is static and
contradicts the dynamic use and ease of scale out properties of Juju.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “goal-state” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;goal-state
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 test charm and associated test specs to exercise and monitor how
&lt;cite&gt;identity-*&lt;/cite&gt; relations are exercised by the keystone charm in complex
deployment scenarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delay initial run of &lt;cite&gt;identity-admin&lt;/cite&gt;, &lt;cite&gt;identity-service&lt;/cite&gt; and
&lt;cite&gt;identity-credentials&lt;/cite&gt; relations until:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;all keystone units have joined and completed the charms peer/cluster
relation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;shared-db&lt;/cite&gt; relation is ready and settled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If HA, make sure it is really up and ready&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Limit the number of times &lt;cite&gt;identity-admin&lt;/cite&gt;, &lt;cite&gt;identity-service&lt;/cite&gt; and
&lt;cite&gt;identity-credentials&lt;/cite&gt; relations are fired after initial run&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Limit the number of times credentials are added/updated to the database&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This is mainly a under the hood change and documentation will be added as part
of the code in docstrings.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No changes affecting security.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be written alongside any code changes.&lt;/p&gt;
&lt;p&gt;Functional tests will be expanded or written as necessary.&lt;/p&gt;
&lt;p&gt;A test charm and associated test specs will be written to exercise and monitor
how &lt;cite&gt;identity-*&lt;/cite&gt; relations are exercised by the keystone charm in complex
deployment scenarios.&lt;/p&gt;
&lt;p&gt;Comparison of deployment times prior to and after the proposed change will be
documented as part of the review process.&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;Juju 2.4 is required for goal-state support, charm will fall back to current
behaviour when this is not available.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Fri, 03 May 2019 00:00:00 </pubDate></item><item><title>RadosGW Charm Multi-site Replication</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/radosgw-multi-site.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;RadosGW &lt;a class="reference external" href="http://docs.ceph.com/docs/luminous/radosgw/multisite/"&gt;multi-site configuration&lt;/a&gt; can be set up to provide object sync for
disaster recovery and other purposes such as using the same object data stored
in a Ceph cluster local to a cloud region. A typical setup would look like
this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;One zone per Zone Group (1 cluster per “region”);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple Zone Groups (“regions”);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One Realm;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mode of operation: active-active or active-passive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Ceph does support active-passive configurations, but to simplify
deployment choice the charms will only support active-active.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There could also be more complex configurations with multiple zones (clusters)
per zone group.&lt;/p&gt;
&lt;p&gt;In order to set this up, independent radosgw application deployments in
different Juju models have to be aware of each other and set up the
necessary configuration:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Realm name for radosgw;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Master zone group and master zone configuration;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a system user for authentication between daemons;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access key and secret key setup for master zone authentication;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A period needs to be updated after configuration changes to change an epoch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Migration of an existing single site ceph-radosgw deployment to a
multi-zone deployment will not be supported by the charms.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To be able to configure multi-site radosgw deployments it is necessary to
modify the radosgw charm to support cross-model relations between multiple
radosgw applications.  This relation will be used to exchange endpoint and
authentication information between the RADOS gateway deployment for
configuration of replication.&lt;/p&gt;
&lt;p&gt;The charms will target a fix topology with a single realm and zone group
and two zones.  Its assumed that zones will be supported by separate
Ceph clusters but this is not a hard requirement (but is recommended).&lt;/p&gt;
&lt;p&gt;Actions will be provided to promote and demote a RADOS gateway cluster
to and from master status. No automatic failover will be provided and
these operations must be performed by an operator in the event of site
failover/failback.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As this is a RADOS gateway specific feature, no alternatives have been
considered.&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;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “radosgw-multi-site” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;radosgw-multi-site
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 support for new (cross-model) relation ‘rgw-peer’ between radosgw
applications associated with different Ceph clusters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for additional configuration keys to set up realm, zonegroup and
zone for each ceph-radosgw deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement functionality to set up a master zone and add secondary zones to
it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write unit tests for newly added features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write functional tests that include the deployment of multiple clusters and
verification of object synchronization.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories will be created.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;radosgw&lt;/span&gt;&lt;/code&gt; charm README should contain instructions on deploying the
charm with new functionality enabled.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;TLS termination can be enabled on any side and needs to be supported without
manual steps of synchronizing CA certificates between sites.  SSL CA certs
will be shared between RADOS peers using the new rgw-peer relation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be done using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&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;The ceph-radosgw charm currently uses the old-style radosgw systemd unit and
a global cephx key for access to the underlying Ceph cluster.&lt;/p&gt;
&lt;p&gt;The charm should be migrated to use the new ceph-radosgw systemd units and
switch to use of cephx keys which are specific to individual radosgw units.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 03 May 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 25 Apr 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ocata/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 25 Apr 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/pike/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 25 Apr 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/queens/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 25 Apr 2019 00:00:00 </pubDate></item><item><title>The Title of Your Specification</title><link>https://specs.openstack.org/openstack/charm-specs/specs/train/template.html</link><description>

&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;What versions of the operating system are affected or required?&lt;/p&gt;
&lt;p&gt;What versions of OpenStack are affected or required?&lt;/p&gt;
&lt;p&gt;What version of Juju is required?&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 list additional ids if they intend on doing substantial
implementation work on this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Will any new git repositories need to be created?&lt;/p&gt;
&lt;p&gt;Identify all new charm repos, interface repos, layer repos, whether new or
existing, which will be affected or involved directly in the work which is
defined by this spec.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Will this require a documentation change?  If so, which documents?
Will it impact developer workflow?  Will additional communication need
to be made?&lt;/p&gt;
&lt;p&gt;Identify the surface area of doc updates explicitly, ie. charm-guide,
deployment-guide, charm README, wiki page links.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;What tests will be available or need to be constructed in order to
validate this?  Unit/functional tests, development
environments/servers, etc.&lt;/p&gt;
&lt;p&gt;Are there any special hardware requirements to test this?&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 stories, 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 or program dependencies
not already in use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the plans to package and distribute the payload and/or
dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 25 Apr 2019 00:00:00 </pubDate></item><item><title>Aodh Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/aodh.html</link><description>

&lt;p&gt;Aodh (alarms and notifications based on metrics) was split from Ceilometer
during the Liberty cycle and equivalent function was removed from
Ceilometer during the Mitaka cycle.&lt;/p&gt;
&lt;p&gt;We need to charm Aodh to allow OpenStack Operators to deploy and use
alarming and notification services as part of an OpenStack cloud.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Aodh provides a method generating alarms and notifications based on
metrics.&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 Aodh charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload 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;Manually review metrics and trigger alarms.&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;jamespage&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “aodh” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;aodh
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-aodh-charm"&gt;
&lt;h4&gt;Provide Aodh charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Aodh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Aodh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Aodh in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Aodh to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-aodh"&gt;
&lt;h4&gt;Mojo specification deploying and testing Aodh&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying Mojo in an HA configuration and testing
automatic and manual creation of DNS records.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Aodh charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-aodh
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Aodh charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;Provide mongodb interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Barbican Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/barbican.html</link><description>

&lt;p&gt;Provide a charm for deploying Barbican with support for associated
HSM modules/devices.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;OpenStack services and users often need a repository to store sensitive
information like passwords, cryptographic keys etc. The Barbican service
provides an interface on top of an HSM for doing that.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;One new charm - Barbican;  Charm needs to take into account potential use of
backed hardware security modules (HSM) - this might be nicely done using the
cinder-backend approach as a subordinate charm to avoid polluting the main
charm with details of every HSM possible.&lt;/p&gt;
&lt;p&gt;The new charm, as a minimum, should include the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload 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;Secrets stored via other means outside of OpenStack.&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;ajkavanagh
gnuoy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “barbican” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;barbican
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-base-and-interface-layers-required-for-openstack-charms"&gt;
&lt;h4&gt;Provide base and interface layers required for OpenStack charms&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provide rabbitmq interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide mysql-shared interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide pgsql interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide keystone interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provide-barbican-charm"&gt;
&lt;h4&gt;Provide Barbican charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Barbican.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Barbican&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support to enable barbicans use of
configurable storage backends: ie. HSM (hardware security module)
NOTE: configuration without HSM is not secure and is for testing purposes
only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Barbican in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Barbican to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-barbican"&gt;
&lt;h4&gt;Mojo specification deploying and testing Barbican&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying Mojo in an HA configuration and testing
storage and retrieval of secrets.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Barbican charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-barbican
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Barbican charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Given the purpose of Barbican is to store and manage secrets a review of the
charm by the security team may be appropriate.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Designate Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/designate.html</link><description>

&lt;p&gt;Charm OpenStack DNS (Designate).&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Designate (DNSaaS) provides a method for managing DNS records for addressing
OpenStack guests and floating IPs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Two new charms - designate and designate-bind - designate provides the API/RPC
services, and bind provides a flexible scale out service for managing BIND DNS
servers; the interfaces between the two charms should be sufficiently flexible
to allow different DNS backends to be plugged in at a later date if require
(i.e. a PowerDNS charm instead of BIND).&lt;/p&gt;
&lt;p&gt;The new Designate charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload 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;DNS records could be managed manually in an existing DNS server.&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;gnuoy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “designate” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;designate
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-designate-charm"&gt;
&lt;h4&gt;Provide Designate charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Designate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Designate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Designate in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Designate to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provide-designate-bind-charm"&gt;
&lt;h4&gt;Provide Designate Bind charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create bind charm designed to integrate with designate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure charm meets basic non-functional requirements, such as HA and workload
status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="extend-designate-charm"&gt;
&lt;h4&gt;Extend Designate charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support for Designate integration with Neutron to extend the
automatically created record information.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-designate"&gt;
&lt;h4&gt;Mojo specification deploying and testing Designate&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying Mojo in an HA configuration and testing
automatic and manual creation of DNS records.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;New git repositories will be required for the Designate and
Designate Bind charms:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-designate
https://git.openstack.org/openstack/charm-designate-bind
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Designate charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;Provide rabbitmq interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide mysql-shared interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide pgsql interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide keystone interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>CephFS</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ocata/implemented/cephfs.html</link><description>

&lt;p&gt;CephFS has recently gone GA and we can now move forward with offering
this to people as a charm. Up until this point it was considered too
experimental to store production data on.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;A new CephFS charm will be created. This charm will leverage the Ceph
base layer.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new CephFS charm will be created. This charm will leverage the Ceph
base layer. The effort required should be small once the Ceph base
layer is ready to go.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;GlusterFS is an alternative to CephFS and will probably fit many users
needs. However there are users who don’t want to deploy additional
hardware to create another cluster so this can be convenient in those
cases.&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;cholcombe973&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “cephfs” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cephfs
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="ceph-fs-charm"&gt;
&lt;h4&gt;ceph-fs charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create the ceph-fs charm utilizing the base Ceph layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expose interesting config items such as: mds cache size, mds bal mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create actions to allow blacklisting of misbehaving clients, breaking
of locks, creating new filesystems, add_data_pool, remove_data_pool,
set quotas, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cephfs-interface"&gt;
&lt;h4&gt;cephfs-interface&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create an interface to allow other charms to mount the filesytem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required to host the ceph-fs charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-ceph-fs
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;A README.md will be created for the charm as part of the normal development
workflow.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;A mojo spec will be developed to exercise this charm along with amulet tests
if needed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deploy ceph-mon&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy ceph-osd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy cephfs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relate the three&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that CephFS can be mounted and responds to reads/writes&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;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This project depends on the Ceph Layering project being successful.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Gnocchi Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/pike/implemented/gnocchi.html</link><description>

&lt;p&gt;Storage of metrics in an OpenStack Cloud is a big data problem.&lt;/p&gt;
&lt;p&gt;Ceilometer has used MongoDB since its initiation for storage of measures;
however this has not proven scalable, and the telemetry project have
moved to a default of using Gnocchi (a spin out of the telemetry project)
for storage of measures.&lt;/p&gt;
&lt;p&gt;We need to charm Gnocchi to allow OpenStack Operators to deploy and use
telemetry services as part of an OpenStack cloud.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Gnocchi is a multi-tenant timeseries, metrics and resources database.
It provides an HTTP REST interface to create and manipulate the data.
It is designed to store metrics at a very large scale while providing
access to metrics and resources information and history.&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 Gnocchi charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The charm will use the default storage options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Storage driver: Ceph (preferred)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indexing driver: MySQL (not preferred but default for rest of OpenStack)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coordination: Memcache (zookeeper and redis are alternative options)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The choice of coordination driver is limited to memcache, zookeeper or redis
as these drivers support the required features for Gnocchi.&lt;/p&gt;
&lt;p&gt;The Gnocchi charm will support OpenStack Mitaka and later on Ubuntu 16.04.&lt;/p&gt;
&lt;p&gt;Graphical reporting for Ceilometer was dropped from Horizon during Ocata;
the telemetry stack will make use of the Grafana Charm + the Gnocchi Plugin
for graphical reporting on Gnocchi metrics.&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;jamespage&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “gnocchi-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;gnocchi-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="reactive-interfaces"&gt;
&lt;h4&gt;Reactive Interfaces&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;interface: gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provide-gnocchi-charm"&gt;
&lt;h4&gt;Provide Gnocchi charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Gnocchi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Gnocchi in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Gnocchi to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-ceilometer-and-aodh-charms"&gt;
&lt;h4&gt;Update Ceilometer and Aodh charms&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support for deployment with Gnocchi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-gnocchi"&gt;
&lt;h4&gt;Mojo specification deploying and testing Gnocchi&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update HA Mojo spec for deploying Gnocchi in an HA configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-telemetry-bundle"&gt;
&lt;h4&gt;Update telemetry bundle&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update telemetry bundle to deploy Gnocchi and Grafana.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Gnocchi charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-gnocchi
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Gnocchi charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;No dependencies outside of this specification.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Designate - Neutron integration</title><link>https://specs.openstack.org/openstack/charm-specs/specs/queens/implemented/designate-neutron.html</link><description>

&lt;p&gt;Users of an OpenStack cloud would like to use Designate DNS records
auto-generation feature which is already available in the upstream:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/ocata/networking-guide/config-dns-int.html"&gt;https://docs.openstack.org/ocata/networking-guide/config-dns-int.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Because of the reasons described below, the existing solutions based on
integration of Designate with Nova via notification_topics does not satisfy
their requirements.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;With OpenStack Mitaka release there has been a new feature introduced which is
integration of the Compute service and the Networking service with an external
DNSaaS (DNS-as-a-Service) via extension_drivers. This feature allows DNS
records to be automatically generated in an external DNSaaS (i.e. Designate)
when Neutron ports / floating IPs are created.&lt;/p&gt;
&lt;p&gt;The feature has become an official standard for Designate - Neutron
integration and it seems to replace the old approach based on Designate - Nova
integration via notificiation_topics. It also solves the key limitation of the
old approach which was lack of support for multiple DNS domains within the
tenant.&lt;/p&gt;
&lt;p&gt;In order to use this feature, the following configuration parameters need to
be set on the Neutron Server side:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;/etc/neutron/neutron.conf&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[default]
external_dns_driver = designate&lt;/p&gt;
&lt;p&gt;[designate]
url = &amp;lt;designate public endpoint&amp;gt;
admin_auth_url = &amp;lt;keystone admin endpoint&amp;gt;
admin_username = &amp;lt;admin user username&amp;gt;
admin_password = &amp;lt;admin user password&amp;gt;
admin_tenant_name = &amp;lt;admin user tenant&amp;gt;
allow_reverse_dns_lookup = &amp;lt;allow creation of PTR records&amp;gt;
ipv4_ptr_zone_prefix_size = &amp;lt;IPv4 PTR zone prefix size&amp;gt;       # optional
ipv6_ptr_zone_prefix_size = &amp;lt;IPv6 PTR zone prefix size&amp;gt;       # optional
cafile = &amp;lt;path to CA certificate&amp;gt;                             # optional&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;/etc/neutron/plugins/ml2/ml2_conf.ini&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[ml2]
extension_drivers = dns&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, currently the neutron-api charm does not support any way of setting
up these parameters, except of ml2 extension.&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 can be split to the following parts:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Create new interface (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;designate&lt;/span&gt;&lt;/code&gt;) to expose public API endpoint of
Designate service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new relation (“external-dns”) between designate and neutron-api
charms to send Designate public endpoint through relation data via the
“designate” interface. Implement reactive handlers / hooks on both designate
and neutron-api charms size to support the new relation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new config options to neutron-api charm to handle the following
parameters:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“allow_reverse_dns_lookup”:&lt;/p&gt;
&lt;p&gt;purpose: specifies whether to enable or not the creation of PTR records
data type: boolean
valid values: True / False&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“ipv4_ptr_zone_prefix_size”:&lt;/p&gt;
&lt;p&gt;purpose: the size in bits of the prefix for the IPv4 reverse lookup zones
data type: int
valid values: 0 - 32&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“ipv6_ptr_zone_prefix_size”:&lt;/p&gt;
&lt;p&gt;purpose: the size in bits of the prefix for the IPv6 reverse lookup zones
data type: int
valid values: 0 - 128&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Implement new class (“DesignateContext”) on neutron-api charm to generate
the following context based on relation data and config options:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;ctxt = {‘enable_designate’: &amp;lt;True if “external-dns” relation established&amp;gt;,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;‘designate_endpoint’: &amp;lt;consumed from “designate” interface&amp;gt;,
‘allow_reverse_dns_lookup’: &amp;lt;based on config option&amp;gt;,
‘ipv4_ptr_zone_prefix_size’: &amp;lt;based on config option&amp;gt;,
‘ipv6_ptr_zone_prefix_size’: &amp;lt;based on config option&amp;gt;}&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update any other context classes which may be affected by the change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update templates to enable the feature if “external-dns” relation is
established. Remaining parameters will be retrieved from the existing
contexts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The designate charm currently supports integration with nova-compute charm for
DNS records auto-generation via notification_topics. This approach, however,
has some limitations which can be summarized as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It seems to be obsolete starting from OpenStack Mitaka release in favor of
Designate - Neutron integration via extension_drivers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It lacks support for multiple DNS domains within the tenant.&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;tkurek&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic designate-neutron for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-designate-neutron
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="update-designate-charm"&gt;
&lt;h4&gt;Update designate charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update metadata.yaml and layer.yaml files to support new relation and
interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new reactive handler to support new relation and interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update config.yaml file to indicate that old options are obsolete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update README.md to describe new feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-neutron-api-charm"&gt;
&lt;h4&gt;Update neutron-api charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update metadata.yaml file to support new relation and interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm to consume “designate_endpoint” from relation data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new config options to the neutron-api charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update template files to implement upstream feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update README.md to describe new feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provide-designate-interface"&gt;
&lt;h4&gt;Provide designate interface&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create new interface to expose public API endpoint of Designate service&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the designate interface:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-interface-designate
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;README files of designate and neutron-api charms will need to be updated to
describe the new feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security implications for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit and functional tests of designate and neutron-api charms will need to be
updated to support implementation of the new feature.&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 external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Panko Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/charm-panko.html</link><description>

&lt;p&gt;Ceilometer used to provide an event API to query and store events from
different OpenStack services. However, this functionality was deprecated
in Newton and removed in Ocata. Event storage and querying functionality
is now provided by a service called Panko. Use-cases of historical
event data storage include audit logging, debugging and billing.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Panko is an event storage service that provides an ability to store and
query event data generated by Ceilometer with potentially other sources.
Panko includes support for several storage options (sqlalchemy-compatible
databases, mongodb, elasticsearch) which differ in their level of maturity.&lt;/p&gt;
&lt;p&gt;At its core Panko is a regular API service with a database backend.&lt;/p&gt;
&lt;p&gt;Events are published to Panko via Direct publisher in Ocata while in
Pike Direct publisher was deprecated and will be removed. For that
reason Panko publisher was added.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Direct publisher &lt;a class="reference external" href="https://docs.openstack.org/releasenotes/panko/unreleased.html#deprecation-notes"&gt;deprecation&lt;/a&gt; (ceilometer/publisher/direct.py) was done under this &lt;a class="reference external" href="https://git.io/vd98b"&gt;commit&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another mechanism that was deprecated in Pike is dispatchers which were
used to send data specified by publishers. So were
{event,meter}_dispatchers options in ceilometer.conf&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Panko dispatcher &lt;a class="reference external" href="https://docs.openstack.org/releasenotes/panko/unreleased.html#deprecation-notes"&gt;deprecation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/releasenotes/ceilometer/ocata.html#deprecation-notes"&gt;Notes&lt;/a&gt; on unneeded duplication of publishers and dispatchers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;a class="reference external" href="https://lists.openstack.org/pipermail/openstack-dev/2017-April/115576.html"&gt;discussion&lt;/a&gt; on dispatchers vs publishers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is instead done directly by publishers in Pike and Panko publisher is
present in Panko’s repository itself, not ceilometer repository.&lt;/p&gt;
&lt;p&gt;Panko first appeared in Ocata Ubuntu Cloud Archive.&lt;/p&gt;
&lt;p&gt;Ceilometer is able to query Panko’s presence via Keystone catalog but
does not define a publisher for sending event data to Panko by default.&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 charm should include the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support SQLAlchemy-compatible databases as storage backends;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HA support;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TLS support;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;integration with Ceilometer charm.&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 for historical event data within OpenStack.&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;dmitriis&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “panko-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;panko-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="reactive-interfaces"&gt;
&lt;h4&gt;Reactive Interfaces&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;interface: panko&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="provide-panko-charm"&gt;
&lt;h4&gt;Provide Panko charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a charm layer based on openstack-api layer;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Panko (schema changes);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Panko in a highly available configuration;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Panko to display workload status;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support TLS endpoints;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-ceilometer-charm"&gt;
&lt;h4&gt;Update Ceilometer Charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support for deployment with Panko (by specifying publishers correctly
in event_pipeline.yaml for both Ocata and Pike+).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-panko"&gt;
&lt;h4&gt;Mojo specification deploying and testing Panko&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update HA Mojo spec for deploying Panko in an HA configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="update-telemetry-bundle"&gt;
&lt;h4&gt;Update telemetry bundle&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update telemetry bundle to deploy Panko&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Panko charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-panko
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Panko charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;No dependencies outside of this specification.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Mistral Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/mistral.html</link><description>

&lt;p&gt;To add a service to Openstack to set up and manage on-schedule jobs for
multiple machine.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;As a cloud administrator I have maintenance jobs that I’d like to be run
against the cloud. I want to ble to set up and manage on-schedule jobs for
multiple machines. I’d like a single point of control over their schedule.&lt;/p&gt;
&lt;p&gt;As a devops engineer I’d like to be able to specify workflows needed for
deploying environments consisting of multiple VMs and applications.&lt;/p&gt;
&lt;p&gt;As a business process enforcer I’d like to be able to make a request to run a
complex multi-step business process and have it be fault-tolerant so that if
the execution crashes at some point on one node then another active node of the
system can automatically take on and continue from the exact same point where
it stopped.&lt;/p&gt;
&lt;p&gt;As a data analyst I need a tool for data crawling. Eg I’d like to be able to
express as a graph the related tasks I need in order to prepare a financial
report.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;One new charm - Mistral with corresponding tests and QA CI/setup.&lt;/p&gt;
&lt;p&gt;The new Mistral charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload 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;Jobs could scheduled manually via cron on each machine.&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;unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “mistral” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;mistral
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-mistral-charm"&gt;
&lt;h4&gt;Provide Mistral charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Mistral.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Mistral&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Mistral in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Mistral to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-mistral"&gt;
&lt;h4&gt;Mojo specification deploying and testing Mistral&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying Mojo in an HA configuration and testing
creation of jobs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Mistral charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-mistral
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Mistral charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;Provide rabbitmq interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide mysql-shared interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide pgsql interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide keystone interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Murano Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/murano.html</link><description>

&lt;p&gt;To add a service to Openstack provide a catalogue of applications deployable
on Openstack.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;To provide UI and API which allows to compose and deploy composite
environments on the Application abstraction level and then manage their
lifecycle. The Service should be able to orchestrate complex circular dependent
cases in order to setup complete environments with many dependent applications
and services. However, the actual deployment itself will be done by the
existing software orchestration tools (such as Heat), while the Murano project
will become an integration point for various applications and services.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;One new charm - Murano with corresponding tests and QA CI/setup.&lt;/p&gt;
&lt;p&gt;The new Murano charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload 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;Jobs could scheduled manually via cron on each machine.&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;unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “murano” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;murano
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-murano-charm"&gt;
&lt;h4&gt;Provide Murano charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Murano.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Murano&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Murano in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Murano to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-murano"&gt;
&lt;h4&gt;Mojo specification deploying and testing Murano&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying murano in an HA configuration and testing
creation of jobs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Murano charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-murano
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Murano charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;Provide rabbitmq interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide mysql-shared interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide pgsql interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide keystone interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide horizon interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide heat interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Trove Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/trove.html</link><description>

&lt;p&gt;To add a service to Openstack to provide on-demand databases.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;As a cloud user I need be able to deploy a database that is scalable and
reliable quickly and easily without the burden of handling complex
administrative tasks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;One new charm - Trove with corresponding tests and QA CI/setup.&lt;/p&gt;
&lt;p&gt;The new Trove charm should include, as a minimum, the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deployable in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow clients and services to interact using SSL encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm progress displayed via workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;juju&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;mysql,percona-cluster,cassandra,etc&lt;span class="o"&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;unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “trove” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;trove
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="provide-trove-charm"&gt;
&lt;h4&gt;Provide Trove charm&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create skeleton charm layer based on OpenStack base layer and available
interface layers to deploy Trove.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for upgrading Trove&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add config option and accompanying support for upgrades via
action-managed-upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for deploying Trove in a highly available configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for the Trove to display workload status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support SSL endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm should have unit and functional tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-deploying-and-testing-trove"&gt;
&lt;h4&gt;Mojo specification deploying and testing Trove&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write Mojo spec for deploying Trove in an HA configuration and testing
creation of databases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the Trove charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-trove
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The Trove charm should contain a README with instructions on deploying the
charm. A blog post is optional but would be a useful addition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a combination of Amulet, Bundle tester and Mojo specification.&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;Provide rabbitmq interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide mysql-shared interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide pgsql interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide keystone interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide hacluster interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide nrpe-external-master interface layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with all common hook code that is not already
covered by an interface layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for HA deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for SSL communication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide OpenStack base layer with support for workload status&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>Octavia Charm</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/octavia.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At present our support for LBaaS makes use of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas&lt;/span&gt;&lt;/code&gt;
&lt;em&gt;service_plugin&lt;/em&gt; and &lt;em&gt;service_provider&lt;/em&gt; drivers.  In the existing
implementation the load balancer code, which is a part of the datapath, is run
in namespaces directly on the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron&lt;/span&gt;&lt;/code&gt; gateway units.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas-dashboard&lt;/span&gt;&lt;/code&gt; projects are marked as
deprecated as of the Queens OpenStack release cycle and has stopped receiving
updates.  They will be removed entirely at some point in the future.&lt;/p&gt;
&lt;p&gt;Our usage of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas&lt;/span&gt;&lt;/code&gt; driver also gives a sub-optimal configuration
for users in need of TLS.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas&lt;/span&gt;&lt;/code&gt; projects have been replaced by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt;,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia-dashboard&lt;/span&gt;&lt;/code&gt;, and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python-octaviaclient&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; has a separate API endpoint and implements a superset of the
LBaaS v2 API.  For migration of existing users there is a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lbaasv2-proxy&lt;/span&gt;&lt;/code&gt;
service plugin which allows &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron&lt;/span&gt;&lt;/code&gt; API endpoint to forward LBaaS v2 API
calls to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; endpoint in a migration period.&lt;/p&gt;
&lt;p&gt;Contrary to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas&lt;/span&gt;&lt;/code&gt; implementation, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; runs the
in-datapath load balancer code as instances in your cloud.  This gives richer
flexibility both in terms of freedom of choice of provider of the load balancer
software itself and dynamic scaling of the service.&lt;/p&gt;
&lt;p&gt;On the scaling side, most if not all, of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; services benefit from
being scaled out proportional to the number of running load balancers and load
balancer life cycle events.  Thus it makes sense to co-locate the API, Worker,
Health Manager and Housekeeping Manager daemons in the same charm unit, and
scale by increasing the number of charm units deployed.&lt;/p&gt;
&lt;p&gt;A reference implementation load balancer based on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Ubuntu&lt;/span&gt;&lt;/code&gt; cloud images
running &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;HAProxy&lt;/span&gt;&lt;/code&gt; called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;amphorae&lt;/span&gt;&lt;/code&gt; is available.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As our current dependencies for providing LBaaS are deprecated and set to be
removed at a future date there are no real alternatives to doing this work.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “octavia-charm” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;octavia-charm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 a new principal &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; charm which will deploy the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt;
API, Worker, Health Manager and Housekeeping Manager daemons.  The charm MUST
have all the characteristics you expect from a OpenStack API charm such as
TLS, HA, pause / resume actions, upgrades etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make necessary changes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron&lt;/span&gt;&lt;/code&gt; charms for operation with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make necessary changes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack-dashboard&lt;/span&gt;&lt;/code&gt; charm for replacing the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-lbaas-dashboard&lt;/span&gt;&lt;/code&gt; with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia-dashboard&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement support for storing TLS private key secrets in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Vault&lt;/span&gt;&lt;/code&gt; either
through relation to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;barbican&lt;/span&gt;&lt;/code&gt; or by utilizing the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;castellan&lt;/span&gt;&lt;/code&gt; library
directly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement support for doing post-deployment configuration and plumbing of the
private administration network between &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; and the load balancer
instances it deploys.  This will be done by interacting with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron&lt;/span&gt;&lt;/code&gt;
API and deploying the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-openvswitch&lt;/span&gt;&lt;/code&gt; subordinate with the charm.
The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-openvswitch&lt;/span&gt;&lt;/code&gt; subordinate will automatically take care of
creating necessary tunnels for access to the overlay network and we can
subsequently create &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OpenvSwitch&lt;/span&gt;&lt;/code&gt; ports on the units where &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt;
services are deployed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide documentation and/or any actions necessary for obtaining,
provisioning or indeed building (if necessary) the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;amphorae&lt;/span&gt;&lt;/code&gt; load balancer
software images.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide documentation and/or any actions necessary for migrating existing
load balancer workloads to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new git repository will be required for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; charm:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;https://git.openstack.org/openstack/charm-octavia
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; charm should contain a README with instructions on deploying
the charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Serving TLS terminated traffic is a basic feature of a load balancer service.
With that comes responsibility for secure handling and storage of sensitive
information such as private keys.&lt;/p&gt;
&lt;p&gt;Best practices for handling and storing these keys will be implemented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If we are to provide our user with a mechanism to build the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;amphorae&lt;/span&gt;&lt;/code&gt;
images, it must be made clear that the responsibility of keeping the built
image secure and up to date rests solemnly with our user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The presence of a direct network tunnel between the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; unit placed
in the undercloud control plane and the load balancer instances in the
overcloud is a construct we have not encountered previously.  We must
consider all aspects of this carefully with security and integrity in mind.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code written or changed will be covered by unit tests; functional testing will
be done using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Zaza&lt;/span&gt;&lt;/code&gt;.&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;To be able to support deployment of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;octavia&lt;/span&gt;&lt;/code&gt; charm in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;LXD&lt;/span&gt;&lt;/code&gt; containers
we depend on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Juju&lt;/span&gt;&lt;/code&gt; implementation of charm controlled &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;LXD&lt;/span&gt;&lt;/code&gt; profile
updates &lt;a class="reference external" href="https://discourse.jujucharms.com/t/wip-specification-for-lxd-profile-updates-permitted-by-charms/78"&gt;specification&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Mar 2019 00:00:00 </pubDate></item><item><title>SR-IOV networking support</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/sriov-support.html</link><description>

&lt;p&gt;SR-IOV is a mechanism for passing hardware virtualized network functions (VF)
or full physical function (PF) directly to KVM instances; the OpenStack
charms should be updated to support this capability.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Using Open vSwitch and the chain of bridges, veth pairs and tap devices incurs
an overhead on network throughput and latency that is not acceptable in some
use cases for OpenStack.&lt;/p&gt;
&lt;p&gt;SR-IOV allows part of (a VF) or a full (a PF) SR-IOV enabled network card to be
connected directly to a KVM instance via the virtualization layer provided
by libvirt.&lt;/p&gt;
&lt;p&gt;Support for both of these types of passthrough was implemented in full in the
Mitaka release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Supporting SR-IOV will require changes in three charms; specifically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;neutron-api: Enablement of the ML2 mechanism driver for SR-IOV&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-cloud-controller: Enablement of appropriate scheduler filters for
management of PCI passthrough devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute: White listing of PCI devices for use by compute instances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SR-IOV will be enabled using a configuration option on the neutron-api charm
‘enable-sriov’; The nova-cloud-controller charm will be notified of the
state of this option via the relation between the nova-cloud-controller charm
and the neutron-api charm.&lt;/p&gt;
&lt;p&gt;In the first implementation, a pci-device-whitelist configuration option
will be provided by the nova-compute charm to allow allocation of specific
PCI devices to compute instances.  This is a direct pass through to a Nova
configuration option.  Later revisions of this feature may use as-yet
unimplemented features in Juju to manage PCI device allocation at the unit
level.&lt;/p&gt;
&lt;p&gt;Initial SR-IOV support will be agent-less (i.e. not using the
neutron-sriov-agent).&lt;/p&gt;
&lt;p&gt;Flat and VLAN networking modes will be supported.&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;james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “sriov-support” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;sriov-support
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="initial-charm-support-for-sr-iov"&gt;
&lt;h4&gt;Initial charm support for SR-IOV&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;neutron-api: Add enable-sriov config option, enable mechanism driver, pass
details to nova-cloud-controller charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-cloud-controller: Add PciPassthroughFilter to scheduler filters when
enable-sriov is enabled by the neutron-api charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute: Add pci-device-whitelist configuration option, pass directly
into nova.conf configuration file template(s).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mojo-specification-for-sr-iov-base-enablement"&gt;
&lt;h4&gt;Mojo specification for SR-IOV base enablement&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Functional testing specification for deployment of an SR-IOV enabled
OpenStack Cloud.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="sr-iov-vf-pf-scheduling-testing"&gt;
&lt;h4&gt;SR-IOV VF/PF scheduling testing&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Focussed testing on ensuring that scheduling behaviour is tuned appropriately
when SR-IOV is in use within a cloud.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="juju-device-binding-support"&gt;
&lt;h4&gt;Juju device binding support&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Stretch objective for Newton cycle; superceeds pci-device-whitelist option
on nova-compute charm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Updates to the README’s in the impacted charms will be made as part of this
change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a Mojo specification.&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;OpenStack Mitaka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SR-IOV enabled hardware in the Ubuntu OpenStack QA lab for functional
testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Juju device management support&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 27 Dec 2018 00:00:00 </pubDate></item><item><title>Cells V2</title><link>https://specs.openstack.org/openstack/charm-specs/specs/stein/implemented/cells.html</link><description>

&lt;p&gt;Nova cells v2 has been introduced over the Ocata and Pike cycles. In fact, all
Pike deployments are now deployments using nova cells v2 usually using a single
compute cell.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Nova cells v2 allows for a group of compute nodes to have their own dedicated
database, message queue and conductor while still being administered through
a central API service. This has the following benefits:&lt;/p&gt;
&lt;section id="reduced-pressure-on-rabbit-and-mysql-in-large-deployments"&gt;
&lt;h3&gt;Reduced pressure on Rabbit and MySQL in large deployments&lt;/h3&gt;
&lt;p&gt;In even moderately sized clouds the database and message broker can quickly
become a bottle neck. Cells can be used to alleviate that pressure by having a
database and message queue per cell of compute nodes. It is worth noting that
the charms already support having traffic for neutron etc in a separate rabbit
instance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="create-multiple-failure-domains"&gt;
&lt;h3&gt;Create multiple failure domains&lt;/h3&gt;
&lt;p&gt;Grouping compute cells with their local services allows the creation of
discrete failure domains (from a nova POV at least).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="remote-compute-cells-edge-computing"&gt;
&lt;h3&gt;Remote Compute cells (Edge computing)&lt;/h3&gt;
&lt;p&gt;In some deployments a group of compute nodes maybe far removed (from a
networking pov) from the central services. In this case it maybe useful to have
the compute nodes act as a largely independent group.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="different-slas-per-cell"&gt;
&lt;h3&gt;Different SLAs per cell&lt;/h3&gt;
&lt;p&gt;Different groups of compute nodes can have different levels of performance,
HA. etc. A cell could have no local HA for the database, message queue and
conductor for a development cell but the production cell could have
significantly higher specification servers running clustered services.&lt;/p&gt;
&lt;p&gt;(These use cases were paraphrased from &lt;a class="reference external" href="https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment"&gt;*4&lt;/a&gt;.)&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 facilitate a cells v2 deployment a few relatively simple interfaces and
relations need to be added. From a nova perspective the topology looks like &lt;a class="reference external" href="https://docs.openstack.org/nova/latest/_images/graphviz-d1099235724e647ca447c7bd6bf703c607ddf68f.png"&gt;this&lt;/a&gt;.
This spec proposes mapping that to this &lt;a class="reference external" href="https://docs.google.com/drawings/d/1v5f8ow0aCGrKRIpg3uXsv2zolWsz3mGVGzLnbgUQpKQ/"&gt;charm topology&lt;/a&gt;.&lt;/p&gt;
&lt;section id="superconductor-access-to-child-cells"&gt;
&lt;h3&gt;Superconductor access to Child cells&lt;/h3&gt;
&lt;p&gt;The superconductor needs to be able to query the databases of the compute cells
and to send and receive messages on the compute_cells message bus. The
cleanest way to model this would be to have a direct Juju relation between the
superconductor and the compute cells database and message bus. To facilitate
this the following relations will be added to the nova-cloud-controller charm:&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;shared-db-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;mysql-shared&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;amqp-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;rabbitmq&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="superconductor-configuring-child-cells"&gt;
&lt;h3&gt;Superconductor configuring child cells&lt;/h3&gt;
&lt;p&gt;With the above change the superconductor has access to the child db and mq but
does not know which compute cell name to associate with them. To solve this the
nova-cloud-controller charm will have the following new relations:&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;provides&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-cell-api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;cell&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;nova-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;cell&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The new cell relation will be used to pass the cell name, db service name and
message queue service name.&lt;/p&gt;
&lt;div class="highlight-python 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;'amqp-service'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'rabbitmq-server-cell1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'db-service'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'mysql-cell1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'cell-name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cell1'&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;Given this information the superconductor can examine the service names that
are attached to its shared-db-cell and amqp-cell relations and construct
urls for them. The superconductor is then able to create the cell mapping in
the api database by running:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;nova-manage&lt;span class="w"&gt; &lt;/span&gt;cell_v2&lt;span class="w"&gt; &lt;/span&gt;create_cell&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;cell_name&amp;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;--transport-url&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;transport_url&amp;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;--database_connection&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;database_connection&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The superconductor needs five relations to be in place and their corresponding
contexts to be complete before the cell can be mapped. Given the
nova-cloud-controller is a non-reactive charm special care will be needed to
ensure that the cell mapping happens irrespective of the order in which those
relations are completed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="compute-conductor-no-longer-registering-with-keystone"&gt;
&lt;h3&gt;Compute conductor no longer registering with keystone&lt;/h3&gt;
&lt;p&gt;The compute conductor does not need to register an endpoint with keystone nor
does it need service credentials. As such the identity-service relation should
not be used for compute cells. A guard should be put in place in the
nova-cloud-controller charm to prevent a compute cells nova-cloud-controller
from registering an incorrect endpoint in keystone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="compute-conductor-cell-name-config-option"&gt;
&lt;h3&gt;Compute conductor cell name config option&lt;/h3&gt;
&lt;p&gt;The compute conductor needs to know its own cell name so that it can pass this
information up to the superconductor. To allow this a new configuration option
will be added to the nova-compute charm:&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;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cell-name&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="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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Name of the compute cell this controller is associated with. If this is&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;left unset or set to api then it is assumed that this controller will&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;be the top level api and cell0 controller.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Leaving the cell name unset assumes the current behaviour of associating the
nova-cloud-controller with the api service, cell0 and cell1.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="nova-compute-service-credentials"&gt;
&lt;h3&gt;nova-compute service credentials&lt;/h3&gt;
&lt;p&gt;The nova-compute charm needs service credentials for RPC calls to the Nova
Placement API and the Neutron API service. It currently gets these credentials
via its cloud-compute relation which is ugly at best. However, given that the
compute cells nova-cloud-controller will no longer have a relation with
keystone it will not have any credentials to pass on to nova-compute. This is
overcome by adding a cloud-credentials relation to the nova-compute charm.&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;cloud-credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;keystone-credentials&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;nova-compute will request a username based on its service name so that users
for different cells can be distinguished from one another.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bespoke-vhosts-and-db-names"&gt;
&lt;h3&gt;Bespoke vhosts and db names&lt;/h3&gt;
&lt;p&gt;The ability to specify a nova db name and a rabbitmq vhost name should either
be removed from the nova-cloud-controller charm or the new cell interface needs
to support passing those up to the superconductor so that the superconductor
can request access to the correct resources from the compute nodes database and
message queue.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="disabling-unused-services"&gt;
&lt;h3&gt;Disabling unused services&lt;/h3&gt;
&lt;p&gt;The compute cells nova-cloud-controller only needs to run the conductor service
and possible the console services. Unused services should be disabled by the
charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-cell-conductor-charm"&gt;
&lt;h3&gt;New cell conductor charm?&lt;/h3&gt;
&lt;p&gt;The nova cloud controller in a compute node only runs a small subset of the
nova services and does not require a lot of the complexity that is baked
into the current nova-cloud-controller charm. This begs the question of whether
a new cut-down reactive charm that just runs the conductor would make sense.
Most of the changes outlined above actually impact the superconductor rather
than the compute conductor. However, looking at this the other way around the
changes needed to allow the nova-cloud-controller charm to act as a child
conductor are actually quite small and so probably do not warrant the creation
of a new charm. It is probably worth noting some historical context here too,
every time the decision has been made to create a charm which can operate in
multiple modes that decision has been reversed at some cost at a later data (
ceph being a prime example).&lt;/p&gt;
&lt;p&gt;Taking all that into consideration a new charm will not be written and the
existing nova-cloud-controller charm will be extended to add support for
running as a compute conductor.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="message-queues"&gt;
&lt;h3&gt;Message Queues&lt;/h3&gt;
&lt;p&gt;There is flexibility around which message queue the non-nova services use. A
dedicated rabbit instance could be created for them or they could reuse the
rabbit instance the nova api service is using.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="telemetry-etc"&gt;
&lt;h3&gt;Telemetry etc&lt;/h3&gt;
&lt;p&gt;This spec does not touch on integration with telemetry. However, this does
require further investigation to ensure that message data can be collected.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="juju-service-names"&gt;
&lt;h3&gt;Juju service names&lt;/h3&gt;
&lt;p&gt;It will be useful, but not required, to embed the cell name in the service name
of each component that is cell specific. Eg deploying services for cellN
may look 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="l l-Scalar l-Scalar-Plain"&gt;juju deploy nova-compute nova-compute-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy nova-cloud-controller nova-cloud-controller-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy mysql mysql-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy rabbitmq-server rabbitmq-server-cellN&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;Do nothing and do not support additional nova v2 cells.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resurrect support for the deprecated and bug ridden cells v1&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;Unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cellsv2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="existing-work"&gt;
&lt;h3&gt;Existing Work&lt;/h3&gt;
&lt;p&gt;As part of writing the spec prototype charms and a bundle were created
for reference: &lt;a class="reference external" href="https://gist.github.com/gnuoy/9ede4e9d426ea56951c664569e7ad957"&gt;Bundle&lt;/a&gt;
and &lt;a class="reference external" href="https://gist.github.com/gnuoy/aff86d0ad616a890ba731a3cb7deef51"&gt;charm diffs&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;Remove support for cells v1 from nova-compute and nova-cloud-controller
charms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add identity-context relation to nova-compute and ensure the supplied
credentials are used when rendering placement and keystone sections in
nova.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add shared-db-cell relation to nova-cloud-controller assuming ‘nova’
database name when requesting access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add amqp-cell relations to nova-cloud-controller assuming ‘openstack’ vhost
name when requesting access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add code for registering a  cell to nova-cloud-controller. This will use the
AMQ and SharedDB contexts from the shared-db-cell and amqp-cell relation
to create the cell mapping.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update nova.conf templates in nova-cloud-controller to only render api db
url if the nova-cloud-controller is a superconductor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update db initialisation code to only run the relevant cell migration if not
a superconductor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add nova-cell and nova-cell-api relations and ensure that the shared-db, amqp
shared-db-cell, amqp-cell and nova-api-cell relations all attempt to register
compute cells.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write bundles to use cells topology&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check integration with other services (designate and telemetry in particular)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;READMEs of nova-cloud-controller and nova-compute will need updating to
explain new relations and config options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blog with deployment walkthrough and explanation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update Openstack Charm documentation to explain how to do a multi-cell
deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add bundle to charm store.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No new security risks that I am aware of&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A multi-cell topology is probably beyond the scope of amulet tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bundles added to openstack-charm-testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mojo specs&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 that I can think of&lt;/p&gt;
&lt;section id="credits"&gt;
&lt;h3&gt;Credits&lt;/h3&gt;
&lt;p&gt;Much of the benefit of cells etc was lifted from *4&lt;/p&gt;
&lt;p&gt;*1 &lt;a class="reference external" href="https://docs.openstack.org/nova/pike/cli/nova-manage.html"&gt;https://docs.openstack.org/nova/pike/cli/nova-manage.html&lt;/a&gt;
*2 &lt;a class="reference external" href="https://docs.openstack.org/nova/latest/user/cellsv2-layout.html"&gt;https://docs.openstack.org/nova/latest/user/cellsv2-layout.html&lt;/a&gt;
*3 &lt;a class="reference external" href="https://bugs.launchpad.net/nova/+bug/1742421"&gt;https://bugs.launchpad.net/nova/+bug/1742421&lt;/a&gt;
*4 &lt;a class="reference external" href="https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment"&gt;https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Fri, 07 Dec 2018 00:00:00 </pubDate></item><item><title>External Networking REDUX</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/external-networking-redux.html</link><description>

&lt;p&gt;Refactor neutron-gateway and neutron-openvswitch charms to support more
flexible configuration of ‘external’ north/south traffic routing to
tenant networks.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The neutron-gateway and neutron-openvswitch charms currently support the
‘ext-port’ configuration option to plumb the Open vSwitch br-ex bridge
into the external/public network.&lt;/p&gt;
&lt;p&gt;OpenStack switched to a more flexible way of doing this a few cycles back,
and the use of the default ‘br-ex’ == external network approach is
officially deprecated.&lt;/p&gt;
&lt;p&gt;We need to refactor the charms to support the reference way of configuring
external networking, which provides more flexibility than the current
approach but does require more knowledge of Neutron.&lt;/p&gt;
&lt;section id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;p&gt;Using the reference approach to external networking, its possible to have
multiple external networks served from the same set of neutron gateway
units, potentially on the same physical network with VLAN segmentation:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;neutron&lt;span class="w"&gt; &lt;/span&gt;net-create&lt;span class="w"&gt; &lt;/span&gt;--provider:network_type&lt;span class="w"&gt; &lt;/span&gt;vlan&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;--provider:segmentation_id&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;400&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;--provider:physical_network&lt;span class="w"&gt; &lt;/span&gt;physnet1&lt;span class="w"&gt; &lt;/span&gt;--shared&lt;span class="w"&gt; &lt;/span&gt;external

neutron&lt;span class="w"&gt; &lt;/span&gt;net-create&lt;span class="w"&gt; &lt;/span&gt;--provider:network_type&lt;span class="w"&gt; &lt;/span&gt;vlan&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;--provider:segmentation_id&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;401&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;--provider:physical_network&lt;span class="w"&gt; &lt;/span&gt;physnet1&lt;span class="w"&gt; &lt;/span&gt;--shared&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;--router:external&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;floating

neutron&lt;span class="w"&gt; &lt;/span&gt;router-gateway-set&lt;span class="w"&gt; &lt;/span&gt;provider&lt;span class="w"&gt; &lt;/span&gt;floating
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;with the associated neutron-gateway configuration:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;neutron-gateway:
&lt;span class="w"&gt;    &lt;/span&gt;bridge-mappings:&lt;span class="w"&gt;         &lt;/span&gt;physnet1:br-data
&lt;span class="w"&gt;    &lt;/span&gt;data-port:&lt;span class="w"&gt;               &lt;/span&gt;br-data:eth1
&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;Both the neutron-gateway and neutron-openvswitch charms will need to be
updated to support this change; for now the ‘ext-port’ configuration will
be deprecated for backwards compatibility with existing installations
preserving current behaviour.&lt;/p&gt;
&lt;p&gt;The existing ‘data-port’ configuration option will be used instead to
configure bridge-mappings and connectivity to physical network ports
on the units deployed.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No alternatives.&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;james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Additional contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;lathiat (Trent Lloyd)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “ext-net-redux” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ext-net-redux
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Updates for neutron-gateway charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates for neutron-openvswitch charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates for openstack-charm-testing to configure external networking
in the new style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates to Mojo specifications for new style configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates to official bundles with details on new configuration for
external networking.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;README’s in impacted charms will be updated with details on how to
configure external networking.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security requirements.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be used to validate the code; Mojo specifications will
be updated to use the new style of external networking configuration
along with openstack-charm-testing.&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;No additional dependencies for this specification.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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://bugs.launchpad.net/neutron/+bug/1491668"&gt;https://bugs.launchpad.net/neutron/+bug/1491668&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.openstack.org/mitaka/networking-guide/scenario-classic-ovs.html"&gt;https://docs.openstack.org/mitaka/networking-guide/scenario-classic-ovs.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Tue, 13 Nov 2018 00:00:00 </pubDate></item><item><title>Ceph Broker</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ocata/implemented/ceph-broker.html</link><description>

&lt;p&gt;Connect an existing Ceph to a juju deployed Openstack&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Some customers have asked how to connect a Juju deployed Ceph to an existing
OpenStack cluster that was deployed with home grown or someone else’s
tooling.  This causes a problem in that it is not possible to relate Ceph
to the OpenStack cluster.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new charm will be created that acts a broker between an existing Ceph
deployment, and a Juju deployed OpenStack Cloud; The charm will provide the
same relations as the existing ceph-mon charm.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative is manually connecting the Ceph and OpenStack together.
This is fine for some customers but not acceptable for bootstack.  This kind
of manual configuration isn’t particularly manageable.&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;ChrisMacNaughton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;git-review -t ceph-broker&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;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Decide on which relations the OpenStack charm requires&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expose all relations needed by way of config.yaml options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For every relation that OpenStack expects just return the config.yaml
values.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;Yes a new repo will be needed for this.
&lt;a class="reference external" href="https://github.com/openstack/charm-ceph-broker"&gt;https://github.com/openstack/charm-ceph-broker&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation will be added to the README.md as part of the normal workflow.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deploy OpenStack using juju.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy Ceph using juju.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the Ceph-broker to a lxd container or a vm after filling out the
config.yaml&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relate Ceph-broker to OpenStack and verify that OpenStack can talk to Ceph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mojo bundle tests will be used to show this works functionally.&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 Nov 2018 00:00:00 </pubDate></item><item><title>Service Restart Control In Charms</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/controlled-service-restarts.html</link><description>

&lt;p&gt;Openstack charms continuously respond to hook events from their peers
related applications which frequently result in configuration
changes and subsequent service restarts. This is all fine until these
applications are deployed at large scale and having these services restart
simultaneously can cause (a) service outages and (b) excessive load on
external applications e.g. databases or rabbitmq servers. In order to
mitigate these effects we would like to introduce the ability for charms
to apply controllable patterns to how they restart their services.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;An example scenario where this sort of behaviour becomes a problem is where
we have a large number, say 1000, of nova-compute units all connected to the
same rabbitmq server. If we make a config change e.g. enable debug logging
on that application this will result in a restart all nova-* services on
every compute host in tandem which will in turn generate a large spike of
load on the rabbit server as well as making all compute operations block
until these services are back up. This could also clearly have other
knock-on effects such as impacting other applications that depend on
rabbitmq.&lt;/p&gt;
&lt;p&gt;There are a number of ways that we could approach solving this problem but
for this proposal we choose simplicity by attempting to use all information
already available to an application unit combined with some user config to
allow units to decide how best to perform these actions.&lt;/p&gt;
&lt;p&gt;Every unit of an application already has access to some information that
describes itself with respect to its environment e.g. every unit has a unique
id and some applications have a peer relation that gives them information
about their neighbours. Using this information coupled with some extra
config options on the charm to vary timing we could provide the operator
the ability to control service restarts across units using nothing more
than basic mathematics and no juju api calls.&lt;/p&gt;
&lt;p&gt;For example, let’s say an application unit knows it has id 215 and the user
has provided two options via config; a modulo value of 2 and an offset of
10. We could then do the following:&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;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;215&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;which, when applied to all units, would result in 50% of the cluster
restarting its services 10 seconds after the rest. This should hopefully
alleviate some of the pressure resulting from cluster-wide synchronous
restarts, ensuring that part of the cluster is always responsive and
making restarts happen quicker.&lt;/p&gt;
&lt;p&gt;As mentioned above we will require two new config options to any charm for
which this logic is supported:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;service-restart-offset (default to 10)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;service-restart-modulo (default to 1 so that default behaviour is same as&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;before)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The restart logic will skip for any charms not implementing these options.&lt;/p&gt;
&lt;p&gt;Over time some units may be deleted from and added back to the cluster
resulting in non-contiguous unit ids. While for applications deployed at
large scale this is unlikely to be significantly impactful, since subsequent
adds and deletes will cancel each other out, it could nevertheless be a
problem so we will check for the existance of a peer relation on the
application we are running and, if one exists, use the info in that relation
to normalise unit ids prior to calculating delays.&lt;/p&gt;
&lt;p&gt;Lastly, we must consider how to behave when the charm is being used to upgrade
Openstack services whether directly using config (“big bang”) or using actions
defined on a charm. For the case where all services are upgraded at once we
will leave it to the operator to set/unset the offset parameters. For the case
where actions are being used, and likely only a subset of units are being
upgraded at once, we will ignore the control settings i.e. delays will not
be used.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To implement this change we will extend the restart_on_change() decorator
implemented across the openstack charms so that when services are stop/started
or restarted they will include a time.sleep(delay) where delay is
calculated from unit id combined with two new config options;
service-restart-offset and service-restart-modulo. This calculation will be
done in a new function that will be implemented in contrib.openstack the
output of which will be passed into the restart_on_changed() decorator.&lt;/p&gt;
&lt;p&gt;Since a decorator is used we do not need to worry about multiple restarts of
the same service. We do, however, need to consider how apply offsets when
stop/start and restarts are performed manually as is the case in the action
managed upgrades handler.&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;hopem&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “controlled-service-restarts” for all patches related to
this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;controlled-service-restarts
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 charmhelpers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sync into openstack charms and add new config opts&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;These new settings will be properly documented in the charm config.yaml as
well as in the charm deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Unit tests will be provided in charm-helpers and functional tests will be
updated to include config that enables this feature. Scale testing to prove
effectiveness and determine optimal defaults will also be required.&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, 13 Sep 2018 00:00:00 </pubDate></item><item><title>Keystone Federation</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/keystone-federation.html</link><description>

&lt;p&gt;Keystone can be configured to integrate with a number of different identity
providers in a number of different configurations. This spec attempts to
discuss how to implement pluggable backends that utilise Keystone
federations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;When deploying the OpenStack charms to an enterprise customer they are likely
to want to integrate OpenStack authentication with an existing identity
provider like AD, LDAP, Kerberos etc. There are two main ways that Keystone
appears to achieve this integration: backends and federation. Although this
spec is concerned with federation it is useful to go over backends to in an
attempt to distinguish the two.&lt;/p&gt;
&lt;p&gt;The following are not covered here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Integration with Kerberos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Horizon SSO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Federated LDAP via SSSD and mod_lookup_identity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keystone acting as an IdP in a federated environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="backends"&gt;
&lt;h3&gt;Backends&lt;/h3&gt;
&lt;p&gt;When keystone uses a backend it is Keystone itself which knows how to manage
that backend, how to talk to it and how to deal with operations on it. This
limits the number of backends that keystone can support as each new backend
needs new logic in Keystone itself. This approach also has negative security
implications. Keystone may need an account with the backend (an LDAP username
and password) to perform lookups, these account details will be in clear text
in the keystone.conf. In addition, all users passwords with flow through
keystone.&lt;/p&gt;
&lt;p&gt;The keystone project highlights SQL and LDAP (inc AD) as their supported
backends. The status of support for these is as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;SQL: Currently supported by the keystone charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LDAP: Currently supported by the keystone and keystone-ldap subordinate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These backends are supported with the Keystone v2 API if they are used
exclusively. To support multiple backends then Keystone v3 API needs to be used
and each backend is associated with a particular Keystone domain. This allows
for service users to be in SQL but users to be in ldap for example.&lt;/p&gt;
&lt;p&gt;Adding a new backend is achieved by writing a keystone subordinate charm and
relating it to keystone via the keystone-domain-backend interface.&lt;/p&gt;
&lt;p&gt;Enabling a backend tends to be achieved via the keystone.conf&lt;/p&gt;
&lt;/section&gt;
&lt;section id="federation"&gt;
&lt;h3&gt;Federation&lt;/h3&gt;
&lt;p&gt;With federation Keystone trusts a remote Identity provider. Keystone
communicates with that provider using a protocol like SAML or OpenID connect.
Keystone relies on a local Apache to manage communication and Apache passes
back to keystone environment variables like REMOTE_USER. Keystone is abstracted
from the implementation details of talking to the identity provider and never
sees the users password. When using Federation, LDAP may still be the ultimate
backend but it is fronted by something providing SAML/OpenID connectivity like
AD federation service or Shibboleth.&lt;/p&gt;
&lt;p&gt;Each Identity provider must be associated with a different domain within
keystone. The keystone v3 API is needed to support federation.&lt;/p&gt;
&lt;p&gt;Compatible Identity Providers:
(&lt;a class="reference external" href="https://docs.openstack.org/ocata/config-reference/identity/federated-identity.html#supporting-keystone-as-a-sp"&gt;https://docs.openstack.org/ocata/config-reference/identity/federated-identity.html#supporting-keystone-as-a-sp&lt;/a&gt;
):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OpenID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SAML&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;Both Keystone backends and federated backends may need to add config to the
keystone.conf and/or the Apache WSGI vhost. As such, it makes sense for both
types to share the existing interface particularly as the existing interface
is called keystone-domain-backend which does not differentiate between the
two.&lt;/p&gt;
&lt;p&gt;This spec covers changes add support for federation using either SAML or
OpenID, to the keystone charm. This will involve extending the
keystone-domain-backend interface to support passing configuration snippets to
the Apache vhosts and creating subordinate charms which implement OpenID and
SAML.&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;Add support for federation via OpenID and SAML directly to the keystone
charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new interface for federation via OpenID and SAML&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;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “keystone_federation” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;keystone_federation&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Create deployment scripts to create test env for OpenID or SAML integration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extend keystone-domain-backend&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The keystone-domain-backend interface will need to provide the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Modules for Apache to enable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration for principle to insert into Apache keystone wsgi vhosts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subordinate triggered restart of Apache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auth method(s) to be added to keystone’s [auth] methods list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration for principle to insert into keystone.conf&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configure Keystone to consume new interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keystone charm will need to be updated to respond to events outlined in the
interface description above&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New keystone-openid and keystone-saml subordinates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The new subordinates will need to expose all the configuration options needed
for connecting to the identity provider. It will then need to use the
interface to pass any required config for Apache or Keystone up to the
keystone principle.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;New projects for the interface and new subordinates will be needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will require documentation in the READMEs of both the subordinates and
the keystone charm. A blog walking through the deployment and integration
would be very useful.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;Although a Keystone back-end will determine who has access to the entire
OpenStack deployment, this specific charm will only change Keystone and Apache
parameters, avoiding default values and leave the configuration to the user
should be enough.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The code must be covered by unit tests. Ideally amulet tests would be extended
to cover this new functionality but deploying a functional openid server for
keystone to use may not be practical. It must be covered by a Mojo spec though.&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, 13 Sep 2018 00:00:00 </pubDate></item><item><title>Extended Swift Cluster Operations</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/swift-extended-cluster-operations.html</link><description>

&lt;p&gt;The Swift charms currently support a subset of operations required to support
a Swift cluster over time. This spec proposes expanding on what we already have
in order to support more crucial operations such as reconfiguring the
rings post-deployment.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;To deploy a Swift object store using the OpenStack charms you are required to
deploy both the swift-proxy and swift-storage charms. The swift-proxy charm
performs two key roles - running the api endpoint service and managing the
rings - while the swift-storage charm is responsible for the running the swift
object store services (account, container, object).&lt;/p&gt;
&lt;p&gt;As they stand, these charms currently support a base set of what is required to
effectively maintain a Swift cluster over time:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;deploy swift cluster with configurable min-part-hours, replica count,
partition-power and block storage devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;once deployed the only changes that can be made are the addition of
block devices and modification of min-part-hours. Changes to
partition-power or replicas are ignored by the charm once the rings
have already been initialised.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This forces operators to manually apply changes like adjusting the
partition-power to accomodate for additional storage added to the cluster. This
poses great risk since manually editing the rings/builders and syncing them
across the cluster could easily conflict with the swift-proxy charm’s native
support for doing this resulting in a broken cluster.&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 here is to extend the charm support for ring management in order
to be able to support making changes to partition-power, replicas and possibly
others and have the charm safely and automatically apply these changes and
distribute aross the cluster.&lt;/p&gt;
&lt;p&gt;Currently we check whether the rings are already initialised and if they are
we ignore the partition power and replica count configured in the charm i.e.
changes are not applied. To make it possible to do this we will need to remove
these blocks and implement the steps documented in [0] and [1]. I also propose
that charm impose a cluster size limit (number of devices) above which we
refuse to make changes until the operator has paused the swift-proxy units i.e.
placed them into “maintenance mode” which will shutdown the api services and
block any restarts until the units are resumed. The user will also have the
option to set disable-ring-balance=true if they want check that their changes
have been applied successully (to the builder files) prior to having the rings
rebuilt and sycned across the cluster.&lt;/p&gt;
&lt;p&gt;For the swift-storage charms, where currently one can only add devices but not
remove, the proposal is to support removing devices. This will entail
messaging the swift-proxy on the storage relation which an updated list of
devices and a new setting ‘purge-missing-devices’ to instruct the swift-proxy
to remove devices from the ring that are no longer configured. We will also
need to ensure that the device cache located on the swift-storage unit from
which we are removing a device is also updated to no longer include the
device since not doing so would block the device from being re-added in the
future. As an extension to this we should also extend the
swift-storage-relation-broken to support removing devices associated with that
unit/host from the rings and sycning these changes across the cluster.&lt;/p&gt;
&lt;p&gt;[0] &lt;a class="reference external" href="https://docs.openstack.org/swift/latest/ring_partpower.html"&gt;https://docs.openstack.org/swift/latest/ring_partpower.html&lt;/a&gt;
[1] &lt;a class="reference external" href="https://docs.openstack.org/swift/latest/admin/objectstorage-ringbuilder.html#replica-counts"&gt;https://docs.openstack.org/swift/latest/admin/objectstorage-ringbuilder.html#replica-counts&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Juju charm actions are another way to implement operational actions to be
performed on the cluster but do not necessarily fit all cases. Since ring
management is at the core of the existing charm (hook) code itself, the
proposal is to extend this code rather than move and rewrite it as an action.
However, there will likely be a need for some actions to be defined as
post-modification checks and cleanups which would be well suited to an
action and not directly depend on the charm ring manager.&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;hopem&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic swift-charm-extended-operations for all patches related to
this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;swift-charm-extended-operations
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 modifying partition-power&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for modifying replicas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for removing devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support for removing an entire swift-storage host&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;All of the above additions will need to be properly documented in the charm
deployment guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Each additional level of support will need very thorough testing against a
real Swift object deployed with the charms that contains data and is of a
reasonable scale. All code changes will be accompanied by unit tests and
where possible functional tests.&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, 13 Sep 2018 00:00:00 </pubDate></item><item><title>Keystone - Change default preferred API version</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/implemented/keystone-preferred-api-v3-as-default.html</link><description>

&lt;p&gt;The current default preferred API version used by the Keystone Charm is v2.0.&lt;/p&gt;
&lt;p&gt;There exists multiple use cases where the use of the v3 API is required.
To use features such as domains, domain specific drivers, LDAP authentication,
Federation (OpenID Connect, SAML) and others not mentioned, the Keystone V3
API endpoints must be exposed in the catalog and all services in a deployment
must leverage the V3 API when authenticating with Keystone.  Increasingly so
these use cases would be the desired mode of operation for new OpenStack
deployments.&lt;/p&gt;
&lt;p&gt;Additionally the v2.0 API has been marked as DEPRECATED since the OpenStack
Mitaka release and will be REMOVED in the Queens release cycle.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Keystone charm currently has two separate code paths for managing the
Keystone service.  Which path is exercised depends on the value of the
‘preferred-api-version’ setting.  This leads to duplication of both code, and
potential bugs.&lt;/p&gt;
&lt;p&gt;The majority of our functional tests are currently run with services configured
to talk to Keystone using the v2.0 API.&lt;/p&gt;
&lt;p&gt;Change of endpoints in the Keystone catalog and reconfiguration of services to
use the v3 API automatically in already running deployments may lead to
unforeseen and undesirable side effects.  We must find a way to have the change
of default affect new deployments only, and leave existing deployments
untouched on charm upgrade.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Remove API v2.0 specific code from ‘hooks/manager.py’ and make use of a
combination of the ‘keystone-manage’ CLI tool and the v3 API to manage Keystone
service regardless of the value of ‘preferred-api-version’ configuration
option.&lt;/p&gt;
&lt;p&gt;Re-wire existing unit- and functional- tests to be performed on deployments
configured to use both v2.0 and v3 API.  This induces change in both the
keystone charm itself as well as any other charm with specific tests for how
it relates to the keystone charm.&lt;/p&gt;
&lt;p&gt;Remove default value for ‘preferred-api-version’ in config.yaml and let charm
decide which default to use programatically.  The upgrade function should be
made to retain ‘preferred-api-version’ as 2 for existing deployments that makes
use of the current default.&lt;/p&gt;
&lt;p&gt;Version fence will be implemented in charm to have the new default apply for
OpenStack versions ‘Queens’ and onwward.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There are no real alternatives.  Not changing the default would make our test
coverage poorer for the real world use cases that our software is currently
exposed to.&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;fnordahl&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “keystone-v3” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;keystone-v3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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 ‘hooks/manager.py’ to use a combination of keystone-manage CLI and
v3 API to manage the Keystone deployment.  Remove any v2.0 API specifc code.
This work item should include removal of dependency on having admin-token in
Keystone configuration file and to switch charm over to use keystoneauth1
with sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update relevant functions in charmhelpers.contrib.openstack.amulet.utils&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make all existing unit- and functional- tests run on both v2.0 API and v3 API
configured deployments in the gate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement version fence that applies the new default for OpenStack release
‘Queens’ and onward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove default value for ‘preferred-api-version’, make decision in charm
programatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure simplestreams with Keystone v3 API support is backported to our
stable releases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This change calls for an update of the documentation in README.md with
information about how the charm sets up domains and projects in a v3 API
enabled Keystone deployment. The documentation should also include examples of
openrc files and simple openstack client usage.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;We are exercising existing code paths and are changing the default value of
how the Keystone deployment is configured to match real world usage, we are not
introducing new changes that have security implications.  Revisiting and
re-validating the security of the existing implementation is in place as a part
of this work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Implementation will update existing unit- and functional- tests to leverage
both v2.0 and v3 API configurations.  Scripts, bundles and specs used in
periodic and pre-release testing should also be updated to handle and
excercise the new default.&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 external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 13 Sep 2018 00:00:00 </pubDate></item><item><title>Cells V2</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/approved/cells.html</link><description>

&lt;p&gt;Nova cells v2 has been introduced over the Ocata and Pike cycles. In fact, all
Pike deployments are now deployments using nova cells v2 usually using a single
compute cell.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Nova cells v2 allows for a group of compute nodes to have their own dedicated
database, message queue and conductor while still being administered through
a central API service. This has the following benefits:&lt;/p&gt;
&lt;section id="reduced-pressure-on-rabbit-and-mysql-in-large-deployments"&gt;
&lt;h3&gt;Reduced pressure on Rabbit and MySQL in large deployments&lt;/h3&gt;
&lt;p&gt;In even moderately sized clouds the database and message broker can quickly
become a bottle neck. Cells can be used to alleviate that pressure by having a
database and message queue per cell of compute nodes. It is worth noting that
the charms already support having traffic for neutron etc in a separate rabbit
instance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="create-multiple-failure-domains"&gt;
&lt;h3&gt;Create multiple failure domains&lt;/h3&gt;
&lt;p&gt;Grouping compute cells with their local services allows the creation of
discrete failure domains (from a nova POV at least).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="remote-compute-cells-edge-computing"&gt;
&lt;h3&gt;Remote Compute cells (Edge computing)&lt;/h3&gt;
&lt;p&gt;In some deployments a group of compute nodes maybe far removed (from a
networking pov) from the central services. In this case it maybe useful to have
the compute nodes act as a largely independent group.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="different-slas-per-cell"&gt;
&lt;h3&gt;Different SLAs per cell&lt;/h3&gt;
&lt;p&gt;Different groups of compute nodes can have different levels of performance,
HA. etc. A cell could have no local HA for the database, message queue and
conductor for a development cell but the production cell could have
significantly higher specification servers running clustered services.&lt;/p&gt;
&lt;p&gt;(These use cases were paraphrased from &lt;a class="reference external" href="https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment"&gt;*4&lt;/a&gt;.)&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 facilitate a cells v2 deployment a few relatively simple interfaces and
relations need to be added. From a nova perspective the topology looks like &lt;a class="reference external" href="https://docs.openstack.org/nova/latest/_images/graphviz-d1099235724e647ca447c7bd6bf703c607ddf68f.png"&gt;this&lt;/a&gt;.
This spec proposes mapping that to this &lt;a class="reference external" href="https://docs.google.com/drawings/d/1v5f8ow0aCGrKRIpg3uXsv2zolWsz3mGVGzLnbgUQpKQ/"&gt;charm topology&lt;/a&gt;.&lt;/p&gt;
&lt;section id="superconductor-access-to-child-cells"&gt;
&lt;h3&gt;Superconductor access to Child cells&lt;/h3&gt;
&lt;p&gt;The superconductor needs to be able to query the databases of the compute cells
and to send and receive messages on the compute_cells message bus. The
cleanest way to model this would be to have a direct Juju relation between the
superconductor and the compute cells database and message bus. To facilitate
this the following relations will be added to the nova-cloud-controller charm:&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;shared-db-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;mysql-shared&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;amqp-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;rabbitmq&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="superconductor-configuring-child-cells"&gt;
&lt;h3&gt;Superconductor configuring child cells&lt;/h3&gt;
&lt;p&gt;With the above change the superconductor has access to the child db and mq but
does not know which compute cell name to associate with them. To solve this the
nova-cloud-controller charm will have the following new relations:&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;provides&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-cell-api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;cell&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;nova-cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;cell&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The new cell relation will be used to pass the cell name, db service name and
message queue service name.&lt;/p&gt;
&lt;div class="highlight-python 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;'amqp-service'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'rabbitmq-server-cell1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'db-service'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'mysql-cell1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'cell-name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cell1'&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;Given this information the superconductor can examine the service names that
are attached to its shared-db-cell and amqp-cell relations and construct
urls for them. The superconductor is then able to create the cell mapping in
the api database by running:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;nova-manage&lt;span class="w"&gt; &lt;/span&gt;cell_v2&lt;span class="w"&gt; &lt;/span&gt;create_cell&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;cell_name&amp;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;--transport-url&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;transport_url&amp;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;--database_connection&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;database_connection&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The superconductor needs five relations to be in place and their corresponding
contexts to be complete before the cell can be mapped. Given the
nova-cloud-controller is a non-reactive charm special care will be needed to
ensure that the cell mapping happens irrespective of the order in which those
relations are completed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="compute-conductor-no-longer-registering-with-keystone"&gt;
&lt;h3&gt;Compute conductor no longer registering with keystone&lt;/h3&gt;
&lt;p&gt;The compute conductor does not need to register an endpoint with keystone nor
does it need service credentials. As such the identity-service relation should
not be used for compute cells. A guard should be put in place in the
nova-cloud-controller charm to prevent a compute cells nova-cloud-controller
from registering an incorrect endpoint in keystone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="compute-conductor-cell-name-config-option"&gt;
&lt;h3&gt;Compute conductor cell name config option&lt;/h3&gt;
&lt;p&gt;The compute conductor needs to know its own cell name so that it can pass this
information up to the superconductor. To allow this a new configuration option
will be added to the nova-compute charm:&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;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;cell-name&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="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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Name of the compute cell this controller is associated with. If this is&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;left unset or set to api then it is assumed that this controller will&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;be the top level api and cell0 controller.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Leaving the cell name unset assumes the current behaviour of associating the
nova-cloud-controller with the api service, cell0 and cell1.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="nova-compute-service-credentials"&gt;
&lt;h3&gt;nova-compute service credentials&lt;/h3&gt;
&lt;p&gt;The nova-compute charm needs service credentials for RPC calls to the Nova
Placement API and the Neutron API service. It currently gets these credentials
via its cloud-compute relation which is ugly at best. However, given that the
compute cells nova-cloud-controller will no longer have a relation with
keystone it will not have any credentials to pass on to nova-compute. This is
overcome by adding a cloud-credentials relation to the nova-compute charm.&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;cloud-credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interface&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;keystone-credentials&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;nova-compute will request a username based on its service name so that users
for different cells can be distinguished from one another.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bespoke-vhosts-and-db-names"&gt;
&lt;h3&gt;Bespoke vhosts and db names&lt;/h3&gt;
&lt;p&gt;The ability to specify a nova db name and a rabbitmq vhost name should either
be removed from the nova-cloud-controller charm or the new cell interface needs
to support passing those up to the superconductor so that the superconductor
can request access to the correct resources from the compute nodes database and
message queue.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="disabling-unused-services"&gt;
&lt;h3&gt;Disabling unused services&lt;/h3&gt;
&lt;p&gt;The compute cells nova-cloud-controller only needs to run the conductor service
and possible the console services. Unused services should be disabled by the
charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-cell-conductor-charm"&gt;
&lt;h3&gt;New cell conductor charm?&lt;/h3&gt;
&lt;p&gt;The nova cloud controller in a compute node only runs a small subset of the
nova services and does not require a lot of the complexity that is baked
into the current nova-cloud-controller charm. This begs the question of whether
a new cut-down reactive charm that just runs the conductor would make sense.
Most of the changes outlined above actually impact the superconductor rather
than the compute conductor. However, looking at this the other way around the
changes needed to allow the nova-cloud-controller charm to act as a child
conductor are actually quite small and so probably do not warrant the creation
of a new charm. It is probably worth noting some historical context here too,
every time the decision has been made to create a charm which can operate in
multiple modes that decision has been reversed at some cost at a later data (
ceph being a prime example).&lt;/p&gt;
&lt;p&gt;Taking all that into consideration a new charm will not be written and the
existing nova-cloud-controller charm will be extended to add support for
running as a compute conductor.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="message-queues"&gt;
&lt;h3&gt;Message Queues&lt;/h3&gt;
&lt;p&gt;There is flexibility around which message queue the non-nova services use. A
dedicated rabbit instance could be created for them or they could reuse the
rabbit instance the nova api service is using.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="telemetry-etc"&gt;
&lt;h3&gt;Telemetry etc&lt;/h3&gt;
&lt;p&gt;This spec does not touch on integration with telemetry. However, this does
require further investigation to ensure that message data can be collected.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="juju-service-names"&gt;
&lt;h3&gt;Juju service names&lt;/h3&gt;
&lt;p&gt;It will be useful, but not required, to embed the cell name in the service name
of each component that is cell specific. Eg deploying services for cellN
may look 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="l l-Scalar l-Scalar-Plain"&gt;juju deploy nova-compute nova-compute-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy nova-cloud-controller nova-cloud-controller-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy mysql mysql-cellN&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;juju deploy rabbitmq-server rabbitmq-server-cellN&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;Do nothing and do not support additional nova v2 cells.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resurrect support for the deprecated and bug ridden cells v1&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;Unknown&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “&amp;lt;topic_name&amp;gt;” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cellsv2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="existing-work"&gt;
&lt;h3&gt;Existing Work&lt;/h3&gt;
&lt;p&gt;As part of writing the spec prototype charms and a bundle were created
for reference: &lt;a class="reference external" href="https://gist.github.com/gnuoy/9ede4e9d426ea56951c664569e7ad957"&gt;Bundle&lt;/a&gt;
and &lt;a class="reference external" href="https://gist.github.com/gnuoy/aff86d0ad616a890ba731a3cb7deef51"&gt;charm diffs&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;Remove support for cells v1 from nova-compute and nova-cloud-controller
charms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add identity-context relation to nova-compute and ensure the supplied
credentials are used when rendering placement and keystone sections in
nova.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add shared-db-cell relation to nova-cloud-controller assuming ‘nova’
database name when requesting access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add amqp-cell relations to nova-cloud-controller assuming ‘openstack’ vhost
name when requesting access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add code for registering a  cell to nova-cloud-controller. This will use the
AMQ and SharedDB contexts from the shared-db-cell and amqp-cell relation
to create the cell mapping.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update nova.conf templates in nova-cloud-controller to only render api db
url if the nova-cloud-controller is a superconductor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update db initialisation code to only run the relevant cell migration if not
a superconductor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add nova-cell and nova-cell-api relations and ensure that the shared-db, amqp
shared-db-cell, amqp-cell and nova-api-cell relations all attempt to register
compute cells.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write bundles to use cells topology&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check integration with other services (designate and telemetry in particular)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;READMEs of nova-cloud-controller and nova-compute will need updating to
explain new relations and config options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blog with deployment walkthrough and explanation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update Openstack Charm documentation to explain how to do a multi-cell
deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add bundle to charm store.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No new security risks that I am aware of&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A multi-cell topology is probably beyond the scope of amulet tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bundles added to openstack-charm-testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mojo specs&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 that I can think of&lt;/p&gt;
&lt;section id="credits"&gt;
&lt;h3&gt;Credits&lt;/h3&gt;
&lt;p&gt;Much of the benefit of cells etc was lifted from *4&lt;/p&gt;
&lt;p&gt;*1 &lt;a class="reference external" href="https://docs.openstack.org/nova/pike/cli/nova-manage.html"&gt;https://docs.openstack.org/nova/pike/cli/nova-manage.html&lt;/a&gt;
*2 &lt;a class="reference external" href="https://docs.openstack.org/nova/latest/user/cellsv2-layout.html"&gt;https://docs.openstack.org/nova/latest/user/cellsv2-layout.html&lt;/a&gt;
*3 &lt;a class="reference external" href="https://bugs.launchpad.net/nova/+bug/1742421"&gt;https://bugs.launchpad.net/nova/+bug/1742421&lt;/a&gt;
*4 &lt;a class="reference external" href="https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment"&gt;https://www.openstack.org/videos/sydney-2017/adding-cellsv2-to-your-existing-nova-deployment&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Wed, 18 Jul 2018 00:00:00 </pubDate></item><item><title>Encrypted Data at Rest</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/implemented/encryption-at-rest.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;OpenStack Clouds provide a number of different types of storage to Cloud users,
including instance ephemeral disks (typically attached to hypervisors), Cinder
block devices (typically backed by some sort of storage solution such as Ceph)
and Swift object storage.&lt;/p&gt;
&lt;p&gt;By default the data residing on such virtual devices is unencrypted; regulation
such as PCI-DSS and GPDR+ require that data at rest is stored encrypted,
so that if devices are removed from the data center, the data on them cannot
be recovered without access to the appropriate encryption keys.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Underlying storage devices will be protected using dm-crypt/LUKS with
encryption keys stored directly in Hashicorp Vault. No local copy of the key is
made during the encryption process or the decryption process on boot.&lt;/p&gt;
&lt;p&gt;A new tool ‘vaultlocker’ will be used to LUKS format block devices, directly
storing encryption keys in Vault.  Keys are referenced using the UUID of the
underlying block device (which is generated as the disk is prepared for use).&lt;/p&gt;
&lt;p&gt;On (re)boot, a vaultlocker-decrypt systemd unit will execute for each encrypted
block device, retrieving the encryption key from Vault and opening the LUKS
formatted block device ready for use.&lt;/p&gt;
&lt;p&gt;vaultlocker will access vault over https using an approle issued as part of the
deployment process; the approle will be passed from vault to the consuming
service via a charm relation and will be scoped for access from units
participating in the relation to vault.&lt;/p&gt;
&lt;p&gt;The approle will be specific to each unit participating in the relation, with
a policy that only permits read/write/delete/update/list to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&amp;lt;kv-backend&amp;gt;/&amp;lt;hostname&amp;gt;/*&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;from the provided network address of the unit.  Approles for other units will
be visible in the relation data, but will not be usable as the CIDR ACL will
not permit access.&lt;/p&gt;
&lt;p&gt;In addition to the unit specific approle, and limitation of access to the /32
of the unit, a secret_id will also be used to authenticate use of the approle.&lt;/p&gt;
&lt;p&gt;The secret_id will not be passed over the relation from the vault charm to the
consuming application. Instead the vault charm will generate a secret_id and
wrap it using Vault’s response wrapping feature.  The resulting one-shot token
will be passed over the relation to the consuming application unit, which can
then use the token to pull the secret_id directly from Vault.  This ensures
that the secret_id is only known to Vault and the consuming application unit.&lt;/p&gt;
&lt;p&gt;The one-shot token has a ttl of 1h (allowing for complex deployment with large
numbers of hook executions to complete on converged hypervisor/storage
machines).&lt;/p&gt;
&lt;p&gt;The initial scope of support will include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph-osd: OSD device encryption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;swift-storage: Block device encryption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute: Ephemeral storage block device encryption; note that this
requires that hypervisors are configured with a specific set of storage
devices for use by Nova for ephemeral block devices for instances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="block-device-preparation"&gt;
&lt;h3&gt;block device preparation&lt;/h3&gt;
&lt;p&gt;The encrypted block device  will be labelled with a UUID generated by the
charmhelper.  This UUID will be used during encryption and during decryption
during server reboots.&lt;/p&gt;
&lt;p&gt;The device  will be encrypted with key storage in Vault using:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;vaultlocker&lt;span class="w"&gt; &lt;/span&gt;encrypt&lt;span class="w"&gt; &lt;/span&gt;--uuid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$UUID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BLOCK_DEVICE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The resulting dm-crypt block device will be opened ready for use.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="swift-storage-and-nova-compute"&gt;
&lt;h3&gt;swift-storage and nova-compute&lt;/h3&gt;
&lt;p&gt;Block devices will be prepared inline with “block device preparation”; existing
fstab management by the charm will be updated to use &lt;cite&gt;/dev/mapper/crypt-&amp;lt;UUID&amp;gt;&lt;/cite&gt;
entries with a x-systemd.requires option - for example:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;/dev/mapper/crypt-&lt;span class="nv"&gt;$UUID&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;/mnt&lt;span class="w"&gt; &lt;/span&gt;auto&lt;span class="w"&gt; &lt;/span&gt;defaults,x-systemd.requires&lt;span class="o"&gt;=&lt;/span&gt;vaultlocker-decrypt@&lt;span class="nv"&gt;$UUID&lt;/span&gt;.service,comment&lt;span class="o"&gt;=&lt;/span&gt;vaultlocker&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This ensures that the vaultlocker-decrypt task has completed prior to the mount
of the mapper device being attempted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="ceph-osd-ceph-volume"&gt;
&lt;h3&gt;ceph-osd/ceph-volume&lt;/h3&gt;
&lt;p&gt;Integration into the ceph-osd charm requires the charm to switch to using the
new ceph-volume tool to manage the creation and activation of OSD’s.  This
requires that the block device be prepared with LVM volumes before passing to
ceph-volume; to mirror existing ceph-disk functionality:&lt;/p&gt;
&lt;section id="filestore"&gt;
&lt;h4&gt;filestore&lt;/h4&gt;
&lt;p&gt;Use block device for journal and data; journal lv (osd-journal-&amp;lt;OSD-FSID&amp;gt;)
created on vg ceph-&amp;lt;OSD-FSID&amp;gt; using configured journal size, data lv
(osd-data-&amp;lt;OSD-FSID) created on vg ceph-&amp;lt;OSD-FSID&amp;gt; using remaining capacity.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdb
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID/osd-journal-&amp;lt;OSD-FSID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID/osd-data-&amp;lt;OSD-FSID&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Use separate device for journal; journal lv (osd-journal-&amp;lt;OSD-FSID&amp;gt;) created
on vg ceph-journal-&amp;lt;UUID&amp;gt; of a journal device using configured journal size;
data lv (osd-data-&amp;lt;OSD-FSID) created on ceph-&amp;lt;OSD-FSID&amp;gt; of data device
using 100% of capacity.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdb
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID/osd-data-&amp;lt;OSD-FSID&amp;gt;
pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdg
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-journal-&amp;lt;UUID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-journal-&amp;lt;UUID&amp;gt;/osd-journal-&amp;lt;OSD-FSID&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="bluestore"&gt;
&lt;h4&gt;bluestore&lt;/h4&gt;
&lt;p&gt;Bluestore is simpler in that there is no journal so a single logical volume
will be created on ceph-&amp;lt;OSD-FSID&amp;gt; of the provided disk:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdb
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID/osd-block-&amp;lt;OSD-FSID&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Bluestore DB and WAL volumes may be optionally stored on separate
devices again using a logical volume of the configured/default size on vg
ceph-{db,wal}-&amp;lt;UUID&amp;gt;.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdb
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-&amp;lt;OSD-FSID/osd-block-&amp;lt;OSD-FSID&amp;gt;
pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdg
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-db-&amp;lt;UUID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-db-&amp;lt;UUID&amp;gt;/osd-db-&amp;lt;OSD-FSID&amp;gt;
pv&lt;span class="w"&gt; &lt;/span&gt;/dev/sdh
&lt;span class="w"&gt;  &lt;/span&gt;vg&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-wal-&amp;lt;UUID&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;lv&lt;span class="w"&gt; &lt;/span&gt;/dev/ceph-wal-&amp;lt;UUID&amp;gt;/osd-wal-&amp;lt;OSD-FSID&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that ceph-volume is only provided with Ceph Luminous or later releases;
as a result encryption under Ceph Jewel is explicitly excluded from the scope
of this specification.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;section id="ceph"&gt;
&lt;h4&gt;ceph&lt;/h4&gt;
&lt;p&gt;Use of native suppport in Ceph for OSD encryption; discounted as it makes use
of the ceph-mon cluster for key storage - keys are not sharded and deployments
typically place ceph-mon units alongside ceph-osd units so its possible that
the encryption keys might directly reside on the same server as encrypted
Ceph OSD block devices.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The ceph-osd charm already supports native Ceph block device
encryption using ceph-disk/ceph-volume via the osd-encrypt option.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Support for use of vault could be added to ceph-volume; however due to the
requirement to support existing Ceph releases (&amp;gt;= Luminous) this option
is discounted in the short term but may be considered in the long term if
support lands into Ceph upstream.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cinder"&gt;
&lt;h4&gt;cinder&lt;/h4&gt;
&lt;p&gt;Cinder has native support for block device encryption using LUKS; keys are
stored using Barbican which relies on HSM’s implementing PKCS#11 of KMIP to
be considered secure.  This would provide the required level of encryption
support for Cinder block devices however does require use of a hardware
based security module (Barbican does not have Vault support).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="nova"&gt;
&lt;h4&gt;nova&lt;/h4&gt;
&lt;p&gt;Nova has native support for encryption of ephemeral disks if using an LVM
backend for storage; again keys are stored in barbican, requiring use of a
HSM or implementation of support for a suitable Software Security Module in
Barbican.  Use of this option is also limited to LVM storage only.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="swift"&gt;
&lt;h4&gt;swift&lt;/h4&gt;
&lt;p&gt;Swift has no native encryption support so no alternatives considered for this
part of the problem domain.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;james-page&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “vaultlocker” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;vaultlocker
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="vaultlocker"&gt;
&lt;h4&gt;vaultlocker&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;base codebase (support for encrypt/decrypt)&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;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="qa"&gt;
&lt;h4&gt;QA&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;mojo specification to validate encryption-at-rest support&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="docs"&gt;
&lt;h4&gt;Docs&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;example bundle + documentation for encryption-at-rest&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;appendix for deployment guide on usage and security considerations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="charmhelpers"&gt;
&lt;h4&gt;charmhelpers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;block device encryption helper&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="ceph-osd"&gt;
&lt;h4&gt;ceph-osd&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add support for use of ceph-volume &amp;gt;= Luminous&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable support for block device encryption using vaultlocker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add relation to vault&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="swift-storage"&gt;
&lt;h4&gt;swift-storage&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;enable support for block device encryption using vaultlocker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add relation to vault&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="nova-compute"&gt;
&lt;h4&gt;nova-compute&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;enable support for block device encryption using vaultlocker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add relation to vault&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;A new repository will be required for vaultlocker.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Documentation will be provided as part of the ceph-osd, swift-storage
and nova-compute charms.&lt;/p&gt;
&lt;p&gt;An additional appendix will be added to the charm deployment guide to
cover encryption at rest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;As this solution covers the security of encryption keys used to secure
block devices from unauthorized removal there are multiple security
concerns to address.&lt;/p&gt;
&lt;p&gt;Communication with Vault will be done over a TLS encrypted connection
using an AppRole (without a secret_id) for authentication which will be
delivered to the consuming charm over a charm relation; connectivity with
Juju also TLS encrypted so the potential for interception of the AppRole
is limited.&lt;/p&gt;
&lt;p&gt;The secret_id for the unit to use with the AppRole is passed out-of-band
of Juju - a one-shot token is passed over the vault-kv relation, which
can only be used by the consuming unit to retrieve the generated
secret_id for the AppRole.  The token has a 1hr TTL and is CIDR limited
in the same way as the AppRole.&lt;/p&gt;
&lt;p&gt;Encryption keys will be stored under a Vault path specific to the AppRole.
The Vault AppRole will limit access to the secrets backend based on the
CIDR of the accessing servers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Functionality will be validated by unit and functional tests within
each component.&lt;/p&gt;
&lt;p&gt;Overall solution function will be validated using a Mojo spec.&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;Production grade vault charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AppRole interface to vault charm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 18 Jul 2018 00:00:00 </pubDate></item><item><title>Migrate Ceph Deployment Architecture</title><link>https://specs.openstack.org/openstack/charm-specs/specs/queens/implemented/ceph-charm-migration.html</link><description>

&lt;p&gt;The all-in-one Ceph charm has been deprecated in favor of splitting out the
distinct functions of the Ceph monitor cluster and the Ceph OSDs. The Ceph
charm itself is receiving limited maintenance and all new features are being
added to the ceph-osd or ceph-mon charms. Unfortunately, there currently
exists no way of migrating existing deployments using the legacy architecture
to the preferred architecture.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Deploying the all-in-one ceph charm was difficult to deploy properly and
often resulted in too many monitors deployed. This (and other) problems
eventually lead to splitting up the all-in-one ceph deployment into its
different compositional parts - ceph-mon and ceph-osd. New deployments are
encouraged to use the new architecture, but users which have deployed the
previous architecture have no way to migrate to the new architecture.&lt;/p&gt;
&lt;p&gt;In order to migrate to the new architecture, users will need to:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Deploy the ceph-mon charm into the environment without bootstrapping a new
monitor cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relate the ceph application to the new ceph-mon application.  The relation
between these two applications is defined in the new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-bootstrap&lt;/span&gt;&lt;/code&gt;
interface, documented herein.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the deployments using the ceph-client relation to point to the new
ceph-mon application. This should include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph-radosgw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova-compute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-ceph&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cinder-backup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;glance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the ceph-osd charm alongside the current ceph charms. The ceph-osd
charm will not reformat any of the currently running OSD devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the all-in-one ceph application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: the configuration values will not be validated in any part of this
migration scenario. If the user deploys the ceph-osd application or the
ceph-mon application with different config values than that of the all-in-one
ceph charms, then there may be unexpected changes to the environment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Most of the basic plumbing already exists to support the basic parts of this
migration. There are some parts that are actually missing an need attention
to detail.&lt;/p&gt;
&lt;section id="config-changes-to-charm-ceph-mon"&gt;
&lt;h3&gt;Config Changes to charm-ceph-mon&lt;/h3&gt;
&lt;p&gt;A new config option will be added to the ceph-mon charm indicating that the
charm should not do an initial bootstrap of the monitor cluster. When this
value is set to true, the charm will &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;bootstrap a new monitor cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;automatically generate an fsid&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This new configuration option will be defined 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;no-bootstrap&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;boolean&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="l l-Scalar l-Scalar-Plain"&gt;False&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Causes the charm to not do any of the initial bootstrapping of the&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Ceph monitor cluster. This is only intended to be used when migrating&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;from the ceph all-in-one charm to a ceph-mon / ceph-osd deployment.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Refer to the Charm Deployment guide at https://docs.openstack.org/charm-deployment-guide/latest/&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;for more information.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="new-ceph-bootstrap-interface"&gt;
&lt;h3&gt;New ceph-bootstrap Interface&lt;/h3&gt;
&lt;p&gt;Notably, there exists no way of adding a relation between the ceph-mon charm
and the all-in-one ceph charm. To address this, a new interface will be added
to the ceph and ceph-mon charms called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-bootstrap&lt;/span&gt;&lt;/code&gt;, enabling the
necessary information for joining the cluster to be shared. This is essentially
the same information that’s shared on the peer &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mon&lt;/span&gt;&lt;/code&gt; interface for the ceph
charm itself.&lt;/p&gt;
&lt;p&gt;Since the charms are not reactive, no new interface repository is required.
The information exchanged will contain 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;ceph-bootstrap&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;fsid&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;desc&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;The fsid of the already bootstrapped monitor cluster&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;ceph-public-address&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;desc&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;The public address that should be used by the charm for each of the&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;units in the relation.&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;mon-key&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;desc&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;The key used to authorize a monitor node for joining a ceph mon&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cluster.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to join this relation, the ceph-mon charm will require that the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;no-bootstrap&lt;/span&gt;&lt;/code&gt; config option be set to True and the monitor cluster is not
already bootstrapped locally. If either of these is not valid, the ceph-mon
charm will fail to join the relation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="changes-to-charm-ceph"&gt;
&lt;h3&gt;Changes to charm-ceph&lt;/h3&gt;
&lt;p&gt;In addition to implementing the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceph-bootstrap&lt;/span&gt;&lt;/code&gt; interface, the all-in-one
ceph charm needs to properly clean up when removing itself. It should not
remove any OSDs or Ceph packages as this would interrupt the operational ceph
cluster. However, the charm needs to remove its ceph.conf file as a
registered alternative during its stop hook.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One alternative would be to &lt;strong&gt;not&lt;/strong&gt; offer a migration to the new architecture
and leave the deployments stuck. This has rather unfortunate side effect
with respect to user happiness and has implications regarding the overall
lifetime of the ceph charm.&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;james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Additional assignee(s):&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;billy-olsen&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;charm-ceph-migration&lt;/span&gt;&lt;/code&gt; for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charm-ceph-migration
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;section id="charm-ceph-mon"&gt;
&lt;h4&gt;charm-ceph-mon&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new config flag&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement new bootstrap interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove additional monmap entries when removing the bootstrap relation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="charm-ceph-osd"&gt;
&lt;h4&gt;charm-ceph-osd&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure that the charm supports multiple monitor relations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="charm-ceph"&gt;
&lt;h4&gt;charm-ceph&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support for new bootstrap interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove registered alternative for ceph.conf in the stop hook&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update charm README&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="charm-ceph-radosgw"&gt;
&lt;h4&gt;charm-ceph-radosgw&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure that the charm supports multiple monitor relations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="charm-helpers"&gt;
&lt;h4&gt;charm-helpers&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure that CephContext supports multiple monitor relations (consumed by
charm-glance, charm-inder-ceph, charm-nova, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="openstack-charm-testing"&gt;
&lt;h4&gt;openstack-charm-testing&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update all next.yaml and stable.yaml bundles to use split architecture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add legacy bundle which deploys an all-in-one ceph bundle&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="docs"&gt;
&lt;h4&gt;docs&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update charm deployment guide to clearly describe this process&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update release notes with implementation note and reference to the
deployment guide.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will need to be carefully documented in the following places:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Charm Deployment Guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Ceph Charm’s README needs to refer to the migration process
documentation and officially marked as deprecated.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No new security implications or this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create an appropriate functional test that can be run at release gating
(mojo, bundle tester, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test the impact of running clients on the migration. This is important
because the monitor information is exposed via the libvirt domain XML files
which are created and may have an impact on running clients. Specifically,
need to verify the impact to:
- nova-compute w/ rbd backed instances
- nova-compute w/ rbd cinder attached volumes
- glance images w/ rbd backing&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 Jul 2018 00:00:00 </pubDate></item><item><title>Ceph Storage Action</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/ceph-storage-action.html</link><description>

&lt;p&gt;We should allow the user to specify the class of storage that a given
storage device should be added to. This action would allow adding a list
of osd-devices into specified Ceph buckets.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;All osd-devices are currently added to the same default bucket making it
impossible to use multiple types of storage effectively. For example, users
may wish to bind SSD/NVMe devices into a fast/cache bucket, 15k spindles into
a default bucket, and 5k low power spindles into a slow bucket for later
use in pool configuration.&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 action that includes additional metadata into the osd-devices list
allowing for specification of bucket types for the listed devices. These OSDs
would be added to the specified bucket when the OSD is created.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User could specify a pre-build usage profile and we could map device types
onto that profile by detecting the device type and deciding, based on the
configured profile, what bucket the device should go into.&lt;/p&gt;
&lt;p&gt;This solution is being discarded because of the difficulty of designing
and implementing usage profiles to match any use case automigically. It will
also require a lot of work to correctly identify the device type and decide
where to place it in the desired profile.&lt;/p&gt;
&lt;p&gt;In addition, it would require that we only support a single “profile” within
a deployed ceph-osd cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Charm could define additional storage attach points in addition to
osd-devices that would allow the user to specify what bucket they
should add devices to.&lt;/p&gt;
&lt;p&gt;The reason for discarding this solution is that it was determined to be too
limiting because of only supporting a fixed number of bindings, in addition
to making changes harder because of backwards compatibility requirements.&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;Chris MacNaughton &amp;lt;&lt;a class="reference external" href="mailto:chris.macnaughton%40canonical.com"&gt;chris&lt;span&gt;.&lt;/span&gt;macnaughton&lt;span&gt;@&lt;/span&gt;canonical&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Contact:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Chris Holcombe &amp;lt;&lt;a class="reference external" href="mailto:chris.holcombe%40canonical.com"&gt;chris&lt;span&gt;.&lt;/span&gt;holcombe&lt;span&gt;@&lt;/span&gt;canonical&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="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “storage-action” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;storage-action
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Create a bucket with the required name. We do this so that we can create
pool in the specified bucket type. This would be handled within the ceph-mon
charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an action that returns a list of unused storage devices along with
their device types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an action that takes &lt;cite&gt;osd-devices&lt;/cite&gt; and &lt;cite&gt;storage-type&lt;/cite&gt;, that would
be an enum into the buckets that we create. Rather than be a user specified
string, this would be an enumerated list in the ceph charms provided through
the shared charms_ceph library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the ability for other charms to request the bucket that should back
their created pools when creating pools through the broker.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This will require additional documentation be added around how to use the
action correctly and what to expect from it. This documentation will be added
to the charm README&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This should have no security impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;There will need to be new unit tests and functional tests to ensure that
the necessary buckets are created and that the disks are added to them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 21 Mar 2018 00:00:00 </pubDate></item><item><title>Service Discovery</title><link>https://specs.openstack.org/openstack/charm-specs/specs/rocky/backlog/service-discovery.html</link><description>

&lt;p&gt;Many optional services may now be deployed as part of an OpenStack Cloud,
with each service having a different optional features that may or may
not be enabled as part of a deployment.&lt;/p&gt;
&lt;p&gt;Charms need a way to discover this information so that services can be
correctly configured for the options chosen by the charm user.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Charms need to be able to determine what other services are deployed
within an OpenStack Cloud so that features can be enabled/disabled as
appropriate.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;notifications for ceilometer (really don’t want notifications enabled
when ceilometer is not deployed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;misc panels within the openstack dashboard (fwaas, lbaas, l3ha, dvr
etc… for neutron).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notifications for designate (disable when designate is not deployed).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Services and features of services are determined by the API endpoint
charms that register them into the service catalog via the keystone charm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The keystone charm will expose a new provides interface ‘cloud-services’
which is a rich-ish description of the services deployed with registered
endpoints.&lt;/p&gt;
&lt;p&gt;The identity-service relations would also advertise the same data as the
cloud-services relations so that charms already related to keystone don’t
have to double relate (identity-service is a superset of cloud-services).&lt;/p&gt;
&lt;p&gt;By default, a registered endpoint of type ‘A’ will result in service type
‘A’ being listed as part of the deployed cloud on this interface.&lt;/p&gt;
&lt;p&gt;Services may also enrich this data by providing ‘features’ (optional)
alongside their endpoint registration - these will be exposed on the
cloud-service and identity-service relations.&lt;/p&gt;
&lt;p&gt;Data will look something like (populated with real examples - key and
proposed values):&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;services&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;'object-store'&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;'network'&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;'volumev2'&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;'compute'&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;'metering'&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;'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="s"&gt;'orchestration'&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;'dns'&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;Example - advertise features supported by the networking service, allowing
features to be enabled automatically in the dashboard:&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;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="s"&gt;'dvr'&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;'fwaas'&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;'lbaasv2'&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;'l3ha'&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;Example - allow ceilometer to know that the deployed object-store is radosgw
rather than swift:&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;object-store&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;'radosgw'&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;Values will be parseable as a json/yaml formatted list.&lt;/p&gt;
&lt;p&gt;By using the basic primitive of tags, we get alot of flexibility with
type/feature being easily express-able.&lt;/p&gt;
&lt;p&gt;Interface will be eventually consistent in clustered deployments -
all keystone units will present the same data.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Each charm could query the keystone service catalog; however this is very
much a point in time check, and the service catalog may change after the
query has been made. In addition the keystone service catalog does not
have details on what optional features each service type may have enabled
and keystone services will be restarted during deployment as clusters
get built out etc.&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;james-page&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “service-discovery” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;service-discovery
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Core (keystone charm):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add cloud-services relation to keystone charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add service and feature discover handler to keystone charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update keystone interface to advertise services and features in
keystone charm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create cloud-services reactive interface&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enablement:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update ceilometer charm for radosgw discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update openstack-dashboard charm to automatically enable panels
for deployed services and features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm for designate discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update cinder charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update glance charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm for ceilometer discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update radosgw charm to advertise ‘radosgw’ feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update neutron-api charm to advertise networking features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;This change is internal for use across the OpenStack charms, no documentation
updates are required for end-users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security implications for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Implementation will include unit tests for all new code written; amulet
function tests will be updated to ensure that feature is being implemented
correctly across the charm set.&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 external dependencies&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 21 Mar 2018 00:00:00 </pubDate></item><item><title>Internal DNS Resolution</title><link>https://specs.openstack.org/openstack/charm-specs/specs/pike/implemented/internal-dns.html</link><description>

&lt;p&gt;Users of an OpenStack cloud would like to look up their instances by name in an
intuitive way using the Domain Name System (DNS). When booting an instance
using Nova, a name is provided which is then used as the hostname for the
system. Many programs in the booted instance utilize DNS to resolve the
hostname and function less than ideally when the hostname cannot be resolved.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The lack of sane internal DNS resolution has plagued users of OpenStack
deployed instances since before the ice(-house) age. Neutron has long provided
DNS services for tenant networks, but the default names provided by Neutron are
defined as ‘host-%(octet0)s-%(octet1)s-%(octet2)s-%(octet3)s.openstacklocal’.
Since this name does not match the instance name/hostname, the DNS queries fail
when attempting to resolve the hostname.&lt;/p&gt;
&lt;p&gt;Some examples where this becomes problematic for tenants are as follows:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Sudo attempts to resolve the hostname each time it runs. Sudo continues to
work, but complains about the failed name resolution:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;ubuntu@john-oliver:~$ sudo -s
sudo: unable to resolve host john-oliver
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users are unable to logically refer to other instances by name in normal
network operations as they would in a bare metal lab environment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;ubuntu@jon-stewart:~$ ping john-oliver
ping: unknown host john-oliver
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Applications such as rabbitmq-server require a resolvable hostname in order
to function properly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OpenStack Neutron and Nova projects have previously addressed this in the
Liberty and Mitaka releases respectively and the charms should enable this
functionality for the end users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The Liberty release of Neutron introduced the DNS extension driver &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;. This
extension driver, when enabled, adds the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_domain&lt;/span&gt;&lt;/code&gt; attribute to the
Neutron Network API and added the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_name&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_fqdn&lt;/span&gt;&lt;/code&gt; (read-only)
attributes to the Neutron Port API. These new attributes are used by the
Neutron dhcp-agent when creating the host file for the dnsmasq process.&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;&lt;a class="reference external" href="https://specs.openstack.org/openstack/neutron-specs/specs/liberty/internal-dns-resolution.html"&gt;https://specs.openstack.org/openstack/neutron-specs/specs/liberty/internal-dns-resolution.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;In the subsequent Mitaka release, the Nova project leveraged the newly minted
DNS extension in Neutron to supply DNS-sanitized versions of the instance
name &lt;a class="footnote-reference brackets" href="#id4" 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;. When booting new instances, Nova will provide the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_name&lt;/span&gt;&lt;/code&gt;
attribute for ports it creates via the Neutron API.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&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="#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="https://specs.openstack.org/openstack/nova-specs/specs/mitaka/implemented/internal-dns-resolution.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/mitaka/implemented/internal-dns-resolution.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;OpenStack documentation &lt;a class="footnote-reference brackets" href="#id6" id="id5" 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; in the Mitaka release provides details for how to
enable this DNS integration between the two projects. The configuration pieces
entirely belong to the Neutron project as Nova will Just Do the Right Thing
(TM).&lt;/p&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;&lt;a role="doc-backlink" href="#id5"&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="https://docs.openstack.org/mitaka/networking-guide/config-dns-int.html"&gt;https://docs.openstack.org/mitaka/networking-guide/config-dns-int.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;This spec proposes to enable internal DNS resolution for deployed clouds and
does not attempt to cover integration with an external DNS service such as
Designate.&lt;/p&gt;
&lt;p&gt;It is important to note that the internal DNS resolution provided by this
feature is &lt;em&gt;network isolated&lt;/em&gt; rather than tenant isolated. As such, instances
launched in network A will not be able to resolve instances launched in network
B. For this type of name resolution, an external DNS service such as those
provided by Designate should be used instead and is beyond the scope of this
spec.&lt;/p&gt;
&lt;p&gt;To enable the internal DNS resolution, the neutron-server service must be
configured with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_domain&lt;/span&gt;&lt;/code&gt; config option set to a value other than
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstacklocal&lt;/span&gt;&lt;/code&gt; in neutron.conf file and the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns&lt;/span&gt;&lt;/code&gt; extension driver must
be enabled in the ml2_conf.ini file.&lt;/p&gt;
&lt;p&gt;This change will add a two new config options as defined below:&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;enable-ml2-dns&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;boolean&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="l l-Scalar l-Scalar-Plain"&gt;False&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Enables the Neutron DNS extension driver. When enabled, ports attached&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;to Nova instances will have DNS names assigned based on the instance&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;name.&lt;/span&gt;
&lt;span class="nt"&gt;dns-domain&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="l l-Scalar l-Scalar-Plain"&gt;openstack.example.&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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Specifies the dns domain name that should be used for building instance&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;hostnames. An empty option or the value of 'openstacklocal' will cause&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;the dhcp agents to broadcast the default domain of openstacklocal and&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;will not enable internal cloud dns resolution. This value should end&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;with a '.', e.g. 'cloud.example.org.'.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to enable internal DNS resolution, the user must set the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable-ml2-dns&lt;/span&gt;&lt;/code&gt; to True. The default value is False in order to provide
backwards compatibility with existing deployments.&lt;/p&gt;
&lt;section id="dns-forwarding-servers"&gt;
&lt;h3&gt;DNS Forwarding Servers&lt;/h3&gt;
&lt;p&gt;The dns-domain alone is not enough to provide all the necessary configuration
options for the neutron networking. In most instances, the administrator will
need to be able to specify a dns fowarding server as well. In order to do this,
a new config option will be provided allowing the user to set configure the
nameservers to use as forwarding servers.&lt;/p&gt;
&lt;p&gt;Per &lt;a class="footnote-reference brackets" href="#id8" id="id7" 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; there are three ways of configuring DNS nameservers for instances
launched in the cloud. Tenant subnets can have their own nameservers identified
and requires ano additional work in order to enable that. Default nameserver
information is provided by the DHCP agents to point to the dhcp port address
but contains no additional forwarding servers. By default, this only allows
instances to be able to resolve other instances in the subnet. To amend this,
the neutron-openvswitch and neutron-gateway charms will be amended to allow
the user to specify the DNS forwarding servers. The charms will not include
any options to allow the use of the DNS resolvers configured on the DHCP
agent’s host (the dnsmasq_local_resolv option) as it poses a risk of leaking
internal infrastructure level resources to the instances.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&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="#id7"&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="https://docs.openstack.org/newton/networking-guide/config-dns-res.html"&gt;https://docs.openstack.org/newton/networking-guide/config-dns-res.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;As such, the neutron-openvswitch and neutron-gateway charms will add an option
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns-servers&lt;/span&gt;&lt;/code&gt;, which will configure the dnsmasq_dns_servers option in the
dhcp_agent.ini file. This option is defined 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;dns-servers&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="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="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;A comma-separated list of DNS servers which will be used by dnsmasq as&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;forwarders.&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;dns-servers&lt;/span&gt;&lt;/code&gt; option will only apply for the neutron-openvswitch charm
when the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable-local-dhcp-and-metadata&lt;/span&gt;&lt;/code&gt; option is set to True.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="relation-implications"&gt;
&lt;h3&gt;Relation Implications&lt;/h3&gt;
&lt;p&gt;The neutron-dhcp-agent does not run on the same node as the neutron-server and
should have the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dns_domain&lt;/span&gt;&lt;/code&gt; specified in the dhcp_conf.ini file. Specifying
this value in the dhcp_conf.ini file is not strictly necessary, as the
hostnames will properly resolve without it. However, the default search list
advertised to hosts will be the default &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstacklocal&lt;/span&gt;&lt;/code&gt; and may cause
confusion to users. To allow the neutron-api charm to share this configuration
information with interested parties, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;neutron-plugin-api&lt;/span&gt;&lt;/code&gt; relation-data
will be updated to contain the dns-domain name:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s"&gt;'dns-domain'&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;'domain.tld.'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The value will be a string containing the domain name.&lt;/p&gt;
&lt;/section&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;Designate could be setup to provide the DNS service entries for the tenant.
This option is valid, but requires additional components to be setup and
deployed into the environment. Additionally, there are some limitations
which are not well documented in the upstream documentation for configuring
DNS integration. For example, the Neutron port API will not call the
Designate API for ports on tunnelled tenant networks (e.g. GRE).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An out-of-band solution such as that provided by the serverstack-dns
tool could be deployed to provide DNS based upon OpenStack events. This is
less than desirable as it must be installed per tenant, each tenant must
have access credentials to access the resources of the underlying cloud, and
the tool itself is not intended for a production environment.&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;billy-olsen&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “charms-internal-dns” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;charms-internal-dns
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;charm-neutron-api&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new config option to the neutron api charm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add dns-domain to the neutron-plugin-api interface&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update README.md to reflect new behavior&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;charm-neutron-gateway&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update neutron-gatway to consume dns-domain from relation data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add dns-servers config option to charm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;charm-neutron-openvswitch&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update neutron-openvswitch charm to consume dns-domain from relation data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add dns-servers config option to charm&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="supported-releases"&gt;
&lt;h3&gt;Supported Releases&lt;/h3&gt;
&lt;p&gt;This feature will be available on deployed clouds running Mitaka or newer.
Attempting to enable this feature on earlier versions will have no effect.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;The neutron-api charm README will need to be updated to reflect the new feature
and how to enable internal DNS.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No security implications for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Implementation will include unit tests for all new code written; amulet
function tests will be updated to ensure that feature is being implemented
correctly across the charm set.&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 external dependencies.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 07 Sep 2017 00:00:00 </pubDate></item><item><title>Ceph Broker CephX Support</title><link>https://specs.openstack.org/openstack/charm-specs/specs/ocata/implemented/cephx-groups.html</link><description>

&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently the ceph/ceph-mon charm provides cephx keys to clients which
have rw permissions to all pools in the ceph cluster; this is problematic
because it means that any client can read/write/delete data in any pool
so in the event of a compromise of a service (which might be directly
accessible by end users such as cinder, glance or the ceph-radosgw), the
entire cluster is compromised until the compromised key is revoked.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Ceph supports fine grained access control on keys, so we need to leverage
this functionality to improve the general security of a deployment, for
example (taken directly from the Ceph documentation):&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;ceph&lt;span class="w"&gt; &lt;/span&gt;auth&lt;span class="w"&gt; &lt;/span&gt;get-or-create&lt;span class="w"&gt; &lt;/span&gt;client.cinder&lt;span class="w"&gt; &lt;/span&gt;mon&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow r'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;osd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'&lt;/span&gt;
ceph&lt;span class="w"&gt; &lt;/span&gt;auth&lt;span class="w"&gt; &lt;/span&gt;get-or-create&lt;span class="w"&gt; &lt;/span&gt;client.glance&lt;span class="w"&gt; &lt;/span&gt;mon&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow r'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;osd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow class-read object_prefix rbd_children, allow rwx pool=images'&lt;/span&gt;
ceph&lt;span class="w"&gt; &lt;/span&gt;auth&lt;span class="w"&gt; &lt;/span&gt;get-or-create&lt;span class="w"&gt; &lt;/span&gt;client.cinder-backup&lt;span class="w"&gt; &lt;/span&gt;mon&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow r'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;osd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'allow class-read object_prefix rbd_children, allow rwx pool=backups'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ceph/ceph-mon will provide new broker methods to allow&lt;/p&gt;
&lt;ol class="loweralpha"&gt;
&lt;li&gt;&lt;p&gt;Client requested pools to be placed into ‘groups’ at point of creation:&lt;/p&gt;
&lt;p&gt;For example, multiple cinder backend pools would be placed into the
‘volumes’ group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clients can also request access to a group of pools:&lt;/p&gt;
&lt;p&gt;For example, the cinder charm will gain ‘rwx’ for pools in the ‘volumes’
group, and will request ‘rx’ permission for pools in the ‘images’ group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clients can optional request additional permissions:&lt;/p&gt;
&lt;p&gt;This supports the ‘allow class-read object_prefix rbd_children’ use-case
where a key needs to be able to read from copy-on-write clones in different
pools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Security could be left open and secured post deployment by the operator, but
this is neither repeatable or desirable from an operations perspective.&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;xfactor973 (Chris Holcombe)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “cephx-keys” for all patches related to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;cephx-keys
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;Implementation of group-&amp;gt;pool mapping and maintenance in ceph-broker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation of cephx key-&amp;gt;group ACL mapping in ceph-broker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation of methods on relation API to support mapping pools
to groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation of methods on broker relation API to support granting
access to pools to cephx keys with correct permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation of cephx key update mechanism when membership of
a pool group changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates to cinder, glance, nova-compute and ceph-radosgw charms to
make appropriate pool access requests to the ceph/ceph-mon charm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new repositories are required for this work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;As the broker relation interface is self documenting, no additional
documentation is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;This work mitigates an existing security risk.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The existing charm functional tests will automatically cover this
work as they should be exercising the functionality of services
consuming ceph resources; incorrect key permissions will result in
broken function.&lt;/p&gt;
&lt;p&gt;Unit tests should be written to validate the key and group management
functions in charms.ceph; additionally the ceph/ceph-mon charm
function tests should be updated to verify the permissions on created
keys in the current test cases.&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;No external dependencies for this work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 08 Mar 2017 00:00:00 </pubDate></item><item><title>Ceph Autotune</title><link>https://specs.openstack.org/openstack/charm-specs/specs/newton/implemented/ceph-autotune.html</link><description>

&lt;p&gt;Ceph isn’t as fast as it could be out of the box.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently we don’t do any tuning of Ceph after installing it.  There’s
many little things that have to be tweaked to get ceph to be performant.&lt;/p&gt;
&lt;p&gt;There are many mailing list messages of users becoming frustrated with
the slow performance of Ceph.  The goal of this epic is to capture the
low hanging fruit so everyone can have a better experience with Ceph.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;I’m proposing several areas where easy improvements can be made.&lt;/p&gt;
&lt;p&gt;There’s several areas that can be improved such as HDD read ahead and
max hardware sector settings.  We can also tune the sysctl network
settings on 10 and 40Gb networks.&lt;/p&gt;
&lt;p&gt;Finally I’ve noticed that IRQ alignment on multisocket motherboard
isn’t ideal.  We can use numactl to pin the IRQs for all the components
in the IO path from network to osd to disk.&lt;/p&gt;
&lt;p&gt;Of all the changes probably the IRQ pinning will be the most difficult.&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;cholcombe973&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="gerrit-topic"&gt;
&lt;h3&gt;Gerrit Topic&lt;/h3&gt;
&lt;p&gt;Use Gerrit topic “performance-optimizations” for all patches related
to this spec.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;git-review&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;performance-optimizations
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&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;HDD Read ahead settings: Often times the read ahead settings for
hdd’s are too small for storage servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10/40Gb sysctl settings: 10Gb and 40Gb networks need special sysctl
settings to improve their performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HDD max hardware sectors: Making the max hardware sectors as large
as possible allows bigger sequential writes and therefore better
performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IRQ alignment for multisocket motherboards: It has been shown on
multi socket motherboards that Linux does a bad job of lining up
IRQ’s and results in lots of swapping of cache memory between CPU’s.
This significantly degrades Ceph’s performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="repositories"&gt;
&lt;h3&gt;Repositories&lt;/h3&gt;
&lt;p&gt;No new git repositories required for this work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation"&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Updates to the README’s in the impacted charms will be made as part of this
change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;p&gt;No additional security concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Code changes will be covered by unit tests; functional testing will be done
using a Mojo specification.&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;charm-layering&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 17 Oct 2016 00:00:00 </pubDate></item><item><title>Team and repository tags</title><link>https://specs.openstack.org/openstack/charm-specs/readme.html</link><description>&lt;section id="team-and-repository-tags"&gt;

&lt;a class="reference external image-reference" href="https://governance.openstack.org/tc/reference/tags/index.html"&gt;&lt;img alt="https://governance.openstack.org/tc/badges/charm-specs.svg" src="https://governance.openstack.org/tc/badges/charm-specs.svg"/&gt;&lt;/a&gt;
&lt;/section&gt;
&lt;section id="readme"&gt;

&lt;section id="openstack-charm-specifications"&gt;
&lt;h2&gt;OpenStack Charm Specifications&lt;/h2&gt;
&lt;p&gt;This git repository is used to hold approved design specifications for additions
to the Charm project.  Reviews of the specs are done in gerrit, using a similar
workflow to how we review and merge changes to the code itself. For specific
policies around specification review, refer to the end of this document.&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;Where there are two sub-directories:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;specs/&amp;lt;release&amp;gt;/approved: specifications approved but not yet implemented
specs/&amp;lt;release&amp;gt;/implemented: implemented specifications&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="example-specifications"&gt;
&lt;h3&gt;Example specifications&lt;/h3&gt;
&lt;p&gt;You can find an example spec in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;specs/template.rst&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><pubDate>Thu, 26 May 2016 00:00:00 </pubDate></item></channel></rss>