)]}'
{"nova/objects/instance_mapping.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a65ec7b38f2d2e5a5b455c6ff210929a107d09a1","unresolved":false,"context_lines":[{"line_number":481,"context_line":"            filter(api_models.InstanceMapping.instance_uuid.in_(uuids)).\\"},{"line_number":482,"context_line":"            filter_by(queued_for_delete\u003dFalse).\\"},{"line_number":483,"context_line":"            filter_by(user_id\u003duser_id)"},{"line_number":484,"context_line":"        return {\u0027user\u0027: {\u0027server_group_members\u0027: query.scalar()}}"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    @base.remotable_classmethod"},{"line_number":487,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"5fc1f717_37f2ef70","line":484,"updated":"2019-04-04 17:33:26.000000000","message":"The names used in this dict are much more specific than the calling methods. \u0027get_count_by_uuids_and user\u0027 could be _any_ uuids, not just group.members.\n\nIt might make sense to make the response more generic (and transform it in the thing that is calling get_count_by...) or make the name of the method more specific.","commit_id":"66f96e2bce7eb56ede2e7657269d9496053ada3d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"928244e8eab35b8391f329c47f254f5c6c43f366","unresolved":false,"context_lines":[{"line_number":481,"context_line":"            filter(api_models.InstanceMapping.instance_uuid.in_(uuids)).\\"},{"line_number":482,"context_line":"            filter_by(queued_for_delete\u003dFalse).\\"},{"line_number":483,"context_line":"            filter_by(user_id\u003duser_id)"},{"line_number":484,"context_line":"        return {\u0027user\u0027: {\u0027server_group_members\u0027: query.scalar()}}"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    @base.remotable_classmethod"},{"line_number":487,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"5fc1f717_0f9af76d","line":484,"in_reply_to":"5fc1f717_37f2ef70","updated":"2019-04-09 02:02:11.000000000","message":"Yeah, that\u0027s fair enough. I did this based on what I thought was a precedent:\n\nhttps://github.com/openstack/nova/blob/fb1fee6772bb101eac83845bac9022df77113aaa/nova/objects/instance.py#L1556\n\nwhich I realize, now that you said something, isn\u0027t really the same situation. Here, we\u0027re implying server group members from instance mappings and we don\u0027t really _have_ to. I\u0027ll change this to be more generic and do the quota-specific formatting in the quota count method.","commit_id":"66f96e2bce7eb56ede2e7657269d9496053ada3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a65ec7b38f2d2e5a5b455c6ff210929a107d09a1","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        The count is used to represent the count of server group members"},{"line_number":491,"context_line":"        belonging to a particular user, for the prupose of counting quota"},{"line_number":492,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":493,"context_line":"        the count (deleted and SOFT_DELETED instances)."},{"line_number":494,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"5fc1f717_771b97c9","line":491,"range":{"start_line":491,"start_character":48,"end_line":491,"end_character":55},"updated":"2019-04-04 17:33:26.000000000","message":"purpose","commit_id":"66f96e2bce7eb56ede2e7657269d9496053ada3d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"5d8fb2eeaa34e81b0dd755b098e9d2dca3f7f132","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":478,"context_line":"    def _get_count_by_uuids_and_user_in_db(context, uuids, user_id):"},{"line_number":479,"context_line":"        query \u003d context.session.query("},{"line_number":480,"context_line":"            func.count(api_models.InstanceMapping.id)).\\"},{"line_number":481,"context_line":"            filter(api_models.InstanceMapping.instance_uuid.in_(uuids)).\\"},{"line_number":482,"context_line":"            filter_by(queued_for_delete\u003dFalse).\\"},{"line_number":483,"context_line":"            filter_by(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fce034c_a7cb711c","line":480,"range":{"start_line":480,"start_character":55,"end_line":480,"end_character":56},"updated":"2019-04-11 11:15:23.000000000","message":"\"\\\":I remember it\u0027s not unfriendly if there need a line break, but I cannot find that links now. :(","commit_id":"6c0be0f6b52b18fd867c865564231f1f7d998f42"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"33cf23a79e9681ab969ed99c7eb24e025a80a38b","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":478,"context_line":"    def _get_count_by_uuids_and_user_in_db(context, uuids, user_id):"},{"line_number":479,"context_line":"        query \u003d context.session.query("},{"line_number":480,"context_line":"            func.count(api_models.InstanceMapping.id)).\\"},{"line_number":481,"context_line":"            filter(api_models.InstanceMapping.instance_uuid.in_(uuids)).\\"},{"line_number":482,"context_line":"            filter_by(queued_for_delete\u003dFalse).\\"},{"line_number":483,"context_line":"            filter_by(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fce034c_e2c5e75c","line":480,"range":{"start_line":480,"start_character":55,"end_line":480,"end_character":56},"in_reply_to":"3fce034c_a7cb711c","updated":"2019-04-11 11:53:07.000000000","message":"Emm..this link: https://docs.openstack.org/hacking/latest/user/hacking.html#general\n#It is preferred to wrap long lines in parentheses and not a backslash for line continuation.","commit_id":"6c0be0f6b52b18fd867c865564231f1f7d998f42"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"065fd1e2b169752fdcaac65a78421f33d742fb58","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":478,"context_line":"    def _get_count_by_uuids_and_user_in_db(context, uuids, user_id):"},{"line_number":479,"context_line":"        query \u003d context.session.query("},{"line_number":480,"context_line":"            func.count(api_models.InstanceMapping.id)).\\"},{"line_number":481,"context_line":"            filter(api_models.InstanceMapping.instance_uuid.in_(uuids)).\\"},{"line_number":482,"context_line":"            filter_by(queued_for_delete\u003dFalse).\\"},{"line_number":483,"context_line":"            filter_by(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fce034c_07511ed9","line":480,"range":{"start_line":480,"start_character":55,"end_line":480,"end_character":56},"in_reply_to":"3fce034c_e2c5e75c","updated":"2019-04-11 16:55:09.000000000","message":"You are right. We often use them anyway for database queries. BUT, looking at this now that you point it out, I don\u0027t think I even needed these because of the \u0027(\u0027 on L479. Oops. I will update it.","commit_id":"6c0be0f6b52b18fd867c865564231f1f7d998f42"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33b31879f04a642f53326a748de216d79503f452","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @staticmethod"},{"line_number":438,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":439,"context_line":"    def _get_count_by_uuids_and_user_in_db(context, uuids, user_id):"},{"line_number":440,"context_line":"        query \u003d (context.session.query("},{"line_number":441,"context_line":"            func.count(api_models.InstanceMapping.id))"},{"line_number":442,"context_line":"            .filter(api_models.InstanceMapping.instance_uuid.in_(uuids))"}],"source_content_type":"text/x-python","patch_set":25,"id":"3fce034c_4e91054e","line":439,"updated":"2019-04-18 13:18:39.000000000","message":"Do we have a test for this bit?","commit_id":"a703b2f7a3f93a52648ac0f3d21609a9ccefd6c0"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a3f58a0ef688fe7cf4ef14d76e4b8cc24b9fd8fe","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @staticmethod"},{"line_number":438,"context_line":"    @db_api.api_context_manager.reader"},{"line_number":439,"context_line":"    def _get_count_by_uuids_and_user_in_db(context, uuids, user_id):"},{"line_number":440,"context_line":"        query \u003d (context.session.query("},{"line_number":441,"context_line":"            func.count(api_models.InstanceMapping.id))"},{"line_number":442,"context_line":"            .filter(api_models.InstanceMapping.instance_uuid.in_(uuids))"}],"source_content_type":"text/x-python","patch_set":25,"id":"3fce034c_175f8c72","line":439,"in_reply_to":"3fce034c_4e91054e","updated":"2019-04-18 15:20:41.000000000","message":"Replied in the test file.","commit_id":"a703b2f7a3f93a52648ac0f3d21609a9ccefd6c0"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"19fb67eba72352f8adb96fcb6dbdcfc1d304f15c","unresolved":false,"context_lines":[{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        The count is used to represent the count of server group members"},{"line_number":452,"context_line":"        belonging to a particular user, for the purpose of counting quota"},{"line_number":453,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":454,"context_line":"        the count (deleted and SOFT_DELETED instances)."},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        :param uuids: List of instance UUIDs on which to filter"}],"source_content_type":"text/x-python","patch_set":28,"id":"dfbec78f_fd785490","line":453,"range":{"start_line":453,"start_character":34,"end_line":453,"end_character":57},"updated":"2019-05-16 15:28:36.000000000","message":"nit: we don\u0027t have test for this, but I guess you have done similar tests for other similar functions in your previous patches.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"514eb4d355d46f2c9cfb60d936a4548ea63ee082","unresolved":false,"context_lines":[{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        The count is used to represent the count of server group members"},{"line_number":452,"context_line":"        belonging to a particular user, for the purpose of counting quota"},{"line_number":453,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":454,"context_line":"        the count (deleted and SOFT_DELETED instances)."},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        :param uuids: List of instance UUIDs on which to filter"}],"source_content_type":"text/x-python","patch_set":28,"id":"bfb3d3c7_784b7b2a","line":453,"range":{"start_line":453,"start_character":34,"end_line":453,"end_character":57},"in_reply_to":"dfbec78f_fd785490","updated":"2019-05-23 17:18:46.000000000","message":"Good point, I can add a test wrinkle for this to the existing func test.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            .filter_by(user_id\u003duser_id))"},{"line_number":445,"context_line":"        return query.scalar()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @base.remotable_classmethod"},{"line_number":448,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"},{"line_number":449,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_c2becad3","line":447,"updated":"2019-05-30 18:16:43.000000000","message":"I guess I didn\u0027t think about this with the get_counts method but this doesn\u0027t really need to be remotable does it? This is only going to be called from the API or super-conductor and as such would have direct access to the database, right? This doesn\u0027t hurt, but it adds a version bump we likely didn\u0027t need.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b6d4fc62c6ad073080b253030a9f4548ed504fd","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            .filter_by(user_id\u003duser_id))"},{"line_number":445,"context_line":"        return query.scalar()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @base.remotable_classmethod"},{"line_number":448,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"},{"line_number":449,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_e2e97ce2","line":447,"in_reply_to":"bfb3d3c7_a33955a4","updated":"2019-05-31 13:14:02.000000000","message":"OK are you going to drop the remotable bit and respin? Otherwise I\u0027m waiting to +2 this.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            .filter_by(user_id\u003duser_id))"},{"line_number":445,"context_line":"        return query.scalar()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @base.remotable_classmethod"},{"line_number":448,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"},{"line_number":449,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_a33955a4","line":447,"in_reply_to":"bfb3d3c7_c2becad3","updated":"2019-05-30 22:58:03.000000000","message":"Hm... yes I think that\u0027s right that it needn\u0027t be remotable. And any situation where it would need to be remotable, would be an up-call? By that logic, I\u0027d think none of the methods in this file need to be remotable. My bad.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"},{"line_number":449,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        The count is used to represent the count of server group members"},{"line_number":452,"context_line":"        belonging to a particular user, for the purpose of counting quota"},{"line_number":453,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":454,"context_line":"        the count (deleted and SOFT_DELETED instances)."}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_429adab8","line":451,"updated":"2019-05-30 18:16:43.000000000","message":"nit: doesn\u0027t really matter what this is used for","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    def get_count_by_uuids_and_user(cls, context, uuids, user_id):"},{"line_number":449,"context_line":"        \"\"\"Get the count of InstanceMapping objects by UUIDs and user_id."},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        The count is used to represent the count of server group members"},{"line_number":452,"context_line":"        belonging to a particular user, for the purpose of counting quota"},{"line_number":453,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":454,"context_line":"        the count (deleted and SOFT_DELETED instances)."}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_8342110e","line":451,"in_reply_to":"bfb3d3c7_429adab8","updated":"2019-05-30 22:58:03.000000000","message":"I put a similar sentence on get_counts, trying to anticipate people looking at the method and wondering what it\u0027s for.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        The count is used to represent the count of server group members"},{"line_number":452,"context_line":"        belonging to a particular user, for the purpose of counting quota"},{"line_number":453,"context_line":"        usage. Instances that are queued_for_deleted\u003dTrue are not included in"},{"line_number":454,"context_line":"        the count (deleted and SOFT_DELETED instances)."},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        :param uuids: List of instance UUIDs on which to filter"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_228b2668","line":453,"range":{"start_line":453,"start_character":15,"end_line":453,"end_character":57},"updated":"2019-05-30 18:16:43.000000000","message":"Assuming qfd\u003dNone is not a concern here because this is only going to be called for the case that we\u0027ve determined the project has it\u0027s instance mappings migrated?\n\n(later)\n\nOK I see UID_QFD_POPULATED_CACHE_ALL.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"}],"nova/quota.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33b31879f04a642f53326a748de216d79503f452","unresolved":false,"context_lines":[{"line_number":1172,"context_line":"    else:"},{"line_number":1173,"context_line":"        count \u003d objects.InstanceMappingList.get_count_by_uuids_and_user("},{"line_number":1174,"context_line":"            context, group.members, user_id)"},{"line_number":1175,"context_line":"        return {\u0027user\u0027: {\u0027server_group_members\u0027: count}}"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"def _fixed_ip_count(context, project_id):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3fce034c_0e38dd3a","line":1175,"updated":"2019-04-18 13:18:39.000000000","message":"Note to self: Do we have instance mappings at the same time as a build requests? Answer is yes, pretty much: https://github.com/openstack/nova/blob/6ac15734b9678bfb876e7dfa6502a13d1fe2ee40/nova/compute/api.py#L1017","commit_id":"a703b2f7a3f93a52648ac0f3d21609a9ccefd6c0"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"19fb67eba72352f8adb96fcb6dbdcfc1d304f15c","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"                                                user_id\u003duser_id)"},{"line_number":1127,"context_line":""},{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"def _server_group_count_members_by_user_legacy(context, group, user_id):"},{"line_number":1130,"context_line":"    # NOTE(melwitt): This is mostly duplicated from"},{"line_number":1131,"context_line":"    # InstanceGroup.count_members_by_user() to query across multiple cells."},{"line_number":1132,"context_line":"    # We need to be able to pass the correct cell context to"}],"source_content_type":"text/x-python","patch_set":28,"id":"dfbec78f_7d9a24b9","line":1129,"range":{"start_line":1129,"start_character":40,"end_line":1129,"end_character":46},"updated":"2019-05-16 15:28:36.000000000","message":"nit: looks like this function lost its test.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7b50a73158e11846c5e787a0981ea8e932304d6e","unresolved":false,"context_lines":[{"line_number":1186,"context_line":"        LOG.warning(\u0027Falling back to legacy quota counting method for server \u0027"},{"line_number":1187,"context_line":"                    \u0027group members\u0027)"},{"line_number":1188,"context_line":"        return _server_group_count_members_by_user_legacy(context, group,"},{"line_number":1189,"context_line":"                                                          user_id)"},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":""},{"line_number":1192,"context_line":"def _fixed_ip_count(context, project_id):"}],"source_content_type":"text/x-python","patch_set":29,"id":"bfb3d3c7_851da710","line":1189,"updated":"2019-05-23 18:58:17.000000000","message":"Note: counting of server group members from the API database is *not* dependent on the [quota]count_usage_from_placement config option because it\u0027s not related to placement.\n\nHowever, do people think it should be controlled by the [quota] placement option, given it also depends on the user_id and queued_for_delete data migration?","commit_id":"255442da652c9f7d3ddfe50c5fde3e913c0c0bbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"    # InstanceGroup.count_members_by_user() to query across multiple cells."},{"line_number":1136,"context_line":"    # We need to be able to pass the correct cell context to"},{"line_number":1137,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1138,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"},{"line_number":1139,"context_line":"    # counting resources if a cell is down. In the future, we should query"},{"line_number":1140,"context_line":"    # placement for cores/ram and InstanceMappings for instances (once we are"},{"line_number":1141,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1142,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1143,"context_line":"    greenthreads \u003d []"},{"line_number":1144,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_e2d74e4a","line":1141,"range":{"start_line":1138,"start_character":4,"end_line":1141,"end_character":58},"updated":"2019-05-30 18:16:43.000000000","message":"We can remove this TODO now can\u0027t we?","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"    # InstanceGroup.count_members_by_user() to query across multiple cells."},{"line_number":1136,"context_line":"    # We need to be able to pass the correct cell context to"},{"line_number":1137,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1138,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"},{"line_number":1139,"context_line":"    # counting resources if a cell is down. In the future, we should query"},{"line_number":1140,"context_line":"    # placement for cores/ram and InstanceMappings for instances (once we are"},{"line_number":1141,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1142,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1143,"context_line":"    greenthreads \u003d []"},{"line_number":1144,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_4348992b","line":1141,"range":{"start_line":1138,"start_character":4,"end_line":1141,"end_character":58},"in_reply_to":"bfb3d3c7_e2d74e4a","updated":"2019-05-30 22:58:03.000000000","message":"Oh, whoops, forgot to remove this as was done similarly in the big patch that added the placement counting.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"    return {\u0027user\u0027: {\u0027server_group_members\u0027: count}}"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"def _server_group_count_members_by_user(context, group, user_id):"},{"line_number":1171,"context_line":"    global UID_QFD_POPULATED_CACHE_ALL"},{"line_number":1172,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1173,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_62c35e8a","line":1170,"updated":"2019-05-30 18:16:43.000000000","message":"This method could use some comments.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"    return {\u0027user\u0027: {\u0027server_group_members\u0027: count}}"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":"def _server_group_count_members_by_user(context, group, user_id):"},{"line_number":1171,"context_line":"    global UID_QFD_POPULATED_CACHE_ALL"},{"line_number":1172,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1173,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_63583df9","line":1170,"in_reply_to":"bfb3d3c7_62c35e8a","updated":"2019-05-30 22:58:03.000000000","message":"Ack.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"    global UID_QFD_POPULATED_CACHE_ALL"},{"line_number":1172,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1173,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"},{"line_number":1174,"context_line":"        LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1175,"context_line":"                  \u0027populated for all projects\u0027)"},{"line_number":1176,"context_line":"        if uid_qfd_populated:"},{"line_number":1177,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_a25b96f3","line":1174,"updated":"2019-05-30 18:16:43.000000000","message":"As expected I only see this logged once in the gate when this is turned on:\n\nhttp://logs.openstack.org/24/638324/30/check/nova-next/376406b/logs/screen-n-api.txt.gz#_May_24_02_56_06_409653","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"    global UID_QFD_POPULATED_CACHE_ALL"},{"line_number":1172,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1173,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"},{"line_number":1174,"context_line":"        LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1175,"context_line":"                  \u0027populated for all projects\u0027)"},{"line_number":1176,"context_line":"        if uid_qfd_populated:"},{"line_number":1177,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"},{"line_number":1178,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_424dfa3b","line":1175,"range":{"start_line":1174,"start_character":8,"end_line":1175,"end_character":47},"updated":"2019-05-30 18:16:43.000000000","message":"nit: seems this should go before you call _user_id_queued_for_delete_populated","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"    global UID_QFD_POPULATED_CACHE_ALL"},{"line_number":1172,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1173,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"},{"line_number":1174,"context_line":"        LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1175,"context_line":"                  \u0027populated for all projects\u0027)"},{"line_number":1176,"context_line":"        if uid_qfd_populated:"},{"line_number":1177,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"},{"line_number":1178,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_e352eddd","line":1175,"range":{"start_line":1174,"start_character":8,"end_line":1175,"end_character":47},"in_reply_to":"bfb3d3c7_424dfa3b","updated":"2019-05-30 22:58:03.000000000","message":"Oh, yup, agreed.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"        if uid_qfd_populated:"},{"line_number":1177,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"},{"line_number":1178,"context_line":"    else:"},{"line_number":1179,"context_line":"        uid_qfd_populated \u003d True"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"    if uid_qfd_populated:"},{"line_number":1182,"context_line":"        count \u003d objects.InstanceMappingList.get_count_by_uuids_and_user("}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_c207aac9","line":1179,"range":{"start_line":1179,"start_character":8,"end_line":1179,"end_character":25},"updated":"2019-05-30 18:16:43.000000000","message":"nit: isn\u0027t this a bit redundant? You could just be looking at the global variable throughout.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"        if uid_qfd_populated:"},{"line_number":1177,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"},{"line_number":1178,"context_line":"    else:"},{"line_number":1179,"context_line":"        uid_qfd_populated \u003d True"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"    if uid_qfd_populated:"},{"line_number":1182,"context_line":"        count \u003d objects.InstanceMappingList.get_count_by_uuids_and_user("}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_a362b5ac","line":1179,"range":{"start_line":1179,"start_character":8,"end_line":1179,"end_character":25},"in_reply_to":"bfb3d3c7_c207aac9","updated":"2019-05-30 22:58:03.000000000","message":"Yeah, I suppose it is.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"27c06f3ca8bf4b7f28685eaf1027042e68960ee8","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"        # If a project has all user_id and queued_for_delete data populated,"},{"line_number":1289,"context_line":"        # cache the result to avoid needless database checking in the future."},{"line_number":1290,"context_line":"        if (not UID_QFD_POPULATED_CACHE_ALL and"},{"line_number":1291,"context_line":"                project_id not in UID_QFD_POPULATED_CACHE_BY_PROJECT):"},{"line_number":1292,"context_line":"            LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1293,"context_line":"                      \u0027populated for project_id %s\u0027, project_id)"},{"line_number":1294,"context_line":"            uid_qfd_populated \u003d _user_id_queued_for_delete_populated("}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_d5cd5031","line":1291,"updated":"2019-05-28 19:36:00.000000000","message":"Nit: Part of me wonders if we should just do the global check for both of these, to make it simpler.\n\nI am thinking most informed operators will do the migration before hitting this, or hit it and rollback till they fix it up. Others will not touch this until its a blocking migration.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"dd890121691468ccefd2048dbd9bfbbc8c2a2943","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"        # If a project has all user_id and queued_for_delete data populated,"},{"line_number":1289,"context_line":"        # cache the result to avoid needless database checking in the future."},{"line_number":1290,"context_line":"        if (not UID_QFD_POPULATED_CACHE_ALL and"},{"line_number":1291,"context_line":"                project_id not in UID_QFD_POPULATED_CACHE_BY_PROJECT):"},{"line_number":1292,"context_line":"            LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1293,"context_line":"                      \u0027populated for project_id %s\u0027, project_id)"},{"line_number":1294,"context_line":"            uid_qfd_populated \u003d _user_id_queued_for_delete_populated("}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_67a709bf","line":1291,"in_reply_to":"bfb3d3c7_d5cd5031","updated":"2019-05-29 15:49:35.000000000","message":"The thought crossed my mind but the per project check saves quite a lot of work in the batch potentially, so I leaned toward keeping it this way. Agreed though, I don\u0027t expect many operators will opt-in to counting from placement before completing the data migration separately ahead of enabling it.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bf0754a8c1a3fdd855b984265d0f0bfc1c66256","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"                {\u0027user\u0027: \u0027server_group_members\u0027: \u003ccount across user\u003e}}"},{"line_number":1177,"context_line":"    \"\"\""},{"line_number":1178,"context_line":"    # Because server group members quota counting is not scoped to a project,"},{"line_number":1179,"context_line":"    # but scoped to a particular InstanceGroup and user, we cannot filter our"},{"line_number":1180,"context_line":"    # user_id/queued_for_delete populated check on project_id or user_id."},{"line_number":1181,"context_line":"    # So, we check whether user_id/queued_for_delete is populated for all"},{"line_number":1182,"context_line":"    # records and cache the result to prevent unnecessary checking once the"},{"line_number":1183,"context_line":"    # data migration has been completed."}],"source_content_type":"text/x-python","patch_set":32,"id":"9fb8cfa7_3bafaf95","line":1180,"range":{"start_line":1179,"start_character":57,"end_line":1180,"end_character":73},"updated":"2019-05-31 19:41:54.000000000","message":"This is a bit clunky...","commit_id":"799c0e4b952d800c694b5a2487fa596232dd7fac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bf0754a8c1a3fdd855b984265d0f0bfc1c66256","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"    if not UID_QFD_POPULATED_CACHE_ALL:"},{"line_number":1186,"context_line":"        LOG.debug(\u0027Checking whether user_id and queued_for_delete are \u0027"},{"line_number":1187,"context_line":"                  \u0027populated for all projects\u0027)"},{"line_number":1188,"context_line":"        uid_qfd_populated \u003d _user_id_queued_for_delete_populated(context)"},{"line_number":1189,"context_line":"        if uid_qfd_populated:"},{"line_number":1190,"context_line":"            UID_QFD_POPULATED_CACHE_ALL \u003d True"},{"line_number":1191,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9fb8cfa7_5b894324","line":1188,"range":{"start_line":1188,"start_character":8,"end_line":1188,"end_character":25},"updated":"2019-05-31 19:41:54.000000000","message":"Sorry, in PS30 I meant you could literally replace this variable with just UID_QFD_POPULATED_CACHE_ALL and set it directly. You can tack that onto your FUP change though.","commit_id":"799c0e4b952d800c694b5a2487fa596232dd7fac"}],"nova/tests/functional/db/test_quota.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a3f58a0ef688fe7cf4ef14d76e4b8cc24b9fd8fe","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # add_members() doesn\u0027t add the members to the object field"},{"line_number":86,"context_line":"        group.members.extend(instance_uuids)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Count server group members across cells"},{"line_number":89,"context_line":"        count \u003d quota._server_group_count_members_by_user(ctxt, group,"},{"line_number":90,"context_line":"                                                          \u0027fake-user\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.assertEqual(2, count[\u0027user\u0027][\u0027server_group_members\u0027])"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3fce034c_97713c0f","line":90,"range":{"start_line":88,"start_character":8,"end_line":90,"end_character":70},"updated":"2019-04-18 15:20:41.000000000","message":"This bit covers the new code change (given the creates of InstanceMapping objects above). I need to update the code comment though, since this is no longer counting from cell databases.","commit_id":"a703b2f7a3f93a52648ac0f3d21609a9ccefd6c0"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fdcb467d3a35ad878a78757363e9c99001e6bc1e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # add_members() doesn\u0027t add the members to the object field"},{"line_number":86,"context_line":"        group.members.extend(instance_uuids)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Count server group members from instance mappings"},{"line_number":89,"context_line":"        count \u003d quota._server_group_count_members_by_user(ctxt, group,"},{"line_number":90,"context_line":"                                                          \u0027fake-user\u0027)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"dfbec78f_8932750f","line":88,"updated":"2019-05-13 18:36:35.000000000","message":"Nit: I wondered if we loose nice coverage of the old way, but I think this makes sense.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"514eb4d355d46f2c9cfb60d936a4548ea63ee082","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # add_members() doesn\u0027t add the members to the object field"},{"line_number":86,"context_line":"        group.members.extend(instance_uuids)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Count server group members from instance mappings"},{"line_number":89,"context_line":"        count \u003d quota._server_group_count_members_by_user(ctxt, group,"},{"line_number":90,"context_line":"                                                          \u0027fake-user\u0027)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"bfb3d3c7_183b5f9c","line":88,"in_reply_to":"dfbec78f_8932750f","updated":"2019-05-23 17:18:46.000000000","message":"Good point from you and Surya. Let me see if I can use ddt to cover both the new way and the fall back legacy method.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1aa6b1766d75888093b72aa15a29ae52ad5bb419","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # add_members() doesn\u0027t add the members to the object field"},{"line_number":112,"context_line":"        group.members.extend(instance_uuids)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        # Count server group members from instance mappings"},{"line_number":115,"context_line":"        count \u003d quota._server_group_count_members_by_user(ctxt, group,"},{"line_number":116,"context_line":"                                                          \u0027fake-user\u0027)"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_a2de363b","line":114,"updated":"2019-05-30 18:16:43.000000000","message":"Technically this would be wrong if uid_qfd_populated\u003dFalse, so the comment change is a bit misleading.","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"de163ec67507f6246256ac2e7df5efcfae061100","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # add_members() doesn\u0027t add the members to the object field"},{"line_number":112,"context_line":"        group.members.extend(instance_uuids)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        # Count server group members from instance mappings"},{"line_number":115,"context_line":"        count \u003d quota._server_group_count_members_by_user(ctxt, group,"},{"line_number":116,"context_line":"                                                          \u0027fake-user\u0027)"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"bfb3d3c7_23fb25c1","line":114,"in_reply_to":"bfb3d3c7_a2de363b","updated":"2019-05-30 22:58:03.000000000","message":"Oops, this is residue from an earlier PS when I did not have testing with uid_qfd_populated\u003dFalse in here. Will update or follow up, depending on what you prefer (if you want me to remove remotable and avoid the object version bump).","commit_id":"1b3baad4f488e650ce35eafb9b346123aea8f865"}],"nova/tests/unit/test_quota.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7401a3ccd0b14bd19ac982bd5425c4949ac7e772","unresolved":false,"context_lines":[{"line_number":2146,"context_line":"            mock_get_im_count.assert_not_called()"},{"line_number":2147,"context_line":""},{"line_number":2148,"context_line":"        expected \u003d {\u0027user\u0027: {\u0027server_group_members\u0027: 5}}"},{"line_number":2149,"context_line":"        self.assertDictEqual(expected, counts)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bfb3d3c7_d3cfe8ad","line":2149,"updated":"2019-05-23 18:06:21.000000000","message":"Hm, I\u0027m realizing this test becomes redundant when I add similar checking of user_id and queued_for_delete to the functional test. Thus, I\u0027m going to remove this test in the next PS.","commit_id":"5fa9c168b4e08642bc6a083736e2281c7d4a8058"}]}
