Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
71daddd
feat(deploy): add parallel deployment orchestrator
mnaser Apr 12, 2026
9177ac3
ci(molecule): use parallel orchestrator for all scenarios
mnaser Apr 13, 2026
8036e99
fix(deploy): correct component dependency graph
mnaser Apr 13, 2026
9022a77
ci(molecule): add Go toolchain to Zuul pre-run and build env
mnaser Apr 13, 2026
7e6c891
fix(deploy): use fully-qualified collection role names
mnaser Apr 13, 2026
c27f333
refactor(deploy): use FQCN for all Ansible references
mnaser Apr 13, 2026
cc2a4b3
feat(deploy): add resource locks and apt retry handling
mnaser Apr 13, 2026
191e8d5
fix(deploy): add apt resource to host-config roles and fix idempotence
mnaser Apr 13, 2026
0633d62
fix(deploy): use double-quoted YAML for environment values
mnaser Apr 13, 2026
10d91d9
fix(deploy): ipmi-exporter depends on kube-prometheus-stack
mnaser Apr 13, 2026
f5ceb1e
fix(deploy): add memcached dep for openstack namespace creation
mnaser Apr 13, 2026
f3d3940
fix(deploy): prometheus-pushgateway depends on kube-prometheus-stack
mnaser Apr 13, 2026
0a5b093
ci(molecule): install Python kubernetes lib in pre-run
mnaser Apr 13, 2026
1af2e88
fix(deploy): add cluster-issuer dep for cert-manager CRD users
mnaser Apr 13, 2026
01c7efb
fix(deploy): kube-prometheus-stack depends on keycloak
mnaser Apr 13, 2026
0e33edc
fix(deploy): rook-ceph-cluster depends on keystone
mnaser Apr 13, 2026
9a6b524
fix(deploy): manila depends on nova, neutron, and cinder
mnaser Apr 13, 2026
1863f96
fix(deploy): rook-ceph-cluster depends on barbican for service domain
invalid-email-address Apr 13, 2026
08f8b49
ci(molecule): stream deploy output directly via Zuul run playbook
invalid-email-address Apr 13, 2026
b1a54c2
refactor(molecule): unify converge to use atmosphere_deploy_tags
invalid-email-address Apr 13, 2026
654beba
fix(deploy): cinder depends on ceph-provisioners for storage
invalid-email-address Apr 13, 2026
e5c4f7e
fix(deploy): ceph-provisioners depends on ceph+csi, remove duplicate …
invalid-email-address Apr 13, 2026
b7a6940
ci(molecule): run converge playbooks directly from Zuul
invalid-email-address Apr 13, 2026
d34ff5d
fix(molecule): run build and deploy on remote instance, not executor
invalid-email-address Apr 13, 2026
b63287c
fix(molecule): use relative binary path in converge.yml deploy tasks
Copilot Apr 13, 2026
fb5e4c2
fix(molecule): add venv PATH to deploy task so ansible-playbook is found
Copilot Apr 13, 2026
55dcb0c
fix(molecule): activate venv via shell to get absolute ansible-playbo…
Copilot Apr 13, 2026
6eaf6bb
fix(deploy): neutron depends on nova for availability zone
invalid-email-address Apr 14, 2026
3d8d57e
fix(deploy): add preflight checks to catch bypassed pre_tasks
larainema Apr 14, 2026
44d609b
fix(deploy): add context cancellation to resource coordinator
ricolin Apr 15, 2026
f8cf17b
fix(ci): set explicit ceph_public_network for molecule jobs
ricolin Apr 15, 2026
9a73b71
fix: ceph doesn't need apt
mnaser Apr 18, 2026
f692157
fix: pxc doesnt need memcached
mnaser Apr 18, 2026
be5be84
fix: keyclaok doesnt need valkey
mnaser Apr 18, 2026
b328a77
fix: keepalived doesnt need memcached
mnaser Apr 18, 2026
f2519eb
feat(deploy): add intra-component parallelism via pre-roles
ricolin Apr 23, 2026
3d05127
feat(deploy): schedule DAG with per-node readiness instead of wave ba…
ricolin Apr 24, 2026
2ce4246
feat(deploy): prioritise ready nodes by critical path under concurren…
ricolin Apr 24, 2026
1c16f68
docs(reno): reflect current parallel deploy behaviour
Apr 24, 2026
c08f2a5
test(deploy): make orchestrator tests hermetic and gate go test in CI
ricolin Apr 24, 2026
f55ac98
chore: add SPDX license headers to new files
ricolin Apr 24, 2026
2a38348
ci(ansible-lint): name plays and mock ensure-go role for go-test play…
Apr 24, 2026
26db7be
fix(deploy): reap subprocess descendants on context cancel
Apr 27, 2026
4e99cfe
docs: document parallel deployment orchestrator
May 5, 2026
6a088f0
fix(deploy): serialize ceph and kubernetes on containerd setup
ricolin May 11, 2026
a7de213
fix(deploy): ceph-provisioners depends on kubernetes
ricolin May 11, 2026
41cc99d
fix(deploy): resolve four critical orchestrator bugs
ricolin May 11, 2026
4c85bd3
test(deploy): fix Keystone variant test to use multi-tag subgraph
ricolin May 11, 2026
e12e084
chore(deploy): keep role split changes stacked
May 26, 2026
1080833
fix(deploy): stabilize parallel orchestrator CI
May 26, 2026
665970a
fix(deploy): unblock Neutron from Nova
May 27, 2026
5cde0db
feat(deploy): add role split parallelism
ricolin May 26, 2026
8bd3bf8
feat: selective-molecule-ci
fitbeard Jul 23, 2026
53fc80a
chore(ci): merge main for Zuul testing
fitbeard Jul 23, 2026
a57df48
fix(ci): use shared Zuul job definitions
fitbeard Jul 23, 2026
ba516b5
fix(ci): install Go for Molecule jobs
fitbeard Jul 23, 2026
8130107
fix(ci): preserve targeted Molecule deployments
fitbeard Jul 23, 2026
bcbdb04
fix(deploy): qualify image upload roles
fitbeard Jul 24, 2026
ce8286d
fix(ci): publish selective plan artifact
fitbeard Jul 24, 2026
06990a5
fix(deploy): serialize OpenStack image preparation
fitbeard Jul 24, 2026
cd07938
ci(molecule): report deployment heartbeat
fitbeard Jul 24, 2026
67139ee
fix(ci): limit AIO deployment concurrency
fitbeard Jul 24, 2026
8720a71
fix(glance): default image properties to mapping
fitbeard Jul 24, 2026
dfb6138
fix(deploy): stabilize AIO OpenStack setup
fitbeard Jul 24, 2026
49da823
fix(ci): configure Ceph network for Molecule
fitbeard Jul 24, 2026
0e80b29
fix(keystone): wait for OIDC metadata
fitbeard Jul 25, 2026
325c2b8
feat(ci): enforce selective Molecule jobs
fitbeard Jul 25, 2026
9570132
fix(ci): run selective deploy in uv environment
fitbeard Jul 25, 2026
4ea1305
fix(ci): restore Ceph network for direct deploy
fitbeard Jul 25, 2026
ba9d326
fix(ci): preserve Ceph container environment
fitbeard Jul 25, 2026
a0f73cf
fix(ceph): create provisioner namespace first
fitbeard Jul 25, 2026
9d4408f
fix(deploy): serialize CA trust updates
fitbeard Jul 25, 2026
af7fe27
test(ci): exercise Keystone selective plan
fitbeard Jul 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .ansible-lint
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ exclude_paths:
- zuul.d

