)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4fc872cce463e98b072603d8af06a575f7cc1024","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"48b5bcab_49f48a45","updated":"2025-01-29 17:35:04.000000000","message":"recheck timeout","commit_id":"8a14a655873a4e41847c4225c3561fa350ca1ad6"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b0153d3e_a321a1e2","updated":"2025-05-15 12:54:32.000000000","message":"Hi Stephen, just a soft -1 to point out a few minor nits.\nI took some time to ensure the API schemas align with the current documentation, and everything looks consistent.\nSo despite the small issues, the patch looks good to me overall. 👍","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"28f1bf99acd2ac94643c1c97a3b3ae41d77dcdf4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"2024898c_ae317b51","updated":"2025-06-05 18:36:52.000000000","message":"I am good on this to merge as it is but would like to see stephenfin response on removing the noqa in followup. Also, would like to see uggla response if anything blocking from his side?","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"f04efb504ca794de326d67250cea78ae41cfef34","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"602427b6_21843540","updated":"2025-06-06 13:50:03.000000000","message":"Lgtm thanks.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"adff534df5ffb3ca66c94d4c82c89802a99d1148","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"4cee778f_47fee8cc","updated":"2025-06-09 21:12:45.000000000","message":"recheck integrated job timeout","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"}],"nova/api/openstack/compute/schemas/hosts.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0cfd540e4571f8ecc98de3063b062d5eedc7253f","unresolved":true,"context_lines":[{"line_number":58,"context_line":"reboot_query \u003d {}"},{"line_number":59,"context_line":"show_query \u003d {}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"index_response \u003d {"},{"line_number":62,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":63,"context_line":"    \u0027properties\u0027: {"},{"line_number":64,"context_line":"        \u0027hosts\u0027: {"}],"source_content_type":"text/x-python","patch_set":10,"id":"613661b8_cbed5e43","line":61,"updated":"2025-05-21 18:41:41.000000000","message":"general note these are all for an api that is now remvoed in later microversions\n\n\"\"\"\nThe os-hosts API is deprecated as of the 2.43 microversion. Requests made with microversion \u003e\u003d 2.43 will result in a 404 error. \n\"\"\"\n\nhttps://docs.openstack.org/api-ref/compute/#hosts-os-hosts-deprecated\n\nin general most of theis api was really only useful for xen as well\n\n\nlooking at https://docs.openstack.org/api-ref/compute/#id502\n\nthis aligns.\n\nin generall we propably shoudl jsut delete this api and retrun a 410 GONE on all microversions in a future release.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"44d837be35c68c73af4ee326d77eb22fe7578b00","unresolved":false,"context_lines":[{"line_number":58,"context_line":"reboot_query \u003d {}"},{"line_number":59,"context_line":"show_query \u003d {}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"index_response \u003d {"},{"line_number":62,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":63,"context_line":"    \u0027properties\u0027: {"},{"line_number":64,"context_line":"        \u0027hosts\u0027: {"}],"source_content_type":"text/x-python","patch_set":10,"id":"a6ed6503_dfc9412a","line":61,"in_reply_to":"2ebdd8ef_6fd948d3","updated":"2025-06-09 08:32:11.000000000","message":"Acknowledged","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"28f1bf99acd2ac94643c1c97a3b3ae41d77dcdf4","unresolved":true,"context_lines":[{"line_number":58,"context_line":"reboot_query \u003d {}"},{"line_number":59,"context_line":"show_query \u003d {}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"index_response \u003d {"},{"line_number":62,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":63,"context_line":"    \u0027properties\u0027: {"},{"line_number":64,"context_line":"        \u0027hosts\u0027: {"}],"source_content_type":"text/x-python","patch_set":10,"id":"2ebdd8ef_6fd948d3","line":61,"in_reply_to":"613661b8_cbed5e43","updated":"2025-06-05 18:36:52.000000000","message":"start/stop/reboot/update host yes, we may 410 them but we need to keep list/show host for older microversion until we are sure evryone using hypervisor APIs for that.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":67,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"                \u0027properties\u0027: {"},{"line_number":69,"context_line":"                    \u0027host_name\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":70,"context_line":"                    # TODO(stephenfin): This should be an enum"},{"line_number":71,"context_line":"                    \u0027service\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":72,"context_line":"                    \u0027zone\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":73,"context_line":"                },"},{"line_number":74,"context_line":"                \u0027required\u0027: [\u0027host_name\u0027, \u0027service\u0027, \u0027zone\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"6678b944_debf8821","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":50},"updated":"2025-05-15 12:54:32.000000000","message":"I agree that an enum would be better, but this API is deprecated and the service type field is backed by the Service field topic, which is defined as a string in objects and DB. So I think we should leave it as a string.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"                \u0027properties\u0027: {"},{"line_number":69,"context_line":"                    \u0027host_name\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":70,"context_line":"                    # TODO(stephenfin): This should be an enum"},{"line_number":71,"context_line":"                    \u0027service\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":72,"context_line":"                    \u0027zone\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":73,"context_line":"                },"},{"line_number":74,"context_line":"                \u0027required\u0027: [\u0027host_name\u0027, \u0027service\u0027, \u0027zone\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"cb6a80ff_67c104b2","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":50},"in_reply_to":"6678b944_debf8821","updated":"2025-05-19 12:56:24.000000000","message":"Agreed: the TODO is here because I didn\u0027t want to invest the time into writing this 😄 However, the TODO doesn\u0027t have to ever be addressed (look at how many `TODO`s we already have) so IMO it\u0027s okay to note this here, if for no other reason that to provide a bread crumb for reviewers in helping them understand what is here.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e170506b22a1d8c191ec39b38ea4cd4bba0a3ce1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"                \u0027properties\u0027: {"},{"line_number":69,"context_line":"                    \u0027host_name\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":70,"context_line":"                    # TODO(stephenfin): This should be an enum"},{"line_number":71,"context_line":"                    \u0027service\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":72,"context_line":"                    \u0027zone\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":73,"context_line":"                },"},{"line_number":74,"context_line":"                \u0027required\u0027: [\u0027host_name\u0027, \u0027service\u0027, \u0027zone\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"9e14c0fe_3d587351","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":50},"in_reply_to":"cb6a80ff_67c104b2","updated":"2025-05-21 18:33:46.000000000","message":"from a db and model perspective gong form a string to an enum is valid to do without a type change provided you make the enum derive form string.\n\nlike this\n\nhttps://review.opendev.org/c/openstack/nova/+/825015/21/nova/healthcheck/constants.py\n\n\nwe coudl restrict this goign forward but im not pushed either way if we keep the TODO or drop it.\n\nit think its good to call out these possibel impovmenets in general, will we ever get to them, probaly not but we might os i would be ok with leaving it but i dont mind either way.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0cfd540e4571f8ecc98de3063b062d5eedc7253f","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027required\u0027: [\u0027host\u0027],"},{"line_number":112,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"update_response \u003d {"},{"line_number":116,"context_line":"    \u0027type\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"f50ce7fa_1cce8da6","line":113,"updated":"2025-05-21 18:41:41.000000000","message":"https://docs.openstack.org/api-ref/compute/#id504\nthis si also correct.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"44d837be35c68c73af4ee326d77eb22fe7578b00","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027required\u0027: [\u0027host\u0027],"},{"line_number":112,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"update_response \u003d {"},{"line_number":116,"context_line":"    \u0027type\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"987af7e0_cf9e2dac","line":113,"in_reply_to":"f50ce7fa_1cce8da6","updated":"2025-06-09 08:32:11.000000000","message":"Acknowledged","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0cfd540e4571f8ecc98de3063b062d5eedc7253f","unresolved":true,"context_lines":[{"line_number":112,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"update_response \u003d {"},{"line_number":116,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":117,"context_line":"    \u0027properties\u0027: {"},{"line_number":118,"context_line":"        \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":119,"context_line":"        \u0027maintenance_mode\u0027: {\u0027enum\u0027: [\u0027on_maintenance\u0027, \u0027off_maintenance\u0027]},"},{"line_number":120,"context_line":"        \u0027status\u0027: {\u0027enum\u0027: [\u0027enabled\u0027, \u0027disabled\u0027]},"},{"line_number":121,"context_line":"    },"},{"line_number":122,"context_line":"    \u0027required\u0027: [\u0027host\u0027],"},{"line_number":123,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":124,"context_line":"}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"_power_action_response \u003d {"},{"line_number":127,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":128,"context_line":"    \u0027properties\u0027: {"},{"line_number":129,"context_line":"        \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":130,"context_line":"        # NOTE(stephenfin): This is virt driver specific and the API is"},{"line_number":131,"context_line":"        # deprecated, so this is left empty"},{"line_number":132,"context_line":"        \u0027power_action\u0027: {},"},{"line_number":133,"context_line":"    },"},{"line_number":134,"context_line":"    \u0027required\u0027: [\u0027host\u0027, \u0027power_action\u0027],"},{"line_number":135,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":136,"context_line":"}"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"startup_response \u003d copy.deepcopy(_power_action_response)"},{"line_number":139,"context_line":"shutdown_response \u003d copy.deepcopy(_power_action_response)"}],"source_content_type":"text/x-python","patch_set":10,"id":"75d33bcb_8545c8dd","line":136,"range":{"start_line":115,"start_character":0,"end_line":136,"end_character":1},"updated":"2025-05-21 18:41:41.000000000","message":"these two are xen only\n\ntecnially the api refe says these are string\n\n```\nmaintenance_mode\u0027: {\u0027enum\u0027: [\u0027on_maintenance\u0027, \u0027off_maintenance\u0027]},\n        \u0027status\u0027: {\u0027enum\u0027: [\u0027enabled\u0027, \u0027disabled\u0027]},\n```\n\nbut they have fixed allwoe dvalues so this si correct.\n\nthe power action all share the same resonce\ntoo","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"44d837be35c68c73af4ee326d77eb22fe7578b00","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"update_response \u003d {"},{"line_number":116,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":117,"context_line":"    \u0027properties\u0027: {"},{"line_number":118,"context_line":"        \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":119,"context_line":"        \u0027maintenance_mode\u0027: {\u0027enum\u0027: [\u0027on_maintenance\u0027, \u0027off_maintenance\u0027]},"},{"line_number":120,"context_line":"        \u0027status\u0027: {\u0027enum\u0027: [\u0027enabled\u0027, \u0027disabled\u0027]},"},{"line_number":121,"context_line":"    },"},{"line_number":122,"context_line":"    \u0027required\u0027: [\u0027host\u0027],"},{"line_number":123,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":124,"context_line":"}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"_power_action_response \u003d {"},{"line_number":127,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":128,"context_line":"    \u0027properties\u0027: {"},{"line_number":129,"context_line":"        \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":130,"context_line":"        # NOTE(stephenfin): This is virt driver specific and the API is"},{"line_number":131,"context_line":"        # deprecated, so this is left empty"},{"line_number":132,"context_line":"        \u0027power_action\u0027: {},"},{"line_number":133,"context_line":"    },"},{"line_number":134,"context_line":"    \u0027required\u0027: [\u0027host\u0027, \u0027power_action\u0027],"},{"line_number":135,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":136,"context_line":"}"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"startup_response \u003d copy.deepcopy(_power_action_response)"},{"line_number":139,"context_line":"shutdown_response \u003d copy.deepcopy(_power_action_response)"}],"source_content_type":"text/x-python","patch_set":10,"id":"af5d8758_d17b7214","line":136,"range":{"start_line":115,"start_character":0,"end_line":136,"end_character":1},"in_reply_to":"75d33bcb_8545c8dd","updated":"2025-06-09 08:32:11.000000000","message":"Acknowledged","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"}],"nova/tests/unit/policies/test_hosts.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"1b8a24f9_5f6f9d36","line":52,"updated":"2025-05-15 12:54:32.000000000","message":"Change not needed IMHO.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e170506b22a1d8c191ec39b38ea4cd4bba0a3ce1","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"2549d0c7_d4b19b44","line":52,"in_reply_to":"18c663ca_4ee0591a","updated":"2025-05-21 18:33:46.000000000","message":"i would have done this instead.\n```suggestion\n    @mock.patch(\n        \u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)\n```\n\nto avoid the # noqa\n\ni think this is about as readble eitehr way but i dont think this is enough to rebase for.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"18c663ca_4ee0591a","line":52,"in_reply_to":"1b8a24f9_5f6f9d36","updated":"2025-05-19 12:56:24.000000000","message":"It makes this like somewhat easier to read. I\u0027d like to keep it (and avoid rebasing) if possible.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3dbcb4761cbcce897d6df0b30991f9e080f74c80","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"91119aaf_3bddcb7e","line":52,"in_reply_to":"2549d0c7_d4b19b44","updated":"2025-06-05 14:36:06.000000000","message":"fwiw, if we used flake8-bugbear and [its `B950` rule](https://github.com/PyCQA/flake8-bugbear) this wouldn\u0027t be necessary. Alas, that got vetoed a few years back 😞","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46d7287c9be9e95dace5130e45b6a0b16a33fa92","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"f7cb75e0_48933939","line":52,"in_reply_to":"34b661df_fead2ced","updated":"2025-06-06 10:41:09.000000000","message":"Sorry, to be clear, what is the ask here? To not use the `noqa: E501`? I can, but honestly I thought you\u0027d be _in favour_ of this approach since the usual concern is about too much vertical space being wasted? IMO this is more concise, but I can of course change in a follow-up if it\u0027s a serious concern.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"28f1bf99acd2ac94643c1c97a3b3ae41d77dcdf4","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"34b661df_fead2ced","line":52,"in_reply_to":"91119aaf_3bddcb7e","updated":"2025-06-05 18:36:52.000000000","message":"I will not be in favor of noqa as we can do that in almost all code for readability. Maybe Sean suggestion is better than existing way. But I am ok if stephenfin want to remove noqa in followup. not worth of rebase.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"f04efb504ca794de326d67250cea78ae41cfef34","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"949e2c17_432dd2b3","line":52,"in_reply_to":"91119aaf_3bddcb7e","updated":"2025-06-06 13:50:03.000000000","message":"😊 To be honest, I warned you about this because I know cores that did not like \"unneeded\" changes.\nOn my side, I\u0027m pretty cool with rewriting for clarity.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c011a0420051fbd109ef4382fd4936d45f6e57e3","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @mock.patch(\u0027nova.context.set_target_cell\u0027)"},{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"0d59a619_5145a14f","line":52,"in_reply_to":"949e2c17_432dd2b3","updated":"2025-06-09 21:12:17.000000000","message":"yes, please. IMO, we should not add noqa until it is unfixable. I am not blocking it but would be happy to see followup to remove noqa.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"},{"line_number":56,"context_line":"        mock_node.return_value \u003d objects.ComputeNode("},{"line_number":57,"context_line":"            vcpus\u003d16, memory_mb\u003d8192, local_gb\u003d1000,"}],"source_content_type":"text/x-python","patch_set":10,"id":"8bfc3d72_5b11caa2","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":29},"updated":"2025-05-15 12:54:32.000000000","message":"I think I would rename the tests to test_*_host_policy_and_response","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46d7287c9be9e95dace5130e45b6a0b16a33fa92","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"},{"line_number":56,"context_line":"        mock_node.return_value \u003d objects.ComputeNode("},{"line_number":57,"context_line":"            vcpus\u003d16, memory_mb\u003d8192, local_gb\u003d1000,"}],"source_content_type":"text/x-python","patch_set":10,"id":"f0a43747_df9615b6","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":29},"in_reply_to":"1b3b7c63_725bc531","updated":"2025-06-06 10:41:09.000000000","message":"+1 to what @gmaan@ghanshyammann.com said. I\u0027m going to leave this as-is unless it\u0027s a serious sticking point.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"28f1bf99acd2ac94643c1c97a3b3ae41d77dcdf4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"},{"line_number":56,"context_line":"        mock_node.return_value \u003d objects.ComputeNode("},{"line_number":57,"context_line":"            vcpus\u003d16, memory_mb\u003d8192, local_gb\u003d1000,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1b3b7c63_725bc531","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":29},"in_reply_to":"39fd02e9_c6547a41","updated":"2025-06-05 18:36:52.000000000","message":"I am not sure we need to change either test name or test class name. These tests are under nova/tests/unit/*policies* dir so clear that it is for policy testing. As stephenfin mentioned, many APIs method tests whos goal is particular testing (policy, schema, controller method, error etc) can cover request/response proper checks which is good but that does not make them request/response schema tests.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"},{"line_number":56,"context_line":"        mock_node.return_value \u003d objects.ComputeNode("},{"line_number":57,"context_line":"            vcpus\u003d16, memory_mb\u003d8192, local_gb\u003d1000,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9e2eb4ec_d7f5ceff","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":29},"in_reply_to":"8bfc3d72_5b11caa2","updated":"2025-05-19 12:56:24.000000000","message":"I don\u0027t think that\u0027s wise. This test is designed to test *policy*, not the response schemas. The only reason we\u0027re now seeing response schema validation happen is because we have intentionally enabled schema validation for all tests (which is a good thing). However, we\u0027re not attempting to do exhaustive schema validation here.\n\nAnother way to look at this is that we\u0027ve already got request schema validation here, since we have request schemas already in `nova/api/openstack/compute/schemas/hosts.py` and there\u0027s no way to opt-out of request schema validation. However, you\u0027ll note that the tests aren\u0027t called e.g. `test_show_host_policy_and_request` because, again, that\u0027s not the point of these tests.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e170506b22a1d8c191ec39b38ea4cd4bba0a3ce1","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    @mock.patch(\u0027nova.objects.HostMapping.get_by_host\u0027)"},{"line_number":52,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_first_node_by_host_for_old_compat\u0027)  # noqa: E501"},{"line_number":53,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.instance_get_all_by_host\u0027)"},{"line_number":54,"context_line":"    def test_show_host_policy(self, mock_get, mock_node, mock_map, mock_set):"},{"line_number":55,"context_line":"        mock_get.return_value \u003d []"},{"line_number":56,"context_line":"        mock_node.return_value \u003d objects.ComputeNode("},{"line_number":57,"context_line":"            vcpus\u003d16, memory_mb\u003d8192, local_gb\u003d1000,"}],"source_content_type":"text/x-python","patch_set":10,"id":"39fd02e9_c6547a41","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":29},"in_reply_to":"9e2eb4ec_d7f5ceff","updated":"2025-05-21 18:33:46.000000000","message":"instead of renaming all the tests we coudl rename the clase\n\nHostsPolicyTest to HostsPolicyAndResponceTest\n\nbut regardeless of what we deciend i think it should be in a seperate patch at teh end of the series.","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":63,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.set_host_enabled\u0027)"},{"line_number":66,"context_line":"    def test_update_host_policy(self, mock_set_host_enabled):"},{"line_number":67,"context_line":"        mock_set_host_enabled.return_value \u003d \u0027enabled\u0027"},{"line_number":68,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027update\u0027"},{"line_number":69,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3d2fc976_a456b1cc","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":31},"updated":"2025-05-15 12:54:32.000000000","message":"ditto","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.set_host_enabled\u0027)"},{"line_number":66,"context_line":"    def test_update_host_policy(self, mock_set_host_enabled):"},{"line_number":67,"context_line":"        mock_set_host_enabled.return_value \u003d \u0027enabled\u0027"},{"line_number":68,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027update\u0027"},{"line_number":69,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"}],"source_content_type":"text/x-python","patch_set":10,"id":"e9678dbc_35f45083","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":31},"in_reply_to":"3d2fc976_a456b1cc","updated":"2025-05-19 12:56:24.000000000","message":"As above","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                                body\u003d{\u0027status\u0027: \u0027enable\u0027})"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":75,"context_line":"    def test_reboot_host_policy(self, mock_action):"},{"line_number":76,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027reboot\u0027"},{"line_number":77,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":78,"context_line":"                                rule_name, self.controller.reboot,"}],"source_content_type":"text/x-python","patch_set":10,"id":"600ca8e2_be5a202e","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":31},"updated":"2025-05-15 12:54:32.000000000","message":"ditto","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                body\u003d{\u0027status\u0027: \u0027enable\u0027})"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":75,"context_line":"    def test_reboot_host_policy(self, mock_action):"},{"line_number":76,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027reboot\u0027"},{"line_number":77,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":78,"context_line":"                                rule_name, self.controller.reboot,"}],"source_content_type":"text/x-python","patch_set":10,"id":"a6c9cd5e_95145714","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":31},"in_reply_to":"600ca8e2_be5a202e","updated":"2025-05-19 12:56:24.000000000","message":"As above","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":79,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":82,"context_line":"    def test_shutdown_host_policy(self, mock_action):"},{"line_number":83,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027shutdown\u0027"},{"line_number":84,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":85,"context_line":"                                rule_name, self.controller.shutdown,"}],"source_content_type":"text/x-python","patch_set":10,"id":"d6c5c87e_d2ee37e2","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":33},"updated":"2025-05-15 12:54:32.000000000","message":"ditto","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":82,"context_line":"    def test_shutdown_host_policy(self, mock_action):"},{"line_number":83,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027shutdown\u0027"},{"line_number":84,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":85,"context_line":"                                rule_name, self.controller.shutdown,"}],"source_content_type":"text/x-python","patch_set":10,"id":"13fd6495_d7bcf7d0","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":33},"in_reply_to":"d6c5c87e_d2ee37e2","updated":"2025-05-19 12:56:24.000000000","message":"As above","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"cf4eed03237a076e9a8436d13feae54db83bf8ce","unresolved":true,"context_lines":[{"line_number":86,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":89,"context_line":"    def test_startup_host_policy(self, mock_action):"},{"line_number":90,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027start\u0027"},{"line_number":91,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":92,"context_line":"                                rule_name, self.controller.startup,"}],"source_content_type":"text/x-python","patch_set":10,"id":"67ef2fdc_e40d8a19","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":32},"updated":"2025-05-15 12:54:32.000000000","message":"ditto","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70749f5fae49de8ae21b5bcf126dda56c8f563b0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                self.req, \u0027hostname\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @mock.patch(\u0027nova.compute.api.HostAPI.host_power_action\u0027)"},{"line_number":89,"context_line":"    def test_startup_host_policy(self, mock_action):"},{"line_number":90,"context_line":"        rule_name \u003d policies.POLICY_NAME % \u0027start\u0027"},{"line_number":91,"context_line":"        self.common_policy_auth(self.project_admin_authorized_contexts,"},{"line_number":92,"context_line":"                                rule_name, self.controller.startup,"}],"source_content_type":"text/x-python","patch_set":10,"id":"cb62e990_f7e51773","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":32},"in_reply_to":"67ef2fdc_e40d8a19","updated":"2025-05-19 12:56:24.000000000","message":"As above","commit_id":"f7a03e5834fbd38a0797a0910fd4a0abb07d4f3d"}]}
