)]}'
{".zuul.yaml":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f69bc94c437bd11b76ee597cd8673e82be240b2e","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    parent: cyborg-tempest"},{"line_number":78,"context_line":"    nodeset: openstack-single-node-noble"},{"line_number":79,"context_line":"    override-checkout: stable/2026.1"},{"line_number":80,"context_line":"    vars: \u0026stable_branch_vars"},{"line_number":81,"context_line":"      devstack_local_conf:"},{"line_number":82,"context_line":"        test-config:"},{"line_number":83,"context_line":"          $TEMPEST_CONFIG:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"07122989_7ae3ccb6","line":80,"updated":"2026-07-21 16:48:40.000000000","message":"I think this should go in the `cyborg-tempest` and `cyborg-tempest-ipv6-only` job definitions, otherwise patches to cyborg stable branches will run these tests, and I don\u0027t think we\u0027ve backported the fixes right?","commit_id":"9d147f3f002bf13201981f205b61b0cec28d4931"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"81cde78a7fc3654d30b9c9fe90481d14c953b621","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    parent: cyborg-tempest"},{"line_number":78,"context_line":"    nodeset: openstack-single-node-noble"},{"line_number":79,"context_line":"    override-checkout: stable/2026.1"},{"line_number":80,"context_line":"    vars: \u0026stable_branch_vars"},{"line_number":81,"context_line":"      devstack_local_conf:"},{"line_number":82,"context_line":"        test-config:"},{"line_number":83,"context_line":"          $TEMPEST_CONFIG:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"0bc9e593_d10bd9f9","line":80,"in_reply_to":"07122989_7ae3ccb6","updated":"2026-08-04 05:33:09.000000000","message":"Yes, we have not backported it.\nI have enabled the tests in https://review.opendev.org/c/openstack/cyborg/+/999683/1","commit_id":"9d147f3f002bf13201981f205b61b0cec28d4931"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5718043c3ff98f183f46cfa590a06e2081549ff5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9cf1561a_661e690f","updated":"2026-06-10 04:57:55.000000000","message":"recheck","commit_id":"a38d1b46f3ca13ef7bee6e9e21ff1a71ea0b4cc4"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"46499c12d51dbd538dfd40cce3e9a6ee9aa79964","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b9f59054_8e41772f","updated":"2026-06-10 02:01:49.000000000","message":"recheck","commit_id":"a38d1b46f3ca13ef7bee6e9e21ff1a71ea0b4cc4"}],"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":"c5a03474aff22ca90715c7ec4194e5ec23b0d1c5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    ),"},{"line_number":81,"context_line":"]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"cyborg_group \u003d cfg.OptGroup("},{"line_number":84,"context_line":"    name\u003d\"cyborg\","},{"line_number":85,"context_line":"    title\u003d\"Cyborg feature toggles\""},{"line_number":86,"context_line":")"}],"source_content_type":"text/x-python","patch_set":6,"id":"cd234697_8bcd70c2","line":83,"updated":"2026-08-04 04:57:15.000000000","message":"The patch adds a second cyborg_group and CyborgGroup at config.py lines 83-94, overwriting the originals at lines 29-44 that define image_ref and flavor_ref. Python module-level reassignment means plugin.py now registers only fake_program, silently dropping image_ref and flavor_ref from the cybor...\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: All PCI lifecycle scenario tests in driver_lifecycle_base.py referencing CONF.cyborg.image_ref or CONF.cyborg.flavor_ref will fail at runtime with NoSuchOptError. Sample config generation via get_opt_lists() also omits these options. This is a merge-blocking regression.\n\n**Priority**: Immediate\n**Why This Matters**: All PCI lifecycle scenario tests in driver_lifecycle_base.py referencing CONF.cyborg.image_ref or CONF.cyborg.flavor_ref will fail at runtime with NoSuchOptError. Sample config generation via get_opt_lists() also omits these options. This is a merge-blocking regression.\n\n**Recommendation**:\nDo not redefine cyborg_group or CyborgGroup. Instead, append cfg.BoolOpt(\u0027fake_program\u0027, default\u003dFalse, help\u003d\u0027Enable FPGA programming tests against the fake driver.\u0027) to the existing CyborgGroup list at lines 34-44, and delete the duplicate definitions at lines 83-94.","commit_id":"10cb3f8fa96aeb67ff09e65cfe1f8c9df940ab61"}],"cyborg_tempest_plugin/tests/scenario/test_accelerator_basic_ops.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":"a3d50ffcf7f4535b164388f3bc23ab2ed651f0ef","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        accel_flavor \u003d self.create_accel_flavor(response[\"name\"])"},{"line_number":95,"context_line":"        # TODO(sean-k-mooney): create_accel_flavor should register its"},{"line_number":96,"context_line":"        # own addCleanup like create_flavor does; fix in the helper."},{"line_number":97,"context_line":"        self.addCleanup("},{"line_number":98,"context_line":"            self.admin_flavors_client.delete_flavor, accel_flavor)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.create_server("}],"source_content_type":"text/x-python","patch_set":4,"id":"bf08b495_23d6a569","line":97,"updated":"2026-07-20 17:41:55.000000000","message":"The test explicitly calls self.addCleanup(self.admin_flavors_client.delete_flavor, accel_flavor), but create_accel_flavor() already registers its own cleanup via test_utils.call_and_ignore_notfound_exc(client.delete_flavor, flavor[\u0027id\u0027]). The duplicate cleanup is harmless due to LIFO ordering, bu...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: No functional harm—the LIFO cleanup order means the explicit cleanup runs first and succeeds, then the helper\u0027s wrapped cleanup runs second and silently ignores the resulting 404. However, the explicit cleanup is not wrapped in call_and_ignore_notfound_exc, so if execution order ever changes, it...\n\n**Recommendation**:\nRemove the explicit addCleanup call since create_accel_flavor() already handles cleanup. Also update or remove the stale TODO comment, since the helper already registers its own cleanup.","commit_id":"c7270469ebcb72acf8e00feeab21dc9748555d75"},{"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":"a3d50ffcf7f4535b164388f3bc23ab2ed651f0ef","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # image_create() uploads from CONF.scenario.img_file and registers"},{"line_number":117,"context_line":"        # cleanup automatically; FakeDriver ignores the file content."},{"line_number":118,"context_line":"        program_response \u003d client.program_deployable("},{"line_number":119,"context_line":"            fake_deps[0][\u0027uuid\u0027], self.image_create(name\u003d\u0027bitstream\u0027))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(fake_deps[0][\u0027uuid\u0027], program_response[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"0f2a67da_0671fda5","line":119,"updated":"2026-07-20 17:41:55.000000000","message":"self.image_create(name\u003d\u0027bitstream\u0027) returns the full image response dict from tempest\u0027s ScenarioTest, not a UUID string. The dict is passed directly as image_uuid to program_deployable(), which serializes it into the JSON-Patch body. The Cyborg server validates image_uuid with types.UUIDType().va...\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: The test will fail at runtime when the Cyborg API rejects the invalid image_uuid value. The entire purpose of the change—adding CI coverage for the FPGA programming path—will not be achieved.\n\n**Priority**: Before merge\n**Why This Matters**: The test will fail at runtime when the Cyborg API rejects the invalid image_uuid value. The entire purpose of the change—adding CI coverage for the FPGA programming path—will not be achieved.\n\n**Recommendation**:\nChange the call to extract the image ID: `self.image_create(name\u003d\u0027bitstream\u0027)[\u0027id\u0027]` instead of `self.image_create(name\u003d\u0027bitstream\u0027)`.","commit_id":"c7270469ebcb72acf8e00feeab21dc9748555d75"},{"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":"d8a58557af8d1e6cdd20140c8c1667c976c94806","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # image_create() uploads from CONF.scenario.img_file and registers"},{"line_number":113,"context_line":"        # cleanup automatically; FakeDriver ignores the file content."},{"line_number":114,"context_line":"        program_response \u003d client.program_deployable("},{"line_number":115,"context_line":"            fake_deps[0][\u0027uuid\u0027], self.image_create(name\u003d\u0027bitstream\u0027))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.assertEqual(fake_deps[0][\u0027uuid\u0027], program_response[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"ce3a3569_6959f92b","line":115,"updated":"2026-08-04 06:03:11.000000000","message":"The test calls self.image_create(name\u003d\u0027bitstream\u0027) and passes the result directly as the image_uuid argument to program_deployable(). Tempest\u0027s ScenarioTest.image_create() returns a dict-like ResponseBody object (the full image representation with keys such as \u0027id\u0027, \u0027name\u0027, \u0027status\u0027), not a UUID...\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: When the test is enabled (fake_program\u003dTrue), the PATCH request to /deployables/{uuid}/program would contain a nested object in the image_uuid field instead of a UUID string. The Cyborg API would likely reject this with a 400 error, causing the test to fail via tempest\u0027s UnexpectedResponseCode ex...\n\n**Priority**: Before merge\n**Why This Matters**: When the test is enabled (fake_program\u003dTrue), the PATCH request to /deployables/{uuid}/program would contain a nested object in the image_uuid field instead of a UUID string. The Cyborg API would likely reject this with a 400 error, causing the test to fail via tempest\u0027s UnexpectedResponseCode ex...\n\n**Recommendation**:\nExtract the image ID before passing it: `image \u003d self.image_create(name\u003d\u0027bitstream\u0027); program_response \u003d client.program_deployable(fake_deps[0][\u0027uuid\u0027], image[\u0027id\u0027])`. This follows the same pattern as create_accel_flavor which returns an ID string, and matches program_deployable\u0027s documented parameter contract.","commit_id":"88812be4e14a7944b6010ef5c1b1fedad87ea9f2"}]}
