Charmstore to Charmhub Migration¶
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.
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.
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.
Problem Description¶
Currently, OpenStack Charms are delivered in two charmstore namespaces -
openstack-charmers
and openstack-charmers-next
. 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.
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.
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.
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.
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.
Proposed Change¶
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 Snap store. 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.
Tracks¶
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.
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.).
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).
Risk Levels¶
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.
Charms will be promoted through the edge -> beta -> candidate -> 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.
Branches¶
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.
For the purposes of this work, branches are explicitly out of scope and should be considered separately.
Git Branches¶
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.
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.
OpenStack Charms¶
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 stable/<openstack-release>
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.
Git Branch |
Charmhub Track(s) |
---|---|
stable/queens stable/rocky stable/stein stable/train |
train |
stable/ussuri |
ussuri |
stable/victoria |
victoria |
stable/wallaby |
wallaby |
stable/xena |
xena |
stable/yoga |
yoga |
master |
zed, latest/edge |
Ceph Charms¶
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.
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.
Git Branch |
Charmhub Track(s) |
---|---|
stable/luminous |
luminous, queens, rocky |
stable/mimic |
mimic, stein |
stable/nautilus |
nautilus, train |
stable/octopus |
octopus |
stable/pacific |
pacific |
master |
quincy, latest/edge |
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:
Ceph Release |
OpenStack Release |
---|---|
Luminous |
Queens |
Mimic |
Stein |
Nautilus |
Train |
Octopus |
Ussuri |
Pacific |
Wallaby (mid-cycle Openstack, more support) |
Unstable / Quincy |
Yoga |
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.
The Ceph charms include the following charms:
ceph-fs
ceph-iscsi
ceph-mon
ceph-osd
ceph-proxy
ceph-radosgw
ceph-rbd-mirror
ceph-dashboard
Provider-specific Subordinate Charms¶
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.
These charms will include the following subordinate charms, and as of this writing include:
cinder-ceph
cinder-lvm
cinder-netapp
cinder-purestorage
neutron-openvswitch
neutron-api-plugin-arista
neutron-api-plugin-ovn
keystone-saml-mellon
OVN Charms¶
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.
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.
OVN charms will have the following sets of branches and tracks:
Branch |
Track(s) |
---|---|
stable/20.03 |
20.03, ussuri, victoria |
stable/20.12 |
20.12, wallaby |
stable/21.09 |
21.09, xena |
stable/22.03 |
22.03 |
master |
latest/edge |
Supporting Charms¶
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.
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.
Charm |
Branch |
Track(s) |
---|---|---|
hacluster |
stable/bionic |
1.1.x |
hacluster |
stable/focal |
2.0.3, latest/stable |
hacluster |
master |
2.0.5, latest/edge |
pacemaker-remote |
stable/bionic |
1.1.x |
pacemaker-remote |
stable/focal |
2.0.3, latest/stable |
pacemaker-remote |
master |
2.0.5, latest/edge |
rabbitmq-server |
stable/bionic |
3.6 |
rabbitmq-server |
stable/focal |
3.8, latest/stable |
rabbitmq-server |
master |
3.9, latest/edge |
vault |
stable/1.5 |
1.5 |
vault |
stable/1.6 |
1.6 |
vault |
stable/1.7 |
1.7 |
vault |
master |
latest/edge |
percona-cluster |
stable/bionic |
5.7, latest/stable |
percona-cluster |
master |
latest/edge |
mysql-innodb-cluster |
stable/jammy |
8.0, latest/stable |
mysql-innodb-cluster |
master |
latest/edge |
Trilio Charms¶
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.
trilio-data-mover |
stable/4.0 |
4.0 |
---|---|---|
trilio-data-mover |
stable/4.1 |
4.1, latest/stable |
trilio-data-mover |
master |
4.2 (?), latest/edge |
trilio-dm-api |
stable/4.0 |
4.0 |
trilio-dm-api |
stable/4.1 |
4.1, latest/stable |
trilio-dm-api |
master |
4.2 (?), latest/edge |
trilio-horizon-plugin |
stable/4.0 |
4.0 |
trilio-horizon-plugin |
stable/4.1 |
4.1, latest/stable |
trilio-horizon-plugin |
master |
4.2 (?), latest/edge |
trilio-wlm |
stable/4.0 |
4.0 |
trilio-wlm |
stable/4.1 |
4.1, latest/stable |
trilio-wlm |
master |
4.2 (?), latest/edge |
Installation Sources¶
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 openstack-origin
or source
charm config option, which defaults to install using the local
installations default distribution repositories.
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.
Primarily, this will affect the tracks that use the Ussuri Ubuntu Cloud Archive and the Yoga Ubuntu Cloud Archive as an installation source.
Latest Track¶
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.
The latest track will be used into two ways:
The
latest/stable
track will be used to park the stable 21.10 charms release until (at least) the 22.10 release.At 22.10, the
latest/stable
track will follow the current stable release, and for 22.10 this will be thezed
track.
The reasoning is that the 21.10 charms’ metadata advertise focal support,
against all
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
latest/stable
track at that point.
Risks¶
The purpose of each risk level for each track is as follows:
Edge¶
For each charm, the latest/edge channel will always map the current master development branch.
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.
Beta¶
The beta risk level will be used for milestone releases during the charm development cycle.
Candidate¶
The <track>/candidate
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.
Stable¶
The stable track will track the stable, tested, released version of the charm.
Technology Preview Charms¶
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.
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.
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 openstack-charmers
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.
Continuous Integration¶
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.
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.
Publishing Charms¶
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.
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.
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.
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.
Testing Charms¶
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.
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.
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.
Charmcraft¶
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.
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.
Documentation¶
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.
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.
Developer documentation should also be provided in the OpenStack Charm Guide to provide details for developers wishing to contribute new features, bug fixes, etc.
Alternatives¶
There aren’t really any good alternatives. When the charmstore to charmhub
cut-over is implemented, the existing charm
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.
This means continuing to maintain Jenkins and not take advantage of the Launchpad builders to build architecture aware charms.
Implementation¶
Assignee(s)¶
- Primary assignee:
Alex Kavanagh
Gerrit Topic¶
N/A
Work Items¶
Produce ‘charmcraft’ recipes for classic and reactive charms¶
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.
Write classic recipe
Write reactive charm recipe using charm-tools
build
command.Add recipes to
release-tools
repository.
Produce helper tools/library to manage launchpad projects/recipes¶
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.
Essential functionality will be:
display gap between config and actual in git repositories and launchpad recipes.
Show desired tracks vs actual tracks for charms (in charmhub) to generate ‘requests’ for new tracks, or for tracks to be deleted.
update existing recipes against the configuration.
Create new recipes as required against the config.
Repositories¶
Initially, the existing release-tools
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.
Additionaly, the manage the recipes a separate charmhub-lp-tools
tool will
be created to automate recipe creation, updates, deletes and changed, and to
authorize uploads to the charmhub.
https://github.com/openstack-charmers/release-tools
https://github.com/openstack-charmers/charmhub-lp-tools
Documentation¶
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.
Security¶
No additional security concerns.
The user that runs the tool must have a launchpad account in the
openstack-charmers
team, and a charmhub account in the
openstack-charmers
team.
Testing¶
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.
Stage 1¶
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.
Stage 2¶
Selecting two charms (notionally, neutron-dynamic-routing
and
manila-generic
), 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.
This will allow the correct changes to the charms to be enumerated and captured in the release-tools repository.
Dependencies¶
None