)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5a7572b8461da9fcec8df2d54bedb95cc8af9ef","unresolved":false,"context_lines":[{"line_number":7,"context_line":"typing: Replace objects from typing with literals"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We also replace the use of typing.Union and add missing parameters and"},{"line_number":10,"context_line":"returns types for Callable types."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I75ed4d1cc4d84515910a5bd315f8626135258148"},{"line_number":13,"context_line":"Signed-off-by: Stephen Finucane \u003cstephenfin@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"0edb3c8b_6eec37da","line":10,"updated":"2026-01-21 13:01:59.000000000","message":"This is primarlly just taking advantage of the fact that our min python version is now python 3.10 which allows use to use the more native python syntax for type rahter then having to import the symbols form typing directly\n\nthis brings our usage much more inline with the mordern norm and is honestly easier to read in general.","commit_id":"e785ab52dc77bae29e70be1b928483228af34ce9"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f54427b8_de1ac85d","updated":"2026-01-21 10:32:22.000000000","message":"just couple of small things","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5a7572b8461da9fcec8df2d54bedb95cc8af9ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"65e70453_0676436b","updated":"2026-01-21 13:01:59.000000000","message":"thi","commit_id":"e785ab52dc77bae29e70be1b928483228af34ce9"}],"nova/cmd/manage.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":true,"context_lines":[{"line_number":762,"context_line":"        self,"},{"line_number":763,"context_line":"        ctxt: context.RequestContext,"},{"line_number":764,"context_line":"        cell_mapping: \u0027objects.CellMapping | None\u0027,"},{"line_number":765,"context_line":"        transport_url: str | None,"},{"line_number":766,"context_line":"        database_connection: str | None,"},{"line_number":767,"context_line":"    ) -\u003e bool:"},{"line_number":768,"context_line":"        for cell in objects.CellMappingList.get_all(ctxt):"},{"line_number":769,"context_line":"            if cell_mapping and cell.uuid \u003d\u003d cell_mapping.uuid:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f0aba7e5_aed00718","line":766,"range":{"start_line":765,"start_character":0,"end_line":766,"end_character":40},"updated":"2026-01-21 10:32:22.000000000","message":"I think they are not None, see my other comment at the calling site","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67b78d34ee6ecff7b7ce9a9e886aab4fef9ba19e","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        self,"},{"line_number":763,"context_line":"        ctxt: context.RequestContext,"},{"line_number":764,"context_line":"        cell_mapping: \u0027objects.CellMapping | None\u0027,"},{"line_number":765,"context_line":"        transport_url: str | None,"},{"line_number":766,"context_line":"        database_connection: str | None,"},{"line_number":767,"context_line":"    ) -\u003e bool:"},{"line_number":768,"context_line":"        for cell in objects.CellMappingList.get_all(ctxt):"},{"line_number":769,"context_line":"            if cell_mapping and cell.uuid \u003d\u003d cell_mapping.uuid:"}],"source_content_type":"text/x-python","patch_set":1,"id":"2533bf4b_5672136d","line":766,"range":{"start_line":765,"start_character":0,"end_line":766,"end_character":40},"in_reply_to":"f0aba7e5_aed00718","updated":"2026-01-21 10:49:05.000000000","message":"There is another caller at https://review.opendev.org/c/openstack/nova/+/973977/1/nova/cmd/manage.py#1391 which can call this with `None`. Happy to change that caller so we don\u0027t call it unless these are set? See my comment there.","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":true,"context_lines":[{"line_number":1190,"context_line":"          help\u003d_(\u0027To create a pre-disabled cell.\u0027))"},{"line_number":1191,"context_line":"    def create_cell(self, name\u003dNone, database_connection\u003dNone,"},{"line_number":1192,"context_line":"                    transport_url\u003dNone, verbose\u003dFalse, disabled\u003dFalse):"},{"line_number":1193,"context_line":"        ctxt \u003d context.get_context()"},{"line_number":1194,"context_line":"        transport_url \u003d self._validate_transport_url(transport_url)"},{"line_number":1195,"context_line":"        if not transport_url:"},{"line_number":1196,"context_line":"            return 1"},{"line_number":1197,"context_line":""},{"line_number":1198,"context_line":"        database_connection \u003d self._validate_database_connection("},{"line_number":1199,"context_line":"            database_connection)"},{"line_number":1200,"context_line":"        if not database_connection:"},{"line_number":1201,"context_line":"            return 1"},{"line_number":1202,"context_line":"        if (self._non_unique_transport_url_database_connection_checker(ctxt,"},{"line_number":1203,"context_line":"            None, transport_url, database_connection)):"},{"line_number":1204,"context_line":"            return 2"}],"source_content_type":"text/x-python","patch_set":1,"id":"f156a0fe_69811d73","line":1201,"range":{"start_line":1193,"start_character":0,"end_line":1201,"end_character":20},"updated":"2026-01-21 10:32:22.000000000","message":"afaik if transport_url and database_connection is not provided in the CLI they are defaulted from the config and we exit early if it is not in the config. So _non_unique_transport_url_database_connection_checker is called with not-None transport_url and database_connection.","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67b78d34ee6ecff7b7ce9a9e886aab4fef9ba19e","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"          help\u003d_(\u0027To create a pre-disabled cell.\u0027))"},{"line_number":1191,"context_line":"    def create_cell(self, name\u003dNone, database_connection\u003dNone,"},{"line_number":1192,"context_line":"                    transport_url\u003dNone, verbose\u003dFalse, disabled\u003dFalse):"},{"line_number":1193,"context_line":"        ctxt \u003d context.get_context()"},{"line_number":1194,"context_line":"        transport_url \u003d self._validate_transport_url(transport_url)"},{"line_number":1195,"context_line":"        if not transport_url:"},{"line_number":1196,"context_line":"            return 1"},{"line_number":1197,"context_line":""},{"line_number":1198,"context_line":"        database_connection \u003d self._validate_database_connection("},{"line_number":1199,"context_line":"            database_connection)"},{"line_number":1200,"context_line":"        if not database_connection:"},{"line_number":1201,"context_line":"            return 1"},{"line_number":1202,"context_line":"        if (self._non_unique_transport_url_database_connection_checker(ctxt,"},{"line_number":1203,"context_line":"            None, transport_url, database_connection)):"},{"line_number":1204,"context_line":"            return 2"}],"source_content_type":"text/x-python","patch_set":1,"id":"64c6588a_1325f7cc","line":1201,"range":{"start_line":1193,"start_character":0,"end_line":1201,"end_character":20},"in_reply_to":"f156a0fe_69811d73","updated":"2026-01-21 10:49:05.000000000","message":"See above. There is another caller.","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67b78d34ee6ecff7b7ce9a9e886aab4fef9ba19e","unresolved":true,"context_lines":[{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        # Having empty transport_url and db_connection means leaving the"},{"line_number":1384,"context_line":"        # existing values"},{"line_number":1385,"context_line":"        transport_url \u003d self._validate_transport_url("},{"line_number":1386,"context_line":"            transport_url, warn_about_none\u003dFalse)"},{"line_number":1387,"context_line":"        db_connection \u003d self._validate_database_connection("},{"line_number":1388,"context_line":"            db_connection, warn_about_none\u003dFalse)"},{"line_number":1389,"context_line":""},{"line_number":1390,"context_line":"        if (self._non_unique_transport_url_database_connection_checker(ctxt,"},{"line_number":1391,"context_line":"                cell_mapping, transport_url, db_connection)):"},{"line_number":1392,"context_line":"            # We use the return code 3 before 2 to avoid changing the"},{"line_number":1393,"context_line":"            # semantic meanings of return codes."},{"line_number":1394,"context_line":"            return 3"}],"source_content_type":"text/x-python","patch_set":1,"id":"dc393fd6_1b0a3436","line":1391,"range":{"start_line":1385,"start_character":0,"end_line":1391,"end_character":61},"updated":"2026-01-21 10:49:05.000000000","message":"Here. This seems to to effectively be a no-op. Perhaps we should change this to:\n\n\n\n```suggestion\n        transport_url \u003d self._validate_transport_url(\n            transport_url, warn_about_none\u003dFalse)\n        db_connection \u003d self._validate_database_connection(\n            db_connection, warn_about_none\u003dFalse)\n\n        if transport_url and db_connection:\n            if self._non_unique_transport_url_database_connection_checker(\n                ctxt, cell_mapping, transport_url, db_connection\n            ):\n```\n\nThough I\u0027m not sure if the `if transport_url and db_connection` conditional should actually be `if transport_url or db_connection`, since the `_non_unique_transport_url_database_connection_checker` method uses `None`. If so, we need to continue accepting `str | None` for both arguments...","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de7f3e426cca837e8a2a7fc4fc7e7815169f3a7f","unresolved":false,"context_lines":[{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        # Having empty transport_url and db_connection means leaving the"},{"line_number":1384,"context_line":"        # existing values"},{"line_number":1385,"context_line":"        transport_url \u003d self._validate_transport_url("},{"line_number":1386,"context_line":"            transport_url, warn_about_none\u003dFalse)"},{"line_number":1387,"context_line":"        db_connection \u003d self._validate_database_connection("},{"line_number":1388,"context_line":"            db_connection, warn_about_none\u003dFalse)"},{"line_number":1389,"context_line":""},{"line_number":1390,"context_line":"        if (self._non_unique_transport_url_database_connection_checker(ctxt,"},{"line_number":1391,"context_line":"                cell_mapping, transport_url, db_connection)):"},{"line_number":1392,"context_line":"            # We use the return code 3 before 2 to avoid changing the"},{"line_number":1393,"context_line":"            # semantic meanings of return codes."},{"line_number":1394,"context_line":"            return 3"}],"source_content_type":"text/x-python","patch_set":1,"id":"1efff247_26a82148","line":1391,"range":{"start_line":1385,"start_character":0,"end_line":1391,"end_character":61},"in_reply_to":"246fd80d_ac519af5","updated":"2026-01-21 12:15:31.000000000","message":"Thanks for pointing to the second caller, I missed that. I agree with you that we should keep the params nullable due to this caller. I think the db and the transport can be None independently to only change one of them.","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d0da1064e6374e6f938a2f44c9fa4170ebb5c237","unresolved":false,"context_lines":[{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        # Having empty transport_url and db_connection means leaving the"},{"line_number":1384,"context_line":"        # existing values"},{"line_number":1385,"context_line":"        transport_url \u003d self._validate_transport_url("},{"line_number":1386,"context_line":"            transport_url, warn_about_none\u003dFalse)"},{"line_number":1387,"context_line":"        db_connection \u003d self._validate_database_connection("},{"line_number":1388,"context_line":"            db_connection, warn_about_none\u003dFalse)"},{"line_number":1389,"context_line":""},{"line_number":1390,"context_line":"        if (self._non_unique_transport_url_database_connection_checker(ctxt,"},{"line_number":1391,"context_line":"                cell_mapping, transport_url, db_connection)):"},{"line_number":1392,"context_line":"            # We use the return code 3 before 2 to avoid changing the"},{"line_number":1393,"context_line":"            # semantic meanings of return codes."},{"line_number":1394,"context_line":"            return 3"}],"source_content_type":"text/x-python","patch_set":1,"id":"246fd80d_ac519af5","line":1391,"range":{"start_line":1385,"start_character":0,"end_line":1391,"end_character":61},"in_reply_to":"dc393fd6_1b0a3436","updated":"2026-01-21 10:57:13.000000000","message":"I\u0027m going to assume it\u0027s better to leave this as-is and potentially address in a follow-up. Please let me know what you\u0027d like to do here 🙏","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"}],"nova/compute/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    def _wait_for_instance_events("},{"line_number":484,"context_line":"        instance: \u0027objects.Instance\u0027,"},{"line_number":485,"context_line":"        events: dict,"},{"line_number":486,"context_line":"        error_callback: Callable[[str, \u0027objects.Instance\u0027], bool],"},{"line_number":487,"context_line":"        timeout: int,"},{"line_number":488,"context_line":"    ) -\u003e None:"},{"line_number":489,"context_line":"        deadline \u003d time.monotonic() + timeout"}],"source_content_type":"text/x-python","patch_set":1,"id":"a36cf57b_6ce14a73","line":486,"updated":"2026-01-21 10:32:22.000000000","message":"yepp","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"}],"nova/compute/pci_placement_translator.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        # Nothing to do here. The update_provider_tree we handle full RP"},{"line_number":223,"context_line":"        pass"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def _get_allocations(self) -\u003e collections.Counter[str]:"},{"line_number":226,"context_line":"        \"\"\"Return a dict of used resources keyed by consumer UUID."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        Note that:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f2f1954d_8b390fb2","line":225,"updated":"2026-01-21 10:32:22.000000000","message":"yepp that is more specific","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b5944f98cb3cddb92d3bd7f29c0cad3b1284db","unresolved":true,"context_lines":[{"line_number":2585,"context_line":"        self,"},{"line_number":2586,"context_line":"        guest: libvirt_guest.Guest,"},{"line_number":2587,"context_line":"        instance_uuid: str,"},{"line_number":2588,"context_line":"        persistent_dev: vconfig.LibvirtConfigGuestDisk | vconfig.LibvirtConfigGuestInterface,  # noqa: E501"},{"line_number":2589,"context_line":"        get_device_conf_func: GetDeviceConfFunction,"},{"line_number":2590,"context_line":"        device_name: str,"},{"line_number":2591,"context_line":"    ) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"20253474_5e87a1cb","line":2588,"updated":"2026-01-21 10:32:22.000000000","message":"this is repeated and too long, can we pull it out into a typealias? e.g. DetachableDevice","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"67b78d34ee6ecff7b7ce9a9e886aab4fef9ba19e","unresolved":true,"context_lines":[{"line_number":2585,"context_line":"        self,"},{"line_number":2586,"context_line":"        guest: libvirt_guest.Guest,"},{"line_number":2587,"context_line":"        instance_uuid: str,"},{"line_number":2588,"context_line":"        persistent_dev: vconfig.LibvirtConfigGuestDisk | vconfig.LibvirtConfigGuestInterface,  # noqa: E501"},{"line_number":2589,"context_line":"        get_device_conf_func: GetDeviceConfFunction,"},{"line_number":2590,"context_line":"        device_name: str,"},{"line_number":2591,"context_line":"    ) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"42cd3aac_43d596ba","line":2588,"in_reply_to":"20253474_5e87a1cb","updated":"2026-01-21 10:49:05.000000000","message":"Will do","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d0da1064e6374e6f938a2f44c9fa4170ebb5c237","unresolved":false,"context_lines":[{"line_number":2585,"context_line":"        self,"},{"line_number":2586,"context_line":"        guest: libvirt_guest.Guest,"},{"line_number":2587,"context_line":"        instance_uuid: str,"},{"line_number":2588,"context_line":"        persistent_dev: vconfig.LibvirtConfigGuestDisk | vconfig.LibvirtConfigGuestInterface,  # noqa: E501"},{"line_number":2589,"context_line":"        get_device_conf_func: GetDeviceConfFunction,"},{"line_number":2590,"context_line":"        device_name: str,"},{"line_number":2591,"context_line":"    ) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"229a8b28_3b68d88f","line":2588,"in_reply_to":"42cd3aac_43d596ba","updated":"2026-01-21 10:57:13.000000000","message":"Done","commit_id":"39146bbd51cdaf515f70ec0782216dcf3d2d2cfa"}],"tox.ini":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5a7572b8461da9fcec8df2d54bedb95cc8af9ef","unresolved":true,"context_lines":[{"line_number":341,"context_line":"max-complexity \u003d 40"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"[hacking]"},{"line_number":344,"context_line":"import_exceptions \u003d"},{"line_number":345,"context_line":"  collections.abc"},{"line_number":346,"context_line":"  nova.i18n"},{"line_number":347,"context_line":"  typing"}],"source_content_type":"text/x-properties","patch_set":2,"id":"7316a5f3_8d04a54b","line":344,"updated":"2026-01-21 13:01:59.000000000","message":"eventually i woudl personlaly prefer if we explcity set this to an empy list so we did not allow any expction but im not going to block on this one way or another\n\nmy genral view is i woudl perfer to enforce import requiremens for everythign or nothing.\n\nits just easier to explain and reason about.\n\n\nwith that said this is inline with the update google python style guide which is what hacking was orginally based on os this is inline with industry norms to exclude clollections.abc and typing form import checks.\n\nwe brifly discsus makign this change in hacking itself on teh mailing list a while back as well.","commit_id":"e785ab52dc77bae29e70be1b928483228af34ce9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f5900abb191681f555a398881eeda19669f5066f","unresolved":false,"context_lines":[{"line_number":341,"context_line":"max-complexity \u003d 40"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"[hacking]"},{"line_number":344,"context_line":"import_exceptions \u003d"},{"line_number":345,"context_line":"  collections.abc"},{"line_number":346,"context_line":"  nova.i18n"},{"line_number":347,"context_line":"  typing"}],"source_content_type":"text/x-properties","patch_set":2,"id":"22ef0dbe_15e8186b","line":344,"in_reply_to":"7316a5f3_8d04a54b","updated":"2026-01-21 13:02:36.000000000","message":"i ment ot resolve this this is just a general comment on where i stand on this.","commit_id":"e785ab52dc77bae29e70be1b928483228af34ce9"}]}
