)]}'
{"cinder/api/v3/groups.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"9d9440e6ab1dfe0511c1fa21562528f05de7ed9d","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        try:"},{"line_number":382,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":383,"context_line":"            self.group_api.enable_replication(context, group)"},{"line_number":384,"context_line":"        except exception.GroupNotFound:"},{"line_number":385,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":386,"context_line":"            raise"},{"line_number":387,"context_line":"        except exception.InvalidGroup as error:"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_7080ab8b","line":384,"range":{"start_line":384,"start_character":25,"end_line":384,"end_character":38},"updated":"2017-03-23 13:34:01.000000000","message":"This exception would otherwise just raise, so is this here just for the documentation provided by the comment?","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        try:"},{"line_number":382,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":383,"context_line":"            self.group_api.enable_replication(context, group)"},{"line_number":384,"context_line":"        except exception.GroupNotFound:"},{"line_number":385,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":386,"context_line":"            raise"},{"line_number":387,"context_line":"        except exception.InvalidGroup as error:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f07adeb7","line":384,"range":{"start_line":384,"start_character":25,"end_line":384,"end_character":38},"in_reply_to":"1a1ced50_7080ab8b","updated":"2017-03-28 21:36:10.000000000","message":"It\u0027s not necessary to keep this.  Removed.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"66a725dc20dfad4b2f1be3a5edd8334a65582a3e","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        try:"},{"line_number":405,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":406,"context_line":"            self.group_api.disable_replication(context, group)"},{"line_number":407,"context_line":"        except exception.GroupNotFound:"},{"line_number":408,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":409,"context_line":"            raise"},{"line_number":410,"context_line":"        except exception.InvalidGroup as error:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_cdf3279e","line":407,"range":{"start_line":407,"start_character":15,"end_line":407,"end_character":24},"updated":"2017-04-07 05:54:55.000000000","message":"it just re-raises the exception here, can it not be caught?","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        try:"},{"line_number":405,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":406,"context_line":"            self.group_api.disable_replication(context, group)"},{"line_number":407,"context_line":"        except exception.GroupNotFound:"},{"line_number":408,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":409,"context_line":"            raise"},{"line_number":410,"context_line":"        except exception.InvalidGroup as error:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_9a6330dd","line":407,"range":{"start_line":407,"start_character":15,"end_line":407,"end_character":24},"in_reply_to":"bff0334d_cdf3279e","updated":"2017-04-17 15:43:14.000000000","message":"This is actually not necessary.  I\u0027ll remove this.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                        \"request body.\")"},{"line_number":378,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        LOG.info(\u0027Enable replication group with id: %s\u0027, id,"},{"line_number":381,"context_line":"                 context\u003dcontext)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_d4c1afe6","line":380,"range":{"start_line":380,"start_character":18,"end_line":380,"end_character":54},"updated":"2017-05-03 03:06:25.000000000","message":"ditto as below:)","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                        \"request body.\")"},{"line_number":378,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        LOG.info(\u0027Enable replication group with id: %s\u0027, id,"},{"line_number":381,"context_line":"                 context\u003dcontext)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_98964793","line":380,"range":{"start_line":380,"start_character":18,"end_line":380,"end_character":54},"in_reply_to":"5ff73747_d4c1afe6","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":385,"context_line":"            self.group_api.enable_replication(context, group)"},{"line_number":386,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":387,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":388,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_972569ae","line":387,"range":{"start_line":387,"start_character":15,"end_line":387,"end_character":37},"updated":"2017-05-03 03:06:25.000000000","message":"suggest catching \u0027exception.InvalidVolume\u0027 here.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":385,"context_line":"            self.group_api.enable_replication(context, group)"},{"line_number":386,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":387,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":388,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_38861b68","line":387,"range":{"start_line":387,"start_character":15,"end_line":387,"end_character":37},"in_reply_to":"5ff73747_972569ae","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                        \"request body.\")"},{"line_number":401,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        LOG.info(\u0027Disable replication group with id: %s\u0027, id,"},{"line_number":404,"context_line":"                 context\u003dcontext)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_3491f3f2","line":403,"range":{"start_line":403,"start_character":18,"end_line":403,"end_character":55},"updated":"2017-05-03 03:06:25.000000000","message":"Missing period here.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                        \"request body.\")"},{"line_number":401,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        LOG.info(\u0027Disable replication group with id: %s\u0027, id,"},{"line_number":404,"context_line":"                 context\u003dcontext)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_d85cbfee","line":403,"range":{"start_line":403,"start_character":18,"end_line":403,"end_character":55},"in_reply_to":"5ff73747_3491f3f2","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":408,"context_line":"            self.group_api.disable_replication(context, group)"},{"line_number":409,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":410,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":411,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_975a0928","line":410,"range":{"start_line":410,"start_character":15,"end_line":410,"end_character":37},"updated":"2017-05-03 03:06:25.000000000","message":"catch \u0027InvalidVolume\u0027 exception here?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            group \u003d self.group_api.get(context, id)"},{"line_number":408,"context_line":"            self.group_api.disable_replication(context, group)"},{"line_number":409,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":410,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":411,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_b8758b66","line":410,"range":{"start_line":410,"start_character":15,"end_line":410,"end_character":37},"in_reply_to":"5ff73747_975a0928","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":411,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @wsgi.Controller.api_version(\u00273.31\u0027)"},{"line_number":416,"context_line":"    @wsgi.action(\"failover_replication\")"},{"line_number":417,"context_line":"    def failover_replication(self, req, id, body):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_94a2074b","line":414,"updated":"2017-05-03 03:06:25.000000000","message":"Missing period here.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":411,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @wsgi.Controller.api_version(\u00273.31\u0027)"},{"line_number":416,"context_line":"    @wsgi.action(\"failover_replication\")"},{"line_number":417,"context_line":"    def failover_replication(self, req, id, body):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_98dbe77a","line":414,"in_reply_to":"5ff73747_94a2074b","updated":"2017-05-23 04:57:03.000000000","message":"Where?  This is a blank line.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":435,"context_line":"            secondary_backend_id \u003d grp_body.get(\u0027secondary_backend_id\u0027)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        LOG.info(\u0027Failover replication group with id: %s\u0027, id,"},{"line_number":438,"context_line":"                 context\u003dcontext)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_54ad9f2f","line":437,"range":{"start_line":437,"start_character":18,"end_line":437,"end_character":56},"updated":"2017-05-03 03:06:25.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":435,"context_line":"            secondary_backend_id \u003d grp_body.get(\u0027secondary_backend_id\u0027)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        LOG.info(\u0027Failover replication group with id: %s\u0027, id,"},{"line_number":438,"context_line":"                 context\u003dcontext)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_180c77eb","line":437,"range":{"start_line":437,"start_character":18,"end_line":437,"end_character":56},"in_reply_to":"5ff73747_54ad9f2f","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":442,"context_line":"            self.group_api.failover_replication(context, group, allow_attached,"},{"line_number":443,"context_line":"                                                secondary_backend_id)"},{"line_number":444,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":445,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":446,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_f774ad9e","line":445,"range":{"start_line":445,"start_character":15,"end_line":445,"end_character":37},"updated":"2017-05-03 03:06:25.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":442,"context_line":"            self.group_api.failover_replication(context, group, allow_attached,"},{"line_number":443,"context_line":"                                                secondary_backend_id)"},{"line_number":444,"context_line":"            # Not found exception will be handled at the wsgi level"},{"line_number":445,"context_line":"        except exception.InvalidGroup as error:"},{"line_number":446,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        return webob.Response(status_int\u003d202)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_d8115f06","line":445,"range":{"start_line":445,"start_character":15,"end_line":445,"end_character":37},"in_reply_to":"5ff73747_f774ad9e","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                        \"in request body.\")"},{"line_number":459,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        LOG.info(\u0027List replication targets for group with id: %s\u0027, id,"},{"line_number":462,"context_line":"                 context\u003dcontext)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        # Not found exception will be handled at the wsgi level"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_94bb2771","line":461,"range":{"start_line":461,"start_character":18,"end_line":461,"end_character":64},"updated":"2017-05-03 03:06:25.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                        \"in request body.\")"},{"line_number":459,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        LOG.info(\u0027List replication targets for group with id: %s\u0027, id,"},{"line_number":462,"context_line":"                 context\u003dcontext)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        # Not found exception will be handled at the wsgi level"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_b8fa2bba","line":461,"range":{"start_line":461,"start_character":18,"end_line":461,"end_character":64},"in_reply_to":"5ff73747_94bb2771","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/api/v3/views/groups.py":[{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                                 for volume in group.volumes]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Add replication_status if min version is greater than or equal"},{"line_number":75,"context_line":"        # to 3.30."},{"line_number":76,"context_line":"        if req_version.matches(\"3.30\", None):"},{"line_number":77,"context_line":"            group_ref[\u0027group\u0027][\u0027replication_status\u0027] \u003d group.replication_status"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_d4cacf18","line":75,"range":{"start_line":75,"start_character":13,"end_line":75,"end_character":18},"updated":"2017-05-03 03:06:25.000000000","message":"3.31","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                                 for volume in group.volumes]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Add replication_status if min version is greater than or equal"},{"line_number":75,"context_line":"        # to 3.30."},{"line_number":76,"context_line":"        if req_version.matches(\"3.30\", None):"},{"line_number":77,"context_line":"            group_ref[\u0027group\u0027][\u0027replication_status\u0027] \u003d group.replication_status"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_d8df1f38","line":75,"range":{"start_line":75,"start_character":13,"end_line":75,"end_character":18},"in_reply_to":"5ff73747_d4cacf18","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Add replication_status if min version is greater than or equal"},{"line_number":75,"context_line":"        # to 3.30."},{"line_number":76,"context_line":"        if req_version.matches(\"3.30\", None):"},{"line_number":77,"context_line":"            group_ref[\u0027group\u0027][\u0027replication_status\u0027] \u003d group.replication_status"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        return group_ref"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_b4cf4328","line":76,"range":{"start_line":76,"start_character":32,"end_line":76,"end_character":36},"updated":"2017-05-03 03:06:25.000000000","message":"3.31?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # Add replication_status if min version is greater than or equal"},{"line_number":75,"context_line":"        # to 3.30."},{"line_number":76,"context_line":"        if req_version.matches(\"3.30\", None):"},{"line_number":77,"context_line":"            group_ref[\u0027group\u0027][\u0027replication_status\u0027] \u003d group.replication_status"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        return group_ref"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_b8e8ebe1","line":76,"range":{"start_line":76,"start_character":32,"end_line":76,"end_character":36},"in_reply_to":"5ff73747_b4cf4328","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"36b306d52edd69c9489f1ac055644dc4164103d3","unresolved":false,"context_lines":[{"line_number":5588,"context_line":""},{"line_number":5589,"context_line":""},{"line_number":5590,"context_line":"@require_context"},{"line_number":5591,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5592,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5593,"context_line":""},{"line_number":5594,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_172a798f","line":5591,"range":{"start_line":5591,"start_character":4,"end_line":5591,"end_character":55},"updated":"2017-05-03 03:11:46.000000000","message":"Missing unit testcase for this method :)","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":5588,"context_line":""},{"line_number":5589,"context_line":""},{"line_number":5590,"context_line":"@require_context"},{"line_number":5591,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5592,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5593,"context_line":""},{"line_number":5594,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_ee244eb1","line":5591,"range":{"start_line":5591,"start_character":4,"end_line":5591,"end_character":55},"in_reply_to":"5ff73747_172a798f","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":5635,"context_line":""},{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":"@require_context"},{"line_number":5638,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5639,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5640,"context_line":""},{"line_number":5641,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_99526234","line":5638,"updated":"2017-05-25 12:20:39.000000000","message":"-1: I really think we should just fix _groups_get_query to do the proper filtering for the host field, just like we do in _service_query and _cluster_query that use the _filter_host method.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4920de8f9b4d06b64c5734f3eca797714d401ddf","unresolved":false,"context_lines":[{"line_number":5635,"context_line":""},{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":"@require_context"},{"line_number":5638,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5639,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5640,"context_line":""},{"line_number":5641,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_76919799","line":5638,"in_reply_to":"df140735_e1885572","updated":"2017-05-30 21:39:29.000000000","message":"Done","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"61e6e80bb03d6c73d8a8225641f104cae216de6a","unresolved":false,"context_lines":[{"line_number":5635,"context_line":""},{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":"@require_context"},{"line_number":5638,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5639,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5640,"context_line":""},{"line_number":5641,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_e1885572","line":5638,"in_reply_to":"ff0f0b1f_515ec845","updated":"2017-05-30 09:20:47.000000000","message":"I don\u0027t think we would need to change much, we would just need to add 4 lines at the beginning of method `_process_groups_filters` :\n\n host \u003d filters.pop(\u0027host\u0027, None)\n if host:\n     query \u003d query.filter(_filter_host(models.Group.host, host,\n                                       match_level\u003dbackend_match_level))\n\nWell, I don\u0027t think it will be very common having to more than 1000 cinder services or clusters, so I don\u0027t think it\u0027s a big deal that they don\u0027t have pagination.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":5635,"context_line":""},{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":"@require_context"},{"line_number":5638,"context_line":"def group_get_all_by_host(context, host, filters\u003dNone):"},{"line_number":5639,"context_line":"    \"\"\"Retrieves all groups hosted on a host."},{"line_number":5640,"context_line":""},{"line_number":5641,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_515ec845","line":5638,"in_reply_to":"ff0f0b1f_99526234","updated":"2017-05-26 03:35:02.000000000","message":"Renamed _groups_get_query to _group_query and followed the code in _service_query.  I still kept group_get_all_by_host here and it calls _group_query.  I can\u0027t change the existing group_get_all in this patch.  That will affect too many places and should be a separate refactor if needed.  The existing group_get_all also supports pagination.  It looks like _service_query and _cluster_query don\u0027t handle pagination?","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":5655,"context_line":"    if host and isinstance(host, six.string_types):"},{"line_number":5656,"context_line":"        session \u003d get_session()"},{"line_number":5657,"context_line":"        with session.begin():"},{"line_number":5658,"context_line":"            host_attr \u003d getattr(models.Group, \u0027host\u0027)"},{"line_number":5659,"context_line":"            conditions \u003d [host_attr \u003d\u003d host,"},{"line_number":5660,"context_line":"                          host_attr.op(\u0027LIKE\u0027)(host + \u0027#%\u0027)]"},{"line_number":5661,"context_line":"            query \u003d _groups_get_query(context).filter(or_(*conditions))"},{"line_number":5662,"context_line":"            if filters:"},{"line_number":5663,"context_line":"                query \u003d _process_groups_filters(query, filters)"},{"line_number":5664,"context_line":"                # No groups would match, return empty list"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_f90f1e34","line":5661,"range":{"start_line":5658,"start_character":1,"end_line":5661,"end_character":71},"updated":"2017-05-25 12:20:39.000000000","message":"If we don\u0027t agree with above comment and insist on doing it like this we should at least use the _filter_host method:\n\n query \u003d query.filter(_filter_host(models.Group.host))\n\nThat way we would also be covering the MySQL case where it does insensitive filtering.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":5655,"context_line":"    if host and isinstance(host, six.string_types):"},{"line_number":5656,"context_line":"        session \u003d get_session()"},{"line_number":5657,"context_line":"        with session.begin():"},{"line_number":5658,"context_line":"            host_attr \u003d getattr(models.Group, \u0027host\u0027)"},{"line_number":5659,"context_line":"            conditions \u003d [host_attr \u003d\u003d host,"},{"line_number":5660,"context_line":"                          host_attr.op(\u0027LIKE\u0027)(host + \u0027#%\u0027)]"},{"line_number":5661,"context_line":"            query \u003d _groups_get_query(context).filter(or_(*conditions))"},{"line_number":5662,"context_line":"            if filters:"},{"line_number":5663,"context_line":"                query \u003d _process_groups_filters(query, filters)"},{"line_number":5664,"context_line":"                # No groups would match, return empty list"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_dcc0af2d","line":5661,"range":{"start_line":5658,"start_character":1,"end_line":5661,"end_character":71},"in_reply_to":"ff0f0b1f_f90f1e34","updated":"2017-05-26 03:35:02.000000000","message":"Done","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"}],"cinder/db/sqlalchemy/migrate_repo/versions/098_add_replication_status_to_groups_table.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"55227ef58c86c5f4c21fb6a8b650f6fdb19074dd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    meta \u003d MetaData()"},{"line_number":19,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    # Add replication_status column to groups table"},{"line_number":22,"context_line":"    groups \u003d Table(\u0027groups\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    replication_status \u003d Column(\u0027replication_status\u0027, String(255))"},{"line_number":24,"context_line":"    groups.create_column(replication_status)"},{"line_number":25,"context_line":"    groups.update().values(replication_status\u003dNone).execute()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_33652f45","line":25,"range":{"start_line":21,"start_character":0,"end_line":25,"end_character":61},"updated":"2017-02-20 18:58:37.000000000","message":"Can we make it idempotent? Like [1]. It\u0027s important for backporting that we\u0027re keeping our migrations idempotent. I understand we won\u0027t really backport a feature like that, but I think that we should expect it as a rule.\n\nAlso - you don\u0027t need this update - if you\u0027ll set the column to be nullable (and it will be by default).\n\n[1] https://github.com/openstack/nova/blob/c746974054e1a78032051fef7202a1b98dc9603f/nova/db/sqlalchemy/migrate_repo/versions/334_device_metadata_in_extra.py#L25-L28","commit_id":"c0b49c7feed3a6faf151a592a1d6ea6c41223310"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"a15d0f90992380e62a8078c5455921474f8ef6d1","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    meta \u003d MetaData()"},{"line_number":19,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    # Add replication_status column to groups table"},{"line_number":22,"context_line":"    groups \u003d Table(\u0027groups\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    replication_status \u003d Column(\u0027replication_status\u0027, String(255))"},{"line_number":24,"context_line":"    groups.create_column(replication_status)"},{"line_number":25,"context_line":"    groups.update().values(replication_status\u003dNone).execute()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_bd3bd39b","line":25,"range":{"start_line":21,"start_character":0,"end_line":25,"end_character":61},"in_reply_to":"da36d5c6_33652f45","updated":"2017-02-28 17:16:20.000000000","message":"Done","commit_id":"c0b49c7feed3a6faf151a592a1d6ea6c41223310"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"9d9440e6ab1dfe0511c1fa21562528f05de7ed9d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    # Add replication_status column to groups table"},{"line_number":25,"context_line":"    table \u003d Table(\u0027groups\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"    new_column \u003d Column(\u0027replication_status\u0027, String(255), nullable\u003dTrue)"},{"line_number":27,"context_line":"    if not hasattr(table.c, \u0027replication_status\u0027):"},{"line_number":28,"context_line":"        table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_f0101b5b","line":26,"updated":"2017-03-23 13:34:01.000000000","message":"Slight optimization, but this could be moved inside the if statement block so a Column object isn\u0027t created unless it\u0027s actually needed.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    # Add replication_status column to groups table"},{"line_number":25,"context_line":"    table \u003d Table(\u0027groups\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"    new_column \u003d Column(\u0027replication_status\u0027, String(255), nullable\u003dTrue)"},{"line_number":27,"context_line":"    if not hasattr(table.c, \u0027replication_status\u0027):"},{"line_number":28,"context_line":"        table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f053fe37","line":26,"in_reply_to":"1a1ced50_f0101b5b","updated":"2017-03-28 21:36:10.000000000","message":"Good point.  Done.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"}],"cinder/exception.py":[{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"class ReplicationGroupError(CinderException):"},{"line_number":850,"context_line":"    message \u003d _(\"Group %(group_id)s replication \""},{"line_number":851,"context_line":"                \"error: %(reason)s\")"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"class ReplicationNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_975fa971","line":851,"range":{"start_line":851,"start_character":24,"end_line":851,"end_character":34},"updated":"2017-05-03 03:06:25.000000000","message":"Missing period here","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"class ReplicationGroupError(CinderException):"},{"line_number":850,"context_line":"    message \u003d _(\"Group %(group_id)s replication \""},{"line_number":851,"context_line":"                \"error: %(reason)s\")"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"class ReplicationNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_78c7f365","line":851,"range":{"start_line":851,"start_character":24,"end_line":851,"end_character":34},"in_reply_to":"5ff73747_975fa971","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/group/api.py":[{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":915,"context_line":"                      \u0027id\u0027: group.id}"},{"line_number":916,"context_line":"            msg \u003d _(\"Group %(id)s status must be %(valid)s, \""},{"line_number":917,"context_line":"                    \"but current status is: %(current)s. \""},{"line_number":918,"context_line":"                    \"Cannot enable replication.\") % params"},{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_34069322","line":918,"range":{"start_line":918,"start_character":12,"end_line":918,"end_character":58},"updated":"2017-05-03 03:06:25.000000000","message":"Log error here as well?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":915,"context_line":"                      \u0027id\u0027: group.id}"},{"line_number":916,"context_line":"            msg \u003d _(\"Group %(id)s status must be %(valid)s, \""},{"line_number":917,"context_line":"                    \"but current status is: %(current)s. \""},{"line_number":918,"context_line":"                    \"Cannot enable replication.\") % params"},{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_f8a8a38c","line":918,"range":{"start_line":918,"start_character":12,"end_line":918,"end_character":58},"in_reply_to":"5ff73747_34069322","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"013d986f8356e9896321550dfe81efd4c1d94628","unresolved":false,"context_lines":[{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"},{"line_number":922,"context_line":"                            c_fields.ReplicationStatus.FAILED_OVER]"},{"line_number":923,"context_line":"        if group.replication_status not in valid_rep_status:"},{"line_number":924,"context_line":"            params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":925,"context_line":"                      \u0027current\u0027: group.replication_status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_f750e560","line":922,"range":{"start_line":922,"start_character":28,"end_line":922,"end_character":66},"updated":"2017-05-08 08:38:39.000000000","message":"Hi xyang, if the group had been failed over, and enable_replication is called afterwards, then replication status of the group will be \"enabled\", which means that the replication status \"failed-over\" has been overridden. so if this group is sent to driver again, such as disable replication, then driver doesn\u0027t know this group has been failed over so it can not use correct client to contact the storage(primary or secondary storage).\n\nI agree that group failed over should can be enabled replication, but I don\u0027t know how to handle this issue properly. I can store metadata in volume object to solve this problem. but it overloads driver so much. What is your opinion?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"53474d68226e82006a64723d194bf469f0c1ad70","unresolved":false,"context_lines":[{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"},{"line_number":922,"context_line":"                            c_fields.ReplicationStatus.FAILED_OVER]"},{"line_number":923,"context_line":"        if group.replication_status not in valid_rep_status:"},{"line_number":924,"context_line":"            params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":925,"context_line":"                      \u0027current\u0027: group.replication_status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_88b2c3e5","line":922,"range":{"start_line":922,"start_character":28,"end_line":922,"end_character":66},"in_reply_to":"3f044301_d23dd48f","updated":"2017-05-19 03:05:07.000000000","message":"Hi Jiamin,\n\nWe can handle this the same way as failover host in Cheesecake.  In failover_replication, if secondary_backend_id is \"default\", we change status to \"enabled\" and it is used to do a \"failback\".  Otherwise, we change status to \"failed-over\".  Driver needs to check secondary_backend_id and handle it accordingly.  \"failover_replicaton\" to \"default\" should be the way to failback replication group. So \"failed-over\" should always mean the group is failed over to the secondary storage.  \"enabled\" means the group in on the primary storage.  This way driver should always know whether it is the primary or secondary storage.\n\nWe should still allow \"failed-over\" group to be \"enabled\" thru enable_replication.  This is only if after failing over, the secondary storage will become the new primary storage (after manually changing cinder.conf and other manual steps).\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/manager.py#L3638","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"ff38f5ac8edff2b1d06b26c621a9991c2c6832eb","unresolved":false,"context_lines":[{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"},{"line_number":922,"context_line":"                            c_fields.ReplicationStatus.FAILED_OVER]"},{"line_number":923,"context_line":"        if group.replication_status not in valid_rep_status:"},{"line_number":924,"context_line":"            params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":925,"context_line":"                      \u0027current\u0027: group.replication_status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_d23dd48f","line":922,"range":{"start_line":922,"start_character":28,"end_line":922,"end_character":66},"in_reply_to":"3f044301_f750e560","updated":"2017-05-10 04:41:07.000000000","message":"Hi xyang, let me describe it concretely and correctly. if the status of group.replication_status is failed-over, then this status will be overridden by #L955, so driver can not depend on replication status to check the group has been failed over or not so that it can use the correct client to enable replication on the group that may in the primary or secondary storage(for DS8K driver, replication is between two DS8Ks, and driver has client for each of them).\n\nso now I need to store information in volume\u0027s metadata for this purpose, because group object doesn\u0027t have metadata, but this is only a workaround, do you have any other better solution?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"ed539204b50388ccee5a2f31ea5525dd6c06be89","unresolved":false,"context_lines":[{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"},{"line_number":922,"context_line":"                            c_fields.ReplicationStatus.FAILED_OVER]"},{"line_number":923,"context_line":"        if group.replication_status not in valid_rep_status:"},{"line_number":924,"context_line":"            params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":925,"context_line":"                      \u0027current\u0027: group.replication_status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_ebeb79d9","line":922,"range":{"start_line":922,"start_character":28,"end_line":922,"end_character":66},"in_reply_to":"ff0f0b1f_88b2c3e5","updated":"2017-05-19 03:32:10.000000000","message":"Thank xyang for your reply.\n\nfirst of all, after failover-replication, driver should not make the secondary storage as the new primary storage. because group is not the whole backend, user should still can do other operations on the volumes not belong to the group failed over.\n\nso after the group is failed over, for driver, enable replication in this group needs to know that group has been failed over so that\nit can choose the secondary storage. but the replication_status of the group is \u0027enabling\u0027, not \u0027failed-over\u0027, so driver can not depend on replication status. now I store the backend_id in volume\u0027s metadata so that enable_replication can use it to know the state of group, but it may be not a good choice.  \n\nAbout Cheesecake, after failover-host, driver should switch the clients for primary and secondary storage, because it fails over the whole backend. and Cheesecake has a parameter active_backend_id to tell driver that it should be in which backend or now it is in which backend. but group doesn\u0027t have such a parameter for itself.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":919,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.DISABLED,"},{"line_number":922,"context_line":"                            c_fields.ReplicationStatus.FAILED_OVER]"},{"line_number":923,"context_line":"        if group.replication_status not in valid_rep_status:"},{"line_number":924,"context_line":"            params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":925,"context_line":"                      \u0027current\u0027: group.replication_status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_0c21d5b0","line":922,"range":{"start_line":922,"start_character":28,"end_line":922,"end_character":66},"in_reply_to":"ff0f0b1f_ebeb79d9","updated":"2017-05-23 04:57:03.000000000","message":"What I meant was Cheesecake and Tiramisu need to be able to work together as well (i.e., after you failed over a group, your primary backend was hit by disaster).  I think I have added confusion by explaining it that way.  So I\u0027m going to make it simpler by not allowing enable_replication to be called when the status is failed_over.  So now if it is failed_over, it always means the group is on the secondary storage.  If it is enabled, it always means the group is on the primary storage.\n\nSo first enable_replication, then failover_replication and provide the secondary_backend_id and that makes the group failed over to the secondary storage, after that run failover_replication again specifying \"default\" as the secondary_backend_id and that will bring the group back to \"enabled\" status again.  Then you can disable_replication.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17045,"name":"xiaoqin","email":"xiaoqin.li@hotmail.com","username":"xiaoqin"},"change_message_id":"f95f23acafd8a1000ba92d434e45507e182cb30d","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                      \u0027id\u0027: group.id}"},{"line_number":972,"context_line":"            msg \u003d _(\"Group %(id)s status must be %(valid)s, \""},{"line_number":973,"context_line":"                    \"but current status is: %(current)s. \""},{"line_number":974,"context_line":"                    \"Cannot disble replication.\") % params"},{"line_number":975,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.ENABLED,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_3a7bfa8c","line":974,"range":{"start_line":974,"start_character":28,"end_line":974,"end_character":34},"updated":"2017-05-16 11:02:16.000000000","message":"disble \u003d\u003e disable","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                      \u0027id\u0027: group.id}"},{"line_number":972,"context_line":"            msg \u003d _(\"Group %(id)s status must be %(valid)s, \""},{"line_number":973,"context_line":"                    \"but current status is: %(current)s. \""},{"line_number":974,"context_line":"                    \"Cannot disble replication.\") % params"},{"line_number":975,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"        valid_rep_status \u003d [c_fields.ReplicationStatus.ENABLED,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_5872ef4a","line":974,"range":{"start_line":974,"start_character":28,"end_line":974,"end_character":34},"in_reply_to":"1f013ff3_3a7bfa8c","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"e3835533d0a46f507d9e197c9da151dd9a680d3b","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"            msg \u003d _(\"Group %s is not a replication group type.\") % group.id"},{"line_number":1018,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"        valid_status \u003d [c_fields.GroupStatus.AVAILABLE]"},{"line_number":1021,"context_line":"        if group.status not in valid_status:"},{"line_number":1022,"context_line":"            params \u003d {\u0027valid\u0027: valid_status,"},{"line_number":1023,"context_line":"                      \u0027current\u0027: group.status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_37664c53","line":1020,"range":{"start_line":1020,"start_character":8,"end_line":1020,"end_character":55},"updated":"2017-05-17 08:42:55.000000000","message":"is it better to add error into valid_status? there is a case that user may input wrong secondary backend id by mistake, then the group status will be set as error and user can not failover this group again although he/she correct the secondary backend id at the second time.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"            msg \u003d _(\"Group %s is not a replication group type.\") % group.id"},{"line_number":1018,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"        valid_status \u003d [c_fields.GroupStatus.AVAILABLE]"},{"line_number":1021,"context_line":"        if group.status not in valid_status:"},{"line_number":1022,"context_line":"            params \u003d {\u0027valid\u0027: valid_status,"},{"line_number":1023,"context_line":"                      \u0027current\u0027: group.status,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_9802c73c","line":1020,"range":{"start_line":1020,"start_character":8,"end_line":1020,"end_character":55},"in_reply_to":"1f013ff3_37664c53","updated":"2017-05-23 04:57:03.000000000","message":"In that case, you should ask the admin to reset status to available and then you can failover again.  Otherwise, this could cause other problems if allowing a group in error to be failed over.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":1060,"context_line":"                params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":1061,"context_line":"                          \u0027current\u0027: vol.replication_status,"},{"line_number":1062,"context_line":"                          \u0027id\u0027: vol.id}"},{"line_number":1063,"context_line":"                msg \u003d _(\"Volume %(id)s replication status must be %(valid)s, \""},{"line_number":1064,"context_line":"                        \"but current status is: %(current)s. \""},{"line_number":1065,"context_line":"                        \"Cannot failover replication.\") % params"},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"            vol.replication_status \u003d c_fields.ReplicationStatus.FAILING_OVER"},{"line_number":1068,"context_line":"            vol.save()"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_175f190f","line":1065,"range":{"start_line":1063,"start_character":14,"end_line":1065,"end_character":64},"updated":"2017-05-03 03:06:25.000000000","message":"What are you going to do with this \u0027msg\u0027?","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":1060,"context_line":"                params \u003d {\u0027valid\u0027: valid_rep_status,"},{"line_number":1061,"context_line":"                          \u0027current\u0027: vol.replication_status,"},{"line_number":1062,"context_line":"                          \u0027id\u0027: vol.id}"},{"line_number":1063,"context_line":"                msg \u003d _(\"Volume %(id)s replication status must be %(valid)s, \""},{"line_number":1064,"context_line":"                        \"but current status is: %(current)s. \""},{"line_number":1065,"context_line":"                        \"Cannot failover replication.\") % params"},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"            vol.replication_status \u003d c_fields.ReplicationStatus.FAILING_OVER"},{"line_number":1068,"context_line":"            vol.save()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_38c05be1","line":1065,"range":{"start_line":1063,"start_character":14,"end_line":1065,"end_character":64},"in_reply_to":"5ff73747_175f190f","updated":"2017-05-23 04:57:03.000000000","message":"Obviously I missed a raise here:).  Good catch!","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/objects/group.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027status\u0027: c_fields.GroupStatusField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027group_snapshot_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027source_group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027replication_status\u0027: c_fields.ReplicationStatusField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027volumes\u0027: fields.ObjectField(\u0027VolumeList\u0027, nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027,"},{"line_number":52,"context_line":"                                           nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_831c2f78","line":49,"updated":"2017-05-25 12:20:39.000000000","message":"-1: This is missing backporting code so it will break rolling upgrades.  But I see that we already broke rolling upgrades with v1.1 since it doesn\u0027t have backporting code either.  I have fixed that here: https://review.openstack.org/468016","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027status\u0027: c_fields.GroupStatusField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027group_snapshot_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027source_group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027replication_status\u0027: c_fields.ReplicationStatusField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027volumes\u0027: fields.ObjectField(\u0027VolumeList\u0027, nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027,"},{"line_number":52,"context_line":"                                           nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_240c3b41","line":49,"in_reply_to":"ff0f0b1f_831c2f78","updated":"2017-05-26 03:35:02.000000000","message":"Done","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    fields \u003d {"},{"line_number":174,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Group\u0027)"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":"    child_version \u003d {"},{"line_number":177,"context_line":"        \u00271.0\u0027: \u00271.0\u0027,"},{"line_number":178,"context_line":"    }"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @classmethod"},{"line_number":181,"context_line":"    def get_all(cls, context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_99a5c2a1","line":178,"range":{"start_line":176,"start_character":0,"end_line":178,"end_character":5},"updated":"2017-05-25 12:20:39.000000000","message":"This should never have been added, fixing it here: https://review.openstack.org/467996/","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    fields \u003d {"},{"line_number":174,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Group\u0027)"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":"    child_version \u003d {"},{"line_number":177,"context_line":"        \u00271.0\u0027: \u00271.0\u0027,"},{"line_number":178,"context_line":"    }"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @classmethod"},{"line_number":181,"context_line":"    def get_all(cls, context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_04093730","line":178,"range":{"start_line":176,"start_character":0,"end_line":178,"end_character":5},"in_reply_to":"ff0f0b1f_99a5c2a1","updated":"2017-05-26 03:35:02.000000000","message":"Thanks!","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                                  groups)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    @classmethod"},{"line_number":202,"context_line":"    def get_all_by_host(cls, context, host, filters\u003dNone):"},{"line_number":203,"context_line":"        groups \u003d db.group_get_all_by_host(context, host, filters)"},{"line_number":204,"context_line":"        return base.obj_make_list(context, cls(context), objects.Group, groups)"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_390d96e7","line":202,"updated":"2017-05-25 12:20:39.000000000","message":"-1: We should stop adding individual methods, if we fix db.group_get_all to properly do the host search this would be  the same as: `get_all(context, {\u0027host\u0027: host})`.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                                  groups)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    @classmethod"},{"line_number":202,"context_line":"    def get_all_by_host(cls, context, host, filters\u003dNone):"},{"line_number":203,"context_line":"        groups \u003d db.group_get_all_by_host(context, host, filters)"},{"line_number":204,"context_line":"        return base.obj_make_list(context, cls(context), objects.Group, groups)"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_bc04db7f","line":202,"in_reply_to":"ff0f0b1f_390d96e7","updated":"2017-05-26 03:35:02.000000000","message":"See my comments in db/sqlalchemy/api.py.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a38175501a575bff8f8038c7287fbf735fe2950a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":63,"context_line":"        if target_version \u003c (1, 1):"},{"line_number":64,"context_line":"            for key in (\u0027group_snapshot_id\u0027, \u0027source_group_id\u0027,"},{"line_number":65,"context_line":"                        \u0027group_snapshots\u0027, \u0027replication_status\u0027):"},{"line_number":66,"context_line":"                primitive.pop(key, None)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":34,"id":"df140735_c10e71e4","line":65,"range":{"start_line":65,"start_character":44,"end_line":65,"end_character":62},"updated":"2017-05-30 09:21:55.000000000","message":"-1: Removal should happen if the version is prior to 1.2 so it can backport to 1.1 as well as to 1.0, so we need to remove replication_status from here and just add to this method:\n\n if target_version \u003c (1, 2):\n     primitive.pop(\u0027replication_status\u0027, None)\n\nOr change the whole method to do something similar to what\u0027s being done in the volume OVO.","commit_id":"0702cae6840681d46a95d26c235592f6076c975d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"482dc95fda8f14165903ddc699d16b4a53c50744","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":63,"context_line":"        if target_version \u003c (1, 1):"},{"line_number":64,"context_line":"            for key in (\u0027group_snapshot_id\u0027, \u0027source_group_id\u0027,"},{"line_number":65,"context_line":"                        \u0027group_snapshots\u0027, \u0027replication_status\u0027):"},{"line_number":66,"context_line":"                primitive.pop(key, None)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":34,"id":"df140735_e6cf427d","line":65,"range":{"start_line":65,"start_character":44,"end_line":65,"end_character":62},"in_reply_to":"df140735_c10e71e4","updated":"2017-05-30 21:39:45.000000000","message":"Got it.  Thanks!","commit_id":"0702cae6840681d46a95d26c235592f6076c975d"}],"cinder/objects/group_snapshot.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                    base.CinderObjectDictCompat, base.ClusteredObject):"},{"line_number":26,"context_line":"    # Version 1.0: Initial version"},{"line_number":27,"context_line":"    # Version 1.1: Added replication_status field in group"},{"line_number":28,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_d9f69a8f","line":28,"updated":"2017-05-25 12:20:39.000000000","message":"-1: \u0027this bump is unnecessary, our backporting mechanism will automatically detect that this requires Group OVO version 1.2 and build a manifest to do the backporting automatically.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4920de8f9b4d06b64c5734f3eca797714d401ddf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                    base.CinderObjectDictCompat, base.ClusteredObject):"},{"line_number":26,"context_line":"    # Version 1.0: Initial version"},{"line_number":27,"context_line":"    # Version 1.1: Added replication_status field in group"},{"line_number":28,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_20c3d5ef","line":28,"in_reply_to":"df140735_f4b7f5d7","updated":"2017-05-30 21:39:29.000000000","message":"Awesome!","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7f581e40b07856579c8369498493915aa988e517","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                    base.CinderObjectDictCompat, base.ClusteredObject):"},{"line_number":26,"context_line":"    # Version 1.0: Initial version"},{"line_number":27,"context_line":"    # Version 1.1: Added replication_status field in group"},{"line_number":28,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_f4b7f5d7","line":28,"in_reply_to":"df140735_fe4b5484","updated":"2017-05-30 10:16:11.000000000","message":"OK, I have updated the documentation, so it should be correct now: https://review.openstack.org/469040","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"61e6e80bb03d6c73d8a8225641f104cae216de6a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                    base.CinderObjectDictCompat, base.ClusteredObject):"},{"line_number":26,"context_line":"    # Version 1.0: Initial version"},{"line_number":27,"context_line":"    # Version 1.1: Added replication_status field in group"},{"line_number":28,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_fe4b5484","line":28,"in_reply_to":"ff0f0b1f_c171f10e","updated":"2017-05-30 09:20:47.000000000","message":"I think you understood it correctly and the document is not up to date with the latest mechanism I added to prevent us from having to do that.  Thanks for catching it, I\u0027ll fix the document.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                    base.CinderObjectDictCompat, base.ClusteredObject):"},{"line_number":26,"context_line":"    # Version 1.0: Initial version"},{"line_number":27,"context_line":"    # Version 1.1: Added replication_status field in group"},{"line_number":28,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_c171f10e","line":28,"in_reply_to":"ff0f0b1f_d9f69a8f","updated":"2017-05-26 03:35:02.000000000","message":"Removed this version bump. \n\nI misunderstood the doc then.  What does the following paragraph mean?  \"A case where we may not notice that a version bump is required is on chained versioned objects. That is to say, when you we change the version of a versioned object and that object is used in another versioned object with a fields.ObjectField. In such a case all versioned objects that are including changed versioned object will also require a version bump.\"  I interpreted it as GroupSnapshot needs a version bump because it has Group as a fields.ObjectField in its fields.  Can you please give a real example on what is the chained versioned objects that need to be bumped?","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"}],"cinder/objects/volume.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"15e608dfab279b1fb3c58a129c417adc3940989b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Version 1.5: Added group"},{"line_number":62,"context_line":"    # Version 1.6: This object is now cleanable (adds rows to workers table)"},{"line_number":63,"context_line":"    # Version 1.7: Added replication_status field in group"},{"line_number":64,"context_line":"    VERSION \u003d \u00271.7\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027metadata\u0027, \u0027admin_metadata\u0027, \u0027glance_metadata\u0027,"},{"line_number":67,"context_line":"                       \u0027volume_type\u0027, \u0027volume_attachment\u0027, \u0027consistencygroup\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_792d4efc","line":64,"updated":"2017-05-25 12:20:39.000000000","message":"-1: \u0027this bump is unnecessary, our backporting mechanism will automatically detect that this requires Group OVO version 1.2 and build a manifest to do the backporting automatically.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7f96e5639bd0543ebb6185d7b01e07b5a83e304","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Version 1.5: Added group"},{"line_number":62,"context_line":"    # Version 1.6: This object is now cleanable (adds rows to workers table)"},{"line_number":63,"context_line":"    # Version 1.7: Added replication_status field in group"},{"line_number":64,"context_line":"    VERSION \u003d \u00271.7\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027metadata\u0027, \u0027admin_metadata\u0027, \u0027glance_metadata\u0027,"},{"line_number":67,"context_line":"                       \u0027volume_type\u0027, \u0027volume_attachment\u0027, \u0027consistencygroup\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ff0f0b1f_81f3f973","line":64,"in_reply_to":"ff0f0b1f_792d4efc","updated":"2017-05-26 03:35:02.000000000","message":"Remove this change, but I have the same question as in objects/group_snapshot.py.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"61e6e80bb03d6c73d8a8225641f104cae216de6a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Version 1.5: Added group"},{"line_number":62,"context_line":"    # Version 1.6: This object is now cleanable (adds rows to workers table)"},{"line_number":63,"context_line":"    # Version 1.7: Added replication_status field in group"},{"line_number":64,"context_line":"    VERSION \u003d \u00271.7\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027metadata\u0027, \u0027admin_metadata\u0027, \u0027glance_metadata\u0027,"},{"line_number":67,"context_line":"                       \u0027volume_type\u0027, \u0027volume_attachment\u0027, \u0027consistencygroup\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_de3530f9","line":64,"in_reply_to":"ff0f0b1f_81f3f973","updated":"2017-05-30 09:20:47.000000000","message":"That\u0027s a valid question, I\u0027ll update the document to reflect this is no longer needed.","commit_id":"9ba42f0a1767b70b544369f2407f68d8c523e654"}],"cinder/volume/driver.py":[{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":1785,"context_line":"        \"\"\"Fails over replication for a group and volumes in the group."},{"line_number":1786,"context_line":""},{"line_number":1787,"context_line":"        :param group: group object"},{"line_number":1788,"context_line":"        :param volumes: list of volume objects in the group"},{"line_number":1789,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1790,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1791,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_d12b7292","line":1788,"range":{"start_line":1788,"start_character":7,"end_line":1788,"end_character":15},"updated":"2017-03-28 12:37:16.000000000","message":"misssing param secondary_backend_id","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":1785,"context_line":"        \"\"\"Fails over replication for a group and volumes in the group."},{"line_number":1786,"context_line":""},{"line_number":1787,"context_line":"        :param group: group object"},{"line_number":1788,"context_line":"        :param volumes: list of volume objects in the group"},{"line_number":1789,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1790,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1791,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_4bc79b97","line":1788,"range":{"start_line":1788,"start_character":7,"end_line":1788,"end_character":15},"in_reply_to":"ffe62b97_d12b7292","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":17045,"name":"xiaoqin","email":"xiaoqin.li@hotmail.com","username":"xiaoqin"},"change_message_id":"9f8d763c3ebddb6bf8cf8692733207e9c37b9191","unresolved":false,"context_lines":[{"line_number":1806,"context_line":"        :returns: group_model_updates - list of dicts of group updates"},{"line_number":1807,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1808,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1809,"context_line":"        :returns: group_model_updates - list of dicts of volume updates"},{"line_number":1810,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1811,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1812,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_9a92abf4","line":1809,"range":{"start_line":1809,"start_character":17,"end_line":1809,"end_character":37},"updated":"2017-03-23 11:01:18.000000000","message":"Should it be volume_model_updates?","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":1806,"context_line":"        :returns: group_model_updates - list of dicts of group updates"},{"line_number":1807,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1808,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1809,"context_line":"        :returns: group_model_updates - list of dicts of volume updates"},{"line_number":1810,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1811,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1812,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_0bbd1301","line":1809,"range":{"start_line":1809,"start_character":17,"end_line":1809,"end_character":37},"in_reply_to":"1a1ced50_9a92abf4","updated":"2017-03-28 21:36:10.000000000","message":"You are right!  Fixed.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"5d59970391c843ed72665ee43e0b890a82285af9","unresolved":false,"context_lines":[{"line_number":1807,"context_line":"        :returns: group_model_updates - list of dicts of group updates"},{"line_number":1808,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1809,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1810,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1811,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1812,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1813,"context_line":"        \"\"\""},{"line_number":1814,"context_line":"        return [], []"},{"line_number":1815,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_48451017","line":1812,"range":{"start_line":1810,"start_character":0,"end_line":1812,"end_character":74},"updated":"2017-04-14 07:25:54.000000000","message":"Duplicate lines?","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":1807,"context_line":"        :returns: group_model_updates - list of dicts of group updates"},{"line_number":1808,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1809,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1810,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1811,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1812,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1813,"context_line":"        \"\"\""},{"line_number":1814,"context_line":"        return [], []"},{"line_number":1815,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_faf7d4f4","line":1812,"range":{"start_line":1810,"start_character":0,"end_line":1812,"end_character":74},"in_reply_to":"7ffa3b31_48451017","updated":"2017-04-17 15:43:14.000000000","message":"The one on line 1809 is for groups.  This one is for volumes.  Probably should move volumes statuses of a group inside the group dict.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"603332c87825da912e522c0a824c4c480ff795d9","unresolved":false,"context_lines":[{"line_number":1807,"context_line":"        :returns: group_model_updates - list of dicts of group updates"},{"line_number":1808,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1809,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1810,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1811,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1812,"context_line":"        {\u0027id\u0027: xxxx, \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1813,"context_line":"        \"\"\""},{"line_number":1814,"context_line":"        return [], []"},{"line_number":1815,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_9a15d74b","line":1812,"range":{"start_line":1810,"start_character":0,"end_line":1812,"end_character":74},"in_reply_to":"7ffa3b31_faf7d4f4","updated":"2017-04-21 21:12:45.000000000","message":"Done","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"7d6ecdc132747f1e5ec47916a905fde92a336012","unresolved":false,"context_lines":[{"line_number":1811,"context_line":"        {\u0027group_id\u0027: xxxx,"},{"line_number":1812,"context_line":"         \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1813,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1814,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1815,"context_line":"        {\u0027volume_id\u0027: xxxx,"},{"line_number":1816,"context_line":"         \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1817,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_cb8eb4cf","line":1814,"range":{"start_line":1814,"start_character":51,"end_line":1814,"end_character":56},"updated":"2017-04-24 04:04:28.000000000","message":"it should be volume, not group here.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"417e3492b597d9c9ba2cd662c750c4cd8bccc097","unresolved":false,"context_lines":[{"line_number":1811,"context_line":"        {\u0027group_id\u0027: xxxx,"},{"line_number":1812,"context_line":"         \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1813,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1814,"context_line":"        if error happens. For example, a dict of a group can be as follows:"},{"line_number":1815,"context_line":"        {\u0027volume_id\u0027: xxxx,"},{"line_number":1816,"context_line":"         \u0027replication_status\u0027: fields.ReplicationStatus.ERROR}"},{"line_number":1817,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_08c6d468","line":1814,"range":{"start_line":1814,"start_character":51,"end_line":1814,"end_character":56},"in_reply_to":"5ff73747_cb8eb4cf","updated":"2017-04-24 12:53:35.000000000","message":"Done","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":1749,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1750,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1751,"context_line":"        \"\"\""},{"line_number":1752,"context_line":"        # Example returns:"},{"line_number":1753,"context_line":"        # model_update \u003d {"},{"line_number":1754,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.ENABLED}"},{"line_number":1755,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1756,"context_line":"        # for volume_ref in volumes:"},{"line_number":1757,"context_line":"        #    volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1758,"context_line":"        #    volume_model_update[\u0027status\u0027] \u003d ("},{"line_number":1759,"context_line":"        #        fields.ReplicationStatus.ENABLED)"},{"line_number":1760,"context_line":"        #    volume_model_updates.append(volume_model_update)"},{"line_number":1761,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1762,"context_line":"        raise NotImplementedError()"},{"line_number":1763,"context_line":""},{"line_number":1764,"context_line":"    # Replication Group (Tiramisu)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_371a1517","line":1761,"range":{"start_line":1752,"start_character":7,"end_line":1761,"end_character":51},"updated":"2017-05-03 03:06:25.000000000","message":"Suggest remove this kind of comments or add something more like comments:)","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":1749,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1750,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1751,"context_line":"        \"\"\""},{"line_number":1752,"context_line":"        # Example returns:"},{"line_number":1753,"context_line":"        # model_update \u003d {"},{"line_number":1754,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.ENABLED}"},{"line_number":1755,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1756,"context_line":"        # for volume_ref in volumes:"},{"line_number":1757,"context_line":"        #    volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1758,"context_line":"        #    volume_model_update[\u0027status\u0027] \u003d ("},{"line_number":1759,"context_line":"        #        fields.ReplicationStatus.ENABLED)"},{"line_number":1760,"context_line":"        #    volume_model_updates.append(volume_model_update)"},{"line_number":1761,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1762,"context_line":"        raise NotImplementedError()"},{"line_number":1763,"context_line":""},{"line_number":1764,"context_line":"    # Replication Group (Tiramisu)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_5b99c976","line":1761,"range":{"start_line":1752,"start_character":7,"end_line":1761,"end_character":51},"in_reply_to":"5ff73747_371a1517","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":1770,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1771,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1772,"context_line":"        \"\"\""},{"line_number":1773,"context_line":"        # Example returns:"},{"line_number":1774,"context_line":"        # model_update \u003d {"},{"line_number":1775,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.DISABLED}"},{"line_number":1776,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1777,"context_line":"        # for volume_ref in volumes:"},{"line_number":1778,"context_line":"        #     volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1779,"context_line":"        #     volume_model_update[\u0027status\u0027] \u003d fields.ReplicationStatus.DISABLED"},{"line_number":1780,"context_line":"        #     volume_model_updates.append(volume_model_update)"},{"line_number":1781,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1782,"context_line":"        raise NotImplementedError()"},{"line_number":1783,"context_line":""},{"line_number":1784,"context_line":"    # Replication Group (Tiramisu)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_d7d65128","line":1781,"range":{"start_line":1773,"start_character":7,"end_line":1781,"end_character":51},"updated":"2017-05-03 03:06:25.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":1770,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1771,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1772,"context_line":"        \"\"\""},{"line_number":1773,"context_line":"        # Example returns:"},{"line_number":1774,"context_line":"        # model_update \u003d {"},{"line_number":1775,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.DISABLED}"},{"line_number":1776,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1777,"context_line":"        # for volume_ref in volumes:"},{"line_number":1778,"context_line":"        #     volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1779,"context_line":"        #     volume_model_update[\u0027status\u0027] \u003d fields.ReplicationStatus.DISABLED"},{"line_number":1780,"context_line":"        #     volume_model_updates.append(volume_model_update)"},{"line_number":1781,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1782,"context_line":"        raise NotImplementedError()"},{"line_number":1783,"context_line":""},{"line_number":1784,"context_line":"    # Replication Group (Tiramisu)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_3b8cd534","line":1781,"range":{"start_line":1773,"start_character":7,"end_line":1781,"end_character":51},"in_reply_to":"5ff73747_d7d65128","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":1792,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1793,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1794,"context_line":"        \"\"\""},{"line_number":1795,"context_line":"        # model_update \u003d {"},{"line_number":1796,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.FAILED_OVER}"},{"line_number":1797,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1798,"context_line":"        # for volume_ref in volumes:"},{"line_number":1799,"context_line":"        #     volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1800,"context_line":"        #     volume_model_update[\u0027status\u0027] \u003d ("},{"line_number":1801,"context_line":"        #         fields.ReplicationStatus.FAILED_OVER)"},{"line_number":1802,"context_line":"        #     volume_model_updates.append(volume_model_update)"},{"line_number":1803,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1804,"context_line":"        raise NotImplementedError()"},{"line_number":1805,"context_line":""},{"line_number":1806,"context_line":"    def get_replication_error_status(self, context, groups):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_b7dbc54d","line":1803,"range":{"start_line":1795,"start_character":7,"end_line":1803,"end_character":51},"updated":"2017-05-03 03:06:25.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":1792,"context_line":"        :returns: model_update - dict of group updates"},{"line_number":1793,"context_line":"        :returns: volume_model_updates - list of dicts of volume updates"},{"line_number":1794,"context_line":"        \"\"\""},{"line_number":1795,"context_line":"        # model_update \u003d {"},{"line_number":1796,"context_line":"        #     \u0027replication_status\u0027: fields.ReplicationStatus.FAILED_OVER}"},{"line_number":1797,"context_line":"        # volume_model_updates \u003d []"},{"line_number":1798,"context_line":"        # for volume_ref in volumes:"},{"line_number":1799,"context_line":"        #     volume_model_update \u003d {\u0027id\u0027: volume_ref.id}"},{"line_number":1800,"context_line":"        #     volume_model_update[\u0027status\u0027] \u003d ("},{"line_number":1801,"context_line":"        #         fields.ReplicationStatus.FAILED_OVER)"},{"line_number":1802,"context_line":"        #     volume_model_updates.append(volume_model_update)"},{"line_number":1803,"context_line":"        # return model_update, volume_model_updates"},{"line_number":1804,"context_line":"        raise NotImplementedError()"},{"line_number":1805,"context_line":""},{"line_number":1806,"context_line":"    def get_replication_error_status(self, context, groups):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_cc863d14","line":1803,"range":{"start_line":1795,"start_character":7,"end_line":1803,"end_character":51},"in_reply_to":"5ff73747_b7dbc54d","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/volume/manager.py":[{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"376d6209134dc639b78fe9342e8ffd2650ccb3fe","unresolved":false,"context_lines":[{"line_number":4717,"context_line":"    def enable_replication(self, ctxt, group):"},{"line_number":4718,"context_line":"        \"\"\"Enable replication.\"\"\""},{"line_number":4719,"context_line":"        if group.replication_status not in ("},{"line_number":4720,"context_line":"                fields.ReplicationStatus.ENABLING):"},{"line_number":4721,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""},{"line_number":4722,"context_line":"                    \"enabling. Cannot enable replication.\") % group.id"},{"line_number":4723,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_c0fa8cbb","line":4720,"range":{"start_line":4720,"start_character":23,"end_line":4720,"end_character":40},"updated":"2017-03-28 05:50:06.000000000","message":"is \"if group.replication_status !\u003d (fields.ReplicationStatus.ENABLING)\" better here?\nat the first glance, \"if group.replication_status not in ( fields.ReplicationStatus.ENABLING)\" seems like you want to check the value of group.replication_status is in a string or not. alternative way is to change \"()\" to \"[]\", but it is not a good choice here.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4717,"context_line":"    def enable_replication(self, ctxt, group):"},{"line_number":4718,"context_line":"        \"\"\"Enable replication.\"\"\""},{"line_number":4719,"context_line":"        if group.replication_status not in ("},{"line_number":4720,"context_line":"                fields.ReplicationStatus.ENABLING):"},{"line_number":4721,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""},{"line_number":4722,"context_line":"                    \"enabling. Cannot enable replication.\") % group.id"},{"line_number":4723,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_ab34e793","line":4720,"range":{"start_line":4720,"start_character":23,"end_line":4720,"end_character":40},"in_reply_to":"ffe62b97_c0fa8cbb","updated":"2017-03-28 21:36:10.000000000","message":"This is just easier for future expansion if we want to add more statuses to check here.  () is more efficient than using [] performance wise.  Since there\u0027s only one status here, I changed it back to !\u003d.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"376d6209134dc639b78fe9342e8ffd2650ccb3fe","unresolved":false,"context_lines":[{"line_number":4724,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":4725,"context_line":""},{"line_number":4726,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4727,"context_line":"            ctxt, group.id)"},{"line_number":4728,"context_line":"        for vol in volumes:"},{"line_number":4729,"context_line":"            if vol.replication_status not in ("},{"line_number":4730,"context_line":"                    fields.ReplicationStatus.ENABLING):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_1e2a1a7e","line":4727,"range":{"start_line":4727,"start_character":18,"end_line":4727,"end_character":23},"updated":"2017-03-28 05:50:06.000000000","message":"is it possible to use group.volumes instead of objects.VolumeList.get_all_by_generic_group?","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4724,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":4725,"context_line":""},{"line_number":4726,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4727,"context_line":"            ctxt, group.id)"},{"line_number":4728,"context_line":"        for vol in volumes:"},{"line_number":4729,"context_line":"            if vol.replication_status not in ("},{"line_number":4730,"context_line":"                    fields.ReplicationStatus.ENABLING):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_4b231b57","line":4727,"range":{"start_line":4727,"start_character":18,"end_line":4727,"end_character":23},"in_reply_to":"ffe62b97_1e2a1a7e","updated":"2017-03-28 21:36:10.000000000","message":"Yes, actually group.volumes is available.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4726,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4727,"context_line":"            ctxt, group.id)"},{"line_number":4728,"context_line":"        for vol in volumes:"},{"line_number":4729,"context_line":"            if vol.replication_status not in ("},{"line_number":4730,"context_line":"                    fields.ReplicationStatus.ENABLING):"},{"line_number":4731,"context_line":"                msg \u003d _(\"Replication status in volume %s is not \""},{"line_number":4732,"context_line":"                        \"enabling. Cannot enable replication.\") % vol.id"},{"line_number":4733,"context_line":"                LOG.error(msg)"},{"line_number":4734,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":4735,"context_line":""},{"line_number":4736,"context_line":"        self._notify_about_group_usage("},{"line_number":4737,"context_line":"            ctxt, group, \"enable_replication.start\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f1f7968a","line":4734,"range":{"start_line":4729,"start_character":12,"end_line":4734,"end_character":57},"updated":"2017-03-28 12:37:16.000000000","message":"The codes are same with line 4719~4724. Maybe can use a function to do this?","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4726,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4727,"context_line":"            ctxt, group.id)"},{"line_number":4728,"context_line":"        for vol in volumes:"},{"line_number":4729,"context_line":"            if vol.replication_status not in ("},{"line_number":4730,"context_line":"                    fields.ReplicationStatus.ENABLING):"},{"line_number":4731,"context_line":"                msg \u003d _(\"Replication status in volume %s is not \""},{"line_number":4732,"context_line":"                        \"enabling. Cannot enable replication.\") % vol.id"},{"line_number":4733,"context_line":"                LOG.error(msg)"},{"line_number":4734,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":4735,"context_line":""},{"line_number":4736,"context_line":"        self._notify_about_group_usage("},{"line_number":4737,"context_line":"            ctxt, group, \"enable_replication.start\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_2b87b7b7","line":4734,"range":{"start_line":4729,"start_character":12,"end_line":4734,"end_character":57},"in_reply_to":"ffe62b97_f1f7968a","updated":"2017-03-28 21:36:10.000000000","message":"I guess it is possible to use a function.  Since lines 4719-4724 and 4729-4734 are dealing with different objects - volume vs group, I think it\u0027s more clear to keep them separate.  Otherwise we\u0027ll need to add extra if-else logic to figure out which object it is in the function.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"e22fd689e2f35891d939926c4784a2ad5447e35c","unresolved":false,"context_lines":[{"line_number":4742,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":4743,"context_line":""},{"line_number":4744,"context_line":"            model_update, volumes_model_update \u003d ("},{"line_number":4745,"context_line":"                self.driver.enable_replication(ctxt, group, volumes))"},{"line_number":4746,"context_line":""},{"line_number":4747,"context_line":"            if volumes_model_update:"},{"line_number":4748,"context_line":"                for update in volumes_model_update:"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_e93916f3","line":4745,"range":{"start_line":4745,"start_character":28,"end_line":4745,"end_character":46},"updated":"2017-03-23 14:27:37.000000000","message":"Don\u0027t you need to check if the driver implemented this?\n(catch NotImplemented Error)","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4742,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":4743,"context_line":""},{"line_number":4744,"context_line":"            model_update, volumes_model_update \u003d ("},{"line_number":4745,"context_line":"                self.driver.enable_replication(ctxt, group, volumes))"},{"line_number":4746,"context_line":""},{"line_number":4747,"context_line":"            if volumes_model_update:"},{"line_number":4748,"context_line":"                for update in volumes_model_update:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_0b7e33ae","line":4745,"range":{"start_line":4745,"start_character":28,"end_line":4745,"end_character":46},"in_reply_to":"1a1ced50_e93916f3","updated":"2017-03-28 21:36:10.000000000","message":"If driver has not implemented this, it will raise NotImplementedError.  If I check it here, I\u0027ll have to raise the same exception.  So I won\u0027t add the extra code here.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4761,"context_line":"            if model_update:"},{"line_number":4762,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4763,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4764,"context_line":"                    msg \u003d (_(\u0027Enable replication failed.\u0027))"},{"line_number":4765,"context_line":"                    LOG.error(msg,"},{"line_number":4766,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4767,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_d1737215","line":4764,"range":{"start_line":4764,"start_character":26,"end_line":4764,"end_character":59},"updated":"2017-03-28 12:37:16.000000000","message":"unnecessary  ()","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4761,"context_line":"            if model_update:"},{"line_number":4762,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4763,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4764,"context_line":"                    msg \u003d (_(\u0027Enable replication failed.\u0027))"},{"line_number":4765,"context_line":"                    LOG.error(msg,"},{"line_number":4766,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4767,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_36db9e7c","line":4764,"range":{"start_line":4764,"start_character":26,"end_line":4764,"end_character":59},"in_reply_to":"ffe62b97_d1737215","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4781,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4782,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4783,"context_line":"                    vol_obj.save()"},{"line_number":4784,"context_line":"            err_msg \u003d (_(\"Enable replication failed.\"))"},{"line_number":4785,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4786,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4787,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f153166a","line":4784,"range":{"start_line":4784,"start_character":21,"end_line":4784,"end_character":55},"updated":"2017-03-28 12:37:16.000000000","message":"same","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4781,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4782,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4783,"context_line":"                    vol_obj.save()"},{"line_number":4784,"context_line":"            err_msg \u003d (_(\"Enable replication failed.\"))"},{"line_number":4785,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4786,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4787,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f6e09628","line":4784,"range":{"start_line":4784,"start_character":21,"end_line":4784,"end_character":55},"in_reply_to":"ffe62b97_f153166a","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4801,"context_line":"    def disable_replication(self, ctxt, group):"},{"line_number":4802,"context_line":"        \"\"\"Disable replication.\"\"\""},{"line_number":4803,"context_line":"        if group.replication_status not in ("},{"line_number":4804,"context_line":"                fields.ReplicationStatus.DISABLING):"},{"line_number":4805,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""},{"line_number":4806,"context_line":"                    \"disabling. Cannot disable replication.\") % group.id"},{"line_number":4807,"context_line":"            LOG.error(msg)"},{"line_number":4808,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":4809,"context_line":""},{"line_number":4810,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4811,"context_line":"            ctxt, group.id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_71f6e665","line":4808,"range":{"start_line":4804,"start_character":16,"end_line":4808,"end_character":52},"updated":"2017-03-28 12:37:16.000000000","message":"similar with enable_replication()","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4801,"context_line":"    def disable_replication(self, ctxt, group):"},{"line_number":4802,"context_line":"        \"\"\"Disable replication.\"\"\""},{"line_number":4803,"context_line":"        if group.replication_status not in ("},{"line_number":4804,"context_line":"                fields.ReplicationStatus.DISABLING):"},{"line_number":4805,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""},{"line_number":4806,"context_line":"                    \"disabling. Cannot disable replication.\") % group.id"},{"line_number":4807,"context_line":"            LOG.error(msg)"},{"line_number":4808,"context_line":"            raise exception.InvalidGroup(reason\u003dmsg)"},{"line_number":4809,"context_line":""},{"line_number":4810,"context_line":"        volumes \u003d objects.VolumeList.get_all_by_generic_group("},{"line_number":4811,"context_line":"            ctxt, group.id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_56c74297","line":4808,"range":{"start_line":4804,"start_character":16,"end_line":4808,"end_character":52},"in_reply_to":"ffe62b97_71f6e665","updated":"2017-03-28 21:36:10.000000000","message":"Same reply as above.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4845,"context_line":"            if model_update:"},{"line_number":4846,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4847,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4848,"context_line":"                    msg \u003d (_(\u0027Disable replication failed.\u0027))"},{"line_number":4849,"context_line":"                    LOG.error(msg,"},{"line_number":4850,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4851,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_b18c6ed7","line":4848,"range":{"start_line":4848,"start_character":26,"end_line":4848,"end_character":60},"updated":"2017-03-28 12:37:16.000000000","message":"same","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4845,"context_line":"            if model_update:"},{"line_number":4846,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4847,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4848,"context_line":"                    msg \u003d (_(\u0027Disable replication failed.\u0027))"},{"line_number":4849,"context_line":"                    LOG.error(msg,"},{"line_number":4850,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4851,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_564ce240","line":4848,"range":{"start_line":4848,"start_character":26,"end_line":4848,"end_character":60},"in_reply_to":"ffe62b97_b18c6ed7","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4865,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4866,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4867,"context_line":"                    vol_obj.save()"},{"line_number":4868,"context_line":"            err_msg \u003d (_(\"Disable replication group failed.\"))"},{"line_number":4869,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4870,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4871,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_71c4a6f5","line":4868,"range":{"start_line":4868,"start_character":22,"end_line":4868,"end_character":62},"updated":"2017-03-28 12:37:16.000000000","message":"same","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4865,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4866,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4867,"context_line":"                    vol_obj.save()"},{"line_number":4868,"context_line":"            err_msg \u003d (_(\"Disable replication group failed.\"))"},{"line_number":4869,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4870,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4871,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_96570acb","line":4868,"range":{"start_line":4868,"start_character":22,"end_line":4868,"end_character":62},"in_reply_to":"ffe62b97_71c4a6f5","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4937,"context_line":"            if model_update:"},{"line_number":4938,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4939,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4940,"context_line":"                    msg \u003d (_(\u0027Failover replication failed.\u0027))"},{"line_number":4941,"context_line":"                    LOG.error(msg,"},{"line_number":4942,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4943,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_d1a81221","line":4940,"range":{"start_line":4940,"start_character":26,"end_line":4940,"end_character":61},"updated":"2017-03-28 12:37:16.000000000","message":"same","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4937,"context_line":"            if model_update:"},{"line_number":4938,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4939,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4940,"context_line":"                    msg \u003d (_(\u0027Failover replication failed.\u0027))"},{"line_number":4941,"context_line":"                    LOG.error(msg,"},{"line_number":4942,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"},{"line_number":4943,"context_line":"                                        \u0027id\u0027: group.id})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_166bfa84","line":4940,"range":{"start_line":4940,"start_character":26,"end_line":4940,"end_character":61},"in_reply_to":"ffe62b97_d1a81221","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e72c398891f8c53dbb5c7eb4733e247097798bda","unresolved":false,"context_lines":[{"line_number":4957,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4958,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4959,"context_line":"                    vol_obj.save()"},{"line_number":4960,"context_line":"            err_msg \u003d (_(\"Failover replication failed.\"))"},{"line_number":4961,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4962,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4963,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_9164ca23","line":4960,"range":{"start_line":4960,"start_character":22,"end_line":4960,"end_character":57},"updated":"2017-03-28 12:37:16.000000000","message":"same","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":4957,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4958,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4959,"context_line":"                    vol_obj.save()"},{"line_number":4960,"context_line":"            err_msg \u003d (_(\"Failover replication failed.\"))"},{"line_number":4961,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4962,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4963,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_f66776b6","line":4960,"range":{"start_line":4960,"start_character":22,"end_line":4960,"end_character":57},"in_reply_to":"ffe62b97_9164ca23","updated":"2017-03-28 21:36:10.000000000","message":"Done","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"376d6209134dc639b78fe9342e8ffd2650ccb3fe","unresolved":false,"context_lines":[{"line_number":5033,"context_line":"                        if dev:"},{"line_number":5034,"context_line":"                            replication_targets.append({\u0027backend_id\u0027: dev})"},{"line_number":5035,"context_line":""},{"line_number":5036,"context_line":"        except exception.CinderException:"},{"line_number":5037,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"},{"line_number":5038,"context_line":"            LOG.exception(err_msg)"},{"line_number":5039,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_2096d840","line":5036,"range":{"start_line":5036,"start_character":25,"end_line":5036,"end_character":40},"updated":"2017-03-28 05:50:06.000000000","message":"Sorry, Can you tell me which API used here may throw CinderException? thank you very much.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e12ac78727c852707e6be1ed3d05976924c7ca4c","unresolved":false,"context_lines":[{"line_number":5033,"context_line":"                        if dev:"},{"line_number":5034,"context_line":"                            replication_targets.append({\u0027backend_id\u0027: dev})"},{"line_number":5035,"context_line":""},{"line_number":5036,"context_line":"        except exception.CinderException:"},{"line_number":5037,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"},{"line_number":5038,"context_line":"            LOG.exception(err_msg)"},{"line_number":5039,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffe62b97_2687e9b7","line":5036,"range":{"start_line":5036,"start_character":25,"end_line":5036,"end_character":40},"in_reply_to":"ffe62b97_2096d840","updated":"2017-03-28 21:36:10.000000000","message":"objects.Group.get_by_id may throw GroupNotFound.  Since this is the only CinderException that might be caught here, I changed this to GroupNotFound.","commit_id":"0df0d1343b49c13c2dcca9c28628ab83a6bff781"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"5d59970391c843ed72665ee43e0b890a82285af9","unresolved":false,"context_lines":[{"line_number":2059,"context_line":"                # NOTE(xyang): If driver reports replication_status to be"},{"line_number":2060,"context_line":"                # \u0027error\u0027 in volume_stats, get model updates from driver"},{"line_number":2061,"context_line":"                # and update db"},{"line_number":2062,"context_line":"                if volume_stats.get(\u0027replication_status\u0027) \u003d\u003d ("},{"line_number":2063,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":2064,"context_line":"                    group_model_updates, volume_model_updates \u003d ("},{"line_number":2065,"context_line":"                        self.driver.get_replication_error_status(context))"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_d918d476","line":2062,"updated":"2017-04-14 07:25:54.000000000","message":"I have doubt that how vendor implements this interface.\n\nfor _report_driver_status, we usually care backend-scope status, managed pool status, backend capabilities.\nwhile as a third party driver, it doesn\u0027t know which groups, volumes are managed by itself. I think it\u0027s ambiguous for developers to implement this API.\n\nAny idea?","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":2059,"context_line":"                # NOTE(xyang): If driver reports replication_status to be"},{"line_number":2060,"context_line":"                # \u0027error\u0027 in volume_stats, get model updates from driver"},{"line_number":2061,"context_line":"                # and update db"},{"line_number":2062,"context_line":"                if volume_stats.get(\u0027replication_status\u0027) \u003d\u003d ("},{"line_number":2063,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":2064,"context_line":"                    group_model_updates, volume_model_updates \u003d ("},{"line_number":2065,"context_line":"                        self.driver.get_replication_error_status(context))"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_6528c685","line":2062,"in_reply_to":"7ffa3b31_d918d476","updated":"2017-04-17 15:43:14.000000000","message":"Maybe I should pass groups and volumes to the driver.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"760f8eb49e365fc9358978c16d96a82fca589d1a","unresolved":false,"context_lines":[{"line_number":2070,"context_line":"                        grp_obj.save()"},{"line_number":2071,"context_line":"                    for vol_update in volume_model_updates:"},{"line_number":2072,"context_line":"                        vol_obj \u003d objects.Volume.get_by_id("},{"line_number":2073,"context_line":"                            context, vol_update[\u0027id\u0027])"},{"line_number":2074,"context_line":"                        vol_obj.update(vol_update)"},{"line_number":2075,"context_line":"                        vol_obj.save()"},{"line_number":2076,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_f8cb6a1b","line":2073,"updated":"2017-04-17 06:08:21.000000000","message":"Ditto","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"760f8eb49e365fc9358978c16d96a82fca589d1a","unresolved":false,"context_lines":[{"line_number":4101,"context_line":""},{"line_number":4102,"context_line":"            if volumes_model_update:"},{"line_number":4103,"context_line":"                for update in volumes_model_update:"},{"line_number":4104,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4105,"context_line":"                    vol_obj.update(update)"},{"line_number":4106,"context_line":"                    vol_obj.save()"},{"line_number":4107,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_986c6637","line":4104,"updated":"2017-04-17 06:08:21.000000000","message":"Could you please use `volume_id` instead of `id` to keep consistence with failover API.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":4101,"context_line":""},{"line_number":4102,"context_line":"            if volumes_model_update:"},{"line_number":4103,"context_line":"                for update in volumes_model_update:"},{"line_number":4104,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4105,"context_line":"                    vol_obj.update(update)"},{"line_number":4106,"context_line":"                    vol_obj.save()"},{"line_number":4107,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_9f9205f6","line":4104,"in_reply_to":"7ffa3b31_986c6637","updated":"2017-04-17 15:43:14.000000000","message":"I see what you are saying.  However, these are group replication APIs so I want to be consistent with the groups APIs which use \u0027id\u0027.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"760f8eb49e365fc9358978c16d96a82fca589d1a","unresolved":false,"context_lines":[{"line_number":4183,"context_line":""},{"line_number":4184,"context_line":"            if volumes_model_update:"},{"line_number":4185,"context_line":"                for update in volumes_model_update:"},{"line_number":4186,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4187,"context_line":"                    vol_obj.update(update)"},{"line_number":4188,"context_line":"                    vol_obj.save()"},{"line_number":4189,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_d85b0e85","line":4186,"updated":"2017-04-17 06:08:21.000000000","message":"Ditto","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":4183,"context_line":""},{"line_number":4184,"context_line":"            if volumes_model_update:"},{"line_number":4185,"context_line":"                for update in volumes_model_update:"},{"line_number":4186,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4187,"context_line":"                    vol_obj.update(update)"},{"line_number":4188,"context_line":"                    vol_obj.save()"},{"line_number":4189,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_5f635d1b","line":4186,"in_reply_to":"7ffa3b31_d85b0e85","updated":"2017-04-17 15:43:14.000000000","message":"same","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"66a725dc20dfad4b2f1be3a5edd8334a65582a3e","unresolved":false,"context_lines":[{"line_number":4236,"context_line":""},{"line_number":4237,"context_line":"    # Replication group API (Tiramisu)"},{"line_number":4238,"context_line":"    def failover_replication(self, ctxt, group, allow_attached_volume\u003dFalse,"},{"line_number":4239,"context_line":"                             secondary_backend_id\u003dNone):"},{"line_number":4240,"context_line":"        \"\"\"Failover replication.\"\"\""},{"line_number":4241,"context_line":"        if group.replication_status !\u003d fields.ReplicationStatus.FAILING_OVER:"},{"line_number":4242,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_53f3340b","line":4239,"range":{"start_line":4239,"start_character":29,"end_line":4239,"end_character":49},"updated":"2017-04-07 05:54:55.000000000","message":"Do I miss anything? in api.py, you have checked group.replication_status and vol.status, why you need to check them again here.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":4236,"context_line":""},{"line_number":4237,"context_line":"    # Replication group API (Tiramisu)"},{"line_number":4238,"context_line":"    def failover_replication(self, ctxt, group, allow_attached_volume\u003dFalse,"},{"line_number":4239,"context_line":"                             secondary_backend_id\u003dNone):"},{"line_number":4240,"context_line":"        \"\"\"Failover replication.\"\"\""},{"line_number":4241,"context_line":"        if group.replication_status !\u003d fields.ReplicationStatus.FAILING_OVER:"},{"line_number":4242,"context_line":"            msg \u003d _(\"Replication status in group %s is not \""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_aa6d7d99","line":4239,"range":{"start_line":4239,"start_character":29,"end_line":4239,"end_character":49},"in_reply_to":"bff0334d_53f3340b","updated":"2017-04-17 15:43:14.000000000","message":"I assume you refer to the logic on lines 4241-4245?  We usually check the status in manager even if we have checked it in api.  This is because there is a time window between api and manager and things can change.  Although I need to refresh the group here so the status gets updated before I check it again.","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"760f8eb49e365fc9358978c16d96a82fca589d1a","unresolved":false,"context_lines":[{"line_number":4273,"context_line":""},{"line_number":4274,"context_line":"            if volumes_model_update:"},{"line_number":4275,"context_line":"                for update in volumes_model_update:"},{"line_number":4276,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4277,"context_line":"                    vol_obj.update(update)"},{"line_number":4278,"context_line":"                    vol_obj.save()"},{"line_number":4279,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_98558653","line":4276,"updated":"2017-04-17 06:08:21.000000000","message":"Ditto","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd0b741ef879968c65ce8d97dcf5a9ea30dc3673","unresolved":false,"context_lines":[{"line_number":4273,"context_line":""},{"line_number":4274,"context_line":"            if volumes_model_update:"},{"line_number":4275,"context_line":"                for update in volumes_model_update:"},{"line_number":4276,"context_line":"                    vol_obj \u003d objects.Volume.get_by_id(context, update[\u0027id\u0027])"},{"line_number":4277,"context_line":"                    vol_obj.update(update)"},{"line_number":4278,"context_line":"                    vol_obj.save()"},{"line_number":4279,"context_line":"                    # If we failed to enable a volume, make sure the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_0a2d9142","line":4276,"in_reply_to":"7ffa3b31_98558653","updated":"2017-04-17 15:43:14.000000000","message":"same","commit_id":"c40524167c95069775b134a61830b9357c99b680"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"7d6ecdc132747f1e5ec47916a905fde92a336012","unresolved":false,"context_lines":[{"line_number":4136,"context_line":""},{"line_number":4137,"context_line":"            if model_update:"},{"line_number":4138,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4139,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4140,"context_line":"                    msg \u003d _(\u0027Enable replication failed.\u0027)"},{"line_number":4141,"context_line":"                    LOG.error(msg,"},{"line_number":4142,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_8b678c26","line":4139,"range":{"start_line":4139,"start_character":31,"end_line":4139,"end_character":48},"updated":"2017-04-24 04:04:28.000000000","message":"nits: I prefer to add \u0027,\u0027 after fields.ReplicationStatus.ERROR, because now there is only one element in the tuple, otherwise \u0027e\u0027, \u0027er, \u0027err\u0027 and so on will meet the condition here too.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"417e3492b597d9c9ba2cd662c750c4cd8bccc097","unresolved":false,"context_lines":[{"line_number":4136,"context_line":""},{"line_number":4137,"context_line":"            if model_update:"},{"line_number":4138,"context_line":"                if model_update.get(\u0027replication_status\u0027) in ("},{"line_number":4139,"context_line":"                        fields.ReplicationStatus.ERROR):"},{"line_number":4140,"context_line":"                    msg \u003d _(\u0027Enable replication failed.\u0027)"},{"line_number":4141,"context_line":"                    LOG.error(msg,"},{"line_number":4142,"context_line":"                              resource\u003d{\u0027type\u0027: \u0027group\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_c8ed8c26","line":4139,"range":{"start_line":4139,"start_character":31,"end_line":4139,"end_character":48},"in_reply_to":"5ff73747_8b678c26","updated":"2017-04-24 12:53:35.000000000","message":"Done","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"                    group_model_updates, volume_model_updates \u003d ("},{"line_number":2085,"context_line":"                        self.driver.get_replication_error_status(context,"},{"line_number":2086,"context_line":"                                                                 groups))"},{"line_number":2087,"context_line":"                    for grp_update in group_model_updates:"},{"line_number":2088,"context_line":"                        grp_obj \u003d objects.Group.get_by_id("},{"line_number":2089,"context_line":"                            context, grp_update[\u0027group_id\u0027])"},{"line_number":2090,"context_line":"                        grp_obj.update(grp_update)"},{"line_number":2091,"context_line":"                        grp_obj.save()"},{"line_number":2092,"context_line":"                    for vol_update in volume_model_updates:"},{"line_number":2093,"context_line":"                        vol_obj \u003d objects.Volume.get_by_id("},{"line_number":2094,"context_line":"                            context, vol_update[\u0027volume_id\u0027])"},{"line_number":2095,"context_line":"                        vol_obj.update(vol_update)"},{"line_number":2096,"context_line":"                        vol_obj.save()"},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"                # Append volume stats with \u0027allocated_capacity_gb\u0027"},{"line_number":2099,"context_line":"                self._append_volume_stats(volume_stats)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_579ec154","line":2096,"range":{"start_line":2087,"start_character":18,"end_line":2096,"end_character":38},"updated":"2017-05-03 03:06:25.000000000","message":"What if the exception raised here? such as group/volume is not found.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"                    group_model_updates, volume_model_updates \u003d ("},{"line_number":2085,"context_line":"                        self.driver.get_replication_error_status(context,"},{"line_number":2086,"context_line":"                                                                 groups))"},{"line_number":2087,"context_line":"                    for grp_update in group_model_updates:"},{"line_number":2088,"context_line":"                        grp_obj \u003d objects.Group.get_by_id("},{"line_number":2089,"context_line":"                            context, grp_update[\u0027group_id\u0027])"},{"line_number":2090,"context_line":"                        grp_obj.update(grp_update)"},{"line_number":2091,"context_line":"                        grp_obj.save()"},{"line_number":2092,"context_line":"                    for vol_update in volume_model_updates:"},{"line_number":2093,"context_line":"                        vol_obj \u003d objects.Volume.get_by_id("},{"line_number":2094,"context_line":"                            context, vol_update[\u0027volume_id\u0027])"},{"line_number":2095,"context_line":"                        vol_obj.update(vol_update)"},{"line_number":2096,"context_line":"                        vol_obj.save()"},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"                # Append volume stats with \u0027allocated_capacity_gb\u0027"},{"line_number":2099,"context_line":"                self._append_volume_stats(volume_stats)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_8c496532","line":2096,"range":{"start_line":2087,"start_character":18,"end_line":2096,"end_character":38},"in_reply_to":"5ff73747_579ec154","updated":"2017-05-23 04:57:03.000000000","message":"Logged a warning and continue.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"f039517799b531208ca15681a88f7145015cee5a","unresolved":false,"context_lines":[{"line_number":4140,"context_line":"                for vol in volumes:"},{"line_number":4141,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4142,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4143,"context_line":"                    vol_obj.save()"},{"line_number":4144,"context_line":"            err_msg \u003d _(\"Enable replication failed.\")"},{"line_number":4145,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4146,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_aa98f869","line":4143,"range":{"start_line":4143,"start_character":20,"end_line":4143,"end_character":27},"updated":"2017-05-15 11:15:37.000000000","message":"should be vol.save()??","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":4140,"context_line":"                for vol in volumes:"},{"line_number":4141,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4142,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4143,"context_line":"                    vol_obj.save()"},{"line_number":4144,"context_line":"            err_msg \u003d _(\"Enable replication failed.\")"},{"line_number":4145,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4146,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_fbaf7d7a","line":4143,"range":{"start_line":4143,"start_character":20,"end_line":4143,"end_character":27},"in_reply_to":"1f013ff3_aa98f869","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"e3835533d0a46f507d9e197c9da151dd9a680d3b","unresolved":false,"context_lines":[{"line_number":4214,"context_line":"                    group.update(model_update)"},{"line_number":4215,"context_line":"                    group.save()"},{"line_number":4216,"context_line":""},{"line_number":4217,"context_line":"        except exception.CinderException:"},{"line_number":4218,"context_line":"            group.status \u003d fields.GroupStatus.ERROR"},{"line_number":4219,"context_line":"            group.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4220,"context_line":"            group.save()"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_9adb051a","line":4217,"range":{"start_line":4217,"start_character":7,"end_line":4217,"end_character":41},"updated":"2017-05-17 08:42:55.000000000","message":"is it better to catch exception.InvalidReplicationTarget before CinderException just as API failover does? so that user can get much more useful error information.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":4214,"context_line":"                    group.update(model_update)"},{"line_number":4215,"context_line":"                    group.save()"},{"line_number":4216,"context_line":""},{"line_number":4217,"context_line":"        except exception.CinderException:"},{"line_number":4218,"context_line":"            group.status \u003d fields.GroupStatus.ERROR"},{"line_number":4219,"context_line":"            group.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4220,"context_line":"            group.save()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_e1ba2a6c","line":4217,"range":{"start_line":4217,"start_character":7,"end_line":4217,"end_character":41},"in_reply_to":"1f013ff3_9adb051a","updated":"2017-05-23 04:57:03.000000000","message":"I need to capture a range of exceptions raised by driver here.  InvalidReplicationTarget will be included if raised.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"1b2b0401bd09438338b41e3c58fe0f666b2c3402","unresolved":false,"context_lines":[{"line_number":4224,"context_line":"                for vol in volumes:"},{"line_number":4225,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4226,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4227,"context_line":"                    vol_obj.save()"},{"line_number":4228,"context_line":"            err_msg \u003d _(\"Disable replication group failed.\")"},{"line_number":4229,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4230,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_f3cb5947","line":4227,"range":{"start_line":4227,"start_character":20,"end_line":4227,"end_character":27},"updated":"2017-05-17 08:20:42.000000000","message":"should be vol.save() here too.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":4224,"context_line":"                for vol in volumes:"},{"line_number":4225,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4226,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4227,"context_line":"                    vol_obj.save()"},{"line_number":4228,"context_line":"            err_msg \u003d _(\"Disable replication group failed.\")"},{"line_number":4229,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4230,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_1be471e0","line":4227,"range":{"start_line":4227,"start_character":20,"end_line":4227,"end_character":27},"in_reply_to":"1f013ff3_f3cb5947","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":4258,"context_line":"            if vol.status \u003d\u003d \u0027in-use\u0027 and not allow_attached_volume:"},{"line_number":4259,"context_line":"                msg \u003d _(\"Volume %s is attached but allow_attached_volume flag \""},{"line_number":4260,"context_line":"                        \"is False. Cannot failover replication.\") % vol.id"},{"line_number":4261,"context_line":"                LOG.error(msg)"},{"line_number":4262,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":4263,"context_line":"            if (vol.replication_status !\u003d"},{"line_number":4264,"context_line":"                    fields.ReplicationStatus.FAILING_OVER):"},{"line_number":4265,"context_line":"                msg \u003d _(\"Replication status in volume %s is not \""}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_f7294df2","line":4262,"range":{"start_line":4261,"start_character":15,"end_line":4262,"end_character":57},"updated":"2017-05-03 03:06:25.000000000","message":"Move this statement outside of the if statement and raise the exception if msg is not None:)","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"1b2b0401bd09438338b41e3c58fe0f666b2c3402","unresolved":false,"context_lines":[{"line_number":4315,"context_line":"                for vol in volumes:"},{"line_number":4316,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4317,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4318,"context_line":"                    vol_obj.save()"},{"line_number":4319,"context_line":"            err_msg \u003d _(\"Failover replication failed.\")"},{"line_number":4320,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4321,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_93dd3516","line":4318,"range":{"start_line":4318,"start_character":20,"end_line":4318,"end_character":27},"updated":"2017-05-17 08:20:42.000000000","message":"ditto","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":4315,"context_line":"                for vol in volumes:"},{"line_number":4316,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4317,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4318,"context_line":"                    vol_obj.save()"},{"line_number":4319,"context_line":"            err_msg \u003d _(\"Failover replication failed.\")"},{"line_number":4320,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4321,"context_line":"                                                  group_id\u003dgroup.id)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_9bcf6155","line":4318,"range":{"start_line":4318,"start_character":20,"end_line":4318,"end_character":27},"in_reply_to":"1f013ff3_93dd3516","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"a8572dbe3c687a77260865724b59e908e221dd37","unresolved":false,"context_lines":[{"line_number":4316,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4317,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4318,"context_line":"                    vol_obj.save()"},{"line_number":4319,"context_line":"            err_msg \u003d _(\"Failover replication failed.\")"},{"line_number":4320,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4321,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4322,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1f013ff3_0a8feccc","line":4319,"range":{"start_line":4319,"start_character":12,"end_line":4319,"end_character":55},"updated":"2017-05-15 11:31:01.000000000","message":"it is better to include the error message from the exception thrown by driver into err_msg, so that user can know what is wrong in the storage side.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":4316,"context_line":"                    vol.status \u003d \u0027error\u0027"},{"line_number":4317,"context_line":"                    vol.replication_status \u003d fields.ReplicationStatus.ERROR"},{"line_number":4318,"context_line":"                    vol_obj.save()"},{"line_number":4319,"context_line":"            err_msg \u003d _(\"Failover replication failed.\")"},{"line_number":4320,"context_line":"            raise exception.ReplicationGroupError(reason\u003derr_msg,"},{"line_number":4321,"context_line":"                                                  group_id\u003dgroup.id)"},{"line_number":4322,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_21cee22d","line":4319,"range":{"start_line":4319,"start_character":12,"end_line":4319,"end_character":55},"in_reply_to":"1f013ff3_0a8feccc","updated":"2017-05-23 04:57:03.000000000","message":"Done","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}],"cinder/volume/utils.py":[{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"281f8269d53e35d904c6db962bf572f03ba6537c","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_4bee2489","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"updated":"2017-04-24 03:48:22.000000000","message":"objects.GroupList.get_all will return all groups even though some of them have been deleted, correct? if yes, it is better to filter out those groups so that driver doesn\u0027t need to query deleted groups.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"a5724a8e3e9883666dcad610a5c25bd69434bb0b","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_de75469a","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"in_reply_to":"5ff73747_0d04a616","updated":"2017-04-24 13:29:16.000000000","message":"I verified that it will only return available groups.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"417e3492b597d9c9ba2cd662c750c4cd8bccc097","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_0d04a616","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"in_reply_to":"5ff73747_4bee2489","updated":"2017-04-24 12:53:35.000000000","message":"It should not return deleted groups.  If so, it should be fixed in get_all.  I\u0027ll take a look.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"260e560740c4b0f60849bc3be31c874dee75c77c","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_852a3829","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"in_reply_to":"5ff73747_626e0230","updated":"2017-04-28 03:01:05.000000000","message":"BTW, it also returns groups among different backends. if it can just return groups belong to specific backend, it would be great for driver.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b8ec4185ce42325ce9417c58cf8521ff192fe098","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_14d95c21","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"in_reply_to":"5ff73747_852a3829","updated":"2017-05-02 21:17:31.000000000","message":"Discussed with Sean about this.  Changed this to filter by backends.  We are still returning all replication groups on this backend regardless of the statuses because some backends may be able to do something with groups in error status.  You can skip it if your driver won\u0027t do anything with it.","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"4c8cb8ef5fa2986dfde183c391e224aeebfd26f1","unresolved":false,"context_lines":[{"line_number":939,"context_line":""},{"line_number":940,"context_line":"def get_replication_groups(ctxt):"},{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all(ctxt)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ff73747_626e0230","line":942,"range":{"start_line":942,"start_character":28,"end_line":942,"end_character":29},"in_reply_to":"5ff73747_de75469a","updated":"2017-04-28 02:26:12.000000000","message":"Thanks xyang, I am sorry that I was wrong with get_all can return deleted group. but it does not only return available groups, it also returns error groups. so it may be better to add a filter here.\n\ncinder group-list\n+--------------------------------------+-----------+--------------+\n| ID                                   | Status    | Name         |\n+--------------------------------------+-----------+--------------+\n| 9490924e-e0f6-4090-ae46-b6b0fbbc920d | available | group-test-2 |\n| 9fb33d79-1c8a-4e12-9361-38078a130334 | error     | group-test   |\n+--------------------------------------+-----------+--------------+\n\n(Pdb) grp \u003d objects.GroupList.get_all(ctxt)\n(Pdb) grp\nGroupList(objects\u003d[Group(9490924e-e0f6-4090-ae46-b6b0fbbc920d),Group(9fb33d79-1c8a-4e12-9361-38078a130334)])\n(Pdb) grp[0].status\nu\u0027available\u0027\n(Pdb) grp[1].status\nu\u0027error\u0027","commit_id":"6fab9387f7f6a4d9b3459401997109dcc2db22e6"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"7386aecb490bc42f5a9f878280e6d3db96454072","unresolved":false,"context_lines":[{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all_by_host(ctxt, host)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    return groups"}],"source_content_type":"text/x-python","patch_set":25,"id":"5ff73747_978689db","line":944,"range":{"start_line":944,"start_character":11,"end_line":944,"end_character":49},"updated":"2017-05-03 03:06:25.000000000","message":"return [grp for grp in objects.GroupList.get_all_by_host(ctxt, host) if is_group_a_replication_group_type(grp)]","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2b4f04d9820dace8068f2a715c5fc17a86c5ef26","unresolved":false,"context_lines":[{"line_number":941,"context_line":"    groups \u003d []"},{"line_number":942,"context_line":"    grps \u003d objects.GroupList.get_all_by_host(ctxt, host)"},{"line_number":943,"context_line":"    for grp in grps:"},{"line_number":944,"context_line":"        if is_group_a_replication_group_type(grp):"},{"line_number":945,"context_line":"            groups.append(grp)"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    return groups"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff0f0b1f_7b1fedb6","line":944,"range":{"start_line":944,"start_character":11,"end_line":944,"end_character":49},"in_reply_to":"5ff73747_978689db","updated":"2017-05-23 04:57:03.000000000","message":"Your suggestion of course looks more pythonic, however, it is getting really hard to read due to length of the functions inside the [].  So I\u0027d prefer to keep my original code.","commit_id":"4c5cc9e703f11cf653b7f5fb8b0fe7c3e2bd028b"}]}
