diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
new file mode 100644
index 000000000..9079b30ff
--- /dev/null
+++ b/.github/workflows/pull-request.yml
@@ -0,0 +1,28 @@
+---
+name: Pull request
+'on':
+ pull_request:
+jobs:
+ tox:
+ runs-on: ubuntu-20.04
+ strategy:
+ matrix:
+ include:
+ - environment: pep8
+ python-version: 3.8
+ - environment: releasenotes
+ python-version: 3.8
+ name: Tox ${{ matrix.environment }} with Python ${{ matrix.python-version }}
+ steps:
+ - name: Github Checkout ๐u
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - name: Setup Python ${{ matrix.python-version }} ๐
+ uses: actions/setup-python@v3
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install Tox ๐ฆ
+ run: pip install tox
+ - name: Run Tox ${{ matrix.environment }} ๐งช
+ run: tox -e ${{ matrix.environment }}
diff --git a/.yamllint b/.yamllint
index 479488dee..70b008794 100644
--- a/.yamllint
+++ b/.yamllint
@@ -9,4 +9,5 @@ rules:
level: error
comments:
require-starting-space: false
+ line-length: disable
truthy: disable
diff --git a/etc/kayobe/ansible/requirements.yml b/etc/kayobe/ansible/requirements.yml
index aef3e5ddf..d8c1ad3f2 100644
--- a/etc/kayobe/ansible/requirements.yml
+++ b/etc/kayobe/ansible/requirements.yml
@@ -1,3 +1,4 @@
+---
collections:
- name: stackhpc.pulp
version: 0.3.0
diff --git a/etc/kayobe/environments/ci-builder/network-allocation.yml b/etc/kayobe/environments/ci-builder/network-allocation.yml
index d17410ccc..75ed29143 100644
--- a/etc/kayobe/environments/ci-builder/network-allocation.yml
+++ b/etc/kayobe/environments/ci-builder/network-allocation.yml
@@ -1,4 +1,3 @@
---
aio_ips:
builder: 192.168.33.3
-
diff --git a/releasenotes/config.yaml b/releasenotes/config.yaml
new file mode 100644
index 000000000..88d4c778b
--- /dev/null
+++ b/releasenotes/config.yaml
@@ -0,0 +1,4 @@
+---
+# This needs to be updated to the latest release.
+default_branch: stackhpc/wallaby
+release_tag_re: stackhpc/\d+\.\d+\.\d+\.\d
diff --git a/releasenotes/notes/wallaby-c3c55c39c7b118f2.yaml b/releasenotes/notes/wallaby-c3c55c39c7b118f2.yaml
new file mode 100644
index 000000000..09ac83a46
--- /dev/null
+++ b/releasenotes/notes/wallaby-c3c55c39c7b118f2.yaml
@@ -0,0 +1,25 @@
+---
+features:
+ - |
+ Adds support for package repository snapshots via `Pulp
+ `_. A local Pulp server is deployed on the seed,
+ which syncs package repositories and container images from the StackHPC
+ `Ark `_ Pulp server. Control plane servers pull
+ packages and container images from the local Pulp server.
+ - |
+ The EPEL package repository is disabled by default. It may be enabled by
+ setting ``dnf_enable_epel`` to ``true``.
+ - |
+ Uses StackHPC source code repositories for kolla, kolla-ansible, and bifrost.
+ - |
+ Supports Kolla CentOS Stream 8 source container images.
+ - |
+ Adds custom playbooks for compute host maintenance:
+
+ * ``nova-compute-drain.yml``
+ * ``nova-compute-disable.yml``
+ * ``nova-compute-enable.yml``
+ * ``reboot.yml``
+other:
+ - Adds a ``ci-aio`` environment for CI testing.
+ - Adds a ``ci-builder`` environment for building Kolla container images in CI.
diff --git a/releasenotes/requirements.txt b/releasenotes/requirements.txt
new file mode 100644
index 000000000..f3596419c
--- /dev/null
+++ b/releasenotes/requirements.txt
@@ -0,0 +1,4 @@
+reno>=3.4.0 # Apache-2.0
+sphinx>=2.0.0,!=2.1.0 # BSD
+sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD
+sphinx-material
diff --git a/releasenotes/source/_static/.placeholder b/releasenotes/source/_static/.placeholder
new file mode 100644
index 000000000..e69de29bb
diff --git a/releasenotes/source/_templates/.placeholder b/releasenotes/source/_templates/.placeholder
new file mode 100644
index 000000000..e69de29bb
diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py
new file mode 100644
index 000000000..6edc09af6
--- /dev/null
+++ b/releasenotes/source/conf.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('../..'))
+
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'reno.sphinxext',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = 'StackHPC Kayobe Configuration Release Notes'
+copyright = '2022 StackHPC Ltd'
+
+# Release notes do not need a version number in the title, they
+# cover multiple releases.
+# The short X.Y version.
+version = ''
+# The full version, including alpha/beta/rc tags.
+release = ''
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+# language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'native'
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+# keep_warnings = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'sphinx_material'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+# html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+# html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+# html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+# html_extra_path = []
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+# html_domain_indices = True
+
+# If false, no index is generated.
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'StackHPCKayobeConfigReleaseNotesdoc'
+
+
+# -- Options for LaTeX output ---------------------------------------------
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+# latex_documents = []
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_domain_indices = True
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+# texinfo_documents = []
+
+# Documents to append as an appendix to all manuals.
+# texinfo_appendices = []
+
+# If false, no module index is generated.
+# texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+# texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+# texinfo_no_detailmenu = False
+
+# -- Options for Internationalization output ------------------------------
+locale_dirs = ['locale/']
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
new file mode 100644
index 000000000..97a4a4dd2
--- /dev/null
+++ b/releasenotes/source/index.rst
@@ -0,0 +1,17 @@
+Welcome to StackHPC Kayobe Configuration Release Notes
+======================================================
+
+Contents
+========
+
+.. toctree::
+ :maxdepth: 2
+
+ wallaby
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/releasenotes/source/wallaby.rst b/releasenotes/source/wallaby.rst
new file mode 100644
index 000000000..c6f9153f0
--- /dev/null
+++ b/releasenotes/source/wallaby.rst
@@ -0,0 +1,6 @@
+============================
+Wallaby Series Release Notes
+============================
+
+.. release-notes::
+ :branch: stackhpc/wallaby
diff --git a/tox.ini b/tox.ini
index 7c4a14fc0..5e3623bbc 100644
--- a/tox.ini
+++ b/tox.ini
@@ -12,3 +12,15 @@ deps =
[testenv:pep8]
commands =
yamllint etc/kayobe
+
+# StackHPC Kayobe configuration release notes:
+[testenv:releasenotes]
+allowlist_externals = rm
+skip_install = true
+# NOTE: Using Xena upper constraints for reno 3.4.0, with support for default_branch.
+deps =
+ -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena}
+ -r{toxinidir}/releasenotes/requirements.txt
+commands =
+ rm -rf releasenotes/build/html
+ sphinx-build -n -W --keep-going -b html releasenotes/source releasenotes/build/html