)]}'
{"cinder/api/v2/views/volumes.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0c31af6759915c70ebc3b66d309ddee937159871","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                \u0027encrypted\u0027: self._is_volume_encrypted(volume),"},{"line_number":73,"context_line":"                \u0027replication_status\u0027: volume.get(\u0027replication_status\u0027),"},{"line_number":74,"context_line":"                \u0027consistencygroup_id\u0027: volume.get(\u0027consistencygroup_id\u0027),"},{"line_number":75,"context_line":"                \u0027group_id\u0027: volume.get(\u0027group_id\u0027),"},{"line_number":76,"context_line":"                \u0027multiattach\u0027: volume.get(\u0027multiattach\u0027),"},{"line_number":77,"context_line":"            }"},{"line_number":78,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":48,"id":"9ad45d7e_ecc5a35b","line":75,"updated":"2016-08-09 06:28:27.000000000","message":"Copied views to v3 as well.","commit_id":"02707b94cbd17648b625fc75a98480a4ac214a34"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"ba1c80e21ebb9b2445153922934164aaad714cc5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                \u0027encrypted\u0027: self._is_volume_encrypted(volume),"},{"line_number":73,"context_line":"                \u0027replication_status\u0027: volume.get(\u0027replication_status\u0027),"},{"line_number":74,"context_line":"                \u0027consistencygroup_id\u0027: volume.get(\u0027consistencygroup_id\u0027),"},{"line_number":75,"context_line":"                \u0027group_id\u0027: volume.get(\u0027group_id\u0027),"},{"line_number":76,"context_line":"                \u0027multiattach\u0027: volume.get(\u0027multiattach\u0027),"},{"line_number":77,"context_line":"            }"},{"line_number":78,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":48,"id":"9ad45d7e_2304ee13","line":75,"updated":"2016-08-08 20:55:14.000000000","message":"we shouldn\u0027t be returning a v3 feature value in a v2 api request either.","commit_id":"02707b94cbd17648b625fc75a98480a4ac214a34"}],"cinder/api/v2/volumes.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"a4abfbd202b9e8edd2454a91672f200a0a622e70","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            try:"},{"line_number":263,"context_line":"                kwargs[\u0027group\u0027] \u003d self.group_api.get(context, group_id)"},{"line_number":264,"context_line":"            except exception.GroupNotFound as error:"},{"line_number":265,"context_line":"                raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        size \u003d volume.get(\u0027size\u0027, None)"},{"line_number":268,"context_line":"        if size is None and kwargs[\u0027snapshot\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":48,"id":"9ad45d7e_a79c6b6a","line":265,"updated":"2016-08-08 18:20:17.000000000","message":"why are we changing the v2 API to add a new feature ?\n\nBy adding this here, someone could pass group into the create v2 API and it would work.","commit_id":"02707b94cbd17648b625fc75a98480a4ac214a34"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0c31af6759915c70ebc3b66d309ddee937159871","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            try:"},{"line_number":263,"context_line":"                kwargs[\u0027group\u0027] \u003d self.group_api.get(context, group_id)"},{"line_number":264,"context_line":"            except exception.GroupNotFound as error:"},{"line_number":265,"context_line":"                raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        size \u003d volume.get(\u0027size\u0027, None)"},{"line_number":268,"context_line":"        if size is None and kwargs[\u0027snapshot\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":48,"id":"9ad45d7e_ace44b0d","line":265,"in_reply_to":"9ad45d7e_a79c6b6a","updated":"2016-08-09 06:28:27.000000000","message":"Removed the above v3 specific code, and copied the entire create() function to v3 and added the above group specific code to v3 function only.","commit_id":"02707b94cbd17648b625fc75a98480a4ac214a34"}],"cinder/api/v3/groups.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            new_group \u003d self.group_api.create("},{"line_number":152,"context_line":"                context, name, description, group_type, volume_types,"},{"line_number":153,"context_line":"                availability_zone\u003davailability_zone)"},{"line_number":154,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":155,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":156,"context_line":"        except exception.InvalidGroupType as error:"},{"line_number":157,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_8b5b5b21","line":154,"range":{"start_line":154,"start_character":0,"end_line":154,"end_character":47},"updated":"2016-06-14 21:38:41.000000000","message":"suggest combining the HTTPBadRequest items into a single except line:\n\nexcept(exception.InvalidGroup, exception.InvalidGroupType, exception.InvalidVlumeType) as error:\n\nEven better you should be able to just replace all of those with the parent Invalid exception:\n    except exception.Invalid:\nThat should catch all of those for you since they\u0027re all derived from that base class.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            new_group \u003d self.group_api.create("},{"line_number":152,"context_line":"                context, name, description, group_type, volume_types,"},{"line_number":153,"context_line":"                availability_zone\u003davailability_zone)"},{"line_number":154,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":155,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":156,"context_line":"        except exception.InvalidGroupType as error:"},{"line_number":157,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_fae26700","line":154,"range":{"start_line":154,"start_character":0,"end_line":154,"end_character":47},"in_reply_to":"7aa08908_8b5b5b21","updated":"2016-06-16 03:47:32.000000000","message":"Good idea.  Changed to Invalid.\n\nAlso found I missed a new exception exception.ObjectActionError.  Added it here too.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":158,"context_line":"        except exception.InvalidVolumeType as error:"},{"line_number":159,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":160,"context_line":"        except exception.GroupNotFound as error:"},{"line_number":161,"context_line":"            raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        retval \u003d self._view_builder.summary(req, new_group)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_ebeadf0d","line":160,"range":{"start_line":160,"start_character":0,"end_line":160,"end_character":48},"updated":"2016-06-14 21:38:41.000000000","message":"Why would group_api.create raise a GroupNotFound exception here?","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":158,"context_line":"        except exception.InvalidVolumeType as error:"},{"line_number":159,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":160,"context_line":"        except exception.GroupNotFound as error:"},{"line_number":161,"context_line":"            raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        retval \u003d self._view_builder.summary(req, new_group)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_5ac73b64","line":160,"range":{"start_line":160,"start_character":0,"end_line":160,"end_character":48},"in_reply_to":"7aa08908_ebeadf0d","updated":"2016-06-16 03:47:32.000000000","message":"This is because it calls _group_get in db/sqlalchemy/api.py after creating a group db entry and returns it. It throws an exception.GroupNotFound if for some reason the group db entry is not there.\n\nAlso we could throw VolumeTypeNotFound and GroupTypeNotFound.  So I change it to exception.NotFound to capture all of them.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            group \u003d self.group_api.get("},{"line_number":49,"context_line":"                context,"},{"line_number":50,"context_line":"                group_id\u003did)"},{"line_number":51,"context_line":"        except exception.GroupNotFound as error:"},{"line_number":52,"context_line":"            raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        return self._view_builder.detail(req, group)"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_a42fad86","line":51,"updated":"2016-08-11 09:30:47.000000000","message":"According to patch I09f98921fdc2400cc3f6056e59001100abe06920, we should not catch and re-raise NotFound exceptions here and below","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            group \u003d self.group_api.get("},{"line_number":49,"context_line":"                context,"},{"line_number":50,"context_line":"                group_id\u003did)"},{"line_number":51,"context_line":"        except exception.GroupNotFound as error:"},{"line_number":52,"context_line":"            raise exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        return self._view_builder.detail(req, group)"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_41f7b158","line":51,"in_reply_to":"9ad45d7e_a42fad86","updated":"2016-08-11 13:20:35.000000000","message":"Will do.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        \"\"\"Returns a list of groups through view builder.\"\"\""},{"line_number":107,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":108,"context_line":"        filters \u003d req.params.copy()"},{"line_number":109,"context_line":"        marker, limit, offset \u003d common.get_pagination_params(filters)"},{"line_number":110,"context_line":"        sort_keys, sort_dirs \u003d common.get_sort_params(filters)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        groups \u003d self.group_api.get_all("}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_275a9f2a","line":109,"updated":"2016-08-11 09:30:47.000000000","message":"Thanks for the adding pagination and filters","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return retval"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @wsgi.Controller.api_version(\u00273.12\u0027)"},{"line_number":165,"context_line":"    def update(self, req, id, body):"},{"line_number":166,"context_line":"        \"\"\"Update the group."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_c78e2378","line":165,"updated":"2016-08-11 09:30:47.000000000","message":"Should we use ETags here like we\u0027re going to do with metadata https://review.openstack.org/#/c/328399/?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return retval"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @wsgi.Controller.api_version(\u00273.12\u0027)"},{"line_number":165,"context_line":"    def update(self, req, id, body):"},{"line_number":166,"context_line":"        \"\"\"Update the group."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_546c929b","line":165,"in_reply_to":"9ad45d7e_c78e2378","updated":"2016-08-11 13:20:35.000000000","message":"We don\u0027t have metadata for group.  I think ETags can be done in the future if we decide to add metadata support for a group.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"304da788f7d1d5444f88e185557cef8397782fa7","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":131,"context_line":"        group \u003d body[\u0027group\u0027]"},{"line_number":132,"context_line":"        self.validate_name_and_description(group)"},{"line_number":133,"context_line":"        name \u003d group.get(\u0027name\u0027, None)"},{"line_number":134,"context_line":"        description \u003d group.get(\u0027description\u0027, None)"},{"line_number":135,"context_line":"        group_type \u003d group.get(\u0027group_type\u0027, None)"},{"line_number":136,"context_line":"        if not group_type:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3ac371cc_705eb513","line":133,"range":{"start_line":133,"start_character":32,"end_line":133,"end_character":37},"updated":"2016-08-18 22:07:22.000000000","message":"Default for .get() is None, so these aren\u0027t really necessary. Then again, explicit is better than implicit.","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3f80f530ec4a4b75470dad80541e49d8c2d0e5c2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":131,"context_line":"        group \u003d body[\u0027group\u0027]"},{"line_number":132,"context_line":"        self.validate_name_and_description(group)"},{"line_number":133,"context_line":"        name \u003d group.get(\u0027name\u0027, None)"},{"line_number":134,"context_line":"        description \u003d group.get(\u0027description\u0027, None)"},{"line_number":135,"context_line":"        group_type \u003d group.get(\u0027group_type\u0027, None)"},{"line_number":136,"context_line":"        if not group_type:"}],"source_content_type":"text/x-python","patch_set":61,"id":"1ac06dbe_09ec7bc6","line":133,"range":{"start_line":133,"start_character":32,"end_line":133,"end_character":37},"in_reply_to":"3ac371cc_705eb513","updated":"2016-08-19 17:42:21.000000000","message":"Done","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"}],"cinder/api/v3/volumes.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        return volumes"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @wsgi.response(202)"},{"line_number":74,"context_line":"    def create(self, req, body):"},{"line_number":75,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        if req_version.matches(None, \"3.5\"):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_2b0d07e8","line":74,"range":{"start_line":74,"start_character":14,"end_line":74,"end_character":15},"updated":"2016-06-14 21:38:41.000000000","message":"We need docstrings in the API cod here.  Should include the params and return values as well.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        return volumes"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @wsgi.response(202)"},{"line_number":74,"context_line":"    def create(self, req, body):"},{"line_number":75,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        if req_version.matches(None, \"3.5\"):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_ef59075d","line":74,"range":{"start_line":74,"start_character":14,"end_line":74,"end_character":15},"in_reply_to":"7aa08908_2b0d07e8","updated":"2016-06-16 03:47:32.000000000","message":"Done","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                body.get(\u0027volume\u0027, {}).pop(\u0027group_id\u0027, None)"},{"line_number":80,"context_line":"            except AttributeError:"},{"line_number":81,"context_line":"                msg \u003d _(\"Invalid body provided for creating volume.\")"},{"line_number":82,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return self._create(req, body)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_0be92b7f","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":69},"updated":"2016-06-14 21:38:41.000000000","message":"I suppose the AttributeError isn\u0027t a bad idea, at least it doesn\u0027t hurt.  I do wonder if a little more detail would be useful here... maybe just output the version number even?","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                body.get(\u0027volume\u0027, {}).pop(\u0027group_id\u0027, None)"},{"line_number":80,"context_line":"            except AttributeError:"},{"line_number":81,"context_line":"                msg \u003d _(\"Invalid body provided for creating volume.\")"},{"line_number":82,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return self._create(req, body)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_fa0ee730","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":69},"in_reply_to":"7aa08908_0be92b7f","updated":"2016-06-16 03:47:32.000000000","message":"Done","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4bdfeb578852dfa0392c4595ee88382a98435a49","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if req_version.matches(None, \"3.5\"):"},{"line_number":85,"context_line":"            try:"},{"line_number":86,"context_line":"                body.get(\u0027volume\u0027, {}).pop(\u0027group_id\u0027, None)"},{"line_number":87,"context_line":"            except AttributeError:"},{"line_number":88,"context_line":"                msg \u003d (_(\"Invalid body provided for creating volume. \""},{"line_number":89,"context_line":"                         \"Request API version: %s.\") % req_version)"}],"source_content_type":"text/x-python","patch_set":32,"id":"dada55a8_0ccd0531","line":86,"range":{"start_line":86,"start_character":0,"end_line":86,"end_character":60},"updated":"2016-07-26 20:05:21.000000000","message":"Should probably add something to the docstring to indicate how this is passed in.  It\u0027s fairly obvious that there\u0027s a group_id\u003dxxxx, but should note it and also note what that means and if there are any restrictions?\n\nFor example, are there situations where groups can\u0027t span multiple backends etc?  Is there a requirement that members in the group must be of the same type?\n\nThere are a number of caveats here I think, it might be better to just not do this on create for the sake of not having to deal with scheduling etc.\n\nThe other thing, although it\u0027s too late is I still would have rather used types for this... created a type that indicates a group as opposed to creating yet another set of API\u0027s and code paths for a very small percentage of use cases.","commit_id":"4cbec9bb34ac6f44d86b9febbe0601bee7dd5104"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9e6182a612419aad48b24e27fe8adcbee2a9c29c","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if req_version.matches(None, \"3.5\"):"},{"line_number":85,"context_line":"            try:"},{"line_number":86,"context_line":"                body.get(\u0027volume\u0027, {}).pop(\u0027group_id\u0027, None)"},{"line_number":87,"context_line":"            except AttributeError:"},{"line_number":88,"context_line":"                msg \u003d (_(\"Invalid body provided for creating volume. \""},{"line_number":89,"context_line":"                         \"Request API version: %s.\") % req_version)"}],"source_content_type":"text/x-python","patch_set":32,"id":"dada55a8_c77a9a76","line":86,"range":{"start_line":86,"start_character":0,"end_line":86,"end_character":60},"in_reply_to":"dada55a8_0ccd0531","updated":"2016-07-27 03:56:30.000000000","message":"Hi John,\n\nThe group_id is from a group created with a group_type.  So with this group_id, we\u0027ve already had a group_type.  Also if group_id is passed in, that means we already know which backend is hosting the group and the volume will be created there.  So it won\u0027t go through the scheduler again if a group_id is passed in.\n\nI\u0027ll add more comments to clarify that.","commit_id":"4cbec9bb34ac6f44d86b9febbe0601bee7dd5104"}],"cinder/db/api.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    return IMPL.volume_get_all_by_group(context, group_id, filters\u003dfilters)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def volume_get_all_by_generic_group(context, group_id, filters\u003dNone):"},{"line_number":212,"context_line":"    \"\"\"Get all volumes belonging to a generic volume group.\"\"\""},{"line_number":213,"context_line":"    return IMPL.volume_get_all_by_generic_group(context, group_id,"},{"line_number":214,"context_line":"                                                filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_aba8d720","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":69},"updated":"2016-06-14 21:38:41.000000000","message":"volume_get_all_by_group might be sufficient?","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    return IMPL.volume_get_all_by_group(context, group_id, filters\u003dfilters)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def volume_get_all_by_generic_group(context, group_id, filters\u003dNone):"},{"line_number":212,"context_line":"    \"\"\"Get all volumes belonging to a generic volume group.\"\"\""},{"line_number":213,"context_line":"    return IMPL.volume_get_all_by_generic_group(context, group_id,"},{"line_number":214,"context_line":"                                                filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_afea5faa","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":69},"in_reply_to":"7aa08908_aba8d720","updated":"2016-06-16 03:47:32.000000000","message":"I added \"generic\" to avoid conflict with the existing function on line 206 above which is for consistency groups.  I know this seems silly but there are a few places where I used \"group\" instead of \"consistencygroup\" for CG.  In those cases, I used \"generic group\" for this new generic volume group to differentiate.  I\u0027m afraid renaming the existing names now will add more lines of code:(.  I can clean them up as a follow up patch.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":265,"context_line":"    return IMPL.volume_get_all_by_host(context, host, filters\u003dfilters)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"def volume_get_all_by_group(context, group_id, filters\u003dNone):"},{"line_number":269,"context_line":"    \"\"\"Get all volumes belonging to a consistency group.\"\"\""},{"line_number":270,"context_line":"    return IMPL.volume_get_all_by_group(context, group_id, filters\u003dfilters)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"def volume_get_all_by_generic_group(context, group_id, filters\u003dNone):"},{"line_number":274,"context_line":"    \"\"\"Get all volumes belonging to a generic volume group.\"\"\""},{"line_number":275,"context_line":"    return IMPL.volume_get_all_by_generic_group(context, group_id,"},{"line_number":276,"context_line":"                                                filters\u003dfilters)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"def volume_get_all_by_project(context, project_id, marker, limit,"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_64dc3547","line":276,"range":{"start_line":268,"start_character":0,"end_line":276,"end_character":64},"updated":"2016-08-02 18:58:36.000000000","message":"If we have plans to get rid of cg\u0027s and make them be generic groups with a special type wouldn\u0027t it be easier to have api\u0027s that reference just \"group\" mean generic groups? Otherwise we have just this one api that specifies \"generic_group\" and the \"group\" one above means something different to the other new api\u0027s below...","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":265,"context_line":"    return IMPL.volume_get_all_by_host(context, host, filters\u003dfilters)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"def volume_get_all_by_group(context, group_id, filters\u003dNone):"},{"line_number":269,"context_line":"    \"\"\"Get all volumes belonging to a consistency group.\"\"\""},{"line_number":270,"context_line":"    return IMPL.volume_get_all_by_group(context, group_id, filters\u003dfilters)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"def volume_get_all_by_generic_group(context, group_id, filters\u003dNone):"},{"line_number":274,"context_line":"    \"\"\"Get all volumes belonging to a generic volume group.\"\"\""},{"line_number":275,"context_line":"    return IMPL.volume_get_all_by_generic_group(context, group_id,"},{"line_number":276,"context_line":"                                                filters\u003dfilters)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"def volume_get_all_by_project(context, project_id, marker, limit,"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_f701c705","line":276,"range":{"start_line":268,"start_character":0,"end_line":276,"end_character":64},"in_reply_to":"bacf61ea_64dc3547","updated":"2016-08-03 14:33:19.000000000","message":"Unfortunately I used \"group\" for consistency groups in a few places before \"generic volume groups\" comes up.  I\u0027d like not to change existing code in this patch, but do a clean up after this patch (as this patch is already very big).","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":3666,"context_line":"    req_volume_types \u003d []"},{"line_number":3667,"context_line":"    for mapping in mappings:"},{"line_number":3668,"context_line":"        vol_type \u003d _volume_type_get(context, mapping.volume_type_id)"},{"line_number":3669,"context_line":"        req_volume_types.append(vol_type)"},{"line_number":3670,"context_line":"    return req_volume_types"},{"line_number":3671,"context_line":""},{"line_number":3672,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_077b1bf6","line":3669,"updated":"2016-08-11 09:30:47.000000000","message":"Could  we have more specific SQL query here? Current implementation could call _volume_type_get  many times. It will decrease performance and data consistency could be broken","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":3666,"context_line":"    req_volume_types \u003d []"},{"line_number":3667,"context_line":"    for mapping in mappings:"},{"line_number":3668,"context_line":"        vol_type \u003d _volume_type_get(context, mapping.volume_type_id)"},{"line_number":3669,"context_line":"        req_volume_types.append(vol_type)"},{"line_number":3670,"context_line":"    return req_volume_types"},{"line_number":3671,"context_line":""},{"line_number":3672,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_a1630d41","line":3669,"in_reply_to":"9ad45d7e_077b1bf6","updated":"2016-08-11 13:20:35.000000000","message":"Sure.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":5145,"context_line":"        query \u003d _generate_paginate_query(context, session, marker,"},{"line_number":5146,"context_line":"                                         limit, sort_keys, sort_dirs, filters,"},{"line_number":5147,"context_line":"                                         offset, models.Group)"},{"line_number":5148,"context_line":"        if query is None:"},{"line_number":5149,"context_line":"            return []"},{"line_number":5150,"context_line":""},{"line_number":5151,"context_line":"        return query.all()"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_a78e8fcd","line":5148,"updated":"2016-08-11 09:30:47.000000000","message":"nit: could be simplified to:\nreturn query.all if query else []","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":5145,"context_line":"        query \u003d _generate_paginate_query(context, session, marker,"},{"line_number":5146,"context_line":"                                         limit, sort_keys, sort_dirs, filters,"},{"line_number":5147,"context_line":"                                         offset, models.Group)"},{"line_number":5148,"context_line":"        if query is None:"},{"line_number":5149,"context_line":"            return []"},{"line_number":5150,"context_line":""},{"line_number":5151,"context_line":"        return query.all()"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_8169a9fb","line":5148,"in_reply_to":"9ad45d7e_a78e8fcd","updated":"2016-08-11 13:20:35.000000000","message":"Sure.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":5237,"context_line":"    session \u003d get_session()"},{"line_number":5238,"context_line":"    with session.begin():"},{"line_number":5239,"context_line":"        result \u003d model_query(context, models.Group,"},{"line_number":5240,"context_line":"                             project_only\u003dTrue).\\"},{"line_number":5241,"context_line":"            filter_by(id\u003dgroup_id).\\"},{"line_number":5242,"context_line":"            first()"},{"line_number":5243,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_2770dfdb","line":5240,"updated":"2016-08-11 09:30:47.000000000","message":"Please, do not use \u0027\\\u0027 here","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":5237,"context_line":"    session \u003d get_session()"},{"line_number":5238,"context_line":"    with session.begin():"},{"line_number":5239,"context_line":"        result \u003d model_query(context, models.Group,"},{"line_number":5240,"context_line":"                             project_only\u003dTrue).\\"},{"line_number":5241,"context_line":"            filter_by(id\u003dgroup_id).\\"},{"line_number":5242,"context_line":"            first()"},{"line_number":5243,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_217b9dc2","line":5240,"in_reply_to":"9ad45d7e_2770dfdb","updated":"2016-08-11 13:20:35.000000000","message":"Sure.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"}],"cinder/db/sqlalchemy/migrate_repo/versions/076_add_groups_and_group_volume_type_mapping_table.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    # New group_volume_type_mapping table"},{"line_number":65,"context_line":"    Table(\u0027volume_types\u0027, meta, autoload\u003dTrue)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    grp_vt_mapping \u003d Table("},{"line_number":68,"context_line":"        \u0027group_volume_type_mapping\u0027, meta,"},{"line_number":69,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":70,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_0e0ad91f","line":67,"range":{"start_line":67,"start_character":0,"end_line":67,"end_character":27},"updated":"2016-06-14 21:38:41.000000000","message":"Do we need a mapping table as opposed to just a volume_type_group entry  with the FK?  Mostly the same thing you have here but slightly less confusing for some maybe?","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    # New group_volume_type_mapping table"},{"line_number":65,"context_line":"    Table(\u0027volume_types\u0027, meta, autoload\u003dTrue)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    grp_vt_mapping \u003d Table("},{"line_number":68,"context_line":"        \u0027group_volume_type_mapping\u0027, meta,"},{"line_number":69,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":70,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_4f765b07","line":67,"range":{"start_line":67,"start_character":0,"end_line":67,"end_character":27},"in_reply_to":"7aa08908_0e0ad91f","updated":"2016-06-16 03:47:32.000000000","message":"I want this to be simpler too but I think a table is needed here because we could have many to many relationship.  A group could have more than one volume types and the same volume type can be used in more than one groups.  So adding one column as FK is not enough to capture many to many relationship.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"}],"cinder/db/sqlalchemy/migrate_repo/versions/078_add_groups_and_group_volume_type_mapping_table.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"e0fe31a344a745b236772222dd4b078800588601","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    qci.execute({\u0027created_at\u0027: CREATED_AT,"},{"line_number":99,"context_line":"                 \u0027class_name\u0027: CLASS_NAME,"},{"line_number":100,"context_line":"                 \u0027resource\u0027: \u0027groups\u0027,"},{"line_number":101,"context_line":"                 \u0027hard_limit\u0027: CONF.quota_groups,"},{"line_number":102,"context_line":"                 \u0027deleted\u0027: False, })"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_c8f4c188","line":101,"updated":"2016-08-16 17:33:19.000000000","message":"According to https://bugs.launchpad.net/cinder/+bug/1465393 we don\u0027t want to have migrations depends on config","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5d560884d5c0da05c0941f44449edd0e41caef96","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    qci.execute({\u0027created_at\u0027: CREATED_AT,"},{"line_number":99,"context_line":"                 \u0027class_name\u0027: CLASS_NAME,"},{"line_number":100,"context_line":"                 \u0027resource\u0027: \u0027groups\u0027,"},{"line_number":101,"context_line":"                 \u0027hard_limit\u0027: CONF.quota_groups,"},{"line_number":102,"context_line":"                 \u0027deleted\u0027: False, })"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_1d6a87ee","line":101,"in_reply_to":"3ac371cc_c8f4c188","updated":"2016-08-17 01:12:10.000000000","message":"Changed to use a constant defined in this file.  Let me know if this is okay.","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ea0771190f8f5dc21f11446942a2a6361de8b0b0","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    source_cgid \u003d Column(String(36))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class Group(BASE, CinderBase):"},{"line_number":104,"context_line":"    \"\"\"Represents a generic volume group.\"\"\""},{"line_number":105,"context_line":"    __tablename__ \u003d \u0027groups\u0027"},{"line_number":106,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_0e21399e","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":30},"updated":"2016-06-14 21:38:41.000000000","message":"So if we use Group as the standard for VolumeGroups (I think that\u0027s great), then using simple things like \"\u003cresource\u003eGroup\" seems like it would make the most sense for other things.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cc446b77b8bc07558a5e63ea4b92c0794cf8c8a9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    source_cgid \u003d Column(String(36))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class Group(BASE, CinderBase):"},{"line_number":104,"context_line":"    \"\"\"Represents a generic volume group.\"\"\""},{"line_number":105,"context_line":"    __tablename__ \u003d \u0027groups\u0027"},{"line_number":106,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_ef3aa733","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":30},"in_reply_to":"7aa08908_0e21399e","updated":"2016-06-16 03:47:32.000000000","message":"Sure.","commit_id":"43f606b5a51750a48efa563bceaa5798f12fbd9d"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":837,"context_line":"        primaryjoin\u003d\u0027Worker.service_id \u003d\u003d Service.id\u0027)"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"def register_models():"},{"line_number":841,"context_line":"    \"\"\"Register Models and create metadata."},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"    Called from cinder.db.sqlalchemy.__init__ as part of loading the driver,"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_425501f8","line":840,"updated":"2016-08-11 09:30:47.000000000","message":"This method was removed in I2f63bb4e7a2d4ace9e9d781f63a33153b61aab94. Why do we need it again?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":837,"context_line":"        primaryjoin\u003d\u0027Worker.service_id \u003d\u003d Service.id\u0027)"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"def register_models():"},{"line_number":841,"context_line":"    \"\"\"Register Models and create metadata."},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"    Called from cinder.db.sqlalchemy.__init__ as part of loading the driver,"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_810a4988","line":840,"in_reply_to":"9ad45d7e_425501f8","updated":"2016-08-11 13:20:35.000000000","message":"I think that patch was merged after my group types patch was merged.  This groups patch was dependent on the group types patch.  I didn\u0027t realize this method was removed.  Thanks for pointing out!  I\u0027ll remove it.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"}],"cinder/group/api.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                    \"but current status is: %s\") % group.status"},{"line_number":274,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        # snapshot_group \u003d objects.SnapshotGroupList.get_all_by_group("},{"line_number":277,"context_line":"        #     context.elevated(), group.id)"},{"line_number":278,"context_line":"        # if snapshot_group:"},{"line_number":279,"context_line":"        #     msg \u003d _(\"Group %s still has dependent \""},{"line_number":280,"context_line":"        #             \"snapshot group.\") % group.id"},{"line_number":281,"context_line":"        #     LOG.error(msg)"},{"line_number":282,"context_line":"        #     raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        volumes \u003d self.db.volume_get_all_by_generic_group(context.elevated(),"},{"line_number":285,"context_line":"                                                          group.id)"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_648275ca","line":282,"range":{"start_line":276,"start_character":8,"end_line":282,"end_character":54},"updated":"2016-08-02 18:58:36.000000000","message":"Probably should remove commented out code","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                    \"but current status is: %s\") % group.status"},{"line_number":274,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        # snapshot_group \u003d objects.SnapshotGroupList.get_all_by_group("},{"line_number":277,"context_line":"        #     context.elevated(), group.id)"},{"line_number":278,"context_line":"        # if snapshot_group:"},{"line_number":279,"context_line":"        #     msg \u003d _(\"Group %s still has dependent \""},{"line_number":280,"context_line":"        #             \"snapshot group.\") % group.id"},{"line_number":281,"context_line":"        #     LOG.error(msg)"},{"line_number":282,"context_line":"        #     raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        volumes \u003d self.db.volume_get_all_by_generic_group(context.elevated(),"},{"line_number":285,"context_line":"                                                          group.id)"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_054a6883","line":282,"range":{"start_line":276,"start_character":8,"end_line":282,"end_character":54},"in_reply_to":"bacf61ea_648275ca","updated":"2016-08-03 14:33:19.000000000","message":"Done","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if availability_zone in self.availability_zone_names:"},{"line_number":94,"context_line":"            return True"},{"line_number":95,"context_line":"        if CONF.storage_availability_zone \u003d\u003d availability_zone:"},{"line_number":96,"context_line":"            return True"},{"line_number":97,"context_line":"        azs \u003d self.volume_api.list_availability_zones()"},{"line_number":98,"context_line":"        self.availability_zone_names \u003d [az[\u0027name\u0027] for az in azs]"},{"line_number":99,"context_line":"        return availability_zone in self.availability_zone_names"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_62f7658b","line":96,"updated":"2016-08-11 09:30:47.000000000","message":"Why do we ignore allow_availability_zone_fallback option here?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if availability_zone in self.availability_zone_names:"},{"line_number":94,"context_line":"            return True"},{"line_number":95,"context_line":"        if CONF.storage_availability_zone \u003d\u003d availability_zone:"},{"line_number":96,"context_line":"            return True"},{"line_number":97,"context_line":"        azs \u003d self.volume_api.list_availability_zones()"},{"line_number":98,"context_line":"        self.availability_zone_names \u003d [az[\u0027name\u0027] for az in azs]"},{"line_number":99,"context_line":"        return availability_zone in self.availability_zone_names"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_21627d0a","line":96,"in_reply_to":"9ad45d7e_62f7658b","updated":"2016-08-11 13:20:35.000000000","message":"Will add it.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        add_volumes_new \u003d \"\""},{"line_number":344,"context_line":"        remove_volumes_new \u003d \"\""},{"line_number":345,"context_line":"        if add_volumes_list:"},{"line_number":346,"context_line":"            add_volumes_new \u003d self._validate_add_volumes("},{"line_number":347,"context_line":"                context, volumes, add_volumes_list, group)"},{"line_number":348,"context_line":"        if remove_volumes_list:"},{"line_number":349,"context_line":"            remove_volumes_new \u003d self._validate_remove_volumes("}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_5d404034","line":346,"updated":"2016-08-11 09:30:47.000000000","message":"What will happen if somebody deletes volume after line #332 was executed","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        add_volumes_new \u003d \"\""},{"line_number":344,"context_line":"        remove_volumes_new \u003d \"\""},{"line_number":345,"context_line":"        if add_volumes_list:"},{"line_number":346,"context_line":"            add_volumes_new \u003d self._validate_add_volumes("},{"line_number":347,"context_line":"                context, volumes, add_volumes_list, group)"},{"line_number":348,"context_line":"        if remove_volumes_list:"},{"line_number":349,"context_line":"            remove_volumes_new \u003d self._validate_remove_volumes("}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_34a59e46","line":346,"in_reply_to":"9ad45d7e_5d404034","updated":"2016-08-11 13:20:35.000000000","message":"We catch it on line 428 and raise VolumeNotFound.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"5d2ef428f8fa432e7255b88d90750311c4afcc08","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    cinder.policy.enforce(context, _action, target)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class API(base.Base):"},{"line_number":89,"context_line":"    \"\"\"API for interacting with the volume manager for groups.\"\"\""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __init__(self, db_driver\u003dNone):"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_3deaea0f","line":88,"updated":"2016-08-16 21:16:41.000000000","message":"Please, add unit-tests to this class","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5d560884d5c0da05c0941f44449edd0e41caef96","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    cinder.policy.enforce(context, _action, target)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class API(base.Base):"},{"line_number":89,"context_line":"    \"\"\"API for interacting with the volume manager for groups.\"\"\""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __init__(self, db_driver\u003dNone):"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_3d4ca39d","line":88,"in_reply_to":"3ac371cc_3deaea0f","updated":"2016-08-17 01:12:10.000000000","message":"Tests under https://review.openstack.org/#/c/322459/58/cinder/tests/unit/api/v3/test_groups.py are testing this class.  Is that good?","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"5d2ef428f8fa432e7255b88d90750311c4afcc08","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def _validate_remove_volumes(self, volumes, remove_volumes_list, group):"},{"line_number":405,"context_line":"        # Validate volumes in remove_volumes."},{"line_number":406,"context_line":"        remove_volumes_new \u003d \"\""},{"line_number":407,"context_line":"        for volume in volumes:"},{"line_number":408,"context_line":"            if volume[\u0027id\u0027] in remove_volumes_list:"},{"line_number":409,"context_line":"                if volume[\u0027status\u0027] not in VALID_REMOVE_VOL_FROM_GROUP_STATUS:"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_42ef0587","line":406,"updated":"2016-08-16 21:16:41.000000000","message":"Why do we use string instead list of ID\u0027s here and below?","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5d560884d5c0da05c0941f44449edd0e41caef96","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def _validate_remove_volumes(self, volumes, remove_volumes_list, group):"},{"line_number":405,"context_line":"        # Validate volumes in remove_volumes."},{"line_number":406,"context_line":"        remove_volumes_new \u003d \"\""},{"line_number":407,"context_line":"        for volume in volumes:"},{"line_number":408,"context_line":"            if volume[\u0027id\u0027] in remove_volumes_list:"},{"line_number":409,"context_line":"                if volume[\u0027status\u0027] not in VALID_REMOVE_VOL_FROM_GROUP_STATUS:"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_7d10db59","line":406,"in_reply_to":"3ac371cc_42ef0587","updated":"2016-08-17 01:12:10.000000000","message":"I\u0027m converting to a string to pass it in the RPC call.  See line 402.","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"}],"cinder/objects/fields.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"86a15cf79dd2f1e2907995f154465a4522076e5d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    ALL \u003d (ERROR, AVAILABLE, CREATING, DELETING, DELETED,"},{"line_number":78,"context_line":"           UPDATING, IN_USE, ERROR_DELETING)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(GroupStatus, self).__init__("},{"line_number":82,"context_line":"            valid_values\u003dGroupStatus.ALL)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_25e2922f","line":80,"updated":"2016-08-11 10:48:16.000000000","message":"NOTE: we won\u0027t need this method if we decide to merge https://review.openstack.org/#/c/353977/","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    ALL \u003d (ERROR, AVAILABLE, CREATING, DELETING, DELETED,"},{"line_number":78,"context_line":"           UPDATING, IN_USE, ERROR_DELETING)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(GroupStatus, self).__init__("},{"line_number":82,"context_line":"            valid_values\u003dGroupStatus.ALL)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_b43d0edf","line":80,"in_reply_to":"9ad45d7e_25e2922f","updated":"2016-08-11 13:20:35.000000000","message":"Got it.  Will change accordingly if your patch is merged.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"}],"cinder/objects/group.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027volume_types changed\u0027))"},{"line_number":121,"context_line":"            if \u0027volumes\u0027 in updates:"},{"line_number":122,"context_line":"                raise exception.ObjectActionError("},{"line_number":123,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027volumes changed\u0027))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            db.group_update(self._context, self.id, updates)"},{"line_number":126,"context_line":"            self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_7750655f","line":123,"updated":"2016-08-02 18:58:36.000000000","message":"Any chance we could elaborate on why \"volumes changed\" is an error in the _reason? At first glance it looks like you can\u0027t change volumes in a group... which isn\u0027t right, its that you don\u0027t change them by modifying \u0027volumes\u0027 property of the group object (although maybe we could/should?)","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027volume_types changed\u0027))"},{"line_number":121,"context_line":"            if \u0027volumes\u0027 in updates:"},{"line_number":122,"context_line":"                raise exception.ObjectActionError("},{"line_number":123,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027volumes changed\u0027))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            db.group_update(self._context, self.id, updates)"},{"line_number":126,"context_line":"            self.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_45d100cd","line":123,"in_reply_to":"bacf61ea_7750655f","updated":"2016-08-03 14:33:19.000000000","message":"This is a copy and paste from other object save functions.  It says you cannot change volumes and volume_types as part of the group object update.  I reworded the message.","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/scheduler/driver.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    return volume"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def group_update_db(context, group, host):"},{"line_number":60,"context_line":"    \"\"\"Set the host and the scheduled_at field of a consistencygroup."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    :returns: A Consistencygroup with the updated fields set properly."},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    group.update({\u0027host\u0027: host, \u0027updated_at\u0027: timeutils.utcnow()})"},{"line_number":65,"context_line":"    group.save()"},{"line_number":66,"context_line":"    return group"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def generic_group_update_db(context, group, host):"},{"line_number":70,"context_line":"    \"\"\"Set the host and the scheduled_at field of a group."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :returns: A Group with the updated fields set properly."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    group.update({\u0027host\u0027: host, \u0027updated_at\u0027: timeutils.utcnow()})"},{"line_number":75,"context_line":"    group.save()"},{"line_number":76,"context_line":"    return group"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Scheduler(object):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_c402410b","line":76,"range":{"start_line":59,"start_character":0,"end_line":76,"end_character":16},"updated":"2016-08-02 18:58:36.000000000","message":"I\u0027d prefer \"group_update_db\" was the one we used with the generic groups and to have a specialized cg one we remove later.","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    return volume"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def group_update_db(context, group, host):"},{"line_number":60,"context_line":"    \"\"\"Set the host and the scheduled_at field of a consistencygroup."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    :returns: A Consistencygroup with the updated fields set properly."},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    group.update({\u0027host\u0027: host, \u0027updated_at\u0027: timeutils.utcnow()})"},{"line_number":65,"context_line":"    group.save()"},{"line_number":66,"context_line":"    return group"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def generic_group_update_db(context, group, host):"},{"line_number":70,"context_line":"    \"\"\"Set the host and the scheduled_at field of a group."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :returns: A Group with the updated fields set properly."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    group.update({\u0027host\u0027: host, \u0027updated_at\u0027: timeutils.utcnow()})"},{"line_number":75,"context_line":"    group.save()"},{"line_number":76,"context_line":"    return group"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Scheduler(object):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_259ccc5c","line":76,"range":{"start_line":59,"start_character":0,"end_line":76,"end_character":16},"in_reply_to":"bacf61ea_c402410b","updated":"2016-08-03 14:33:19.000000000","message":"I\u0027d like that too, but I made the mistake by using \"group\" for consistency groups in a few places in the past.  I\u0027m trying not to change existing code in this patch.  How about I do a rename all after this one?","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/scheduler/filter_scheduler.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return weighed_hosts"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def _get_weighted_candidates_generic_group("},{"line_number":436,"context_line":"            self, context, group_spec, request_spec_list,"},{"line_number":437,"context_line":"            group_filter_properties\u003dNone,"},{"line_number":438,"context_line":"            filter_properties_list\u003dNone):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_f750d50c","line":435,"updated":"2016-08-02 18:58:36.000000000","message":"Here too, lets try and get everything consistent (heh) where \"group\" methods mean generic group, and \"consistency_group\" means consistency group","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return weighed_hosts"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def _get_weighted_candidates_generic_group("},{"line_number":436,"context_line":"            self, context, group_spec, request_spec_list,"},{"line_number":437,"context_line":"            group_filter_properties\u003dNone,"},{"line_number":438,"context_line":"            filter_properties_list\u003dNone):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_e5a3d4af","line":435,"in_reply_to":"bacf61ea_f750d50c","updated":"2016-08-03 14:33:19.000000000","message":"I\u0027m trying not to rename the existing methods about consistency groups.  Unfortunately I was not consistent before and used \"group\" for consistency groups in a few places.  Can I do a rename all after this?","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/scheduler/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"0dc0e3672ee8a3e25e37a67e1ffc8248954f32f8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                     filter_properties_list\u003dNone):"},{"line_number":89,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":90,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":91,"context_line":"        request_spec_p_list \u003d []"},{"line_number":92,"context_line":"        for request_spec in request_spec_list:"},{"line_number":93,"context_line":"            request_spec_p \u003d jsonutils.to_primitive(request_spec)"},{"line_number":94,"context_line":"            request_spec_p_list.append(request_spec_p)"},{"line_number":95,"context_line":"        group_spec_p \u003d jsonutils.to_primitive(group_spec)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        return cctxt.cast(ctxt, \u0027create_group\u0027,"},{"line_number":98,"context_line":"                          topic\u003dtopic,"}],"source_content_type":"text/x-python","patch_set":66,"id":"fa7ab95a_32f6ee8f","line":95,"range":{"start_line":91,"start_character":0,"end_line":95,"end_character":57},"updated":"2016-08-26 14:17:27.000000000","message":"Came late to the party, but still - this is adding new dictionaries without a defined structure sent over RPC instead of o.vo\u0027s. While I dislike that, we can address that in Ocata as we haven\u0027t even completed the transition to RequestSpec object.","commit_id":"8c74c74695043eb7a468028edb049a1611b87e77"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"a292f3d348667e21ee01eca48ee1a9c9f6620fe8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                     filter_properties_list\u003dNone):"},{"line_number":89,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":90,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":91,"context_line":"        request_spec_p_list \u003d []"},{"line_number":92,"context_line":"        for request_spec in request_spec_list:"},{"line_number":93,"context_line":"            request_spec_p \u003d jsonutils.to_primitive(request_spec)"},{"line_number":94,"context_line":"            request_spec_p_list.append(request_spec_p)"},{"line_number":95,"context_line":"        group_spec_p \u003d jsonutils.to_primitive(group_spec)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        return cctxt.cast(ctxt, \u0027create_group\u0027,"},{"line_number":98,"context_line":"                          topic\u003dtopic,"}],"source_content_type":"text/x-python","patch_set":66,"id":"fa7ab95a_8663f819","line":95,"range":{"start_line":91,"start_character":0,"end_line":95,"end_character":57},"in_reply_to":"fa7ab95a_32f6ee8f","updated":"2016-08-26 14:58:54.000000000","message":"Sure.  I can definitely change this to ovo in Ocata.  Thanks!","commit_id":"8c74c74695043eb7a468028edb049a1611b87e77"}],"cinder/tests/unit/api/v3/test_groups.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2cc73c30c9e4d72d696a0284f554157c4286f8a1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        group.host \u003d host"},{"line_number":76,"context_line":"        group.status \u003d status"},{"line_number":77,"context_line":"        group.update(kwargs)"},{"line_number":78,"context_line":"        group.create()"},{"line_number":79,"context_line":"        return group"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _create_volume_type("}],"source_content_type":"text/x-python","patch_set":61,"id":"1ac06dbe_11578703","line":78,"updated":"2016-08-19 13:47:08.000000000","message":"Please, add \u0027self.addCleanup(group.destroy)\u0027 to not copy-paste destroy all in each test","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3f80f530ec4a4b75470dad80541e49d8c2d0e5c2","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        group.host \u003d host"},{"line_number":76,"context_line":"        group.status \u003d status"},{"line_number":77,"context_line":"        group.update(kwargs)"},{"line_number":78,"context_line":"        group.create()"},{"line_number":79,"context_line":"        return group"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _create_volume_type("}],"source_content_type":"text/x-python","patch_set":61,"id":"1ac06dbe_be7e36ac","line":78,"in_reply_to":"1ac06dbe_11578703","updated":"2016-08-19 17:42:21.000000000","message":"Done","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2cc73c30c9e4d72d696a0284f554157c4286f8a1","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                                           objects\u003dvol_type_objs)"},{"line_number":311,"context_line":"        mock_vol_type_get_all_by_group.return_value \u003d vol_types"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        group1 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":314,"context_line":"        group2 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":315,"context_line":"        group3 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":316,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v3/%s/groups/detail\u0027 %"}],"source_content_type":"text/x-python","patch_set":61,"id":"1ac06dbe_11a5c703","line":313,"updated":"2016-08-19 13:47:08.000000000","message":"Could we move groups creation to setUp method?","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3f80f530ec4a4b75470dad80541e49d8c2d0e5c2","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                                           objects\u003dvol_type_objs)"},{"line_number":311,"context_line":"        mock_vol_type_get_all_by_group.return_value \u003d vol_types"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        group1 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":314,"context_line":"        group2 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":315,"context_line":"        group3 \u003d self._create_group(volume_type_ids\u003dvolume_type_ids)"},{"line_number":316,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v3/%s/groups/detail\u0027 %"}],"source_content_type":"text/x-python","patch_set":61,"id":"1ac06dbe_0940fb55","line":313,"in_reply_to":"1ac06dbe_11a5c703","updated":"2016-08-19 17:42:21.000000000","message":"Done","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"}],"cinder/volume/driver.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6fefed21cf0299301c1a7b65faf6cec10bbf605b","unresolved":false,"context_lines":[{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."},{"line_number":1726,"context_line":""},{"line_number":1727,"context_line":"        :param context: the context of the caller."}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_d2008d68","line":1724,"updated":"2016-08-11 20:37:22.000000000","message":"This seems to fundamentally be a manger operation and not a driver operation.  Why do we need a driver method for this?  (Same thinking as the group snapshots patch.)","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"8c65e171c7ebcba742cd704a84d4eb67b0b0500b","unresolved":false,"context_lines":[{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."},{"line_number":1726,"context_line":""},{"line_number":1727,"context_line":"        :param context: the context of the caller."}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_f09e5261","line":1724,"in_reply_to":"9ad45d7e_d2008d68","updated":"2016-08-11 21:17:55.000000000","message":"Hi Eric,\n\nI have addressed your comments in a similar way as in the group snapshots patch.  See here:\n\nhttps://review.openstack.org/#/c/322459/49/cinder/volume/manager.py #2468\n\nIf driver has implemented this method, we\u0027ll use the driver method; otherwise we have a generic method in the manager to take care of it.  Thanks!","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"304da788f7d1d5444f88e185557cef8397782fa7","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":61,"id":"3ac371cc_901ff1b6","line":1722,"range":{"start_line":1722,"start_character":6,"end_line":1722,"end_character":13},"updated":"2016-08-18 22:07:22.000000000","message":"I\u0027m not big on creating more of these ABC classes, but until we redo our approach to using the ABC inheritance we have it probably is better to be consistent and do this.","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"79d55578af65a23e5aed91aaa81713897cbbb906","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":61,"id":"3ac371cc_b345cdb4","line":1722,"range":{"start_line":1722,"start_character":6,"end_line":1722,"end_character":13},"in_reply_to":"3ac371cc_901ff1b6","updated":"2016-08-19 03:19:21.000000000","message":"I don\u0027t like ABC either.  Just trying to be consistent for now.  I can definitely change this once we have a better approach.","commit_id":"4941a05954a7b38077c01556b5d1b88a97d0da9b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6bf15347aca44cc980d407c071c63a65b94dc557","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_ad3ea125","line":1722,"updated":"2016-08-22 20:34:40.000000000","message":"We should avoid creating a GroupVD for this since we\u0027re currently working on removing the *VD abc classes.\n\nhttps://review.openstack.org/#/c/351346/","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"5d3539a4bb840c2f2600ac64c366bc199262158d","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_fcb96816","line":1722,"in_reply_to":"1ac06dbe_ad3ea125","updated":"2016-08-22 20:35:42.000000000","message":"And also since it\u0027s not clear what this means since the volume manager can create them anyway.  (Which is why I think this should not touch the driver interface at all.)","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d556cb4d494958723c94edd8ff54f4d47c387493","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_8b3c3ac9","line":1722,"in_reply_to":"1ac06dbe_d0c3ad87","updated":"2016-08-23 14:26:07.000000000","message":"Removed GroupVD and moved the methods to BaseVD after talking to Eric.","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"27c623c354d278001c664077e00bd197f8e881e3","unresolved":false,"context_lines":[{"line_number":1719,"context_line":""},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1722,"context_line":"class GroupVD(object):"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    def create_group(self, context, group):"},{"line_number":1725,"context_line":"        \"\"\"Creates a group."}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_d0c3ad87","line":1722,"in_reply_to":"1ac06dbe_fcb96816","updated":"2016-08-22 21:59:54.000000000","message":"Hi Eric,\n\nThat patch is work in progress.  So what do you suggest me to do?  Remove GroupVD but add new driver methods in BaseVD?\n\nThis is needed for drivers that can support consistency group.  In this case, driver needs to call a specific API to create the group which we cannot do in the manager.\n\nThanks!","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a75f56dce08bb975baf7bc55abe6ce362a394c6c","unresolved":false,"context_lines":[{"line_number":1782,"context_line":"        For a successful operation, the driver can either build the"},{"line_number":1783,"context_line":"        model_update and volumes_model_update and return them or"},{"line_number":1784,"context_line":"        return None, None. The statuses of the group and all volumes"},{"line_number":1785,"context_line":"        will be set to \u0027deleted\u0027 after the manager deletes them from db."},{"line_number":1786,"context_line":"        \"\"\""},{"line_number":1787,"context_line":"        raise NotImplementedError()"},{"line_number":1788,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_9fb2e604","line":1785,"updated":"2016-08-22 21:04:28.000000000","message":"What about cases of partial failure, where a driver deletes two of five volumes, and has to report back that the quota is still being used for three of them, but two were deleted successfully?\n\nDoes this work with that?","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"27c623c354d278001c664077e00bd197f8e881e3","unresolved":false,"context_lines":[{"line_number":1782,"context_line":"        For a successful operation, the driver can either build the"},{"line_number":1783,"context_line":"        model_update and volumes_model_update and return them or"},{"line_number":1784,"context_line":"        return None, None. The statuses of the group and all volumes"},{"line_number":1785,"context_line":"        will be set to \u0027deleted\u0027 after the manager deletes them from db."},{"line_number":1786,"context_line":"        \"\"\""},{"line_number":1787,"context_line":"        raise NotImplementedError()"},{"line_number":1788,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"1ac06dbe_90ebf577","line":1785,"in_reply_to":"1ac06dbe_9fb2e604","updated":"2016-08-22 21:59:54.000000000","message":"If there is a problem deleting any volume, the status of the group will be set to error and exception will be raised in the manager.  In this case, admin will have to decide how to change the quota based on the group status and statuses of the volumes.  Let me know if you have a different suggestion.  Thanks!","commit_id":"04e0ae4eb2a2755378ddf23f29c21bb03e2c702b"}],"cinder/volume/drivers/lvm.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":809,"context_line":"        # This driver just returns a status"},{"line_number":810,"context_line":"        now \u003d timeutils.utcnow()"},{"line_number":811,"context_line":"        model_update \u003d {\u0027status\u0027: fields.GroupStatus.AVAILABLE,"},{"line_number":812,"context_line":"                        \u0027updated_at\u0027: now}"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"        return model_update"},{"line_number":815,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_77ab45d7","line":812,"updated":"2016-08-02 18:58:36.000000000","message":"Thats interesting, why does the driver have to put an updated_at time in?","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":809,"context_line":"        # This driver just returns a status"},{"line_number":810,"context_line":"        now \u003d timeutils.utcnow()"},{"line_number":811,"context_line":"        model_update \u003d {\u0027status\u0027: fields.GroupStatus.AVAILABLE,"},{"line_number":812,"context_line":"                        \u0027updated_at\u0027: now}"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"        return model_update"},{"line_number":815,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_85c49892","line":812,"in_reply_to":"bacf61ea_77ab45d7","updated":"2016-08-03 14:33:19.000000000","message":"Should be \u0027created_at\u0027.","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/volume/flows/api/create_volume.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"REPLICA_PROCEED_STATUS \u003d (\u0027active\u0027, \u0027active-stopped\u0027,)"},{"line_number":48,"context_line":"CG_PROCEED_STATUS \u003d (\u0027available\u0027, \u0027creating\u0027,)"},{"line_number":49,"context_line":"CGSNAPSHOT_PROCEED_STATUS \u003d (\u0027available\u0027,)"},{"line_number":50,"context_line":"GRP_PROCEED_STATUS \u003d (\u0027available\u0027, \u0027creating\u0027,)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class ExtractVolumeRequestTask(flow_utils.CinderTask):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_b7e3fd32","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":18},"updated":"2016-08-02 18:58:36.000000000","message":"If it fits on the lines can we change GRP to GROUP? Two letters and a whole lot more clear is a good trade off imo","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"REPLICA_PROCEED_STATUS \u003d (\u0027active\u0027, \u0027active-stopped\u0027,)"},{"line_number":48,"context_line":"CG_PROCEED_STATUS \u003d (\u0027available\u0027, \u0027creating\u0027,)"},{"line_number":49,"context_line":"CGSNAPSHOT_PROCEED_STATUS \u003d (\u0027available\u0027,)"},{"line_number":50,"context_line":"GRP_PROCEED_STATUS \u003d (\u0027available\u0027, \u0027creating\u0027,)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class ExtractVolumeRequestTask(flow_utils.CinderTask):"}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_4a6d8f03","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":18},"in_reply_to":"bacf61ea_b7e3fd32","updated":"2016-08-03 14:33:19.000000000","message":"Done","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"}],"cinder/volume/manager.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":2476,"context_line":"                           \u0027id\u0027: group.id})"},{"line_number":2477,"context_line":"        return group"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"    def create_group(self, context, group):"},{"line_number":2480,"context_line":"        \"\"\"Creates the group.\"\"\""},{"line_number":2481,"context_line":"        context \u003d context.elevated()"},{"line_number":2482,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_d7daf116","line":2479,"updated":"2016-08-02 18:58:36.000000000","message":"Nearly all of this *_group() code added in is like a duplicate of the cg code. Can we get a jump start on purging the CG code by having them share more and just have a shim for the CG methods to call the generic group ones?\n\nI understand the CG code will go away eventually, but I don\u0027t like that we\u0027re going to potentially have to duplicate any bug fixes in these methods for the next 6-12 months....","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":2476,"context_line":"                           \u0027id\u0027: group.id})"},{"line_number":2477,"context_line":"        return group"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"    def create_group(self, context, group):"},{"line_number":2480,"context_line":"        \"\"\"Creates the group.\"\"\""},{"line_number":2481,"context_line":"        context \u003d context.elevated()"},{"line_number":2482,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_3f7cdb71","line":2479,"in_reply_to":"bacf61ea_d7daf116","updated":"2016-08-03 14:33:19.000000000","message":"Done","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"76913d04175ec7a8b25daf3d8a25c7f2c3e7ef7b","unresolved":false,"context_lines":[{"line_number":3181,"context_line":"            remove_volumes_list \u003d remove_volumes.split(\u0027,\u0027)"},{"line_number":3182,"context_line":"        for add_vol in add_volumes_list:"},{"line_number":3183,"context_line":"            try:"},{"line_number":3184,"context_line":"                add_vol_ref \u003d self.db.volume_get(context, add_vol)"},{"line_number":3185,"context_line":"            except exception.VolumeNotFound:"},{"line_number":3186,"context_line":"                LOG.error(_LE(\"Update group \""},{"line_number":3187,"context_line":"                              \"failed to add volume-%(volume_id)s: \""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_37026d70","line":3184,"updated":"2016-08-02 18:58:36.000000000","message":"Should we make the switch over to the volume objects?","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c55a6c614af8bed06fe3a73d2c6f606e05b7390a","unresolved":false,"context_lines":[{"line_number":3181,"context_line":"            remove_volumes_list \u003d remove_volumes.split(\u0027,\u0027)"},{"line_number":3182,"context_line":"        for add_vol in add_volumes_list:"},{"line_number":3183,"context_line":"            try:"},{"line_number":3184,"context_line":"                add_vol_ref \u003d self.db.volume_get(context, add_vol)"},{"line_number":3185,"context_line":"            except exception.VolumeNotFound:"},{"line_number":3186,"context_line":"                LOG.error(_LE(\"Update group \""},{"line_number":3187,"context_line":"                              \"failed to add volume-%(volume_id)s: \""}],"source_content_type":"text/x-python","patch_set":40,"id":"bacf61ea_6ad693c4","line":3184,"in_reply_to":"bacf61ea_37026d70","updated":"2016-08-03 14:33:19.000000000","message":"Done","commit_id":"38a6c116de0c81f6962df4e8026e9dd0e6250798"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"    def create_group(self, context, group):"},{"line_number":2446,"context_line":"        \"\"\"Creates the group.\"\"\""},{"line_number":2447,"context_line":"        return self._create_group(context, group)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"    def _create_group(self, context, group, is_generic_group\u003dTrue):"},{"line_number":2450,"context_line":"        context \u003d context.elevated()"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_9dbf58a9","line":2447,"updated":"2016-08-11 09:30:47.000000000","message":"Do we really need to introduce _create_group methodhere?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"    def create_group(self, context, group):"},{"line_number":2446,"context_line":"        \"\"\"Creates the group.\"\"\""},{"line_number":2447,"context_line":"        return self._create_group(context, group)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"    def _create_group(self, context, group, is_generic_group\u003dTrue):"},{"line_number":2450,"context_line":"        context \u003d context.elevated()"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_a850120c","line":2447,"in_reply_to":"9ad45d7e_9dbf58a9","updated":"2016-08-11 13:20:35.000000000","message":"create_group and create_consistencygroup were completely independent functions when I first submitted this patch.  I added _create_group to address Patrick\u0027s comments on reducing duplicated code between create_consistencygroup and create_group.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":2924,"context_line":"                    vol_id \u003d update.pop(\u0027id\u0027)"},{"line_number":2925,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, vol_id)"},{"line_number":2926,"context_line":"                    vol_obj.update(update)"},{"line_number":2927,"context_line":"                    vol_obj.save()"},{"line_number":2928,"context_line":"                    # If we failed to delete a volume, make sure the"},{"line_number":2929,"context_line":"                    # status for the group is set to error as well"},{"line_number":2930,"context_line":"                    if (update[\u0027status\u0027] in [\u0027error_deleting\u0027, \u0027error\u0027]"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_fd7ad4ef","line":2927,"updated":"2016-08-11 09:30:47.000000000","message":"I don\u0027t like the idea to update each volume separately in a different DB transaction. It could cause race conditions and performance degradation if there will be many volumes in one group","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":2924,"context_line":"                    vol_id \u003d update.pop(\u0027id\u0027)"},{"line_number":2925,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, vol_id)"},{"line_number":2926,"context_line":"                    vol_obj.update(update)"},{"line_number":2927,"context_line":"                    vol_obj.save()"},{"line_number":2928,"context_line":"                    # If we failed to delete a volume, make sure the"},{"line_number":2929,"context_line":"                    # status for the group is set to error as well"},{"line_number":2930,"context_line":"                    if (update[\u0027status\u0027] in [\u0027error_deleting\u0027, \u0027error\u0027]"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ad45d7e_c8a74609","line":2927,"in_reply_to":"9ad45d7e_fd7ad4ef","updated":"2016-08-11 13:20:35.000000000","message":"Is it better if I create a db API function to do this update together?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"5d2ef428f8fa432e7255b88d90750311c4afcc08","unresolved":false,"context_lines":[{"line_number":2898,"context_line":"                new_host \u003d vol_utils.extract_host(vol_obj.host)"},{"line_number":2899,"context_line":"                if new_host !\u003d self.host:"},{"line_number":2900,"context_line":"                    raise exception.InvalidVolume("},{"line_number":2901,"context_line":"                        reason\u003d_(\"Volume is not local to this node\"))"},{"line_number":2902,"context_line":""},{"line_number":2903,"context_line":"        self._notify_about_group_usage("},{"line_number":2904,"context_line":"            context, group, \"delete.start\")"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_429c25c0","line":2901,"updated":"2016-08-16 21:16:41.000000000","message":"Please, add self.host and volume id to the error message","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5d560884d5c0da05c0941f44449edd0e41caef96","unresolved":false,"context_lines":[{"line_number":2898,"context_line":"                new_host \u003d vol_utils.extract_host(vol_obj.host)"},{"line_number":2899,"context_line":"                if new_host !\u003d self.host:"},{"line_number":2900,"context_line":"                    raise exception.InvalidVolume("},{"line_number":2901,"context_line":"                        reason\u003d_(\"Volume is not local to this node\"))"},{"line_number":2902,"context_line":""},{"line_number":2903,"context_line":"        self._notify_about_group_usage("},{"line_number":2904,"context_line":"            context, group, \"delete.start\")"}],"source_content_type":"text/x-python","patch_set":58,"id":"3ac371cc_482eff43","line":2901,"in_reply_to":"3ac371cc_429c25c0","updated":"2016-08-17 01:12:10.000000000","message":"Done","commit_id":"fc119683fe925d26e10278192765bf9637a4d899"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"264a607fc7808ad1a5f6c42ccceffc7fe9796e6b","unresolved":false,"context_lines":[{"line_number":2900,"context_line":"    def delete_group(self, context, group):"},{"line_number":2901,"context_line":"        \"\"\"Deletes group and the volumes in the group.\"\"\""},{"line_number":2902,"context_line":"        context \u003d context.elevated()"},{"line_number":2903,"context_line":"        project_id \u003d group.project_id"},{"line_number":2904,"context_line":""},{"line_number":2905,"context_line":"        if context.project_id !\u003d group.project_id:"},{"line_number":2906,"context_line":"            project_id \u003d group.project_id"}],"source_content_type":"text/x-python","patch_set":66,"id":"fa7ab95a_08bbab73","line":2903,"updated":"2016-08-25 20:51:35.000000000","message":"Isn\u0027t this set in either L#2906 or L#2908? I don\u0027t think you need it here...","commit_id":"8c74c74695043eb7a468028edb049a1611b87e77"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3ae9c5217baef31a28f6fb0248213a0c175b4d89","unresolved":false,"context_lines":[{"line_number":2900,"context_line":"    def delete_group(self, context, group):"},{"line_number":2901,"context_line":"        \"\"\"Deletes group and the volumes in the group.\"\"\""},{"line_number":2902,"context_line":"        context \u003d context.elevated()"},{"line_number":2903,"context_line":"        project_id \u003d group.project_id"},{"line_number":2904,"context_line":""},{"line_number":2905,"context_line":"        if context.project_id !\u003d group.project_id:"},{"line_number":2906,"context_line":"            project_id \u003d group.project_id"}],"source_content_type":"text/x-python","patch_set":66,"id":"fa7ab95a_1ce20d04","line":2903,"in_reply_to":"fa7ab95a_08bbab73","updated":"2016-08-25 22:04:03.000000000","message":"Probably not needed.  I can remove this in a follow-up patch if you are okay with it.  The gate is too slow:(.","commit_id":"8c74c74695043eb7a468028edb049a1611b87e77"}],"etc/cinder/policy.json":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dda3af11137572829ed820df7bdb2fec36d3ca82","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    \"group:group_type_access\": \"rule:admin_or_owner\","},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    \"group:create\" : \"\","},{"line_number":118,"context_line":"    \"group:delete\": \"\","},{"line_number":119,"context_line":"    \"group:update\": \"\","},{"line_number":120,"context_line":"    \"group:get\": \"\","},{"line_number":121,"context_line":"    \"group:get_all\": \"\","}],"source_content_type":"application/json","patch_set":49,"id":"9ad45d7e_9d8e38ce","line":118,"updated":"2016-08-11 09:30:47.000000000","message":"Should it admin_or_owner for delete and update operations?","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f36c64d84946ec1d09e5d14ed8f919a4a4f6b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    \"group:group_type_access\": \"rule:admin_or_owner\","},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    \"group:create\" : \"\","},{"line_number":118,"context_line":"    \"group:delete\": \"\","},{"line_number":119,"context_line":"    \"group:update\": \"\","},{"line_number":120,"context_line":"    \"group:get\": \"\","},{"line_number":121,"context_line":"    \"group:get_all\": \"\","}],"source_content_type":"application/json","patch_set":49,"id":"9ad45d7e_5cb4b433","line":118,"in_reply_to":"9ad45d7e_9d8e38ce","updated":"2016-08-11 13:20:35.000000000","message":"Will change.","commit_id":"67141aafd95aa53fd75e0ed5c360a83614afabb4"}]}