mock_roles:
- ensure-go
- opendev.container_registry

skip_list:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@ atmosphere/_version.py
[._]*.un~
Session.vim
Sessionx.vim
bin/
31 changes: 31 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright (c) 2026 VEXXHOST, Inc.
# SPDX-License-Identifier: Apache-2.0

version: 2

builds:
- id: atmosphere
main: ./cmd/atmosphere
binary: atmosphere
env:
- CGO_ENABLED=0
goos:
- linux
goarch:
- amd64
- arm64
ldflags:
- -s -w

archives:
- id: atmosphere
builds:
- atmosphere
format: tar.gz
name_template: "atmosphere_{{ .Version }}_{{ .Os }}_{{ .Arch }}"

checksum:
name_template: "checksums.txt"

changelog:
sort: asc
96 changes: 94 additions & 2 deletions .zuul.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,95 @@
- job:
name: atmosphere-molecule-aio-openvswitch-selective
parent: atmosphere-molecule-aio-openvswitch
pre-run:
- test-playbooks/molecule/prepare.yml
run:
- test-playbooks/molecule/selective-run.yml
vars:
atmosphere_ci_job: aio-openvswitch

- job:
name: atmosphere-molecule-aio-ovn-selective
parent: atmosphere-molecule-aio-ovn
pre-run:
- test-playbooks/molecule/prepare.yml
run:
- test-playbooks/molecule/selective-run.yml
vars:
atmosphere_ci_job: aio-ovn

