)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a887a99596eb2996cf1b82c51a7269286ef0b09","unresolved":true,"context_lines":[{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."},{"line_number":13,"context_line":"Proposed fix uses instance.image_meta instead making api to glance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-Bug: #2002606"},{"line_number":16,"context_line":"Change-Id: Ia0f747158721f82ef1803618b6cb30661b6252c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"54ccc5a2_9122200b","line":13,"updated":"2023-02-01 08:47:51.000000000","message":"so this is expected fi you dont pass an alretintive image\n\nthere are 3 possible image sources for rebuild\n\n1 the image the vm was booted with if it exist (this is the default beahivor)\n2 you can set a rescue image to use in the nova.conf\nhttps://docs.openstack.org/nova/latest/configuration/config.html#libvirt.rescue_image_id\n3 the user can supply an image.","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"7fd81c419895c9ab04455b06cce5f57303620139","unresolved":true,"context_lines":[{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."},{"line_number":13,"context_line":"Proposed fix uses instance.image_meta instead making api to glance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-Bug: #2002606"},{"line_number":16,"context_line":"Change-Id: Ia0f747158721f82ef1803618b6cb30661b6252c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"979115d6_8ef4fda6","line":13,"in_reply_to":"54ccc5a2_9122200b","updated":"2023-02-08 08:49:29.000000000","message":"It is not rebuild process, it is rescue in stable mode process, where rescue image with hw_rescue_* already defined, and rescue_image_meta already exists\nrescue_image_meta \u003d image_meta (cases 1,2,3).\nWe need to get original instance.image_meta too. We can use glance api, or use internal instance.image_meta.\nI checked code - only Server Create Process + Server Rebuild Process change instance.image_meta, rescue process do not change instance.image_meta, so it is in the state after server create and server rebuild operation.\nServer Power On/Hard reboot also use instance.image_meta","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d93460b70beb00bc1c8bd3fc60712abad8fab7b0","unresolved":true,"context_lines":[{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."},{"line_number":13,"context_line":"Proposed fix uses instance.image_meta instead making api to glance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-Bug: #2002606"},{"line_number":16,"context_line":"Change-Id: Ia0f747158721f82ef1803618b6cb30661b6252c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"50cffcde_c35a0084","line":13,"in_reply_to":"54ccc5a2_9122200b","updated":"2023-02-01 12:46:14.000000000","message":"sorry i ment rescue above.","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"e194b25a98f9c8196367708e4d09ee190d9a18d9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."},{"line_number":13,"context_line":"Proposed fix uses instance.image_meta instead making api to glance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-Bug: #2002606"},{"line_number":16,"context_line":"Change-Id: Ia0f747158721f82ef1803618b6cb30661b6252c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"4628c54c_92adcb5d","line":13,"in_reply_to":"979115d6_8ef4fda6","updated":"2023-07-20 17:51:43.000000000","message":"Done","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Server Rescue leads to Server ERROR state if base image is deleted"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Server has dependency of original base image used to Create Server or"},{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"2d61ae2d_4107dfb9","line":9,"range":{"start_line":9,"start_character":34,"end_line":9,"end_character":38},"updated":"2023-07-20 01:26:25.000000000","message":"Use of the word \"base\" here really threw me off because I\u0027m used to it meaning the base image or backing file for qcow2 images 😛 but I now see you mean original image.","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"e194b25a98f9c8196367708e4d09ee190d9a18d9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Server Rescue leads to Server ERROR state if base image is deleted"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Server has dependency of original base image used to Create Server or"},{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"4fd92e22_b984946c","line":9,"range":{"start_line":9,"start_character":34,"end_line":9,"end_character":38},"in_reply_to":"2973d4d5_38c8aa01","updated":"2023-07-20 17:51:43.000000000","message":"Done","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"a1fb2e1e489aa04a758ad45a73d551a491eb7553","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Server Rescue leads to Server ERROR state if base image is deleted"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Server has dependency of original base image used to Create Server or"},{"line_number":10,"context_line":"Rebuild Server. If original image is deleted from glance, nova has"},{"line_number":11,"context_line":"server.image_ref reference to non-existent image. Rescue in stable"},{"line_number":12,"context_line":"device rescue mode leads to driver error and Server in ERROR state."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"2973d4d5_38c8aa01","line":9,"range":{"start_line":9,"start_character":34,"end_line":9,"end_character":38},"in_reply_to":"2d61ae2d_4107dfb9","updated":"2023-07-20 16:19:32.000000000","message":"changed entire description","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d93460b70beb00bc1c8bd3fc60712abad8fab7b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"25a3def9_5284eae5","updated":"2023-02-01 12:46:14.000000000","message":"so i should have said this in the prvious review but we aslo shoudl have a repoducer functional  to show the orginal bug as an initial patch.\n\nthen this patch should fix the bug and update the test.\n\nso the inital test shoudl assert the server goes to error and the updated test after the fix should show that it now rescuse properly.\n\n\nthis should be a functional test not a unit test however you can also add unit test coverage in addiont to that.\n\nwhen you add that it would be nice to add a fixes release note to tell operator about this fix although its optional just stongly prefered.","commit_id":"2c165011e9560b06dfc9d44954f38433b67143a8"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"7fd81c419895c9ab04455b06cce5f57303620139","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b44f3628_6e191df7","in_reply_to":"25a3def9_5284eae5","updated":"2023-02-08 08:49:29.000000000","message":"Ok, I wrote a test and wait for review","commit_id":"2c165011e9560b06dfc9d44954f38433b67143a8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5f09a8a5_af716c4c","updated":"2023-07-20 01:26:25.000000000","message":"I stumbled upon this change while I was looking at bugs related to rescue.\n\nThe change looks correct but I\u0027m not able to try the func tests locally ... they are failing for me seemingly from lack of certain mocking (it\u0027s trying to call qemu-img). I can try rebasing this patch to sanity check whether it\u0027s just my environment or what.","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3559cc17c621c763f0996cc81e107769123ee8b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"8042957e_68a90503","updated":"2023-07-20 18:55:34.000000000","message":"Looking at the nova-tox-functional-py310 job failure, it\u0027s the same issue I ran into on my local devstack and I do indeed have python 3.10 as default on the VM I\u0027m using for my devstack.\n\nnova-tox-functional-py310 log:\n\nhttps://zuul.opendev.org/t/openstack/build/7e11b89f14b04d95a3877abef76e5b88/log/job-output.txt","commit_id":"91e21408ef196c43736428157b6ebee899e406a5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"19d22092698553beef5f14e7c3db3afd69c79926","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"93d4f0ce_276dc19e","in_reply_to":"14290e44_1d956ad8","updated":"2023-07-20 20:09:27.000000000","message":"Yeah, something must have changed in the intervening time. It\u0027s odd because it passes with python 3.8 and 3.9, only fails with 3.10.","commit_id":"91e21408ef196c43736428157b6ebee899e406a5"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"d0a72d9ca37c555d77163621216d54b12df291d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"14290e44_1d956ad8","in_reply_to":"8042957e_68a90503","updated":"2023-07-20 19:22:46.000000000","message":"I run test with old cloned repo - it passed norm. But right now it fails with 27.1.0 I just cloned from master. So I look what can be done to meet requirements tomorrow.","commit_id":"91e21408ef196c43736428157b6ebee899e406a5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5fc9569a84e0370e09a73a27302d7c1dcb415569","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c49b5a0e_7638d80f","updated":"2023-07-24 23:42:14.000000000","message":"I tried PS10 locally and the local image version of the test indeed fails without the fix and passes with the fix. And the boot from volume version passes before and after the fix because BFV does not use an image_ref (thanks for highlighting that in the code comments).\n\nMy remaining comments are just nits and FYIs, so this patch LGTM.","commit_id":"f6fd71a187c907c70a54baca2399aefd63acfa4d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"41c9776a889cab9dd0e3376190254096d2977256","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"707bf414_f244328a","updated":"2023-07-25 19:56:55.000000000","message":"nova-tox-functional-py38 is going to fail but the failure is unrelated to this patch","commit_id":"6f878ad21c5dec6de03c9ce33147fd3e70a0770c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8f4042e32632809bddf7231213ade21b86a0024a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"24b115fd_9ecf5db5","updated":"2024-02-16 20:43:18.000000000","message":"recheck get new results","commit_id":"6f878ad21c5dec6de03c9ce33147fd3e70a0770c"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"d6e23732297436713dbf0e0162c8ca84dd5a03ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"4dc62fde_31d0e43d","in_reply_to":"707bf414_f244328a","updated":"2024-02-15 18:20:25.000000000","message":"We still need this commit in master","commit_id":"6f878ad21c5dec6de03c9ce33147fd3e70a0770c"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"c81749d98e3017c9440095971b61136448d2dd9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"ac2b8e03_ce765fd7","updated":"2024-02-23 05:18:37.000000000","message":"recheck","commit_id":"0cf0b1b21ac00e5e11717e45935b3894afc7a9c4"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"51250257445603b1a437cd33bf4aed77833f9927","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"90d59b46_588ae595","updated":"2024-07-07 23:06:08.000000000","message":"Re-applying +W after a trivial rebase","commit_id":"714894a7ff81e23f5ac7545a6b91ea484447a988"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"2f16e93a8e665c2eea94880d4b8536f526af72e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"12b13600_9ffe8e1c","updated":"2024-07-07 06:25:54.000000000","message":"We still need this patch in master","commit_id":"714894a7ff81e23f5ac7545a6b91ea484447a988"}],"nova/tests/functional/libvirt/test_rescue_deleted_base.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":true,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"}],"source_content_type":"text/x-python","patch_set":8,"id":"a8f51f25_98a92a4a","line":16,"updated":"2023-07-20 01:26:25.000000000","message":"This is a third party library, so it should be in the middle section with the oslo imports.","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"a1fb2e1e489aa04a758ad45a73d551a491eb7553","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"}],"source_content_type":"text/x-python","patch_set":8,"id":"4ecaa7ea_61070501","line":16,"in_reply_to":"a8f51f25_98a92a4a","updated":"2023-07-20 16:19:32.000000000","message":"Done","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":true,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RescueServerTestWithDeletedBaseImage("},{"line_number":28,"context_line":"        integrated_helpers.LibvirtProviderUsageBaseTestCase):"},{"line_number":29,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":30,"context_line":"    microversion \u003d \u00272.87\u0027"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"4fde060e_06f35ec4","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":59},"updated":"2023-07-20 01:26:25.000000000","message":"ServersTestBase might be a better base class here because it has the LibvirtImageBackendFixture and also does some other stuff:\n\nhttps://github.com/openstack/nova/blob/b6f4c57/tests/functional/libvirt/base.py#L32","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"ab46dd9edfd4976a69230f9c343b6b588d75da02","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RescueServerTestWithDeletedBaseImage("},{"line_number":28,"context_line":"        integrated_helpers.LibvirtProviderUsageBaseTestCase):"},{"line_number":29,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":30,"context_line":"    microversion \u003d \u00272.87\u0027"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7fefb8b9_1b07fa7d","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":59},"in_reply_to":"4fde060e_06f35ec4","updated":"2023-07-21 06:23:44.000000000","message":"Done","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        self.glance.create(None, rescue_stable_image)"},{"line_number":88,"context_line":"        return base_image, rescue_stable_image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_stable_rescue_server_local_disk(self):"},{"line_number":91,"context_line":"        self.start_compute()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # create a local server with base image"}],"source_content_type":"text/x-python","patch_set":8,"id":"2f00986e_0b825e9b","line":90,"updated":"2023-07-20 01:26:25.000000000","message":"FYI and not asking to change it, a pattern we typically use is to make a separate patch containing only the reproducer functional tests, asserting the broken behavior along with code commented out asserts of the fixed behavior with a FIXME(myhandle): This a bug #NNNNNN, the correct behavior should be $expected_behavior.\n\nAnd then the fix patch gets stacked on top of the reproducer test patch and it includes removal of the broken behavior asserts and uncommenting out of the correct behavior asserts and FIXME note.\n\nWe do that because it makes it easy as a reviewer to see that the test is effective -- that it fails without the fix and passes with the fix.","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"a1fb2e1e489aa04a758ad45a73d551a491eb7553","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        self.glance.create(None, rescue_stable_image)"},{"line_number":88,"context_line":"        return base_image, rescue_stable_image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_stable_rescue_server_local_disk(self):"},{"line_number":91,"context_line":"        self.start_compute()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # create a local server with base image"}],"source_content_type":"text/x-python","patch_set":8,"id":"7483d183_1d5166cc","line":90,"in_reply_to":"2f00986e_0b825e9b","updated":"2023-07-20 16:19:32.000000000","message":"I commented out that first tests fails on current master, and passed with fix, second tests always pass (before and now)","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5fc9569a84e0370e09a73a27302d7c1dcb415569","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.glance.create(None, rescue_stable_image)"},{"line_number":88,"context_line":"        return base_image, rescue_stable_image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_stable_rescue_server_local_disk(self):"},{"line_number":91,"context_line":"        self.start_compute()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # create a local server with base image"}],"source_content_type":"text/x-python","patch_set":8,"id":"73070a31_212030ff","line":90,"in_reply_to":"6483ec70_482b5e6b","updated":"2023-07-24 23:42:14.000000000","message":"Not asking you to change it, but this is what I meant about the reproducer patch + fix patch pattern, example: https://review.opendev.org/c/openstack/nova/+/862686 and https://review.opendev.org/c/openstack/nova/+/862687.\n\nThese code comments are nice though. FYI also not asking you to change it, but such comments are usually put inside the test method in a docstring style (also shown in the above ^ example).","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"e194b25a98f9c8196367708e4d09ee190d9a18d9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.glance.create(None, rescue_stable_image)"},{"line_number":88,"context_line":"        return base_image, rescue_stable_image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_stable_rescue_server_local_disk(self):"},{"line_number":91,"context_line":"        self.start_compute()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # create a local server with base image"}],"source_content_type":"text/x-python","patch_set":8,"id":"6483ec70_482b5e6b","line":90,"in_reply_to":"7483d183_1d5166cc","updated":"2023-07-20 17:51:43.000000000","message":"Done","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":20733,"name":"Rajesh Tailor","email":"ratailor@redhat.com","username":"rajesht"},"change_message_id":"27856c38dca7c5e9578f095a6b5dc90d93a51515","unresolved":true,"context_lines":[{"line_number":131,"context_line":"           len(server[\u0027os-extended-volumes:volumes_attached\u0027]))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # Delete all glance images except rescue image"},{"line_number":134,"context_line":"        ids \u003d []"},{"line_number":135,"context_line":"        for o in self.glance.images.keys():"},{"line_number":136,"context_line":"            ids.append(o)"},{"line_number":137,"context_line":"        for o in ids:"},{"line_number":138,"context_line":"            if o !\u003d rescue_stable_image[\u0027id\u0027]:"},{"line_number":139,"context_line":"                self.glance.delete(None, o)"},{"line_number":140,"context_line":"        self.assertEqual(1, len(self.glance.images.keys()))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        rescue_req \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ef6f3b08_a0c9f5a5","line":139,"range":{"start_line":134,"start_character":1,"end_line":139,"end_character":43},"updated":"2023-07-20 04:15:20.000000000","message":"IMO instead of using 2 for loops, you could use one.\n\nfor o in self.glance.images.keys():\n  if o !\u003d rescue_stable_image[\u0027id\u0027]:\n    self.glance.delete(None, o)","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"4be535bd3751fce0e9cd0eb545d7b0cb5261aeb9","unresolved":false,"context_lines":[{"line_number":131,"context_line":"           len(server[\u0027os-extended-volumes:volumes_attached\u0027]))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # Delete all glance images except rescue image"},{"line_number":134,"context_line":"        ids \u003d []"},{"line_number":135,"context_line":"        for o in self.glance.images.keys():"},{"line_number":136,"context_line":"            ids.append(o)"},{"line_number":137,"context_line":"        for o in ids:"},{"line_number":138,"context_line":"            if o !\u003d rescue_stable_image[\u0027id\u0027]:"},{"line_number":139,"context_line":"                self.glance.delete(None, o)"},{"line_number":140,"context_line":"        self.assertEqual(1, len(self.glance.images.keys()))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        rescue_req \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"a185caca_509698d0","line":139,"range":{"start_line":134,"start_character":1,"end_line":139,"end_character":43},"in_reply_to":"ef6f3b08_a0c9f5a5","updated":"2023-07-20 16:00:36.000000000","message":"It is done by design, your variant leads to:\nRuntimeError: dictionary changed size during iteration\nCannot delete and iterate the same object array","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5fc9569a84e0370e09a73a27302d7c1dcb415569","unresolved":true,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class RescueServerTestWithDeletedBaseImage("},{"line_number":31,"context_line":"    base.ServersTestBase,"},{"line_number":32,"context_line":"    integrated_helpers.InstanceHelperMixin"},{"line_number":33,"context_line":"):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"7cccbdb5_3b5d9586","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":42},"updated":"2023-07-24 23:42:14.000000000","message":"I don\u0027t think you need this, ServersTestCase already includes InstanceHelperMixin via _IntegratedTestBase \u003d\u003e PlacementInstanceHelperMixin \u003d\u003e InstanceHelperMixin.","commit_id":"f6fd71a187c907c70a54baca2399aefd63acfa4d"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"3d4c0eef949b3fc9d3e8342def3eaabfde76bbad","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class RescueServerTestWithDeletedBaseImage("},{"line_number":31,"context_line":"    base.ServersTestBase,"},{"line_number":32,"context_line":"    integrated_helpers.InstanceHelperMixin"},{"line_number":33,"context_line":"):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"bb870ebe_5e21319a","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":42},"in_reply_to":"7cccbdb5_3b5d9586","updated":"2023-07-25 14:41:26.000000000","message":"Done","commit_id":"f6fd71a187c907c70a54baca2399aefd63acfa4d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5fc9569a84e0370e09a73a27302d7c1dcb415569","unresolved":true,"context_lines":[{"line_number":162,"context_line":"            ids.append(o)"},{"line_number":163,"context_line":"        for o in ids:"},{"line_number":164,"context_line":"            if o !\u003d rescue_stable_image[\u0027id\u0027]:"},{"line_number":165,"context_line":"                self.glance.delete(None, o)"},{"line_number":166,"context_line":"        self.assertEqual(1, len(self.glance.images.keys()))"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        rescue_req \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"82df3d32_b5aa378d","line":165,"range":{"start_line":165,"start_character":35,"end_line":165,"end_character":39},"updated":"2023-07-24 23:42:14.000000000","message":"Another FYI, in tests we use a dummy RequestContext instead of passing None for the context, i.e.:\n\n```\nfrom nova import context as nova_context\n\nctxt \u003d nova_context.get_admin_context()\nself.glance.delete(ctxt, o)\n```","commit_id":"f6fd71a187c907c70a54baca2399aefd63acfa4d"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"3d4c0eef949b3fc9d3e8342def3eaabfde76bbad","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            ids.append(o)"},{"line_number":163,"context_line":"        for o in ids:"},{"line_number":164,"context_line":"            if o !\u003d rescue_stable_image[\u0027id\u0027]:"},{"line_number":165,"context_line":"                self.glance.delete(None, o)"},{"line_number":166,"context_line":"        self.assertEqual(1, len(self.glance.images.keys()))"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        rescue_req \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"8819434a_1906b771","line":165,"range":{"start_line":165,"start_character":35,"end_line":165,"end_character":39},"in_reply_to":"82df3d32_b5aa378d","updated":"2023-07-25 14:41:26.000000000","message":"Done","commit_id":"f6fd71a187c907c70a54baca2399aefd63acfa4d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3e518585f8b512c24df85c621982912740c4d3c0","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from nova import conf"},{"line_number":22,"context_line":"from nova import context as nova_context"},{"line_number":23,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":24,"context_line":"from nova.tests.functional import integrated_helpers"},{"line_number":25,"context_line":"from nova.tests.functional.libvirt import base"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":11,"id":"90cd58da_a3403568","line":24,"updated":"2023-07-25 17:43:58.000000000","message":"openstack-tox-pep8 is failing because this import is now unused","commit_id":"4c92afe8aec2520293cd67e7801b1eddebaa018b"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"0944ab8e01e41a2f9238942629521f22a72b627a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import conf"},{"line_number":22,"context_line":"from nova import context as nova_context"},{"line_number":23,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":24,"context_line":"from nova.tests.functional import integrated_helpers"},{"line_number":25,"context_line":"from nova.tests.functional.libvirt import base"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5c1e9cac_ed80b966","line":24,"in_reply_to":"90cd58da_a3403568","updated":"2023-07-25 19:25:56.000000000","message":"Done","commit_id":"4c92afe8aec2520293cd67e7801b1eddebaa018b"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a887a99596eb2996cf1b82c51a7269286ef0b09","unresolved":true,"context_lines":[{"line_number":4247,"context_line":"            # new rescue_image_meta and block_device_info when calling"},{"line_number":4248,"context_line":"            # get_disk_info."},{"line_number":4249,"context_line":"            rescue_image_meta \u003d image_meta"},{"line_number":4250,"context_line":"            image_meta \u003d instance.image_meta"},{"line_number":4251,"context_line":""},{"line_number":4252,"context_line":"        else:"},{"line_number":4253,"context_line":"            LOG.info(\"Attempting rescue\", instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":1,"id":"921d0901_b904ca04","line":4250,"updated":"2023-02-01 08:47:51.000000000","message":"-1\nwe cant do this uncondtionally.\n\none of the usecases for rebuild is to update the image properies used by a vm\n\nwhat you need to do instead is catch the excption and fallback to the one form the instance.","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d93460b70beb00bc1c8bd3fc60712abad8fab7b0","unresolved":false,"context_lines":[{"line_number":4247,"context_line":"            # new rescue_image_meta and block_device_info when calling"},{"line_number":4248,"context_line":"            # get_disk_info."},{"line_number":4249,"context_line":"            rescue_image_meta \u003d image_meta"},{"line_number":4250,"context_line":"            image_meta \u003d instance.image_meta"},{"line_number":4251,"context_line":""},{"line_number":4252,"context_line":"        else:"},{"line_number":4253,"context_line":"            LOG.info(\"Attempting rescue\", instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c65938ac_b66ebe2c","line":4250,"in_reply_to":"921d0901_b904ca04","updated":"2023-02-01 12:46:14.000000000","message":"Done","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"7fd81c419895c9ab04455b06cce5f57303620139","unresolved":true,"context_lines":[{"line_number":4247,"context_line":"            # new rescue_image_meta and block_device_info when calling"},{"line_number":4248,"context_line":"            # get_disk_info."},{"line_number":4249,"context_line":"            rescue_image_meta \u003d image_meta"},{"line_number":4250,"context_line":"            image_meta \u003d instance.image_meta"},{"line_number":4251,"context_line":""},{"line_number":4252,"context_line":"        else:"},{"line_number":4253,"context_line":"            LOG.info(\"Attempting rescue\", instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f1c711c4_475009c0","line":4250,"in_reply_to":"921d0901_b904ca04","updated":"2023-02-08 08:49:29.000000000","message":"yes we are using image properties after server create/rebuild process.","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"9109c92d9480126c1f03f3ced6d9c13d265c255f","unresolved":false,"context_lines":[{"line_number":4247,"context_line":"            # new rescue_image_meta and block_device_info when calling"},{"line_number":4248,"context_line":"            # get_disk_info."},{"line_number":4249,"context_line":"            rescue_image_meta \u003d image_meta"},{"line_number":4250,"context_line":"            image_meta \u003d instance.image_meta"},{"line_number":4251,"context_line":""},{"line_number":4252,"context_line":"        else:"},{"line_number":4253,"context_line":"            LOG.info(\"Attempting rescue\", instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fd13838c_9c05f5f0","line":4250,"in_reply_to":"f1c711c4_475009c0","updated":"2023-07-20 17:52:50.000000000","message":"Done","commit_id":"2660f80d0ecbb5cfb200be85ececc9b1ebb615e9"}],"releasenotes/notes/rescue-stable-with-deleted-base-image-5143f1c1c914b8fe.yaml":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"97d4fe07fa6f1efe471cf59146f25acc15730ee6","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Rescue in stable device mode had dependency of base image used to create"},{"line_number":5,"context_line":"    or rebuild server. Server cannot be rescued in stable device mode if base"},{"line_number":6,"context_line":"    image was deleted from glance. Fix solves it by using instance.image_meta"},{"line_number":7,"context_line":"    when glance api fails."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"d3f432b3_6c316d2f","line":7,"updated":"2023-07-20 01:26:25.000000000","message":"We can tidy up the grammar on this note a bit for publishing to end users, for example something like:\n\n```\n`Bug #2002606`_: Previously, server rescue in stable device mode had a\ndependency on the original image used to create or rebuild the server.\nIf the original image was deleted from Glance, the server could not be\nrescued. The issue has been fixed by falling back to the instance image\nmetadata if the original image is not found in Glance.\n\n.. _Bug #2002606: https://bugs.launchpad.net/nova/+bug/2002606\n```\n\n(using https://docs.openstack.org/releasenotes/nova/unreleased.html#bug-fixes as an example)","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"},{"author":{"_account_id":34609,"name":"Maxim Monin","email":"maximmonin@gmail.com","username":"maximmonin"},"change_message_id":"a1fb2e1e489aa04a758ad45a73d551a491eb7553","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Rescue in stable device mode had dependency of base image used to create"},{"line_number":5,"context_line":"    or rebuild server. Server cannot be rescued in stable device mode if base"},{"line_number":6,"context_line":"    image was deleted from glance. Fix solves it by using instance.image_meta"},{"line_number":7,"context_line":"    when glance api fails."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"c98816bd_191cd509","line":7,"in_reply_to":"d3f432b3_6c316d2f","updated":"2023-07-20 16:19:32.000000000","message":"Done","commit_id":"ff818efa4e33f4218e343645beecd8c6693d7e00"}]}
