)]}'
{"cinder/backup/drivers/google.py":[{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"2da48fad6e8ca3376e897e70a74602415e4d46fa","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright (C) 2015 Kevin Fox \u003ckevin@efox.cc\u003e"},{"line_number":5,"context_line":"# Copyright (C) 2015 Tom Barron \u003ctpb@dyncloud.net\u003e"},{"line_number":6,"context_line":"# Copyright (C) 2015 Biarca"},{"line_number":7,"context_line":"# Copyright (C) 2015 Google"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_8fed02b9","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":20},"updated":"2016-01-14 17:26:49.000000000","message":"Would this need to be updated to 2016?","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright (C) 2015 Kevin Fox \u003ckevin@efox.cc\u003e"},{"line_number":5,"context_line":"# Copyright (C) 2015 Tom Barron \u003ctpb@dyncloud.net\u003e"},{"line_number":6,"context_line":"# Copyright (C) 2015 Biarca"},{"line_number":7,"context_line":"# Copyright (C) 2015 Google"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_80e07197","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":20},"in_reply_to":"da6ed579_8fed02b9","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3b7f582accf4394ddd8718b3917836f8a8f47f8b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright (C) 2015 Kevin Fox \u003ckevin@efox.cc\u003e"},{"line_number":5,"context_line":"# Copyright (C) 2015 Tom Barron \u003ctpb@dyncloud.net\u003e"},{"line_number":6,"context_line":"# Copyright (C) 2015 Biarca"},{"line_number":7,"context_line":"# Copyright (C) 2015 Google"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_8a5ac7f0","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":20},"in_reply_to":"da6ed579_8fed02b9","updated":"2016-01-14 20:34:38.000000000","message":"No, no update will be necessary. That copyright is there because a part of the code in GoogleMediaIoBaseDownload comes from the Google library but needed to be copied here because default implementation wasn\u0027t retrying on error 429 as it should and their library structure didn\u0027t allow any other solution.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"gcsbackup_service_opts \u003d ["},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket\u0027,"},{"line_number":51,"context_line":"               default\u003dNone,"},{"line_number":52,"context_line":"               help\u003d\u0027The GCS bucket to use.\u0027),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027backup_gcs_object_size\u0027,"},{"line_number":54,"context_line":"               default\u003d52428800,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_38e319a6","line":51,"updated":"2016-01-14 13:05:32.000000000","message":"nit: No need to set default to None, that\u0027s the default value.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"gcsbackup_service_opts \u003d ["},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket\u0027,"},{"line_number":51,"context_line":"               default\u003dNone,"},{"line_number":52,"context_line":"               help\u003d\u0027The GCS bucket to use.\u0027),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027backup_gcs_object_size\u0027,"},{"line_number":54,"context_line":"               default\u003d52428800,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_e82da246","line":51,"in_reply_to":"da6ed579_38e319a6","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    cfg.IntOpt(\u0027backup_gcs_num_retries\u0027,"},{"line_number":70,"context_line":"               default\u003d3,"},{"line_number":71,"context_line":"               help\u003d\u0027Number of times to retry.\u0027),"},{"line_number":72,"context_line":"    cfg.ListOpt(\u0027backup_gcs_retry_error_codes\u0027,"},{"line_number":73,"context_line":"                default\u003d[\u0027429\u0027],"},{"line_number":74,"context_line":"                help\u003d\u0027List of GCS error codes.\u0027),"},{"line_number":75,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket_location\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_648ec8d1","line":72,"updated":"2016-01-14 13:05:32.000000000","message":"nit: I don\u0027t thing this should be configurable, as retriable error codes are well defined by Google and should need no modification by users.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c4f5fa1c3f873a3e1f922577c38c3dd47aae5302","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    cfg.IntOpt(\u0027backup_gcs_num_retries\u0027,"},{"line_number":70,"context_line":"               default\u003d3,"},{"line_number":71,"context_line":"               help\u003d\u0027Number of times to retry.\u0027),"},{"line_number":72,"context_line":"    cfg.ListOpt(\u0027backup_gcs_retry_error_codes\u0027,"},{"line_number":73,"context_line":"                default\u003d[\u0027429\u0027],"},{"line_number":74,"context_line":"                help\u003d\u0027List of GCS error codes.\u0027),"},{"line_number":75,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket_location\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_520e53e6","line":72,"in_reply_to":"da6ed579_48b94e14","updated":"2016-01-18 10:31:04.000000000","message":"I think hardcoding 429 would make sense in this case, in the same way that 5xx errors are hardcoded, because in Google\u0027s documentation they are defined as transient and says they should be retried with Truncated Exponential Backoff retries: https://cloud.google.com/storage/docs/gsutil/addlhelp/RetryHandlingStrategy","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    cfg.IntOpt(\u0027backup_gcs_num_retries\u0027,"},{"line_number":70,"context_line":"               default\u003d3,"},{"line_number":71,"context_line":"               help\u003d\u0027Number of times to retry.\u0027),"},{"line_number":72,"context_line":"    cfg.ListOpt(\u0027backup_gcs_retry_error_codes\u0027,"},{"line_number":73,"context_line":"                default\u003d[\u0027429\u0027],"},{"line_number":74,"context_line":"                help\u003d\u0027List of GCS error codes.\u0027),"},{"line_number":75,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket_location\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_48b94e14","line":72,"in_reply_to":"da6ed579_648ec8d1","updated":"2016-01-16 19:32:30.000000000","message":"idea was not to hard-code retry for error 429.\nerror 429 is not coming consistently while restoring backup and google client library is not handling retry for it and so after discussion with google we are adding retry for this error and able to restore and also we want to left an option open for similar type of errors.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":79,"context_line":"               default\u003d\u0027NEARLINE\u0027,"},{"line_number":80,"context_line":"               help\u003d\u0027Storage class of GCS bucket.\u0027),"},{"line_number":81,"context_line":"    cfg.StrOpt(\u0027backup_gcs_credential_file\u0027,"},{"line_number":82,"context_line":"               default\u003dNone,"},{"line_number":83,"context_line":"               help\u003d\u0027Absolute path of GCS service account credential file.\u0027),"},{"line_number":84,"context_line":"    cfg.StrOpt(\u0027backup_gcs_project_id\u0027,"},{"line_number":85,"context_line":"               default\u003d\u0027gcsbackup\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_78043149","line":82,"updated":"2016-01-14 13:05:32.000000000","message":"nit: No need to set default to None, that\u0027s the default value.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":79,"context_line":"               default\u003d\u0027NEARLINE\u0027,"},{"line_number":80,"context_line":"               help\u003d\u0027Storage class of GCS bucket.\u0027),"},{"line_number":81,"context_line":"    cfg.StrOpt(\u0027backup_gcs_credential_file\u0027,"},{"line_number":82,"context_line":"               default\u003dNone,"},{"line_number":83,"context_line":"               help\u003d\u0027Absolute path of GCS service account credential file.\u0027),"},{"line_number":84,"context_line":"    cfg.StrOpt(\u0027backup_gcs_project_id\u0027,"},{"line_number":85,"context_line":"               default\u003d\u0027gcsbackup\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_4815cee2","line":82,"in_reply_to":"da6ed579_78043149","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__(self, context, db_driver\u003dNone):"},{"line_number":120,"context_line":"        chunk_size_bytes \u003d CONF.backup_gcs_object_size"},{"line_number":121,"context_line":"        sha_block_size_bytes \u003d CONF.backup_gcs_block_size"},{"line_number":122,"context_line":"        backup_bucket \u003d CONF.backup_gcs_bucket"},{"line_number":123,"context_line":"        enable_progress_timer \u003d CONF.backup_gcs_enable_progress_timer"},{"line_number":124,"context_line":"        super(GoogleBackupDriver, self).__init__(context, chunk_size_bytes,"},{"line_number":125,"context_line":"                                                 sha_block_size_bytes,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_bba2a3fa","line":122,"updated":"2016-01-14 13:05:32.000000000","message":"-1: If backup_gcs_bucket is not defined this will not work, so it should be checked here and an exception raised.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__(self, context, db_driver\u003dNone):"},{"line_number":120,"context_line":"        chunk_size_bytes \u003d CONF.backup_gcs_object_size"},{"line_number":121,"context_line":"        sha_block_size_bytes \u003d CONF.backup_gcs_block_size"},{"line_number":122,"context_line":"        backup_bucket \u003d CONF.backup_gcs_bucket"},{"line_number":123,"context_line":"        enable_progress_timer \u003d CONF.backup_gcs_enable_progress_timer"},{"line_number":124,"context_line":"        super(GoogleBackupDriver, self).__init__(context, chunk_size_bytes,"},{"line_number":125,"context_line":"                                                 sha_block_size_bytes,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_a896ca3b","line":122,"in_reply_to":"da6ed579_bba2a3fa","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if self.writer_chunk_size \u003d\u003d -1:"},{"line_number":144,"context_line":"            self.resumable \u003d False"},{"line_number":145,"context_line":"        else:"},{"line_number":146,"context_line":"            self.resumable \u003d True"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @gcs_logger"},{"line_number":149,"context_line":"    def put_container(self, bucket):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_bbdaa349","line":146,"updated":"2016-01-14 13:05:32.000000000","message":"nit: These 4 lines can be written as\n\n self.resumable \u003d self.write_chunk_size !\u003d -1","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if self.writer_chunk_size \u003d\u003d -1:"},{"line_number":144,"context_line":"            self.resumable \u003d False"},{"line_number":145,"context_line":"        else:"},{"line_number":146,"context_line":"            self.resumable \u003d True"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @gcs_logger"},{"line_number":149,"context_line":"    def put_container(self, bucket):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_80a5d147","line":146,"in_reply_to":"da6ed579_bbdaa349","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    @gcs_logger"},{"line_number":149,"context_line":"    def put_container(self, bucket):"},{"line_number":150,"context_line":"        \"\"\"Create the bucket if not exists.\"\"\""},{"line_number":151,"context_line":"        buck_name_list_dict \u003d self.conn.buckets().list("},{"line_number":152,"context_line":"            project\u003dself.gcs_project_id,"},{"line_number":153,"context_line":"            prefix\u003dbucket,"},{"line_number":154,"context_line":"            fields\u003d\"items(name)\").execute("}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_1b388fee","line":151,"updated":"2016-01-14 13:05:32.000000000","message":"-1: We should use `self.get_container_entries` with prefix set to None","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    @gcs_logger"},{"line_number":149,"context_line":"    def put_container(self, bucket):"},{"line_number":150,"context_line":"        \"\"\"Create the bucket if not exists.\"\"\""},{"line_number":151,"context_line":"        buck_name_list_dict \u003d self.conn.buckets().list("},{"line_number":152,"context_line":"            project\u003dself.gcs_project_id,"},{"line_number":153,"context_line":"            prefix\u003dbucket,"},{"line_number":154,"context_line":"            fields\u003d\"items(name)\").execute("}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_277bbb29","line":151,"in_reply_to":"da6ed579_1b388fee","updated":"2016-01-16 19:32:30.000000000","message":"self.get_container_entries is for getting objects in a bucket. It is not for getting container list","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c4f5fa1c3f873a3e1f922577c38c3dd47aae5302","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    @gcs_logger"},{"line_number":149,"context_line":"    def put_container(self, bucket):"},{"line_number":150,"context_line":"        \"\"\"Create the bucket if not exists.\"\"\""},{"line_number":151,"context_line":"        buck_name_list_dict \u003d self.conn.buckets().list("},{"line_number":152,"context_line":"            project\u003dself.gcs_project_id,"},{"line_number":153,"context_line":"            prefix\u003dbucket,"},{"line_number":154,"context_line":"            fields\u003d\"items(name)\").execute("}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_f24ae7ab","line":151,"in_reply_to":"da6ed579_277bbb29","updated":"2016-01-18 10:31:04.000000000","message":"You are so right.  My bad!","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                num_retries\u003dself.num_retries).get(\u0027items\u0027)"},{"line_number":156,"context_line":"        if not buck_name_list_dict or not any("},{"line_number":157,"context_line":"                buck_name_dict.get(\u0027name\u0027) \u003d\u003d bucket"},{"line_number":158,"context_line":"                for buck_name_dict in buck_name_list_dict):"},{"line_number":159,"context_line":"            self.conn.buckets().insert("},{"line_number":160,"context_line":"                project\u003dself.gcs_project_id,"},{"line_number":161,"context_line":"                body\u003d{\u0027name\u0027: bucket,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_3b4c73c7","line":158,"updated":"2016-01-14 13:05:32.000000000","message":"-1: This if is hard to read.  It would be easier to read if on line 151 we change the variable name to `buckets` and on line 155 we set default for get to [] `.get(\u0027items\u0027, [])` or just use method get_container_entries.\n\nAnd then we do:\n\n if not any(b.get(\u0027name\u0027) \u003d\u003d bucket for b in buckets):","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                num_retries\u003dself.num_retries).get(\u0027items\u0027)"},{"line_number":156,"context_line":"        if not buck_name_list_dict or not any("},{"line_number":157,"context_line":"                buck_name_dict.get(\u0027name\u0027) \u003d\u003d bucket"},{"line_number":158,"context_line":"                for buck_name_dict in buck_name_list_dict):"},{"line_number":159,"context_line":"            self.conn.buckets().insert("},{"line_number":160,"context_line":"                project\u003dself.gcs_project_id,"},{"line_number":161,"context_line":"                body\u003d{\u0027name\u0027: bucket,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_c775ff31","line":158,"in_reply_to":"da6ed579_3b4c73c7","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            bucket\u003dbucket,"},{"line_number":171,"context_line":"            fields\u003d\"items(name)\","},{"line_number":172,"context_line":"            prefix\u003dprefix).execute(num_retries\u003dself.num_retries).get(\u0027items\u0027)"},{"line_number":173,"context_line":"        if obj_list_dict:"},{"line_number":174,"context_line":"            gcs_object_names \u003d [obj_dict.get(\u0027name\u0027) for obj_dict"},{"line_number":175,"context_line":"                                in obj_list_dict]"},{"line_number":176,"context_line":"            return gcs_object_names"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_5e46f54f","line":173,"updated":"2016-01-14 13:05:32.000000000","message":"nit: If we set default value for get to [] we can remove this if and just do:\n\n return [obj_dict.get(\u0027name\u0027) for obj_dict in obj_list_dict]","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            bucket\u003dbucket,"},{"line_number":171,"context_line":"            fields\u003d\"items(name)\","},{"line_number":172,"context_line":"            prefix\u003dprefix).execute(num_retries\u003dself.num_retries).get(\u0027items\u0027)"},{"line_number":173,"context_line":"        if obj_list_dict:"},{"line_number":174,"context_line":"            gcs_object_names \u003d [obj_dict.get(\u0027name\u0027) for obj_dict"},{"line_number":175,"context_line":"                                in obj_list_dict]"},{"line_number":176,"context_line":"            return gcs_object_names"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_0b154f9a","line":173,"in_reply_to":"da6ed579_5e46f54f","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            object\u003dobject_name).execute(num_retries\u003dself.num_retries)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _generate_object_name_prefix(self, backup):"},{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_5e8b5568","line":208,"updated":"2016-01-14 13:05:32.000000000","message":"nit: It would be nice if the docstring mentions the whole name pattern.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            object\u003dobject_name).execute(num_retries\u003dself.num_retries)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _generate_object_name_prefix(self, backup):"},{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_b4c9db5c","line":208,"in_reply_to":"da6ed579_5e8b5568","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _generate_object_name_prefix(self, backup):"},{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"},{"line_number":212,"context_line":"        timestamp \u003d timeutils.utcnow().strftime(\"%Y%m%d%H%M%S\")"},{"line_number":213,"context_line":"        prefix \u003d volume + \u0027/\u0027 + timestamp + \u0027/\u0027 + backup_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_1e963d3f","line":210,"updated":"2016-01-14 13:05:32.000000000","message":"-1: This should be backup.id as backup is a Versioned Object\n\nnit: No need for the parenthesis","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _generate_object_name_prefix(self, backup):"},{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"},{"line_number":212,"context_line":"        timestamp \u003d timeutils.utcnow().strftime(\"%Y%m%d%H%M%S\")"},{"line_number":213,"context_line":"        prefix \u003d volume + \u0027/\u0027 + timestamp + \u0027/\u0027 + backup_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_cec8a5aa","line":210,"in_reply_to":"da6ed579_1e963d3f","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"},{"line_number":212,"context_line":"        timestamp \u003d timeutils.utcnow().strftime(\"%Y%m%d%H%M%S\")"},{"line_number":213,"context_line":"        prefix \u003d volume + \u0027/\u0027 + timestamp + \u0027/\u0027 + backup_name"},{"line_number":214,"context_line":"        LOG.debug(\u0027generate_object_name_prefix: %s\u0027, prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_de9bc564","line":211,"updated":"2016-01-14 13:05:32.000000000","message":"-1: Same here, backup.volume_id and no need for parenthesis","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Generates a GCS backup object name prefix.\"\"\""},{"line_number":209,"context_line":"        az \u003d \u0027az_%s\u0027 % self.az"},{"line_number":210,"context_line":"        backup_name \u003d \u0027%s_backup_%s\u0027 % (az, backup[\u0027id\u0027])"},{"line_number":211,"context_line":"        volume \u003d \u0027volume_%s\u0027 % (backup[\u0027volume_id\u0027])"},{"line_number":212,"context_line":"        timestamp \u003d timeutils.utcnow().strftime(\"%Y%m%d%H%M%S\")"},{"line_number":213,"context_line":"        prefix \u003d volume + \u0027/\u0027 + timestamp + \u0027/\u0027 + backup_name"},{"line_number":214,"context_line":"        LOG.debug(\u0027generate_object_name_prefix: %s\u0027, prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_4ebd9500","line":211,"in_reply_to":"da6ed579_de9bc564","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        LOG.debug(\u0027generate_object_name_prefix: %s\u0027, prefix)"},{"line_number":215,"context_line":"        return prefix"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def update_container_name(self, backup, bucket):"},{"line_number":218,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":219,"context_line":"        return bucket"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_9e254d0a","line":217,"updated":"2016-01-14 13:05:32.000000000","message":"-1: If this is going to use provided bucket then there\u0027s no need for the method.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c4f5fa1c3f873a3e1f922577c38c3dd47aae5302","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        LOG.debug(\u0027generate_object_name_prefix: %s\u0027, prefix)"},{"line_number":215,"context_line":"        return prefix"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def update_container_name(self, backup, bucket):"},{"line_number":218,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":219,"context_line":"        return bucket"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_b59f79b3","line":217,"in_reply_to":"da6ed579_2e32a1a7","updated":"2016-01-18 10:31:04.000000000","message":"I don\u0027t know why these 2 methods are defined as abstract in the chunked driver instead of just defaulting to return None.  But you are right, we have to define these 2 methods.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        LOG.debug(\u0027generate_object_name_prefix: %s\u0027, prefix)"},{"line_number":215,"context_line":"        return prefix"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def update_container_name(self, backup, bucket):"},{"line_number":218,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":219,"context_line":"        return bucket"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_2e32a1a7","line":217,"in_reply_to":"da6ed579_9e254d0a","updated":"2016-01-16 19:32:30.000000000","message":"TypeError: Can\u0027t instantiate abstract class GoogleBackupDriver with abstract methods get_extra_metadata, update_container_name","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":219,"context_line":"        return bucket"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":222,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""},{"line_number":223,"context_line":"        return None"},{"line_number":224,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_be8051c0","line":221,"updated":"2016-01-14 13:05:32.000000000","message":"-1: Same here, if there\u0027s no extra metadata there\u0027s no need for the method.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":219,"context_line":"        return bucket"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":222,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""},{"line_number":223,"context_line":"        return None"},{"line_number":224,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_8ea62dac","line":221,"in_reply_to":"da6ed579_be8051c0","updated":"2016-01-16 19:32:30.000000000","message":"TypeError: Can\u0027t instantiate abstract class GoogleBackupDriver with abstract methods get_extra_metadata, update_container_name","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            media_body\u003dmedia).execute(num_retries\u003dself.num_retries)"},{"line_number":257,"context_line":"        etag \u003d resp[\u0027md5Hash\u0027]"},{"line_number":258,"context_line":"        md5 \u003d hashlib.md5(self.data).digest()"},{"line_number":259,"context_line":"        md5 \u003d base64.b64encode(md5)"},{"line_number":260,"context_line":"        if etag !\u003d md5:"},{"line_number":261,"context_line":"            err \u003d _(\u0027MD5 of object: %(object_name)s before: \u0027"},{"line_number":262,"context_line":"                    \u0027%(md5)s and after: %(etag)s is not same.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_e4595836","line":259,"updated":"2016-01-14 13:05:32.000000000","message":"-1: This is failing on py34, you need to encode md5 variable.\n\nI run into a similar problem in my GCS library: https://github.com/Akrog/gcs-client/blob/master/gcs_client/gcs_object.py#L527\n\nAdding this before this call fixes it:\n\n if six.PY3:\n     md5 \u003d md5.encode(\u0027utf-8\u0027)\n     etag \u003d etag.encode(\u0027utf-8\u0027)","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            media_body\u003dmedia).execute(num_retries\u003dself.num_retries)"},{"line_number":257,"context_line":"        etag \u003d resp[\u0027md5Hash\u0027]"},{"line_number":258,"context_line":"        md5 \u003d hashlib.md5(self.data).digest()"},{"line_number":259,"context_line":"        md5 \u003d base64.b64encode(md5)"},{"line_number":260,"context_line":"        if etag !\u003d md5:"},{"line_number":261,"context_line":"            err \u003d _(\u0027MD5 of object: %(object_name)s before: \u0027"},{"line_number":262,"context_line":"                    \u0027%(md5)s and after: %(etag)s is not same.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_387b03f7","line":259,"in_reply_to":"da6ed579_e4595836","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    def read(self):"},{"line_number":291,"context_line":"        req \u003d self.conn.objects().get_media("},{"line_number":292,"context_line":"            bucket\u003dself.bucket,"},{"line_number":293,"context_line":"            object\u003dself.object_name,)"},{"line_number":294,"context_line":"        fh \u003d six.BytesIO()"},{"line_number":295,"context_line":"        downloader \u003d GoogleMediaIoBaseDownload("},{"line_number":296,"context_line":"            fh, req, chunksize\u003dself.chunk_size)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_6471e843","line":293,"updated":"2016-01-14 13:05:32.000000000","message":"nit: Unnecessary , at before )","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    def read(self):"},{"line_number":291,"context_line":"        req \u003d self.conn.objects().get_media("},{"line_number":292,"context_line":"            bucket\u003dself.bucket,"},{"line_number":293,"context_line":"            object\u003dself.object_name,)"},{"line_number":294,"context_line":"        fh \u003d six.BytesIO()"},{"line_number":295,"context_line":"        downloader \u003d GoogleMediaIoBaseDownload("},{"line_number":296,"context_line":"            fh, req, chunksize\u003dself.chunk_size)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_eed249d0","line":293,"in_reply_to":"da6ed579_6471e843","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        done \u003d False"},{"line_number":298,"context_line":"        while not done:"},{"line_number":299,"context_line":"            status, done \u003d downloader.next_chunk(num_retries\u003dself.num_retries)"},{"line_number":300,"context_line":"        LOG.debug(\u0027Object download Complete.\u0027)"},{"line_number":301,"context_line":"        return fh.getvalue()"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_04dfcc0d","line":300,"updated":"2016-01-14 13:05:32.000000000","message":"nit: Maybe add \"GCS\" before \"Object\".","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        done \u003d False"},{"line_number":298,"context_line":"        while not done:"},{"line_number":299,"context_line":"            status, done \u003d downloader.next_chunk(num_retries\u003dself.num_retries)"},{"line_number":300,"context_line":"        LOG.debug(\u0027Object download Complete.\u0027)"},{"line_number":301,"context_line":"        return fh.getvalue()"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_74c36339","line":300,"in_reply_to":"da6ed579_04dfcc0d","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":304,"context_line":"class GoogleMediaIoBaseDownload(http.MediaIoBaseDownload):"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @http.util.positional(3)"},{"line_number":307,"context_line":"    def __init__(self, fd, request, chunksize\u003dNone):"},{"line_number":308,"context_line":"        super(GoogleMediaIoBaseDownload, self).__init__(fd, request,"},{"line_number":309,"context_line":"                                                        chunksize\u003dchunksize)"},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_44e384a4","line":307,"updated":"2016-01-14 13:05:32.000000000","message":"-1: No need to define __init__ method, inherited method is ok.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":304,"context_line":"class GoogleMediaIoBaseDownload(http.MediaIoBaseDownload):"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @http.util.positional(3)"},{"line_number":307,"context_line":"    def __init__(self, fd, request, chunksize\u003dNone):"},{"line_number":308,"context_line":"        super(GoogleMediaIoBaseDownload, self).__init__(fd, request,"},{"line_number":309,"context_line":"                                                        chunksize\u003dchunksize)"},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_2a760406","line":307,"in_reply_to":"da6ed579_44e384a4","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                self._sleep(self._rand() * 2 ** retry_num)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"            resp, content \u003d gcs_http.request(self._uri, headers\u003dheaders)"},{"line_number":323,"context_line":"            if resp.status \u003c 500 and str(resp.status) not in error_codes:"},{"line_number":324,"context_line":"                break"},{"line_number":325,"context_line":"        if resp.status in [200, 206]:"},{"line_number":326,"context_line":"            if \u0027content-location\u0027 in resp and ("}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_2f2d0995","line":323,"updated":"2016-01-14 13:05:32.000000000","message":"-1: Don\u0027t use str, better use six.text_type","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                self._sleep(self._rand() * 2 ** retry_num)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"            resp, content \u003d gcs_http.request(self._uri, headers\u003dheaders)"},{"line_number":323,"context_line":"            if resp.status \u003c 500 and str(resp.status) not in error_codes:"},{"line_number":324,"context_line":"                break"},{"line_number":325,"context_line":"        if resp.status in [200, 206]:"},{"line_number":326,"context_line":"            if \u0027content-location\u0027 in resp and ("}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_ed01e605","line":323,"in_reply_to":"da6ed579_2f2d0995","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    cfg.IntOpt(\u0027backup_gcs_num_retries\u0027,"},{"line_number":69,"context_line":"               default\u003d3,"},{"line_number":70,"context_line":"               help\u003d\u0027Number of times to retry.\u0027),"},{"line_number":71,"context_line":"    cfg.ListOpt(\u0027backup_gcs_retry_error_codes\u0027,"},{"line_number":72,"context_line":"                default\u003d[\u0027429\u0027],"},{"line_number":73,"context_line":"                help\u003d\u0027List of GCS error codes.\u0027),"},{"line_number":74,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket_location\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_958ef525","line":71,"updated":"2016-01-18 10:33:23.000000000","message":"nit: I still think this should not be configurable, but it\u0027s ok if it is.","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    cfg.IntOpt(\u0027backup_gcs_num_retries\u0027,"},{"line_number":69,"context_line":"               default\u003d3,"},{"line_number":70,"context_line":"               help\u003d\u0027Number of times to retry.\u0027),"},{"line_number":71,"context_line":"    cfg.ListOpt(\u0027backup_gcs_retry_error_codes\u0027,"},{"line_number":72,"context_line":"                default\u003d[\u0027429\u0027],"},{"line_number":73,"context_line":"                help\u003d\u0027List of GCS error codes.\u0027),"},{"line_number":74,"context_line":"    cfg.StrOpt(\u0027backup_gcs_bucket_location\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_f0e17f9b","line":71,"in_reply_to":"da6ed579_958ef525","updated":"2016-01-18 11:21:03.000000000","message":"Yes want to stay with present code. Thanks","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    \"\"\"Provides backup, restore and delete of backup objects within GCS.\"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, context, db_driver\u003dNone):"},{"line_number":117,"context_line":"        check_gcs_options()"},{"line_number":118,"context_line":"        backup_bucket \u003d CONF.backup_gcs_bucket"},{"line_number":119,"context_line":"        backup_credential \u003d CONF.backup_gcs_credential_file"},{"line_number":120,"context_line":"        self.gcs_project_id \u003d CONF.backup_gcs_project_id"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_b2a54fb6","line":117,"updated":"2016-01-18 10:33:23.000000000","message":"-1: This method should be part of GoogleBackupDriver","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    \"\"\"Provides backup, restore and delete of backup objects within GCS.\"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, context, db_driver\u003dNone):"},{"line_number":117,"context_line":"        check_gcs_options()"},{"line_number":118,"context_line":"        backup_bucket \u003d CONF.backup_gcs_bucket"},{"line_number":119,"context_line":"        backup_credential \u003d CONF.backup_gcs_credential_file"},{"line_number":120,"context_line":"        self.gcs_project_id \u003d CONF.backup_gcs_project_id"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_5082cbc9","line":117,"in_reply_to":"da6ed579_b2a54fb6","updated":"2016-01-18 11:21:03.000000000","message":"Done","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def update_container_name(self, backup, bucket):"},{"line_number":216,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":217,"context_line":"        pass"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":220,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_35a06990","line":217,"updated":"2016-01-18 10:33:23.000000000","message":"nit: Would look better as an implicit return instead of a pass","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def update_container_name(self, backup, bucket):"},{"line_number":216,"context_line":"        \"\"\"Use the bucket name as provided - don\u0027t update.\"\"\""},{"line_number":217,"context_line":"        pass"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":220,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_b07d47e9","line":217,"in_reply_to":"da6ed579_35a06990","updated":"2016-01-18 11:21:03.000000000","message":"Done","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":220,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""},{"line_number":221,"context_line":"        pass"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"class GoogleObjectWriter(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_f5a9717c","line":221,"updated":"2016-01-18 10:33:23.000000000","message":"nit: Would look better as an implicit return instead of a pass","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def get_extra_metadata(self, backup, volume):"},{"line_number":220,"context_line":"        \"\"\"GCS driver does not use any extra metadata.\"\"\""},{"line_number":221,"context_line":"        pass"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"class GoogleObjectWriter(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_907843fa","line":221,"in_reply_to":"da6ed579_f5a9717c","updated":"2016-01-18 11:21:03.000000000","message":"Done","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            raise http.HttpError(resp, content, uri\u003dself._uri)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"def check_gcs_options():"},{"line_number":346,"context_line":"    required_options \u003d [\u0027backup_gcs_bucket\u0027, \u0027backup_gcs_credential_file\u0027,"},{"line_number":347,"context_line":"                        \u0027backup_gcs_project_id\u0027]"},{"line_number":348,"context_line":"    unset_options \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_15f9a5c8","line":345,"updated":"2016-01-18 10:33:23.000000000","message":"-1: This should be in GoogleBackupDriver class","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            raise http.HttpError(resp, content, uri\u003dself._uri)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"def check_gcs_options():"},{"line_number":346,"context_line":"    required_options \u003d [\u0027backup_gcs_bucket\u0027, \u0027backup_gcs_credential_file\u0027,"},{"line_number":347,"context_line":"                        \u0027backup_gcs_project_id\u0027]"},{"line_number":348,"context_line":"    unset_options \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_70ecaf8f","line":345,"in_reply_to":"da6ed579_15f9a5c8","updated":"2016-01-18 11:21:03.000000000","message":"Done","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a1459b3a43725954423dead0fc97bf93717b4d2","unresolved":false,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"def check_gcs_options():"},{"line_number":346,"context_line":"    required_options \u003d [\u0027backup_gcs_bucket\u0027, \u0027backup_gcs_credential_file\u0027,"},{"line_number":347,"context_line":"                        \u0027backup_gcs_project_id\u0027]"},{"line_number":348,"context_line":"    unset_options \u003d []"},{"line_number":349,"context_line":"    for option in required_options:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_351dc90f","line":346,"updated":"2016-01-18 10:33:23.000000000","message":"nit: Since this is a constant it\u0027s better to use a tuple instead of a list.","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"7666a29cc73b3c2549c613bd510a42090512073a","unresolved":false,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"def check_gcs_options():"},{"line_number":346,"context_line":"    required_options \u003d [\u0027backup_gcs_bucket\u0027, \u0027backup_gcs_credential_file\u0027,"},{"line_number":347,"context_line":"                        \u0027backup_gcs_project_id\u0027]"},{"line_number":348,"context_line":"    unset_options \u003d []"},{"line_number":349,"context_line":"    for option in required_options:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_30239707","line":346,"in_reply_to":"da6ed579_351dc90f","updated":"2016-01-18 11:21:03.000000000","message":"Done","commit_id":"7ac796f8a60e492cf19193d6c737876434b15871"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"faee02ce109458ac60afa60b4bf3c03b0df5eca1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        unset_options \u003d []"},{"line_number":147,"context_line":"        for option in required_options:"},{"line_number":148,"context_line":"            if not getattr(CONF, option, None):"},{"line_number":149,"context_line":"                unset_options.append(option)"},{"line_number":150,"context_line":"        if unset_options:"},{"line_number":151,"context_line":"            msg \u003d _(\u0027Unset gcs options: %s\u0027) % unset_options"},{"line_number":152,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_0195e33e","line":149,"updated":"2016-01-18 14:03:30.000000000","message":"nit: List comprehension could have made these 4 lines more compact, but this is also good.\n\n unset_options \u003d [opt for opt in required_options\n                  if not getattr(CONF, option, None)]","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"6ef3f146f99643586c83fb0f015a53c03e02afdc","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        unset_options \u003d []"},{"line_number":147,"context_line":"        for option in required_options:"},{"line_number":148,"context_line":"            if not getattr(CONF, option, None):"},{"line_number":149,"context_line":"                unset_options.append(option)"},{"line_number":150,"context_line":"        if unset_options:"},{"line_number":151,"context_line":"            msg \u003d _(\u0027Unset gcs options: %s\u0027) % unset_options"},{"line_number":152,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_4979b4fb","line":149,"in_reply_to":"da6ed579_0195e33e","updated":"2016-01-18 17:16:55.000000000","message":"Done","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"}],"cinder/tests/unit/backup/fake_google_client.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"40a09626440f8c443e7fb1c8b1ead084146d9de1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                metadata_json \u003d metadata_json.encode(\u0027utf-8\u0027)"},{"line_number":148,"context_line":"            fh.write(metadata_json)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            fh.write(zlib.compress(os.urandom(1024 * 1024)))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def next_chunk(self, **kwargs):"},{"line_number":153,"context_line":"        return (100, True)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_ee842eb2","line":150,"updated":"2016-01-18 15:13:30.000000000","message":"Please use the existing constant units.Ki for 1024:\n\nhttps://github.com/openstack/oslo.utils/blob/master/oslo_utils/units.py#L21","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"6ef3f146f99643586c83fb0f015a53c03e02afdc","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                metadata_json \u003d metadata_json.encode(\u0027utf-8\u0027)"},{"line_number":148,"context_line":"            fh.write(metadata_json)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            fh.write(zlib.compress(os.urandom(1024 * 1024)))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def next_chunk(self, **kwargs):"},{"line_number":153,"context_line":"        return (100, True)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba63e191_ebe1cdd1","line":150,"in_reply_to":"da6ed579_ee842eb2","updated":"2016-01-18 17:16:55.000000000","message":"Done","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"}],"cinder/tests/unit/test_backup_google.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7a73b8e89dd49e667ed87f333ee243cad4181820","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                  \u0027project_id\u0027: \u0027project-id\u0027,"},{"line_number":94,"context_line":"                  \u0027service_metadata\u0027: service_metadata,"},{"line_number":95,"context_line":"                  }"},{"line_number":96,"context_line":"        return db.backup_create(self.ctxt, backup)[\u0027id\u0027]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def setUp(self):"},{"line_number":99,"context_line":"        super(GoogleBackupDriverTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_afd019f7","line":96,"updated":"2016-01-14 13:05:32.000000000","message":"-1: This should be using Versioned Objects to create the backup instead of the DB directly, that way you don\u0027t need to do the backup \u003d objects.Backup.get_by_id on every test, you can just use the object returned by this method.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                  \u0027project_id\u0027: \u0027project-id\u0027,"},{"line_number":94,"context_line":"                  \u0027service_metadata\u0027: service_metadata,"},{"line_number":95,"context_line":"                  }"},{"line_number":96,"context_line":"        return db.backup_create(self.ctxt, backup)[\u0027id\u0027]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def setUp(self):"},{"line_number":99,"context_line":"        super(GoogleBackupDriverTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_74acc38c","line":96,"in_reply_to":"da6ed579_afd019f7","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"2da48fad6e8ca3376e897e70a74602415e4d46fa","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        super(GoogleBackupDriverTestCase, self).setUp()"},{"line_number":100,"context_line":"        self.flags(backup_gcs_bucket\u003d\u0027gcscinderbucket\u0027)"},{"line_number":101,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":102,"context_line":"        self.stubs.Set(hashlib, \u0027md5\u0027, fake_md5)"},{"line_number":103,"context_line":"        self.stubs.Set(google_dr.discovery,"},{"line_number":104,"context_line":"                       \u0027build\u0027,"},{"line_number":105,"context_line":"                       fake_google_client.FakeGoogleDiscovery.Build)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_2fa3b6b3","line":102,"range":{"start_line":102,"start_character":13,"end_line":102,"end_character":18},"updated":"2016-01-14 17:26:49.000000000","message":"We should not be using stubs. Use mock instead.","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"334e3cb19f1b644dbd136e52f83286c6f726addd","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        super(GoogleBackupDriverTestCase, self).setUp()"},{"line_number":100,"context_line":"        self.flags(backup_gcs_bucket\u003d\u0027gcscinderbucket\u0027)"},{"line_number":101,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":102,"context_line":"        self.stubs.Set(hashlib, \u0027md5\u0027, fake_md5)"},{"line_number":103,"context_line":"        self.stubs.Set(google_dr.discovery,"},{"line_number":104,"context_line":"                       \u0027build\u0027,"},{"line_number":105,"context_line":"                       fake_google_client.FakeGoogleDiscovery.Build)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_94a9377e","line":102,"range":{"start_line":102,"start_character":13,"end_line":102,"end_character":18},"in_reply_to":"da6ed579_2fa3b6b3","updated":"2016-01-16 19:32:30.000000000","message":"Done","commit_id":"a93e8d984056217e252b200de7890254a0a7d01b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"40a09626440f8c443e7fb1c8b1ead084146d9de1","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    def test_backup_delta_two_objects_change(self):"},{"line_number":310,"context_line":"        volume_id \u003d \u002730dab288-265a-4583-9abe-000000d42c67\u0027"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        self.flags(backup_gcs_object_size\u003d8 * 1024)"},{"line_number":313,"context_line":"        self.flags(backup_gcs_block_size\u003d1024)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        container_name \u003d self.temp_dir.replace(tempfile.gettempdir() + \u0027/\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_ce3fea23","line":312,"updated":"2016-01-18 15:13:30.000000000","message":"Please use the existing constant units.Ki for 1024:\n\nhttps://github.com/openstack/oslo.utils/blob/master/oslo_utils/units.py#L21","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"},{"author":{"_account_id":12285,"name":"nikeshmahalka","email":"nikeshmahalka@vedams.com","username":"Nikesh"},"change_message_id":"6ef3f146f99643586c83fb0f015a53c03e02afdc","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    def test_backup_delta_two_objects_change(self):"},{"line_number":310,"context_line":"        volume_id \u003d \u002730dab288-265a-4583-9abe-000000d42c67\u0027"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        self.flags(backup_gcs_object_size\u003d8 * 1024)"},{"line_number":313,"context_line":"        self.flags(backup_gcs_block_size\u003d1024)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        container_name \u003d self.temp_dir.replace(tempfile.gettempdir() + \u0027/\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba63e191_6bf5dd81","line":312,"in_reply_to":"da6ed579_ce3fea23","updated":"2016-01-18 17:16:55.000000000","message":"Done","commit_id":"c47af7dd5e92334ed78d9bfd02c0a8c7a1f972bb"}]}
