)]}'
{"karbor/services/protection/protection_plugins/image/image_protection_plugin.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            image_info \u003d glance_client.images.get(image_id)"},{"line_number":62,"context_line":"            image_metadata \u003d {"},{"line_number":63,"context_line":"                \"disk_format\": image_info.disk_format,"},{"line_number":64,"context_line":"                \"container_format\": image_info.container_format"},{"line_number":65,"context_line":"            }"},{"line_number":66,"context_line":"            resource_definition[\"image_metadata\"] \u003d image_metadata"},{"line_number":67,"context_line":"            resource_definition[\"backup_id\"] \u003d image_id"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_e7513d10","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":13},"updated":"2017-01-12 13:25:13.000000000","message":"add \u0027checksum\u0027 here?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            image_info \u003d glance_client.images.get(image_id)"},{"line_number":62,"context_line":"            image_metadata \u003d {"},{"line_number":63,"context_line":"                \"disk_format\": image_info.disk_format,"},{"line_number":64,"context_line":"                \"container_format\": image_info.container_format"},{"line_number":65,"context_line":"            }"},{"line_number":66,"context_line":"            resource_definition[\"image_metadata\"] \u003d image_metadata"},{"line_number":67,"context_line":"            resource_definition[\"backup_id\"] \u003d image_id"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_89ae9583","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":13},"in_reply_to":"9a57fde8_e7513d10","updated":"2017-01-14 08:31:18.000000000","message":"Good idea.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                \"disk_format\": image_info.disk_format,"},{"line_number":64,"context_line":"                \"container_format\": image_info.container_format"},{"line_number":65,"context_line":"            }"},{"line_number":66,"context_line":"            resource_definition[\"image_metadata\"] \u003d image_metadata"},{"line_number":67,"context_line":"            resource_definition[\"backup_id\"] \u003d image_id"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            bank_section.create_object(\"metadata\", resource_definition)"},{"line_number":70,"context_line":"        except Exception as err:"},{"line_number":71,"context_line":"            LOG.error(_LE(\"create image backup failed, image_id: %s.\"),"},{"line_number":72,"context_line":"                      image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_676f0d93","line":69,"range":{"start_line":66,"start_character":0,"end_line":69,"end_character":71},"updated":"2017-01-12 13:25:13.000000000","message":"why not put backup_id in image_metadata, and store the image_metadata in \u0027metadata\u0027 object?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                \"disk_format\": image_info.disk_format,"},{"line_number":64,"context_line":"                \"container_format\": image_info.container_format"},{"line_number":65,"context_line":"            }"},{"line_number":66,"context_line":"            resource_definition[\"image_metadata\"] \u003d image_metadata"},{"line_number":67,"context_line":"            resource_definition[\"backup_id\"] \u003d image_id"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            bank_section.create_object(\"metadata\", resource_definition)"},{"line_number":70,"context_line":"        except Exception as err:"},{"line_number":71,"context_line":"            LOG.error(_LE(\"create image backup failed, image_id: %s.\"),"},{"line_number":72,"context_line":"                      image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_e9a479ba","line":69,"range":{"start_line":66,"start_character":0,"end_line":69,"end_character":71},"in_reply_to":"9a57fde8_676f0d93","updated":"2017-01-14 08:31:18.000000000","message":"I note that the value of backup_id has not been used in the hook of RestoreOperation, so it could be deleted here.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                resource_id\u003dimage_id,"},{"line_number":78,"context_line":"                resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":81,"context_line":"                                bank_section, image_id)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_backup(self, glance_client, bank_section, image_id):"},{"line_number":84,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_671d4d0f","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":55},"updated":"2017-01-12 13:25:13.000000000","message":"This means that this function returns while the image might not have finished to protect.\nIn protection plugins async operations must be polled until error/success/timeout.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"ebba6c3a579c6eb0b9d5e062e3be48f8693001cf","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                resource_id\u003dimage_id,"},{"line_number":78,"context_line":"                resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":81,"context_line":"                                bank_section, image_id)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_backup(self, glance_client, bank_section, image_id):"},{"line_number":84,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_1c4e5a96","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":55},"in_reply_to":"7a3c09a3_29392142","updated":"2017-01-15 13:06:30.000000000","message":"Sounds good, and I recommend using loopingcall instead of sleep().\nloopingcall integrates with oslo service and uses greenthread internally.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                resource_id\u003dimage_id,"},{"line_number":78,"context_line":"                resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":81,"context_line":"                                bank_section, image_id)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_backup(self, glance_client, bank_section, image_id):"},{"line_number":84,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_29392142","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":55},"in_reply_to":"9a57fde8_671d4d0f","updated":"2017-01-14 08:31:18.000000000","message":"Yes, the method \u0027_create_backup\u0027 has been add to threadpool, it will be run in the background. So a polled operation to check the status is need here. IMO, we don\u0027t add the _create_backup method to the threadpool, so it will run synchronously. So the async operations checking the status will not be needed, what\u0027s your opinion about it?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            retry_attempts \u003d CONF.retry_attempts"},{"line_number":88,"context_line":"            while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":89,"context_line":"                sleep(60)"},{"line_number":90,"context_line":"                image_info \u003d glance_client.images.get(image_id)"},{"line_number":91,"context_line":"                retry_attempts -\u003d 1"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_47e76912","line":89,"range":{"start_line":89,"start_character":22,"end_line":89,"end_character":24},"updated":"2017-01-12 13:25:13.000000000","message":"make it configurable?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            retry_attempts \u003d CONF.retry_attempts"},{"line_number":88,"context_line":"            while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":89,"context_line":"                sleep(60)"},{"line_number":90,"context_line":"                image_info \u003d glance_client.images.get(image_id)"},{"line_number":91,"context_line":"                retry_attempts -\u003d 1"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_498aedc0","line":89,"range":{"start_line":89,"start_character":22,"end_line":89,"end_character":24},"in_reply_to":"9a57fde8_47e76912","updated":"2017-01-14 08:31:18.000000000","message":"OK","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":94,"context_line":"                raise Exception"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            image_response \u003d glance_client.images.data(image_id)"},{"line_number":97,"context_line":"            image_response_data \u003d BytesIO()"},{"line_number":98,"context_line":"            for chunk in image_response:"},{"line_number":99,"context_line":"                image_response_data.write(chunk)"},{"line_number":100,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"            chunks \u003d 0"},{"line_number":103,"context_line":"            while True:"},{"line_number":104,"context_line":"                data \u003d image_response_data.read(self.data_block_size_bytes)"},{"line_number":105,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":106,"context_line":"                    break"},{"line_number":107,"context_line":"                bank_section.create_object(\"data_\" + str(chunks), data)"},{"line_number":108,"context_line":"                chunks +\u003d 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"            # update resource_definition backup_status"},{"line_number":111,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_fd6c6a0a","line":108,"range":{"start_line":96,"start_character":0,"end_line":108,"end_character":27},"updated":"2017-01-12 13:25:13.000000000","message":"1. We receive the image by chunks, build it as a whole in memory, then rechunk it? Might be memory consuming with large images.\nHow about consuming only the minimum required chunks from the image data in order to construct one chunk in swift (could be the same size), send the chunk to swift, and iterate?\n2. Could be useful to save the amount of chunks, the size of each chunk, and the total image size in the bank as well.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"ebba6c3a579c6eb0b9d5e062e3be48f8693001cf","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":94,"context_line":"                raise Exception"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            image_response \u003d glance_client.images.data(image_id)"},{"line_number":97,"context_line":"            image_response_data \u003d BytesIO()"},{"line_number":98,"context_line":"            for chunk in image_response:"},{"line_number":99,"context_line":"                image_response_data.write(chunk)"},{"line_number":100,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"            chunks \u003d 0"},{"line_number":103,"context_line":"            while True:"},{"line_number":104,"context_line":"                data \u003d image_response_data.read(self.data_block_size_bytes)"},{"line_number":105,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":106,"context_line":"                    break"},{"line_number":107,"context_line":"                bank_section.create_object(\"data_\" + str(chunks), data)"},{"line_number":108,"context_line":"                chunks +\u003d 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"            # update resource_definition backup_status"},{"line_number":111,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_dc54d222","line":108,"range":{"start_line":96,"start_character":0,"end_line":108,"end_character":27},"in_reply_to":"7a3c09a3_a92b5193","updated":"2017-01-15 13:06:30.000000000","message":"The image_response chunk size and swift chunk size may be different in size and we should handle that.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":94,"context_line":"                raise Exception"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            image_response \u003d glance_client.images.data(image_id)"},{"line_number":97,"context_line":"            image_response_data \u003d BytesIO()"},{"line_number":98,"context_line":"            for chunk in image_response:"},{"line_number":99,"context_line":"                image_response_data.write(chunk)"},{"line_number":100,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"            chunks \u003d 0"},{"line_number":103,"context_line":"            while True:"},{"line_number":104,"context_line":"                data \u003d image_response_data.read(self.data_block_size_bytes)"},{"line_number":105,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":106,"context_line":"                    break"},{"line_number":107,"context_line":"                bank_section.create_object(\"data_\" + str(chunks), data)"},{"line_number":108,"context_line":"                chunks +\u003d 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"            # update resource_definition backup_status"},{"line_number":111,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_a92b5193","line":108,"range":{"start_line":96,"start_character":0,"end_line":108,"end_character":27},"in_reply_to":"9a57fde8_fd6c6a0a","updated":"2017-01-14 08:31:18.000000000","message":"You mean that saving the chunks from the image_response to swift bank directly, we don\u0027t need to rebuild a whole BytesIO object in the memory?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                       bank_section.list_objects()]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"            # get image_data"},{"line_number":178,"context_line":"            image_data \u003d BytesIO()"},{"line_number":179,"context_line":"            for obj in objects:"},{"line_number":180,"context_line":"                if obj.find(\"data_\") \u003d\u003d 0:"},{"line_number":181,"context_line":"                    data \u003d bank_section.get_object(obj)"},{"line_number":182,"context_line":"                    image_data.write(data)"},{"line_number":183,"context_line":"            image_data.seek(0, os.SEEK_SET)"},{"line_number":184,"context_line":"            disk_format \u003d image_metadata[\"disk_format\"]"},{"line_number":185,"context_line":"            container_format \u003d image_metadata[\"container_format\"]"},{"line_number":186,"context_line":"            image \u003d glance_client.images.create("},{"line_number":187,"context_line":"                disk_format\u003ddisk_format,"},{"line_number":188,"context_line":"                container_format\u003dcontainer_format,"},{"line_number":189,"context_line":"                name\u003dname)"},{"line_number":190,"context_line":"            glance_client.images.upload(image.id, image_data)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"            image_info \u003d glance_client.images.get(image.id)"},{"line_number":193,"context_line":"            retry_attempts \u003d CONF.retry_attempts"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_dd93264e","line":190,"range":{"start_line":178,"start_character":0,"end_line":190,"end_character":61},"updated":"2017-01-12 13:25:13.000000000","message":"1. glance_client.images.upload can get the data argument as a file-like object and it chunks it. Instead of reading all of the objects into memory and then sending to glance_client, we can create such file-like object whose read() method calls swift to get the data.\n2. Can\u0027t see any validation that the objects we get from the bank are sorted by name. We can end up in a funny situation where the chunks are in the wrong order.\n3. Missing checksum validation","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                       bank_section.list_objects()]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"            # get image_data"},{"line_number":178,"context_line":"            image_data \u003d BytesIO()"},{"line_number":179,"context_line":"            for obj in objects:"},{"line_number":180,"context_line":"                if obj.find(\"data_\") \u003d\u003d 0:"},{"line_number":181,"context_line":"                    data \u003d bank_section.get_object(obj)"},{"line_number":182,"context_line":"                    image_data.write(data)"},{"line_number":183,"context_line":"            image_data.seek(0, os.SEEK_SET)"},{"line_number":184,"context_line":"            disk_format \u003d image_metadata[\"disk_format\"]"},{"line_number":185,"context_line":"            container_format \u003d image_metadata[\"container_format\"]"},{"line_number":186,"context_line":"            image \u003d glance_client.images.create("},{"line_number":187,"context_line":"                disk_format\u003ddisk_format,"},{"line_number":188,"context_line":"                container_format\u003dcontainer_format,"},{"line_number":189,"context_line":"                name\u003dname)"},{"line_number":190,"context_line":"            glance_client.images.upload(image.id, image_data)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"            image_info \u003d glance_client.images.get(image.id)"},{"line_number":193,"context_line":"            retry_attempts \u003d CONF.retry_attempts"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_ecbd67d8","line":190,"range":{"start_line":178,"start_character":0,"end_line":190,"end_character":61},"in_reply_to":"9a57fde8_dd93264e","updated":"2017-01-14 08:31:18.000000000","message":"I will confirm it.","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0ad0426bc8276966fac3250c5e7bb56bf0ba6a77","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            image_info \u003d glance_client.images.get(image.id)"},{"line_number":193,"context_line":"            retry_attempts \u003d CONF.retry_attempts"},{"line_number":194,"context_line":"            while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":195,"context_line":"                sleep(60)"},{"line_number":196,"context_line":"                image_info \u003d glance_client.images.get(image.id)"},{"line_number":197,"context_line":"                retry_attempts -\u003d 1"},{"line_number":198,"context_line":"            if retry_attempts \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a57fde8_9daa7e6f","line":195,"range":{"start_line":195,"start_character":22,"end_line":195,"end_character":24},"updated":"2017-01-12 13:25:13.000000000","message":"configurable?","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"44dc1698c8afc31dfdedcb64ed14f1e3ba90c032","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            image_info \u003d glance_client.images.get(image.id)"},{"line_number":193,"context_line":"            retry_attempts \u003d CONF.retry_attempts"},{"line_number":194,"context_line":"            while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":195,"context_line":"                sleep(60)"},{"line_number":196,"context_line":"                image_info \u003d glance_client.images.get(image.id)"},{"line_number":197,"context_line":"                retry_attempts -\u003d 1"},{"line_number":198,"context_line":"            if retry_attempts \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_2cb84fe5","line":195,"range":{"start_line":195,"start_character":22,"end_line":195,"end_character":24},"in_reply_to":"9a57fde8_9daa7e6f","updated":"2017-01-14 08:31:18.000000000","message":"OK","commit_id":"14268eea75726890e986d2f08860fa48fd544905"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    cfg.IntOpt(\u0027backup_image_object_size\u0027,"},{"line_number":33,"context_line":"               default\u003d65536*10,"},{"line_number":34,"context_line":"               help\u003d\u0027The size in bytes of instance image objects. \u0027"},{"line_number":35,"context_line":"                    \u0027The value must be a multiple of 65536, \u0027"},{"line_number":36,"context_line":"                    \u0027the size of image\\\u0027s mini chunk.\u0027),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027retry_attempts\u0027,"},{"line_number":38,"context_line":"               default\u003d10,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_f4b24093","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":61},"updated":"2017-01-22 11:30:57.000000000","message":"why does it have to be a multiple of 65536?","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    cfg.IntOpt(\u0027backup_image_object_size\u0027,"},{"line_number":33,"context_line":"               default\u003d65536*10,"},{"line_number":34,"context_line":"               help\u003d\u0027The size in bytes of instance image objects. \u0027"},{"line_number":35,"context_line":"                    \u0027The value must be a multiple of 65536, \u0027"},{"line_number":36,"context_line":"                    \u0027the size of image\\\u0027s mini chunk.\u0027),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027retry_attempts\u0027,"},{"line_number":38,"context_line":"               default\u003d10,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_6dc03a2b","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":61},"in_reply_to":"5a3905b3_f4b24093","updated":"2017-01-23 02:09:34.000000000","message":"The response of image data API is a iterable chunk list. The size of a image chunk is 65536.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"               default\u003d65536*10,"},{"line_number":34,"context_line":"               help\u003d\u0027The size in bytes of instance image objects. \u0027"},{"line_number":35,"context_line":"                    \u0027The value must be a multiple of 65536, \u0027"},{"line_number":36,"context_line":"                    \u0027the size of image\\\u0027s mini chunk.\u0027),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027retry_attempts\u0027,"},{"line_number":38,"context_line":"               default\u003d10,"},{"line_number":39,"context_line":"               help\u003d\u0027The retry numbers of querying the image.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_b49d180c","line":36,"range":{"start_line":36,"start_character":42,"end_line":36,"end_character":52},"updated":"2017-01-22 11:30:57.000000000","message":"what\u0027s a \u0027mini chunk\u0027?","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"               default\u003d65536*10,"},{"line_number":34,"context_line":"               help\u003d\u0027The size in bytes of instance image objects. \u0027"},{"line_number":35,"context_line":"                    \u0027The value must be a multiple of 65536, \u0027"},{"line_number":36,"context_line":"                    \u0027the size of image\\\u0027s mini chunk.\u0027),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027retry_attempts\u0027,"},{"line_number":38,"context_line":"               default\u003d10,"},{"line_number":39,"context_line":"               help\u003d\u0027The retry numbers of querying the image.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_4dda9e18","line":36,"range":{"start_line":36,"start_character":42,"end_line":36,"end_character":52},"in_reply_to":"5a3905b3_b49d180c","updated":"2017-01-23 02:09:34.000000000","message":"The size is smaller than the size of backup_image_object_size. maybe the image chunk is better.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"class ProtectOperation(protection_plugin.Operation):"},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(ProtectOperation, self).__init__()"},{"line_number":84,"context_line":"        self._tp \u003d eventlet.GreenPool()"},{"line_number":85,"context_line":"        self.data_block_size_bytes \u003d ("},{"line_number":86,"context_line":"            CONF.image_backup_plugin.backup_image_object_size)"},{"line_number":87,"context_line":"        self.retry_attempts_timeout \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_74be5066","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":39},"updated":"2017-01-22 11:30:57.000000000","message":"unnecessary, see comment below about greenthread.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":81,"context_line":"class ProtectOperation(protection_plugin.Operation):"},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(ProtectOperation, self).__init__()"},{"line_number":84,"context_line":"        self._tp \u003d eventlet.GreenPool()"},{"line_number":85,"context_line":"        self.data_block_size_bytes \u003d ("},{"line_number":86,"context_line":"            CONF.image_backup_plugin.backup_image_object_size)"},{"line_number":87,"context_line":"        self.retry_attempts_timeout \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_ed0fca85","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":39},"in_reply_to":"5a3905b3_74be5066","updated":"2017-01-23 02:09:34.000000000","message":"In the previous patch, I already have plans to use sync call of backup image.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                resource_id\u003dimage_id,"},{"line_number":121,"context_line":"                resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":124,"context_line":"                                bank_section, image_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        is_success \u003d status_poll("},{"line_number":127,"context_line":"            partial(get_backup_status, bank_section, image_id),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_949c9c10","line":124,"range":{"start_line":123,"start_character":0,"end_line":124,"end_character":55},"updated":"2017-01-22 11:30:57.000000000","message":"why do we need to add this to a greenthread? this whole method is ran in a greenthread by taskflow already.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                resource_id\u003dimage_id,"},{"line_number":121,"context_line":"                resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":124,"context_line":"                                bank_section, image_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        is_success \u003d status_poll("},{"line_number":127,"context_line":"            partial(get_backup_status, bank_section, image_id),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_4d1ffeb6","line":124,"range":{"start_line":123,"start_character":0,"end_line":124,"end_character":55},"in_reply_to":"5a3905b3_949c9c10","updated":"2017-01-23 02:09:34.000000000","message":"Done","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                bank_section, image_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        is_success \u003d status_poll("},{"line_number":127,"context_line":"            partial(get_backup_status, bank_section, image_id),"},{"line_number":128,"context_line":"            interval\u003dself._interval,"},{"line_number":129,"context_line":"            success_statuses\u003d{\u0027available\u0027},"},{"line_number":130,"context_line":"            failure_statuses\u003d{\u0027error\u0027}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_3480488b","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":63},"updated":"2017-01-22 11:30:57.000000000","message":"Usually we poll the status of the backup in an async operation, but the process of uploading the chunks of the image to the bank are not async, so no need to poll here, just do the work of uploading the chunks.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                bank_section, image_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        is_success \u003d status_poll("},{"line_number":127,"context_line":"            partial(get_backup_status, bank_section, image_id),"},{"line_number":128,"context_line":"            interval\u003dself._interval,"},{"line_number":129,"context_line":"            success_statuses\u003d{\u0027available\u0027},"},{"line_number":130,"context_line":"            failure_statuses\u003d{\u0027error\u0027}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_6d1cbac1","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":63},"in_reply_to":"5a3905b3_3480488b","updated":"2017-01-23 02:09:34.000000000","message":"Done","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        )"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if is_success is True:"},{"line_number":134,"context_line":"            LOG.info(_LI(\u0027Protecting image (id: %s) to swift completed \u0027"},{"line_number":135,"context_line":"                         \u0027successfully\u0027), image_id)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            LOG.error(_LE(\u0027Protecting image (id: %s) to swift failed.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_9451fc38","line":134,"range":{"start_line":134,"start_character":55,"end_line":134,"end_character":60},"updated":"2017-01-22 11:30:57.000000000","message":"bank","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            LOG.info(_LI(\u0027Protecting image (id: %s) to swift completed \u0027"},{"line_number":135,"context_line":"                         \u0027successfully\u0027), image_id)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            LOG.error(_LE(\u0027Protecting image (id: %s) to swift failed.\u0027),"},{"line_number":138,"context_line":"                      image_id)"},{"line_number":139,"context_line":"            raise exception.CreateBackupFailed("},{"line_number":140,"context_line":"                resource_id\u003dimage_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_b4427866","line":137,"range":{"start_line":137,"start_character":56,"end_line":137,"end_character":61},"updated":"2017-01-22 11:30:57.000000000","message":"bank","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            image_response \u003d glance_client.images.data(image_id,"},{"line_number":157,"context_line":"                                                       do_checksum\u003dTrue)"},{"line_number":158,"context_line":"            swift_chunk_num \u003d int(self.data_block_size_bytes/65536)"},{"line_number":159,"context_line":"            LOG.debug(\"Creating image backup, swift_chunk_num: %s.\","},{"line_number":160,"context_line":"                      swift_chunk_num)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_744c909e","line":158,"range":{"start_line":158,"start_character":12,"end_line":158,"end_character":27},"updated":"2017-01-22 11:30:57.000000000","message":"bank may not necessarily be swift","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            image_response \u003d glance_client.images.data(image_id,"},{"line_number":157,"context_line":"                                                       do_checksum\u003dTrue)"},{"line_number":158,"context_line":"            swift_chunk_num \u003d int(self.data_block_size_bytes/65536)"},{"line_number":159,"context_line":"            LOG.debug(\"Creating image backup, swift_chunk_num: %s.\","},{"line_number":160,"context_line":"                      swift_chunk_num)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_cd812ec5","line":158,"range":{"start_line":158,"start_character":12,"end_line":158,"end_character":27},"in_reply_to":"5a3905b3_744c909e","updated":"2017-01-23 02:09:34.000000000","message":"Maybe bank_chunk_num is better.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            image_response \u003d glance_client.images.data(image_id,"},{"line_number":157,"context_line":"                                                       do_checksum\u003dTrue)"},{"line_number":158,"context_line":"            swift_chunk_num \u003d int(self.data_block_size_bytes/65536)"},{"line_number":159,"context_line":"            LOG.debug(\"Creating image backup, swift_chunk_num: %s.\","},{"line_number":160,"context_line":"                      swift_chunk_num)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            mini_chunks_num \u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_f4608003","line":159,"range":{"start_line":159,"start_character":46,"end_line":159,"end_character":61},"updated":"2017-01-22 11:30:57.000000000","message":"bank","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            image_response \u003d glance_client.images.data(image_id,"},{"line_number":157,"context_line":"                                                       do_checksum\u003dTrue)"},{"line_number":158,"context_line":"            swift_chunk_num \u003d int(self.data_block_size_bytes/65536)"},{"line_number":159,"context_line":"            LOG.debug(\"Creating image backup, swift_chunk_num: %s.\","},{"line_number":160,"context_line":"                      swift_chunk_num)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            mini_chunks_num \u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_ed86ead9","line":159,"range":{"start_line":159,"start_character":46,"end_line":159,"end_character":61},"in_reply_to":"5a3905b3_f4608003","updated":"2017-01-23 02:09:34.000000000","message":"Done","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":178,"context_line":"            data \u003d image_response_data.read()"},{"line_number":179,"context_line":"            if data !\u003d \u0027\u0027:"},{"line_number":180,"context_line":"                bank_section.create_object(\"data_\" + str(chunks_num), data)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # update resource_definition backup_status"},{"line_number":183,"context_line":"            bank_section.update_object(\"status\","},{"line_number":184,"context_line":"                                       constants.RESOURCE_STATUS_AVAILABLE)"},{"line_number":185,"context_line":"            LOG.info(_LI(\"Finish the threadpool of backup image %s.\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_d4154449","line":182,"range":{"start_line":180,"start_character":0,"end_line":182,"end_character":54},"updated":"2017-01-22 11:30:57.000000000","message":"store the amount of chunks in the checkpoint metadata?\nin restore, validate that the amount of chunk we got from listing is the same as the expected amount of chunks","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":178,"context_line":"            data \u003d image_response_data.read()"},{"line_number":179,"context_line":"            if data !\u003d \u0027\u0027:"},{"line_number":180,"context_line":"                bank_section.create_object(\"data_\" + str(chunks_num), data)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # update resource_definition backup_status"},{"line_number":183,"context_line":"            bank_section.update_object(\"status\","},{"line_number":184,"context_line":"                                       constants.RESOURCE_STATUS_AVAILABLE)"},{"line_number":185,"context_line":"            LOG.info(_LI(\"Finish the threadpool of backup image %s.\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_6d73da15","line":182,"range":{"start_line":180,"start_character":0,"end_line":182,"end_character":54},"in_reply_to":"5a3905b3_d4154449","updated":"2017-01-23 02:09:34.000000000","message":"I will add a check about the amount of chunk.","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        original_image_id \u003d resource.id"},{"line_number":238,"context_line":"        heat_template \u003d kwargs.get(\"heat_template\")"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        name \u003d kwargs.get(\"restore_name\", \"karbor-restore-image\")"},{"line_number":241,"context_line":"        LOG.info(_LI(\"Restoring image backup, image_id: %s.\"),"},{"line_number":242,"context_line":"                 original_image_id)"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_140c2c40","line":240,"range":{"start_line":240,"start_character":27,"end_line":240,"end_character":39},"updated":"2017-01-22 11:30:57.000000000","message":"restore_name will be in parameters, not in kwargs","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        original_image_id \u003d resource.id"},{"line_number":238,"context_line":"        heat_template \u003d kwargs.get(\"heat_template\")"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        name \u003d kwargs.get(\"restore_name\", \"karbor-restore-image\")"},{"line_number":241,"context_line":"        LOG.info(_LI(\"Restoring image backup, image_id: %s.\"),"},{"line_number":242,"context_line":"                 original_image_id)"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_ad67824b","line":240,"range":{"start_line":240,"start_character":27,"end_line":240,"end_character":39},"in_reply_to":"5a3905b3_140c2c40","updated":"2017-01-23 02:09:34.000000000","message":"Done","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            resource_definition \u003d bank_section.get_object(\u0027metadata\u0027)"},{"line_number":248,"context_line":"            image_metadata \u003d resource_definition[\u0027image_metadata\u0027]"},{"line_number":249,"context_line":"            objects \u003d [key.split(\"/\")[-1] for key in"},{"line_number":250,"context_line":"                       bank_section.list_objects()"},{"line_number":251,"context_line":"                       if (key.split(\"/\")[-1]).startswith(\"data_\")]"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"            sorted_objects \u003d sorted(objects, key\u003dlambda s: int(s[5:]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_3405a813","line":250,"range":{"start_line":250,"start_character":48,"end_line":250,"end_character":50},"updated":"2017-01-22 11:30:57.000000000","message":"use prefix\u003d\u0027data_\u0027 ?","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            image_info \u003d glance_client.images.get(image.id)"},{"line_number":264,"context_line":"            retry_attempts \u003d CONF.image_backup_plugin.retry_attempts"},{"line_number":265,"context_line":"            while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":266,"context_line":"                sleep(self.retry_attempts_timeout)"},{"line_number":267,"context_line":"                image_info \u003d glance_client.images.get(image.id)"},{"line_number":268,"context_line":"                retry_attempts -\u003d 1"},{"line_number":269,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":270,"context_line":"                raise Exception"},{"line_number":271,"context_line":"            if image_info.checksum !\u003d image_metadata[\"checksum\"]:"},{"line_number":272,"context_line":"                raise exception.RestoreBackupFailed("},{"line_number":273,"context_line":"                    reason\u003d\" The checksum of restored image is invalid.\","}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_df155d40","line":270,"range":{"start_line":265,"start_character":0,"end_line":270,"end_character":31},"updated":"2017-01-22 11:30:57.000000000","message":"here using the \u0027status_poll\u0027 function might be a good idea, to differentiate between \u0027in process\u0027 statuses (queued, saving) where we need to wait, and \u0027error\u0027 statuses (killed, deleted, pending_delete, deactivated) where we can bail immediately.\nImage statuses may be:\nhttp://developer.openstack.org/api-ref/image/v2/index.html","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"bfa885dc9912923ffdd5700a0258ba203d3f698a","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                 original_image_id)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class SwiftBankIO(object):"},{"line_number":289,"context_line":"        def __init__(self, bank_section, sorted_objects):"},{"line_number":290,"context_line":"            self.bank_section \u003d bank_section"},{"line_number":291,"context_line":"            self.sorted_objects \u003d sorted_objects"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_145eec43","line":288,"range":{"start_line":288,"start_character":6,"end_line":288,"end_character":17},"updated":"2017-01-22 11:30:57.000000000","message":"bank may not necessarily be swift","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"3cbde3ae9466939ee71233c094883258c6de36bf","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                 original_image_id)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class SwiftBankIO(object):"},{"line_number":289,"context_line":"        def __init__(self, bank_section, sorted_objects):"},{"line_number":290,"context_line":"            self.bank_section \u003d bank_section"},{"line_number":291,"context_line":"            self.sorted_objects \u003d sorted_objects"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_0d57b658","line":288,"range":{"start_line":288,"start_character":6,"end_line":288,"end_character":17},"in_reply_to":"5a3905b3_145eec43","updated":"2017-01-23 02:09:34.000000000","message":"BankIO?","commit_id":"4878b9a7aeffdd952438079a666da6d9a3ddb003"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"7c881ed611285c037705720b85e63256d0cfe274","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"CONF \u003d cfg.CONF"},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":"CONF.register_opts(image_backup_opts, \u0027image_backup_plugin\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def status_poll(get_status_func, interval, success_statuses\u003dset(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_84c60698","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":60},"updated":"2017-01-23 15:51:23.000000000","message":"register the opts on \u0027self._config\u0027 in the ProtectionPlugin\u0027s \u0027init()\u0027 and pass it to the Operations as you need it","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"2485e7c803f32bc80202e2bc092429e506c3c196","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"CONF \u003d cfg.CONF"},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":"CONF.register_opts(image_backup_opts, \u0027image_backup_plugin\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def status_poll(get_status_func, interval, success_statuses\u003dset(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_f6dafb15","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":60},"in_reply_to":"5a3905b3_84c60698","updated":"2017-01-24 07:09:50.000000000","message":"Done","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e3014acf52d2dbded40bcd4fd582b923db9d73a1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    try:"},{"line_number":65,"context_line":"        status \u003d glance_client.images.get(image_id)"},{"line_number":66,"context_line":"    except exception.NotFound:"},{"line_number":67,"context_line":"        status \u003d \u0027NotFound\u0027"},{"line_number":68,"context_line":"    LOG.debug(\u0027Polled image (image_id: %s) status: %s\u0027,"},{"line_number":69,"context_line":"              image_id, status)"},{"line_number":70,"context_line":"    return status"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_32e4bcdf","line":67,"range":{"start_line":67,"start_character":18,"end_line":67,"end_character":26},"updated":"2017-01-23 13:39:35.000000000","message":"don\u0027t want to stick to nits, but why CamelCase?","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"fb7abbda951c165a3ecb0c0a696bc107ca7a1f87","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    try:"},{"line_number":65,"context_line":"        status \u003d glance_client.images.get(image_id)"},{"line_number":66,"context_line":"    except exception.NotFound:"},{"line_number":67,"context_line":"        status \u003d \u0027NotFound\u0027"},{"line_number":68,"context_line":"    LOG.debug(\u0027Polled image (image_id: %s) status: %s\u0027,"},{"line_number":69,"context_line":"              image_id, status)"},{"line_number":70,"context_line":"    return status"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_0ff12ecd","line":67,"range":{"start_line":67,"start_character":18,"end_line":67,"end_character":26},"in_reply_to":"5a3905b3_32e4bcdf","updated":"2017-01-24 04:45:15.000000000","message":"We can consider define a uniform string about not found status.","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e3014acf52d2dbded40bcd4fd582b923db9d73a1","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if is_success is not True:"},{"line_number":100,"context_line":"                    LOG.error(_LE(\u0027The status of image (id: %s) is invalid.\u0027),"},{"line_number":101,"context_line":"                              image_id)"},{"line_number":102,"context_line":"                    raise exception.CreateBackupFailed("},{"line_number":103,"context_line":"                        resource_id\u003dimage_id,"},{"line_number":104,"context_line":"                        resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"            image_metadata \u003d {"},{"line_number":107,"context_line":"                \"disk_format\": image_info.disk_format,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_7201e469","line":104,"range":{"start_line":102,"start_character":0,"end_line":104,"end_character":68},"updated":"2017-01-23 13:39:35.000000000","message":"missing reason","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"fb7abbda951c165a3ecb0c0a696bc107ca7a1f87","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if is_success is not True:"},{"line_number":100,"context_line":"                    LOG.error(_LE(\u0027The status of image (id: %s) is invalid.\u0027),"},{"line_number":101,"context_line":"                              image_id)"},{"line_number":102,"context_line":"                    raise exception.CreateBackupFailed("},{"line_number":103,"context_line":"                        resource_id\u003dimage_id,"},{"line_number":104,"context_line":"                        resource_type\u003dconstants.IMAGE_RESOURCE_TYPE)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"            image_metadata \u003d {"},{"line_number":107,"context_line":"                \"disk_format\": image_info.disk_format,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_4fbdf6d6","line":104,"range":{"start_line":102,"start_character":0,"end_line":104,"end_character":68},"in_reply_to":"5a3905b3_7201e469","updated":"2017-01-24 04:45:15.000000000","message":"Done","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e3014acf52d2dbded40bcd4fd582b923db9d73a1","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            # Save the chunks_num to metadata"},{"line_number":155,"context_line":"            resource_definition \u003d bank_section.get_object(\"metadata\")"},{"line_number":156,"context_line":"            if resource_definition is not None:"},{"line_number":157,"context_line":"                resource_definition[\"chunks_num\"] \u003d chunks_num + 1"},{"line_number":158,"context_line":"            bank_section.update_object(\"metadata\", resource_definition)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            # Update resource_definition backup_status"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_af01233a","line":157,"range":{"start_line":157,"start_character":16,"end_line":157,"end_character":66},"updated":"2017-01-23 13:39:35.000000000","message":"why \u0027chunk_num + 1\u0027? what if the last chunk (line 151) had no data?","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"fb7abbda951c165a3ecb0c0a696bc107ca7a1f87","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            # Save the chunks_num to metadata"},{"line_number":155,"context_line":"            resource_definition \u003d bank_section.get_object(\"metadata\")"},{"line_number":156,"context_line":"            if resource_definition is not None:"},{"line_number":157,"context_line":"                resource_definition[\"chunks_num\"] \u003d chunks_num + 1"},{"line_number":158,"context_line":"            bank_section.update_object(\"metadata\", resource_definition)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            # Update resource_definition backup_status"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_02f105cd","line":157,"range":{"start_line":157,"start_character":16,"end_line":157,"end_character":66},"in_reply_to":"5a3905b3_af01233a","updated":"2017-01-24 04:45:15.000000000","message":"The chunks_num is a index of data name in bank, it start from 0. It could be initialized with 1.","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e3014acf52d2dbded40bcd4fd582b923db9d73a1","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            resource_definition \u003d bank_section.get_object(\u0027metadata\u0027)"},{"line_number":225,"context_line":"            image_metadata \u003d resource_definition[\u0027image_metadata\u0027]"},{"line_number":226,"context_line":"            objects \u003d [key.split(\"/\")[-1] for key in"},{"line_number":227,"context_line":"                       bank_section.list_objects()"},{"line_number":228,"context_line":"                       if (key.split(\"/\")[-1]).startswith(\"data_\")]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"            # check the chunks_num"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_ef8ecbce","line":227,"range":{"start_line":227,"start_character":48,"end_line":227,"end_character":50},"updated":"2017-01-23 13:39:35.000000000","message":"use prefix\u003d\u0027data_\u0027  ?","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"fb7abbda951c165a3ecb0c0a696bc107ca7a1f87","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            resource_definition \u003d bank_section.get_object(\u0027metadata\u0027)"},{"line_number":225,"context_line":"            image_metadata \u003d resource_definition[\u0027image_metadata\u0027]"},{"line_number":226,"context_line":"            objects \u003d [key.split(\"/\")[-1] for key in"},{"line_number":227,"context_line":"                       bank_section.list_objects()"},{"line_number":228,"context_line":"                       if (key.split(\"/\")[-1]).startswith(\"data_\")]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"            # check the chunks_num"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_a237514b","line":227,"range":{"start_line":227,"start_character":48,"end_line":227,"end_character":50},"in_reply_to":"5a3905b3_ef8ecbce","updated":"2017-01-24 04:45:15.000000000","message":"The prefix parameter value of list_objects is a whole directory name. There will be a \u0027/\u0027 string behind the prefix directly.","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"}],"karbor/tests/unit/protection/test_glance_protection_plugin.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e3014acf52d2dbded40bcd4fd582b923db9d73a1","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    @mock.patch(\u0027karbor.services.protection.protection_plugins.image.\u0027"},{"line_number":123,"context_line":"                \u0027image_protection_plugin.status_poll\u0027)"},{"line_number":124,"context_line":"    @mock.patch(\u0027karbor.services.protection.clients.glance.create\u0027)"},{"line_number":125,"context_line":"    @mock.patch(\u0027karbor.services.protection.clients.glance.create\u0027)"},{"line_number":126,"context_line":"    def test_create_backup(self, mock_glance_create, mock_status_poll):"},{"line_number":127,"context_line":"        resource \u003d Resource(id\u003d\"123\","},{"line_number":128,"context_line":"                            type\u003dconstants.IMAGE_RESOURCE_TYPE,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_d21b7871","line":125,"range":{"start_line":124,"start_character":0,"end_line":125,"end_character":67},"updated":"2017-01-23 13:39:35.000000000","message":"mocks the same object twice","commit_id":"08d2c058ac7047c8ba139db9e9a5d88f001b868c"}]}
