)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3991ab4abb0fc4e10eec797784eb057a019cd300","unresolved":true,"context_lines":[{"line_number":9,"context_line":"This makes \u0027nova-manage limits migrate_to_unified_limits\u0027 scan the API"},{"line_number":10,"context_line":"database for flavors and detect if any resource classes are missing"},{"line_number":11,"context_line":"registered limits in Keystone."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/c/openstack/devstack/+/924453"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I431176fd4d09201c551d8f82c71515cd4616cfea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3c4f9c5f_544cd618","line":12,"updated":"2024-11-04 19:17:00.000000000","message":"Related to blueprint unified-limits-nova-unset-limits","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This makes \u0027nova-manage limits migrate_to_unified_limits\u0027 scan the API"},{"line_number":10,"context_line":"database for flavors and detect if any resource classes are missing"},{"line_number":11,"context_line":"registered limits in Keystone."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/c/openstack/devstack/+/924453"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I431176fd4d09201c551d8f82c71515cd4616cfea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"6cd8ca62_0f04a6a3","line":12,"in_reply_to":"3c4f9c5f_544cd618","updated":"2024-11-11 18:55:11.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f51e0ffcae1b85c666c6a151068bbe81e727ed17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"333e9bf4_fc07f1eb","updated":"2024-08-21 00:58:35.000000000","message":"recheck [instance: ee1de9b7-218c-4297-8d26-7cf2703748df] Timeout waiting for [\u0027network-vif-plugged-01507419-f6d9-41e9-8330-0cc28117add3\u0027] for instance with vm_state active and task_state rebuild_spawning. Event states are: network-vif-plugged-01507419-f6d9-41e9-8330-0cc28117add3: timed out after 300.00 seconds: eventlet.timeout.Timeout: 300 seconds","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"19ab4ae492ba4d2bf7889629aaef91b545d5bca0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"04ad20da_414651d9","updated":"2024-07-19 01:59:05.000000000","message":"recheck dep updated","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"92323bad7d8cb9450821eb14b2b08f22e6bc535b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"09e08903_506825d1","updated":"2024-07-22 22:43:59.000000000","message":"recheck dep updated","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a4b53b6370dfde540695d6b43b2f8a9d44160","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"183289d2_6772da42","updated":"2024-07-19 05:59:34.000000000","message":"recheck dep updated","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"355df02e33daa7356091a6caf7b59db48fb44b6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8ce5416b_586b4601","updated":"2024-07-20 06:40:05.000000000","message":"recheck dep updated","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a6b0a5e98c13f08934cf9444862e1a8b37a4d865","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9e3fa23c_aedde138","updated":"2024-07-23 02:38:10.000000000","message":"recheck dep updated","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"e5304e04c2ffb95a10eb7e976eacacd47a7dc47c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f3543785_01ae9e6c","updated":"2024-08-15 15:08:12.000000000","message":"recheck guest [   92.419582] BUG: kernel NULL pointer dereference, address: 0000000000000000","commit_id":"ade985c3c3a7a0a89b6d465ceab292fe3e77e59d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"094ab8b1de7e80c177ed064f9340a4c3ada923b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"59e94a40_70f740dc","updated":"2024-08-22 23:16:34.000000000","message":"recheck dep updated","commit_id":"a3a10ee2f90e7c8e11ec45b111b0584ab711b702"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"4b0c35497a24b03655be36f4af6e4258dcbdcf7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c746c111_eff6ad75","updated":"2024-08-23 01:35:03.000000000","message":"recheck dep updated","commit_id":"a3a10ee2f90e7c8e11ec45b111b0584ab711b702"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3bfad4cd4faf4abd19616bf47f0ef5612d03a06c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ca878df8_578cd108","updated":"2024-08-27 03:29:10.000000000","message":"recheck ssh [paramiko.transport] Authentication (publickey) failed.","commit_id":"a3a10ee2f90e7c8e11ec45b111b0584ab711b702"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"dd1c891ef8c5c3352002fde8af9ca9852f8b3499","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d8598b37_d91ab287","updated":"2024-08-26 16:10:17.000000000","message":"recheck ssh [paramiko.transport] Authentication (publickey) failed.","commit_id":"a3a10ee2f90e7c8e11ec45b111b0584ab711b702"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b39078f53e0687b1eedd82f041d8d4570fb017da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"917c85f4_5a58bb7d","updated":"2024-08-26 20:28:50.000000000","message":"recheck ssh timeout while spawning during unshelve","commit_id":"a3a10ee2f90e7c8e11ec45b111b0584ab711b702"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"948f7f12749f90c61c50364ffafffdebc60408ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"bfd711e5_9ce0a8ef","updated":"2024-11-08 20:24:35.000000000","message":"I\u0027ll also unstack this from the config option patch. They don\u0027t depend on each other and I think I stacked them for convenience.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"d65c46a3_4fc6204f","updated":"2024-11-11 14:47:22.000000000","message":"Thanks, looks better. -1 at least for the errant commented-out code, and some other comments.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"82cc28561c8795077f8782bedfbcb9b88bf1a054","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"e6c0cc9d_3db3da85","updated":"2024-11-10 02:07:43.000000000","message":"recheck tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps. test_cross_tenant_traffic looks like sshd wasn\u0027t up yet -- tempest.lib.exceptions.SSHTimeout: Connection to the 172.24.5.67 via SSH timed out.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"015d27511b4ff73e085cbf07f1a625b83a11da48","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a382b2bf_44f25acd","updated":"2024-11-12 08:20:24.000000000","message":"There seems to be something weird happening with POST_FAILURE -- I see a lot in currently running jobs too. No build results either. So I\u0027m going to hold off on rechecking this until currently running jobs look more normal.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abc9e3fc1b71aa1690782362afe85c0574dd808","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"c51642d7_072f6f53","updated":"2024-11-18 15:42:17.000000000","message":"I\u0027m not loving how long and complex the scan function is and I could continue nitting out on it but it\u0027s probably best we just get it done :)","commit_id":"8cddf5bc384dda9a9faa6f4f94683a56f6144c3f"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a49ca2e220d5770c40f257bb16a1653268e3b0cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"e55c9848_2dc66f22","updated":"2024-11-18 17:12:09.000000000","message":"Making the code look better and add special cases for resource requests","commit_id":"8cddf5bc384dda9a9faa6f4f94683a56f6144c3f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad77910f6927b2903a30b53c354247e28b4e257a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"bc95d00a_7d1ec5bb","updated":"2024-11-20 15:34:18.000000000","message":"This looks okay to me now, but it looks like maybe each run is now ending up with two scans and two copies of the table (and success message) being printed. Is that right or am I reading the nova-next log wrong?","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"ffc44713_a36cf21c","updated":"2024-11-20 11:27:50.000000000","message":"im not sure if we want a release note for this or not but thats the other thing is was contemplating while reviewing.\n\noverall i think this is good enough to move forward with.\nwe can continue to extend support for the special cases in followup patches so +2","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6bd65b9bab26fa4c6a57314e998c4d937a569358","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"6202f858_17098941","in_reply_to":"bc95d00a_7d1ec5bb","updated":"2024-11-20 16:24:37.000000000","message":"We chatted about this on IRC and I\u0027ll make some adjustment to the post test hook to make the output easier to read.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6bd65b9bab26fa4c6a57314e998c4d937a569358","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"4d42372c_16fe9385","in_reply_to":"ffc44713_a36cf21c","updated":"2024-11-20 16:24:37.000000000","message":"I\u0027ll add a release note also.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ef3dfb441abbd85bd923cfd9aa19a453f00ae53","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"f1caacca_98c77307","updated":"2024-11-21 15:10:09.000000000","message":"Small fix to the post script, otherwise unchanged from when it was +W before. Ninjaing.","commit_id":"294e21c803ca62b3649de2fc25d457431bb94d5c"}],"gate/post_test_hook.sh":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"117575dfe4bacad33706c31b1706073d8c178d3d","unresolved":true,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"# Delete the servers."},{"line_number":275,"context_line":"openstack server delete metadata-items-test1 metadata-items-test2"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"# Test \u0027nova-manage limits migrate_to_unified_limits\u0027 by creating a test region"},{"line_number":279,"context_line":"# with no registered limits in it, run the nova-manage command, and verify the"}],"source_content_type":"text/x-sh","patch_set":6,"id":"882ff37d_942df471","line":276,"updated":"2024-11-07 18:03:51.000000000","message":"Note for reviewers: this post_test_hook.sh script is run as part of the nova-next job and the output can be seen there.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad77910f6927b2903a30b53c354247e28b4e257a","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"# Delete the servers."},{"line_number":275,"context_line":"openstack server delete metadata-items-test1 metadata-items-test2"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"# Test \u0027nova-manage limits migrate_to_unified_limits\u0027 by creating a test region"},{"line_number":279,"context_line":"# with no registered limits in it, run the nova-manage command, and verify the"}],"source_content_type":"text/x-sh","patch_set":6,"id":"f965221d_076810e8","line":276,"in_reply_to":"72c5ffc9_4ac01f55","updated":"2024-11-20 15:34:18.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"761d20023a6c1dc9ed8095c66f2dfe42a9761b88","unresolved":true,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"# Delete the servers."},{"line_number":275,"context_line":"openstack server delete metadata-items-test1 metadata-items-test2"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"# Test \u0027nova-manage limits migrate_to_unified_limits\u0027 by creating a test region"},{"line_number":279,"context_line":"# with no registered limits in it, run the nova-manage command, and verify the"}],"source_content_type":"text/x-sh","patch_set":6,"id":"72c5ffc9_4ac01f55","line":276,"in_reply_to":"882ff37d_942df471","updated":"2024-11-08 15:00:20.000000000","message":"Can confirm.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"}],"nova/cmd/manage.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"761d20023a6c1dc9ed8095c66f2dfe42a9761b88","unresolved":true,"context_lines":[{"line_number":3590,"context_line":"        msg \u003d _(\u0027Scanning non-deleted instances embedded flavors for resource \u0027"},{"line_number":3591,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3592,"context_line":"        output(msg)"},{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"}],"source_content_type":"text/x-python","patch_set":6,"id":"61a633ad_019df0d1","line":3593,"updated":"2024-11-08 15:00:20.000000000","message":"Maybe we should report if `_down_cells` is non-empty so they know that the result is not a complete picture?","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"        msg \u003d _(\u0027Scanning non-deleted instances embedded flavors for resource \u0027"},{"line_number":3591,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3592,"context_line":"        output(msg)"},{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"}],"source_content_type":"text/x-python","patch_set":6,"id":"30fe1218_7d86c814","line":3593,"in_reply_to":"30c730fb_b0a2b5a4","updated":"2024-11-11 20:01:52.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"948f7f12749f90c61c50364ffafffdebc60408ec","unresolved":true,"context_lines":[{"line_number":3590,"context_line":"        msg \u003d _(\u0027Scanning non-deleted instances embedded flavors for resource \u0027"},{"line_number":3591,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3592,"context_line":"        output(msg)"},{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"}],"source_content_type":"text/x-python","patch_set":6,"id":"30c730fb_b0a2b5a4","line":3593,"in_reply_to":"61a633ad_019df0d1","updated":"2024-11-08 20:24:35.000000000","message":"Yeah, I think that would be helpful info. I had mostly overlooked the down cell scenario. I\u0027ll add something.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"761d20023a6c1dc9ed8095c66f2dfe42a9761b88","unresolved":true,"context_lines":[{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"},{"line_number":3597,"context_line":""},{"line_number":3598,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3599,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":6,"id":"4708725f_69a2fe77","line":3596,"updated":"2024-11-08 15:00:20.000000000","message":"I\u0027m wondering if we need to be a little more judicious here. In a very large cloud, you\u0027re asking to load every flavor, instance, and embedded flavor into memory all at once, most of which from a single query.\n\nWe have the pagination stuff available to us here, and we also could process each cell sequentially. Seems like it might be a good idea to break this up a bit? Batches of 500-1000 or something? The memory and load on the DB server should also be a consideration, in addition to the manage code running here, I think.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":false,"context_lines":[{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"},{"line_number":3597,"context_line":""},{"line_number":3598,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3599,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":6,"id":"03cdfeaf_52153270","line":3596,"in_reply_to":"0e37b40f_3f06436c","updated":"2024-11-11 20:01:52.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"948f7f12749f90c61c50364ffafffdebc60408ec","unresolved":true,"context_lines":[{"line_number":3593,"context_line":"        instances, _down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3594,"context_line":"            ctxt, {\u0027deleted\u0027: False}, None, None, [\u0027flavor\u0027], None, None)"},{"line_number":3595,"context_line":"        for instance in instances:"},{"line_number":3596,"context_line":"            add_flavor_resources(instance.flavor)"},{"line_number":3597,"context_line":""},{"line_number":3598,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3599,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":6,"id":"0e37b40f_3f06436c","line":3596,"in_reply_to":"4708725f_69a2fe77","updated":"2024-11-08 20:24:35.000000000","message":"Ah, OK. I thought the multi_cell_list automatically paginated for some reason. I agree this shouldn\u0027t be done in too large a query. I\u0027ll change this.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"761d20023a6c1dc9ed8095c66f2dfe42a9761b88","unresolved":true,"context_lines":[{"line_number":3616,"context_line":"                \u0027registered (default) limits in Keystone.\\n\\n\u0027"},{"line_number":3617,"context_line":"                \u0027Create registered limits for these resources\\n\u0027"},{"line_number":3618,"context_line":"                \u0027before proceeding!\u0027)"},{"line_number":3619,"context_line":"            t.add_row([msg])"},{"line_number":3620,"context_line":"            print(t)"},{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"    @action_description("}],"source_content_type":"text/x-python","patch_set":6,"id":"8cbc9e1b_37db43fb","line":3619,"updated":"2024-11-08 15:00:20.000000000","message":"Seems weird to put this into a table row.. shouldn\u0027t this just be barf\u0027d out before the table?\n\nAlso, can we output something in the case of \"everything is good\"? You have some status messages above, and an error, but no \"success, you\u0027re done\" type thing.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":false,"context_lines":[{"line_number":3616,"context_line":"                \u0027registered (default) limits in Keystone.\\n\\n\u0027"},{"line_number":3617,"context_line":"                \u0027Create registered limits for these resources\\n\u0027"},{"line_number":3618,"context_line":"                \u0027before proceeding!\u0027)"},{"line_number":3619,"context_line":"            t.add_row([msg])"},{"line_number":3620,"context_line":"            print(t)"},{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"    @action_description("}],"source_content_type":"text/x-python","patch_set":6,"id":"c5292d53_44ff62ea","line":3619,"in_reply_to":"35f215dd_020c730e","updated":"2024-11-11 20:01:52.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"948f7f12749f90c61c50364ffafffdebc60408ec","unresolved":true,"context_lines":[{"line_number":3616,"context_line":"                \u0027registered (default) limits in Keystone.\\n\\n\u0027"},{"line_number":3617,"context_line":"                \u0027Create registered limits for these resources\\n\u0027"},{"line_number":3618,"context_line":"                \u0027before proceeding!\u0027)"},{"line_number":3619,"context_line":"            t.add_row([msg])"},{"line_number":3620,"context_line":"            print(t)"},{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"    @action_description("}],"source_content_type":"text/x-python","patch_set":6,"id":"35f215dd_020c730e","line":3619,"in_reply_to":"8cbc9e1b_37db43fb","updated":"2024-11-08 20:24:35.000000000","message":"I went back and forth about it. It can be before the table. I think what I was vaguely concerned about is if the table draws all the attention and someone misses out on the IMPORTANT message, so I put the message together with the resource list. I\u0027ll move it.\n\nAnd yeah I think a success message is a good idea. I\u0027ll add one.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":true,"context_lines":[{"line_number":3598,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3599,"context_line":"        while True:"},{"line_number":3600,"context_line":"            # get_instance_objects_sorted(ctx, filters, limit, marker,"},{"line_number":3601,"context_line":"            #    expected_attrs, sort_keys, sort_dirs, cell_down_support\u003dFalse)"},{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"79c74f53_a43533a8","line":3601,"updated":"2024-11-11 14:47:22.000000000","message":"Assume you meant to remove this?","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":true,"context_lines":[{"line_number":3598,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3599,"context_line":"        while True:"},{"line_number":3600,"context_line":"            # get_instance_objects_sorted(ctx, filters, limit, marker,"},{"line_number":3601,"context_line":"            #    expected_attrs, sort_keys, sort_dirs, cell_down_support\u003dFalse)"},{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"b9ad12b3_68ca7b63","line":3601,"in_reply_to":"55c4b00b_efd42c6d","updated":"2024-11-11 20:01:52.000000000","message":"Hmm, it\u0027s confusing to me to see commented-out code when there\u0027s no syntax highlighting to make it clear it\u0027s a comment. I don\u0027t really think we do much of this signature commenting elsewhere, and in an IDE, the signature pops up with a mouse hover. Could you just pass everything by kwarg to make it clearer?","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":true,"context_lines":[{"line_number":3598,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3599,"context_line":"        while True:"},{"line_number":3600,"context_line":"            # get_instance_objects_sorted(ctx, filters, limit, marker,"},{"line_number":3601,"context_line":"            #    expected_attrs, sort_keys, sort_dirs, cell_down_support\u003dFalse)"},{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"55c4b00b_efd42c6d","line":3601,"in_reply_to":"79c74f53_a43533a8","updated":"2024-11-11 18:55:11.000000000","message":"No but because I didn\u0027t add more words it keeps looking like that 😆 I meant to just show the signature of the method to avoid wondering why or what None, None is and keep looking it up the next time I forget.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"015d27511b4ff73e085cbf07f1a625b83a11da48","unresolved":false,"context_lines":[{"line_number":3598,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3599,"context_line":"        while True:"},{"line_number":3600,"context_line":"            # get_instance_objects_sorted(ctx, filters, limit, marker,"},{"line_number":3601,"context_line":"            #    expected_attrs, sort_keys, sort_dirs, cell_down_support\u003dFalse)"},{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3cb87287_483aa6a0","line":3601,"in_reply_to":"b9ad12b3_68ca7b63","updated":"2024-11-12 08:20:24.000000000","message":"Done","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":true,"context_lines":[{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"},{"line_number":3605,"context_line":"                down_cell_uuids.add(cell_uuid)"},{"line_number":3606,"context_line":"            for instance in instances:"},{"line_number":3607,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3608,"context_line":"            if not instances:"}],"source_content_type":"text/x-python","patch_set":8,"id":"2767e63a_4f66ff8d","line":3605,"updated":"2024-11-11 14:47:22.000000000","message":"Nit, this can be shorter:\n```\ndown_cell_uuids |\u003d set(down_cells)\n```","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"015d27511b4ff73e085cbf07f1a625b83a11da48","unresolved":false,"context_lines":[{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"},{"line_number":3605,"context_line":"                down_cell_uuids.add(cell_uuid)"},{"line_number":3606,"context_line":"            for instance in instances:"},{"line_number":3607,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3608,"context_line":"            if not instances:"}],"source_content_type":"text/x-python","patch_set":8,"id":"91e6d413_53993ee7","line":3605,"in_reply_to":"013a009a_b213d5d3","updated":"2024-11-12 08:20:24.000000000","message":"Done","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":true,"context_lines":[{"line_number":3602,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3603,"context_line":"                ctxt, {\u0027deleted\u0027: False}, 500, marker, [\u0027flavor\u0027], None, None)"},{"line_number":3604,"context_line":"            for cell_uuid in down_cells:"},{"line_number":3605,"context_line":"                down_cell_uuids.add(cell_uuid)"},{"line_number":3606,"context_line":"            for instance in instances:"},{"line_number":3607,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3608,"context_line":"            if not instances:"}],"source_content_type":"text/x-python","patch_set":8,"id":"013a009a_b213d5d3","line":3605,"in_reply_to":"2767e63a_4f66ff8d","updated":"2024-11-11 18:55:11.000000000","message":"Ah, nice. I\u0027ll use it.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"82cc28561c8795077f8782bedfbcb9b88bf1a054","unresolved":true,"context_lines":[{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"        msg \u003d _("},{"line_number":3623,"context_line":"            \u0027The following resource classes were found during the scan:\\n\u0027)"},{"line_number":3624,"context_line":"        print(msg)"},{"line_number":3625,"context_line":""},{"line_number":3626,"context_line":"        if down_cell_uuids:"},{"line_number":3627,"context_line":"            # f-strings don\u0027t seem to work with the _() translation function."}],"source_content_type":"text/x-python","patch_set":8,"id":"8ca4e0c2_1d8a705c","line":3624,"updated":"2024-11-10 02:07:43.000000000","message":"Note: I didn\u0027t make this and the messages after it conditional on `--verbose`. Should they be? I was thinking no because if the point is to warn or inform, making it only show up when `--verbose` seemed like defeating the purpose?","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":true,"context_lines":[{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"        msg \u003d _("},{"line_number":3623,"context_line":"            \u0027The following resource classes were found during the scan:\\n\u0027)"},{"line_number":3624,"context_line":"        print(msg)"},{"line_number":3625,"context_line":""},{"line_number":3626,"context_line":"        if down_cell_uuids:"},{"line_number":3627,"context_line":"            # f-strings don\u0027t seem to work with the _() translation function."}],"source_content_type":"text/x-python","patch_set":8,"id":"f6c1a398_d67c1bce","line":3624,"in_reply_to":"2e8606ac_59d428eb","updated":"2024-11-11 20:01:52.000000000","message":"Yep, hence me saying I think you\u0027re doing the right thing already :)","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":true,"context_lines":[{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"        msg \u003d _("},{"line_number":3623,"context_line":"            \u0027The following resource classes were found during the scan:\\n\u0027)"},{"line_number":3624,"context_line":"        print(msg)"},{"line_number":3625,"context_line":""},{"line_number":3626,"context_line":"        if down_cell_uuids:"},{"line_number":3627,"context_line":"            # f-strings don\u0027t seem to work with the _() translation function."}],"source_content_type":"text/x-python","patch_set":8,"id":"b2eca7d8_8516fc80","line":3624,"in_reply_to":"8ca4e0c2_1d8a705c","updated":"2024-11-11 14:47:22.000000000","message":"Well, unless the caller is a script and cares only about the return value. But I tend to agree, always printing makes sense.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":true,"context_lines":[{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"        msg \u003d _("},{"line_number":3623,"context_line":"            \u0027The following resource classes were found during the scan:\\n\u0027)"},{"line_number":3624,"context_line":"        print(msg)"},{"line_number":3625,"context_line":""},{"line_number":3626,"context_line":"        if down_cell_uuids:"},{"line_number":3627,"context_line":"            # f-strings don\u0027t seem to work with the _() translation function."}],"source_content_type":"text/x-python","patch_set":8,"id":"2e8606ac_59d428eb","line":3624,"in_reply_to":"b2eca7d8_8516fc80","updated":"2024-11-11 18:55:11.000000000","message":"Yeah.. I think the snag is that --verbose is not the default. What I could do is add a --quiet option in case someone wants to explicitly suppress it for a script. And make the return value non-zero if any registered limits are missing.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abc9e3fc1b71aa1690782362afe85c0574dd808","unresolved":false,"context_lines":[{"line_number":3621,"context_line":""},{"line_number":3622,"context_line":"        msg \u003d _("},{"line_number":3623,"context_line":"            \u0027The following resource classes were found during the scan:\\n\u0027)"},{"line_number":3624,"context_line":"        print(msg)"},{"line_number":3625,"context_line":""},{"line_number":3626,"context_line":"        if down_cell_uuids:"},{"line_number":3627,"context_line":"            # f-strings don\u0027t seem to work with the _() translation function."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5158f_ad6d81ea","line":3624,"in_reply_to":"f6c1a398_d67c1bce","updated":"2024-11-18 15:42:17.000000000","message":"Done","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":true,"context_lines":[{"line_number":3637,"context_line":"        found_missing \u003d False"},{"line_number":3638,"context_line":"        for resource in flavor_resources:"},{"line_number":3639,"context_line":"            if resource in existing_limits:"},{"line_number":3640,"context_line":"                table.add_row([resource, existing_limits[resource]])"},{"line_number":3641,"context_line":"            else:"},{"line_number":3642,"context_line":"                found_missing \u003d True"},{"line_number":3643,"context_line":"                table.add_row([resource, \u0027missing\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"a9cda82a_b6470c5a","line":3640,"updated":"2024-11-11 14:47:22.000000000","message":"Hmm, this is a change from what you had before. When I suggested doing `LIMIT:missing` I wasn\u0027t really thinking we would move to show all of them just so we could have some non-missing. It was more just to get the attention of the caller and \"justify\" the use of a table for it. Seems like if most are present and only one or two are missing it might be easy to miss (although I see you print a warning if any are missing). Maybe make `--verbose` control whether or not we show only missing or all here?","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":true,"context_lines":[{"line_number":3637,"context_line":"        found_missing \u003d False"},{"line_number":3638,"context_line":"        for resource in flavor_resources:"},{"line_number":3639,"context_line":"            if resource in existing_limits:"},{"line_number":3640,"context_line":"                table.add_row([resource, existing_limits[resource]])"},{"line_number":3641,"context_line":"            else:"},{"line_number":3642,"context_line":"                found_missing \u003d True"},{"line_number":3643,"context_line":"                table.add_row([resource, \u0027missing\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"af591b0f_ed6e6ee3","line":3640,"in_reply_to":"a9cda82a_b6470c5a","updated":"2024-11-11 18:55:11.000000000","message":"Yeah, I didn\u0027t originally intend to but then I thought, if we have more information the caller might like to see maybe go ahead and show it. Like, \"if you know what the limits are then why are you hiding it from me?\".\n\nBut I agree if only one is missing out of say 10, it can get hidden. I think controlling it with `--verbose` sounds like a good compromise to let people see all the limits if they want.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"26e647fe5869bff26e9c806db2b61a67fb8ed7b6","unresolved":false,"context_lines":[{"line_number":3637,"context_line":"        found_missing \u003d False"},{"line_number":3638,"context_line":"        for resource in flavor_resources:"},{"line_number":3639,"context_line":"            if resource in existing_limits:"},{"line_number":3640,"context_line":"                table.add_row([resource, existing_limits[resource]])"},{"line_number":3641,"context_line":"            else:"},{"line_number":3642,"context_line":"                found_missing \u003d True"},{"line_number":3643,"context_line":"                table.add_row([resource, \u0027missing\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"17890739_5421840d","line":3640,"in_reply_to":"af591b0f_ed6e6ee3","updated":"2024-11-11 20:01:52.000000000","message":"Acknowledged","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ca2ec5a0ac1ac84ac7802ecc6ada6cb3f14fa271","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"3d595a7b_92a35d11","line":3556,"updated":"2024-11-12 14:06:07.000000000","message":"so i was expectign this to be a seperate commadn not part of the exsting migration command\n\ni.e. `nova-mange limits flavor_scan` or `nova-mange limits show_missing`\n\nis there a reason you put it as part of migrate_to_unified_limits?\n\nit does work\n```\n(venv) ubuntu@sean-devstack-watcher-1:~/repos/nova$ nova-manage limits migrate_to_unified_limits --dry-run\n3 RLock(s) were not greened, to fix this error make sure you run eventlet.monkey_patch() before importing any other modules.\nINFO dbcounter [None req-b7d2e8ad-ba9c-468e-8848-78d6615cf6a6 None None] Registered counter for database nova_api\nDEBUG dbcounter [-] [1340546] Writer thread running {{(pid\u003d1340546) stat_writer /opt/stack/data/venv/lib/python3.12/site-packages/dbcounter.py:102}}\nINFO dbcounter [None req-b7d2e8ad-ba9c-468e-8848-78d6615cf6a6 None None] Registered counter for database nova_cell0\nDEBUG dbcounter [-] [1340546] Writer thread running {{(pid\u003d1340546) stat_writer /opt/stack/data/venv/lib/python3.12/site-packages/dbcounter.py:102}}\nINFO dbcounter [None req-b7d2e8ad-ba9c-468e-8848-78d6615cf6a6 None None] Registered counter for database nova_cell1\nDEBUG dbcounter [-] [1340546] Writer thread running {{(pid\u003d1340546) stat_writer /opt/stack/data/venv/lib/python3.12/site-packages/dbcounter.py:102}}\nThe following resource classes were found during the scan:\n\n+---------------+------------------+\n| Resource      | Registered Limit |\n+---------------+------------------+\n| class:DISK_GB | missing          |\n+---------------+------------------+\n\nWARNING: It is strongly recommended to create registered limits for resource\nclasses missing limits in Keystone before proceeding.\n```\nbut the UX feels odd. \nin this case i have not migrated any limits yet.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9bc668b686467cb92fccfa79a6770dd3d1ea848c","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"337358b6_8c613280","line":3556,"in_reply_to":"2ed194f3_691673ac","updated":"2024-11-12 15:43:33.000000000","message":"to be fair you can just do `nova-manage limits migrate_to_unified_limits --dry-run`\n\nso you can more or less achive the same workflow in this form\n\ni just got confused when i started tryign to use this because i was expecting a new command.\n\nso if we call this out appropartly in the help text im ok with the current flow.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c33c83c8f6dc25329b91b0f0b8363fd3ed340c","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"8e05b0c7_feee5473","line":3556,"in_reply_to":"337358b6_8c613280","updated":"2024-11-12 22:32:04.000000000","message":"\u003e so i was expectign this to be a seperate commadn not part of the exsting migration command\n\u003e i.e. nova-mange limits flavor_scan or nova-mange limits show_missing\n\u003e is there a reason you put it as part of migrate_to_unified_limits?\n\nFrom my perspective, I always intended for the flavor scan to be part of the `migrate_to_unified_limits` command. Initially the command would basically forklift legacy quota limits into unified limits, but this did not account for other resources that did _not_ have legacy quotas, such as `DISK_GB` or `VGPU`. By itself, I felt like someone might run it and think \"OK, everything migrated, I\u0027m done!\" when they still needed to make a limit for `DISK_GB` at the very least.\n\nSo I thought, for a more helpful experience, the command could first forklift the legacy limits and then after that do a scan and say, \"by the way, we see you have resources in your flavors that do not have registered limits set\" and advise them to create limits.\n\n\u003e The migrate command requires that you\u0027ve created the limits so it can migrate the values into them right? So, we migrate whatever we can (which may be nothing) and then report on any that we can\u0027t migrate (which may be all of them).\n\nSmall clarification, the migrate command will create unified limits for \"legacy\" limits if needed -- the admin doesn\u0027t have to create those. The admin only has to take care of the \"new\" resource limits that have no legacy counterpart like `DISK_GB` and other classes they use.\n\nRegarding the heavy weight of the embedded flavor scan, I\u0027m thinking it\u0027s best if we also add an option like `--no-embedded-flavor-scan` or something to let people skip it if they want or need.\n\nFor `--dry-run` I included that because if I were admin of a deployment, I would personally want to be able to see what the command is planning to do before letting it mess with my Keystone limits.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4065695def746dbe398086c1311075123c6bc17","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"635e3ead_69bc1e9d","line":3556,"in_reply_to":"3d595a7b_92a35d11","updated":"2024-11-12 14:50:39.000000000","message":"I\u0027m not sure why we\u0027d need to make it two things. The migrate command requires that you\u0027ve created the limits so it can migrate the values into them right? So, we migrate whatever we can (which may be nothing) and then report on any that we can\u0027t migrate (which may be all of them). Seems like it\u0027s idempotent and simple enough the way we have it. Unless there\u0027s some reason when scanning without migrating it useful that I\u0027m not thinking of.\n\nThat said, writing the above did make me think: This is a pretty heavyweight thing to have to run, and I wonder if the deployment tools running it after any converge loop will be too heavy. In order to do this we need to literally load every instance from the database and list all the relevant limits from keystone right? Doing that in something like an operator every time anything changes might be kinda heavyweight. Not sure there\u0027s a real good alternative, but I thought I\u0027d point it out. It\u0027s a lot heavier than just running `db sync` each time, which loads a rev number and returns if it\u0027s current.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f9d0da5da935d52d63b9fb42b15f4228c234b3a0","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"8f6fda83_b4ecda72","line":3556,"in_reply_to":"635e3ead_69bc1e9d","updated":"2024-11-12 15:21:05.000000000","message":"form a downstream operator point of view, the intent was explictly not to run this from the operator. enabling unified limit will be manual procdure, done once by the human as part of moving from one driver to another.\n\nthe reason for scanning without migration is to verify if there are any resource classes that cant automatically be migrated\n\ni.e. if you are using custom resource classes or anything that did not previously map to a nova quota you may want to scan without running the migration code.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0c2fd987f96adc4a736506ae9061d19879a13b9a","unresolved":true,"context_lines":[{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"        return return_code"},{"line_number":3555,"context_line":""},{"line_number":3556,"context_line":"    def _scan_flavors(self, ctxt, keystone_api, service_id, region_id, output,"},{"line_number":3557,"context_line":"                      warn_output, verbose):"},{"line_number":3558,"context_line":"        # Scan existing flavors to check whether any requestable resources are"},{"line_number":3559,"context_line":"        # missing registered limits in Keystone."}],"source_content_type":"text/x-python","patch_set":10,"id":"2ed194f3_691673ac","line":3556,"in_reply_to":"8f6fda83_b4ecda72","updated":"2024-11-12 15:24:28.000000000","message":"\u003e form a downstream operator point of view, the intent was explictly not to run this from the operator. enabling unified limit will be manual procdure, done once by the human as part of moving from one driver to another.\n\nI know that\u0027s *our* plan, but I guess I\u0027m not sure that will apply to all deployment tooling, but fair point.\n\n\u003e the reason for scanning without migration is to verify if there are any resource classes that cant automatically be migrated\n\u003e \n\u003e i.e. if you are using custom resource classes or anything that did not previously map to a nova quota you may want to scan without running the migration code.\n\nIt\u0027s not that you don\u0027t want to run the migration in that case, it\u0027s just that you don\u0027t need to right? With as heavy as the scan is, I guess I\u0027m less concerned about it. And contrary to your assertion, I think this UX is *better* for the majority of people that just want to do it in a single shot.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ca2ec5a0ac1ac84ac7802ecc6ada6cb3f14fa271","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"59c52bd5_33ca2120","line":3572,"updated":"2024-11-12 14:06:07.000000000","message":"im not sure this is the correct approch.\n\nthe current approch does not account form resouce request form extra specs\nlike hw:mem_encryption or hw:cpu_policy\u003ddedicated.\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/utils.py#L320-L335\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/utils.py#L355-L419\n\ni would be inclined to create a fake request spec with image set to None\nfor each flavor and then call from_request_spec to create a ResourceRequest object\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/utils.py#L80\n\nthat willl allow you to reuese all the translators that convert flavour extra specs into resource requests.\n\nthe ResourceRequest has a _rg_by_id internal field which is a ty.Dict[str, objects.RequestGroup]\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/utils.py#L66C25-L66C59\n\nand a request group has a resources map\nhttps://github.com/openstack/nova/blob/master/nova/objects/request_spec.py#L1279\n\nso the resouce classes used is somethign like this\n\n\nrr \u003d ResourceRequest.from_request_spec(RequestSpec(flavor\u003dflavor))\nrcs \u003d {rc for rg in rr._rg_by_id for rc in rg.resouces.keys()}","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f9d0da5da935d52d63b9fb42b15f4228c234b3a0","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"90fe0cfa_ed2b637e","line":3572,"in_reply_to":"0f21606d_0a49fbe9","updated":"2024-11-12 15:21:05.000000000","message":"ya so i dont expect this operatio to be done often, it could be done on a copy of the db too rather then the live one.\n\nyes that technially menas we could miss something but in 99% of the case i think running this on a backup of the db would be ok.\n\ni was alos debating if this was too hevy wight but i think its the more future proof appoch.\n\ntoday only 2 extra spec chagne resouce usage (memory encyption and pinning) \nso we coudl special case those if needed instead.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c33c83c8f6dc25329b91b0f0b8363fd3ed340c","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"6caf26ce_e7cb8f07","line":3572,"in_reply_to":"54f2fd90_768639f5","updated":"2024-11-12 22:32:04.000000000","message":"Thanks for pointing out `hw:mem_encryption` and `hw:cpu_policy\u003ddedicated`. I was not aware that they translate to Placement resources.\n\nI\u0027m not sure regarding the complexity as ResourceRequest are not something I\u0027m familiar with currently but I will look at it vs just adding the two special cases.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4065695def746dbe398086c1311075123c6bc17","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"0f21606d_0a49fbe9","line":3572,"in_reply_to":"59c52bd5_33ca2120","updated":"2024-11-12 14:50:39.000000000","message":"\u003e rr \u003d ResourceRequest.from_request_spec(RequestSpec(flavor\u003dflavor))\n\nThis will make this substantially more heavyweight, FWIW. Not saying you\u0027re wrong, but.. eesh.\n\nI also kinda feel like even though this is better with the pagination melwitt added, there\u0027s still no way to do this other than to scan *every* instance in the database.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"217ea783f4812e81c8e7ed6a710ec8ac559d2409","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"d8b9732a_d76ad3d8","line":3572,"in_reply_to":"6caf26ce_e7cb8f07","updated":"2024-11-13 01:07:20.000000000","message":"so does the pci alias for what it\u0027s worth when using pci in placement\ni only thought about that now\n\ntechnial the cyborg device profile can too but i dont nessiarly think we ant to have to call cyborg ot translate that...\n\nat some point we have to draw a line and for me translating somethign defiend in a diffetn service is where that line makes sense to draw.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abc9e3fc1b71aa1690782362afe85c0574dd808","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9713a907_4cd10602","line":3572,"in_reply_to":"7bad97ff_6298abf7","updated":"2024-11-18 15:42:17.000000000","message":"I dunno about this, but.. it\u0027s unrelated to this patch so we should continue with it independent of a fix for the above right?","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4920e95022ab886339574583ab878924745a85c","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"54f2fd90_768639f5","line":3572,"in_reply_to":"90fe0cfa_ed2b637e","updated":"2024-11-12 15:47:23.000000000","message":"just notice the psudo code should be more like\n\nrcs \u003d {rc for rg in rr._rg_by_id.values() for rc in rg.resouces.keys()}\n\nalhtough in practice i woudl add a property or method on the ResourceRequest class if we went this route rather then actully computeing the classes refence in the ResourceRequest here.\n\nif we feel this is too complex just extend add_flavor_resources to handle the 2 special cases.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a49ca2e220d5770c40f257bb16a1653268e3b0cd","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"a80b9773_c3b6a0f5","line":3572,"in_reply_to":"9713a907_4cd10602","updated":"2024-11-18 17:12:09.000000000","message":"Yes, just wanted to mention it first in case anyone had other comments about it.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"79a591d3d40476c5e6569d434ac0a1da08121fc0","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7d3d5b18_fbc67d4e","line":3572,"in_reply_to":"a80b9773_c3b6a0f5","updated":"2024-11-18 20:29:35.000000000","message":"ya so the translation code is depending on the valdiation code i guess.\n\ni.e. tis true that to use hw:mem_encryption\u003dtrue you need hw_firmware_type\u003duefi in the image but that should be checked in the api not in the schduler utils code\n\nand yes that sound like an exsitng bug so i think its ok to fix that seperatly as dan noted","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b7a7ce16747dcd3d45a1a23e2ca1d74276f4076f","unresolved":true,"context_lines":[{"line_number":3569,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3570,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3571,"context_line":"                        flavor_resources.add("},{"line_number":3572,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"        for flavor in flavors:"},{"line_number":3575,"context_line":"            add_flavor_resources(flavor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7bad97ff_6298abf7","line":3572,"in_reply_to":"d8b9732a_d76ad3d8","updated":"2024-11-16 04:21:57.000000000","message":"Welp, while adding support for resource requests locally, I think I found a bug in the unified limits code 😣\n\nSo currently in nova/limit/placement.py, it\u0027s actually already using the existing translation code you told me about to pull resources it needs to check quota [1]:\n```\n    # NOTE(johngarbutt): this skips bfv, port, and cyborg resources\n    # but it still gives us better checks than before unified limits\n    # We need an instance in the DB to use the current is_bfv logic\n    # which doesn\u0027t work well for instances that don\u0027t yet have a uuid\n    deltas_from_flavor \u003d utils.resources_for_limits(flavor, is_bfv)\n```\n\nI simply used the same scheduler utils method in add_flavor_resources and found that at least one of the translations requires the image as well ... for example if you have extra spec `hw:mem_encryption\u003dtrue` you must also have property `hw_firmware_type\u003duefi` in the image, otherwise it blows up:\n\n\u003e nova.exception.FlavorImageConflict: Memory encryption requested by hw:mem_encryption extra spec in jsdzyjimkxcrcdwrgbux flavor but image None doesn\u0027t have \u0027hw_firmware_type\u0027 property set to \u0027uefi\u0027 or volume-backed instance was requested\n\nThat\u0027s ^ the error I got while adding coverage for `hw:mem_encryption` to my flavor scan functional test locally.\n\nWhich IIUC means that (unrelated to this patch) if someone has unified limits enabled and they go to create a server with flavor extra spec `hw:mem_encryption\u003dtrue`, it will fail with the same error during the quota check attempt.\n\nSo ... not sure what to do about this. We can easily special case in the nova-manage command like you mentioned (to not involve the image) but the quota check code bug will have to be fixed somehow also ☹️\n\n[1] https://github.com/openstack/nova/blob/1acaf899a6964484e5b5be4337618ebbe6ca8dbb/nova/limit/placement.py#L133","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67804923807fab4dee3ef4722a324a2cff5af3a4","unresolved":true,"context_lines":[{"line_number":3579,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3580,"context_line":"        output(msg)"},{"line_number":3581,"context_line":""},{"line_number":3582,"context_line":"        marker \u003d None"},{"line_number":3583,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3584,"context_line":"        while True:"},{"line_number":3585,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3586,"context_line":"                ctxt, filters\u003d{\u0027deleted\u0027: False}, limit\u003d500, marker\u003dmarker,"},{"line_number":3587,"context_line":"                expected_attrs\u003d[\u0027flavor\u0027], sort_keys\u003dNone, sort_dirs\u003dNone)"},{"line_number":3588,"context_line":"            down_cell_uuids |\u003d set(down_cells)"},{"line_number":3589,"context_line":"            for instance in instances:"},{"line_number":3590,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3591,"context_line":"            if not instances:"},{"line_number":3592,"context_line":"                break"},{"line_number":3593,"context_line":"            marker \u003d instances[-1].uuid"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3596,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":10,"id":"b4e91550_10074ffb","line":3593,"range":{"start_line":3582,"start_character":0,"end_line":3593,"end_character":39},"updated":"2024-11-12 15:53:56.000000000","message":"so thininkg about this given my other comment above\n\ndo we need to downcall too the cell dbs at all.\n\ni think we have all the info we need in the request spec in the api db.\nthat is what we use for schduling after all so could we just do this all form the api db by looping over all the request specs and doing the same think as the api flavor usign ResourceRequest to compute the resouce classes used?","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"af352d9fae89bed65d6b324defe8aaaceff70340","unresolved":true,"context_lines":[{"line_number":3579,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3580,"context_line":"        output(msg)"},{"line_number":3581,"context_line":""},{"line_number":3582,"context_line":"        marker \u003d None"},{"line_number":3583,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3584,"context_line":"        while True:"},{"line_number":3585,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3586,"context_line":"                ctxt, filters\u003d{\u0027deleted\u0027: False}, limit\u003d500, marker\u003dmarker,"},{"line_number":3587,"context_line":"                expected_attrs\u003d[\u0027flavor\u0027], sort_keys\u003dNone, sort_dirs\u003dNone)"},{"line_number":3588,"context_line":"            down_cell_uuids |\u003d set(down_cells)"},{"line_number":3589,"context_line":"            for instance in instances:"},{"line_number":3590,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3591,"context_line":"            if not instances:"},{"line_number":3592,"context_line":"                break"},{"line_number":3593,"context_line":"            marker \u003d instances[-1].uuid"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3596,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":10,"id":"a636d653_6057b3a0","line":3593,"range":{"start_line":3582,"start_character":0,"end_line":3593,"end_character":39},"in_reply_to":"9cb54c37_9d4e287f","updated":"2024-11-13 01:11:07.000000000","message":"we should have a fully copy of the flavor \nhttps://github.com/openstack/nova/blob/master/nova/objects/request_spec.py#L77\n\nand i belive unlike the server groups that is not dropped and reloaded when saving/loading form the db\n\nim pretty sure that a snaphsot of the flavour.\n\nthere si also \"requested resouces\" but based on gibis comment it proablynot complete enough for use to just use directly but worth checkign.\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/request_spec.py#L107-L115","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c33c83c8f6dc25329b91b0f0b8363fd3ed340c","unresolved":true,"context_lines":[{"line_number":3579,"context_line":"                \u0027classes ...\u0027)"},{"line_number":3580,"context_line":"        output(msg)"},{"line_number":3581,"context_line":""},{"line_number":3582,"context_line":"        marker \u003d None"},{"line_number":3583,"context_line":"        down_cell_uuids \u003d set()"},{"line_number":3584,"context_line":"        while True:"},{"line_number":3585,"context_line":"            instances, down_cells \u003d instance_list.get_instance_objects_sorted("},{"line_number":3586,"context_line":"                ctxt, filters\u003d{\u0027deleted\u0027: False}, limit\u003d500, marker\u003dmarker,"},{"line_number":3587,"context_line":"                expected_attrs\u003d[\u0027flavor\u0027], sort_keys\u003dNone, sort_dirs\u003dNone)"},{"line_number":3588,"context_line":"            down_cell_uuids |\u003d set(down_cells)"},{"line_number":3589,"context_line":"            for instance in instances:"},{"line_number":3590,"context_line":"                add_flavor_resources(instance.flavor)"},{"line_number":3591,"context_line":"            if not instances:"},{"line_number":3592,"context_line":"                break"},{"line_number":3593,"context_line":"            marker \u003d instances[-1].uuid"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"        # Retrieve the existing resource limits from Keystone (we may have"},{"line_number":3596,"context_line":"        # added new ones above)."}],"source_content_type":"text/x-python","patch_set":10,"id":"9cb54c37_9d4e287f","line":3593,"range":{"start_line":3582,"start_character":0,"end_line":3593,"end_character":39},"in_reply_to":"b4e91550_10074ffb","updated":"2024-11-12 22:32:04.000000000","message":"If the request specs contain all of the flavor extra_specs being allocated, then yes we could just use those instead of calling into the cell databases. It would be much better if we can do that (obviously 😛) -- I was just not aware we had all the extra_specs included in the request specs.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9bc668b686467cb92fccfa79a6770dd3d1ea848c","unresolved":true,"context_lines":[{"line_number":3636,"context_line":"            warn_output(msg)"},{"line_number":3637,"context_line":""},{"line_number":3638,"context_line":"    @action_description("},{"line_number":3639,"context_line":"        _(\"Copy quota limits from the Nova API database to Keystone.\"))"},{"line_number":3640,"context_line":"    @args(\u0027--project-id\u0027, metavar\u003d\u0027\u003cproject-id\u003e\u0027, dest\u003d\u0027project_id\u0027,"},{"line_number":3641,"context_line":"          help\u003d\u0027Project ID for which to migrate quota limits\u0027)"},{"line_number":3642,"context_line":"    @args(\u0027--region-id\u0027, metavar\u003d\u0027\u003cregion-id\u003e\u0027, dest\u003d\u0027region_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"e25b962a_8ad69f80","line":3639,"updated":"2024-11-12 15:43:33.000000000","message":"should we call out that we can scan for resource classes without limits using --dry-run?","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c33c83c8f6dc25329b91b0f0b8363fd3ed340c","unresolved":true,"context_lines":[{"line_number":3636,"context_line":"            warn_output(msg)"},{"line_number":3637,"context_line":""},{"line_number":3638,"context_line":"    @action_description("},{"line_number":3639,"context_line":"        _(\"Copy quota limits from the Nova API database to Keystone.\"))"},{"line_number":3640,"context_line":"    @args(\u0027--project-id\u0027, metavar\u003d\u0027\u003cproject-id\u003e\u0027, dest\u003d\u0027project_id\u0027,"},{"line_number":3641,"context_line":"          help\u003d\u0027Project ID for which to migrate quota limits\u0027)"},{"line_number":3642,"context_line":"    @args(\u0027--region-id\u0027, metavar\u003d\u0027\u003cregion-id\u003e\u0027, dest\u003d\u0027region_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa93209f_99a5c5e0","line":3639,"in_reply_to":"e25b962a_8ad69f80","updated":"2024-11-12 22:32:04.000000000","message":"Yeah probably best to mention it. I\u0027ll add to it here or in `--dry-run` like you said.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":3636,"context_line":"            warn_output(msg)"},{"line_number":3637,"context_line":""},{"line_number":3638,"context_line":"    @action_description("},{"line_number":3639,"context_line":"        _(\"Copy quota limits from the Nova API database to Keystone.\"))"},{"line_number":3640,"context_line":"    @args(\u0027--project-id\u0027, metavar\u003d\u0027\u003cproject-id\u003e\u0027, dest\u003d\u0027project_id\u0027,"},{"line_number":3641,"context_line":"          help\u003d\u0027Project ID for which to migrate quota limits\u0027)"},{"line_number":3642,"context_line":"    @args(\u0027--region-id\u0027, metavar\u003d\u0027\u003cregion-id\u003e\u0027, dest\u003d\u0027region_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"b021e965_5bedc733","line":3639,"in_reply_to":"fa93209f_99a5c5e0","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9bc668b686467cb92fccfa79a6770dd3d1ea848c","unresolved":true,"context_lines":[{"line_number":3645,"context_line":"          help\u003d\u0027Provide verbose output during execution.\u0027)"},{"line_number":3646,"context_line":"    @args(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027dry_run\u0027, default\u003dFalse,"},{"line_number":3647,"context_line":"          help\u003d\u0027Show what limits would be created without actually \u0027"},{"line_number":3648,"context_line":"               \u0027creating them.\u0027)"},{"line_number":3649,"context_line":"    @args(\u0027--quiet\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027quiet\u0027, default\u003dFalse,"},{"line_number":3650,"context_line":"          help\u003d\u0027Do not output anything during execution.\u0027)"},{"line_number":3651,"context_line":"    def migrate_to_unified_limits(self, project_id\u003dNone, region_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":10,"id":"229159f3_3630e8a1","line":3648,"updated":"2024-11-12 15:43:33.000000000","message":"or perhaps mention that here?","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":3645,"context_line":"          help\u003d\u0027Provide verbose output during execution.\u0027)"},{"line_number":3646,"context_line":"    @args(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027dry_run\u0027, default\u003dFalse,"},{"line_number":3647,"context_line":"          help\u003d\u0027Show what limits would be created without actually \u0027"},{"line_number":3648,"context_line":"               \u0027creating them.\u0027)"},{"line_number":3649,"context_line":"    @args(\u0027--quiet\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027quiet\u0027, default\u003dFalse,"},{"line_number":3650,"context_line":"          help\u003d\u0027Do not output anything during execution.\u0027)"},{"line_number":3651,"context_line":"    def migrate_to_unified_limits(self, project_id\u003dNone, region_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":10,"id":"75922d50_6397e3e3","line":3648,"in_reply_to":"229159f3_3630e8a1","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4065695def746dbe398086c1311075123c6bc17","unresolved":true,"context_lines":[{"line_number":3708,"context_line":""},{"line_number":3709,"context_line":"        try:"},{"line_number":3710,"context_line":"            result \u003d self._create_unified_limits("},{"line_number":3711,"context_line":"                ctxt, keystone_api, service_id, legacy_defaults, project_id,"},{"line_number":3712,"context_line":"                region_id, output, dry_run)"},{"line_number":3713,"context_line":"            self._scan_flavors("},{"line_number":3714,"context_line":"                ctxt, keystone_api, service_id, region_id, output, warn_output,"}],"source_content_type":"text/x-python","patch_set":10,"id":"2e0a4423_915f5521","line":3711,"range":{"start_line":3711,"start_character":65,"end_line":3711,"end_character":75},"updated":"2024-11-12 14:50:39.000000000","message":"The above made me realize you\u0027re not honoring this filter in the scan call below. Perhaps that was intentional since the scan is a consistency check, but that means even if I want to migrate one project at a time, I have to scan the *entire* database every time I do that. I think we probably need to do better on that.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c33c83c8f6dc25329b91b0f0b8363fd3ed340c","unresolved":true,"context_lines":[{"line_number":3708,"context_line":""},{"line_number":3709,"context_line":"        try:"},{"line_number":3710,"context_line":"            result \u003d self._create_unified_limits("},{"line_number":3711,"context_line":"                ctxt, keystone_api, service_id, legacy_defaults, project_id,"},{"line_number":3712,"context_line":"                region_id, output, dry_run)"},{"line_number":3713,"context_line":"            self._scan_flavors("},{"line_number":3714,"context_line":"                ctxt, keystone_api, service_id, region_id, output, warn_output,"}],"source_content_type":"text/x-python","patch_set":10,"id":"cea9c673_42c6ea8c","line":3711,"range":{"start_line":3711,"start_character":65,"end_line":3711,"end_character":75},"in_reply_to":"2e0a4423_915f5521","updated":"2024-11-12 22:32:04.000000000","message":"Oh, good point. It\u0027s an oversight. I think if someone is scoping to a project, the scan should also scope to the project. I\u0027ll fix it.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":3708,"context_line":""},{"line_number":3709,"context_line":"        try:"},{"line_number":3710,"context_line":"            result \u003d self._create_unified_limits("},{"line_number":3711,"context_line":"                ctxt, keystone_api, service_id, legacy_defaults, project_id,"},{"line_number":3712,"context_line":"                region_id, output, dry_run)"},{"line_number":3713,"context_line":"            self._scan_flavors("},{"line_number":3714,"context_line":"                ctxt, keystone_api, service_id, region_id, output, warn_output,"}],"source_content_type":"text/x-python","patch_set":10,"id":"128ddf36_6731126d","line":3711,"range":{"start_line":3711,"start_character":65,"end_line":3711,"end_character":75},"in_reply_to":"cea9c673_42c6ea8c","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abc9e3fc1b71aa1690782362afe85c0574dd808","unresolved":true,"context_lines":[{"line_number":3564,"context_line":""},{"line_number":3565,"context_line":"        def add_flavor_resources(flavor):"},{"line_number":3566,"context_line":"            if flavor.extra_specs:"},{"line_number":3567,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3568,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3569,"context_line":"                        flavor_resources.add("},{"line_number":3570,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"e9fef271_40f3f452","line":3567,"updated":"2024-11-18 15:42:17.000000000","message":"This is a nit, but this is pretty deeply nested here. I think `extra_specs` will always be a list so I\u0027m not sure you need the if. However, the following seems more pythonic if you do, which will cut out a level:\n```\nfor extra_spec in flavor.extra_specs or []:\n ...\n```\nBut you could also cut out even more nesting levels by doing this:\n```\nfor spec in [s for s in flavor.extra_specs\n             if s.startswith(\u0027resources:\u0027)]:\n```","commit_id":"8cddf5bc384dda9a9faa6f4f94683a56f6144c3f"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6bd65b9bab26fa4c6a57314e998c4d937a569358","unresolved":false,"context_lines":[{"line_number":3564,"context_line":""},{"line_number":3565,"context_line":"        def add_flavor_resources(flavor):"},{"line_number":3566,"context_line":"            if flavor.extra_specs:"},{"line_number":3567,"context_line":"                for extra_spec in flavor.extra_specs:"},{"line_number":3568,"context_line":"                    if extra_spec.startswith(\u0027resources:\u0027):"},{"line_number":3569,"context_line":"                        flavor_resources.add("},{"line_number":3570,"context_line":"                            \u0027class:\u0027 + extra_spec.lstrip(\u0027resources:\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"45ff83bf_374fa020","line":3567,"in_reply_to":"e9fef271_40f3f452","updated":"2024-11-20 16:24:37.000000000","message":"Done","commit_id":"8cddf5bc384dda9a9faa6f4f94683a56f6144c3f"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b8ffe826811dce65ec179f14e2b0458fed0f810a","unresolved":true,"context_lines":[{"line_number":3568,"context_line":"            # bugs like https://bugs.launchpad.net/nova/+bug/2088831"},{"line_number":3569,"context_line":"            msg \u003d _(\u0027An exception was raised: %s, skipping flavor %s\u0027"},{"line_number":3570,"context_line":"                   % (str(e), flavor.flavorid))"},{"line_number":3571,"context_line":"            warn_output(msg)"},{"line_number":3572,"context_line":"        return resources"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"    def _get_resources_from_api_flavors(self, ctxt, output, warn_output):"}],"source_content_type":"text/x-python","patch_set":15,"id":"64e9020d_e9c346f6","line":3571,"updated":"2024-11-19 20:27:44.000000000","message":"Note that I could have added a one-off here like `if hw:mem_encryption then add class:MEM_ENCRYPTION_CONTEXT` but I was thinking since `hw:mem_encryption` is currently broken with unified limits enabled anyway, maybe it\u0027s best to treat all exceptions the same and when https://bugs.launchpad.net/nova/+bug/2088831 is fixed this will also automatically be fixed. Not sure if everyone would agree?","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":true,"context_lines":[{"line_number":3568,"context_line":"            # bugs like https://bugs.launchpad.net/nova/+bug/2088831"},{"line_number":3569,"context_line":"            msg \u003d _(\u0027An exception was raised: %s, skipping flavor %s\u0027"},{"line_number":3570,"context_line":"                   % (str(e), flavor.flavorid))"},{"line_number":3571,"context_line":"            warn_output(msg)"},{"line_number":3572,"context_line":"        return resources"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"    def _get_resources_from_api_flavors(self, ctxt, output, warn_output):"}],"source_content_type":"text/x-python","patch_set":15,"id":"d72c6dac_b8752728","line":3571,"in_reply_to":"64e9020d_e9c346f6","updated":"2024-11-20 11:27:50.000000000","message":"wheater we do them all in one patch or incrementally, i think we can defer the excpetions to follow up patches.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"}],"nova/conf/keystone.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7e0cd93ab1240b8bb01aa52fe2e48cb3049a47bf","unresolved":true,"context_lines":[{"line_number":28,"context_line":"def register_opts(conf):"},{"line_number":29,"context_line":"    conf.register_group(keystone_group)"},{"line_number":30,"context_line":"    confutils.register_ksa_opts(conf, keystone_group.name,"},{"line_number":31,"context_line":"                                DEFAULT_SERVICE_TYPE, include_auth\u003dFalse)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":16,"id":"f1ecbff5_e0499cc5","line":31,"updated":"2024-11-20 19:23:06.000000000","message":"Note: this is basically reverting a change I made in the past solely for `migrate_to_unified_limits` from when I thought the only way to talk to Keystone was by the `[keystone]` config group [1].\n\nNow I know the change was unnecessary as we can reuse `[keystone_authtoken]` (and made the relevant code change in nova/cmd/manage.py in this patch), so this is putting this back the way it was.\n\n[1] https://github.com/openstack/nova/commit/395501c8766d3c1fefabd54ac9ebc363eabce3ea#diff-665df18d8d50374e52e04a36bd3ed8183b20b7c08a824be8a208ba26c121db13","commit_id":"df2e549654860d516b31fa95deaac7b65858fcb0"}],"nova/tests/functional/test_nova_manage.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"761d20023a6c1dc9ed8095c66f2dfe42a9761b88","unresolved":true,"context_lines":[{"line_number":2737,"context_line":"|                                              |"},{"line_number":2738,"context_line":"| Create registered limits for these resources |"},{"line_number":2739,"context_line":"| before proceeding!                           |"},{"line_number":2740,"context_line":"+----------------------------------------------+"},{"line_number":2741,"context_line":"\u0027\u0027\u0027"},{"line_number":2742,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2743,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3eec0131_0e702697","line":2740,"updated":"2024-11-08 15:00:20.000000000","message":"Maybe it\u0027s just me, but this just looks kinda weird to me, with a header row and a big multi-line static message row...","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a820d9a9f4a531b1f8e6ad91b0c87092209b979c","unresolved":true,"context_lines":[{"line_number":2737,"context_line":"|                                              |"},{"line_number":2738,"context_line":"| Create registered limits for these resources |"},{"line_number":2739,"context_line":"| before proceeding!                           |"},{"line_number":2740,"context_line":"+----------------------------------------------+"},{"line_number":2741,"context_line":"\u0027\u0027\u0027"},{"line_number":2742,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2743,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5d9ae7c1_1190240e","line":2740,"in_reply_to":"100fa7a1_dfb3dc3a","updated":"2024-11-08 21:20:01.000000000","message":"Oh yeah, I like that idea more.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"948f7f12749f90c61c50364ffafffdebc60408ec","unresolved":true,"context_lines":[{"line_number":2737,"context_line":"|                                              |"},{"line_number":2738,"context_line":"| Create registered limits for these resources |"},{"line_number":2739,"context_line":"| before proceeding!                           |"},{"line_number":2740,"context_line":"+----------------------------------------------+"},{"line_number":2741,"context_line":"\u0027\u0027\u0027"},{"line_number":2742,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2743,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"e0a14f2c_d90003e1","line":2740,"in_reply_to":"3eec0131_0e702697","updated":"2024-11-08 20:24:35.000000000","message":"Yeah, it is unusual. I was paranoid about people missing the message and only focusing on the list of resources. I\u0027ll move it though since this is a data point that maybe I was overthinking it.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":2737,"context_line":"|                                              |"},{"line_number":2738,"context_line":"| Create registered limits for these resources |"},{"line_number":2739,"context_line":"| before proceeding!                           |"},{"line_number":2740,"context_line":"+----------------------------------------------+"},{"line_number":2741,"context_line":"\u0027\u0027\u0027"},{"line_number":2742,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2743,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"818dcdae_ecea7000","line":2740,"in_reply_to":"5d9ae7c1_1190240e","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"08c39a46a637567c3423c7f00eee7b353a4458de","unresolved":true,"context_lines":[{"line_number":2737,"context_line":"|                                              |"},{"line_number":2738,"context_line":"| Create registered limits for these resources |"},{"line_number":2739,"context_line":"| before proceeding!                           |"},{"line_number":2740,"context_line":"+----------------------------------------------+"},{"line_number":2741,"context_line":"\u0027\u0027\u0027"},{"line_number":2742,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2743,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"100fa7a1_dfb3dc3a","line":2740,"in_reply_to":"e0a14f2c_d90003e1","updated":"2024-11-08 21:16:58.000000000","message":"Well, you could put it afterwards as well. You could also go the route of:\n```\n| THING_FOO | Missing |\n```\n\nInstead of just a table of one column. That would likely grab more attention than just a list of classes if the message scrolls off.","commit_id":"94f461345b85f0ba48c01dc73e7ef20b36163a7e"},{"author":{"_account_id":31033,"name":"James Parker","email":"jparker@redhat.com","username":"jparker"},"change_message_id":"52f047f0cc3f0c121c08a102cf05cbe0bf2ad739","unresolved":true,"context_lines":[{"line_number":2721,"context_line":""},{"line_number":2722,"context_line":"        # Delete the last instance which has resources:GPU. It should not be"},{"line_number":2723,"context_line":"        # included because the instance is deleted."},{"line_number":2724,"context_line":"        instance.destroy()"},{"line_number":2725,"context_line":""},{"line_number":2726,"context_line":"        # Fake a down cell returned from the instance list."},{"line_number":2727,"context_line":"        real_get_instance_objects_sorted \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"e9d438b8_71163a00","line":2724,"updated":"2024-11-12 18:11:11.000000000","message":"This is just for my own understanding. Why does the removal of an instance using the resource \u0027GPU\u0027 result in it not be detected by the migration tool? Does it not scan based on all flavors present? Or does the scan only take into account flavors in API database and any other resources from ACTIVE guests?","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":31033,"name":"James Parker","email":"jparker@redhat.com","username":"jparker"},"change_message_id":"888d5e2d4114505db97e2f6839f0f7fe2287cd19","unresolved":true,"context_lines":[{"line_number":2721,"context_line":""},{"line_number":2722,"context_line":"        # Delete the last instance which has resources:GPU. It should not be"},{"line_number":2723,"context_line":"        # included because the instance is deleted."},{"line_number":2724,"context_line":"        instance.destroy()"},{"line_number":2725,"context_line":""},{"line_number":2726,"context_line":"        # Fake a down cell returned from the instance list."},{"line_number":2727,"context_line":"        real_get_instance_objects_sorted \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"e94ad3b5_f20c87e0","line":2724,"in_reply_to":"8a635503_62488c2d","updated":"2024-11-12 18:32:49.000000000","message":"Ah ok thanks, I missed L2705 so this all makes sense now with your explanation.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":31033,"name":"James Parker","email":"jparker@redhat.com","username":"jparker"},"change_message_id":"1336e9d44ba606c576a1be78d6290d609a3defc4","unresolved":false,"context_lines":[{"line_number":2721,"context_line":""},{"line_number":2722,"context_line":"        # Delete the last instance which has resources:GPU. It should not be"},{"line_number":2723,"context_line":"        # included because the instance is deleted."},{"line_number":2724,"context_line":"        instance.destroy()"},{"line_number":2725,"context_line":""},{"line_number":2726,"context_line":"        # Fake a down cell returned from the instance list."},{"line_number":2727,"context_line":"        real_get_instance_objects_sorted \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"35c38579_698600d4","line":2724,"in_reply_to":"e94ad3b5_f20c87e0","updated":"2024-11-12 18:37:46.000000000","message":"Done","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fec39498a647fe59c3329fc9d569ea4c0c401c2d","unresolved":true,"context_lines":[{"line_number":2721,"context_line":""},{"line_number":2722,"context_line":"        # Delete the last instance which has resources:GPU. It should not be"},{"line_number":2723,"context_line":"        # included because the instance is deleted."},{"line_number":2724,"context_line":"        instance.destroy()"},{"line_number":2725,"context_line":""},{"line_number":2726,"context_line":"        # Fake a down cell returned from the instance list."},{"line_number":2727,"context_line":"        real_get_instance_objects_sorted \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"8a635503_62488c2d","line":2724,"in_reply_to":"e9d438b8_71163a00","updated":"2024-11-12 18:27:09.000000000","message":"it does but the API flavor is using `VGPU` not `GPU` that perhasp a littel confusing and we coudl use a diffent resouce class to make that clear.\n\nlines 2710-2720\n\nare creating flavor object but we are not creating those flavor in the API db\nso we are emulating instance that created with a flvor that has now been deleted.\n\nso deleing the instance that uses the GPU woudl remove it form the cell db and the last references to the \"deleted\" flavor woudl be removed.\n\n\nmel is also relyin on the fact that \nfor loops in python dont create a scope so instance after the loop refers to the instance form the last iteration fo the for loop which happnes to be the GPU one.\n\nthat also not partically obvious at first glance.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a795f42af9f63d9e8c366ec4342e3938441ada2d","unresolved":true,"context_lines":[{"line_number":2743,"context_line":"        expected \u003d f\u0027\u0027\u0027\\"},{"line_number":2744,"context_line":"The following resource classes were found during the scan:"},{"line_number":2745,"context_line":""},{"line_number":2746,"context_line":"NOTE: Cells {{\u0027{uuids.down_cell}\u0027}} did not respond and their"},{"line_number":2747,"context_line":"data is not included in this table."},{"line_number":2748,"context_line":""},{"line_number":2749,"context_line":"+------------------------------+------------------+"}],"source_content_type":"text/x-python","patch_set":8,"id":"46407ab1_48747ea1","line":2746,"updated":"2024-11-11 14:47:22.000000000","message":"I\u0027m not a fan of f-strings anyway, so I\u0027m biased, but I think maybe if you need a bunch of escaping, a `%s` might be clearer :)","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a7f386fa375192841acd5bc1094419e310637bc","unresolved":true,"context_lines":[{"line_number":2743,"context_line":"        expected \u003d f\u0027\u0027\u0027\\"},{"line_number":2744,"context_line":"The following resource classes were found during the scan:"},{"line_number":2745,"context_line":""},{"line_number":2746,"context_line":"NOTE: Cells {{\u0027{uuids.down_cell}\u0027}} did not respond and their"},{"line_number":2747,"context_line":"data is not included in this table."},{"line_number":2748,"context_line":""},{"line_number":2749,"context_line":"+------------------------------+------------------+"}],"source_content_type":"text/x-python","patch_set":8,"id":"ade4140d_8591761e","line":2746,"in_reply_to":"46407ab1_48747ea1","updated":"2024-11-11 18:55:11.000000000","message":"Yeah, that\u0027s a good point that here it would make sense to not. I have gotten used to using f-strings for everything.","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":2743,"context_line":"        expected \u003d f\u0027\u0027\u0027\\"},{"line_number":2744,"context_line":"The following resource classes were found during the scan:"},{"line_number":2745,"context_line":""},{"line_number":2746,"context_line":"NOTE: Cells {{\u0027{uuids.down_cell}\u0027}} did not respond and their"},{"line_number":2747,"context_line":"data is not included in this table."},{"line_number":2748,"context_line":""},{"line_number":2749,"context_line":"+------------------------------+------------------+"}],"source_content_type":"text/x-python","patch_set":8,"id":"c0038074_2045745a","line":2746,"in_reply_to":"ade4140d_8591761e","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"28068f27d6de9cda74c3a662c91a2022f34bf152"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"015d27511b4ff73e085cbf07f1a625b83a11da48","unresolved":true,"context_lines":[{"line_number":2743,"context_line":"        expected \u003d f\u0027\u0027\u0027\\"},{"line_number":2744,"context_line":"The following resource classes were found during the scan:"},{"line_number":2745,"context_line":""},{"line_number":2746,"context_line":"NOTE: Cells {{\u0027{uuids.down_cell}\u0027}} did not respond and their"},{"line_number":2747,"context_line":"data is not included in this table."},{"line_number":2748,"context_line":""},{"line_number":2749,"context_line":"+------------------------------+------------------+"}],"source_content_type":"text/x-python","patch_set":10,"id":"7bd2f808_d2655ab1","line":2746,"updated":"2024-11-12 08:20:24.000000000","message":"Forgot to change this one.","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f72c4737b90c9af05a946705afd0a3ab27b40fe3","unresolved":false,"context_lines":[{"line_number":2743,"context_line":"        expected \u003d f\u0027\u0027\u0027\\"},{"line_number":2744,"context_line":"The following resource classes were found during the scan:"},{"line_number":2745,"context_line":""},{"line_number":2746,"context_line":"NOTE: Cells {{\u0027{uuids.down_cell}\u0027}} did not respond and their"},{"line_number":2747,"context_line":"data is not included in this table."},{"line_number":2748,"context_line":""},{"line_number":2749,"context_line":"+------------------------------+------------------+"}],"source_content_type":"text/x-python","patch_set":10,"id":"6583191e_6a255804","line":2746,"in_reply_to":"7bd2f808_d2655ab1","updated":"2024-11-16 02:43:50.000000000","message":"Done","commit_id":"dfaec9840941e1a88205f90c390f2ff432a72eaa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":true,"context_lines":[{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"    # This is required by the parent class."},{"line_number":2480,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriver\u0027"},{"line_number":2481,"context_line":"    NUMBER_OF_CELLS \u003d 2"},{"line_number":2482,"context_line":""},{"line_number":2483,"context_line":"    def setUp(self):"},{"line_number":2484,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":15,"id":"823ec973_771957bd","line":2481,"updated":"2024-11-20 11:27:50.000000000","message":"i was going to ask why do we need multiple cells\nbut since we are grabing the embedded flavors i guess you want to test the scatter gather logic with more then one cell.\n\nso ok that makes sense","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ddf980d3c85a5b31209606cfcd88789b11b1649f","unresolved":false,"context_lines":[{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"    # This is required by the parent class."},{"line_number":2480,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriver\u0027"},{"line_number":2481,"context_line":"    NUMBER_OF_CELLS \u003d 2"},{"line_number":2482,"context_line":""},{"line_number":2483,"context_line":"    def setUp(self):"},{"line_number":2484,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":15,"id":"f66c8f8d_c2f66524","line":2481,"in_reply_to":"823ec973_771957bd","updated":"2024-11-20 19:20:39.000000000","message":"Acknowledged","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":true,"context_lines":[{"line_number":2845,"context_line":"WARNING: It is strongly recommended to create registered limits for resource"},{"line_number":2846,"context_line":"classes missing limits in Keystone before proceeding."},{"line_number":2847,"context_line":"\u0027\u0027\u0027"},{"line_number":2848,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2849,"context_line":"        self.assertEqual(3, result)"},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"    def test_migrate_to_unified_limits_flavor_scanning_project(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"79ee36ed_97d7aca2","line":2848,"updated":"2024-11-20 11:27:50.000000000","message":"nit: rather then an equal check i would have personally done\nself.assertIn() and only asserted the subset of the message to avoid needing to adjust this in the furue if we change the table format ectra.\n\nwith that siad i think this is ok as is. it just make it less obvious what part of this message is the relavant part.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6bd65b9bab26fa4c6a57314e998c4d937a569358","unresolved":true,"context_lines":[{"line_number":2845,"context_line":"WARNING: It is strongly recommended to create registered limits for resource"},{"line_number":2846,"context_line":"classes missing limits in Keystone before proceeding."},{"line_number":2847,"context_line":"\u0027\u0027\u0027"},{"line_number":2848,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2849,"context_line":"        self.assertEqual(3, result)"},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"    def test_migrate_to_unified_limits_flavor_scanning_project(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"dc6ac40c_c896a851","line":2848,"in_reply_to":"79ee36ed_97d7aca2","updated":"2024-11-20 16:24:37.000000000","message":"Yeah I wasn\u0027t sure how to use assertIn() to verify that no other resources are output, only DISK_GB. Maybe I can assertIn(\"DISK_GB | missing\") and then count how many \"class:\" are in the output and assert the count is 1.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"004374208a689595b8c7f6de683d0ad1628d5b1c","unresolved":false,"context_lines":[{"line_number":2845,"context_line":"WARNING: It is strongly recommended to create registered limits for resource"},{"line_number":2846,"context_line":"classes missing limits in Keystone before proceeding."},{"line_number":2847,"context_line":"\u0027\u0027\u0027"},{"line_number":2848,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2849,"context_line":"        self.assertEqual(3, result)"},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"    def test_migrate_to_unified_limits_flavor_scanning_project(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"a474fe2a_2e6585b0","line":2848,"in_reply_to":"dc6ac40c_c896a851","updated":"2024-11-20 19:15:50.000000000","message":"Done","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":true,"context_lines":[{"line_number":2920,"context_line":"            self._delete_flavor(flavor_id)"},{"line_number":2921,"context_line":""},{"line_number":2922,"context_line":"        result \u003d self.cli.migrate_to_unified_limits("},{"line_number":2923,"context_line":"            no_embedded_flavor_scan\u003dTrue)"},{"line_number":2924,"context_line":""},{"line_number":2925,"context_line":"        # VGPU, CUSTOM_BAREMETAL_SMALL, and PGPU should not be included in the"},{"line_number":2926,"context_line":"        # output because the embedded flavor scan should have been skipped."}],"source_content_type":"text/x-python","patch_set":15,"id":"c4eacb3c_2771ddbb","line":2923,"updated":"2024-11-20 11:27:50.000000000","message":"nit: you could also mock _get_resources_from_embedded_flavors and assert its not called.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"004374208a689595b8c7f6de683d0ad1628d5b1c","unresolved":false,"context_lines":[{"line_number":2920,"context_line":"            self._delete_flavor(flavor_id)"},{"line_number":2921,"context_line":""},{"line_number":2922,"context_line":"        result \u003d self.cli.migrate_to_unified_limits("},{"line_number":2923,"context_line":"            no_embedded_flavor_scan\u003dTrue)"},{"line_number":2924,"context_line":""},{"line_number":2925,"context_line":"        # VGPU, CUSTOM_BAREMETAL_SMALL, and PGPU should not be included in the"},{"line_number":2926,"context_line":"        # output because the embedded flavor scan should have been skipped."}],"source_content_type":"text/x-python","patch_set":15,"id":"c5e90ea7_97693bfd","line":2923,"in_reply_to":"c4eacb3c_2771ddbb","updated":"2024-11-20 19:15:50.000000000","message":"Done","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08f936b3ec44b94ade3afc1490a2fe665109e79a","unresolved":true,"context_lines":[{"line_number":2990,"context_line":"classes missing limits in Keystone before proceeding."},{"line_number":2991,"context_line":"\u0027\u0027\u0027 % uuids.down_cell"},{"line_number":2992,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2993,"context_line":"        self.assertEqual(3, result)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5e95fee2_67a3d9cb","line":2993,"updated":"2024-11-20 11:27:50.000000000","message":"this is kind of a belt and brances approch.\ni would have just aborted if the cell was down but makeing as much forward progress as possible is also good.","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ddf980d3c85a5b31209606cfcd88789b11b1649f","unresolved":false,"context_lines":[{"line_number":2990,"context_line":"classes missing limits in Keystone before proceeding."},{"line_number":2991,"context_line":"\u0027\u0027\u0027 % uuids.down_cell"},{"line_number":2992,"context_line":"        self.assertEqual(expected, self.output.getvalue())"},{"line_number":2993,"context_line":"        self.assertEqual(3, result)"}],"source_content_type":"text/x-python","patch_set":15,"id":"afc425b4_47e50e50","line":2993,"in_reply_to":"5e95fee2_67a3d9cb","updated":"2024-11-20 19:20:39.000000000","message":"Acknowledged","commit_id":"8cea9ac5502de0278cbd49484313b9a43bad6882"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f6c5bf07e788ed5006f69460287628c9c58bf38c","unresolved":true,"context_lines":[{"line_number":2846,"context_line":"        self.assertIn(\u0027WARNING\u0027, self.output.getvalue())"},{"line_number":2847,"context_line":"        self.assertIn(\u0027class:CUSTOM_GOLD\u0027, self.output.getvalue())"},{"line_number":2848,"context_line":"        self.assertIn(\u0027class:DISK_GB\u0027, self.output.getvalue())"},{"line_number":2849,"context_line":"        self.assertEqual(2, self.output.getvalue().count(\u0027class:\u0027))"},{"line_number":2850,"context_line":"        self.assertEqual(3, result)"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"    @mock.patch.object("}],"source_content_type":"text/x-python","patch_set":16,"id":"501f21ad_3428ec9a","line":2849,"updated":"2024-11-20 19:27:40.000000000","message":"This is much more readable to me, thanks.","commit_id":"df2e549654860d516b31fa95deaac7b65858fcb0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ddf980d3c85a5b31209606cfcd88789b11b1649f","unresolved":true,"context_lines":[{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"    @mock.patch.object("},{"line_number":2853,"context_line":"        manage.LimitsCommands, \u0027_get_resources_from_embedded_flavors\u0027,"},{"line_number":2854,"context_line":"        new\u003dmock.NonCallableMock())"},{"line_number":2855,"context_line":"    def test_migrate_to_unified_limits_no_embedded_flavor_scan(self):"},{"line_number":2856,"context_line":"        # Create a few flavors in the API database."},{"line_number":2857,"context_line":"        for resource in (\u0027NUMA_CORE\u0027, \u0027PCPU\u0027, \u0027NUMA_SOCKET\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7364bb9f_ba29d49e","line":2854,"updated":"2024-11-20 19:20:39.000000000","message":"oh i didnt know mock.NonCallableMock() was a thing.\ncool","commit_id":"df2e549654860d516b31fa95deaac7b65858fcb0"}],"releasenotes/notes/unified-limits-flavor-scan-3e41db3379ed0aba.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ddf980d3c85a5b31209606cfcd88789b11b1649f","unresolved":true,"context_lines":[{"line_number":9,"context_line":"    unified limits is to fail quota checks if resources requested are missing"},{"line_number":10,"context_line":"    registered limits in Keystone. With flavor scanning in"},{"line_number":11,"context_line":"    ``migrate_to_unified_limits``, operators can easily determine what resource"},{"line_number":12,"context_line":"    classes for which they need to create registered limits."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"a42abdcf_66199048","line":12,"updated":"2024-11-20 19:20:39.000000000","message":"+1","commit_id":"df2e549654860d516b31fa95deaac7b65858fcb0"}]}
