)]}'
{".zuul.yaml":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"44d8301594bc5d0b6f76c3eaf9561a8424e117d1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        ENABLE_PCI_SIM: true"},{"line_number":35,"context_line":"        PCI_SIM_DEVICES: \"cyborg:uart,cyborg:nvme\""},{"line_number":36,"context_line":"        PCI_SIM_NVME_NS_SIZE_MB: 64"},{"line_number":37,"context_line":"        PCI_SIM_NVME_MEMMAP_START: \"0x1c0000000\""},{"line_number":38,"context_line":"        PCI_SIM_NVME_MEMMAP_SIZE: \"0x20000000\""},{"line_number":39,"context_line":"        PCI_SIM_NUM_VFS: 4"},{"line_number":40,"context_line":"        PCI_SIM_ALLOW_UNSAFE_INTERRUPTS: true"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"b2fe79be_96205380","line":37,"updated":"2026-09-09 06:26:58.000000000","message":"cyborg-tempest-base now sets PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000 and PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000 in devstack_localrc and pre-runs playbooks/pci-sim-nvme-pre.yaml. The playbook appends memmap\u003d to GRUB only inside a block gated by \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027. cyborg-tempest-centos-10-stream (experimental and periodic-weekly, family RedHat) defines no vars or pre-run of its own, so it inherits the non-zero memmap vars and the Debian-only playbook. The newly added pci_sim_validate_config dies whenever the memmap vars are non-zero and /proc/cmdline lacks memmap\u003d, so on CentOS stack.sh aborts in load_pci_sim before the module is ever loaded. The Reboot task is outside the Debian block, so CentOS nodes are also rebooted pointlessly first.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Impact**: The periodic-weekly and experimental cyborg-tempest-centos-10-stream jobs fail deterministically at stack.sh (\u0027no memmap\u003d parameter found in /proc/cmdline\u0027), producing false failure signal, losing CentOS coverage for pci-sim, and wasting a reboot on every run. The gate jobs (Debian) are unaffected, so this breakage will not be caught before landing.\n\n**Priority**: Before merge\n**Recommendation**:\nPick one: (a) override PCI_SIM_NVME_MEMMAP_START/SIZE back to \"0\" (or drop the nvme entry from PCI_SIM_DEVICES) for cyborg-tempest-centos-10-stream until the playbook supports it, or (b) extend the pre-run playbook to handle the RedHat family (e.g. grubby --update-kernel\u003dALL --args\u003d\"memmap\u003d512M\\\\$7G\" and skip update-grub). Also consider making the reboot conditional on the GRUB task having changed so non-Debian/already-configured hosts are not rebooted.","commit_id":"43fe839b3444be780a5b4b1cf38ee57bc32f2894"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"503c514c3cab46fd6999fffbb1bb7582fc082b7b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    timeout: 7800"},{"line_number":8,"context_line":"    nodeset: devstack-single-node-debian-trixie"},{"line_number":9,"context_line":"    pre-run:"},{"line_number":10,"context_line":"      - playbooks/pci-sim-nvme-pre.yaml"},{"line_number":11,"context_line":"    required-projects: \u0026base_required_projects"},{"line_number":12,"context_line":"      - openstack/cyborg"},{"line_number":13,"context_line":"      - openstack/python-cyborgclient"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"e390e461_1c60095c","line":10,"updated":"2026-09-09 07:46:01.000000000","message":"The new playbooks/pci-sim-nvme-pre.yaml appends the memmap\u003d kernel parameter only inside a block gated by \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027, but the memmap-enabling devstack_localrc vars (PCI_SIM_NVME_MEMMAP_START/SIZE) are anchored on cyborg-tempest-base and inherited by every child job, including cyborg-tempest-centos-10-stream (nodeset devstack-single-node-centos-10-stream, os family RedHat). On CentOS the GRUB edit is skipped, /proc/cmdline never gains memmap\u003d, and the new pci_sim_validate_config check makes stack.sh die before the module is loaded.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Impact**: cyborg-tempest-centos-10-stream (experimental and periodic-weekly) fails at every run with \u0027PCI_SIM_NVME_MEMMAP_START\u003d... are set, but no memmap\u003d parameter found in /proc/cmdline\u0027, leaving the weekly periodic job red until the playbook or job vars are corrected.\n\n**Priority**: Before merge\n**Recommendation**:\nEither add a RedHat-family branch to the playbook (e.g. grubby --update-kernel\u003dALL --args\u003d\"memmap\u003d{{ size }}M\\\\${{ start }}G\" instead of editing /etc/default/grub) or add a devstack_localrc override to the CentOS job setting PCI_SIM_NVME_MEMMAP_START and PCI_SIM_NVME_MEMMAP_SIZE to \"0\" until GRUB handling for that family exists.","commit_id":"06967c1bea0e7c08f1327aed299eadcfb223d205"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"7c196edf512603c3e127e774edb484ca73381c5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5793058b_6b436b8c","updated":"2026-08-06 09:04:24.000000000","message":"Note ready for review till all the CI passes.","commit_id":"eec55c99af60d8dfca54aa63354b0fa8a144035c"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5c62bf35fe645f7e0d60c545a0d25791a48ff236","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"728f1049_5f67a86a","updated":"2026-08-09 04:29:19.000000000","message":"check experimetnal","commit_id":"4ff6dcc2792847b875d0c5ea31e67a800e7e0cc5"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"ce72551f7e06f49318bab3255240c8dcfc792fe2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"2309e612_b3f4818e","updated":"2026-08-13 06:31:43.000000000","message":"recheck","commit_id":"70c6af093deadc645c99125c56df783611f531e8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"446f0391caed8ee783a57abfde9a406cc6352015","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"bda8f294_84b943df","updated":"2026-08-21 11:45:02.000000000","message":"Note ready for review till above patches, testing and fixing few more stuff.","commit_id":"096a70534ad5e9c0f42c092e0fa30d6af565f172"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2474ea28cd1ba8b13293ed4cc38774c44d86f3c5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"24ba5429_8eaf43e7","updated":"2026-09-07 05:36:09.000000000","message":"recheck","commit_id":"ed79a56e2ea3969fac50e5da087af8434204e3fd"}],"devstack/lib/cyborg":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"eba0ac5f2ec01c3e55d769bce0d272744ea2d60b","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    stop_process cyborg-agent"},{"line_number":287,"context_line":"}"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"function create_nvme_device_profile {"},{"line_number":290,"context_line":"    if [[ \"$CYBORG_ENABLED_DRIVERS\" !\u003d *\"nvme_driver\"* ]]; then"},{"line_number":291,"context_line":"        return"},{"line_number":292,"context_line":"    fi"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"71040175_f8c2abba","line":289,"updated":"2026-08-06 17:50:14.000000000","message":"The new function create_nvme_device_profile is added to devstack/lib/cyborg but is never invoked from plugin.sh or any other code path. The actual NVMe device profile creation is handled by create_pci_sim_cyborg_nvme_device_profile in lib/pci_sim, which IS called via create_pci_sim_test_resources...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Future maintainers may assume this function is called and modify it expecting behavioral changes, or be confused about the authoritative NVMe device-profile creation path. The function also contains a latent bug: it does not guard against empty CYBORG_NVME_PRODUCT_ID, which would produce a malfor...\n\n**Suggestion**:\nEither wire create_nvme_device_profile into plugin.sh at an appropriate phase (e.g., \u0027extra\u0027 after start_cyborg), or remove it if create_pci_sim_cyborg_nvme_device_profile in lib/pci_sim already covers all needed scenarios. If kept, also add a guard for empty product_id.","commit_id":"82c0903f3af2f7acfb4d04cb36ba94d87345060b"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"2567e8e9f0df64b37ce5956a1bd90030eb53311c","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        iniset $TEMPEST_CONFIG cyborg_pci vendor_id 10a9"},{"line_number":305,"context_line":"        iniset $TEMPEST_CONFIG cyborg_pci product_id 0003"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        if [[ \"${PCI_SIM_DEVICES:-}\" \u003d\u003d *nvme* ]]; then"},{"line_number":308,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme device_profile_name \"$CYBORG_NVME_DEVICE_PROFILE_NAME\""},{"line_number":309,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme vendor_id \"${CYBORG_NVME_VENDOR_ID:-1d55}\""},{"line_number":310,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme product_id \"${CYBORG_NVME_PRODUCT_ID:-1002}\""}],"source_content_type":"application/octet-stream","patch_set":15,"id":"f8de7b2e_a31c8c4c","line":307,"updated":"2026-08-12 17:28:32.000000000","message":"cyborg_configure_tempest checks [[ \"${PCI_SIM_DEVICES:-}\" \u003d\u003d *nvme* ]] to decide whether to configure the cyborg_nvme Tempest section. This matches both \u0027cyborg:nvme\u0027 and \u0027nova:nvme\u0027. If PCI_SIM_DEVICES contains \u0027nova:nvme\u0027 without \u0027cyborg:nvme\u0027, Tempest is configured to reference a Cyborg NVMe d...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: A topology like PCI_SIM_DEVICES\u003d\u0027nova:uart,nova:nvme\u0027 would configure Tempest cyborg_nvme settings pointing to a non-existent device profile, causing test failures. The NVMe driver and device profile are only wired up for cyborg:nvme.\n\n**Suggestion**:\nChange the pattern from *nvme* to *cyborg:nvme* to match the settings auto-wiring logic, ensuring Tempest NVMe config is only set when Cyborg-managed NVMe devices exist.","commit_id":"cac5170086b6ecf06de27e70e2cc5a30c73bb05b"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"fb78f48a9b5b1912068fb638f0521b43d22a3405","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        iniset $TEMPEST_CONFIG cyborg_pci vendor_id 10a9"},{"line_number":305,"context_line":"        iniset $TEMPEST_CONFIG cyborg_pci product_id 0003"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        if [[ \"${PCI_SIM_DEVICES:-}\" \u003d\u003d *nvme* ]]; then"},{"line_number":308,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme device_profile_name \"$CYBORG_NVME_DEVICE_PROFILE_NAME\""},{"line_number":309,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme vendor_id \"${CYBORG_NVME_VENDOR_ID:-1d55}\""},{"line_number":310,"context_line":"            iniset $TEMPEST_CONFIG cyborg_nvme product_id \"${CYBORG_NVME_PRODUCT_ID:-1002}\""}],"source_content_type":"application/octet-stream","patch_set":40,"id":"0a92a96d_0960b673","line":307,"updated":"2026-09-08 11:31:33.000000000","message":"cyborg_configure_tempest gates the new tempest [cyborg_nvme] section on `[[ \"${PCI_SIM_DEVICES:-}\" \u003d\u003d *nvme* ]]`, which matches the entry `nova:nvme` as well as `cyborg:nvme`. The rest of the plugin keys the same decision on the stricter pattern `*cyborg:nvme*` (devstack/settings auto-wire of nvme_driver/CYBORG_NVME_* and create_pci_sim_cyborg_nvme_device_profile, which only collects VFs whose PF target is cyborg). For a documented topology such as PCI_SIM_DEVICES\u003d\"nova:nvme,cyborg:uart\", tempest gets device_profile_name\u003dnvme-dp even though no cyborg-owned NVMe VFs exist and no nvme-dp device profile is created.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: In any topology containing nova:nvme without cyborg:nvme, the NVMe lifecycle scenario test runs instead of skipping and fails at device-profile lookup/server boot, turning a valid configuration into a red tempest run.\n\n**Suggestion**:\nUse the same service-qualified pattern as devstack/settings, e.g. `[[ \"${PCI_SIM_DEVICES:-}\" \u003d\u003d *cyborg:nvme* ]]`, so tempest is only configured when Cyborg actually owns NVMe VFs.","commit_id":"ad72d608ff8e40ab4d93f4495cd0a1c967057c12"}],"devstack/lib/pci_sim":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"bcf2e10092f93fd3a18203729820d0183e9f90bd","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    [[ \"$PCI_SIM_CONFIGURE_CYBORG_PCI\" \u003d\u003d True ]] || return 0"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    mapfile -t cyborg_vfs \u003c \u003c(pci_sim_collect_target_vfs cyborg)"},{"line_number":490,"context_line":"    if (( ${#cyborg_vfs[@]} \u003d\u003d 0 )); then"},{"line_number":491,"context_line":"        return 0"},{"line_number":492,"context_line":"    fi"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"d85966df_0732e0ec","line":489,"updated":"2026-08-07 09:01:08.000000000","message":"The modified create_pci_sim_cyborg_device_profile collects all cyborg VFs (including NVMe VFs) and uses the first VF\u0027s product_id for the PCI device profile. When the only cyborg VFs are NVMe VFs (as in CI config PCI_SIM_DEVICES\u003d\"nova:uart,cyborg:nvme\"), the PCI device profile is created with the...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The PCI device profile pci-sim-cyborg-dp gets trait CUSTOM_PCI_PRODUCT_ID_1002 when it should reference 1001 (or not be created at all when no non-NVMe cyborg VFs exist). The pci-sim-cyborg flavor references this profile, so scheduling requests would carry the wrong trait. In the current CI confi...\n\n**Suggestion**:\nFilter NVMe VFs out of the product_id lookup in create_pci_sim_cyborg_device_profile, mirroring the pattern already used in configure_pci_sim_cyborg_service_config. Skip creating the PCI profile entirely when no non-NVMe cyborg VFs exist.","commit_id":"32ae22c70e8062289a5957aa007bd4580f6dca44"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"c733ff2fbcaffc8cb9ac17f92e3109bf5277e99a","unresolved":false,"context_lines":[{"line_number":295,"context_line":"function pci_sim_pf_target {"},{"line_number":296,"context_line":"    local index\u003d$1"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    if [[ ${#_PCI_SIM_SERVICES[@]} -gt 0 ]]; then"},{"line_number":299,"context_line":"        echo \"${_PCI_SIM_SERVICES[$index]}\""},{"line_number":300,"context_line":"        return"},{"line_number":301,"context_line":"    fi"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"aa44e0c8_604b0bdc","line":298,"updated":"2026-08-07 18:27:41.000000000","message":"The _PCI_SIM_SERVICES/_PCI_SIM_PERSONALITIES arrays are populated only by pci_sim_parse_devices, called via pci_sim_validate_config from load_pci_sim and configure_pci_sim_vfs in the post-config phase. DevStack runs plugin.sh as a separate bash process per phase, re-sourcing lib/pci_sim and reset...\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: With PCI_SIM_DEVICES\u003d\u0027cyborg:nvme,nova:uart\u0027, during extra phase pci_sim_collect_target_vfs cyborg returns PF1 VFs (uart) instead of PF0 VFs (nvme). NVMe VFs are never found, so no NVMe device profile is created. The default CI config \u0027nova:uart,cyborg:nvme\u0027 works by coincidence because it matche...\n\n**Priority**: Before merge\n**Why This Matters**: With PCI_SIM_DEVICES\u003d\u0027cyborg:nvme,nova:uart\u0027, during extra phase pci_sim_collect_target_vfs cyborg returns PF1 VFs (uart) instead of PF0 VFs (nvme). NVMe VFs are never found, so no NVMe device profile is created. The default CI config \u0027nova:uart,cyborg:nvme\u0027 works by coincidence because it matche...\n\n**Recommendation**:\nCall pci_sim_parse_devices at the start of pci_sim_collect_target_vfs, or make pci_sim_pf_target/pci_sim_pf_personality self-initializing by calling pci_sim_parse_devices when arrays are empty. Alternatively add pci_sim_parse_devices calls at the top of configure_pci_sim_cyborg_service_config and create_pci_sim_test_resources.","commit_id":"168490e1eb143156044c20382ef9cf779aba0b7b"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"a616e0c3faa84f30642b542373e28ce06edc00f3","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    [[ \"$PCI_SIM_CONFIGURE_CYBORG_PCI\" \u003d\u003d True ]] || return 0"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    mapfile -t cyborg_vfs \u003c \u003c(pci_sim_collect_target_vfs cyborg)"},{"line_number":490,"context_line":"    if (( ${#cyborg_vfs[@]} \u003d\u003d 0 )); then"},{"line_number":491,"context_line":"        return 0"},{"line_number":492,"context_line":"    fi"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"650e6161_7afa0547","line":489,"updated":"2026-08-09 07:08:23.000000000","message":"create_pci_sim_cyborg_device_profile reads the first cyborg VF\u0027s product_id from sysfs without filtering out NVMe VFs. With the CI default PCI_SIM_DEVICES\u003d\"nova:uart,cyborg:nvme\", all cyborg VFs are NVMe VFs (device ID 0x1002). The function creates a PCI device profile with trait CUSTOM_PCI_PRODU...\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: The PCI device profile \u0027pci-sim-cyborg-dp\u0027 is created with trait CUSTOM_PCI_PRODUCT_ID_1002 but no PCI inventory exists for that product_id (only NVMe inventory exists under CUSTOM_NVME_* resource classes). Any tempest test referencing the cyborg_pci device profile will fail to schedule because P...\n\n**Priority**: Before merge\n**Why This Matters**: The PCI device profile \u0027pci-sim-cyborg-dp\u0027 is created with trait CUSTOM_PCI_PRODUCT_ID_1002 but no PCI inventory exists for that product_id (only NVMe inventory exists under CUSTOM_NVME_* resource classes). Any tempest test referencing the cyborg_pci device profile will fail to schedule because P...\n\n**Recommendation**:\nFilter cyborg VFs in create_pci_sim_cyborg_device_profile to exclude NVMe VFs before reading the product_id, mirroring the split logic in configure_pci_sim_cyborg_service_config. For example: iterate cyborg_vfs, skip those whose device ID matches PCI_SIM_NVME_VF_DEVICE_ID, and return early if no non-NVMe VFs remain.","commit_id":"4ff6dcc2792847b875d0c5ea31e67a800e7e0cc5"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"eb0556c328d1bfd058cf66c61ca78ecede913aae","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        return"},{"line_number":25,"context_line":"    fi"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    IFS\u003d\u0027,\u0027 read -ra entries \u003c\u003c\u003c \"$PCI_SIM_DEVICES\""},{"line_number":28,"context_line":"    for entry in \"${entries[@]}\"; do"},{"line_number":29,"context_line":"        entry\u003d$(echo \"$entry\" | xargs)"},{"line_number":30,"context_line":"        svc\u003d\"${entry%%:*}\""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"1aa2fa13_8b0591e2","line":27,"updated":"2026-08-11 11:22:57.000000000","message":"The pci_sim_parse_devices function uses `IFS\u003d\u0027,\u0027 read -ra entries` without declaring `entries` as local. In bash, undeclared variables in functions leak to the global scope, which can cause subtle bugs if another function later uses the same variable name.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Low practical impact since no other function in the file currently uses the name \u0027entries\u0027. However, it is a real scope leak in newly added code that could cause subtle issues if future functions reuse the variable name.\n\n**Recommendation**:\nChange `local entry svc pers` on line 18 to `local entry svc pers` and add `local -a entries` to declare the array as local. Alternatively, combine into one declaration: `local entry svc pers` followed by `local -a entries`.","commit_id":"8a9fc5fc3cf162ef87b6df82118f024580ebcdde"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"eb0556c328d1bfd058cf66c61ca78ecede913aae","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    for vf in \"$@\"; do"},{"line_number":326,"context_line":"        pid\u003d$(cat \"/sys/bus/pci/devices/$vf/device\" | sed \u0027s/^0x//\u0027)"},{"line_number":327,"context_line":"        specs+\u003d(\"{\\\"address\\\":\\\"$vf\\\",\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"managed\\\":\\\"no\\\"}\")"},{"line_number":328,"context_line":"        if ! printf \u0027%s\\n\u0027 \"${seen_pids[@]}\" 2\u003e/dev/null | grep -qx \"$pid\"; then"},{"line_number":329,"context_line":"            seen_pids+\u003d(\"$pid\")"},{"line_number":330,"context_line":"            aliases+\u003d(\"{\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"name\\\":\\\"$PCI_SIM_NOVA_ALIAS_NAME\\\"}\")"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"7bd99120_b9117d4d","line":327,"updated":"2026-08-11 11:22:57.000000000","message":"The configure_pci_sim_nova_conf_file function was modified in this patch to read product_id dynamically from sysfs (`cat /sys/bus/pci/devices/$vf/device`), but vendor_id remains hardcoded as the string literal \"1d55\". If PCI_SIM_VENDOR_ID is customized (it is a configurable variable defaulting to...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: If an operator changes PCI_SIM_VENDOR_ID from its default, Nova PCI passthrough specs and aliases will have mismatched vendor_id, causing VM scheduling failures. In practice this is low risk since PCI_SIM_VENDOR_ID is rarely changed from its default 0x1d55 in pci-sim test environments.\n\n**Recommendation**:\nRead vendor_id from sysfs alongside product_id: `vid\u003d$(cat \"/sys/bus/pci/devices/$vf/vendor\" | sed \u0027s/^0x//\u0027)` and use $vid in the spec and alias JSON instead of the hardcoded \"1d55\".","commit_id":"8a9fc5fc3cf162ef87b6df82118f024580ebcdde"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"aaca60490ead5349605bc904e6f4d81c49762490","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        return"},{"line_number":25,"context_line":"    fi"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    IFS\u003d\u0027,\u0027 read -ra entries \u003c\u003c\u003c \"$PCI_SIM_DEVICES\""},{"line_number":28,"context_line":"    for entry in \"${entries[@]}\"; do"},{"line_number":29,"context_line":"        entry\u003d$(echo \"$entry\" | xargs)"},{"line_number":30,"context_line":"        svc\u003d\"${entry%%:*}\""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"abd38192_b99e85fe","line":27,"updated":"2026-08-11 18:45:59.000000000","message":"The entries array used in IFS\u003d\u0027,\u0027 read -ra entries is not declared local, causing it to leak into the global shell namespace in the sourced devstack environment.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: A global \u0027entries\u0027 array could interfere with other devstack functions or plugins that use the same variable name, causing subtle and hard-to-debug issues during stack.sh execution.\n\n**Recommendation**:\nAdd \u0027entries\u0027 to the local declaration on line 18: \u0027local entry svc pers entries\u0027 or add a separate \u0027local -a entries\u0027 declaration before the read command on line 27.","commit_id":"9a9c111249957e43e3ca6c232b97994f22c70fb2"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"cbb9336db01179ddef4ffc4f31bdbfa0662760e4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return"},{"line_number":29,"context_line":"    fi"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    IFS\u003d\u0027,\u0027 read -ra entries \u003c\u003c\u003c \"$PCI_SIM_DEVICES\""},{"line_number":32,"context_line":"    for entry in \"${entries[@]}\"; do"},{"line_number":33,"context_line":"        entry\u003d$(echo \"$entry\" | xargs)"},{"line_number":34,"context_line":"        svc\u003d\"${entry%%:*}\""}],"source_content_type":"application/octet-stream","patch_set":16,"id":"4461e0ac_7b311156","line":31,"updated":"2026-08-13 08:31:23.000000000","message":"In pci_sim_parse_devices, the \u0027entries\u0027 variable used with \u0027IFS\u003d\",\" read -ra entries\u0027 is not declared local. The function declares \u0027local entry svc pers\u0027 but omits \u0027entries\u0027, so it persists as a global shell variable after the function returns.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: The leaked \u0027entries\u0027 global is unlikely to cause a functional bug in current DevStack flows, but it could conflict with another variable named \u0027entries\u0027 in a caller\u0027s scope or in future code, leading to subtle and hard-to-debug issues.\n\n**Recommendation**:\nAdd \u0027entries\u0027 to the local declaration on line 22: \u0027local entry svc pers entries\u0027 or add a separate \u0027local -a entries\u0027 declaration before the read.","commit_id":"70c6af093deadc645c99125c56df783611f531e8"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"cbb9336db01179ddef4ffc4f31bdbfa0662760e4","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    for vf in \"$@\"; do"},{"line_number":336,"context_line":"        pid\u003d$(cat \"/sys/bus/pci/devices/$vf/device\" | sed \u0027s/^0x//\u0027)"},{"line_number":337,"context_line":"        specs+\u003d(\"{\\\"address\\\":\\\"$vf\\\",\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"managed\\\":\\\"no\\\"}\")"},{"line_number":338,"context_line":"        if ! printf \u0027%s\\n\u0027 \"${seen_pids[@]}\" 2\u003e/dev/null | grep -qx \"$pid\"; then"},{"line_number":339,"context_line":"            seen_pids+\u003d(\"$pid\")"},{"line_number":340,"context_line":"            aliases+\u003d(\"{\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"name\\\":\\\"$PCI_SIM_NOVA_ALIAS_NAME\\\"}\")"},{"line_number":341,"context_line":"        fi"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"8a0923d4_156ff44d","line":338,"updated":"2026-08-13 08:31:23.000000000","message":"configure_pci_sim_nova_conf_file creates one alias per unique VF product ID but assigns the same alias name ($PCI_SIM_NOVA_ALIAS_NAME) to all of them. When Nova receives VFs with different device IDs (e.g., uart VFs at 0x1001 and nvme VFs at 0x1002), this produces multiple [pci] alias entries wit...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If a topology like PCI_SIM_DEVICES\u003d\"nova:uart,nova:nvme\" is used, Nova receives VFs with device IDs 0x1001 and 0x1002. The code generates two alias entries both named \u0027pci_sim_vf\u0027 with different product_ids. Nova may fail to start, use the wrong alias, or silently ignore one device type, causing...\n\n**Suggestion**:\nAppend the product ID to the alias name when there are multiple unique product IDs, e.g.: name\u003d\"$PCI_SIM_NOVA_ALIAS_NAME\" for the first, then name\u003d\"${PCI_SIM_NOVA_ALIAS_NAME}_${pid}\" for subsequent ones. Alternatively, use a single alias per name and document that Nova topologies should use a single VF personality.","commit_id":"70c6af093deadc645c99125c56df783611f531e8"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"fe54f7aa0483b707abc5fee53ace79c88fec6943","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    for vf in \"$@\"; do"},{"line_number":336,"context_line":"        pid\u003d$(cat \"/sys/bus/pci/devices/$vf/device\" | sed \u0027s/^0x//\u0027)"},{"line_number":337,"context_line":"        specs+\u003d(\"{\\\"address\\\":\\\"$vf\\\",\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"managed\\\":\\\"no\\\"}\")"},{"line_number":338,"context_line":"        if ! printf \u0027%s\\n\u0027 \"${seen_pids[@]}\" 2\u003e/dev/null | grep -qx \"$pid\"; then"},{"line_number":339,"context_line":"            seen_pids+\u003d(\"$pid\")"},{"line_number":340,"context_line":"            aliases+\u003d(\"{\\\"vendor_id\\\":\\\"1d55\\\",\\\"product_id\\\":\\\"$pid\\\",\\\"device_type\\\":\\\"type-VF\\\",\\\"name\\\":\\\"$PCI_SIM_NOVA_ALIAS_NAME\\\"}\")"},{"line_number":341,"context_line":"        fi"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"2c355d25_d3233aff","line":338,"updated":"2026-08-17 09:46:07.000000000","message":"configure_pci_sim_nova_conf_file now emits one [pci] alias entry per distinct VF product ID, but every entry uses the same PCI_SIM_NOVA_ALIAS_NAME. Nova enforces unique alias names at config load, so a topology with two nova-managed personalities (e.g. PCI_SIM_DEVICES\u003d\"nova:uart,nova:nvme\") produ...\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: Any PCI_SIM_DEVICES topology containing two nova-owned entries with different personalities (e.g. nova:uart,nova:nvme), accepted by pci_sim_parse_devices, yields a nova.conf that prevents nova-compute from starting, failing the whole stack run.\n\n**Priority**: Before merge\n**Why This Matters**: Any PCI_SIM_DEVICES topology containing two nova-owned entries with different personalities (e.g. nova:uart,nova:nvme), accepted by pci_sim_parse_devices, yields a nova.conf that prevents nova-compute from starting, failing the whole stack run.\n\n**Recommendation**:\nMake the alias name unique per product ID (e.g. \"${PCI_SIM_NOVA_ALIAS_NAME}_${pid}\" or personality-based names), or emit a single alias that matches both product IDs; document the resulting flavor extra_spec name change if any fixtures reference it.","commit_id":"f094233c559573280f2a6fa69b8cead9d075a27f"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"83e682ebc2897440146513e30404aec4e0d77fc9","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            \"$PCI_SIM_VF_DEVICE_ID\" \"${cyborg_vfs[@]}\""},{"line_number":527,"context_line":"    )"},{"line_number":528,"context_line":"    if (( ${#pci_vfs[@]} \u003d\u003d 0 )); then"},{"line_number":529,"context_line":"        return 0"},{"line_number":530,"context_line":"    fi"},{"line_number":531,"context_line":"    pid\u003d$(cat \"/sys/bus/pci/devices/${pci_vfs[0]}/device\" | sed \u0027s/^0x//\u0027)"},{"line_number":532,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":34,"id":"5755a29e_ce97673a","line":529,"updated":"2026-09-07 06:33:35.000000000","message":"create_pci_sim_cyborg_device_profile now returns early when there are no cyborg-targeted uart VFs, but create_pci_sim_cyborg_flavor still unconditionally creates a flavor with accel:device_profile\u003d$PCI_SIM_CYBORG_DEVICE_PROFILE_NAME, so the flavor can reference a device profile that was never created.\n\n**Severity**: WARNING | **Confidence**: 0.85\n\n**Impact**: In an nvme-only cyborg topology the convenience flavor references a nonexistent device profile, so booting it fails at device profile resolution, defeating the fixture\u0027s purpose and misleading manual validation.\n\n**Suggestion**:\nIn create_pci_sim_cyborg_flavor, skip flavor creation (or the accel:device_profile property) when no cyborg-targeted uart VFs exist, reusing the same pci_sim_filter_vfs_by_device_id check used at line 529; optionally pair an NVMe flavor with the nvme-dp profile.","commit_id":"ed79a56e2ea3969fac50e5da087af8434204e3fd"}],"devstack/plugin.sh":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"2c9a7e9fa617c700b3cb8566c5f8f9fee5aa1429","unresolved":false,"context_lines":[{"line_number":18,"context_line":"                echo_summary \"Installing Cyborg\""},{"line_number":19,"context_line":"                install_cyborg"},{"line_number":20,"context_line":"                install_cyborg_client"},{"line_number":21,"context_line":"                install_package pciutils nvme-cli"},{"line_number":22,"context_line":"                if [[ \"$ENABLE_PCI_SIM\" \u003d\u003d True ]]; then"},{"line_number":23,"context_line":"                    if [[ \"$PCI_SIM_BUILD\" \u003d\u003d True ]]; then"},{"line_number":24,"context_line":"                        async_runfunc build_pci_sim"}],"source_content_type":"text/x-sh","patch_set":17,"id":"3f719260_cb431005","line":21,"updated":"2026-08-13 17:01:41.000000000","message":"The install_package call was moved outside the ENABLE_PCI_SIM guard so nvme-cli is now installed on every Cyborg devstack deployment regardless of whether pci-sim is enabled.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Every Cyborg devstack deployment now installs nvme-cli even when pci-sim is not used. For CI this adds unnecessary package installation time and a new package dependency. For production-like devstack installs this adds a package that is only relevant to the simulated NVMe test infrastructure.\n\n**Recommendation**:\nEither move install_package back inside the ENABLE_PCI_SIM guard, or keep pciutils outside (since it may be needed for Cyborg in general) but place nvme-cli inside the pci-sim block since it is only used by the simulated NVMe personality.","commit_id":"2847a373c94bb5a4cde4bb8df64d20b7af3a293a"}],"devstack/settings":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"503c514c3cab46fd6999fffbb1bb7582fc082b7b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        CYBORG_ENABLED_DRIVERS\u003d\"${CYBORG_ENABLED_DRIVERS},nvme_driver\""},{"line_number":92,"context_line":"    fi"},{"line_number":93,"context_line":"    CYBORG_NVME_VENDOR_ID\u003d${CYBORG_NVME_VENDOR_ID:-1d55}"},{"line_number":94,"context_line":"    CYBORG_NVME_PRODUCT_ID\u003d${CYBORG_NVME_PRODUCT_ID:-1002}"},{"line_number":95,"context_line":"fi"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"# Number of fake SR-IOV PFs to create when PCI_SIM_LOAD\u003dTrue."}],"source_content_type":"application/octet-stream","patch_set":43,"id":"b48e9143_2daebed2","line":94,"updated":"2026-09-09 07:46:01.000000000","message":"The pci-sim NVMe VF device id is now defined independently in three places: PCI_SIM_NVME_VF_DEVICE_ID default 0x1002 in devstack/lib/pci_sim:10, CYBORG_NVME_PRODUCT_ID default 1002 in the devstack/settings auto-wire block, and the literal 1002 fallback in cyborg_configure_tempest in devstack/lib/cyborg. These three must always name the same device; nothing validates that they agree.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: PCI_SIM_NVME_VF_DEVICE_ID is a documented, overridable knob; overriding it (or changing the module id) leaves the agent [nvme] device_spec and the tempest [cyborg_nvme] section still pointing at 1002, so the nvme driver discovers no devices and tempest asserts against the wrong product id, with no early validation catching the mismatch.\n\n**Recommendation**:\nSingle-source the value: in the devstack/settings auto-wire block set CYBORG_NVME_PRODUCT_ID\u003d${PCI_SIM_NVME_VF_DEVICE_ID#0x} (after lib/pci_sim defines it or by repeating the knob reference), and in cyborg_configure_tempest use the derived variable rather than a literal default.","commit_id":"06967c1bea0e7c08f1327aed299eadcfb223d205"}],"playbooks/pci-sim-nvme-pre.yaml":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"797dfafbde404c7b880bae1d2ad45bccaf44b234","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"},{"line_number":33,"context_line":"          become: true"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"19d58f59_8b6d349b","line":30,"updated":"2026-09-08 05:01:00.000000000","message":"cyborg-tempest-base vars (inherited wholesale by cyborg-tempest-centos-10-stream) set PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000 and PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000, and the new pre-run playbook gates all GRUB/memmap work on \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027. On the CentOS Stream 10 nodeset, no memmap reservation is ever added to the kernel command line, yet load_pci_sim still passes nvme_memmap_start/nvme_memmap_size to fake_pci_sriov because the topology contains cyborg:nvme. The module then points each fake host bridge MMIO window at 0x1c0000000 and pci_sim_nvme_host_init() ioremap()s that physical range. Because the memory was never removed from e820 system RAM, on x86 the ioremap of RAM fails (module probe error / stack.sh failure) or, where mapping succeeds, targets live kernel memory. The unconditional reboot and post-reboot role also run on RedHat-family hosts even though nothing was changed there.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The periodic-weekly/experimental cyborg-tempest-centos-10-stream job fails at module load (best case) or maps an MMIO window over live system RAM (worst case), because devstack is told to use a boot-reserved memory window that the playbook never reserved on that distro.\n\n**Suggestion**:\nMake the memmap localrc and the playbook distro handling consistent: either add a RedHat-family branch (grub2 editing + grub2-mkconfig) to the playbook and gate the memmap tasks, or override PCI_SIM_NVME_MEMMAP_START/SIZE to 0 in a vars override for the CentOS job, and skip the reboot/include_role when no GRUB change was made on that host.","commit_id":"c84af8613e3d883db7acd294114cb97c8a2807d4"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"797dfafbde404c7b880bae1d2ad45bccaf44b234","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    - name: Run post-boot tasks"},{"line_number":65,"context_line":"      ansible.builtin.include_role:"},{"line_number":66,"context_line":"        name: post-reboot-tasks"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    - name: Read current kernel command line"},{"line_number":69,"context_line":"      ansible.builtin.slurp:"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"4087b141_1e7b403d","line":66,"updated":"2026-09-08 05:01:00.000000000","message":"playbooks/pci-sim-nvme-pre.yaml ends with \u0027ansible.builtin.include_role: name: post-reboot-tasks\u0027 immediately after the reboot task. No roles/post-reboot-tasks directory exists anywhere in the repository (only playbooks/pci-sim-nvme-pre.yaml exists), the job definitions in .zuul.yaml declare no \u0027roles:\u0027 entries, and there is no ansible.cfg or zuul.d configuring a role path. Unless a role with exactly this name happens to be installed from an external config-project role path not visible in the repo, Ansible aborts the playbook with \u0027the role post-reboot-tasks was not found\u0027. The .zuul.yaml comment \u0027Needed by post-reboot-tasks role\u0027 (nslookup_target) shows the author expects the role to provide post-reboot network recovery, so a hard failure here is the expected failure mode, not a graceful skip.\n\n**Severity**: HIGH | **Confidence**: 0.75\n\n**Impact**: If the role is not resolvable at job runtime, every voting Cyborg tempest check/gate job (cyborg-tempest-py3, cyborg-tempest-ipv6, cyborg-tempest-srbac) fails in pre before devstack even starts, blocking the change and subsequent patches in the chain.\n\n**Priority**: Before merge\n**Recommendation**:\nAdd the role in-repo (e.g. roles/post-reboot-tasks/ implementing the post-reboot network wait the nslookup_target var implies, using nslookup_target for the health check) or install it explicitly via a \u0027roles:\u0027 entry on the job referencing the project that provides it. If the role is intentionally in-repo, it was omitted from this patch and must be added before merge.","commit_id":"c84af8613e3d883db7acd294114cb97c8a2807d4"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"17dd167804bea5ccab777606183eb94669aae85b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      ansible.builtin.debug:"},{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"2e2dd796_40758748","line":29,"updated":"2026-09-08 07:22:28.000000000","message":"The new pre-run playbook gates all GRUB/memmap setup on \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027, yet it is attached to the abstract cyborg-tempest-base job whose vars (PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000, PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000, PCI_SIM_DEVICES with cyborg:nvme) are inherited by every child job, including cyborg-tempest-centos-10-stream. On a CentOS node the kernel never gets the memmap\u003d reservation, but load_pci_sim still passes nvme_memmap_start/nvme_memmap_size to the fake_pci_sriov module.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The CentOS Stream 10 tempest job (periodic-weekly and experimental) will run the NVMe topology against memory that was never reserved: the module either fails to map BAR0 or, worse, ioremaps RAM still in use, which can corrupt memory or crash the node. The stock nvme host-driver binding this setup exists to provide also silently never works on that job.\n\n**Suggestion**:\nMake the memmap wiring consistent for every job that receives the memmap vars: either apply the GRUB update for RedHat-family hosts too (grubby --update-kernel\u003dALL --args\u003d...), or move PCI_SIM_NVME_MEMMAP_START/SIZE out of the shared base vars into the Debian-only jobs and have the CentOS job disable memmap (rely on the no-memmap BAR0 mode).","commit_id":"dada241848a3efeb716883411bd2a2194a84397a"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"ebd47f8484a51990e00c2e35982168b27270e55a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      ansible.builtin.debug:"},{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"}],"source_content_type":"text/x-yaml","patch_set":41,"id":"49d1bbf9_e3192a7d","line":29,"updated":"2026-09-08 13:41:14.000000000","message":"cyborg-tempest-base devstack_localrc sets PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000 and PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000, and cyborg-tempest-centos-10-stream inherits these vars. The new pre-run playbook playbooks/pci-sim-nvme-pre.yaml gates the GRUB memmap edit behind \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027, so on the CentOS nodeset no memory is ever reserved with memmap\u003d. The Reboot task (line 60) is unconditional, so non-Debian nodes reboot pointlessly while still passing the memmap args through to the module.\n\n**Severity**: HIGH | **Confidence**: 0.85\n\n**Impact**: On cyborg-tempest-centos-10-stream (experimental and periodic-weekly), the module ioremaps a physical range that was never boot-reserved, risking memory corruption or node instability, and the stock nvme driver can never bind. At minimum the periodic job fails or behaves nondeterministically. Non-Debian nodes also take an avoidable reboot on every run.\n\n**Priority**: Before merge\n**Recommendation**:\nEither gate the memmap-based flow on the distro that supports it (e.g. add a RedHat grub2-mkconfig/grubby branch in the playbook, or override PCI_SIM_NVME_MEMMAP_START/SIZE to 0 for the centos job), or refuse to pass nvme_memmap_start/size when the running kernel command line lacks the matching memmap\u003d reservation (check /proc/cmdline in load_pci_sim). Also consider skipping the Reboot task when nothing was changed.","commit_id":"d8eb60d03048bcc346839c9562661ef25681a7ca"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"62ee92b78bcf9f42251f3fde984f38639ff56a83","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      ansible.builtin.debug:"},{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"}],"source_content_type":"text/x-yaml","patch_set":44,"id":"cf04abc8_364d5369","line":29,"updated":"2026-09-09 08:41:07.000000000","message":"cyborg-tempest-centos-10-stream (experimental and periodic-weekly in .zuul.yaml) inherits vars from cyborg-tempest-base, which now sets PCI_SIM_NVME_MEMMAP_START\u003d0x140000000 and PCI_SIM_NVME_MEMMAP_SIZE\u003d0x4000000, and inherits the new pre-run playbook. The playbook\u0027s GRUB provisioning block is guarded by `when: ansible_os_family \u003d\u003d \"Debian\"`, so on CentOS no memmap parameter is added to the kernel command line, yet the unconditional reboot still runs. When devstack\u0027s pci_sim_validate_config runs with the inherited non-zero memmap variables and finds no `memmap\u003d` in /proc/cmdline, it calls die and stack.sh aborts.\n\n**Severity**: WARNING | **Confidence**: 0.85\n\n**Impact**: The periodic-weekly and experimental cyborg-tempest-centos-10-stream job will fail every run at stack.sh with the new configuration error instead of exercising pci-sim on CentOS Stream 10 as it did before.\n\n**Suggestion**:\nEither add a RedHat branch using `grubby --update-kernel\u003dALL --args\u003d\"memmap\u003d{{ size }}M\\${{ start }}G\"` before the reboot, or move the PCI_SIM_NVME_MEMMAP_* localrc variables out of the shared base anchor into the Debian-only jobs so the CentOS job keeps the allocate_resource BAR path.","commit_id":"2910c193753656b1cbaa087aaae70ae6345f3cb0"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"62ee92b78bcf9f42251f3fde984f38639ff56a83","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            regexp: \u0027GRUB_CMDLINE_LINUX\u003d\"([^\"]*)\"\u0027"},{"line_number":42,"context_line":"            line: \u003e-"},{"line_number":43,"context_line":"              GRUB_CMDLINE_LINUX\u003d\"\\1"},{"line_number":44,"context_line":"              memmap\u003d{{ cyborg_pcisim_nvme_memmap_size }}M\\\\\\\\\\\\${{ cyborg_pcisim_nvme_memmap_start }}G\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        - name: Verify GRUB config content"},{"line_number":47,"context_line":"          become: true"}],"source_content_type":"text/x-yaml","patch_set":44,"id":"8e903e51_ee696576","line":44,"updated":"2026-09-09 08:41:07.000000000","message":"The lineinfile `line` value in playbooks/pci-sim-nvme-pre.yaml is a YAML folded block scalar, which performs no backslash unescaping. The parsed value therefore contains six literal backslashes before the `$` (verified by parsing the file with PyYAML). ansible.builtin.lineinfile with backrefs:yes passes the value through re.Match.expand, which halves backslash runs to three; /etc/default/grub then contains `memmap\u003d64M\\\\\\$5G` instead of the required `memmap\u003d64M\\$5G`. When update-grub\u0027s shell sources that double-quoted variable, the kernel command line ends up with `memmap\u003d64M\\$5G` (a stray backslash before `$5G`, and `$5` would otherwise expand as an empty positional parameter). The x86 memmap\u003d parser rejects the parameter, so no E820 reservation is created at 0x140000000.\n\n**Severity**: CRITICAL | **Confidence**: 0.8\n\n**Impact**: Every job using the pre-run playbook (cyborg-tempest-py3, cyborg-tempest-srbac, cyborg-tempest-ipv6, and the periodic/experimental centos job) either fails stack.sh at PF enumeration or registers an MMIO window on top of live guest RAM. The required gate tests this change depends on cannot complete, and the grep-only validation masks the root cause with a confusing later failure.\n\n**Priority**: Immediate\n**Recommendation**:\nIn the folded scalar, write exactly two backslashes (`memmap\u003d{{ ... }}M\\\\${{ ... }}G`) so that match.expand leaves `\\$` in /etc/default/grub and grub emits a literal `$`. Verify by asserting after the reboot task that `memmap\u003d{{ size }}M${{ start }}G` appears in /proc/cmdline without a backslash, and strengthen pci_sim_validate_config to match the configured values rather than only the substring `memmap\u003d`.","commit_id":"2910c193753656b1cbaa087aaae70ae6345f3cb0"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"6f693b869535ddf7b02edc0e0470c93ecbffee54","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"},{"line_number":33,"context_line":"          become: true"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"5df18f0d_763984d0","line":30,"updated":"2026-09-09 09:52:42.000000000","message":"cyborg-tempest-centos-10-stream has parent cyborg-tempest-base, so it inherits both the new pre-run playbook and the base vars devstack_localrc with PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000 / PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000. The playbook\u0027s memmap tasks are guarded by \u0027when: ansible_os_family \u003d\u003d \"Debian\"\u0027 and it calls update-grub, so nothing is added to the kernel command line on CentOS. DevStack then hits the new check in pci_sim_validate_config (devstack/lib/pci_sim), which runs \u0027grep -q memmap\u003d /proc/cmdline\u0027 and calls die $LINENO because MEMMAP_START/SIZE are non-zero but no memmap\u003d parameter is present.\n\n**Severity**: HIGH | **Confidence**: 0.85\n\n**Impact**: The cyborg-tempest-centos-10-stream experimental and periodic-weekly jobs will fail during stack.sh (before any tests run) with \u0027no memmap\u003d parameter found in /proc/cmdline\u0027, breaking a supported CI configuration and hiding pci-sim coverage on CentOS Stream 10.\n\n**Priority**: Before merge\n**Recommendation**:\nMake the vars and guard consistent: either add grub2 handling for the RedHat family (edit /etc/default/grub + grub2-mkconfig) and drop the Debian-only guard, or override devstack_localrc in the CentOS job (or gate the base vars) so memmap/NVMe topology is only requested on nodesets the playbook actually prepares.","commit_id":"4ffca2c8c7c1ba3d5cb33300c8d6dd6fcf9ac238"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"213aab8ab4fc2050f96bdb9208a02c799a6db667","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      ansible.builtin.debug:"},{"line_number":27,"context_line":"        msg: \"{{ kernel_cmdline.content | b64decode }}\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    - name: Append NVME memmap params for Debian"},{"line_number":30,"context_line":"      when: ansible_os_family \u003d\u003d \"Debian\""},{"line_number":31,"context_line":"      block:"},{"line_number":32,"context_line":"        - name: Append memmap parameter to GRUB command line"}],"source_content_type":"text/x-yaml","patch_set":46,"id":"76bd037f_39f3dbe8","line":29,"updated":"2026-09-09 16:10:59.000000000","message":"The new pre-run playbook gates the GRUB memmap\u003d configuration on ansible_os_family \u003d\u003d \"Debian\" (line 30), yet the memmap values live in cyborg-tempest-base\u0027s shared devstack_localrc (PCI_SIM_NVME_MEMMAP_START\u003d0x1c0000000, PCI_SIM_NVME_MEMMAP_SIZE\u003d0x20000000) which every child job inherits. cyborg-tempest-centos-10-stream (parent: cyborg-tempest-base, nodeset devstack-single-node-centos-10-stream, os_family RedHat) therefore gets NVMe topology plus memmap localrc values but never receives the memmap\u003d kernel boot parameter. The new pci_sim_validate_config() then executes \u0027die\u0027: \"PCI_SIM_NVME_MEMMAP_START\u003d... are set, but no memmap\u003d parameter found in /proc/cmdline\" during stack/post-config, so stack.sh aborts deterministically.\n\n**Severity**: WARNING | **Confidence**: 0.88\n\n**Impact**: The periodic-weekly and experimental cyborg-tempest-centos-10-stream jobs will fail on every run after this merges, permanently red CI signal for pci-sim on CentOS Stream 10 until the job is fixed or removed.\n\n**Suggestion**:\nEither add a RedHat-family branch to the playbook (grubby --update-kernel\u003dALL --args\u003d\"memmap\u003d...\" or edit /etc/default/grub plus grub2-mkconfig), or keep the CentOS job on the UART-only topology by overriding devstack_localrc (PCI_SIM_DEVICES\u003d\"cyborg:uart\", memmap vars \"0\") for the CentOS nodeset, or drop the job if CentOS pci-sim support is no longer intended.","commit_id":"79e4a092101f94215f1b2c1e9800fde854cfc556"}],"playbooks/pre-run-nvme-memmap.yaml":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"eba0ac5f2ec01c3e55d769bce0d272744ea2d60b","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    - name: Update grub.cfg"},{"line_number":52,"context_line":"      become: true"},{"line_number":53,"context_line":"      ansible.builtin.command: update-grub"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    - name: Reboot"},{"line_number":56,"context_line":"      become: true"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"37e4c951_74e68f4d","line":53,"updated":"2026-08-06 17:50:14.000000000","message":"The pre-run playbook playbooks/pre-run-nvme-memmap.yaml uses \u0027update-grub\u0027 which is a Debian/Ubuntu-specific command. The playbook is attached to the abstract cyborg-tempest-base job, which is inherited by cyborg-tempest-centos-10-stream. On CentOS Stream 10, update-grub does not exist; grub2-mkc...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The cyborg-tempest-centos-10-stream job (listed under experimental and periodic-weekly in .zuul.yaml) will fail when the playbook reaches the update-grub task. While this does not block merge (the job is not in check/gate), it introduces a regression for the periodic CI pipeline.\n\n**Suggestion**:\nUse Ansible\u0027s ansible_os_family fact to conditionally run update-grub on Debian/Ubuntu and grub2-mkconfig -o on RHEL/CentOS. Alternatively, use ansible.builtin.package facts to select the correct bootloader update command.","commit_id":"82c0903f3af2f7acfb4d04cb36ba94d87345060b"}]}
