)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7792f96b_2be2ea51","updated":"2026-08-05 10:26:45.000000000","message":"Thanks! I\u0027d been discussing the need for this with Sean (though you probably already know that).\n\nOur functional tests are slow, and we\u0027ve been trying to speed them up (here and in OSC) by having each test case handle a full scenerio. Prerequisites are created/deleted in setUp/tearDown and then `test_foo` (where `foo` is the resource in question) tests everything else. It\u0027s faster and more reliable (since a failure in one resource test doesn\u0027t cause knock-on failures for other tests of the same resource since there are none). Could you do that here and make the new job voting while you\u0027re at it? Happy to approve once you\u0027ve done so","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8fb66b46_174d0352","updated":"2026-08-14 13:51:33.000000000","message":"This is looking better and the tests *are* running, which is even better:\n\n```\n\n2026-08-11 23:24:29.027217 | controller | functional: 18921 W commands[0]\u003e stestr --test-path ./openstack/tests/functional/accelerator run --serial [tox/tox_env/api.py:485]\n2026-08-11 23:24:30.498709 | controller | {0} openstack.tests.functional.accelerator.v2.test_accelerator_request.TestAcceleratorRequest.test_accelerator_request [0.608358s] ... ok\n2026-08-11 23:24:30.748401 | controller | {0} openstack.tests.functional.accelerator.v2.test_accelerator_request.TestAcceleratorRequest.test_accelerator_request_admin [0.249557s] ... ok\n2026-08-11 23:24:30.946623 | controller | {0} openstack.tests.functional.accelerator.v2.test_accelerator_request.TestAcceleratorRequest.test_device_profile_get_as_user [0.197520s] ... ok\n2026-08-11 23:24:31.139363 | controller | {0} openstack.tests.functional.accelerator.v2.test_accelerator_request.TestAcceleratorRequest.test_device_profile_list_as_user [0.193274s] ... ok\n2026-08-11 23:24:31.308264 | controller | {0} openstack.tests.functional.accelerator.v2.test_attribute.TestAttribute.test_attribute ... SKIPPED: Cyborg attribute API requires internal DB integer for deployable_id (LP#2158996)\n2026-08-11 23:24:31.504540 | controller | {0} openstack.tests.functional.accelerator.v2.test_deployable.TestDeployable.test_deployable [0.200359s] ... ok\n2026-08-11 23:24:31.694380 | controller | {0} openstack.tests.functional.accelerator.v2.test_device.TestDevice.test_device [0.189499s] ... ok\n2026-08-11 23:24:31.929258 | controller | {0} openstack.tests.functional.accelerator.v2.test_device_profile.TestDeviceProfile.test_device_profile [0.234724s] ... ok\n```\n\n(from [here](https://81b29ba4a4458a00ed76-e806954d4dee75658447576ad07d9921.ssl.cf5.rackcdn.com/openstack/09707f1d868b417ead0319a7d4c762f9/job-output.txt))\n\nI have a couple more changes I\u0027d like to see, particularly around deletion though. Hopefully they all make sense. There\u0027s probably room for a follow-up docs/`AGENTS.md` patch to document a lot of these guidelines too, but that\u0027s not on you obviously","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"42698bdf_cc7450fe","in_reply_to":"8fb66b46_174d0352","updated":"2026-08-14 18:52:24.000000000","message":"I have generated an attempt at `AGENTS.md` and stacked it on top of this patch:\nhttps://review.opendev.org/c/openstack/openstacksdk/+/1000999","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f20e6387ab5daf3d8f664403e1499966a59ca304","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6ca71ff8_1180f756","updated":"2026-08-14 20:31:16.000000000","message":"Thanks!","commit_id":"abfb363b78fb4e15b08b72c43e3b8ffed4407af9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"694a9da795181dac8cd8c7d8abccead99efb1b3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4633b4d2_7a27f04c","updated":"2026-08-14 20:31:10.000000000","message":"recheck","commit_id":"abfb363b78fb4e15b08b72c43e3b8ffed4407af9"}],"openstack/tests/functional/accelerator/v2/test_accelerator_request.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":44,"context_line":"            self.device_profile,"},{"line_number":45,"context_line":"        )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_create_get_list_delete(self):"},{"line_number":48,"context_line":"        # Create as regular user (project member)"},{"line_number":49,"context_line":"        arq \u003d self.user_cloud.accelerator.create_accelerator_request("},{"line_number":50,"context_line":"            device_profile_name\u003dself.DP_NAME,"}],"source_content_type":"text/x-python","patch_set":5,"id":"0dffe97b_fa6c5788","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":35},"updated":"2026-08-05 10:26:45.000000000","message":"Could we rename this to `test_accelerator_request`?","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            self.device_profile,"},{"line_number":45,"context_line":"        )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_create_get_list_delete(self):"},{"line_number":48,"context_line":"        # Create as regular user (project member)"},{"line_number":49,"context_line":"        arq \u003d self.user_cloud.accelerator.create_accelerator_request("},{"line_number":50,"context_line":"            device_profile_name\u003dself.DP_NAME,"}],"source_content_type":"text/x-python","patch_set":5,"id":"01d61fe8_bc008bcf","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":35},"in_reply_to":"0dffe97b_fa6c5788","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":95,"context_line":"            self.device_profile,"},{"line_number":96,"context_line":"        )"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_create_and_delete(self):"},{"line_number":99,"context_line":"        arq \u003d self.operator_cloud.accelerator.create_accelerator_request("},{"line_number":100,"context_line":"            device_profile_name\u003dself.DP_NAME,"},{"line_number":101,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"081b61f8_95720c93","line":98,"updated":"2026-08-05 10:26:45.000000000","message":"And this `test_accelerator_request`","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            self.device_profile,"},{"line_number":96,"context_line":"        )"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_create_and_delete(self):"},{"line_number":99,"context_line":"        arq \u003d self.operator_cloud.accelerator.create_accelerator_request("},{"line_number":100,"context_line":"            device_profile_name\u003dself.DP_NAME,"},{"line_number":101,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"dd299c2d_c6011a42","line":98,"in_reply_to":"081b61f8_95720c93","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":126,"context_line":"            self.operator_cloud.accelerator.delete_device_profile,"},{"line_number":127,"context_line":"            self.device_profile,"},{"line_number":128,"context_line":"        )"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_list_as_user(self):"},{"line_number":131,"context_line":"        names \u003d ["},{"line_number":132,"context_line":"            dp.name for dp in self.user_cloud.accelerator.device_profiles()"},{"line_number":133,"context_line":"        ]"},{"line_number":134,"context_line":"        self.assertIn(self.DP_NAME, names)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_get_as_user(self):"},{"line_number":137,"context_line":"        # TODO(melwitt): unskip once https://review.opendev.org/992722"},{"line_number":138,"context_line":"        # merges (Cyborg policy target fix)"},{"line_number":139,"context_line":"        self.skipTest("},{"line_number":140,"context_line":"            \u0027Cyborg get_one policy target uses empty dict, denying \u0027"},{"line_number":141,"context_line":"            \u0027non-admin access (see review.opendev.org/992722)\u0027"},{"line_number":142,"context_line":"        )"},{"line_number":143,"context_line":"        dp \u003d self.user_cloud.accelerator.get_device_profile("},{"line_number":144,"context_line":"            self.device_profile.uuid"},{"line_number":145,"context_line":"        )"},{"line_number":146,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":147,"context_line":"        self.assertEqual(self.DP_NAME, dp.name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"e7501bf8_771f1c77","line":147,"range":{"start_line":129,"start_character":1,"end_line":147,"end_character":47},"updated":"2026-08-05 10:26:45.000000000","message":"Could we fold these into `TestAcceleratorRequest` above?","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            self.operator_cloud.accelerator.delete_device_profile,"},{"line_number":127,"context_line":"            self.device_profile,"},{"line_number":128,"context_line":"        )"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_list_as_user(self):"},{"line_number":131,"context_line":"        names \u003d ["},{"line_number":132,"context_line":"            dp.name for dp in self.user_cloud.accelerator.device_profiles()"},{"line_number":133,"context_line":"        ]"},{"line_number":134,"context_line":"        self.assertIn(self.DP_NAME, names)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_get_as_user(self):"},{"line_number":137,"context_line":"        # TODO(melwitt): unskip once https://review.opendev.org/992722"},{"line_number":138,"context_line":"        # merges (Cyborg policy target fix)"},{"line_number":139,"context_line":"        self.skipTest("},{"line_number":140,"context_line":"            \u0027Cyborg get_one policy target uses empty dict, denying \u0027"},{"line_number":141,"context_line":"            \u0027non-admin access (see review.opendev.org/992722)\u0027"},{"line_number":142,"context_line":"        )"},{"line_number":143,"context_line":"        dp \u003d self.user_cloud.accelerator.get_device_profile("},{"line_number":144,"context_line":"            self.device_profile.uuid"},{"line_number":145,"context_line":"        )"},{"line_number":146,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":147,"context_line":"        self.assertEqual(self.DP_NAME, dp.name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"01c42c02_be57fe58","line":147,"range":{"start_line":129,"start_character":1,"end_line":147,"end_character":47},"in_reply_to":"e7501bf8_771f1c77","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":"        self.assertIsInstance(arq, _arq.AcceleratorRequest)"},{"line_number":78,"context_line":"        self.operator_cloud.accelerator.delete_accelerator_request(arq)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_device_profile_list_as_user(self):"},{"line_number":81,"context_line":"        names \u003d ["},{"line_number":82,"context_line":"            dp.name for dp in self.user_cloud.accelerator.device_profiles()"},{"line_number":83,"context_line":"        ]"},{"line_number":84,"context_line":"        self.assertIn(self.DP_NAME, names)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_device_profile_get_as_user(self):"},{"line_number":87,"context_line":"        dp \u003d self.user_cloud.accelerator.get_device_profile("},{"line_number":88,"context_line":"            self.device_profile.uuid"},{"line_number":89,"context_line":"        )"},{"line_number":90,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":91,"context_line":"        self.assertEqual(self.DP_NAME, dp.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"a7cb8b6e_b52a1caf","line":91,"range":{"start_line":79,"start_character":1,"end_line":91,"end_character":47},"updated":"2026-08-14 13:51:33.000000000","message":"These probably belong in `openstack/tests/functional/accelerator/v2/test_device_profile.py` (ideally in a single test there)\n\nLater: I see [the same functionality there](https://review.opendev.org/c/openstack/openstacksdk/+/995851/6/openstack/tests/functional/accelerator/v2/test_device_profile.py), only that\u0027s testing with `operator_cloud` (admin) whereas these are using `user_cloud` (non-admin). Perhaps we want a `test_device_profile` test and a `test_device_profile_admin` test in that file, like we\u0027re doing here? Either way, these should probably be dropped from here","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":"        self.assertIsInstance(arq, _arq.AcceleratorRequest)"},{"line_number":78,"context_line":"        self.operator_cloud.accelerator.delete_accelerator_request(arq)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_device_profile_list_as_user(self):"},{"line_number":81,"context_line":"        names \u003d ["},{"line_number":82,"context_line":"            dp.name for dp in self.user_cloud.accelerator.device_profiles()"},{"line_number":83,"context_line":"        ]"},{"line_number":84,"context_line":"        self.assertIn(self.DP_NAME, names)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_device_profile_get_as_user(self):"},{"line_number":87,"context_line":"        dp \u003d self.user_cloud.accelerator.get_device_profile("},{"line_number":88,"context_line":"            self.device_profile.uuid"},{"line_number":89,"context_line":"        )"},{"line_number":90,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":91,"context_line":"        self.assertEqual(self.DP_NAME, dp.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0ce61652_e1b69d04","line":91,"range":{"start_line":79,"start_character":1,"end_line":91,"end_character":47},"in_reply_to":"a7cb8b6e_b52a1caf","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"}],"openstack/tests/functional/accelerator/v2/test_attribute.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":29,"context_line":"            self.skipTest(\u0027No deployables found (fake driver not loaded?)\u0027)"},{"line_number":30,"context_line":"        self.deployable_id \u003d deployables[0].id"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_create_get_list_delete(self):"},{"line_number":33,"context_line":"        # TODO(melwitt): unskip once LP#2158996 is fixed"},{"line_number":34,"context_line":"        self.skipTest("},{"line_number":35,"context_line":"            \u0027Cyborg attribute API requires internal DB integer for \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"85cc9196_7759f292","line":32,"updated":"2026-08-05 10:26:45.000000000","message":"```suggestion\n    def test_attribute(self):\n```","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            self.skipTest(\u0027No deployables found (fake driver not loaded?)\u0027)"},{"line_number":30,"context_line":"        self.deployable_id \u003d deployables[0].id"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_create_get_list_delete(self):"},{"line_number":33,"context_line":"        # TODO(melwitt): unskip once LP#2158996 is fixed"},{"line_number":34,"context_line":"        self.skipTest("},{"line_number":35,"context_line":"            \u0027Cyborg attribute API requires internal DB integer for \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfee7578_6446f565","line":32,"in_reply_to":"85cc9196_7759f292","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":26,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":27,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":28,"context_line":"        if not deployables:"},{"line_number":29,"context_line":"            self.skipTest(\u0027No deployables found (fake driver not loaded?)\u0027)"},{"line_number":30,"context_line":"        self.deployable_id \u003d deployables[0].id"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_attribute(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fe480c4c_d3e09b73","line":29,"updated":"2026-08-14 13:51:33.000000000","message":"Would it be more useful to fail here, on the basis that we don\u0027t expect users to run the test suite against a production cloud or anything other than a devstack, so missing deployables are likely a misconfiguration of a test environment? We\u0027ve seen cases in the past (for manila, I think) where tests we thought we were running were instead being perma-skipped because we didn\u0027t configure our zuul jobs correctly","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"694a9da795181dac8cd8c7d8abccead99efb1b3b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":27,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":28,"context_line":"        if not deployables:"},{"line_number":29,"context_line":"            self.skipTest(\u0027No deployables found (fake driver not loaded?)\u0027)"},{"line_number":30,"context_line":"        self.deployable_id \u003d deployables[0].id"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_attribute(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"aa586914_8097dbbc","line":29,"in_reply_to":"8188952e_5e2eb8c3","updated":"2026-08-14 20:31:10.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":true,"context_lines":[{"line_number":26,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":27,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":28,"context_line":"        if not deployables:"},{"line_number":29,"context_line":"            self.skipTest(\u0027No deployables found (fake driver not loaded?)\u0027)"},{"line_number":30,"context_line":"        self.deployable_id \u003d deployables[0].id"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_attribute(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"8188952e_5e2eb8c3","line":29,"in_reply_to":"fe480c4c_d3e09b73","updated":"2026-08-14 18:52:24.000000000","message":"Sure, if it happened before with Manila, then it could be useful. Done.","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        attrs \u003d list(self.operator_cloud.accelerator.attributes())"},{"line_number":54,"context_line":"        uuids \u003d [a.uuid for a in attrs]"},{"line_number":55,"context_line":"        self.assertIn(attr.uuid, uuids)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Delete"},{"line_number":58,"context_line":"        self.operator_cloud.accelerator.delete_attribute(attr)"},{"line_number":59,"context_line":"        attrs \u003d list(self.operator_cloud.accelerator.attributes())"},{"line_number":60,"context_line":"        uuids \u003d [a.uuid for a in attrs]"},{"line_number":61,"context_line":"        self.assertNotIn(attr.uuid, uuids)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0e1c60ae_1758c178","line":61,"range":{"start_line":56,"start_character":1,"end_line":61,"end_character":42},"updated":"2026-08-14 13:51:33.000000000","message":"Can you move this to a `_delete_attribute` help that we register via `addCleanup`? That will ensure it should always be deleted, even if one of the interim steps fails","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        attrs \u003d list(self.operator_cloud.accelerator.attributes())"},{"line_number":54,"context_line":"        uuids \u003d [a.uuid for a in attrs]"},{"line_number":55,"context_line":"        self.assertIn(attr.uuid, uuids)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Delete"},{"line_number":58,"context_line":"        self.operator_cloud.accelerator.delete_attribute(attr)"},{"line_number":59,"context_line":"        attrs \u003d list(self.operator_cloud.accelerator.attributes())"},{"line_number":60,"context_line":"        uuids \u003d [a.uuid for a in attrs]"},{"line_number":61,"context_line":"        self.assertNotIn(attr.uuid, uuids)"}],"source_content_type":"text/x-python","patch_set":6,"id":"cf787f95_588363df","line":61,"range":{"start_line":56,"start_character":1,"end_line":61,"end_character":42},"in_reply_to":"0e1c60ae_1758c178","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"}],"openstack/tests/functional/accelerator/v2/test_deployable.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":26,"context_line":"        super().setUp()"},{"line_number":27,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_list(self):"},{"line_number":30,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":31,"context_line":"        self.assertGreater(len(deployables), 0)"},{"line_number":32,"context_line":"        self.assertIsInstance(deployables[0], _deployable.Deployable)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_get(self):"},{"line_number":35,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":36,"context_line":"        deployable \u003d self.operator_cloud.accelerator.get_deployable("},{"line_number":37,"context_line":"            deployables[0].id"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        self.assertIsInstance(deployable, _deployable.Deployable)"},{"line_number":40,"context_line":"        self.assertEqual(deployables[0].id, deployable.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"b61e39f4_6f0f7a72","line":40,"range":{"start_line":29,"start_character":0,"end_line":40,"end_character":58},"updated":"2026-08-05 10:26:45.000000000","message":"Can we combine these and call the method `test_deployable`?","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        super().setUp()"},{"line_number":27,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_list(self):"},{"line_number":30,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":31,"context_line":"        self.assertGreater(len(deployables), 0)"},{"line_number":32,"context_line":"        self.assertIsInstance(deployables[0], _deployable.Deployable)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_get(self):"},{"line_number":35,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":36,"context_line":"        deployable \u003d self.operator_cloud.accelerator.get_deployable("},{"line_number":37,"context_line":"            deployables[0].id"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        self.assertIsInstance(deployable, _deployable.Deployable)"},{"line_number":40,"context_line":"        self.assertEqual(deployables[0].id, deployable.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"0b8d42f3_d1dd4d85","line":40,"range":{"start_line":29,"start_character":0,"end_line":40,"end_character":58},"in_reply_to":"b61e39f4_6f0f7a72","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    def test_deployable(self):"},{"line_number":30,"context_line":"        # List"},{"line_number":31,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":32,"context_line":"        self.assertGreater(len(deployables), 0)"},{"line_number":33,"context_line":"        self.assertIsInstance(deployables[0], _deployable.Deployable)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # Get"}],"source_content_type":"text/x-python","patch_set":6,"id":"9225ee2b_f9005b99","line":32,"updated":"2026-08-14 13:51:33.000000000","message":"I note we have a skip for 0 deployables in the previous file but not this one. Per my note there, this is probably the correct behavior, though it could be helpful to add a note here explaining that your environment is likely misconfigured, e.g.\n\n```suggestion\n        self.assertGreater(\n            len(deployables),\n            0,\n            \u0027no deployables found: is the fake driver enabled?\u0027,\n        )\n```\n\n(I am assuming `assertGreater` takes a `msg` arg)","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def test_deployable(self):"},{"line_number":30,"context_line":"        # List"},{"line_number":31,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":32,"context_line":"        self.assertGreater(len(deployables), 0)"},{"line_number":33,"context_line":"        self.assertIsInstance(deployables[0], _deployable.Deployable)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # Get"}],"source_content_type":"text/x-python","patch_set":6,"id":"9596befb_38398cb3","line":32,"in_reply_to":"749208a9_740ef63f","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"194795381c7fb1f3d0788a236d644df5ea306002","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    def test_deployable(self):"},{"line_number":30,"context_line":"        # List"},{"line_number":31,"context_line":"        deployables \u003d list(self.operator_cloud.accelerator.deployables())"},{"line_number":32,"context_line":"        self.assertGreater(len(deployables), 0)"},{"line_number":33,"context_line":"        self.assertIsInstance(deployables[0], _deployable.Deployable)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # Get"}],"source_content_type":"text/x-python","patch_set":6,"id":"749208a9_740ef63f","line":32,"in_reply_to":"9225ee2b_f9005b99","updated":"2026-08-14 13:53:10.000000000","message":"\u003e Per my note there, this is probably the correct behavior, ...\n\n*this* being what you\u0027ve done in this file, not what\u0027s been done in `openstack/tests/functional/accelerator/v2/test_attribute.py`","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"}],"openstack/tests/functional/accelerator/v2/test_device.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super().setUp()"},{"line_number":27,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_list(self):"},{"line_number":30,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":31,"context_line":"        self.assertGreater(len(devices), 0)"},{"line_number":32,"context_line":"        self.assertIsInstance(devices[0], _device.Device)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_get(self):"},{"line_number":35,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":36,"context_line":"        device \u003d self.operator_cloud.accelerator.get_device(devices[0].uuid)"},{"line_number":37,"context_line":"        self.assertIsInstance(device, _device.Device)"},{"line_number":38,"context_line":"        self.assertEqual(devices[0].uuid, device.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"cd1eeb7e_8ddd4464","line":38,"range":{"start_line":28,"start_character":0,"end_line":38,"end_character":54},"updated":"2026-08-05 10:26:45.000000000","message":"As with the previous file","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super().setUp()"},{"line_number":27,"context_line":"        self.require_service(\u0027accelerator\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_list(self):"},{"line_number":30,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":31,"context_line":"        self.assertGreater(len(devices), 0)"},{"line_number":32,"context_line":"        self.assertIsInstance(devices[0], _device.Device)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_get(self):"},{"line_number":35,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":36,"context_line":"        device \u003d self.operator_cloud.accelerator.get_device(devices[0].uuid)"},{"line_number":37,"context_line":"        self.assertIsInstance(device, _device.Device)"},{"line_number":38,"context_line":"        self.assertEqual(devices[0].uuid, device.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"622b7635_0ae2d223","line":38,"range":{"start_line":28,"start_character":0,"end_line":38,"end_character":54},"in_reply_to":"cd1eeb7e_8ddd4464","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    def test_device(self):"},{"line_number":30,"context_line":"        # List"},{"line_number":31,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":32,"context_line":"        self.assertGreater(len(devices), 0)"},{"line_number":33,"context_line":"        self.assertIsInstance(devices[0], _device.Device)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # Get"}],"source_content_type":"text/x-python","patch_set":6,"id":"51995295_b56a7c90","line":32,"updated":"2026-08-14 13:51:33.000000000","message":"Per my note in the previous file, should we log a message on failure hinting at the fake driver being missing?","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def test_device(self):"},{"line_number":30,"context_line":"        # List"},{"line_number":31,"context_line":"        devices \u003d list(self.operator_cloud.accelerator.devices())"},{"line_number":32,"context_line":"        self.assertGreater(len(devices), 0)"},{"line_number":33,"context_line":"        self.assertIsInstance(devices[0], _device.Device)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # Get"}],"source_content_type":"text/x-python","patch_set":6,"id":"cfe8d2d3_3a1deb9b","line":32,"in_reply_to":"51995295_b56a7c90","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"}],"openstack/tests/functional/accelerator/v2/test_device_profile.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":37,"context_line":"            self.device_profile,"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_get(self):"},{"line_number":41,"context_line":"        dp \u003d self.operator_cloud.accelerator.get_device_profile("},{"line_number":42,"context_line":"            self.device_profile.uuid"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":45,"context_line":"        self.assertEqual(self.NAME, dp.name)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_list(self):"},{"line_number":48,"context_line":"        names \u003d ["},{"line_number":49,"context_line":"            dp.name for dp in self.operator_cloud.accelerator.device_profiles()"},{"line_number":50,"context_line":"        ]"},{"line_number":51,"context_line":"        self.assertIn(self.NAME, names)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_delete(self):"},{"line_number":54,"context_line":"        name \u003d self.getUniqueString()"},{"line_number":55,"context_line":"        dp \u003d self.operator_cloud.accelerator.create_device_profile("},{"line_number":56,"context_line":"            name\u003dname,"},{"line_number":57,"context_line":"            groups\u003dself.GROUPS,"},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":"        self.operator_cloud.accelerator.delete_device_profile(dp)"},{"line_number":60,"context_line":"        names \u003d ["},{"line_number":61,"context_line":"            d.name for d in self.operator_cloud.accelerator.device_profiles()"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        self.assertNotIn(name, names)"}],"source_content_type":"text/x-python","patch_set":5,"id":"d36b94f9_a0470ae1","line":63,"range":{"start_line":40,"start_character":0,"end_line":63,"end_character":37},"updated":"2026-08-05 10:26:45.000000000","message":"As with the previous files","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            self.device_profile,"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_get(self):"},{"line_number":41,"context_line":"        dp \u003d self.operator_cloud.accelerator.get_device_profile("},{"line_number":42,"context_line":"            self.device_profile.uuid"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        self.assertIsInstance(dp, _device_profile.DeviceProfile)"},{"line_number":45,"context_line":"        self.assertEqual(self.NAME, dp.name)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_list(self):"},{"line_number":48,"context_line":"        names \u003d ["},{"line_number":49,"context_line":"            dp.name for dp in self.operator_cloud.accelerator.device_profiles()"},{"line_number":50,"context_line":"        ]"},{"line_number":51,"context_line":"        self.assertIn(self.NAME, names)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_delete(self):"},{"line_number":54,"context_line":"        name \u003d self.getUniqueString()"},{"line_number":55,"context_line":"        dp \u003d self.operator_cloud.accelerator.create_device_profile("},{"line_number":56,"context_line":"            name\u003dname,"},{"line_number":57,"context_line":"            groups\u003dself.GROUPS,"},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":"        self.operator_cloud.accelerator.delete_device_profile(dp)"},{"line_number":60,"context_line":"        names \u003d ["},{"line_number":61,"context_line":"            d.name for d in self.operator_cloud.accelerator.device_profiles()"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        self.assertNotIn(name, names)"}],"source_content_type":"text/x-python","patch_set":5,"id":"789cc9e4_b7cda662","line":63,"range":{"start_line":40,"start_character":0,"end_line":63,"end_character":37},"in_reply_to":"d36b94f9_a0470ae1","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[{"line_number":36,"context_line":"            self.device_profile,"},{"line_number":37,"context_line":"        )"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_device_profile(self):"},{"line_number":40,"context_line":"        # Get"},{"line_number":41,"context_line":"        dp \u003d self.operator_cloud.accelerator.get_device_profile("},{"line_number":42,"context_line":"            self.device_profile.uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"e63ac0ee_25583cba","line":39,"updated":"2026-08-14 13:51:33.000000000","message":"Per my comment in https://review.opendev.org/c/openstack/openstacksdk/+/995851/6/openstack/tests/functional/accelerator/v2/test_accelerator_request.py, you may want to rename this to `test_device_profile_admin` and add a separate `test_device_profile`, if there are meaningful differences between admin and non-admin that you need to evaluate. If there are not, should we use `user_cloud` here instead?","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            self.device_profile,"},{"line_number":37,"context_line":"        )"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_device_profile(self):"},{"line_number":40,"context_line":"        # Get"},{"line_number":41,"context_line":"        dp \u003d self.operator_cloud.accelerator.get_device_profile("},{"line_number":42,"context_line":"            self.device_profile.uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"7c6600cc_4fa7ec97","line":39,"in_reply_to":"e63ac0ee_25583cba","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ecd1cea233c449d182df401dbd72cf12e8af3dbe","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e57611dc_25898235","line":64,"range":{"start_line":52,"start_character":1,"end_line":64,"end_character":1},"updated":"2026-08-14 13:51:33.000000000","message":"The way we\u0027ve done this elsewhere is to move the deletion into a `_delete_foo` helper method, where you can do your assertions. That `_delete_foo` helper can then be registered/called via `addCleanup`. If you search for `def _delete` in `openstack/tests/functional` you\u0027ll see plenty of examples. Perhaps we could use this here also?","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b8f3b419f3c676031af5cc5c6819a992c6379a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ea6ae469_0ee4a72b","line":64,"range":{"start_line":52,"start_character":1,"end_line":64,"end_character":1},"in_reply_to":"e57611dc_25898235","updated":"2026-08-14 18:52:24.000000000","message":"Done","commit_id":"9ac768d06549086fe2e24c9fa1cc9addcf00d505"}],"zuul.d/project.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c460c6fd153ae2d71807a9678a18df9a07e1b684","unresolved":true,"context_lines":[{"line_number":28,"context_line":"        - openstacksdk-functional-devstack-manila"},{"line_number":29,"context_line":"        - openstacksdk-functional-devstack-compute-manila"},{"line_number":30,"context_line":"        - openstacksdk-functional-devstack-cyborg:"},{"line_number":31,"context_line":"            voting: false"},{"line_number":32,"context_line":"        - openstacksdk-functional-devstack-masakari"},{"line_number":33,"context_line":"        - openstacksdk-functional-devstack-ironic"},{"line_number":34,"context_line":"        - osc-functional-devstack-tips:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"97f4e6be_c835002c","line":31,"updated":"2026-08-05 10:26:45.000000000","message":"Unless you\u0027ve a good reason not to, I think we should make this voting so failures are caught early. Non-voting jobs are borderline useless 😀","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2e7ca8f998f409b655e99409d23dc1a293f94bd1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        - openstacksdk-functional-devstack-manila"},{"line_number":29,"context_line":"        - openstacksdk-functional-devstack-compute-manila"},{"line_number":30,"context_line":"        - openstacksdk-functional-devstack-cyborg:"},{"line_number":31,"context_line":"            voting: false"},{"line_number":32,"context_line":"        - openstacksdk-functional-devstack-masakari"},{"line_number":33,"context_line":"        - openstacksdk-functional-devstack-ironic"},{"line_number":34,"context_line":"        - osc-functional-devstack-tips:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"6d6cdcea_04862532","line":31,"in_reply_to":"97f4e6be_c835002c","updated":"2026-08-11 23:10:58.000000000","message":"Done","commit_id":"b5e378821e5b6bf23530206efc87d23627f1cce6"}]}
