)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4a385135ff4cd2339179fc8c06676b1215fec2f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"45f07e2d_d934f2e3","updated":"2026-07-20 05:46:48.000000000","message":"Can we break this review into two reviews for easier tracking:\n- Using mixing class in one review\n- Mdev lifecycle tests in another review.","commit_id":"5c8dc793e27c6c37bacc98424d69a0c162d9d5ea"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"9e852a8e7d032bee8d66e4275651b62c84362101","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b1d9cbc6_728cf733","in_reply_to":"45f07e2d_d934f2e3","updated":"2026-07-20 07:30:04.000000000","message":"good point, done!","commit_id":"5c8dc793e27c6c37bacc98424d69a0c162d9d5ea"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"aa981129b749a5f42bdcfce7834716b679db5c73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d743d9d8_b7c50021","updated":"2026-07-20 10:14:10.000000000","message":"recheck","commit_id":"8611ec35f50bf0d85d7dd5183d2472bcdace4979"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1590245ad7bafc7153e6ae05be421d10ab0ef9be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"7019b3f1_cc596d8d","updated":"2026-07-22 11:42:45.000000000","message":"recheck","commit_id":"bb18104772dc2f3b164a96d30903fcd9750cd3d1"}],"cyborg_tempest_plugin/config.py":[{"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":"d6a6c9fe4c856cc6079090ec586d4cad457b2a85","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    title\u003d\"Cyborg MDEV Driver Tempest Plugin Options\""},{"line_number":77,"context_line":")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"CyborgMdevGroup \u003d ["},{"line_number":80,"context_line":"    cfg.StrOpt(\"device_profile_name\","},{"line_number":81,"context_line":"               default\u003d\"\","},{"line_number":82,"context_line":"               help\u003d\"Device profile name for MDEV driver scenario tests.\"),"}],"source_content_type":"text/x-python","patch_set":15,"id":"92fcf508_0c42ff74","line":79,"updated":"2026-07-22 09:13:07.000000000","message":"The _lifecycle_params() method in TestMdevDriverLifecycle references CONF.cyborg_mdev.image_ref and CONF.cyborg_mdev.flavor_ref, but neither option is defined in the CyborgMdevGroup config group. This will cause oslo_config.cfg.NoSuchOptError at runtime whenever any lifecycle test calls _lifecycl...\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: Every test method in TestMdevDriverLifecycle calls _lifecycle_params() which accesses the unregistered options. The tests will crash immediately with NoSuchOptError instead of running. This completely defeats the purpose of the patch, which is to add functional MDEV lifecycle tests.\n\n**Priority**: Immediate\n**Why This Matters**: Every test method in TestMdevDriverLifecycle calls _lifecycle_params() which accesses the unregistered options. The tests will crash immediately with NoSuchOptError instead of running. This completely defeats the purpose of the patch, which is to add functional MDEV lifecycle tests.\n\n**Recommendation**:\nAdd image_ref and flavor_ref StrOpt entries to CyborgMdevGroup, matching the pattern used by CyborgPCIGroup: cfg.StrOpt(\"image_ref\", default\u003d\"\", help\u003d\"Optional image ID for Cyborg MDEV scenario tests. \" \"Defaults to compute.image_ref when unset.\"), cfg.StrOpt(\"flavor_ref\", default\u003d\"\", help\u003d\"Optional base flavor ID for Cyborg MDEV scenario \" \"tests. Defaults to compute.flavor_ref when unset.\"),","commit_id":"69da5eacfa69e0e81e81d82b9b9f3c1d52ab39e6"}],"cyborg_tempest_plugin/plugin.py":[{"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":"7dfcc1ae88f4d90d87eabde9785309a24c45a28d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            conf,"},{"line_number":35,"context_line":"            project_config.service_available_group,"},{"line_number":36,"context_line":"            project_config.ServiceAvailableGroup)"},{"line_number":37,"context_line":"        config.register_opt_group("},{"line_number":38,"context_line":"            conf,"},{"line_number":39,"context_line":"            project_config.cyborg_group,"},{"line_number":40,"context_line":"            project_config.CyborgGroup)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1fba5296_65dd2e97","line":37,"updated":"2026-07-16 07:34:41.000000000","message":"plugin.py register_opts() and get_opt_lists() reference project_config.cyborg_group and project_config.CyborgGroup, but these are never defined in config.py. This causes AttributeError when the tempest plugin loads, breaking every test in the plugin.\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: The tempest plugin will fail to load with AttributeError: module \u0027cyborg_tempest_plugin.config\u0027 has no attribute \u0027cyborg_group\u0027. No cyborg tempest tests (PCI or MDEV) will be discoverable or runnable. This is a complete breakage of the plugin.\n\n**Priority**: Immediate\n**Why This Matters**: The tempest plugin will fail to load with AttributeError: module \u0027cyborg_tempest_plugin.config\u0027 has no attribute \u0027cyborg_group\u0027. No cyborg tempest tests (PCI or MDEV) will be discoverable or runnable. This is a complete breakage of the plugin.\n\n**Recommendation**:\nDefine cyborg_group and CyborgGroup in config.py with the shared image_ref and flavor_ref options (and possibly expected_managed if shared). Remove image_ref and flavor_ref from CyborgPCIGroup since they belong in the shared cyborg group. Alternatively, if a shared group was not intended, remove the cyborg_group/CyborgGroup references from plugin.py and change the mixin to use per-driver config groups for image_ref/flavor_ref.","commit_id":"005959d343842845941aeb467f46a5baa0a8b02e"}],"cyborg_tempest_plugin/tests/scenario/driver_lifecycle_base.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ddbc728f01a4a944e78a090d6fc215d0092155e7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def _assert_guest_has_device(self, ssh_client):"},{"line_number":89,"context_line":"        vendor_id \u003d self._normalize_pci_id(self._cfg.vendor_id)"},{"line_number":90,"context_line":"        product_id \u003d self._normalize_pci_id(self._cfg.product_id)"},{"line_number":91,"context_line":"        expected \u003d f\"{vendor_id}:{product_id}\""},{"line_number":92,"context_line":"        cmd \u003d \"\"\""},{"line_number":93,"context_line":"found_sysfs\u003d0"},{"line_number":94,"context_line":"for dev in /sys/bus/pci/devices/*; do"}],"source_content_type":"text/x-python","patch_set":1,"id":"99b9e573_2aef7e97","line":91,"updated":"2026-07-15 10:49:29.000000000","message":"pep8: E231 missing whitespace after \u0027:\u0027","commit_id":"c8b3bc4dc5600d2dc1c92c2af8aed981771a5421"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ddbc728f01a4a944e78a090d6fc215d0092155e7","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        self.assertIn("},{"line_number":110,"context_line":"            expected,"},{"line_number":111,"context_line":"            normalized,"},{"line_number":112,"context_line":"            f\"Expected PCI device {expected} in guest PCI devices:\\n{output}\","},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _run_device_specific_validation(self, ssh_client):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5d2d9793_9309bcfa","line":112,"updated":"2026-07-15 10:49:29.000000000","message":"pep8: E231 missing whitespace after \u0027:\u0027","commit_id":"c8b3bc4dc5600d2dc1c92c2af8aed981771a5421"},{"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":"7dfcc1ae88f4d90d87eabde9785309a24c45a28d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_id.lower().removeprefix(\u00270x\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _get_configured_image_ref(self):"},{"line_number":45,"context_line":"        return CONF.cyborg.image_ref or CONF.compute.image_ref"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_configured_flavor_ref(self):"},{"line_number":48,"context_line":"        return CONF.cyborg.flavor_ref or CONF.compute.flavor_ref"}],"source_content_type":"text/x-python","patch_set":4,"id":"a6656ffd_c62ef87f","line":45,"updated":"2026-07-16 07:34:41.000000000","message":"The shared image_ref and flavor_ref config options were added to CyborgPCIGroup (cyborg_pci group), but driver_lifecycle_base.py accesses them via CONF.cyborg.image_ref and CONF.cyborg.flavor_ref. Since no cyborg group with these options is registered, these methods will raise NoSuchOptError or f...\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: When _get_configured_image_ref() or _get_configured_flavor_ref() is called (used by _create_server_with_device and _run_rebuild), oslo_config will raise NoSuchOptError for image_ref/flavor_ref under the cyborg group. This affects every lifecycle test for both PCI and MDEV. Note: this is masked by...\n\n**Priority**: Immediate\n**Why This Matters**: When _get_configured_image_ref() or _get_configured_flavor_ref() is called (used by _create_server_with_device and _run_rebuild), oslo_config will raise NoSuchOptError for image_ref/flavor_ref under the cyborg group. This affects every lifecycle test for both PCI and MDEV. Note: this is masked by...\n\n**Recommendation**:\nCreate a shared cyborg config group (cyborg_group/CyborgGroup) in config.py containing image_ref and flavor_ref, register it in plugin.py, and remove image_ref/flavor_ref from CyborgPCIGroup. This aligns with how the mixin references them (CONF.cyborg.*) and matches the help text describing them as shared options.","commit_id":"005959d343842845941aeb467f46a5baa0a8b02e"},{"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":"8df8e2e4e7436fd885c41fa939fe4e1d548d73d5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        vendor_id \u003d self._normalize_pci_id(self._cfg.vendor_id)"},{"line_number":91,"context_line":"        product_id \u003d self._normalize_pci_id(self._cfg.product_id)"},{"line_number":92,"context_line":"        expected \u003d \"%s:%s\" % (vendor_id, product_id)"},{"line_number":93,"context_line":"        cmd \u003d \"lspci -n\""},{"line_number":94,"context_line":"        output \u003d ssh_client.exec_command(cmd)"},{"line_number":95,"context_line":"        normalized \u003d output.lower().replace(\u00270x\u0027, \u0027\u0027)"},{"line_number":96,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":6,"id":"53511bee_906a51c2","line":93,"updated":"2026-07-16 15:10:47.000000000","message":"The refactored _assert_guest_has_device in DriverLifecycleMixin replaces the old PCI test\u0027s robust sysfs-based detection (reading /sys/bus/pci/devices/*/vendor and */device) with a simple `lspci -n` command. The old code used sysfs as primary and only fell back to lspci when sysfs was unavailable...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: PCI lifecycle scenario tests may fail in environments where the guest image does not include lspci (e.g., minimal or custom images). Previously these tests would succeed via direct sysfs reads. This is a test correctness regression.\n\n**Suggestion**:\nRestore the sysfs-based detection with lspci fallback, or at minimum check that lspci is available before invoking it. Consider keeping the old multi-line shell script for PCI while providing a simpler path for MDEV, or add a sysfs-based fallback to the shared method.","commit_id":"4c2f0392acc96599b10c9cc8159392c7f8f2075f"}]}
