)]}'
{"cyborg/tests/__init__.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":"3c95be4e32bc2edadfaf789605559cc694defbd6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import oslo_service.backend as service"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"service.init_backend(service.BackendType.THREADING)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5e906838_c437a7f7","line":1,"updated":"2026-06-25 20:26:34.000000000","message":"cyborg/tests/__init__.py now contains executable code (oslo_service backend init) but has no Apache license header, unlike the moved unit/__init__.py.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The repo runs flake8 with select\u003dH (hacking) and H102 (missing license header) is not ignored. The file was previously empty so passed; now non-empty, tox -epep8 may newly fail on H102.\n\n**Suggestion**:\nAdd the standard Apache 2.0 license header used elsewhere in the repo (e.g. the header on cyborg/tests/unit/__init__.py) to cyborg/tests/__init__.py, then run tox -epep8 to confirm no H102.","commit_id":"7400129897644343f7f51cfa943442dde9165b63"}],"cyborg/tests/functional/api/test_api_samples.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":"9e20a2118acc1dea285e8bc1934ab54bf5867416","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            os.path.join(SAMPLES_DIR, \u0027accelerator_requests\u0027,"},{"line_number":141,"context_line":"                         \u0027accelerator_requests-getone-resp.json\u0027))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_arqs_before_update(self):"},{"line_number":144,"context_line":"        uuid \u003d self.test_data[\u0027arq\u0027][\u0027uuid\u0027]"},{"line_number":145,"context_line":"        self._check_sample("},{"line_number":146,"context_line":"            \u0027/v2/accelerator_requests/%s\u0027 % uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bb64158a_121e2591","line":143,"updated":"2026-06-24 23:10:00.000000000","message":"test_arqs_before_update is structurally identical to test_arqs_get_one. Both GET /v2/accelerator_requests/{uuid} with the same seeded data in \u0027Initial\u0027 state, and the sample files have identical key sets. Structural comparison ignores values, adding no coverage.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Removing or differentiating this test reduces maintenance burden and makes the test suite\u0027s intent clearer. If the goal is to validate a pre-update ARQ structure, the test should seed an ARQ in a different state or hit a different endpoint to provide meaningful additional coverage.\n\n**Recommendation**:\nEither remove test_arqs_before_update as redundant, or differentiate it by seeding the ARQ in a \u0027Bound\u0027 or post-update state and using a sample that reflects that state\u0027s structure (e.g., non-null attach_handle fields).","commit_id":"6668d4e840edd5271b4c417ccd92d2db0a51b44b"},{"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":"3c95be4e32bc2edadfaf789605559cc694defbd6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"and compares the response *structure* (keys and value types) against"},{"line_number":17,"context_line":"the corresponding sample JSON file.  Values like UUIDs, timestamps,"},{"line_number":18,"context_line":"and URLs are ignored — only shape matters."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Set GENERATE_SAMPLES\u003d1 to overwrite sample files with actual responses."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"378f53fc_5fbbd626","line":19,"updated":"2026-06-25 20:26:34.000000000","message":"GENERATE_SAMPLES write path uses os.makedirs without exist_ok and computes the samples dir via four os.pardir levels relative to the test file.\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Coupling the path to directory depth is fragile, and os.makedirs(sample_dir) without exist_ok\u003dTrue raises if the dir already exists when regenerating a second sample in the same run.\n\n**Recommendation**:\nUse os.makedirs(sample_dir, exist_ok\u003dTrue) in the GENERATE_SAMPLES block of test_api_samples_base.py, and optionally centralize SAMPLES_DIR in common.py so the depth calculation lives in one place.","commit_id":"7400129897644343f7f51cfa943442dde9165b63"}],"cyborg/tests/functional/api/test_api_samples_base.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":"9e20a2118acc1dea285e8bc1934ab54bf5867416","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            _assert_structure_matches("},{"line_number":59,"context_line":"                expected[key], actual[key], \u0027%s.%s\u0027 % (path, key))"},{"line_number":60,"context_line":"    elif type(expected) is list and type(actual) is list:"},{"line_number":61,"context_line":"        if expected and actual:"},{"line_number":62,"context_line":"            _assert_structure_matches("},{"line_number":63,"context_line":"                expected[0], actual[0], \u0027%s[0]\u0027 % path)"},{"line_number":64,"context_line":"    elif type(expected) is not type(actual):"}],"source_content_type":"text/x-python","patch_set":1,"id":"d46e36bb_7f541703","line":61,"updated":"2026-06-24 23:10:00.000000000","message":"The _assert_structure_matches function only compares list element [0] for lists. The device_profiles-list-resp.json sample has 2 entries with different group key structures (entry 0 has 3 trait keys, entry 1 has 2), but only entry 0 is ever validated against the actual response.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Documenting this limitation or iterating over all list elements would catch structural drift in later list entries that the current approach misses.\n\n**Recommendation**:\nConsider adding a comment documenting that only the first list element is structurally compared (intentional for heterogeneous lists), or iterate over all elements when they exist. For the device_profiles case, ensure the sample\u0027s second entry reflects a real-world variant or remove it to avoid confusion.","commit_id":"6668d4e840edd5271b4c417ccd92d2db0a51b44b"},{"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":"9e20a2118acc1dea285e8bc1934ab54bf5867416","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.test_data.update(result)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def seed_arqs(self):"},{"line_number":100,"context_line":"        self._agent_patcher \u003d mock.patch("},{"line_number":101,"context_line":"            \u0027cyborg.objects.ext_arq.AgentAPI\u0027, autospec\u003dFalse)"},{"line_number":102,"context_line":"        self._agent_patcher.start()"},{"line_number":103,"context_line":"        self.seed_device_profiles()"}],"source_content_type":"text/x-python","patch_set":1,"id":"65b81cd1_9b844263","line":100,"updated":"2026-06-24 23:10:00.000000000","message":"mock.patch for AgentAPI uses autospec\u003dFalse, disabling spec checking on the mock. This means typos in method names or wrong signatures on the mock will silently pass instead of raising at call time. The existing codebase has mixed autospec usage, but new code should follow the recommended practice.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If the AgentAPI interface changes (new required methods, signature changes), this mock will not catch the mismatch, potentially masking real integration issues in functional tests.\n\n**Suggestion**:\nUse autospec\u003dTrue (the default recommendation) or omit the autospec parameter entirely. If autospec\u003dTrue causes issues with the AgentAPI class, document why autospec\u003dFalse is necessary. For example: mock.patch(\u0027cyborg.objects.ext_arq.AgentAPI\u0027, autospec\u003dTrue)","commit_id":"6668d4e840edd5271b4c417ccd92d2db0a51b44b"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Checks that *expected* and *actual* have the same shape: identical"},{"line_number":37,"context_line":"    dict keys, matching value types, and consistent list-element"},{"line_number":38,"context_line":"    structure.  Scalar *values* (strings, numbers) are not compared —"},{"line_number":39,"context_line":"    only their types."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    None/null in either position is treated as a wildcard that matches"}],"source_content_type":"text/x-python","patch_set":2,"id":"189e2870_774799e7","line":38,"updated":"2026-06-25 16:54:07.000000000","message":"The structural comparison for list responses requires exact list length match (len(expected) !\u003d len(actual)). This couples the number of seeded objects to the sample file entry count, making test data and samples tightly coupled.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: If someone adds a third device profile in seed_device_profiles(), the list test will fail with a confusing length mismatch rather than a structural error. The structural validation intent is to verify shape, not count, but the implementation conflates the two.\n\n**Suggestion**:\nConsider comparing only the first element\u0027s structure for list responses (or documenting that the count must match). If exact count matching is intentional for detecting added/removed items, add a comment explaining this design choice so future maintainers understand the coupling.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    if expected is None or actual is None:"},{"line_number":47,"context_line":"        return"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    if type(expected) is dict and type(actual) is dict:"},{"line_number":50,"context_line":"        expected_keys \u003d set(expected.keys())"},{"line_number":51,"context_line":"        actual_keys \u003d set(actual.keys())"}],"source_content_type":"text/x-python","patch_set":2,"id":"f6890496_e82a6fb5","line":48,"updated":"2026-06-25 16:54:07.000000000","message":"ApiSampleTestBase.setUp() does not reset global Pecan configuration after tests. The existing unit test base (cyborg/tests/unit/api/base.py) explicitly calls pecan.set_config({}, overwrite\u003dTrue) in addCleanup after load_test_app, but the new functional base omits this.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: pecan.testing.load_test_app() sets global Pecan configuration state. Without resetting it in tearDown/addCleanup, this state leaks across test modules, potentially causing failures in other test classes that assume default Pecan configuration.\n\n**Priority**: Before merge\n**Why This Matters**: The existing BaseApiTest pattern (unit/api/base.py lines 44-46) was specifically designed to clean up Pecan global state. The new functional base should follow the same pattern to avoid test pollution when functional and unit tests run in the same stestr session.\n\n**Recommendation**:\nAdd cleanup after self.app \u003d common.make_app() in setUp: self.addCleanup(lambda: pecan.set_config({}, overwrite\u003dTrue)). Import pecan at the top of test_api_samples_base.py.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        expected_keys \u003d set(expected.keys())"},{"line_number":51,"context_line":"        actual_keys \u003d set(actual.keys())"},{"line_number":52,"context_line":"        missing \u003d expected_keys - actual_keys"},{"line_number":53,"context_line":"        extra \u003d actual_keys - expected_keys"},{"line_number":54,"context_line":"        if missing:"},{"line_number":55,"context_line":"            raise AssertionError("},{"line_number":56,"context_line":"                \u0027%s: missing keys in response: %s\u0027 % (path, missing)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c3117a6_7fb7f724","line":53,"updated":"2026-06-25 16:54:07.000000000","message":"The seed_arqs() method in test_api_samples_base.py sets self._agent_patcher but the tearDown() uses hasattr() to check for it. A cleaner pattern would be to always set it to None in setUp or use addCleanup.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Using addCleanup(self._agent_patcher.stop) in seed_arqs() instead of hasattr-checking in tearDown() eliminates the conditional teardown logic and ensures cleanup always runs for tests that mock the agent API.\n\n**Recommendation**:\nIn seed_arqs(), after self._agent_patcher.start(), add self.addCleanup(self._agent_patcher.stop). Then remove the hasattr check from tearDown(). This follows the addCleanup pattern recommended by the previous issue as well.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                \u0027%s\\nSample path: %s\u0027 % (e, os.path.normpath(sample_path))"},{"line_number":161,"context_line":"            )"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def tearDown(self):"},{"line_number":164,"context_line":"        if hasattr(self, \u0027_agent_patcher\u0027):"},{"line_number":165,"context_line":"            self._agent_patcher.stop()"},{"line_number":166,"context_line":"        self._policy.cleanUp()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3e16e281_5b711f7e","line":163,"updated":"2026-06-25 16:54:07.000000000","message":"tearDown() calls cleanUp() on fixtures in manual order instead of using addCleanup, which is fragile: if any cleanUp() raises, remaining fixtures leak and subsequent tests may fail with confusing errors.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: If _ef.cleanUp() or _policy.cleanUp() raises an exception, the subsequent cleanUp() calls are skipped, leaving global CONF state polluted for the next test. This can cause cascading test failures that are hard to debug.\n\n**Priority**: Before merge\n**Why This Matters**: Fixture teardown ordering bugs are a common source of flaky functional test suites. The oslotest/fixtures library strongly recommends addCleanup over manual tearDown chains precisely to avoid this.\n\n**Recommendation**:\nRegister each cleanup in setUp using self.addCleanup() instead of a manual tearDown chain. For example: self.addCleanup(self._policy.cleanUp) immediately after self._policy \u003d common.setup_policy(). This ensures all cleanups run even if one fails. Alternatively, use self.useFixture() for fixtures that support it.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"160f95bc02f6ff1387bdd9cbe13057b8dccc8d28","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self.test_data.update(result)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def seed_arqs(self):"},{"line_number":126,"context_line":"        patcher \u003d mock.patch(\u0027cyborg.objects.ext_arq.AgentAPI\u0027)"},{"line_number":127,"context_line":"        patcher.start()"},{"line_number":128,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":129,"context_line":"        self.seed_device_profiles()"}],"source_content_type":"text/x-python","patch_set":3,"id":"933d3617_c6d9e628","line":126,"updated":"2026-06-25 18:39:45.000000000","message":"The mock.patch in seed_arqs uses mock.patch(\u0027cyborg.objects.ext_arq.AgentAPI\u0027) without autospec\u003dTrue. Project guidelines recommend autospec\u003dTrue for new code to catch interface mismatches.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Using autospec\u003dTrue ensures the mock validates attribute access against the real AgentAPI class interface, catching typos or interface changes at test time.\n\n**Recommendation**:\nChange to mock.patch(\u0027cyborg.objects.ext_arq.AgentAPI\u0027, autospec\u003dTrue) for interface safety. Since this is new code, following the recommended practice is appropriate.","commit_id":"12891c37320ee48b3316724b0ce277a3355740f6"},{"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":"3c95be4e32bc2edadfaf789605559cc694defbd6","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    List comparison is order-independent (same approach as Nova\u0027s"},{"line_number":47,"context_line":"    api_samples_test_base): each actual element is greedily paired"},{"line_number":48,"context_line":"    with a structurally matching expected element."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    Raises AssertionError with a JSONPath-style breadcrumb on mismatch."},{"line_number":51,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a975252_76fa58bc","line":48,"updated":"2026-06-25 20:26:34.000000000","message":"_assert_structure_matches treats any None in either expected or actual as a wildcard that matches everything and returns immediately, skipping key/type checks beneath that node.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: When a sample deliberately uses null for an optional field whose actual value is a dict/list, the comparison would no longer verify the nested structure, weakening drift detection at exactly the fields most prone to schema change.\n\n**Recommendation**:\nConsider narrowing the wildcard so None matches only scalar positions, or document explicitly in the docstring that null samples intentionally disable subtree checking. For these samples the current values are scalars so impact is low, but a comment would prevent future drift being silently hidden.","commit_id":"7400129897644343f7f51cfa943442dde9165b63"},{"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":"79573af5aa3e66bd3ad920cad0da79696b53a1e9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    if expected is None or actual is None:"},{"line_number":53,"context_line":"        return"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    if type(expected) is dict and type(actual) is dict:"},{"line_number":56,"context_line":"        expected_keys \u003d set(expected.keys())"},{"line_number":57,"context_line":"        actual_keys \u003d set(actual.keys())"},{"line_number":58,"context_line":"        missing \u003d expected_keys - actual_keys"}],"source_content_type":"text/x-python","patch_set":5,"id":"1cc0d04a_e2135b55","line":55,"updated":"2026-06-25 20:52:44.000000000","message":"The _assert_structure_matches function uses identity comparison (type(expected) is dict) instead of isinstance. This is intentional for strict structural matching and correctly distinguishes bool from int, but warrants a comment explaining the choice.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Adding a one-line comment (e.g., \u0027# Use type() identity, not isinstance, so bool !\u003d int and dict subclasses do not silently match\u0027) prevents future maintainers from \u0027fixing\u0027 this to isinstance, which would introduce bool/int false matches.\n\n**Recommendation**:\nAdd a brief inline comment near the type() comparisons (lines 55, 72, 107) explaining that identity comparison is intentional: it ensures bool values do not match int samples, and prevents dict subclasses from matching.","commit_id":"1a9c396706c15e01c3409d925ad8b017e7785636"}],"cyborg/tests/functional/fixtures/capture.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":"79573af5aa3e66bd3ad920cad0da79696b53a1e9","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def createLock(self):"},{"line_number":32,"context_line":"        self.lock \u003d None"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class Logging(log.ConfigureLogging):"}],"source_content_type":"text/x-python","patch_set":5,"id":"14bb2eee_9761ca56","line":32,"updated":"2026-06-25 20:52:44.000000000","message":"NullHandler.createLock sets self.lock \u003d None, disabling thread safety. The overridden handle() bypasses the lock, but the base Handler.emit() still acquires self.lock. If emit() is ever called directly, it crashes with AttributeError on None.lock.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If a future Python version or logging framework change causes emit() to be called on this handler (instead of the overridden handle()), tests would crash with AttributeError instead of degrading gracefully.\n\n**Suggestion**:\nEither use the standard library logging.NullHandler (which has a no-op emit without touching the lock), or set self.lock \u003d threading.Lock() in createLock if the goal is a lightweight lock. The custom NullHandler\u0027s value-add is calling self.format() to detect format string errors, which can be preserved without nullifying the lock.","commit_id":"1a9c396706c15e01c3409d925ad8b017e7785636"}],"cyborg/tests/functional/fixtures/common.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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    conf.config("},{"line_number":59,"context_line":"        connection\u003d\u0027sqlite://\u0027, sqlite_synchronous\u003dFalse, group\u003d\u0027database\u0027"},{"line_number":60,"context_line":"    )"},{"line_number":61,"context_line":"    CONF([], default_config_files\u003d[])"},{"line_number":62,"context_line":"    return conf"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"02016e26_fe3866a1","line":61,"updated":"2026-06-25 16:54:07.000000000","message":"setup_database() configures the connection string in two places: setup_config() sets \u0027connection\u003dsqlite://\u0027 via conf.config(group\u003d\u0027database\u0027), and setup_database() configures it again via enginefacade.transaction_context(). This redundant configuration could lead to confusion.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Reducing redundant configuration paths makes the database setup clearer and ensures there is a single source of truth for the test connection string. It also reduces the chance of the two configurations diverging.\n\n**Recommendation**:\nVerify whether both configuration paths are needed (one for oslo_config CONF, one for the enginefacade fixture). If the enginefacade fixture overrides CONF, add a comment explaining why both are necessary. If not, remove the redundant conf.config() call in setup_config().","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":99,"context_line":"def make_app():"},{"line_number":100,"context_line":"    \"\"\"Build a WebTest-wrapped Pecan app for functional tests.\"\"\""},{"line_number":101,"context_line":"    app_config \u003d {"},{"line_number":102,"context_line":"        \u0027app\u0027: {"},{"line_number":103,"context_line":"            \u0027root\u0027: \u0027cyborg.api.controllers.root.RootController\u0027,"},{"line_number":104,"context_line":"            \u0027modules\u0027: [\u0027cyborg.api\u0027],"},{"line_number":105,"context_line":"            \u0027acl_public_routes\u0027: [\u0027/\u0027, \u0027/v1/.*\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"daeb96da_f138bdde","line":102,"updated":"2026-06-25 16:54:07.000000000","message":"make_app() uses acl_public_routes [\u0027/\u0027, \u0027/v1/.*\u0027] but the API only exposes v2 routes (RootController has v2 \u003d v2.Controller(), no v1). The v1 pattern is carried over from the unit test base without verification.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Aligning the public routes with actual API versions makes the test configuration more accurate and avoids confusion for future developers who may wonder about v1 routing.\n\n**Recommendation**:\nVerify whether \u0027/v1/.*\u0027 is intentional (perhaps for version negotiation). If it is a copy-paste artifact, consider using \u0027/\u0027 alone or adding \u0027/v2/.*\u0027 as the public route. This matches the existing unit test base pattern but should be confirmed for the functional context.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return pecan.testing.load_test_app(app_config)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def seed_devices(context, db):"},{"line_number":116,"context_line":"    \"\"\"Create a test device with a deployable and attribute.\"\"\""},{"line_number":117,"context_line":"    dev \u003d objects.Device("},{"line_number":118,"context_line":"        context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e9d6c03_845c8914","line":115,"updated":"2026-06-25 16:54:07.000000000","message":"The \u0027db\u0027 parameter in seed_devices() and seed_device_profiles() is accepted but never used inside the function body. Only seed_arqs() actually uses it (for db.extarq_update).\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Dead parameters are misleading to future developers who may assume db is needed and pass it unnecessarily, or who may not realize seed_arqs is the only function with a real db dependency. It also makes the API inconsistent.\n\n**Suggestion**:\nRemove the \u0027db\u0027 parameter from seed_devices() and seed_device_profiles() signatures, and update the callers in test_api_samples_base.py (seed_devices, seed_device_profiles methods) to not pass self._db. Keep it only for seed_arqs() where it is actually used.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"},{"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":"160f95bc02f6ff1387bdd9cbe13057b8dccc8d28","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    Group keys are chosen to match doc/api_samples/ so structural"},{"line_number":161,"context_line":"    comparison passes for every list entry."},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    dp1 \u003d objects.DeviceProfile("},{"line_number":164,"context_line":"        context,"},{"line_number":165,"context_line":"        uuid\u003duuidutils.generate_uuid(),"},{"line_number":166,"context_line":"        name\u003d\u0027test-dp-1\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"608dd2ec_62056dcd","line":163,"updated":"2026-06-25 18:39:45.000000000","message":"The device_profiles list test relies on insertion order matching between seed data (dp1 has 3 group keys, dp2 has 2) and the sample file. _assert_structure_matches compares list elements by index, so a different DB return order causes a false structural mismatch on group keys.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Test could fail intermittently if DB list ordering changes (e.g., after a DB migration or concurrent test runs). The fragility is that positional comparison of heterogeneous list elements depends on stable sort order.\n\n**Suggestion**:\nConsider either sorting the expected and actual lists by a stable key (e.g., name) before structural comparison, or add a comment in seed_device_profiles documenting that list ordering must match the sample file. Alternatively, make all seed profiles structurally identical (same group keys) so order does not matter.","commit_id":"12891c37320ee48b3316724b0ce277a3355740f6"},{"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":"3c95be4e32bc2edadfaf789605559cc694defbd6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        state.request.conductor_api \u003d self.conductor_api"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def setup_config():"},{"line_number":53,"context_line":"    \"\"\"Configure global cfg.CONF for functional testing.\"\"\""},{"line_number":54,"context_line":"    objects.register_all()"},{"line_number":55,"context_line":"    conf \u003d config_fixture.Config(cfg.CONF)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fb729bce_f0f158e6","line":52,"updated":"2026-06-25 20:26:34.000000000","message":"The in-memory SQLite connection is configured twice: once in setup_config (conf.config connection\u003dsqlite://, group\u003ddatabase) and again in setup_database (local_ef.configure(connection\u003d...)).\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Removing the redundant cfg.CONF database override (or adding a comment explaining why both the CONF default and the enginefacade configure call are needed) would clarify the setup and avoid confusion about which value is authoritative.\n\n**Recommendation**:\nKeep the enginefacade.configure in setup_database (it wires the StaticPool in-memory connection) and either drop the group\u003d\u0027database\u0027 conf.config in setup_config or annotate that it only satisfies code reading CONF.database.connection directly. A note suffices since this mirrors tests/base.py.","commit_id":"7400129897644343f7f51cfa943442dde9165b63"},{"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":"3c95be4e32bc2edadfaf789605559cc694defbd6","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        ),"},{"line_number":273,"context_line":"    )"},{"line_number":274,"context_line":"    bound_obj.create(context)"},{"line_number":275,"context_line":"    db.extarq_update("},{"line_number":276,"context_line":"        context,"},{"line_number":277,"context_line":"        bound_obj.arq.uuid,"},{"line_number":278,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":4,"id":"39441c8d_66b7133f","line":275,"updated":"2026-06-25 20:26:34.000000000","message":"seed_arqs directly calls db.extarq_update to force a Bound state, bypassing the ExtARQ state machine that normally drives state transitions and sets attach_handle fields.\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: The structural test only verifies shape so this is acceptable for a fixture, but it means the Bound sample is exercised against a hand-set row rather than the real bind path. If bind logic later changes which fields it populates, the sample could drift silently.\n\n**Recommendation**:\nThe comment at lines 271-272 partially explains this; consider also asserting the seeded attach_handle_uuid is non-null so a future bind-path field addition is caught rather than masked by the None wildcard.","commit_id":"7400129897644343f7f51cfa943442dde9165b63"}],"doc/api_samples/accelerator_requests/accelerator_requests-list-resp.json":[{"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":"c5a99028859b7923b0b3d047a345389f09d25f86","unresolved":false,"context_lines":[{"line_number":40,"context_line":"         \"state\":\"Bound\","},{"line_number":41,"context_line":"         \"device_rp_uuid\":\"03631f82-20a9-3f67-a29d-dc1abe4041bf\","},{"line_number":42,"context_line":"         \"device_profile_name\":\"temp-dp1\","},{"line_number":43,"context_line":"         \"project_id\":\"a]fake-project-id\","},{"line_number":44,"context_line":"         \"attach_handle_uuid\":\"a1fake-attach-handle-uuid\","},{"line_number":45,"context_line":"         \"attach_handle_info\":{"},{"line_number":46,"context_line":"            \"device\":\"00\","}],"source_content_type":"application/json","patch_set":2,"id":"dadc7ae6_d2fd4c69","line":43,"updated":"2026-06-25 16:54:07.000000000","message":"The accelerator_requests-list-resp.json sample contains a malformed project_id value \u0027a]fake-project-id\u0027 with a stray closing bracket, and the attach_handle_uuid \u0027a1fake-attach-handle-uuid\u0027 appears to be a placeholder artifact.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: While the structural comparison test only checks keys and types (not values), these sample files serve as API documentation in the api-ref. The malformed value \u0027a]fake-project-id\u0027 looks like a typo from sample generation or editing and would be confusing to API consumers reading the docs.\n\n**Suggestion**:\nFix the project_id value to a proper UUID-like placeholder (e.g., \u0027fake-project-id\u0027 without the bracket, or a real-looking UUID). If this is intentional placeholder syntax, document the convention, but the stray \u0027]\u0027 strongly suggests a typo.","commit_id":"4201679d071af83523027f567fbc2515132a22b8"}]}
