From f5d81b0f7fbecc40f8df716d3f6a12067191a5ad Mon Sep 17 00:00:00 2001 From: Will Szumski Date: Fri, 10 Jul 2026 20:06:34 +0100 Subject: [PATCH 1/9] Fix vault password env var validation Remove ANSIBLE_VAULT_PASSWORD_FILE from environment in update_environment() when its password is being used. This prevents conflicts when ansible-vault is called with --vault-password-file, which can occur in kolla_passwords.py when kolla-ansible runs. Closes-Bug: #2160369 Change-Id: I6ab964be87bcd18a71f8e5d4abe29c7cdb26b190 Signed-off-by: Will Szumski --- kayobe/tests/unit/test_vault.py | 4 ++-- kayobe/vault.py | 3 +++ ...vault-password-env-validation-1617fe16a6f6f312.yaml | 10 ++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/fix-vault-password-env-validation-1617fe16a6f6f312.yaml diff --git a/kayobe/tests/unit/test_vault.py b/kayobe/tests/unit/test_vault.py index 50a681df5..7042becb6 100644 --- a/kayobe/tests/unit/test_vault.py +++ b/kayobe/tests/unit/test_vault.py @@ -143,6 +143,6 @@ def test_update_environment_file_env(self, mock_read): parsed_args = parser.parse_args([]) env = {"ANSIBLE_VAULT_PASSWORD_FILE": "/path/to/file"} vault.update_environment(parsed_args, env) - self.assertEqual({"KAYOBE_VAULT_PASSWORD": "test-pass", - "ANSIBLE_VAULT_PASSWORD_FILE": "/path/to/file"}, env) + # ANSIBLE_VAULT_PASSWORD_FILE should be removed to avoid conflicts + self.assertEqual({"KAYOBE_VAULT_PASSWORD": "test-pass"}, env) mock_read.assert_called_once_with("/path/to/file") diff --git a/kayobe/vault.py b/kayobe/vault.py index 3a4d32b9b..366e2d042 100644 --- a/kayobe/vault.py +++ b/kayobe/vault.py @@ -164,6 +164,9 @@ def update_environment(parsed_args, env): if VAULT_PASSWORD_FILE_ENV in os.environ: vault_password = _read_vault_password_file( os.environ[VAULT_PASSWORD_FILE_ENV]) + # Remove ANSIBLE_VAULT_PASSWORD_FILE from environment to avoid + # conflicts when ansible-vault is called with --vault-password-file + env.pop(VAULT_PASSWORD_FILE_ENV, None) elif parsed_args.ask_vault_pass: vault_password = _ask_vault_pass() elif parsed_args.vault_password_file: diff --git a/releasenotes/notes/fix-vault-password-env-validation-1617fe16a6f6f312.yaml b/releasenotes/notes/fix-vault-password-env-validation-1617fe16a6f6f312.yaml new file mode 100644 index 000000000..90bc66ba2 --- /dev/null +++ b/releasenotes/notes/fix-vault-password-env-validation-1617fe16a6f6f312.yaml @@ -0,0 +1,10 @@ +--- +fixes: + - | + Fixed a vault password validation bug that caused errors when using + ``ANSIBLE_VAULT_PASSWORD_FILE``. Users would encounter an error: + ``The vault-ids default,default are available to encrypt. Specify the + vault-id to encrypt with --encrypt-vault-id``. The issue occurred because + the vault password helper was being invoked unnecessarily when only + ``ANSIBLE_VAULT_PASSWORD_FILE`` was set. + `LP#2160369 `__ From c7b4d7b615f964556c901391a488f635576c286c Mon Sep 17 00:00:00 2001 From: Pierre Riteau Date: Thu, 24 Sep 2026 17:24:58 +0200 Subject: [PATCH 2/9] Use public-openrc.sh from Kolla Ansible A public-openrc.sh file is generated by Kolla Ansible since the Caracal release [1]. This also fixes wrong values of OS_AUTH_URL when using a single external frontend in HAProxy. [1] https://review.opendev.org/c/openstack/kolla-ansible/+/862159 Closes-Bug: #2071817 Closes-Bug: #2168467 Change-Id: I46a71f7065b0da9c23cf094e76840e005ecd3a8e Signed-off-by: Pierre Riteau --- ansible/public-openrc.yml | 16 ----------- ansible/roles/public-openrc/defaults/main.yml | 6 ----- ansible/roles/public-openrc/tasks/main.yml | 12 --------- .../templates/public-openrc.sh.j2 | 22 --------------- kayobe/cli/commands.py | 25 +++-------------- kayobe/tests/unit/cli/test_commands.py | 27 ------------------- ...-kolla-public-openrc-17f699344c3ca318.yaml | 10 +++++++ 7 files changed, 13 insertions(+), 105 deletions(-) delete mode 100644 ansible/public-openrc.yml delete mode 100644 ansible/roles/public-openrc/defaults/main.yml delete mode 100644 ansible/roles/public-openrc/tasks/main.yml delete mode 100644 ansible/roles/public-openrc/templates/public-openrc.sh.j2 create mode 100644 releasenotes/notes/use-kolla-public-openrc-17f699344c3ca318.yaml diff --git a/ansible/public-openrc.yml b/ansible/public-openrc.yml deleted file mode 100644 index 412c2cd19..000000000 --- a/ansible/public-openrc.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -# Generate an environment file for interacting with the public OpenStack APIs -# as the admin user in the admin project. - -- name: Ensure a public OpenStack API environment file exists - hosts: localhost - tags: - - public-openrc - vars: - public_api_proto: "{% if kolla_enable_tls_external | bool %}https{% else %}http{% endif %}" - public_api_host: "{{ kolla_external_fqdn or kolla_internal_fqdn }}" - public_api_keystone_port: 5000 - roles: - - role: public-openrc - public_openrc_kolla_config_path: "{{ kolla_config_path }}" - public_openrc_auth_url: "{{ public_api_proto }}://{{ public_api_host }}:{{ public_api_keystone_port }}" diff --git a/ansible/roles/public-openrc/defaults/main.yml b/ansible/roles/public-openrc/defaults/main.yml deleted file mode 100644 index db15f1a61..000000000 --- a/ansible/roles/public-openrc/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Path to kolla configuration directory. -public_openrc_kolla_config_path: - -# URL of public keystone API to use for authentication. -public_openrc_auth_url: diff --git a/ansible/roles/public-openrc/tasks/main.yml b/ansible/roles/public-openrc/tasks/main.yml deleted file mode 100644 index baee4d995..000000000 --- a/ansible/roles/public-openrc/tasks/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Read the admin OpenStack API environment file - slurp: - src: "{{ kolla_config_path }}/admin-openrc.sh" - register: admin_openrc - when: (kolla_config_path ~ '/admin-openrc.sh') is exists - -- name: Ensure a public OpenStack API environment file exists - template: - src: public-openrc.sh.j2 - dest: "{{ public_openrc_kolla_config_path }}/public-openrc.sh" - when: admin_openrc is not skipped diff --git a/ansible/roles/public-openrc/templates/public-openrc.sh.j2 b/ansible/roles/public-openrc/templates/public-openrc.sh.j2 deleted file mode 100644 index e0c5e400b..000000000 --- a/ansible/roles/public-openrc/templates/public-openrc.sh.j2 +++ /dev/null @@ -1,22 +0,0 @@ -# {{ kayobe_managed }} - -{% for line in (admin_openrc.content | b64decode).splitlines() %} -{% if "export OS_AUTH_URL" in line %} -export OS_AUTH_URL={{ public_openrc_auth_url }} -{% elif "export OS_INTERFACE" in line %} -export OS_INTERFACE=public -{% elif "export OS_ENDPOINT_TYPE" in line %} -export OS_ENDPOINT_TYPE=publicURL -{% elif "export OS_MANILA_ENDPOINT_TYPE" in line %} -export OS_MANILA_ENDPOINT_TYPE=publicURL -{% elif "export OS_MISTRAL_ENDPOINT_TYPE" in line %} -export OS_MISTRAL_ENDPOINT_TYPE=publicURL -{% elif "export OS_CACERT" in line %} -{# NOTE(bbezak): drop admin OS_CACERT; public-openrc sets its own. -#} -{% else %} -{{ line }} -{% endif %} -{% endfor %} -{% if kolla_public_openrc_cacert is not none %} -export OS_CACERT={{ kolla_public_openrc_cacert }} -{% endif %} diff --git a/kayobe/cli/commands.py b/kayobe/cli/commands.py index d6f4a9c47..c019f4a41 100644 --- a/kayobe/cli/commands.py +++ b/kayobe/cli/commands.py @@ -265,8 +265,7 @@ class ControlHostBootstrap(KayobeAnsibleMixin, KollaAnsibleMixin, VaultMixin, * Downloads and installs Ansible roles from Galaxy. * Generates an SSH key for the Ansible control host, if one does not exist. * Installs kolla-ansible on the Ansible control host. - * Generates admin-openrc.sh and public-openrc.sh files when passwords.yml - exists. + * Generates openrc files when passwords.yml exists. """ def get_parser(self, prog_name): @@ -330,15 +329,9 @@ def take_action(self, parsed_args): if passwords_exist: # If we are bootstrapping a control host for an existing - # environment, we should also generate the admin-openrc.sh and - # public-openrc.sh scripts that provide admin credentials. - + # environment, we should also generate the openrc scripts that + # provide admin credentials. self.run_kolla_ansible_overcloud(parsed_args, "post-deploy") - # Create an environment file for accessing the public API as the - # admin user. - playbooks = _build_playbook_list("public-openrc") - self.run_kayobe_playbooks(parsed_args, playbooks, - ignore_limit=True) if parsed_args.add_known_hosts: self.app.LOG.debug("Adding to known_hosts") @@ -1784,10 +1777,6 @@ def take_action(self, parsed_args): # Post-deployment configuration. self.run_kolla_ansible_overcloud(parsed_args, "post-deploy") - # Create an environment file for accessing the public API as the admin - # user. - playbooks = _build_playbook_list("public-openrc") - self.run_kayobe_playbooks(parsed_args, playbooks, ignore_limit=True) class OvercloudServiceDeployContainers(KollaAnsibleMixin, KayobeAnsibleMixin, @@ -1940,10 +1929,6 @@ def take_action(self, parsed_args): # Post-deployment configuration. self.run_kolla_ansible_overcloud(parsed_args, "post-deploy") - # Create an environment file for accessing the public API as the admin - # user. - playbooks = _build_playbook_list("public-openrc") - self.run_kayobe_playbooks(parsed_args, playbooks, ignore_limit=True) class OvercloudServiceStop(KollaAnsibleMixin, KayobeAnsibleMixin, VaultMixin, @@ -2049,10 +2034,6 @@ def take_action(self, parsed_args): # Post-deployment configuration. self.run_kolla_ansible_overcloud(parsed_args, "post-deploy") - # Create an environment file for accessing the public API as the admin - # user. - playbooks = _build_playbook_list("public-openrc") - self.run_kayobe_playbooks(parsed_args, playbooks, ignore_limit=True) class OvercloudServiceDestroy(KollaAnsibleMixin, KayobeAnsibleMixin, diff --git a/kayobe/tests/unit/cli/test_commands.py b/kayobe/tests/unit/cli/test_commands.py index 8cda090b0..547747cd2 100644 --- a/kayobe/tests/unit/cli/test_commands.py +++ b/kayobe/tests/unit/cli/test_commands.py @@ -207,11 +207,6 @@ def test_control_host_bootstrap_with_passwords( ignore_limit=True, check=False, ), - mock.call( - mock.ANY, - [utils.get_data_files_path("ansible", "public-openrc.yml")], - ignore_limit=True - ), ] self.assertListEqual(expected_calls, mock_run.call_args_list) @@ -1880,13 +1875,6 @@ def test_overcloud_service_deploy(self, mock_kolla_run, mock_run): "manage_containers_target_hosts": "overcloud", }, ), - mock.call( - mock.ANY, - [ - utils.get_data_files_path("ansible", "public-openrc.yml"), - ], - ignore_limit=True, - ), ] self.assertListEqual(expected_calls, mock_run.call_args_list) @@ -2047,13 +2035,6 @@ def test_overcloud_service_reconfigure(self, mock_kolla_run, mock_run): "manage_containers_target_hosts": "overcloud", }, ), - mock.call( - mock.ANY, - [ - utils.get_data_files_path("ansible", "public-openrc.yml"), - ], - ignore_limit=True, - ), ] self.assertListEqual(expected_calls, mock_run.call_args_list) @@ -2182,14 +2163,6 @@ def test_overcloud_service_upgrade(self, mock_kolla_run, mock_run): "manage_containers_target_hosts": "overcloud", } ), - mock.call( - mock.ANY, - [ - utils.get_data_files_path("ansible", - "public-openrc.yml"), - ], - ignore_limit=True, - ), ] self.assertListEqual(expected_calls, mock_run.call_args_list) diff --git a/releasenotes/notes/use-kolla-public-openrc-17f699344c3ca318.yaml b/releasenotes/notes/use-kolla-public-openrc-17f699344c3ca318.yaml new file mode 100644 index 000000000..d6693e81a --- /dev/null +++ b/releasenotes/notes/use-kolla-public-openrc-17f699344c3ca318.yaml @@ -0,0 +1,10 @@ +--- +upgrade: + - | + Use the ``public-openrc.sh`` generated by Kolla Ansible instead of + generating our own. This may result in minor changes to this file. +fixes: + - | + Fixes wrong values of ``OS_AUTH_URL`` in ``public-openrc.sh`` when using a + single external frontend in HAProxy. + `LP#2168467 `__ From 4391ed2cb78178705e8e698eee6eaa729838f14b Mon Sep 17 00:00:00 2001 From: Pierre Riteau Date: Fri, 16 Oct 2026 15:57:08 +0200 Subject: [PATCH 3/9] CI: Remove mention of Docker storage These devices were originally used by devicemapper tests which were removed. They are still used for software RAID and LVM tests, so rename them to "storage". Change-Id: Ia5ae70b16c43e309ff55ed7d9e088d34449b4b3f Signed-off-by: Pierre Riteau --- .../kayobe-ansible-control-host-configure-base/pre.yml | 8 ++++---- playbooks/kayobe-overcloud-host-configure-base/pre.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/playbooks/kayobe-ansible-control-host-configure-base/pre.yml b/playbooks/kayobe-ansible-control-host-configure-base/pre.yml index 41690184f..aaa8813b1 100644 --- a/playbooks/kayobe-ansible-control-host-configure-base/pre.yml +++ b/playbooks/kayobe-ansible-control-host-configure-base/pre.yml @@ -28,12 +28,12 @@ # NOTE(mgoddard): Create two loopback devices backed by files. These will # be added to a software RAID volume, then added to an LVM volume group. - - name: Ensure a docker storage backing file exists - command: truncate -s 2G /tmp/docker-storage{{ item }} + - name: Ensure a storage backing file exists + command: truncate -s 2G /tmp/storage{{ item }} loop: [0, 1] - - name: Ensure the docker storage loopback device is created - command: losetup /dev/loop{{ item }} /tmp/docker-storage{{ item }} + - name: Ensure the storage loopback device is created + command: losetup /dev/loop{{ item }} /tmp/storage{{ item }} become: true loop: [0, 1] diff --git a/playbooks/kayobe-overcloud-host-configure-base/pre.yml b/playbooks/kayobe-overcloud-host-configure-base/pre.yml index 424baf458..95f17d72a 100644 --- a/playbooks/kayobe-overcloud-host-configure-base/pre.yml +++ b/playbooks/kayobe-overcloud-host-configure-base/pre.yml @@ -16,12 +16,12 @@ # NOTE(mgoddard): Create two loopback devices backed by files. These will # be added to a software RAID volume, then added to an LVM volume group. - - name: Ensure a docker storage backing file exists - command: truncate -s 2G /tmp/docker-storage{{ item }} + - name: Ensure a storage backing file exists + command: truncate -s 2G /tmp/storage{{ item }} loop: [0, 1] - - name: Ensure the docker storage loopback device is created - command: losetup /dev/loop{{ item }} /tmp/docker-storage{{ item }} + - name: Ensure the storage loopback device is created + command: losetup /dev/loop{{ item }} /tmp/storage{{ item }} become: true loop: [0, 1] From 5fcde99cc1eeda50c6f74efefb1bbad70c102ed1 Mon Sep 17 00:00:00 2001 From: OpenStack Release Bot Date: Mon, 19 Oct 2026 10:58:25 +0000 Subject: [PATCH 4/9] Update master for stable/2026.2 Add file to the reno documentation build to show release notes for stable/2026.2. Use pbr instruction to increment the minor version number automatically so that master versions are higher than the versions on stable/2026.2. Sem-Ver: feature Change-Id: I080dd8eda2c593b087f0a27800c90dde2adfc62b Signed-off-by: OpenStack Release Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/add_release_note_page.sh --- releasenotes/source/2026.2.rst | 6 ++++++ releasenotes/source/index.rst | 1 + 2 files changed, 7 insertions(+) create mode 100644 releasenotes/source/2026.2.rst diff --git a/releasenotes/source/2026.2.rst b/releasenotes/source/2026.2.rst new file mode 100644 index 000000000..a423bf972 --- /dev/null +++ b/releasenotes/source/2026.2.rst @@ -0,0 +1,6 @@ +=========================== +2026.2 Series Release Notes +=========================== + +.. release-notes:: + :branch: stable/2026.2 diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst index 4b784937a..6efd23a98 100644 --- a/releasenotes/source/index.rst +++ b/releasenotes/source/index.rst @@ -6,6 +6,7 @@ Kayobe Release Notes :maxdepth: 1 unreleased + 2026.2 2026.1 2025.2 2025.1 From 5dd47d98cad71c1459dc092407004a111d5ec229 Mon Sep 17 00:00:00 2001 From: Rafal Lewandowski Date: Mon, 19 Oct 2026 15:44:47 +0200 Subject: [PATCH 5/9] Revert "[release] Use OpenStack 2026.2 release" This reverts commit d9620f276f799a0e2f67aeb58345401da893f4f1. Change-Id: Ic7ee64dd880e0b972604d0c0cdcee7355b498c41 Signed-off-by: Rafal Lewandowski --- ansible/inventory/group_vars/all/openstack | 6 +++--- etc/kayobe/openstack.yml | 4 ++-- requirements.yml | 2 +- tox.ini | 8 ++++---- zuul.d/jobs.yaml | 8 -------- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/ansible/inventory/group_vars/all/openstack b/ansible/inventory/group_vars/all/openstack index be905c902..430293d3f 100644 --- a/ansible/inventory/group_vars/all/openstack +++ b/ansible/inventory/group_vars/all/openstack @@ -2,10 +2,10 @@ ############################################################################### # OpenStack release configuration. -# Name of the current OpenStack release. Default is "2026.2". -openstack_release: "2026.2" +# Name of the current OpenStack release. Default is "master". +openstack_release: "master" -# Name of the current OpenStack branch. Default is "stable/2026.2". +# Name of the current OpenStack branch. Default is "master". openstack_branch: >- {% if openstack_release != 'master' %}stable/{% endif %}{{ openstack_release | lower }} diff --git a/etc/kayobe/openstack.yml b/etc/kayobe/openstack.yml index d4a919d40..1acfd0756 100644 --- a/etc/kayobe/openstack.yml +++ b/etc/kayobe/openstack.yml @@ -2,10 +2,10 @@ ############################################################################### # OpenStack release configuration. -# Name of the current OpenStack release. Default is "2026.2". +# Name of the current OpenStack release. Default is "master". #openstack_release: -# Name of the current OpenStack branch. Default is "stable/2026.2". +# Name of the current OpenStack branch. Default is "master". #openstack_branch: ############################################################################### diff --git a/requirements.yml b/requirements.yml index b8bf2d7e0..679bfa833 100644 --- a/requirements.yml +++ b/requirements.yml @@ -4,7 +4,7 @@ collections: version: 1.3.0 - name: https://opendev.org/openstack/ansible-collection-kolla type: git - version: stable/2026.2 + version: master - name: cisco.nxos version: 13.0.0 - name: community.docker diff --git a/tox.ini b/tox.ini index bcbf5d7db..582a843cd 100644 --- a/tox.ini +++ b/tox.ini @@ -20,7 +20,7 @@ setenv = OS_TEST_TIMEOUT=60 ANSIBLE_VERBOSITY=3 deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2026.2} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = stestr run {posargs} @@ -43,7 +43,7 @@ commands = [testenv:venv] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2026.2} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/test-requirements.txt -r{toxinidir}/doc/requirements.txt commands = {posargs} @@ -61,7 +61,7 @@ commands = [testenv:molecule] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2026.2} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt -r{toxinidir}/molecule-requirements.txt commands = @@ -131,7 +131,7 @@ commands = [testenv:docs] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2026.2} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/doc/requirements.txt commands = rm -rf doc/build/html diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 87e91dec5..8bc738bc9 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -93,19 +93,11 @@ required-projects: # Include kayobe to ensure other projects can use this job. - name: openstack/ansible-collection-kolla - # TODO(rlewandowski): Remove when kayobe stable/2026.2 exists. - override-checkout: stable/2026.2 - name: openstack/kayobe - name: openstack/kayobe-config-dev - name: openstack/kolla - # TODO(rlewandowski): Remove when kayobe stable/2026.2 exists. - override-checkout: stable/2026.2 - name: openstack/kolla-ansible - # TODO(rlewandowski): Remove when kayobe stable/2026.2 exists. - override-checkout: stable/2026.2 - name: openstack/requirements - # TODO(rlewandowski): Remove when kayobe stable/2026.2 exists. - override-checkout: stable/2026.2 - name: openstack/tenks irrelevant-files: - ^\..+ From d908dde8233fd10cb615785648e10f4ccd9068c1 Mon Sep 17 00:00:00 2001 From: Rafal Lewandowski Date: Mon, 19 Oct 2026 16:01:30 +0200 Subject: [PATCH 6/9] CI: Set previous_release for 2027.1 Indri Change-Id: I5ac9096c515a1442dd1726da18853f86851bd450 Signed-off-by: Rafal Lewandowski --- zuul.d/jobs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 8bc738bc9..49239c0ce 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -128,7 +128,7 @@ tenks_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/tenks'].src_dir }}" is_upgrade: "{{ 'upgrade' in zuul.job }}" is_slurp: "{{ 'slurp' in zuul.job }}" - previous_release: "{{ '2026.1' if is_slurp else '2026.1' }}" + previous_release: "{{ '2026.1' if is_slurp else '2026.2' }}" tls_enabled: false fail2ban_enabled: false container_engine: 'docker' From cd97b3d81247e7a62fc437422ef675f81a4d4ab0 Mon Sep 17 00:00:00 2001 From: Rafal Lewandowski Date: Mon, 19 Oct 2026 16:41:41 +0200 Subject: [PATCH 7/9] CI: enable SLURP jobs on master Change-Id: Iac375deb93031f17aa9948e417b8297f0c639a03 Signed-off-by: Rafal Lewandowski --- zuul.d/project.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index 3051acb16..df890dd52 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -29,12 +29,16 @@ - kayobe-overcloud-ubuntu-noble - kayobe-overcloud-ubuntu-noble-podman - kayobe-overcloud-upgrade-rocky10 + - kayobe-overcloud-upgrade-slurp-rocky10 + - kayobe-overcloud-upgrade-slurp-ubuntu-noble - kayobe-overcloud-upgrade-ubuntu-noble - kayobe-seed-rocky10 - kayobe-seed-rocky10-podman - kayobe-seed-ubuntu-noble - kayobe-seed-ubuntu-noble-podman - kayobe-seed-upgrade-rocky10 + - kayobe-seed-upgrade-slurp-rocky10 + - kayobe-seed-upgrade-slurp-ubuntu-noble - kayobe-seed-upgrade-ubuntu-noble - kayobe-seed-vm-rocky10 - kayobe-seed-vm-ubuntu-noble @@ -58,12 +62,16 @@ - kayobe-overcloud-ubuntu-noble - kayobe-overcloud-ubuntu-noble-podman - kayobe-overcloud-upgrade-rocky10 + - kayobe-overcloud-upgrade-slurp-rocky10 + - kayobe-overcloud-upgrade-slurp-ubuntu-noble - kayobe-overcloud-upgrade-ubuntu-noble - kayobe-seed-rocky10 - kayobe-seed-rocky10-podman - kayobe-seed-ubuntu-noble - kayobe-seed-ubuntu-noble-podman - kayobe-seed-upgrade-rocky10 + - kayobe-seed-upgrade-slurp-rocky10 + - kayobe-seed-upgrade-slurp-ubuntu-noble - kayobe-seed-upgrade-ubuntu-noble - kayobe-seed-vm-rocky10 - kayobe-seed-vm-ubuntu-noble From 266f45032c3761aba05b5c39a28338dd942b83d4 Mon Sep 17 00:00:00 2001 From: Saad Tariq Date: Mon, 19 Oct 2026 15:25:48 +0100 Subject: [PATCH 8/9] CI: Enable Cinder with an NFS backend Enable Cinder in the overcloud base job to give block storage deployment some test coverage Add a test which boots a server from a Cinder volume, covering volume creation, attachment and boot. It runs only when Cinder is enabled. Change-Id: Ia0e38c42f88367a97ba47442642828e817a06d47 Signed-off-by: Saad Tariq --- dev/functions | 45 ++++++++++++++++++- dev/overcloud-test-vm.sh | 4 ++ .../kayobe-overcloud-base/overrides.yml.j2 | 7 +++ playbooks/kayobe-overcloud-base/pre.yml | 41 +++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/dev/functions b/dev/functions index 2a282a819..7c70753d3 100644 --- a/dev/functions +++ b/dev/functions @@ -692,6 +692,34 @@ function overcloud_test_inspect { openstack baremetal node provide "$node" --wait } +function overcloud_test_wait_for_volume { + # Wait for a volume to become available. Arguments: + # $1: The name of the volume. + set -eu + + local volume="$1" + local attempts=30 + local status + + for i in $(seq 1 $attempts); do + status=$(openstack volume show "$volume" -f value -c status) + if [[ $status = available ]]; then + echo "$volume: Volume is available" + return 0 + elif [[ $status = error ]]; then + echo "$volume: Volume is in the error state" + openstack volume show "$volume" + return 1 + fi + echo "$volume: Volume is $status - retrying" + sleep 10 + done + + echo "$volume: Volume did not become available after $attempts attempts" + openstack volume show "$volume" + return 1 +} + function overcloud_test { set -eu @@ -699,6 +727,8 @@ function overcloud_test { name="$1" flavor="$2" network="$3" + # Boot the server from a Cinder volume rather than from the image. + boot_from_volume="${4:-false}" node_config="{ 'name': '$name', 'flavor': '$flavor', 'network': '$network' }" @@ -708,7 +738,14 @@ function overcloud_test { echo "Performing a simple smoke test with node config: $node_config" echo "$name: Creating a server" - openstack server create --wait --image cirros --flavor "$flavor" --key-name mykey --network "$network" "$name" + if [[ $boot_from_volume = true ]]; then + echo "$name: Creating a bootable volume from the cirros image" + openstack volume create --image cirros --size 1 "${name}-volume" + overcloud_test_wait_for_volume "${name}-volume" + openstack server create --wait --volume "${name}-volume" --flavor "$flavor" --key-name mykey --network "$network" "$name" + else + openstack server create --wait --image cirros --flavor "$flavor" --key-name mykey --network "$network" "$name" + fi echo "$name: Server created" openstack server show "$name" status=$(openstack server show "$name" -f value -c status) @@ -760,6 +797,12 @@ function overcloud_test { echo "$name: Deleting the Node" openstack server delete --wait "$name" + + if [[ $boot_from_volume = true ]]; then + echo "$name: Deleting the volume" + overcloud_test_wait_for_volume "${name}-volume" + openstack volume delete "${name}-volume" + fi } function write_bifrost_clouds_yaml { diff --git a/dev/overcloud-test-vm.sh b/dev/overcloud-test-vm.sh index 44c37d8ca..a4a5e98b5 100755 --- a/dev/overcloud-test-vm.sh +++ b/dev/overcloud-test-vm.sh @@ -11,6 +11,10 @@ source "${PARENT}/functions" function main { config_init overcloud_test vm1 m1.tiny demo-net + if is_cinder_enabled; then + # Boot a server from a Cinder volume to test the block storage backend. + overcloud_test vm2 m1.tiny demo-net true + fi } main diff --git a/playbooks/kayobe-overcloud-base/overrides.yml.j2 b/playbooks/kayobe-overcloud-base/overrides.yml.j2 index 5151919f7..ee83661fb 100644 --- a/playbooks/kayobe-overcloud-base/overrides.yml.j2 +++ b/playbooks/kayobe-overcloud-base/overrides.yml.j2 @@ -48,6 +48,13 @@ kolla_enable_horizon: false # Enable Mariabackup for testing database backups kolla_enable_mariabackup: true +# Enable Cinder with an NFS backend to test block storage. +kolla_enable_cinder: true +kolla_enable_cinder_backend_nfs: true + +# Cinder backup defaults to the Ceph driver, and no Ceph cluster is deployed. +kolla_enable_cinder_backup: false + {% if tls_enabled %} kolla_enable_nova_libvirt_container: false compute_libvirt_enable_tls: true diff --git a/playbooks/kayobe-overcloud-base/pre.yml b/playbooks/kayobe-overcloud-base/pre.yml index a91fbe65b..436bcfe60 100644 --- a/playbooks/kayobe-overcloud-base/pre.yml +++ b/playbooks/kayobe-overcloud-base/pre.yml @@ -26,6 +26,47 @@ src: globals.yml.j2 dest: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/globals.yml" + # Export an NFS share from this node for Cinder's NFS backend to use. + - name: Ensure the NFS server package is installed + package: + name: "{{ 'nfs-kernel-server' if ansible_facts.os_family == 'Debian' else 'nfs-utils' }}" + state: present + become: true + + - name: Ensure the Cinder NFS export directory exists + file: + path: /export/cinder + state: directory + mode: "0755" + become: true + + - name: Ensure the Cinder NFS share is exported + # Kolla sets nas_secure_file_operations=false, so Cinder writes as root. + copy: + content: "/export/cinder 192.168.33.0/24(rw,sync,no_subtree_check,no_root_squash)\n" + dest: /etc/exports + mode: "0644" + become: true + + - name: Ensure the NFS server is running + service: + name: "{{ 'nfs-kernel-server' if ansible_facts.os_family == 'Debian' else 'nfs-server' }}" + state: started + enabled: true + become: true + + - name: Ensure the Cinder NFS share is active + command: exportfs -ra + become: true + + # The share is reached over the storage network, which is the flat aio + # network in this environment. + - name: Ensure the Cinder NFS shares file exists + copy: + content: "192.168.33.3:/export/cinder\n" + dest: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/config/nfs_shares" + mode: "0644" + - name: Configure Tenks to use UEFI boot mode replace: path: "{{ kayobe_src_dir }}/dev/tenks-deploy-config-compute.yml" From c603d98127b3a3a3e9ed7377d0cc00f6c03a1c94 Mon Sep 17 00:00:00 2001 From: Leonie Chamberlin-Medd Date: Wed, 30 Sep 2026 14:46:22 +0100 Subject: [PATCH 9/9] Add overcloud-init.sh Adds a new script to call the config_init and overcloud_test_init functions for use in CI. This is useful for operators writing custom CI tests. Change-Id: Idb7f4aa55fafea16c7df912c3efc60ba3633db4c Signed-off-by: Leonie Chamberlin-Medd --- dev/overcloud-init.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 dev/overcloud-init.sh diff --git a/dev/overcloud-init.sh b/dev/overcloud-init.sh new file mode 100755 index 000000000..7d52771eb --- /dev/null +++ b/dev/overcloud-init.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -eu +set -o pipefail + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source "${PARENT}/functions" + + +function main { + config_init + overcloud_test_init +} + +main