)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"366fdefe5948960350242988ec03de82e4cc43f8","unresolved":true,"context_lines":[{"line_number":19,"context_line":"(improved) exception message as those raised by oslo.limit. They"},{"line_number":20,"context_line":"however do use the existing exception code to ease integration. The"},{"line_number":21,"context_line":"user of the API will see the same return codes, no matter which code is"},{"line_number":22,"context_line":"enabled to enforce the limits."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Finally, this also adds test coverage where it was missing. Coverage"},{"line_number":25,"context_line":"for \"quota recheck\" behavior in KeypairAPI is added where all other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"0ecea848_c9fad127","line":22,"updated":"2022-02-09 15:31:54.000000000","message":"fwiw, checking how the exception handling is made is difficult to review, so I basically trust you.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cba70fbcd3533322f3093a3858586b26f5ab7043","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"42ba45c9_3a512a6d","updated":"2022-01-21 19:51:33.000000000","message":"recheck bug 1957941","commit_id":"af315817a1b52e021557d7f1fbb84a57b0cbc7e6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1e6b530acebb4b539a9530a32bfe5992751d64e0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"fa3d1f40_2f79d536","updated":"2022-01-21 01:06:40.000000000","message":"recheck dep updated","commit_id":"af315817a1b52e021557d7f1fbb84a57b0cbc7e6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a49d592d2e09a7e1bd1d294a13cb95a7dc43c672","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"b94a8418_c38e6178","updated":"2022-01-27 19:59:30.000000000","message":"recheck Could not connect to mirror.gra1.ovh.opendev.org:443 (149.202.160.10). - connect (111: Connection refused)","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a220933518aadcdc826444c5b4b7a57118b78738","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"eff9e02f_e5d724b0","updated":"2022-02-02 14:16:44.000000000","message":"Looks good (the small nits are OK to handle as a followup)","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"019318639ffb6bd622aadb91b245384cb1a53eca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"e6779c45_80501b87","updated":"2022-02-07 16:05:00.000000000","message":"melwitt, I\u0027ll chat with you out of band about this and maybe suggest a change after this if we decide that\u0027s the right plan.","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e37690d85a19dc1eba53c5b1fc442a2b9303abb5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"a4a35d9b_7a05f31f","updated":"2022-02-02 14:16:54.000000000","message":"recheck nova-next has been fixed","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"366fdefe5948960350242988ec03de82e4cc43f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"360efc83_f49b9f15","updated":"2022-02-09 15:31:54.000000000","message":"Looks reasonable but I need further checks on verifying each limit check to make sure you don\u0027t change the returned exception. Honestly, I don\u0027t think there are any problems or the tests would yell but I still need to doublecheck in case of a testing gap.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8062468dd31693740855d3e59e7bb8b369214b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"f4aee6ef_db1e756d","updated":"2022-02-10 11:20:00.000000000","message":"I have couple of question inline","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"129699b6e66066ebf635727da9625bcdc6aab0db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"a6f7576a_db78d65b","updated":"2022-02-14 11:19:31.000000000","message":"OK, I eventually verified all the exceptions and it\u0027s all good.\n\n+2 and thanks Mel !","commit_id":"23d8e8d1c4246f50d931c6eddf197a341a9fd680"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"21e5ee5f15e4ed2229bd524bb92f3027abed7937","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"0af5379f_01148aa6","updated":"2022-02-25 12:50:00.000000000","message":"recheck","commit_id":"4207493829a1b1877f643c4a49cd2e079f23859d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0a764705e5c934a3d5728517116b46cb6e8a531c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"6740efc9_6040362c","updated":"2022-02-24 22:04:36.000000000","message":"recheck","commit_id":"4207493829a1b1877f643c4a49cd2e079f23859d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c0733f04a88740833e006b330b994320b0f0c642","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"42428f0f_33745d25","updated":"2022-02-25 23:49:40.000000000","message":"recheck bug 1959677","commit_id":"4207493829a1b1877f643c4a49cd2e079f23859d"}],"nova/api/openstack/compute/server_groups.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            objects.Quotas.check_deltas(context, {\u0027server_groups\u0027: 1},"},{"line_number":194,"context_line":"                                        project_id, context.user_id)"},{"line_number":195,"context_line":"            local_limit.enforce_db_limit(context, local_limit.SERVER_GROUPS,"},{"line_number":196,"context_line":"                                         project_id, delta\u003d1)"},{"line_number":197,"context_line":"        except nova.exception.OverQuota:"},{"line_number":198,"context_line":"            msg \u003d _(\"Quota exceeded, too many server groups.\")"},{"line_number":199,"context_line":"            raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_21bb9b72","line":196,"range":{"start_line":196,"start_character":41,"end_line":196,"end_character":51},"updated":"2020-06-10 15:39:55.000000000","message":"could you add\n\n  enforce_scope\n\nhere?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            objects.Quotas.check_deltas(context, {\u0027server_groups\u0027: 1},"},{"line_number":194,"context_line":"                                        project_id, context.user_id)"},{"line_number":195,"context_line":"            local_limit.enforce_db_limit(context, local_limit.SERVER_GROUPS,"},{"line_number":196,"context_line":"                                         project_id, delta\u003d1)"},{"line_number":197,"context_line":"        except nova.exception.OverQuota:"},{"line_number":198,"context_line":"            msg \u003d _(\"Quota exceeded, too many server groups.\")"},{"line_number":199,"context_line":"            raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ad72ddb7_36fc576d","line":196,"range":{"start_line":196,"start_character":41,"end_line":196,"end_character":51},"in_reply_to":"bf51134e_84b4ae81","updated":"2021-05-04 17:19:21.000000000","message":"So I am afraid we need to work out which project to do the count on, and compare to the config, so we still need the project_id here.\n\nNot sure what you mean by adding enforce_scope here? Generally I want to add new checks next to old checks, so we don\u0027t have different failure modes.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cadac424c2c04ca2570f00a0f8bfb5f7ca0fe011","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            objects.Quotas.check_deltas(context, {\u0027server_groups\u0027: 1},"},{"line_number":194,"context_line":"                                        project_id, context.user_id)"},{"line_number":195,"context_line":"            local_limit.enforce_db_limit(context, local_limit.SERVER_GROUPS,"},{"line_number":196,"context_line":"                                         project_id, delta\u003d1)"},{"line_number":197,"context_line":"        except nova.exception.OverQuota:"},{"line_number":198,"context_line":"            msg \u003d _(\"Quota exceeded, too many server groups.\")"},{"line_number":199,"context_line":"            raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_84b4ae81","line":196,"range":{"start_line":196,"start_character":41,"end_line":196,"end_character":51},"in_reply_to":"ff570b3c_21bb9b72","updated":"2020-06-24 22:13:31.000000000","message":"editing my comment on \u0027enforce_scope\u0027 :)when reviewing the next file you mean \u0027entity_scope\u0027.\n\nas those are config based limit we can avoid passing the project_id also. commented about making these also config based in its previous patch.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"366fdefe5948960350242988ec03de82e4cc43f8","unresolved":true,"context_lines":[{"line_number":195,"context_line":"            local_limit.enforce_db_limit(context, local_limit.SERVER_GROUPS,"},{"line_number":196,"context_line":"                                         entity_scope\u003dproject_id, delta\u003d1)"},{"line_number":197,"context_line":"        except nova.exception.OverQuota as e:"},{"line_number":198,"context_line":"            raise exc.HTTPForbidden(explanation\u003dstr(e))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        vals \u003d body[\u0027server_group\u0027]"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"2edc48b6_72274cb1","line":198,"updated":"2022-02-09 15:31:54.000000000","message":"we change the returned exception message, but OK we don\u0027t need a microversion.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"121f62680c65dea95a21334c335e99bbb5e33a0b","unresolved":true,"context_lines":[{"line_number":195,"context_line":"            local_limit.enforce_db_limit(context, local_limit.SERVER_GROUPS,"},{"line_number":196,"context_line":"                                         entity_scope\u003dproject_id, delta\u003d1)"},{"line_number":197,"context_line":"        except nova.exception.OverQuota as e:"},{"line_number":198,"context_line":"            raise exc.HTTPForbidden(explanation\u003dstr(e))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        vals \u003d body[\u0027server_group\u0027]"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"e6e31a0c_14a0f737","line":198,"in_reply_to":"2edc48b6_72274cb1","updated":"2022-02-11 03:12:00.000000000","message":"This is actually an oversight, thanks for catching.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"}],"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe295b497b287f2da3bbe247bb8c6507857f2a5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"from nova import hooks"},{"line_number":61,"context_line":"from nova.i18n import _"},{"line_number":62,"context_line":"from nova.image import glance"},{"line_number":63,"context_line":"from nova.limit import local as local_limits"},{"line_number":64,"context_line":"from nova.network import constants"},{"line_number":65,"context_line":"from nova.network import model as network_model"},{"line_number":66,"context_line":"from nova.network import neutron"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_bc91fef3","line":63,"range":{"start_line":63,"start_character":32,"end_line":63,"end_character":44},"updated":"2020-03-17 13:09:51.000000000","message":"need to remove extra s here.","commit_id":"f0ba6e59121f01154c772a9359995825b8f1d7ff"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cadac424c2c04ca2570f00a0f8bfb5f7ca0fe011","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                                       injected_file_content_bytes\u003dmax_content)"},{"line_number":352,"context_line":"            # TODO(johngarbutt) we can simplify the except clause when"},{"line_number":353,"context_line":"            # the above legacy quota check is removed."},{"line_number":354,"context_line":"            local_limit.enforce_api_limit("},{"line_number":355,"context_line":"                local_limit.INJECTED_FILES_PATH, max_path)"},{"line_number":356,"context_line":"            local_limit.enforce_api_limit("},{"line_number":357,"context_line":"                local_limit.INJECTED_FILES_CONTENT, max_content)"},{"line_number":358,"context_line":"        except exception.OverQuota as exc:"},{"line_number":359,"context_line":"            # Favor path limit over content limit for reporting"},{"line_number":360,"context_line":"            # purposes"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_0466de2a","line":357,"range":{"start_line":354,"start_character":0,"end_line":357,"end_character":64},"updated":"2020-06-24 22:13:31.000000000","message":"we should make enforce_api_limit to accept the multiple entity_type and check all in single call.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":true,"context_lines":[{"line_number":351,"context_line":"                                       injected_file_content_bytes\u003dmax_content)"},{"line_number":352,"context_line":"            # TODO(johngarbutt) we can simplify the except clause when"},{"line_number":353,"context_line":"            # the above legacy quota check is removed."},{"line_number":354,"context_line":"            local_limit.enforce_api_limit("},{"line_number":355,"context_line":"                local_limit.INJECTED_FILES_PATH, max_path)"},{"line_number":356,"context_line":"            local_limit.enforce_api_limit("},{"line_number":357,"context_line":"                local_limit.INJECTED_FILES_CONTENT, max_content)"},{"line_number":358,"context_line":"        except exception.OverQuota as exc:"},{"line_number":359,"context_line":"            # Favor path limit over content limit for reporting"},{"line_number":360,"context_line":"            # purposes"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f560f44_d43d968e","line":357,"range":{"start_line":354,"start_character":0,"end_line":357,"end_character":64},"in_reply_to":"bf51134e_0466de2a","updated":"2021-05-04 17:19:21.000000000","message":"The idea here, is we can then do a separate exception hander for each, rather than the nasty coupling we have to do below, eventually.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":1348,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1349,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1350,"context_line":"                                instance_group, context.user_id)"},{"line_number":1351,"context_line":"                            # TODO(johngarbutt): decide if we need this check"},{"line_number":1352,"context_line":"                            local_limit.enforce_db_limit("},{"line_number":1353,"context_line":"                                context, local_limit.SERVER_GROUP_MEMBERS,"},{"line_number":1354,"context_line":"                                instance_group.uuid, delta\u003d0)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_9995c58b","line":1351,"range":{"start_line":1351,"start_character":28,"end_line":1351,"end_character":77},"updated":"2020-06-10 15:39:55.000000000","message":"Some context as to why you might not want this would be helpful. I would assume it\u0027s for the reasons Mel outlined above? How will we determine this?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cadac424c2c04ca2570f00a0f8bfb5f7ca0fe011","unresolved":false,"context_lines":[{"line_number":1348,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1349,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1350,"context_line":"                                instance_group, context.user_id)"},{"line_number":1351,"context_line":"                            # TODO(johngarbutt): decide if we need this check"},{"line_number":1352,"context_line":"                            local_limit.enforce_db_limit("},{"line_number":1353,"context_line":"                                context, local_limit.SERVER_GROUP_MEMBERS,"},{"line_number":1354,"context_line":"                                instance_group.uuid, delta\u003d0)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_e4512a38","line":1351,"range":{"start_line":1351,"start_character":28,"end_line":1351,"end_character":77},"in_reply_to":"ff570b3c_9995c58b","updated":"2020-06-24 22:13:31.000000000","message":"i think we said in spec that we will not do recheck_quota if unified limit is used ?\n\nlast para in this section\n- https://specs.openstack.org/openstack/nova-specs/specs/victoria/approved/unified-limits-nova.html#no-uncountable-limits\n\nbut doing rechecks for config driven limits are not costly but it could be for unified limits.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":6165,"context_line":"                         \u00271 and 255 characters long\u0027))"},{"line_number":6166,"context_line":"        try:"},{"line_number":6167,"context_line":"            objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 1}, user_id)"},{"line_number":6168,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6169,"context_line":"                                         local_limit.KEY_PAIRS, user_id, 1)"},{"line_number":6170,"context_line":"        except exception.OverQuota:"},{"line_number":6171,"context_line":"            raise exception.KeypairLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_79ca716e","line":6168,"range":{"start_line":6168,"start_character":41,"end_line":6168,"end_character":49},"updated":"2020-06-10 15:39:55.000000000","message":"style nit: can you drag this down to the next line?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":6166,"context_line":"        try:"},{"line_number":6167,"context_line":"            objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 1}, user_id)"},{"line_number":6168,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6169,"context_line":"                                         local_limit.KEY_PAIRS, user_id, 1)"},{"line_number":6170,"context_line":"        except exception.OverQuota:"},{"line_number":6171,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6172,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_59b4cdf2","line":6169,"range":{"start_line":6169,"start_character":64,"end_line":6169,"end_character":75},"updated":"2020-06-10 15:39:55.000000000","message":"Let\u0027s name these since they\u0027re not obvious:\n\n  entity_scope\u003duser_id, delta\u003d1","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":6239,"context_line":"        if CONF.quota.recheck_quota:"},{"line_number":6240,"context_line":"            try:"},{"line_number":6241,"context_line":"                objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 0}, user_id)"},{"line_number":6242,"context_line":"                # TODO(johngarbutt) do we really need this recheck?"},{"line_number":6243,"context_line":"                local_limit.enforce_db_limit("},{"line_number":6244,"context_line":"                    context, local_limit.KEY_PAIRS, user_id, 0)"},{"line_number":6245,"context_line":"            except exception.OverQuota:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_79c0b17d","line":6242,"range":{"start_line":6242,"start_character":0,"end_line":6242,"end_character":67},"updated":"2020-06-10 15:39:55.000000000","message":"Again, a reference to the previous along with some words on how one can resolve this would be beneficial","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":6241,"context_line":"                objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 0}, user_id)"},{"line_number":6242,"context_line":"                # TODO(johngarbutt) do we really need this recheck?"},{"line_number":6243,"context_line":"                local_limit.enforce_db_limit("},{"line_number":6244,"context_line":"                    context, local_limit.KEY_PAIRS, user_id, 0)"},{"line_number":6245,"context_line":"            except exception.OverQuota:"},{"line_number":6246,"context_line":"                keypair.destroy()"},{"line_number":6247,"context_line":"                raise exception.KeypairLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_d9c73d64","line":6244,"range":{"start_line":6244,"start_character":51,"end_line":6244,"end_character":63},"updated":"2020-06-10 15:39:55.000000000","message":"use kwargs","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e117be9b19393408df2f0fde21ca6d44ac6f12b","unresolved":true,"context_lines":[{"line_number":1414,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1415,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1416,"context_line":"                                instance_group, context.user_id)"},{"line_number":1417,"context_line":"                            # TODO(johngarbutt): decide if we need this check"},{"line_number":1418,"context_line":"                            local_limit.enforce_db_limit("},{"line_number":1419,"context_line":"                                context, local_limit.SERVER_GROUP_MEMBERS,"},{"line_number":1420,"context_line":"                                instance_group.uuid, delta\u003d0)"}],"source_content_type":"text/x-python","patch_set":11,"id":"e436cbf4_36b8fb7f","line":1417,"updated":"2021-05-11 13:56:08.000000000","message":"could still do with additional context here","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"23b772ddb180183de30afd13edbf197007591e07","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1415,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1416,"context_line":"                                instance_group, context.user_id)"},{"line_number":1417,"context_line":"                            # TODO(johngarbutt): decide if we need this check"},{"line_number":1418,"context_line":"                            local_limit.enforce_db_limit("},{"line_number":1419,"context_line":"                                context, local_limit.SERVER_GROUP_MEMBERS,"},{"line_number":1420,"context_line":"                                instance_group.uuid, delta\u003d0)"}],"source_content_type":"text/x-python","patch_set":11,"id":"87b85fca_26c847ad","line":1417,"in_reply_to":"5bccf856_838d9b10","updated":"2022-02-02 03:36:31.000000000","message":"Done","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a97d7ab0a3ca80e5a58c1232f4ba5365fb5754a0","unresolved":true,"context_lines":[{"line_number":1414,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1415,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1416,"context_line":"                                instance_group, context.user_id)"},{"line_number":1417,"context_line":"                            # TODO(johngarbutt): decide if we need this check"},{"line_number":1418,"context_line":"                            local_limit.enforce_db_limit("},{"line_number":1419,"context_line":"                                context, local_limit.SERVER_GROUP_MEMBERS,"},{"line_number":1420,"context_line":"                                instance_group.uuid, delta\u003d0)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5bccf856_838d9b10","line":1417,"in_reply_to":"e436cbf4_36b8fb7f","updated":"2021-06-07 14:25:16.000000000","message":"Good idea","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e117be9b19393408df2f0fde21ca6d44ac6f12b","unresolved":true,"context_lines":[{"line_number":6427,"context_line":"        try:"},{"line_number":6428,"context_line":"            objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 1}, user_id)"},{"line_number":6429,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6430,"context_line":"                                         local_limit.KEY_PAIRS, user_id, 1)"},{"line_number":6431,"context_line":"        except exception.OverQuota:"},{"line_number":6432,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6433,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"456ea20a_b1a20b8d","line":6430,"range":{"start_line":6430,"start_character":64,"end_line":6430,"end_character":74},"updated":"2021-05-11 13:56:08.000000000","message":"per PS10, can you use named kwargs here?","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"23b772ddb180183de30afd13edbf197007591e07","unresolved":false,"context_lines":[{"line_number":6427,"context_line":"        try:"},{"line_number":6428,"context_line":"            objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 1}, user_id)"},{"line_number":6429,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6430,"context_line":"                                         local_limit.KEY_PAIRS, user_id, 1)"},{"line_number":6431,"context_line":"        except exception.OverQuota:"},{"line_number":6432,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6433,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da3e475b_d0658e88","line":6430,"range":{"start_line":6430,"start_character":64,"end_line":6430,"end_character":74},"in_reply_to":"456ea20a_b1a20b8d","updated":"2022-02-02 03:36:31.000000000","message":"Done","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e117be9b19393408df2f0fde21ca6d44ac6f12b","unresolved":true,"context_lines":[{"line_number":6502,"context_line":"                objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 0}, user_id)"},{"line_number":6503,"context_line":"                # TODO(johngarbutt) do we really need this recheck?"},{"line_number":6504,"context_line":"                local_limit.enforce_db_limit("},{"line_number":6505,"context_line":"                    context, local_limit.KEY_PAIRS, user_id, 0)"},{"line_number":6506,"context_line":"            except exception.OverQuota:"},{"line_number":6507,"context_line":"                keypair.destroy()"},{"line_number":6508,"context_line":"                raise exception.KeypairLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":11,"id":"0a6146bd_df4da3bd","line":6505,"range":{"start_line":6505,"start_character":52,"end_line":6505,"end_character":62},"updated":"2021-05-11 13:56:08.000000000","message":"ditto","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a97d7ab0a3ca80e5a58c1232f4ba5365fb5754a0","unresolved":true,"context_lines":[{"line_number":6502,"context_line":"                objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 0}, user_id)"},{"line_number":6503,"context_line":"                # TODO(johngarbutt) do we really need this recheck?"},{"line_number":6504,"context_line":"                local_limit.enforce_db_limit("},{"line_number":6505,"context_line":"                    context, local_limit.KEY_PAIRS, user_id, 0)"},{"line_number":6506,"context_line":"            except exception.OverQuota:"},{"line_number":6507,"context_line":"                keypair.destroy()"},{"line_number":6508,"context_line":"                raise exception.KeypairLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":11,"id":"893125ea_073a43b0","line":6505,"range":{"start_line":6505,"start_character":52,"end_line":6505,"end_character":62},"in_reply_to":"0a6146bd_df4da3bd","updated":"2021-06-07 14:25:16.000000000","message":"ditto.","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"23b772ddb180183de30afd13edbf197007591e07","unresolved":false,"context_lines":[{"line_number":6502,"context_line":"                objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 0}, user_id)"},{"line_number":6503,"context_line":"                # TODO(johngarbutt) do we really need this recheck?"},{"line_number":6504,"context_line":"                local_limit.enforce_db_limit("},{"line_number":6505,"context_line":"                    context, local_limit.KEY_PAIRS, user_id, 0)"},{"line_number":6506,"context_line":"            except exception.OverQuota:"},{"line_number":6507,"context_line":"                keypair.destroy()"},{"line_number":6508,"context_line":"                raise exception.KeypairLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":11,"id":"8e5d4486_bcdde6cc","line":6505,"range":{"start_line":6505,"start_character":52,"end_line":6505,"end_character":62},"in_reply_to":"893125ea_073a43b0","updated":"2022-02-02 03:36:31.000000000","message":"Done","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7afc72881740acb44354b9790cfebc0b0620341d","unresolved":true,"context_lines":[{"line_number":6638,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6639,"context_line":"            except exception.QuotaError:"},{"line_number":6640,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6641,"context_line":"                    keypair.destroy()"},{"line_number":6642,"context_line":""},{"line_number":6643,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":6644,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":30,"id":"983ae3a3_cd3ad6fc","line":6641,"updated":"2022-01-31 18:14:53.000000000","message":"In your tests, it looks like we\u0027re now raising QuotaError for being over quota - is that right?\n\nhttps://review.opendev.org/c/openstack/nova/+/712139/27/nova/tests/unit/limit/test_local.py#127\n\nI hadn\u0027t thought much about it when seeing that (being over quota is a sort of quota error). However, here it looks like we had been expecting an OverQuota here and in our caller. It surely seems like we should differentiate from the \"session init error\" and the \"everything is fine, you\u0027re just out of quota\" situation. Especially since our caller expects a more specific KeypairLimitExceeded exception in that case, as opposed to the more general \"I dunno, something broke with quotas.\"","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6a61414f5a8edae7d3484d5abf975dc87eb4f110","unresolved":false,"context_lines":[{"line_number":6638,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6639,"context_line":"            except exception.QuotaError:"},{"line_number":6640,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6641,"context_line":"                    keypair.destroy()"},{"line_number":6642,"context_line":""},{"line_number":6643,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":6644,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":30,"id":"354cb06d_4c122f06","line":6641,"in_reply_to":"3cf8a922_6937fc11","updated":"2022-02-09 06:40:02.000000000","message":"Done","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6534d98675fefd284017b477c5faf22c425681b","unresolved":true,"context_lines":[{"line_number":6638,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6639,"context_line":"            except exception.QuotaError:"},{"line_number":6640,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6641,"context_line":"                    keypair.destroy()"},{"line_number":6642,"context_line":""},{"line_number":6643,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":6644,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":30,"id":"a4a357cd_6a8e567c","line":6641,"in_reply_to":"866edc51_ff913c36","updated":"2022-01-31 19:05:53.000000000","message":"\u003e Your thought makes sense to me. What I ultimately am trying to do here is switch over to the oslo.limit \"over quota\" exception message and make the \"over quota\" exceptions consistent (in response to previous feedback not to jump through hoops to preserve the legacy inconsistent over quota exception messages).\n\nYep, I know that\u0027s what you\u0027re going for and I think it\u0027s good in general. If I hadn\u0027t said it earlier, I think standardizing services\u0027 responses about quota issues on what oslo-limit gives us is nice. It\u0027s straightforward, gives a lot of information to the user, etc.\n\n\u003e So far, I\u0027ve done that by generically catching oslo_limit.exception.ProjectOverLimit, taking its \u003cmessage\u003e and raising a nova.exception.QuotaError with \u003cmessage\u003e. The nova.exception.OverQuota has an entirely different msg_fmt [1], so I can\u0027t reuse it AFAIK. And exceptions like KeypairLimitExceeded all have inconsistent exception messages.\n\u003e \n\u003e (later) I see now that any nova exception message can be overridden using the \u0027message\u0027 kwarg, so the exception classes could in fact be reused with different user-facing words.\n\nAh, I see why you did that then. But yeah, I think it\u0027d be better to continue using the same class if we can, but with the better message from oslo-limit. Granular exceptions help us do the right thing in the API, and not having two ways to expose an overquota situation above a given layer helps us not introduce bugs later. Someone looking at that stack of exceptions in the API clearly thinks if they\u0027re looking for the overquota situation that they should look for KeypairLimitExceeded, which would be wrong IFF we\u0027re using the keystone driver under the covers.\n\n\u003e Fair point about the \"session init error\", that it should be different than a \"over quota\" error. I\u0027ll change that somehow.\n\nCool.\n\n\u003e Some questions:\n\u003e \n\u003e (1) Is translating oslo.limit exceptions to nova exceptions at the nova.limit layer the right thing to do in general? Or should nova.limit pass through oslo.limit exceptions and compute.api catches them and raises nova exceptions? Or should nova pass through oslo.limit exceptions all the way out the REST API? Or something else I\u0027ve not thought of?\n\nI would think that they should be translated at least in the compute.api layer, if not the nova.limit layer. Wherever the earliest opportunity for same behavior is, I think. If nova.limit can behave just like the config-based approach or whatever, then that\u0027s better if compute.api doesn\u0027t have to account for both possibilities.\n\n\u003e (2) If translating to nova exceptions in some way is the answer to (1), should they all be the same nova.quota.OverQuota or should they keep their existing nova exception classes and just override using the \u0027message\u0027 kwarg to use the consistent error message from oslo.limit?\n\nI think we should preserve the Nova classes whenever it makes sense (i.e. there\u0027s a direct relation). Meaning QuotaError for actual error things (like the session init case) and KeypairLimitExceeded for \"you are out of these\". Since the new layer is more unified than the old one(s) it might help to introduce a layer of \"too many things\" exception parent class in front of KeypairLimitExceeded, TooManyServerGroups, WhyDoYouNeedSoManyMetadataItems, etc (made up those last two, but you get the idea) so that the api can generically catch OverQuotaForThing and your generic layer can raise the generic OverQuotaForThing instead of the specific KeypairLimitExceeded.","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"32024f2ed0535cd3c82f102097bf5fd5756e3e32","unresolved":true,"context_lines":[{"line_number":6638,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6639,"context_line":"            except exception.QuotaError:"},{"line_number":6640,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6641,"context_line":"                    keypair.destroy()"},{"line_number":6642,"context_line":""},{"line_number":6643,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":6644,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":30,"id":"866edc51_ff913c36","line":6641,"in_reply_to":"983ae3a3_cd3ad6fc","updated":"2022-01-31 18:54:17.000000000","message":"Your thought makes sense to me. What I ultimately am trying to do here is switch over to the oslo.limit \"over quota\" exception message and make the \"over quota\" exceptions consistent (in response to previous feedback not to jump through hoops to preserve the legacy inconsistent over quota exception messages).\n\nSo far, I\u0027ve done that by generically catching oslo_limit.exception.ProjectOverLimit, taking its \u003cmessage\u003e and raising a nova.exception.QuotaError with \u003cmessage\u003e. The nova.exception.OverQuota has an entirely different msg_fmt [1], so I can\u0027t reuse it AFAIK. And exceptions like KeypairLimitExceeded all have inconsistent exception messages.\n\n(later) I see now that any nova exception message can be overridden using the \u0027message\u0027 kwarg, so the exception classes could in fact be reused with different user-facing words.\n\nFair point about the \"session init error\", that it should be different than a \"over quota\" error. I\u0027ll change that somehow.\n\nSome questions:\n\n(1) Is translating oslo.limit exceptions to nova exceptions at the nova.limit layer the right thing to do in general? Or should nova.limit pass through oslo.limit exceptions and compute.api catches them and raises nova exceptions? Or should nova pass through oslo.limit exceptions all the way out the REST API? Or something else I\u0027ve not thought of?\n\n(2) If translating to nova exceptions in some way is the answer to (1), should they all be the same nova.quota.OverQuota or should they keep their existing nova exception classes and just override using the \u0027message\u0027 kwarg to use the consistent error message from oslo.limit?\n\n[1] https://github.com/openstack/nova/blob/9fe465427310f8215890d26bf169617653605e23/nova/exception.py#L996-L997","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6cdbabab054d04b66882987925584b814e2c19f4","unresolved":true,"context_lines":[{"line_number":6638,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6639,"context_line":"            except exception.QuotaError:"},{"line_number":6640,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6641,"context_line":"                    keypair.destroy()"},{"line_number":6642,"context_line":""},{"line_number":6643,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":6644,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":30,"id":"3cf8a922_6937fc11","line":6641,"in_reply_to":"a4a357cd_6a8e567c","updated":"2022-01-31 19:20:50.000000000","message":"Cool, makes sense. I\u0027ll get this cleaned up, thank you for the help.","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"019318639ffb6bd622aadb91b245384cb1a53eca","unresolved":true,"context_lines":[{"line_number":6587,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6588,"context_line":"                                         local_limit.KEY_PAIRS,"},{"line_number":6589,"context_line":"                                         entity_scope\u003duser_id, delta\u003d1)"},{"line_number":6590,"context_line":"        except exception.OverQuota as e:"},{"line_number":6591,"context_line":"            if \u0027overs\u0027 in e.kwargs:"},{"line_number":6592,"context_line":"                # Legacy quota exception handling"},{"line_number":6593,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6594,"context_line":"            else:"},{"line_number":6595,"context_line":"                # Unified limits exception handling"},{"line_number":6596,"context_line":"                raise exception.KeypairLimitExceeded(message\u003dstr(e))"},{"line_number":6597,"context_line":""},{"line_number":6598,"context_line":"    @wrap_exception()"},{"line_number":6599,"context_line":"    def import_key_pair(self, context, user_id, key_name, public_key,"}],"source_content_type":"text/x-python","patch_set":31,"id":"2db51647_8342dbcd","line":6596,"range":{"start_line":6590,"start_character":0,"end_line":6596,"end_character":68},"updated":"2022-02-07 16:05:00.000000000","message":"I think when you see stuff like this, especially repeated so many times, it\u0027s an indicator that we\u0027re doing something wrong. It took me a while to figure out what\u0027s going on here, but I think I see. When I suggested tweaking this last time, I mentioned an extra layer in here. Looking more closely at the actual exceptions, I think the easiest thing to do would be to add a subclass to OverQuota like \"OverQuotaLimit\" (or some better name) which we raise in our limit-based code, and which can catch specifically and use the message unchanged, instead of inspecting the way the message was formatted. But, I think there\u0027s an even better option:\n\nWe\u0027re already templating the methods that we call per quota key in these enforce methods. We could easily also template out the exception that we want raised. That way enforce_db_limit() could just raise KeypairLimitExceeded directly (in that case) and we wouldn\u0027t need this layer of translation at all. When we remove the nova-internal quotas then these bits can really just go away.\n\nSome other options would also be to use the first option but just teach the KeypairLimitExceeded type exceptions to honor a limit-based subclass so we can avoid the conditional behavior here entirely.\n\nAnyway, I think adding this if..else behavior everywhere is not very palatable, so we should work on a better way. I started the discussion so I\u0027ll definitely help get us out.","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6a61414f5a8edae7d3484d5abf975dc87eb4f110","unresolved":false,"context_lines":[{"line_number":6587,"context_line":"            local_limit.enforce_db_limit(context,"},{"line_number":6588,"context_line":"                                         local_limit.KEY_PAIRS,"},{"line_number":6589,"context_line":"                                         entity_scope\u003duser_id, delta\u003d1)"},{"line_number":6590,"context_line":"        except exception.OverQuota as e:"},{"line_number":6591,"context_line":"            if \u0027overs\u0027 in e.kwargs:"},{"line_number":6592,"context_line":"                # Legacy quota exception handling"},{"line_number":6593,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6594,"context_line":"            else:"},{"line_number":6595,"context_line":"                # Unified limits exception handling"},{"line_number":6596,"context_line":"                raise exception.KeypairLimitExceeded(message\u003dstr(e))"},{"line_number":6597,"context_line":""},{"line_number":6598,"context_line":"    @wrap_exception()"},{"line_number":6599,"context_line":"    def import_key_pair(self, context, user_id, key_name, public_key,"}],"source_content_type":"text/x-python","patch_set":31,"id":"34f3c661_9c6721fb","line":6596,"range":{"start_line":6590,"start_character":0,"end_line":6596,"end_character":68},"in_reply_to":"2db51647_8342dbcd","updated":"2022-02-09 06:40:02.000000000","message":"Done","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"366fdefe5948960350242988ec03de82e4cc43f8","unresolved":true,"context_lines":[{"line_number":436,"context_line":"        except exception.OnsetFilePathLimitExceeded:"},{"line_number":437,"context_line":"            raise"},{"line_number":438,"context_line":"        except exception.OnsetFileContentLimitExceeded:"},{"line_number":439,"context_line":"            raise"},{"line_number":440,"context_line":"        except exception.OverQuota as exc:"},{"line_number":441,"context_line":"            # Favor path limit over content limit for reporting"},{"line_number":442,"context_line":"            # purposes"}],"source_content_type":"text/x-python","patch_set":33,"id":"8a99debe_bd190916","line":439,"updated":"2022-02-09 15:31:54.000000000","message":"no need for a microversion change here too.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"121f62680c65dea95a21334c335e99bbb5e33a0b","unresolved":true,"context_lines":[{"line_number":436,"context_line":"        except exception.OnsetFilePathLimitExceeded:"},{"line_number":437,"context_line":"            raise"},{"line_number":438,"context_line":"        except exception.OnsetFileContentLimitExceeded:"},{"line_number":439,"context_line":"            raise"},{"line_number":440,"context_line":"        except exception.OverQuota as exc:"},{"line_number":441,"context_line":"            # Favor path limit over content limit for reporting"},{"line_number":442,"context_line":"            # purposes"}],"source_content_type":"text/x-python","patch_set":33,"id":"867f2bc2_d33117fc","line":439,"in_reply_to":"8a99debe_bd190916","updated":"2022-02-11 03:12:00.000000000","message":"Here the legacy exception message will not change because Quotas.limit_check() raises a generic OverQuota exception which is caught below.","commit_id":"b3acedc02069036a28b106208ffeb142eaaac4d5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8062468dd31693740855d3e59e7bb8b369214b3","unresolved":true,"context_lines":[{"line_number":413,"context_line":"        except exception.OnsetFileLimitExceeded:"},{"line_number":414,"context_line":"            raise"},{"line_number":415,"context_line":"        except exception.OverQuota:"},{"line_number":416,"context_line":"            raise exception.OnsetFileLimitExceeded()"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # OK, now count path and content lengths; we\u0027re looking for"},{"line_number":419,"context_line":"        # the max..."}],"source_content_type":"text/x-python","patch_set":34,"id":"4ea438dd_5750a931","line":416,"range":{"start_line":416,"start_character":49,"end_line":416,"end_character":52},"updated":"2022-02-10 11:20:00.000000000","message":"don\u0027t we want to pass forward the better error message from the quota code?","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f77d7bdc9d641d773f707946bcc2dbf6b2ba06b5","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        except exception.OnsetFileLimitExceeded:"},{"line_number":414,"context_line":"            raise"},{"line_number":415,"context_line":"        except exception.OverQuota:"},{"line_number":416,"context_line":"            raise exception.OnsetFileLimitExceeded()"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # OK, now count path and content lengths; we\u0027re looking for"},{"line_number":419,"context_line":"        # the max..."}],"source_content_type":"text/x-python","patch_set":34,"id":"627faf4c_2572ccd7","line":416,"range":{"start_line":416,"start_character":49,"end_line":416,"end_character":52},"in_reply_to":"13c79ff1_64ccf07c","updated":"2022-02-10 15:47:40.000000000","message":"Ack","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d019b59f23fe615687549e136689a95751a2d83","unresolved":true,"context_lines":[{"line_number":413,"context_line":"        except exception.OnsetFileLimitExceeded:"},{"line_number":414,"context_line":"            raise"},{"line_number":415,"context_line":"        except exception.OverQuota:"},{"line_number":416,"context_line":"            raise exception.OnsetFileLimitExceeded()"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # OK, now count path and content lengths; we\u0027re looking for"},{"line_number":419,"context_line":"        # the max..."}],"source_content_type":"text/x-python","patch_set":34,"id":"13c79ff1_64ccf07c","line":416,"range":{"start_line":416,"start_character":49,"end_line":416,"end_character":52},"in_reply_to":"4ea438dd_5750a931","updated":"2022-02-10 15:37:53.000000000","message":"We do in the case of L413, because that will have been generated by the new limit code and have the new-style error. This is the unchanged original code, which uses the standard error message in the exception.","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8062468dd31693740855d3e59e7bb8b369214b3","unresolved":true,"context_lines":[{"line_number":6576,"context_line":"        except exception.KeypairLimitExceeded:"},{"line_number":6577,"context_line":"            raise"},{"line_number":6578,"context_line":"        except exception.OverQuota:"},{"line_number":6579,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"    @wrap_exception()"},{"line_number":6582,"context_line":"    def import_key_pair(self, context, user_id, key_name, public_key,"}],"source_content_type":"text/x-python","patch_set":34,"id":"5fb0e9f9_d0e08143","line":6579,"range":{"start_line":6579,"start_character":48,"end_line":6579,"end_character":50},"updated":"2022-02-10 11:20:00.000000000","message":"don\u0027t we want to pass forward the message from the OverQuota?","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d019b59f23fe615687549e136689a95751a2d83","unresolved":true,"context_lines":[{"line_number":6576,"context_line":"        except exception.KeypairLimitExceeded:"},{"line_number":6577,"context_line":"            raise"},{"line_number":6578,"context_line":"        except exception.OverQuota:"},{"line_number":6579,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"    @wrap_exception()"},{"line_number":6582,"context_line":"    def import_key_pair(self, context, user_id, key_name, public_key,"}],"source_content_type":"text/x-python","patch_set":34,"id":"a9427c49_29c10f9f","line":6579,"range":{"start_line":6579,"start_character":48,"end_line":6579,"end_character":50},"in_reply_to":"5fb0e9f9_d0e08143","updated":"2022-02-10 15:37:53.000000000","message":"Same as above, this is the legacy case, so we want the mesage from the exception, which is keypair-specific if we\u0027re not using the new limits stuff. This is why I moved that string into the KeypairLimitExceeded exception in the earlier patch. In the legacy case, we raise KeypairLimitExceeded with the static string that users have always seen, and in the new limit case (L6577) we raise the one that the limit code gave us, which has the new oslo.limit-style message in it.","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f77d7bdc9d641d773f707946bcc2dbf6b2ba06b5","unresolved":false,"context_lines":[{"line_number":6576,"context_line":"        except exception.KeypairLimitExceeded:"},{"line_number":6577,"context_line":"            raise"},{"line_number":6578,"context_line":"        except exception.OverQuota:"},{"line_number":6579,"context_line":"            raise exception.KeypairLimitExceeded()"},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"    @wrap_exception()"},{"line_number":6582,"context_line":"    def import_key_pair(self, context, user_id, key_name, public_key,"}],"source_content_type":"text/x-python","patch_set":34,"id":"22838ded_e8808bc9","line":6579,"range":{"start_line":6579,"start_character":48,"end_line":6579,"end_character":50},"in_reply_to":"a9427c49_29c10f9f","updated":"2022-02-10 15:47:40.000000000","message":"Ack","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8062468dd31693740855d3e59e7bb8b369214b3","unresolved":true,"context_lines":[{"line_number":6657,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6658,"context_line":"                    keypair.destroy()"},{"line_number":6659,"context_line":"            except exception.OverQuota:"},{"line_number":6660,"context_line":"                keypair.destroy()"},{"line_number":6661,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"        compute_utils.notify_about_keypair_action("}],"source_content_type":"text/x-python","patch_set":34,"id":"3108eb7b_16ae1f62","line":6660,"updated":"2022-02-10 11:20:00.000000000","message":"I guess we need save_and_reraise_exception for this destroy for the same reason as it is added at L6657","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f77d7bdc9d641d773f707946bcc2dbf6b2ba06b5","unresolved":false,"context_lines":[{"line_number":6657,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6658,"context_line":"                    keypair.destroy()"},{"line_number":6659,"context_line":"            except exception.OverQuota:"},{"line_number":6660,"context_line":"                keypair.destroy()"},{"line_number":6661,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"        compute_utils.notify_about_keypair_action("}],"source_content_type":"text/x-python","patch_set":34,"id":"7846160b_fdeb9e67","line":6660,"in_reply_to":"111dee13_362041af","updated":"2022-02-10 15:47:40.000000000","message":"I agree about not reraising the OverQuota if that has only a generic message. I wanted to point out the case when destroy() raises.","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d019b59f23fe615687549e136689a95751a2d83","unresolved":true,"context_lines":[{"line_number":6657,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6658,"context_line":"                    keypair.destroy()"},{"line_number":6659,"context_line":"            except exception.OverQuota:"},{"line_number":6660,"context_line":"                keypair.destroy()"},{"line_number":6661,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"        compute_utils.notify_about_keypair_action("}],"source_content_type":"text/x-python","patch_set":34,"id":"111dee13_362041af","line":6660,"in_reply_to":"3108eb7b_16ae1f62","updated":"2022-02-10 15:37:53.000000000","message":"No, because we don\u0027t want to re-raise the generic OverQuota, we want to keep raising the KeypairLimitExceeded exception, as this code has always done. We might want to put a try..except around the destroy to make sure we don\u0027t fail to raise the exception we want, but we do not want to raise the generic OverQuota as it won\u0027t have the keypair-specific string in it that we want to keep in the legacy case.","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"121f62680c65dea95a21334c335e99bbb5e33a0b","unresolved":false,"context_lines":[{"line_number":6657,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":6658,"context_line":"                    keypair.destroy()"},{"line_number":6659,"context_line":"            except exception.OverQuota:"},{"line_number":6660,"context_line":"                keypair.destroy()"},{"line_number":6661,"context_line":"                raise exception.KeypairLimitExceeded()"},{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"        compute_utils.notify_about_keypair_action("}],"source_content_type":"text/x-python","patch_set":34,"id":"f7097f35_dc8ca7a8","line":6660,"in_reply_to":"7846160b_fdeb9e67","updated":"2022-02-11 03:12:00.000000000","message":"I put save_and_reraise_exception() to reraise KeypairLimitExceeded after destroying the keypair. If destroy() itself raised, in both cases it would just go unhandled in both cases, unless I\u0027m missing something.","commit_id":"2f98211061442c00c20114422bcebad7c0a71b27"}],"nova/exception.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a220933518aadcdc826444c5b4b7a57118b78738","unresolved":false,"context_lines":[{"line_number":1276,"context_line":""},{"line_number":1277,"context_line":""},{"line_number":1278,"context_line":"class GroupMemberLimitExceeded(QuotaError):"},{"line_number":1279,"context_line":"    msg_fmt \u003d _(\"Quota exceeded, too many servers in group\")"},{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"class SecurityGroupLimitExceeded(QuotaError):"}],"source_content_type":"text/x-python","patch_set":31,"id":"fe1aa48f_a2105c8d","line":1279,"updated":"2022-02-02 14:16:44.000000000","message":"so this message is not the one we return as when this exception type is used the message is overwritten from the oslo limit message.","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"}],"nova/limit/local.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a220933518aadcdc826444c5b4b7a57118b78738","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    KEY_PAIRS,"},{"line_number":50,"context_line":"    SERVER_GROUPS,"},{"line_number":51,"context_line":"    SERVER_GROUP_MEMBERS,"},{"line_number":52,"context_line":"])"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# Checks only happen when we are using the unified limits driver"},{"line_number":55,"context_line":"UNIFIED_LIMITS_DRIVER \u003d \"nova.quota.UnifiedLimitsDriver\""}],"source_content_type":"text/x-python","patch_set":31,"id":"8a2465eb_56196fbb","line":52,"updated":"2022-02-02 14:16:44.000000000","message":"nit: So this is basically set(DB_COUNT_FUNCTION.keys()) I\u0027m OK to keep them separate but I suggest to make a note that DB_LIMITS and DB_COUNT_FUNCTION expected to contain the same keys.","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a220933518aadcdc826444c5b4b7a57118b78738","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# Checks only happen when we are using the unified limits driver"},{"line_number":55,"context_line":"UNIFIED_LIMITS_DRIVER \u003d \"nova.quota.UnifiedLimitsDriver\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"LEGACY_LIMITS \u003d {"},{"line_number":58,"context_line":"    SERVER_METADATA_ITEMS: \"metadata_items\","},{"line_number":59,"context_line":"    INJECTED_FILES: \"injected_files\","},{"line_number":60,"context_line":"    INJECTED_FILES_CONTENT: \"injected_file_content_bytes\","}],"source_content_type":"text/x-python","patch_set":31,"id":"56681454_0cdcf6d2","line":57,"updated":"2022-02-02 14:16:44.000000000","message":"nit: for easy of understanding I would note that the goal of this dict is to map the new quota names to the legacy quote names.","commit_id":"d47bff206cc1626fd32ad938c7c2a4d05285f708"}],"nova/tests/unit/api/openstack/compute/test_server_group_quotas.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe295b497b287f2da3bbe247bb8c6507857f2a5","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        self.controller \u003d sg_v21.ServerGroupController()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def test_create_failure(self):"},{"line_number":183,"context_line":"        self.flags(use_unified_limits\u003dTrue, server_groups\u003d0, group\u003d\u0027quota\u0027)"},{"line_number":184,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":185,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"},{"line_number":186,"context_line":"        sgroup[\u0027policies\u0027] \u003d policies"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_fcb0d68d","line":183,"updated":"2020-03-17 13:09:51.000000000","message":"Seems like we could set the common flags in the setUp.","commit_id":"f0ba6e59121f01154c772a9359995825b8f1d7ff"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.assertEqual(204, status_int)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"class ServerGroupQuotasUnifiedLimitsTestV21(test.TestCase):"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def setUp(self):"},{"line_number":178,"context_line":"        super(ServerGroupQuotasUnifiedLimitsTestV21, self).setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_59a96d8e","line":175,"range":{"start_line":175,"start_character":44,"end_line":175,"end_character":59},"updated":"2020-06-10 15:39:55.000000000","message":"Do we need the DB?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.assertEqual(204, status_int)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"class ServerGroupQuotasUnifiedLimitsTestV21(test.TestCase):"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def setUp(self):"},{"line_number":178,"context_line":"        super(ServerGroupQuotasUnifiedLimitsTestV21, self).setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"15c2f076_b154d2da","line":175,"range":{"start_line":175,"start_character":44,"end_line":175,"end_character":59},"in_reply_to":"ff570b3c_59a96d8e","updated":"2021-05-04 17:19:21.000000000","message":"yes, in its current form, its doing the counting in the DB.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def setUp(self):"},{"line_number":178,"context_line":"        super(ServerGroupQuotasUnifiedLimitsTestV21, self).setUp()"},{"line_number":179,"context_line":"        self.flags(driver\u003d\"nova.quota.UnifiedLimitsDriver\", group\u003d\u0027quota\u0027)"},{"line_number":180,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":181,"context_line":"        self.controller \u003d sg_v21.ServerGroupController()"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_798f112e","line":179,"range":{"start_line":179,"start_character":26,"end_line":179,"end_character":27},"updated":"2020-06-10 15:39:55.000000000","message":"nit :(","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":181,"context_line":"        self.controller \u003d sg_v21.ServerGroupController()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_create_failure(self):"},{"line_number":184,"context_line":"        self.flags(server_groups\u003d0, group\u003d\u0027quota\u0027)"},{"line_number":185,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":186,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_ae4f9a32","line":183,"updated":"2020-06-10 15:39:55.000000000","message":"Can we get some docstrings? We don\u0027t do enough of those :( Below too","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_create_failure(self):"},{"line_number":184,"context_line":"        self.flags(server_groups\u003d0, group\u003d\u0027quota\u0027)"},{"line_number":185,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":186,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"},{"line_number":187,"context_line":"        sgroup[\u0027policies\u0027] \u003d policies"},{"line_number":188,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":189,"context_line":"                          self.controller.create,"},{"line_number":190,"context_line":"                          self.req, body\u003d{\u0027server_group\u0027: sgroup})"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_4e7cfe71","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":37},"updated":"2020-06-10 15:39:55.000000000","message":"nit: this is weird. I guess you want to highlight that policies are the same, but\n\n  policies \u003d [\u0027anti-affinity\u0027]\n  sgroup \u003d {\u0027name\u0027: \u0027test\u0027, \u0027policies\u0027: policies}\n\nwould be clearer","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_create_failure(self):"},{"line_number":184,"context_line":"        self.flags(server_groups\u003d0, group\u003d\u0027quota\u0027)"},{"line_number":185,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":186,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"},{"line_number":187,"context_line":"        sgroup[\u0027policies\u0027] \u003d policies"},{"line_number":188,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":189,"context_line":"                          self.controller.create,"},{"line_number":190,"context_line":"                          self.req, body\u003d{\u0027server_group\u0027: sgroup})"}],"source_content_type":"text/x-python","patch_set":10,"id":"a6bd2d59_1adce660","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":37},"in_reply_to":"ff570b3c_4e7cfe71","updated":"2021-05-04 17:19:21.000000000","message":"It is just a cut and paste from above, I can tidy that.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def test_create_success(self):"},{"line_number":193,"context_line":"        self.flags(server_groups\u003d1, group\u003d\u0027quota\u0027)"},{"line_number":194,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":195,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"},{"line_number":196,"context_line":"        sgroup[\u0027policies\u0027] \u003d policies"},{"line_number":197,"context_line":"        res_dict \u003d self.controller.create(self.req,"},{"line_number":198,"context_line":"                                          body\u003d{\u0027server_group\u0027: sgroup})"},{"line_number":199,"context_line":"        self.assertEqual(res_dict[\u0027server_group\u0027][\u0027name\u0027], \u0027test\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_8ec3b68a","line":196,"range":{"start_line":194,"start_character":0,"end_line":196,"end_character":37},"updated":"2020-06-10 15:39:55.000000000","message":"same comment as above","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        sgroup \u003d {\"name\": \"test\"}"},{"line_number":195,"context_line":"        policies \u003d [\u0027anti-affinity\u0027]"},{"line_number":196,"context_line":"        sgroup[\u0027policies\u0027] \u003d policies"},{"line_number":197,"context_line":"        res_dict \u003d self.controller.create(self.req,"},{"line_number":198,"context_line":"                                          body\u003d{\u0027server_group\u0027: sgroup})"},{"line_number":199,"context_line":"        self.assertEqual(res_dict[\u0027server_group\u0027][\u0027name\u0027], \u0027test\u0027)"},{"line_number":200,"context_line":"        self.assertTrue(uuidutils.is_uuid_like(res_dict[\u0027server_group\u0027][\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_8e48d62e","line":197,"range":{"start_line":197,"start_character":42,"end_line":197,"end_character":51},"updated":"2020-06-10 15:39:55.000000000","message":"style nit: this\u0027d be nicer on the next line, IMO","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # prove we can\u0027t create two, as limited to one"},{"line_number":204,"context_line":"        sgroup2 \u003d {\"name\": \"test2\"}"},{"line_number":205,"context_line":"        sgroup2[\u0027policies\u0027] \u003d policies"},{"line_number":206,"context_line":"        exec \u003d self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":207,"context_line":"                                 self.controller.create,"},{"line_number":208,"context_line":"                                 self.req, body\u003d{\u0027server_group\u0027: sgroup2})"},{"line_number":209,"context_line":"        self.assertEqual(\"Quota exceeded, too many server groups.\", str(exec))"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_0e35e6a8","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":12},"updated":"2020-06-10 15:39:55.000000000","message":"This is masking a builtin function. Suggest \u0027exc\u0027 instead","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # prove we can\u0027t create two, as limited to one"},{"line_number":204,"context_line":"        sgroup2 \u003d {\"name\": \"test2\"}"},{"line_number":205,"context_line":"        sgroup2[\u0027policies\u0027] \u003d policies"},{"line_number":206,"context_line":"        exec \u003d self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":207,"context_line":"                                 self.controller.create,"},{"line_number":208,"context_line":"                                 self.req, body\u003d{\u0027server_group\u0027: sgroup2})"},{"line_number":209,"context_line":"        self.assertEqual(\"Quota exceeded, too many server groups.\", str(exec))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fa10cde_ac08a4aa","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":12},"in_reply_to":"ff570b3c_0e35e6a8","updated":"2021-05-04 17:19:21.000000000","message":"oops","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"}],"nova/tests/unit/compute/test_keypairs.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe295b497b287f2da3bbe247bb8c6507857f2a5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def test_quota_unified_limits(self):"},{"line_number":162,"context_line":"        self.flags(use_unified_limits\u003dTrue, key_pairs\u003d0, group\u003d\u0027quota\u0027)"},{"line_number":163,"context_line":"        msg \u003d \"Maximum number of key pairs exceeded\""},{"line_number":164,"context_line":"        self.assertKeypairRaises(exception.KeypairLimitExceeded, msg, \u0027foo\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class CreateKeypairTestCase(KeypairAPITestCase, CreateImportSharedTestMixIn):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_3c450e71","line":164,"updated":"2020-03-17 13:09:51.000000000","message":"What about not raising?","commit_id":"f0ba6e59121f01154c772a9359995825b8f1d7ff"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7afc72881740acb44354b9790cfebc0b0620341d","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        self.useFixture(limit_fixture.LimitFixture("},{"line_number":166,"context_line":"            {\u0027server_key_pairs\u0027: 0}, {}))"},{"line_number":167,"context_line":"        msg \u003d (\"Resource %s is over limit\" % local_limit.KEY_PAIRS)"},{"line_number":168,"context_line":"        self.assertKeypairRaises(exception.QuotaError, msg, \u0027foo\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class CreateKeypairTestCase(KeypairAPITestCase, CreateImportSharedTestMixIn):"}],"source_content_type":"text/x-python","patch_set":30,"id":"8f547ca7_8d063b68","line":168,"updated":"2022-01-31 18:14:53.000000000","message":"This, I think, shows the weirdness I\u0027m thinking about. Above this test, we\u0027re testing for keypairs exceeding the static limit and expecting LimitExceeded. In this one, we\u0027re testing the same situation (with a different storage of the limit) and expecting a different outcome right?","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6a61414f5a8edae7d3484d5abf975dc87eb4f110","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        self.useFixture(limit_fixture.LimitFixture("},{"line_number":166,"context_line":"            {\u0027server_key_pairs\u0027: 0}, {}))"},{"line_number":167,"context_line":"        msg \u003d (\"Resource %s is over limit\" % local_limit.KEY_PAIRS)"},{"line_number":168,"context_line":"        self.assertKeypairRaises(exception.QuotaError, msg, \u0027foo\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class CreateKeypairTestCase(KeypairAPITestCase, CreateImportSharedTestMixIn):"}],"source_content_type":"text/x-python","patch_set":30,"id":"626c78ed_c172c882","line":168,"in_reply_to":"6e6a9ea7_1b381834","updated":"2022-02-09 06:40:02.000000000","message":"Done","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"32024f2ed0535cd3c82f102097bf5fd5756e3e32","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        self.useFixture(limit_fixture.LimitFixture("},{"line_number":166,"context_line":"            {\u0027server_key_pairs\u0027: 0}, {}))"},{"line_number":167,"context_line":"        msg \u003d (\"Resource %s is over limit\" % local_limit.KEY_PAIRS)"},{"line_number":168,"context_line":"        self.assertKeypairRaises(exception.QuotaError, msg, \u0027foo\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class CreateKeypairTestCase(KeypairAPITestCase, CreateImportSharedTestMixIn):"}],"source_content_type":"text/x-python","patch_set":30,"id":"6e6a9ea7_1b381834","line":168,"in_reply_to":"8f547ca7_8d063b68","updated":"2022-01-31 18:54:17.000000000","message":"Yes. I\u0027ve asked questions in my previous comment which will hopefully guide what we should do in the next PS.","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"}],"nova/tests/unit/test_quota.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_with_server_group_members(self):"},{"line_number":220,"context_line":"        self.flags(server_group_members\u003d1, group\u003d\"quota\")"},{"line_number":221,"context_line":"        api \u003d self.compute_api"},{"line_number":222,"context_line":"        image_uuid \u003d \u0027cedef40a-ed67-4d10-800e-17455edce175\u0027"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        instance_group \u003d objects.InstanceGroup(self.context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_6e1c6213","line":221,"range":{"start_line":221,"start_character":8,"end_line":221,"end_character":30},"updated":"2020-06-10 15:39:55.000000000","message":"why?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_with_server_group_members(self):"},{"line_number":220,"context_line":"        self.flags(server_group_members\u003d1, group\u003d\"quota\")"},{"line_number":221,"context_line":"        api \u003d self.compute_api"},{"line_number":222,"context_line":"        image_uuid \u003d \u0027cedef40a-ed67-4d10-800e-17455edce175\u0027"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        instance_group \u003d objects.InstanceGroup(self.context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"b5adfb96_83a84cd5","line":221,"range":{"start_line":221,"start_character":8,"end_line":221,"end_character":30},"in_reply_to":"ff570b3c_6e1c6213","updated":"2021-05-04 17:19:21.000000000","message":"Cut and paste from above, I can make this function different to all the others in the file, if wanted.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":219,"context_line":"    def test_with_server_group_members(self):"},{"line_number":220,"context_line":"        self.flags(server_group_members\u003d1, group\u003d\"quota\")"},{"line_number":221,"context_line":"        api \u003d self.compute_api"},{"line_number":222,"context_line":"        image_uuid \u003d \u0027cedef40a-ed67-4d10-800e-17455edce175\u0027"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        instance_group \u003d objects.InstanceGroup(self.context,"},{"line_number":225,"context_line":"                                               policy\u003d\"anti-affinity\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_2ee0aafa","line":222,"updated":"2020-06-10 15:39:55.000000000","message":"Is this arbitrary? If so, can you use \u0027uuids\u0027? If not, can you add a comment. A function docstring would be great in general","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"888845809a6a489d15cbcc6ebc50db8a4040e145","unresolved":false,"context_lines":[{"line_number":219,"context_line":"    def test_with_server_group_members(self):"},{"line_number":220,"context_line":"        self.flags(server_group_members\u003d1, group\u003d\"quota\")"},{"line_number":221,"context_line":"        api \u003d self.compute_api"},{"line_number":222,"context_line":"        image_uuid \u003d \u0027cedef40a-ed67-4d10-800e-17455edce175\u0027"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        instance_group \u003d objects.InstanceGroup(self.context,"},{"line_number":225,"context_line":"                                               policy\u003d\"anti-affinity\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"dd3e2e7f_0d9d470a","line":222,"in_reply_to":"ff570b3c_2ee0aafa","updated":"2021-05-04 17:19:21.000000000","message":"I was just copying the other methods here, I guess the use it to match the fake instance created. I can do something different here if wanted.","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        api \u003d self.compute_api"},{"line_number":222,"context_line":"        image_uuid \u003d \u0027cedef40a-ed67-4d10-800e-17455edce175\u0027"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        instance_group \u003d objects.InstanceGroup(self.context,"},{"line_number":225,"context_line":"                                               policy\u003d\"anti-affinity\")"},{"line_number":226,"context_line":"        instance_group.name \u003d \"foo\""},{"line_number":227,"context_line":"        instance_group.project_id \u003d self.context.project_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_ae167af0","line":224,"range":{"start_line":224,"start_character":47,"end_line":224,"end_character":60},"updated":"2020-06-10 15:39:55.000000000","message":"style nit: drag it down?","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8d2537ed95fae18b82c84dec5c7e653716dd20f8","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        self.addCleanup(instance_group.destroy)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        api.create(self.context, instance_type\u003dself.inst_type,"},{"line_number":235,"context_line":"            image_href\u003dimage_uuid,"},{"line_number":236,"context_line":"            scheduler_hints\u003d{\u0027group\u0027: uuids.instance_group},"},{"line_number":237,"context_line":"            check_server_group_quota\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff570b3c_eea352b0","line":234,"range":{"start_line":234,"start_character":8,"end_line":234,"end_character":18},"updated":"2020-06-10 15:39:55.000000000","message":"self.compute_api.create","commit_id":"38a00b88c0cc6d7ebe2c8052da59ace8d474a533"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e117be9b19393408df2f0fde21ca6d44ac6f12b","unresolved":true,"context_lines":[{"line_number":18,"context_line":"import mock"},{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":21,"context_line":"from six.moves import range"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from nova.compute import api as compute"},{"line_number":24,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":11,"id":"5c6c3b1c_ce736e0b","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":27},"updated":"2021-05-11 13:56:08.000000000","message":"Whoops. Let\u0027s not reintroduce six","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"23b772ddb180183de30afd13edbf197007591e07","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import mock"},{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":21,"context_line":"from six.moves import range"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from nova.compute import api as compute"},{"line_number":24,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":11,"id":"e4a71670_48c57ddb","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":27},"in_reply_to":"268f1406_a89ec4c5","updated":"2022-02-02 03:36:31.000000000","message":"Done","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a97d7ab0a3ca80e5a58c1232f4ba5365fb5754a0","unresolved":true,"context_lines":[{"line_number":18,"context_line":"import mock"},{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":21,"context_line":"from six.moves import range"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from nova.compute import api as compute"},{"line_number":24,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":11,"id":"268f1406_a89ec4c5","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":27},"in_reply_to":"5c6c3b1c_ce736e0b","updated":"2021-06-07 14:25:16.000000000","message":"oops!","commit_id":"6b739c574f38da86fb3afcb87ce042087569f86c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7afc72881740acb44354b9790cfebc0b0620341d","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":21,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":22,"context_line":"from six.moves import range"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova.compute import api as compute"},{"line_number":25,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":30,"id":"91fb8e65_b90c59cb","line":22,"updated":"2022-01-31 18:14:53.000000000","message":"This was commented on PS11, but..we should not re-introduce six right?","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"23b772ddb180183de30afd13edbf197007591e07","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":21,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":22,"context_line":"from six.moves import range"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova.compute import api as compute"},{"line_number":25,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":30,"id":"20591ee1_0ed1c5ef","line":22,"in_reply_to":"72e8410c_1bd221d2","updated":"2022-02-02 03:36:31.000000000","message":"Done","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"32024f2ed0535cd3c82f102097bf5fd5756e3e32","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":20,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":21,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":22,"context_line":"from six.moves import range"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova.compute import api as compute"},{"line_number":25,"context_line":"import nova.conf"}],"source_content_type":"text/x-python","patch_set":30,"id":"72e8410c_1bd221d2","line":22,"in_reply_to":"91fb8e65_b90c59cb","updated":"2022-01-31 18:54:17.000000000","message":"You\u0027re right, this should not be added. Thanks for catching.\n\nAnd sorry I am seeing now I missed some comments when I changed the set over to use unified limits for everything instead of using config options for some.","commit_id":"9be589b71eb9d058780ce2b358e4f725e8a0c54d"}]}
