)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c9a179ef684b86a99d9fd88fe4169fa780ac31bf","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     jgilaber \u003cjgilaber@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-04 16:19:45 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add duplicate device warning in conductor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When multiple drivers are enabled (e.g. nvidia_gpu_driver and"},{"line_number":10,"context_line":"mdev_driver), they may both discover the same parent PCI device."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"c505e476_934634a0","line":7,"range":{"start_line":7,"start_character":21,"end_line":7,"end_character":28},"updated":"2026-08-04 19:14:02.000000000","message":"this should be a hard startup error not a warning.\n\nthis is invalide config so we shoudl not silently let cybrog start in this unsafe config state","commit_id":"c66e2d0f41e328eb6d94e229dcc68b09199933b9"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"673a4559ff1d3e4d3e47db5186b38667ae4d2d5e","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     jgilaber \u003cjgilaber@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-04 16:19:45 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add duplicate device warning in conductor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When multiple drivers are enabled (e.g. nvidia_gpu_driver and"},{"line_number":10,"context_line":"mdev_driver), they may both discover the same parent PCI device."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"83c78c6c_aa2559fc","line":7,"range":{"start_line":7,"start_character":21,"end_line":7,"end_character":28},"in_reply_to":"c505e476_934634a0","updated":"2026-08-31 12:35:33.000000000","message":"ack, I\u0027ve changed the behaviour to raise an error instead","commit_id":"c66e2d0f41e328eb6d94e229dcc68b09199933b9"},{"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":"b9d123d535ac8631d618c5d7509702d1cf633a41","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     cfe1a078 (Add generic mdev driver)"},{"line_number":2,"context_line":"Author:     jgilaber \u003cjgilaber@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-07-09 14:49:37 +0200"},{"line_number":4,"context_line":"Commit:     jgilaber \u003cjgilaber@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"72cbe191_d62f2bb5","line":1,"updated":"2026-09-18 14:29:34.000000000","message":"The commit message body reads \"Add an check for this in report_data() that detects duplicate controlpath_id.cpid_info entries\". The indefinite article is wrong before the noun \u0027check\u0027; it must be \u0027Add a check for this\u0027. The rest of the message accurately describes the behavior (the set-based diff collapses duplicates and the first reported entry wins, confirmed by the set() and list.index() logic in drv_device_make_diff).\n\n**Severity**: SUGGESTION | **Confidence**: 0.99\n\n**Impact**: Minor but permanent reduction in the quality of the project history. There is no runtime or behavioral impact; the intended meaning remains obvious.\n\n**Recommendation**:\nAmend the commit message to read \u0027Add a check for this in report_data()\u0027 when reworking the change for the next patchset (e.g. git commit --amend).","commit_id":"1facc32d25291b143ad5018c2881dc50128f860b"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":39344,"name":"Gihong Lee","display_name":"gamio","email":"gh9231@gmail.com","username":"gamio"},"change_message_id":"efb710f65d49d63136fa219bde90e3e74a9527c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"0e8f02ea_a0e11922","updated":"2026-08-03 13:49:13.000000000","message":"Traced it through drv_device_make_diff, and yeah, the set and the .index() call really do drop the duplicate silently. Good catch. One question below.","commit_id":"582702ea7a47f5a36e8bd9bccb970f70189d1435"}],"cyborg/conductor/manager.py":[{"author":{"_account_id":39344,"name":"Gihong Lee","display_name":"gamio","email":"gh9231@gmail.com","username":"gamio"},"change_message_id":"efb710f65d49d63136fa219bde90e3e74a9527c2","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        :param driver_device_list: a list of driver_device object"},{"line_number":168,"context_line":"        discovered by agent in the host."},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        self._warn_duplicate_devices(driver_device_list)"},{"line_number":171,"context_line":"        # TODO(): Every time get from the DB?"},{"line_number":172,"context_line":"        # First retrieve the old_device_list from the DB."},{"line_number":173,"context_line":"        old_driver_device_list \u003d DriverDevice.list(context, hostname)"}],"source_content_type":"text/x-python","patch_set":12,"id":"427af747_bba1b98a","line":170,"updated":"2026-08-03 13:49:13.000000000","message":"This fires on every periodic report (`periodic_interval`, 60s by default), so it\u0027ll warn about once a minute while the config stays that way. Is that intended, or would warning once and only again when the duplicates change be better? Not blocking.","commit_id":"582702ea7a47f5a36e8bd9bccb970f70189d1435"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"673a4559ff1d3e4d3e47db5186b38667ae4d2d5e","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        :param driver_device_list: a list of driver_device object"},{"line_number":168,"context_line":"        discovered by agent in the host."},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        self._warn_duplicate_devices(driver_device_list)"},{"line_number":171,"context_line":"        # TODO(): Every time get from the DB?"},{"line_number":172,"context_line":"        # First retrieve the old_device_list from the DB."},{"line_number":173,"context_line":"        old_driver_device_list \u003d DriverDevice.list(context, hostname)"}],"source_content_type":"text/x-python","patch_set":12,"id":"52e9d3d2_4eb890c5","line":170,"in_reply_to":"427af747_bba1b98a","updated":"2026-08-31 12:35:33.000000000","message":"in patchset 14 I changed from a warning to an error, so in case it finds a duplicate it will only be shown once. We could consider adding some caching for the case with no detection, but the check should be fast, so I\u0027m not sure it\u0027s worth it","commit_id":"582702ea7a47f5a36e8bd9bccb970f70189d1435"},{"author":{"_account_id":39344,"name":"Gihong Lee","display_name":"gamio","email":"gh9231@gmail.com","username":"gamio"},"change_message_id":"14b58886daf4917ee243275fff2a62bd33c3064d","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        :param driver_device_list: a list of driver_device object"},{"line_number":168,"context_line":"        discovered by agent in the host."},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        self._warn_duplicate_devices(driver_device_list)"},{"line_number":171,"context_line":"        # TODO(): Every time get from the DB?"},{"line_number":172,"context_line":"        # First retrieve the old_device_list from the DB."},{"line_number":173,"context_line":"        old_driver_device_list \u003d DriverDevice.list(context, hostname)"}],"source_content_type":"text/x-python","patch_set":12,"id":"87d5669f_dcb0d1bd","line":170,"in_reply_to":"52e9d3d2_4eb890c5","updated":"2026-09-15 14:45:46.000000000","message":"Within a single call I see it now surfaces once instead of one warning per duplicate. Across calls though, `report_data` runs on a periodic task, so a persistent misconfiguration would raise this every interval. \n\nIs that the intended behaviour, or is the expectation that the operator fixes the config before the next run?","commit_id":"582702ea7a47f5a36e8bd9bccb970f70189d1435"}],"cyborg/tests/unit/conductor/test_manager.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":"4ae86919956f68347fd9535191a8e09b147234e6","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.cm._warn_duplicate_devices(devices)"},{"line_number":230,"context_line":"        mock_log.warning.assert_called_once()"},{"line_number":231,"context_line":"        args \u003d mock_log.warning.call_args[0]"},{"line_number":232,"context_line":"        self.assertIn(devices[0].controlpath_id.cpid_info, args[1])"},{"line_number":233,"context_line":"        self.assertEqual([\u0027GPU/0xABCD\u0027, \u0027GPU/0xDCBA\u0027], args[2])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":1,"id":"745bc93a_aadf41e2","line":232,"updated":"2026-07-13 14:23:52.000000000","message":"The assertion `self.assertIn(devices[0].controlpath_id.cpid_info, args[1])` checks substring containment of a string within itself, since args[1] is the exact cpid_info string passed to LOG.warning. This assertion always passes regardless of the actual value, making it ineffective at verifying th...\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: The test does not effectively verify that the correct cpid_info value is passed to the warning. A regression that passes the wrong cpid_info could go undetected as long as the expected value remains a substring of the actual value.\n\n**Recommendation**:\nReplace `self.assertIn(devices[0].controlpath_id.cpid_info, args[1])` with `self.assertEqual(devices[0].controlpath_id.cpid_info, args[1])` to perform a precise equality check on the logged cpid_info value.","commit_id":"3115cf89058e6d397de34a6979ee66104fbe32c1"},{"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":"a4f80a9b3416d2b479ccca203ed5790bb068a0e4","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.cm._warn_duplicate_devices(devices)"},{"line_number":230,"context_line":"        mock_log.warning.assert_called_once()"},{"line_number":231,"context_line":"        args \u003d mock_log.warning.call_args[0]"},{"line_number":232,"context_line":"        self.assertIn(devices[0].controlpath_id.cpid_info, args[1])"},{"line_number":233,"context_line":"        self.assertEqual([\u0027GPU/0xABCD\u0027, \u0027GPU/0xDCBA\u0027], args[2])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":2,"id":"a6fab1fd_3122addb","line":232,"updated":"2026-07-13 17:53:53.000000000","message":"The test uses assertIn to check cpid_info but compares a string against itself, making the assertion always pass regardless of correctness.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: The test appears to verify that the correct cpid_info is included in the warning, but the assertion is a no-op. If a future refactor accidentally passed a wrong value, this assertion would still pass, masking the regression.\n\n**Recommendation**:\nReplace self.assertIn(devices[0].controlpath_id.cpid_info, args[1]) with self.assertEqual(devices[0].controlpath_id.cpid_info, args[1]) to perform a meaningful equality check on the logged cpid_info value.","commit_id":"b3e09696220bd85426f9e2b19f76dbd69712b583"},{"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":"3716d6f5c2275302b8f2865ac239be552ff17eb0","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.cm._warn_duplicate_devices(devices)"},{"line_number":230,"context_line":"        mock_log.warning.assert_called_once()"},{"line_number":231,"context_line":"        args \u003d mock_log.warning.call_args[0]"},{"line_number":232,"context_line":"        self.assertIn(devices[0].controlpath_id.cpid_info, args[1])"},{"line_number":233,"context_line":"        self.assertEqual([\u0027GPU/0xABCD\u0027, \u0027GPU/0xDCBA\u0027], args[2])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":3,"id":"78d22ccd_e9c0e821","line":232,"updated":"2026-07-16 17:27:24.000000000","message":"The assertion self.assertIn(devices[0].controlpath_id.cpid_info, args[1]) checks that a string is a substring of itself, which is always True. It provides no meaningful verification.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: The assertion appears to verify that the correct cpid_info is passed to the warning but actually verifies nothing. A regression changing which cpid_info is logged would not be caught.\n\n**Recommendation**:\nReplace assertIn with assertEqual: self.assertEqual(devices[0].controlpath_id.cpid_info, args[1]) to verify the correct cpid_info value is passed to LOG.warning.","commit_id":"1b2e3cd0f425c27983688c16335b662b04dfd761"},{"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":"2b1a818782199d58f7fd5894751ce2d01f9a5b76","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.cm._warn_duplicate_devices(devices)"},{"line_number":230,"context_line":"        mock_log.warning.assert_called_once()"},{"line_number":231,"context_line":"        args \u003d mock_log.warning.call_args[0]"},{"line_number":232,"context_line":"        self.assertIn(devices[0].controlpath_id.cpid_info, args[1])"},{"line_number":233,"context_line":"        self.assertEqual([\u0027GPU/0xABCD\u0027, \u0027GPU/0xDCBA\u0027], args[2])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @mock.patch("}],"source_content_type":"text/x-python","patch_set":6,"id":"d81c35ee_7e4434eb","line":232,"updated":"2026-07-22 12:49:50.000000000","message":"The assertion assertIn(devices[0].controlpath_id.cpid_info, args[1]) checks whether the cpid_info string is a substring of itself, since args[1] IS the cpid_info positional argument passed to LOG.warning. This assertion always passes regardless of correctness.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: The test does not actually verify that the correct cpid_info value is passed to LOG.warning. A future bug that passes the wrong cpid_info would not be caught by this assertion. The test still validates the call count and dev_types list, so coverage is not entirely lost.\n\n**Recommendation**:\nReplace assertIn with assertEqual: self.assertEqual(devices[0].controlpath_id.cpid_info, args[1]). This verifies the exact cpid_info value is passed to the warning.","commit_id":"ac169745a1b61a826fb49a3554ea661577b8d2cd"}],"releasenotes/notes/duplicate-device-raises-error-f7435c2c49c73298.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":"e859bd29870c1c9b222b0c3468552497a6a40359","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    When multiple enabled drivers report the same physical device (identified"},{"line_number":5,"context_line":"    by its ``controlpath_id.cpid_info``), the conductor now rejects the whole"},{"line_number":6,"context_line":"    device report by raising a ``DuplicateDeviceReported`` (HTTP 409 Conflict)"},{"line_number":7,"context_line":"    error. As a result, the affected agent\u0027s ``report_data`` call fails and"},{"line_number":8,"context_line":"    no device data is stored for that host until the conflict is resolved."},{"line_number":9,"context_line":"    Operators must review and correct their ``enabled_drivers`` and"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"e820e98f_5e798e70","line":6,"updated":"2026-08-31 15:34:49.000000000","message":"The upgrade release note says the conductor rejects the report \u0027by raising a DuplicateDeviceReported (HTTP 409 Conflict) error\u0027. The exception is raised inside the conductor RPC worker and propagated back to the agent over oslo.messaging; no REST API handler returns it, so no operator or client ever observes HTTP 409. The observable symptom is a logged error in the agent\u0027s periodic update_available_resource task, not an HTTP status.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: Operators troubleshooting the upgrade will look for a 409 response in API logs or from clients and will not find it; the actual symptom (repeated error logged by the cyborg-agent periodic task, stale device inventory) is different and harder to connect to this note.\n\n**Recommendation**:\nDrop the \u0027(HTTP 409 Conflict)\u0027 parenthetical and instead describe the observable symptom: the agent logs a DuplicateDeviceReported error each reporting interval and no device data is stored for the host until enabled_drivers/device_spec is corrected.","commit_id":"2a5a510735f6272177d50d181b8e9d3eb53e63c2"}]}
