)]}'
{"karbor/services/protection/protection_plugins/server/nova_protection_plugin.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"8f17f83a19799b5da09f694afbdeb43b7ba39408","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d\u0027Poll interval for image backup status\u0027),"},{"line_number":46,"context_line":"]"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"CONF \u003d cfg.CONF"},{"line_number":49,"context_line":"CONF.register_opts(nova_protection_opts, \u0027nova_protection_plugin\u0027)"},{"line_number":50,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"VOLUME_ATTACHMENT_RESOURCE \u003d \u0027OS::Cinder::VolumeAttachment\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_4785fb04","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":66},"updated":"2017-01-23 15:51:20.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":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":56,"context_line":"class ProtectOperation(protection_plugin.Operation):"},{"line_number":57,"context_line":"    def __init__(self):"},{"line_number":58,"context_line":"        super(ProtectOperation, self).__init__()"},{"line_number":59,"context_line":"        self._tp \u003d eventlet.GreenPool()"},{"line_number":60,"context_line":"        self.image_object_size \u003d ("},{"line_number":61,"context_line":"            CONF.nova_protection_plugin.backup_image_object_size)"},{"line_number":62,"context_line":"        self.retry_attempts \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_45eefcb4","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":39},"updated":"2017-01-22 15:43:05.000000000","message":"no need for another greenpool, taskflow calls the operation hooks in a greenthread","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        resource_definition \u003d {\"resource_id\": server_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        volume_protectable \u003d VolumeProtectablePlugin(context)"},{"line_number":84,"context_line":"        volume_child_nodes \u003d volume_protectable.get_dependent_resources("},{"line_number":85,"context_line":"            context, resource)"},{"line_number":86,"context_line":"        attach_metadata \u003d {}"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        LOG.info(_LI(\"creating server backup, server_id: %s. \"), server_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_a5332061","line":85,"range":{"start_line":84,"start_character":0,"end_line":85,"end_character":30},"updated":"2017-01-22 15:43:05.000000000","message":"why use protectable when we can extract this info from the resource graph?","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            addresses \u003d getattr(server, \"addresses\")"},{"line_number":108,"context_line":"            networks \u003d []"},{"line_number":109,"context_line":"            floating_ips \u003d []"},{"line_number":110,"context_line":"            for network_infos in addresses.values():"},{"line_number":111,"context_line":"                for network_info in network_infos:"},{"line_number":112,"context_line":"                    addr \u003d network_info.get(\"addr\")"},{"line_number":113,"context_line":"                    mac \u003d network_info.get(\"OS-EXT-IPS-MAC:mac_addr\")"},{"line_number":114,"context_line":"                    network_type \u003d network_info.get(\"OS-EXT-IPS:type\")"},{"line_number":115,"context_line":"                    if network_type \u003d\u003d \u0027fixed\u0027:"},{"line_number":116,"context_line":"                        port \u003d neutron_client.list_ports("},{"line_number":117,"context_line":"                            mac_address\u003dmac)[\"ports\"][0]"},{"line_number":118,"context_line":"                        if port[\"network_id\"] not in networks:"},{"line_number":119,"context_line":"                            networks.append(port[\"network_id\"])"},{"line_number":120,"context_line":"                    elif network_type \u003d\u003d \"floating\":"},{"line_number":121,"context_line":"                        floating_ips.append(addr)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            flavor \u003d getattr(server, \"flavor\")[\"id\"]"},{"line_number":124,"context_line":"            key_name \u003d getattr(server, \"key_name\", None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_e541a8aa","line":121,"range":{"start_line":110,"start_character":0,"end_line":121,"end_character":49},"updated":"2017-01-22 15:43:05.000000000","message":"didn\u0027t really dig into it, but most of the network config should protected by the network protection plugin.","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6031182bd2245e72dff287e1c0062625d9fa889e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            addresses \u003d getattr(server, \"addresses\")"},{"line_number":108,"context_line":"            networks \u003d []"},{"line_number":109,"context_line":"            floating_ips \u003d []"},{"line_number":110,"context_line":"            for network_infos in addresses.values():"},{"line_number":111,"context_line":"                for network_info in network_infos:"},{"line_number":112,"context_line":"                    addr \u003d network_info.get(\"addr\")"},{"line_number":113,"context_line":"                    mac \u003d network_info.get(\"OS-EXT-IPS-MAC:mac_addr\")"},{"line_number":114,"context_line":"                    network_type \u003d network_info.get(\"OS-EXT-IPS:type\")"},{"line_number":115,"context_line":"                    if network_type \u003d\u003d \u0027fixed\u0027:"},{"line_number":116,"context_line":"                        port \u003d neutron_client.list_ports("},{"line_number":117,"context_line":"                            mac_address\u003dmac)[\"ports\"][0]"},{"line_number":118,"context_line":"                        if port[\"network_id\"] not in networks:"},{"line_number":119,"context_line":"                            networks.append(port[\"network_id\"])"},{"line_number":120,"context_line":"                    elif network_type \u003d\u003d \"floating\":"},{"line_number":121,"context_line":"                        floating_ips.append(addr)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            flavor \u003d getattr(server, \"flavor\")[\"id\"]"},{"line_number":124,"context_line":"            key_name \u003d getattr(server, \"key_name\", None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_906c1138","line":121,"range":{"start_line":110,"start_character":0,"end_line":121,"end_character":49},"in_reply_to":"5a3905b3_e541a8aa","updated":"2017-01-25 11:59:51.000000000","message":"IMO the config of floating_ips and networks also are the metadata of the server.","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                               }"},{"line_number":134,"context_line":"            resource_definition[\"server_metadata\"] \u003d server_metadata"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"            snapshot_id \u003d nova_client.servers.create_image("},{"line_number":137,"context_line":"                server_id, \"snapshot_%s\" % server_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            bank_section.create_object(\"metadata\", resource_definition)"},{"line_number":140,"context_line":"        except Exception as err:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_053f9424","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":53},"updated":"2017-01-22 15:43:05.000000000","message":"we will not take a snapshot of the server image (considering the server boots from and image and not from a volume)","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                resource_id\u003dserver_id,"},{"line_number":148,"context_line":"                resource_type\u003dconstants.SERVER_RESOURCE_TYPE)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":151,"context_line":"                                bank_section, server_id, snapshot_id,"},{"line_number":152,"context_line":"                                resource_definition, checkpoint)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _create_image_backup(self, glance_client, bank_section, image_id):"},{"line_number":155,"context_line":"        image_response \u003d glance_client.images.data(image_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_254810cc","line":152,"range":{"start_line":150,"start_character":0,"end_line":152,"end_character":64},"updated":"2017-01-22 15:43:05.000000000","message":"no need to send create backup to the threadpool, and no need for threadpool at all, actually","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6031182bd2245e72dff287e1c0062625d9fa889e","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                resource_id\u003dserver_id,"},{"line_number":148,"context_line":"                resource_type\u003dconstants.SERVER_RESOURCE_TYPE)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        self._add_to_threadpool(self._create_backup, glance_client,"},{"line_number":151,"context_line":"                                bank_section, server_id, snapshot_id,"},{"line_number":152,"context_line":"                                resource_definition, checkpoint)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _create_image_backup(self, glance_client, bank_section, image_id):"},{"line_number":155,"context_line":"        image_response \u003d glance_client.images.data(image_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_f0739513","line":152,"range":{"start_line":150,"start_character":0,"end_line":152,"end_character":64},"in_reply_to":"5a3905b3_254810cc","updated":"2017-01-25 11:59:51.000000000","message":"Done","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                                bank_section, server_id, snapshot_id,"},{"line_number":152,"context_line":"                                resource_definition, checkpoint)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _create_image_backup(self, glance_client, bank_section, image_id):"},{"line_number":155,"context_line":"        image_response \u003d glance_client.images.data(image_id)"},{"line_number":156,"context_line":"        swift_chunk_num \u003d int(self.image_object_size/65536)"},{"line_number":157,"context_line":"        mini_chunks_index \u003d 0"},{"line_number":158,"context_line":"        chunks_num \u003d 0"},{"line_number":159,"context_line":"        image_response_data \u003d BytesIO()"},{"line_number":160,"context_line":"        for chunk in image_response:"},{"line_number":161,"context_line":"            image_response_data.write(chunk)"},{"line_number":162,"context_line":"            mini_chunks_index +\u003d 1"},{"line_number":163,"context_line":"            if mini_chunks_index \u003d\u003d swift_chunk_num:"},{"line_number":164,"context_line":"                mini_chunks_index \u003d 0"},{"line_number":165,"context_line":"                image_response_data.seek(0, os.SEEK_SET)"},{"line_number":166,"context_line":"                data \u003d image_response_data.read(self.image_object_size)"},{"line_number":167,"context_line":"                bank_section.create_object(\"data_\" + str(chunks_num), data)"},{"line_number":168,"context_line":"                image_response_data.truncate(0)"},{"line_number":169,"context_line":"                image_response_data.seek(0, os.SEEK_SET)"},{"line_number":170,"context_line":"                chunks_num +\u003d 1"},{"line_number":171,"context_line":"        image_response_data.seek(0, os.SEEK_SET)"},{"line_number":172,"context_line":"        data \u003d image_response_data.read()"},{"line_number":173,"context_line":"        if data !\u003d \u0027\u0027:"},{"line_number":174,"context_line":"            bank_section.create_object(\"data_\" + str(chunks_num), data)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _create_backup(self, glance_client, bank_section, server_id,"},{"line_number":177,"context_line":"                       snapshot_id, resource_definition, checkpoint):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_45451cb1","line":174,"range":{"start_line":154,"start_character":0,"end_line":174,"end_character":71},"updated":"2017-01-22 15:43:05.000000000","message":"as said above, we do not take a snapshot from the server image","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":186,"context_line":"                raise Exception"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            resource_definition[\"snapshot_id\"] \u003d snapshot_id"},{"line_number":189,"context_line":"            snapshot_metadata \u003d {"},{"line_number":190,"context_line":"                \"disk_format\": image.disk_format,"},{"line_number":191,"context_line":"                \"container_format\": image.container_format,"},{"line_number":192,"context_line":"                \"name\": \"snapshot_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":193,"context_line":"            }"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"            if getattr(image, \"kernel_id\", None) is not None:"},{"line_number":196,"context_line":"                kernel \u003d glance_client.images.get(image.kernel_id)"},{"line_number":197,"context_line":"                kernel_metadata \u003d {"},{"line_number":198,"context_line":"                    \"disk_format\": kernel.disk_format,"},{"line_number":199,"context_line":"                    \"container_format\": kernel.container_format,"},{"line_number":200,"context_line":"                    \"name\": \"kernel_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":201,"context_line":"                }"},{"line_number":202,"context_line":"                snapshot_metadata[\"kernel_metadata\"] \u003d kernel_metadata"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            if getattr(image, \"ramdisk_id\", None) is not None:"},{"line_number":205,"context_line":"                ramdisk \u003d glance_client.images.get(image.ramdisk_id)"},{"line_number":206,"context_line":"                ramdisk_metadata \u003d {"},{"line_number":207,"context_line":"                    \"disk_format\": ramdisk.disk_format,"},{"line_number":208,"context_line":"                    \"container_format\": ramdisk.container_format,"},{"line_number":209,"context_line":"                    \"name\": \"ramdisk_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":210,"context_line":"                }"},{"line_number":211,"context_line":"                snapshot_metadata[\"ramdisk_metadata\"] \u003d ramdisk_metadata"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"            resource_definition[\"snapshot_metadata\"] \u003d snapshot_metadata"},{"line_number":214,"context_line":"            # write resource_definition in bank"},{"line_number":215,"context_line":"            bank_section.create_object(\"metadata\", resource_definition)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            image \u003d glance_client.images.get(snapshot_id)"},{"line_number":218,"context_line":"            retry_attempts \u003d self.retry_attempts"},{"line_number":219,"context_line":"            while image.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":220,"context_line":"                sleep(self.retry_attempts_timeout)"},{"line_number":221,"context_line":"                image \u003d glance_client.images.get(snapshot_id)"},{"line_number":222,"context_line":"                retry_attempts -\u003d 1"},{"line_number":223,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":224,"context_line":"                raise Exception"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"            # store kernel_data if need"},{"line_number":227,"context_line":"            if getattr(image, \"kernel_id\", None) is not None:"},{"line_number":228,"context_line":"                self._create_image_backup(glance_client, bank_section,"},{"line_number":229,"context_line":"                                          image.kernel_id)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            # store ramdisk_data if need"},{"line_number":232,"context_line":"            if getattr(image, \"ramdisk_id\", None) is not None:"},{"line_number":233,"context_line":"                ramdisk_id \u003d image.ramdisk_id"},{"line_number":234,"context_line":"                ramdisk_response \u003d glance_client.images.data(ramdisk_id)"},{"line_number":235,"context_line":"                ramdisk_response_data \u003d BytesIO()"},{"line_number":236,"context_line":"                for chunk in ramdisk_response:"},{"line_number":237,"context_line":"                    ramdisk_response_data.write(chunk)"},{"line_number":238,"context_line":"                ramdisk_response_data.seek(0, os.SEEK_SET)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"                chunks \u003d 0"},{"line_number":241,"context_line":"                while True:"},{"line_number":242,"context_line":"                    data \u003d ramdisk_response_data.read(self.image_object_size)"},{"line_number":243,"context_line":"                    if data \u003d\u003d \u0027\u0027:"},{"line_number":244,"context_line":"                        break"},{"line_number":245,"context_line":"                    bank_section.create_object(\"ramdisk_\" + str(chunks), data)"},{"line_number":246,"context_line":"                    chunks +\u003d 1"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"            # store snapshot_data"},{"line_number":249,"context_line":"            image_response \u003d glance_client.images.data(snapshot_id)"},{"line_number":250,"context_line":"            image_response_data \u003d BytesIO()"},{"line_number":251,"context_line":"            for chunk in image_response:"},{"line_number":252,"context_line":"                image_response_data.write(chunk)"},{"line_number":253,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"            chunks \u003d 0"},{"line_number":256,"context_line":"            while True:"},{"line_number":257,"context_line":"                data \u003d image_response_data.read(self.image_object_size)"},{"line_number":258,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":259,"context_line":"                    break"},{"line_number":260,"context_line":"                bank_section.create_object(\"snapshot_\" + str(chunks), data)"},{"line_number":261,"context_line":"                chunks +\u003d 1"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            glance_client.images.delete(snapshot_id)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"            # update resource_definition backup_status"},{"line_number":266,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_251f30b8","line":263,"range":{"start_line":188,"start_character":0,"end_line":263,"end_character":52},"updated":"2017-01-22 15:43:05.000000000","message":"ditto, we do not take a snapshot of the image\n\n(also, not all images use kernel and ramdisk, only amazon images afaik)","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6031182bd2245e72dff287e1c0062625d9fa889e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":186,"context_line":"                raise Exception"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            resource_definition[\"snapshot_id\"] \u003d snapshot_id"},{"line_number":189,"context_line":"            snapshot_metadata \u003d {"},{"line_number":190,"context_line":"                \"disk_format\": image.disk_format,"},{"line_number":191,"context_line":"                \"container_format\": image.container_format,"},{"line_number":192,"context_line":"                \"name\": \"snapshot_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":193,"context_line":"            }"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"            if getattr(image, \"kernel_id\", None) is not None:"},{"line_number":196,"context_line":"                kernel \u003d glance_client.images.get(image.kernel_id)"},{"line_number":197,"context_line":"                kernel_metadata \u003d {"},{"line_number":198,"context_line":"                    \"disk_format\": kernel.disk_format,"},{"line_number":199,"context_line":"                    \"container_format\": kernel.container_format,"},{"line_number":200,"context_line":"                    \"name\": \"kernel_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":201,"context_line":"                }"},{"line_number":202,"context_line":"                snapshot_metadata[\"kernel_metadata\"] \u003d kernel_metadata"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            if getattr(image, \"ramdisk_id\", None) is not None:"},{"line_number":205,"context_line":"                ramdisk \u003d glance_client.images.get(image.ramdisk_id)"},{"line_number":206,"context_line":"                ramdisk_metadata \u003d {"},{"line_number":207,"context_line":"                    \"disk_format\": ramdisk.disk_format,"},{"line_number":208,"context_line":"                    \"container_format\": ramdisk.container_format,"},{"line_number":209,"context_line":"                    \"name\": \"ramdisk_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":210,"context_line":"                }"},{"line_number":211,"context_line":"                snapshot_metadata[\"ramdisk_metadata\"] \u003d ramdisk_metadata"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"            resource_definition[\"snapshot_metadata\"] \u003d snapshot_metadata"},{"line_number":214,"context_line":"            # write resource_definition in bank"},{"line_number":215,"context_line":"            bank_section.create_object(\"metadata\", resource_definition)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            image \u003d glance_client.images.get(snapshot_id)"},{"line_number":218,"context_line":"            retry_attempts \u003d self.retry_attempts"},{"line_number":219,"context_line":"            while image.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":220,"context_line":"                sleep(self.retry_attempts_timeout)"},{"line_number":221,"context_line":"                image \u003d glance_client.images.get(snapshot_id)"},{"line_number":222,"context_line":"                retry_attempts -\u003d 1"},{"line_number":223,"context_line":"            if retry_attempts \u003d\u003d 0:"},{"line_number":224,"context_line":"                raise Exception"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"            # store kernel_data if need"},{"line_number":227,"context_line":"            if getattr(image, \"kernel_id\", None) is not None:"},{"line_number":228,"context_line":"                self._create_image_backup(glance_client, bank_section,"},{"line_number":229,"context_line":"                                          image.kernel_id)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            # store ramdisk_data if need"},{"line_number":232,"context_line":"            if getattr(image, \"ramdisk_id\", None) is not None:"},{"line_number":233,"context_line":"                ramdisk_id \u003d image.ramdisk_id"},{"line_number":234,"context_line":"                ramdisk_response \u003d glance_client.images.data(ramdisk_id)"},{"line_number":235,"context_line":"                ramdisk_response_data \u003d BytesIO()"},{"line_number":236,"context_line":"                for chunk in ramdisk_response:"},{"line_number":237,"context_line":"                    ramdisk_response_data.write(chunk)"},{"line_number":238,"context_line":"                ramdisk_response_data.seek(0, os.SEEK_SET)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"                chunks \u003d 0"},{"line_number":241,"context_line":"                while True:"},{"line_number":242,"context_line":"                    data \u003d ramdisk_response_data.read(self.image_object_size)"},{"line_number":243,"context_line":"                    if data \u003d\u003d \u0027\u0027:"},{"line_number":244,"context_line":"                        break"},{"line_number":245,"context_line":"                    bank_section.create_object(\"ramdisk_\" + str(chunks), data)"},{"line_number":246,"context_line":"                    chunks +\u003d 1"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"            # store snapshot_data"},{"line_number":249,"context_line":"            image_response \u003d glance_client.images.data(snapshot_id)"},{"line_number":250,"context_line":"            image_response_data \u003d BytesIO()"},{"line_number":251,"context_line":"            for chunk in image_response:"},{"line_number":252,"context_line":"                image_response_data.write(chunk)"},{"line_number":253,"context_line":"            image_response_data.seek(0, os.SEEK_SET)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"            chunks \u003d 0"},{"line_number":256,"context_line":"            while True:"},{"line_number":257,"context_line":"                data \u003d image_response_data.read(self.image_object_size)"},{"line_number":258,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":259,"context_line":"                    break"},{"line_number":260,"context_line":"                bank_section.create_object(\"snapshot_\" + str(chunks), data)"},{"line_number":261,"context_line":"                chunks +\u003d 1"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            glance_client.images.delete(snapshot_id)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"            # update resource_definition backup_status"},{"line_number":266,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_705ec577","line":263,"range":{"start_line":188,"start_character":0,"end_line":263,"end_character":52},"in_reply_to":"5a3905b3_251f30b8","updated":"2017-01-25 11:59:51.000000000","message":"Done","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                resource_type\u003dconstants.SERVER_RESOURCE_TYPE"},{"line_number":353,"context_line":"            )"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _restore_server_snapshot(self, bank_section, checkpoint, cntxt,"},{"line_number":356,"context_line":"                                 original_id, resource_definition):"},{"line_number":357,"context_line":"        snapshot_metadata \u003d resource_definition[\"snapshot_metadata\"]"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        glance_client \u003d ClientFactory.create_client(\"glance\", cntxt)"},{"line_number":360,"context_line":"        objects \u003d [key.split(\"/\")[-1] for key in"},{"line_number":361,"context_line":"                   bank_section.list_objects()"},{"line_number":362,"context_line":"                   if (key.split(\"/\")[-1]).startswith(\"data_\")]"},{"line_number":363,"context_line":"        sorted_objects \u003d sorted(objects, key\u003dlambda s: int(s[5:]))"},{"line_number":364,"context_line":"        # restore kernel if needed"},{"line_number":365,"context_line":"        kernel_id \u003d None"},{"line_number":366,"context_line":"        if snapshot_metadata.get(\"kernel_metadata\") is not None:"},{"line_number":367,"context_line":"            kernel_id \u003d self._restore_image("},{"line_number":368,"context_line":"                bank_section, checkpoint, glance_client, \"kernel\","},{"line_number":369,"context_line":"                snapshot_metadata[\"kernel_metadata\"], sorted_objects,"},{"line_number":370,"context_line":"                original_id)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        # restore ramdisk if needed"},{"line_number":373,"context_line":"        ramdisk_id \u003d None"},{"line_number":374,"context_line":"        if snapshot_metadata.get(\"ramdisk_metadata\") is not None:"},{"line_number":375,"context_line":"            ramdisk_id \u003d self._restore_image("},{"line_number":376,"context_line":"                bank_section, checkpoint, glance_client, \"ramdisk\","},{"line_number":377,"context_line":"                snapshot_metadata[\"ramdisk_metadata\"], sorted_objects,"},{"line_number":378,"context_line":"                original_id)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        # restore image"},{"line_number":381,"context_line":"        image_id \u003d self._restore_image("},{"line_number":382,"context_line":"            bank_section, checkpoint, glance_client, \"snapshot\","},{"line_number":383,"context_line":"            snapshot_metadata, sorted_objects, original_id,"},{"line_number":384,"context_line":"            kernel_id\u003dkernel_id, ramdisk_id\u003dramdisk_id)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        image_info \u003d glance_client.images.get(image_id)"},{"line_number":387,"context_line":"        retry_attempts \u003d 10"},{"line_number":388,"context_line":"        while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":389,"context_line":"            sleep(60)"},{"line_number":390,"context_line":"            image_info \u003d glance_client.images.get(image_id)"},{"line_number":391,"context_line":"            retry_attempts -\u003d 1"},{"line_number":392,"context_line":"        if retry_attempts \u003d\u003d 0:"},{"line_number":393,"context_line":"            raise Exception"},{"line_number":394,"context_line":"        return image_id"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _restore_image(self, bank_section, checkpoint, glance_client,"},{"line_number":397,"context_line":"                       image_format, image_metadata, objects, original_id,"},{"line_number":398,"context_line":"                       **kwargs):"},{"line_number":399,"context_line":"        if image_metadata.get(\"name\") is None:"},{"line_number":400,"context_line":"            name \u003d \"%s_%s@%s\" % (image_format, checkpoint.id,"},{"line_number":401,"context_line":"                                 original_id)"},{"line_number":402,"context_line":"        else:"},{"line_number":403,"context_line":"            name \u003d image_metadata[\"name\"]"},{"line_number":404,"context_line":"        disk_format \u003d image_metadata[\"disk_format\"]"},{"line_number":405,"context_line":"        container_format \u003d image_metadata[\"container_format\"]"},{"line_number":406,"context_line":"        image_data \u003d SwiftBankIO(bank_section, objects)"},{"line_number":407,"context_line":"        image \u003d glance_client.images.create("},{"line_number":408,"context_line":"            disk_format\u003ddisk_format,"},{"line_number":409,"context_line":"            container_format\u003dcontainer_format,"},{"line_number":410,"context_line":"            name\u003dname,"},{"line_number":411,"context_line":"            kernel_id\u003dkwargs.get(\"kernel_id\"),"},{"line_number":412,"context_line":"            ramdisk_id\u003dkwargs.get(\"ramdisk_id\"))"},{"line_number":413,"context_line":"        glance_client.images.upload(image.id, image_data)"},{"line_number":414,"context_line":"        return image.id"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def _heat_restore_server_instance(self, heat_template, image_id,"},{"line_number":417,"context_line":"                                      original_id, restore_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_451c3cc1","line":414,"range":{"start_line":355,"start_character":0,"end_line":414,"end_character":23},"updated":"2017-01-22 15:43:05.000000000","message":"ditto","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6031182bd2245e72dff287e1c0062625d9fa889e","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                resource_type\u003dconstants.SERVER_RESOURCE_TYPE"},{"line_number":353,"context_line":"            )"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _restore_server_snapshot(self, bank_section, checkpoint, cntxt,"},{"line_number":356,"context_line":"                                 original_id, resource_definition):"},{"line_number":357,"context_line":"        snapshot_metadata \u003d resource_definition[\"snapshot_metadata\"]"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        glance_client \u003d ClientFactory.create_client(\"glance\", cntxt)"},{"line_number":360,"context_line":"        objects \u003d [key.split(\"/\")[-1] for key in"},{"line_number":361,"context_line":"                   bank_section.list_objects()"},{"line_number":362,"context_line":"                   if (key.split(\"/\")[-1]).startswith(\"data_\")]"},{"line_number":363,"context_line":"        sorted_objects \u003d sorted(objects, key\u003dlambda s: int(s[5:]))"},{"line_number":364,"context_line":"        # restore kernel if needed"},{"line_number":365,"context_line":"        kernel_id \u003d None"},{"line_number":366,"context_line":"        if snapshot_metadata.get(\"kernel_metadata\") is not None:"},{"line_number":367,"context_line":"            kernel_id \u003d self._restore_image("},{"line_number":368,"context_line":"                bank_section, checkpoint, glance_client, \"kernel\","},{"line_number":369,"context_line":"                snapshot_metadata[\"kernel_metadata\"], sorted_objects,"},{"line_number":370,"context_line":"                original_id)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        # restore ramdisk if needed"},{"line_number":373,"context_line":"        ramdisk_id \u003d None"},{"line_number":374,"context_line":"        if snapshot_metadata.get(\"ramdisk_metadata\") is not None:"},{"line_number":375,"context_line":"            ramdisk_id \u003d self._restore_image("},{"line_number":376,"context_line":"                bank_section, checkpoint, glance_client, \"ramdisk\","},{"line_number":377,"context_line":"                snapshot_metadata[\"ramdisk_metadata\"], sorted_objects,"},{"line_number":378,"context_line":"                original_id)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        # restore image"},{"line_number":381,"context_line":"        image_id \u003d self._restore_image("},{"line_number":382,"context_line":"            bank_section, checkpoint, glance_client, \"snapshot\","},{"line_number":383,"context_line":"            snapshot_metadata, sorted_objects, original_id,"},{"line_number":384,"context_line":"            kernel_id\u003dkernel_id, ramdisk_id\u003dramdisk_id)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        image_info \u003d glance_client.images.get(image_id)"},{"line_number":387,"context_line":"        retry_attempts \u003d 10"},{"line_number":388,"context_line":"        while image_info.status !\u003d \"active\" and retry_attempts !\u003d 0:"},{"line_number":389,"context_line":"            sleep(60)"},{"line_number":390,"context_line":"            image_info \u003d glance_client.images.get(image_id)"},{"line_number":391,"context_line":"            retry_attempts -\u003d 1"},{"line_number":392,"context_line":"        if retry_attempts \u003d\u003d 0:"},{"line_number":393,"context_line":"            raise Exception"},{"line_number":394,"context_line":"        return image_id"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _restore_image(self, bank_section, checkpoint, glance_client,"},{"line_number":397,"context_line":"                       image_format, image_metadata, objects, original_id,"},{"line_number":398,"context_line":"                       **kwargs):"},{"line_number":399,"context_line":"        if image_metadata.get(\"name\") is None:"},{"line_number":400,"context_line":"            name \u003d \"%s_%s@%s\" % (image_format, checkpoint.id,"},{"line_number":401,"context_line":"                                 original_id)"},{"line_number":402,"context_line":"        else:"},{"line_number":403,"context_line":"            name \u003d image_metadata[\"name\"]"},{"line_number":404,"context_line":"        disk_format \u003d image_metadata[\"disk_format\"]"},{"line_number":405,"context_line":"        container_format \u003d image_metadata[\"container_format\"]"},{"line_number":406,"context_line":"        image_data \u003d SwiftBankIO(bank_section, objects)"},{"line_number":407,"context_line":"        image \u003d glance_client.images.create("},{"line_number":408,"context_line":"            disk_format\u003ddisk_format,"},{"line_number":409,"context_line":"            container_format\u003dcontainer_format,"},{"line_number":410,"context_line":"            name\u003dname,"},{"line_number":411,"context_line":"            kernel_id\u003dkwargs.get(\"kernel_id\"),"},{"line_number":412,"context_line":"            ramdisk_id\u003dkwargs.get(\"ramdisk_id\"))"},{"line_number":413,"context_line":"        glance_client.images.upload(image.id, image_data)"},{"line_number":414,"context_line":"        return image.id"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def _heat_restore_server_instance(self, heat_template, image_id,"},{"line_number":417,"context_line":"                                      original_id, restore_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_b0502d60","line":414,"range":{"start_line":355,"start_character":0,"end_line":414,"end_character":23},"in_reply_to":"5a3905b3_451c3cc1","updated":"2017-01-25 11:59:51.000000000","message":"Done","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e81931af15a7f34b60bf9b82fbe4ba2bf0a66dbf","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                heat_floating_resource)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"class SwiftBankIO(object):"},{"line_number":494,"context_line":"        def __init__(self, bank_section, sorted_objects):"},{"line_number":495,"context_line":"            self.bank_section \u003d bank_section"},{"line_number":496,"context_line":"            self.sorted_objects \u003d sorted_objects"},{"line_number":497,"context_line":"            self.obj_size \u003d len(sorted_objects)"},{"line_number":498,"context_line":"            self.length \u003d 0"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        def readable(self):"},{"line_number":501,"context_line":"            return True"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        def __iter__(self):"},{"line_number":504,"context_line":"            return self"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        def read(self, length\u003dNone):"},{"line_number":507,"context_line":"            obj_index \u003d self.length"},{"line_number":508,"context_line":"            self.length +\u003d 1"},{"line_number":509,"context_line":"            if self.length \u003e self.obj_size:"},{"line_number":510,"context_line":"                return \u0027\u0027"},{"line_number":511,"context_line":"            return self.bank_section.get_object("},{"line_number":512,"context_line":"                self.sorted_objects[obj_index])"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"class NovaProtectionPlugin(protection_plugin.ProtectionPlugin):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_8580e4c1","line":512,"range":{"start_line":493,"start_character":0,"end_line":512,"end_character":47},"updated":"2017-01-22 15:43:05.000000000","message":"no need as we do not protect the snapshot","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6031182bd2245e72dff287e1c0062625d9fa889e","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                heat_floating_resource)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"class SwiftBankIO(object):"},{"line_number":494,"context_line":"        def __init__(self, bank_section, sorted_objects):"},{"line_number":495,"context_line":"            self.bank_section \u003d bank_section"},{"line_number":496,"context_line":"            self.sorted_objects \u003d sorted_objects"},{"line_number":497,"context_line":"            self.obj_size \u003d len(sorted_objects)"},{"line_number":498,"context_line":"            self.length \u003d 0"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        def readable(self):"},{"line_number":501,"context_line":"            return True"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        def __iter__(self):"},{"line_number":504,"context_line":"            return self"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        def read(self, length\u003dNone):"},{"line_number":507,"context_line":"            obj_index \u003d self.length"},{"line_number":508,"context_line":"            self.length +\u003d 1"},{"line_number":509,"context_line":"            if self.length \u003e self.obj_size:"},{"line_number":510,"context_line":"                return \u0027\u0027"},{"line_number":511,"context_line":"            return self.bank_section.get_object("},{"line_number":512,"context_line":"                self.sorted_objects[obj_index])"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"class NovaProtectionPlugin(protection_plugin.ProtectionPlugin):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_30cb5d20","line":512,"range":{"start_line":493,"start_character":0,"end_line":512,"end_character":47},"in_reply_to":"5a3905b3_8580e4c1","updated":"2017-01-25 11:59:51.000000000","message":"Done","commit_id":"54a289e74dba8398cb1150bdf561bd003c20ff7f"}]}