- job:
name: atmosphere-molecule-csi-local-path-provisioner-selective
parent: atmosphere-molecule-csi-local-path-provisioner
pre-run:
- test-playbooks/molecule/prepare.yml
run:
- test-playbooks/molecule/selective-run.yml
vars:
atmosphere_ci_job: csi-local-path-provisioner
atmosphere_deploy_tags:
- kubernetes
- csi

- job:
name: atmosphere-molecule-csi-rbd-selective
parent: atmosphere-molecule-csi-rbd
pre-run:
- test-playbooks/molecule/prepare.yml
run:
- test-playbooks/molecule/selective-run.yml
vars:
atmosphere_ci_job: csi-rbd
atmosphere_deploy_tags:
- ceph
- kubernetes
- csi

- job:
name: atmosphere-molecule-keycloak-selective
parent: atmosphere-molecule-keycloak
pre-run:
- test-playbooks/molecule/prepare.yml
run:
- test-playbooks/molecule/selective-run.yml
vars:
atmosphere_ci_job: keycloak
atmosphere_deploy_tags:
- kubernetes
- csi
- cert-manager
- cluster-issuer
- ingress-nginx
- rabbitmq-cluster-operator
- percona-xtradb-cluster-operator
- percona-xtradb-cluster
- valkey
- memcached
- keycloak
- kube-prometheus-stack
- keystone
- horizon

- project:
templates:
- atmosphere-molecule-jobs
vars:
atmosphere_ci_plan_base: "origin/{{ zuul.branch }}"
ceph_public_network: >-
{{
ansible_facts['default_ipv4']['network']
+ '/'
+ (ansible_facts['default_ipv4']['prefix'] | string)
}}
check:
jobs:
- atmosphere-molecule-aio-openvswitch-selective
- atmosphere-molecule-aio-ovn-selective
- atmosphere-molecule-csi-local-path-provisioner-selective
- atmosphere-molecule-csi-rbd-selective
- atmosphere-molecule-keycloak-selective
gate:
jobs:
- atmosphere-molecule-aio-openvswitch-selective
- atmosphere-molecule-aio-ovn-selective
- atmosphere-molecule-csi-local-path-provisioner-selective
- atmosphere-molecule-csi-rbd-selective
- atmosphere-molecule-keycloak-selective
233 changes: 233 additions & 0 deletions ci/molecule-plan.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
---
version: 1

# Ordinary service changes use the current Atmosphere default backend. Direct
# networking changes can opt into both variants below.
canonical_network_backend: openvswitch
full_network_backends:
- openvswitch
- ovn

# The AIO Molecule inventory uses local-path storage for Kubernetes workloads.
# OpenStack services which require Ceph still pull it into their closure through
# ceph-provisioners and their service dependencies.
dependency_options:
csi_driver: local-path-provisioner

full_verification_profiles:
- full

# Zuul jobs are static, but each job consumes an explicit decision from the
# plan. Backend jobs run the matching AIO variant. Dedicated scenario jobs run
# only when one of their verification profiles is requested.
jobs:
aio-openvswitch:
scenario: aio
network_backend: openvswitch
skip_if_only_verification_profiles:
- csi
- keycloak-federation

