)]}'
{"cinder/volume/driver.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"a04447b6fe742cb25bf998ae0519f2d2a4af5204","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            LOG.exception(_LE(\"Detaching snapshot from a remote node \""},{"line_number":402,"context_line":"                              \"is not supported.\"))"},{"line_number":403,"context_line":"            raise exception.NotSupportedOperation("},{"line_number":404,"context_line":"                operation\u003d_(\"detach snapshot from remote node\"))"},{"line_number":405,"context_line":"        else:"},{"line_number":406,"context_line":"            # Call local driver\u0027s terminate_connection and remove export."},{"line_number":407,"context_line":"            # NOTE(avishay) This is copied from the manager\u0027s code - need to"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_6d9b9a73","line":404,"updated":"2015-07-24 03:06:53.000000000","message":"detach -\u003e \u0027Detach\u0027. Also, maybe should add a \u0027.\u0027 at the EOL. Thanks.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"21bb8a13f774da6e1da47013b537be692849d2ed","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            LOG.exception(_LE(\"Detaching snapshot from a remote node \""},{"line_number":402,"context_line":"                              \"is not supported.\"))"},{"line_number":403,"context_line":"            raise exception.NotSupportedOperation("},{"line_number":404,"context_line":"                operation\u003d_(\"detach snapshot from remote node\"))"},{"line_number":405,"context_line":"        else:"},{"line_number":406,"context_line":"            # Call local driver\u0027s terminate_connection and remove export."},{"line_number":407,"context_line":"            # NOTE(avishay) This is copied from the manager\u0027s code - need to"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_ff6a6080","line":404,"in_reply_to":"3a50d1a3_6d9b9a73","updated":"2015-08-05 23:14:18.000000000","message":"This is not a full sentence. See where it is defined:\n\nclass NotSupportedOperation(Invalid):\n    message \u003d _(\"Operation not supported: %(operation)s.\")","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"d958040eaa422ce219131c14d21a75428ed0a82e","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                LOG.debug(\"snapshot %s: removing export\", snapshot.id)"},{"line_number":420,"context_line":"                self.remove_export_snapshot(context, snapshot)"},{"line_number":421,"context_line":"            except Exception as ex:"},{"line_number":422,"context_line":"                LOG.exception(_LE(\"Error detaching snapshot %(snapshot)s, \""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_42b2ab97","line":419,"updated":"2015-08-03 04:58:16.000000000","message":"snapshot or Snapshot, keep consistent with line 782.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"21bb8a13f774da6e1da47013b537be692849d2ed","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                LOG.debug(\"snapshot %s: removing export\", snapshot.id)"},{"line_number":420,"context_line":"                self.remove_export_snapshot(context, snapshot)"},{"line_number":421,"context_line":"            except Exception as ex:"},{"line_number":422,"context_line":"                LOG.exception(_LE(\"Error detaching snapshot %(snapshot)s, \""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_9f123c08","line":419,"in_reply_to":"3a50d1a3_42b2ab97","updated":"2015-08-05 23:14:18.000000000","message":"Done","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"d958040eaa422ce219131c14d21a75428ed0a82e","unresolved":false,"context_lines":[{"line_number":779,"context_line":"            # clean this up in the future."},{"line_number":780,"context_line":"            model_update \u003d None"},{"line_number":781,"context_line":"            try:"},{"line_number":782,"context_line":"                LOG.debug(\"Snapshot %s: creating export\", snapshot.id)"},{"line_number":783,"context_line":"                model_update \u003d self.create_export_snapshot(context, snapshot)"},{"line_number":784,"context_line":"                # NOTE(xyang): Snapshot also have provider_location"},{"line_number":785,"context_line":"                # and provider_auth in db."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_c22b1b94","line":782,"updated":"2015-08-03 04:58:16.000000000","message":"The message in LOG.debug, keep all message consistent about . at EOL or not.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"21bb8a13f774da6e1da47013b537be692849d2ed","unresolved":false,"context_lines":[{"line_number":779,"context_line":"            # clean this up in the future."},{"line_number":780,"context_line":"            model_update \u003d None"},{"line_number":781,"context_line":"            try:"},{"line_number":782,"context_line":"                LOG.debug(\"Snapshot %s: creating export\", snapshot.id)"},{"line_number":783,"context_line":"                model_update \u003d self.create_export_snapshot(context, snapshot)"},{"line_number":784,"context_line":"                # NOTE(xyang): Snapshot also have provider_location"},{"line_number":785,"context_line":"                # and provider_auth in db."}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_bf2e1841","line":782,"in_reply_to":"3a50d1a3_c22b1b94","updated":"2015-08-05 23:14:18.000000000","message":"Done","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"d958040eaa422ce219131c14d21a75428ed0a82e","unresolved":false,"context_lines":[{"line_number":793,"context_line":"                if model_update:"},{"line_number":794,"context_line":"                    LOG.exception(_LE(\"Failed updating model of snapshot \""},{"line_number":795,"context_line":"                                      \"%(snapshot_id)s with driver provided \""},{"line_number":796,"context_line":"                                      \"model %(model)s\"),"},{"line_number":797,"context_line":"                                  {\u0027snapshot_id\u0027: snapshot.id,"},{"line_number":798,"context_line":"                                   \u0027model\u0027: model_update})"},{"line_number":799,"context_line":"                    raise exception.ExportFailure(reason\u003dex)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_c2a6bb53","line":796,"updated":"2015-08-03 04:58:16.000000000","message":"Missing . at EOL.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"21bb8a13f774da6e1da47013b537be692849d2ed","unresolved":false,"context_lines":[{"line_number":793,"context_line":"                if model_update:"},{"line_number":794,"context_line":"                    LOG.exception(_LE(\"Failed updating model of snapshot \""},{"line_number":795,"context_line":"                                      \"%(snapshot_id)s with driver provided \""},{"line_number":796,"context_line":"                                      \"model %(model)s\"),"},{"line_number":797,"context_line":"                                  {\u0027snapshot_id\u0027: snapshot.id,"},{"line_number":798,"context_line":"                                   \u0027model\u0027: model_update})"},{"line_number":799,"context_line":"                    raise exception.ExportFailure(reason\u003dex)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_9f29dc39","line":796,"in_reply_to":"3a50d1a3_c2a6bb53","updated":"2015-08-05 23:14:18.000000000","message":"Done","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"581166f3fae616df0e1a6445dcbae372aaf7fe87","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def backup_volume(self, context, backup, backup_service):"},{"line_number":855,"context_line":"        \"\"\"Create a new backup from an existing volume.\"\"\""},{"line_number":856,"context_line":"        if self.backup_use_temp_snapshot():"},{"line_number":857,"context_line":"            self._backup_volume_temp_snapshot(context, backup,"},{"line_number":858,"context_line":"                                              backup_service)"},{"line_number":859,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_b6689589","line":856,"updated":"2015-08-03 01:14:48.000000000","message":"Hi Xing\nDoes it mean: driver only need to provide 1 implementation for non-disruptive backup, via temp snapshot or temp volume?","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"8ef7a1974689d98885b3e2a1cf69d62c04f0c2e6","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def backup_volume(self, context, backup, backup_service):"},{"line_number":855,"context_line":"        \"\"\"Create a new backup from an existing volume.\"\"\""},{"line_number":856,"context_line":"        if self.backup_use_temp_snapshot():"},{"line_number":857,"context_line":"            self._backup_volume_temp_snapshot(context, backup,"},{"line_number":858,"context_line":"                                              backup_service)"},{"line_number":859,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_a7dd3872","line":856,"in_reply_to":"3a50d1a3_b6689589","updated":"2015-08-03 21:12:44.000000000","message":"Yes. If it is via temp volume, a default implementation is already available. You just need to validate. If it is via temp snapshot, it is more optimal and driver needs to implement it.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"581166f3fae616df0e1a6445dcbae372aaf7fe87","unresolved":false,"context_lines":[{"line_number":876,"context_line":"        previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":877,"context_line":"        device_to_backup \u003d volume"},{"line_number":878,"context_line":"        temp_vol_ref \u003d None"},{"line_number":879,"context_line":"        if previous_status \u003d\u003d \"in_use\":"},{"line_number":880,"context_line":"            temp_vol_ref \u003d self._create_temp_cloned_volume("},{"line_number":881,"context_line":"                context, volume)"},{"line_number":882,"context_line":"            backup.temp_volume_id \u003d temp_vol_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_762c4d4a","line":879,"updated":"2015-08-03 01:14:48.000000000","message":"should be \u0027in-use\u0027\nsee  https://bugs.launchpad.net/cinder/+bug/1480734","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"8ef7a1974689d98885b3e2a1cf69d62c04f0c2e6","unresolved":false,"context_lines":[{"line_number":876,"context_line":"        previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":877,"context_line":"        device_to_backup \u003d volume"},{"line_number":878,"context_line":"        temp_vol_ref \u003d None"},{"line_number":879,"context_line":"        if previous_status \u003d\u003d \"in_use\":"},{"line_number":880,"context_line":"            temp_vol_ref \u003d self._create_temp_cloned_volume("},{"line_number":881,"context_line":"                context, volume)"},{"line_number":882,"context_line":"            backup.temp_volume_id \u003d temp_vol_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_2737e8b1","line":879,"in_reply_to":"3a50d1a3_762c4d4a","updated":"2015-08-03 21:12:44.000000000","message":"Oops. I have it fixed it in my own repo but didn\u0027t realize the merged code was broken:(.  Thanks for spotting this!","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"581166f3fae616df0e1a6445dcbae372aaf7fe87","unresolved":false,"context_lines":[{"line_number":907,"context_line":"        device_to_backup \u003d volume"},{"line_number":908,"context_line":"        is_snapshot \u003d False"},{"line_number":909,"context_line":"        temp_snapshot \u003d None"},{"line_number":910,"context_line":"        if previous_status \u003d\u003d \"in_use\":"},{"line_number":911,"context_line":"            temp_snapshot \u003d self._create_temp_snapshot(context, volume)"},{"line_number":912,"context_line":"            backup.temp_snapshot_id \u003d temp_snapshot.id"},{"line_number":913,"context_line":"            backup.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_b6ff35aa","line":910,"updated":"2015-08-03 01:14:48.000000000","message":"should be \u0027in-use\u0027\nsee  https://bugs.launchpad.net/cinder/+bug/1480734","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"8ef7a1974689d98885b3e2a1cf69d62c04f0c2e6","unresolved":false,"context_lines":[{"line_number":907,"context_line":"        device_to_backup \u003d volume"},{"line_number":908,"context_line":"        is_snapshot \u003d False"},{"line_number":909,"context_line":"        temp_snapshot \u003d None"},{"line_number":910,"context_line":"        if previous_status \u003d\u003d \"in_use\":"},{"line_number":911,"context_line":"            temp_snapshot \u003d self._create_temp_snapshot(context, volume)"},{"line_number":912,"context_line":"            backup.temp_snapshot_id \u003d temp_snapshot.id"},{"line_number":913,"context_line":"            backup.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_a7f9b8ca","line":910,"in_reply_to":"3a50d1a3_b6ff35aa","updated":"2015-08-03 21:12:44.000000000","message":"Got it. Thanks!","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"a04447b6fe742cb25bf998ae0519f2d2a4af5204","unresolved":false,"context_lines":[{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"    @abc.abstractmethod"},{"line_number":1145,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":1146,"context_line":"        \"\"\"Disallow connection from connector\"\"\""},{"line_number":1147,"context_line":"        return"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    def terminate_connection_snapshot(self, snapshot, connector, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_2d2a727f","line":1146,"updated":"2015-07-24 03:06:53.000000000","message":"Add a \u0027.\u0027 to EOL to keep consistent to line 1563 and 1569, thanks.","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"21bb8a13f774da6e1da47013b537be692849d2ed","unresolved":false,"context_lines":[{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"    @abc.abstractmethod"},{"line_number":1145,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":1146,"context_line":"        \"\"\"Disallow connection from connector\"\"\""},{"line_number":1147,"context_line":"        return"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    def terminate_connection_snapshot(self, snapshot, connector, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_dfda044c","line":1146,"in_reply_to":"3a50d1a3_2d2a727f","updated":"2015-08-05 23:14:18.000000000","message":"Done","commit_id":"f142afc040afd21fed2703223900a95fae23bebb"}]}
