)]}'
{"nova/objects/instance_group.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e806bcb8911fd1333b077634b3a67f0a5ecbecf0","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @staticmethod"},{"line_number":283,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":284,"context_line":"    def _remove_members_in_db(context, group_id, members):"},{"line_number":285,"context_line":"        # There is no public method provided for removing members because the"},{"line_number":286,"context_line":"        # user-facing API doesn\u0027t allow removal of instance group members. We"},{"line_number":287,"context_line":"        # need to be able to remove members to address quota races."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_fdd6bf4f","line":284,"range":{"start_line":284,"start_character":49,"end_line":284,"end_character":56},"updated":"2017-06-08 15:39:24.000000000","message":"We should either have docstring parameters for this, or rename it to be member_instance_uuids or something, since it\u0027s not obvious without reading the code below that this is a list of instance uuids. Actually, just call it instance_uuids like in the add_members method.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9be86f78b433ae04b24a2cbbb664e66482012e92","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @staticmethod"},{"line_number":283,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":284,"context_line":"    def _remove_members_in_db(context, group_id, members):"},{"line_number":285,"context_line":"        # There is no public method provided for removing members because the"},{"line_number":286,"context_line":"        # user-facing API doesn\u0027t allow removal of instance group members. We"},{"line_number":287,"context_line":"        # need to be able to remove members to address quota races."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_e035ebf8","line":284,"range":{"start_line":284,"start_character":49,"end_line":284,"end_character":56},"in_reply_to":"bf091321_081933d6","updated":"2017-06-08 21:39:52.000000000","message":"It\u0027s not consistent with instance_uuids in the add_members method.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb014e37dd371c4ec082ddddef99000b0c734354","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @staticmethod"},{"line_number":283,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":284,"context_line":"    def _remove_members_in_db(context, group_id, members):"},{"line_number":285,"context_line":"        # There is no public method provided for removing members because the"},{"line_number":286,"context_line":"        # user-facing API doesn\u0027t allow removal of instance group members. We"},{"line_number":287,"context_line":"        # need to be able to remove members to address quota races."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_09bdb5b6","line":284,"range":{"start_line":284,"start_character":49,"end_line":284,"end_character":56},"in_reply_to":"bf091321_081933d6","updated":"2017-06-08 17:34:17.000000000","message":"Yeah, I think I was just being consistent with most of the other DB methods. I don\u0027t mind changing it.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f65bc28b2e4636ba2b3ae3efa4c44dc0f04059de","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @staticmethod"},{"line_number":283,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":284,"context_line":"    def _remove_members_in_db(context, group_id, members):"},{"line_number":285,"context_line":"        # There is no public method provided for removing members because the"},{"line_number":286,"context_line":"        # user-facing API doesn\u0027t allow removal of instance group members. We"},{"line_number":287,"context_line":"        # need to be able to remove members to address quota races."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_c61e800b","line":284,"range":{"start_line":284,"start_character":49,"end_line":284,"end_character":56},"in_reply_to":"bf091321_e035ebf8","updated":"2017-06-08 21:51:04.000000000","message":"But ... but ... the other methods!","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ac7ef59206b92b7667712520c5458984b76af618","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @staticmethod"},{"line_number":283,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":284,"context_line":"    def _remove_members_in_db(context, group_id, members):"},{"line_number":285,"context_line":"        # There is no public method provided for removing members because the"},{"line_number":286,"context_line":"        # user-facing API doesn\u0027t allow removal of instance group members. We"},{"line_number":287,"context_line":"        # need to be able to remove members to address quota races."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_081933d6","line":284,"range":{"start_line":284,"start_character":49,"end_line":284,"end_character":56},"in_reply_to":"bf091321_fdd6bf4f","updated":"2017-06-08 16:15:43.000000000","message":"but this is consistent with the rest of the file, feels like a follow on change?","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e806bcb8911fd1333b077634b3a67f0a5ecbecf0","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        for instance_uuid in members:"},{"line_number":289,"context_line":"            context.session.query(api_models.InstanceGroupMember).\\"},{"line_number":290,"context_line":"                    filter_by(group_id\u003dgroup_id).\\"},{"line_number":291,"context_line":"                    filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":292,"context_line":"                    delete()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_3db55732","line":291,"range":{"start_line":291,"start_character":20,"end_line":291,"end_character":58},"updated":"2017-06-08 15:39:24.000000000","message":"Could we use IN to delete all members in a single transaction, like how _instance_group_members_add_by_uuid is using IN?","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ac7ef59206b92b7667712520c5458984b76af618","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        for instance_uuid in members:"},{"line_number":289,"context_line":"            context.session.query(api_models.InstanceGroupMember).\\"},{"line_number":290,"context_line":"                    filter_by(group_id\u003dgroup_id).\\"},{"line_number":291,"context_line":"                    filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":292,"context_line":"                    delete()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_a86c8736","line":291,"range":{"start_line":291,"start_character":20,"end_line":291,"end_character":58},"in_reply_to":"bf091321_3db55732","updated":"2017-06-08 16:15:43.000000000","message":"doesn\u0027t this just add two where clauses to the same transaction? I must be missing something?","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9be86f78b433ae04b24a2cbbb664e66482012e92","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        for instance_uuid in members:"},{"line_number":289,"context_line":"            context.session.query(api_models.InstanceGroupMember).\\"},{"line_number":290,"context_line":"                    filter_by(group_id\u003dgroup_id).\\"},{"line_number":291,"context_line":"                    filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":292,"context_line":"                    delete()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_e01e0b6f","line":291,"range":{"start_line":291,"start_character":20,"end_line":291,"end_character":58},"in_reply_to":"bf091321_a86c8736","updated":"2017-06-08 21:39:52.000000000","message":"I guess I don\u0027t know how the session magic works with the decorator, but I assumed this was 1 call per instance in the list.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb014e37dd371c4ec082ddddef99000b0c734354","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        for instance_uuid in members:"},{"line_number":289,"context_line":"            context.session.query(api_models.InstanceGroupMember).\\"},{"line_number":290,"context_line":"                    filter_by(group_id\u003dgroup_id).\\"},{"line_number":291,"context_line":"                    filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":292,"context_line":"                    delete()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_897305e8","line":291,"range":{"start_line":291,"start_character":20,"end_line":291,"end_character":58},"in_reply_to":"bf091321_a86c8736","updated":"2017-06-08 17:34:17.000000000","message":"I think we probably could use IN to avoid deleting them in a loop like this. I\u0027ll try it.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"}],"nova/tests/functional/db/test_instance_group.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb014e37dd371c4ec082ddddef99000b0c734354","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                                      project_id\u003dself.context.project_id,"},{"line_number":35,"context_line":"                                      name\u003d\u0027foogroup\u0027,"},{"line_number":36,"context_line":"                                      policies\u003d[\u0027foo1\u0027, \u0027foo2\u0027],"},{"line_number":37,"context_line":"                                      members\u003d[\u0027memberfoo\u0027])"},{"line_number":38,"context_line":"        group.update(values)"},{"line_number":39,"context_line":"        group.create()"},{"line_number":40,"context_line":"        return group"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_091ff56c","line":37,"updated":"2017-06-08 17:34:17.000000000","message":"_api_group() adds one member by default.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e806bcb8911fd1333b077634b3a67f0a5ecbecf0","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_remove_members(self):"},{"line_number":136,"context_line":"        create_group \u003d self._api_group()"},{"line_number":137,"context_line":"        new_member \u003d [\u0027memberbar\u0027]"},{"line_number":138,"context_line":"        objects.InstanceGroup.add_members(self.context, create_group.uuid,"},{"line_number":139,"context_line":"                                          new_member)"},{"line_number":140,"context_line":"        objects.InstanceGroup._remove_members_in_db(self.context,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_7d474f1f","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":32},"updated":"2017-06-08 15:39:24.000000000","message":"Can we use the uuids sentinel so this is more realistic, e.g. new_members \u003d [uuids.instance_uuid]?","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f65bc28b2e4636ba2b3ae3efa4c44dc0f04059de","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_remove_members(self):"},{"line_number":136,"context_line":"        create_group \u003d self._api_group()"},{"line_number":137,"context_line":"        new_member \u003d [\u0027memberbar\u0027]"},{"line_number":138,"context_line":"        objects.InstanceGroup.add_members(self.context, create_group.uuid,"},{"line_number":139,"context_line":"                                          new_member)"},{"line_number":140,"context_line":"        objects.InstanceGroup._remove_members_in_db(self.context,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_c6e32005","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":32},"in_reply_to":"bf091321_20040317","updated":"2017-06-08 21:51:04.000000000","message":"Heh. I guess I shouldn\u0027t mention I wrote all of these other tests and for some reason, didn\u0027t use uuidsentinel. :)","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9be86f78b433ae04b24a2cbbb664e66482012e92","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_remove_members(self):"},{"line_number":136,"context_line":"        create_group \u003d self._api_group()"},{"line_number":137,"context_line":"        new_member \u003d [\u0027memberbar\u0027]"},{"line_number":138,"context_line":"        objects.InstanceGroup.add_members(self.context, create_group.uuid,"},{"line_number":139,"context_line":"                                          new_member)"},{"line_number":140,"context_line":"        objects.InstanceGroup._remove_members_in_db(self.context,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_20040317","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":32},"in_reply_to":"bf091321_497dedaf","updated":"2017-06-08 21:39:52.000000000","message":"I know, but we have higher standards Melanie, you and I. :)","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb014e37dd371c4ec082ddddef99000b0c734354","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_remove_members(self):"},{"line_number":136,"context_line":"        create_group \u003d self._api_group()"},{"line_number":137,"context_line":"        new_member \u003d [\u0027memberbar\u0027]"},{"line_number":138,"context_line":"        objects.InstanceGroup.add_members(self.context, create_group.uuid,"},{"line_number":139,"context_line":"                                          new_member)"},{"line_number":140,"context_line":"        objects.InstanceGroup._remove_members_in_db(self.context,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_497dedaf","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":32},"in_reply_to":"bf091321_7d474f1f","updated":"2017-06-08 17:34:17.000000000","message":"Okay, but none of the other tests are and I was staying consistent with that.","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e806bcb8911fd1333b077634b3a67f0a5ecbecf0","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                                    new_member)"},{"line_number":143,"context_line":"        db_group \u003d create_group._get_from_db_by_uuid(self.context,"},{"line_number":144,"context_line":"                                                     create_group.uuid)"},{"line_number":145,"context_line":"        self.assertEqual(create_group.members, db_group.members)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_get_by_uuid(self):"},{"line_number":148,"context_line":"        create_group \u003d self._api_group()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_5d1b6b1a","line":145,"range":{"start_line":145,"start_character":25,"end_line":145,"end_character":45},"updated":"2017-06-08 15:39:24.000000000","message":"This was never refreshed, and was created without any members initially, so it\u0027s kind of cheating isn\u0027t it? Wouldn\u0027t it be better to refresh the group first, e.g.:\n\ncreate_group \u003d objects.InstanceGroup.get_by_uuid(create_group.uuid)?\n\nOr just get that and assert it\u0027s members are empty (or None).","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb014e37dd371c4ec082ddddef99000b0c734354","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                                    new_member)"},{"line_number":143,"context_line":"        db_group \u003d create_group._get_from_db_by_uuid(self.context,"},{"line_number":144,"context_line":"                                                     create_group.uuid)"},{"line_number":145,"context_line":"        self.assertEqual(create_group.members, db_group.members)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_get_by_uuid(self):"},{"line_number":148,"context_line":"        create_group \u003d self._api_group()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_fb4c8477","line":145,"range":{"start_line":145,"start_character":25,"end_line":145,"end_character":45},"in_reply_to":"bf091321_5d1b6b1a","updated":"2017-06-08 17:34:17.000000000","message":"The create_group has one member by default (see L37) so this is asserting it has that one still and that remove didn\u0027t remove all of the members. It\u0027s not that clear since I\u0027m not comparing with [\u0027memberfoo\u0027].","commit_id":"5a04e3882d5a590a19183fa40567b0170f44501c"}]}