aio-ovn:
scenario: aio
network_backend: ovn
skip_if_only_verification_profiles:
- csi
- keycloak-federation

csi-local-path-provisioner:
scenario: csi
verification_profiles:
- csi

csi-rbd:
scenario: csi
verification_profiles:
- csi

keycloak:
scenario: keycloak
verification_profiles:
- keycloak-federation

rules:
- name: planner-policy
action: full
reason: CI selection policy changed and must validate its conservative fallback
paths:
- ci/molecule-plan.yaml
- cmd/atmosphere/ci.go
- cmd/atmosphere/deploy.go
- cmd/atmosphere/main.go
- internal/ciplan/**
- internal/deploy/component.go
- internal/deploy/orchestrator.go
- pkg/dag/**
- molecule/aio/**
- test-playbooks/molecule/**
- .zuul.yaml
- tox.ini

- name: shared-deployment-code
action: full
reason: shared deployment code can affect multiple unrelated components
paths:
- .charts.yml
- galaxy.yml
- go.mod
- go.sum
- pyproject.toml
- requirements.txt
- uv.lock
- playbooks/generate_workspace.yml
- playbooks/infrastructure.yml
- playbooks/monitoring.yml
- playbooks/openstack.yml
- playbooks/site.yml
- molecule/shared/**
- plugins/**
- roles/defaults/**
- roles/ingress/**
- roles/openstack_helm_endpoints/**
- roles/openstack_helm_ingress/**
- roles/openstacksdk/**
- roles/rabbitmq/**
- roles/tempest/**
- charts/tempest/**
- charts/patches/tempest/**

- name: openvswitch-runtime
action: targets
targets:
- openvswitch
verification_profiles:
- openvswitch
network_backends:
- openvswitch
paths:
- Cargo.lock
- Cargo.toml
- crates/ovsinit/**

- name: non-runtime
action: ignore
paths:
- .agents/**
- .github/**
- .gitignore
- .gitreview
- .pre-commit-config.yaml
- .vale.ini
- AGENTS.md
- CLAUDE.md
- CODEOWNERS
- LICENSE
- README.md
- doc/**
- releasenotes/**
- reno.yaml
- renovate.json

components:
cert-manager:
paths:
- charts/cert-manager-webhook-infoblox-wapi/**
- charts/patches/cert-manager-webhook-infoblox-wapi/**
- charts/godaddy-webhook/**
- charts/patches/godaddy-webhook/**
verification_profiles:
- cert-manager

csi:
paths:
- roles/ceph_csi_rbd/**
- roles/local_path_provisioner/**
- roles/powerstore_csi/**
- roles/portworx/**
- roles/storpool_csi/**
- roles/ibm_block_csi_driver/**
- charts/ceph-csi-rbd/**
- charts/local-path-provisioner/**
verification_profiles:
- csi

percona-xtradb-cluster-operator:
paths:
- charts/pxc-operator/**
- charts/patches/pxc-operator/**
verification_profiles:
- percona-xtradb-cluster

keycloak:
test_requires:
- keystone
verification_profiles:
- identity
- keycloak-federation

keystone:
verification_profiles:
- identity
- keycloak-federation

glance:
verification_profiles:
- image

cinder:
verification_profiles:
- volume

placement:
verification_profiles:
- placement

nova:
test_requires:
- glance-images
- neutron
verification_profiles:
- compute
network_backends:
- canonical

neutron:
verification_profiles:
- network
network_backends:
- openvswitch
- ovn

heat:
test_requires:
- glance-images
- neutron
verification_profiles:
- orchestration
network_backends:
- canonical

octavia:
verification_profiles:
- load-balancer
network_backends:
- canonical

manila:
verification_profiles:
- shared-file-system
network_backends:
- canonical

magnum:
test_requires:
- barbican
- cinder
- glance-images
- heat
- neutron
- octavia
verification_profiles:
- container-infrastructure
network_backends:
- canonical
Loading
Loading