)]}'
{"cinder/backup/drivers/ceph.py":[{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"eb4b64a1e366175155a35bd12fd961adc218f3b8","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.chunk_size \u003d CONF.backup_ceph_chunk_size"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if execute is None:"},{"line_number":109,"context_line":"            self._execute \u003d utils.execute"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            self._execute \u003d execute"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fzkc%3D","line":109,"updated":"2013-07-11 06:21:42.000000000","message":"can shorten to:\n\nself._execute \u003d execute or utils.execute","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0fc999c828b95ab2bae87c3317f2133d6ee15230","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.chunk_size \u003d CONF.backup_ceph_chunk_size"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if execute is None:"},{"line_number":109,"context_line":"            self._execute \u003d utils.execute"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            self._execute \u003d execute"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fyv8%3D","line":109,"in_reply_to":"AAAAP3%2F%2Fzkc%3D","updated":"2013-07-11 17:30:09.000000000","message":"Done","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"eb4b64a1e366175155a35bd12fd961adc218f3b8","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            offset \u003d chunk * self.chunk_size"},{"line_number":225,"context_line":"            before \u003d time.time()"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"            if src_is_rbd:"},{"line_number":228,"context_line":"                data \u003d src.read(offset, self.chunk_size)"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                data \u003d src.read(self.chunk_size)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fzh0%3D","line":227,"updated":"2013-07-11 06:21:42.000000000","message":"rather than having all these branches based on src_is_rbd and dest_is_rbd, you could wrap the rbd images in a file-io-like object before passing them into this method. it would simplify things a bit.","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0fc999c828b95ab2bae87c3317f2133d6ee15230","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            offset \u003d chunk * self.chunk_size"},{"line_number":225,"context_line":"            before \u003d time.time()"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"            if src_is_rbd:"},{"line_number":228,"context_line":"                data \u003d src.read(offset, self.chunk_size)"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                data \u003d src.read(self.chunk_size)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fxac%3D","line":227,"in_reply_to":"AAAAP3%2F%2Fzh0%3D","updated":"2013-07-11 17:30:09.000000000","message":"Done","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"eb4b64a1e366175155a35bd12fd961adc218f3b8","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            snaps \u003d None"},{"line_number":448,"context_line":"            base_rbd.close()"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if snaps is None:"},{"line_number":451,"context_line":"            return False"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        for snap in snaps:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2FzdU%3D","line":450,"updated":"2013-07-11 06:21:42.000000000","message":"this is always true","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0fc999c828b95ab2bae87c3317f2133d6ee15230","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            snaps \u003d None"},{"line_number":448,"context_line":"            base_rbd.close()"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if snaps is None:"},{"line_number":451,"context_line":"            return False"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        for snap in snaps:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fyvs%3D","line":450,"in_reply_to":"AAAAP3%2F%2FzdU%3D","updated":"2013-07-11 17:30:09.000000000","message":"Done","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"eb4b64a1e366175155a35bd12fd961adc218f3b8","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"            # If for whatever reason from_snap does not exist in destination"},{"line_number":480,"context_line":"            # image, we will do diff from base rather than a previous"},{"line_number":481,"context_line":"            # increment."},{"line_number":482,"context_line":"            if not self._snap_exists(backup_name, from_snap, client):"},{"line_number":483,"context_line":"                LOG.info(\"snap\u003d\u0027%(snap)s\u0027 does not exist in base \""},{"line_number":484,"context_line":"                         \"image\u003d\u0027%(base)s\u0027 - setting from_snap to None\" %"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fzck%3D","line":481,"updated":"2013-07-11 06:21:42.000000000","message":"If the from snap doesn\u0027t exist, exporting a diff from the base needs to be imported onto the base, not onto the destination as it exists (i.e. the data in from_snap). in this case we could rollback the destination so it\u0027s at the base point, or do a full backup.","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0fc999c828b95ab2bae87c3317f2133d6ee15230","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"            # If for whatever reason from_snap does not exist in destination"},{"line_number":480,"context_line":"            # image, we will do diff from base rather than a previous"},{"line_number":481,"context_line":"            # increment."},{"line_number":482,"context_line":"            if not self._snap_exists(backup_name, from_snap, client):"},{"line_number":483,"context_line":"                LOG.info(\"snap\u003d\u0027%(snap)s\u0027 does not exist in base \""},{"line_number":484,"context_line":"                         \"image\u003d\u0027%(base)s\u0027 - setting from_snap to None\" %"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2FymY%3D","line":481,"in_reply_to":"AAAAP3%2F%2Fzck%3D","updated":"2013-07-11 17:30:09.000000000","message":"Done","commit_id":"9919e1bd157c76e97ecdc0883cb76a0f3eccd1bc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":42,"context_line":"restore to a new volume (default)."},{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"from cinder import utils"},{"line_number":46,"context_line":"import cinder.volume.drivers as drivers"},{"line_number":47,"context_line":"import eventlet"},{"line_number":48,"context_line":"import os"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjqA%3D","line":45,"updated":"2013-07-17 04:31:47.000000000","message":"fix import order: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#imports","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"restore to a new volume (default)."},{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"from cinder import utils"},{"line_number":46,"context_line":"import cinder.volume.drivers as drivers"},{"line_number":47,"context_line":"import eventlet"},{"line_number":48,"context_line":"import os"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgLA%3D","line":45,"in_reply_to":"AAAAP3%2F%2FjqA%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class CephBackupDriver(BackupDriver):"},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    Backup up Cinder volumes to Ceph Object Store."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    This class enables backing up Cinder volumes to a Ceph object store."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjpQ%3D","line":89,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class CephBackupDriver(BackupDriver):"},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    Backup up Cinder volumes to Ceph Object Store."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    This class enables backing up Cinder volumes to a Ceph object store."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgI4%3D","line":89,"in_reply_to":"AAAAP3%2F%2FjpQ%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self._ceph_backup_conf \u003d str(CONF.backup_ceph_conf)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _ceph_args(self, user, conf\u003dNone, pool\u003dNone):"},{"line_number":123,"context_line":"        \"\"\""},{"line_number":124,"context_line":"        Create default ceph args for executing rbd commands."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        If no --conf is provided, rbd will look in the default locations e.g."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjpI%3D","line":123,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self._ceph_backup_conf \u003d str(CONF.backup_ceph_conf)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _ceph_args(self, user, conf\u003dNone, pool\u003dNone):"},{"line_number":123,"context_line":"        \"\"\""},{"line_number":124,"context_line":"        Create default ceph args for executing rbd commands."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        If no --conf is provided, rbd will look in the default locations e.g."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgI0%3D","line":123,"in_reply_to":"AAAAP3%2F%2FjpI%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        If no --conf is provided, rbd will look in the default locations e.g."},{"line_number":127,"context_line":"        /etc/ceph/ceph.conf"},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        if not user:"},{"line_number":130,"context_line":"            raise exception.BackupInvalidCephArgs(_(\"invalid user \u0027%s\u0027\") %"},{"line_number":131,"context_line":"                                                  (user))"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fjn4%3D","line":129,"updated":"2013-07-17 04:31:47.000000000","message":"This is not necessary. An invalid number of args would be raised since user is not optional.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        If no --conf is provided, rbd will look in the default locations e.g."},{"line_number":127,"context_line":"        /etc/ceph/ceph.conf"},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        if not user:"},{"line_number":130,"context_line":"            raise exception.BackupInvalidCephArgs(_(\"invalid user \u0027%s\u0027\") %"},{"line_number":131,"context_line":"                                                  (user))"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgGQ%3D","line":129,"in_reply_to":"AAAAP3%2F%2Fjn4%3D","updated":"2013-07-17 12:17:30.000000000","message":"I have added a comment to this to explain reasoning i.e.\n\n# Make sure user arg is valid since rbd command may not fail if\n# invalid/no user provided, resulting in unexpected behaviour.\nif not self._validate_string_args(user):\n    raise exception.BackupInvalidCephArgs(_(\"invalid user \u0027%s\u0027\") %\n                                                               (user))","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_backup_base_name(self, volume_id, backup_id\u003dNone,"},{"line_number":185,"context_line":"                              diff_format\u003dFalse):"},{"line_number":186,"context_line":"        \"\"\""},{"line_number":187,"context_line":"        Return name of base image used for backup."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        Incremental backups use a new base name so we support old and new style"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjXo%3D","line":186,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_backup_base_name(self, volume_id, backup_id\u003dNone,"},{"line_number":185,"context_line":"                              diff_format\u003dFalse):"},{"line_number":186,"context_line":"        \"\"\""},{"line_number":187,"context_line":"        Return name of base image used for backup."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        Incremental backups use a new base name so we support old and new style"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIw%3D","line":186,"in_reply_to":"AAAAP3%2F%2FjXo%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                              stripe_count\u003dself.rbd_stripe_count)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def _delete_backup_snapshots(self, rados_client, base_name, backup_id):"},{"line_number":253,"context_line":"        \"\"\""},{"line_number":254,"context_line":"        Delete any snapshots associated with this backup."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        A backup should have at most *one* associated snapshot."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjHQ%3D","line":253,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                              stripe_count\u003dself.rbd_stripe_count)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def _delete_backup_snapshots(self, rados_client, base_name, backup_id):"},{"line_number":253,"context_line":"        \"\"\""},{"line_number":254,"context_line":"        Delete any snapshots associated with this backup."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        A backup should have at most *one* associated snapshot."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIs%3D","line":253,"in_reply_to":"AAAAP3%2F%2FjHQ%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            return 0"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def _try_delete_base_image(self, backup_id, volume_id, base_name\u003dNone):"},{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        Try to delete backup RBD image."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        If the rbd image is a base image for incremental backups, it may have"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjHM%3D","line":284,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            return 0"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def _try_delete_base_image(self, backup_id, volume_id, base_name\u003dNone):"},{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        Try to delete backup RBD image."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        If the rbd image is a base image for incremental backups, it may have"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIo%3D","line":284,"in_reply_to":"AAAAP3%2F%2FjHM%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                                       try_diff_format\u003dtry_diff_format)"},{"line_number":316,"context_line":"            if not rbd_exists:"},{"line_number":317,"context_line":"                raise self.rbd.ImageNotFound(_(\"image %s not found\") %"},{"line_number":318,"context_line":"                                             (base_name))"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"            while retries \u003e 0:"},{"line_number":321,"context_line":"                # First delete associated snapshot (if exists)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FhxQ%3D","line":318,"updated":"2013-07-17 04:31:47.000000000","message":"space this a little more so it\u0027s aligned.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                                       try_diff_format\u003dtry_diff_format)"},{"line_number":316,"context_line":"            if not rbd_exists:"},{"line_number":317,"context_line":"                raise self.rbd.ImageNotFound(_(\"image %s not found\") %"},{"line_number":318,"context_line":"                                             (base_name))"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"            while retries \u003e 0:"},{"line_number":321,"context_line":"                # First delete associated snapshot (if exists)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Ffxo%3D","line":318,"in_reply_to":"AAAAP3%2F%2FhxQ%3D","updated":"2013-07-17 12:17:30.000000000","message":"not sure I see this one","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                        LOG.info((_(\"image busy, retrying %(retries)s \""},{"line_number":338,"context_line":"                                    \"more time(s) in %(delay)ss\") %"},{"line_number":339,"context_line":"                                  {\u0027retries\u0027: retries, \u0027delay\u0027: delay}))"},{"line_number":340,"context_line":"                        time.sleep(delay)"},{"line_number":341,"context_line":"                    else:"},{"line_number":342,"context_line":"                        raise exc"},{"line_number":343,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fg7w%3D","line":340,"updated":"2013-07-17 04:31:47.000000000","message":"Should probably event sleep instead.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                        LOG.info((_(\"image busy, retrying %(retries)s \""},{"line_number":338,"context_line":"                                    \"more time(s) in %(delay)ss\") %"},{"line_number":339,"context_line":"                                  {\u0027retries\u0027: retries, \u0027delay\u0027: delay}))"},{"line_number":340,"context_line":"                        time.sleep(delay)"},{"line_number":341,"context_line":"                    else:"},{"line_number":342,"context_line":"                        raise exc"},{"line_number":343,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIQ%3D","line":340,"in_reply_to":"AAAAP3%2F%2Fg7w%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _rbd_diff_transfer(self, src_name, src_pool, dest_name, dest_pool,"},{"line_number":351,"context_line":"                           src_user, src_conf, dest_user, dest_conf,"},{"line_number":352,"context_line":"                           src_snap\u003dNone, from_snap\u003dNone):"},{"line_number":353,"context_line":"        \"\"\""},{"line_number":354,"context_line":"        Backup only extents changed between two points."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        If no snapshot is provided, the diff extents will be all those changed"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjHI%3D","line":353,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _rbd_diff_transfer(self, src_name, src_pool, dest_name, dest_pool,"},{"line_number":351,"context_line":"                           src_user, src_conf, dest_user, dest_conf,"},{"line_number":352,"context_line":"                           src_snap\u003dNone, from_snap\u003dNone):"},{"line_number":353,"context_line":"        \"\"\""},{"line_number":354,"context_line":"        Backup only extents changed between two points."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        If no snapshot is provided, the diff extents will be all those changed"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIM%3D","line":353,"in_reply_to":"AAAAP3%2F%2FjHI%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def _rbd_image_exists(self, name, volume_id, client,"},{"line_number":394,"context_line":"                          try_diff_format\u003dFalse):"},{"line_number":395,"context_line":"        \"\"\"Return tuple (exists, name)\"\"\""},{"line_number":396,"context_line":"        rbds \u003d self.rbd.RBD().list(client.ioctx)"},{"line_number":397,"context_line":"        if name not in rbds:"},{"line_number":398,"context_line":"            msg \u003d _(\"image \u0027%s\u0027 not found - trying diff format name\") % (name)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fhk4%3D","line":395,"updated":"2013-07-17 04:31:47.000000000","message":"period at the end.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def _rbd_image_exists(self, name, volume_id, client,"},{"line_number":394,"context_line":"                          try_diff_format\u003dFalse):"},{"line_number":395,"context_line":"        \"\"\"Return tuple (exists, name)\"\"\""},{"line_number":396,"context_line":"        rbds \u003d self.rbd.RBD().list(client.ioctx)"},{"line_number":397,"context_line":"        if name not in rbds:"},{"line_number":398,"context_line":"            msg \u003d _(\"image \u0027%s\u0027 not found - trying diff format name\") % (name)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgII%3D","line":395,"in_reply_to":"AAAAP3%2F%2Fhk4%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        return True, name"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def _snap_exists(self, base_name, snap_name, client):"},{"line_number":412,"context_line":"        \"\"\"Return True if snapshot exists in base image\"\"\""},{"line_number":413,"context_line":"        base_rbd \u003d self.rbd.Image(client.ioctx, base_name)"},{"line_number":414,"context_line":"        try:"},{"line_number":415,"context_line":"            snaps \u003d base_rbd.list_snaps()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fhkw%3D","line":412,"updated":"2013-07-17 04:31:47.000000000","message":"period at the end.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        return True, name"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def _snap_exists(self, base_name, snap_name, client):"},{"line_number":412,"context_line":"        \"\"\"Return True if snapshot exists in base image\"\"\""},{"line_number":413,"context_line":"        base_rbd \u003d self.rbd.Image(client.ioctx, base_name)"},{"line_number":414,"context_line":"        try:"},{"line_number":415,"context_line":"            snaps \u003d base_rbd.list_snaps()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIE%3D","line":412,"in_reply_to":"AAAAP3%2F%2Fhkw%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        return hasattr(volume_file, \u0027rbd_image\u0027)"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def _full_backup(self, backup_id, volume_id, src_volume, src_name, length):"},{"line_number":523,"context_line":"        \"\"\""},{"line_number":524,"context_line":"        Perform a full backup of src volume."},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        First creates a base backup image in our backup location then performs"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjG8%3D","line":523,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        return hasattr(volume_file, \u0027rbd_image\u0027)"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def _full_backup(self, backup_id, volume_id, src_volume, src_name, length):"},{"line_number":523,"context_line":"        \"\"\""},{"line_number":524,"context_line":"        Perform a full backup of src volume."},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        First creates a base backup image in our backup location then performs"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgIA%3D","line":523,"in_reply_to":"AAAAP3%2F%2FjG8%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    @staticmethod"},{"line_number":558,"context_line":"    def backup_snapshot_name_pattern():"},{"line_number":559,"context_line":"        \"\"\""},{"line_number":560,"context_line":"        Returns the pattern used to match backup snapshots."},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"        It is essential that snapshots created for purposes other than backups"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjG0%3D","line":559,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    @staticmethod"},{"line_number":558,"context_line":"    def backup_snapshot_name_pattern():"},{"line_number":559,"context_line":"        \"\"\""},{"line_number":560,"context_line":"        Returns the pattern used to match backup snapshots."},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"        It is essential that snapshots created for purposes other than backups"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgH4%3D","line":559,"in_reply_to":"AAAAP3%2F%2FjG0%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    @classmethod"},{"line_number":568,"context_line":"    def get_backup_snaps(cls, rbd_image, sort\u003dFalse):"},{"line_number":569,"context_line":"        \"\"\""},{"line_number":570,"context_line":"        Get all backup snapshots for the given rbd image"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        NOTE: this call is made public since these snapshots must be deleted"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGw%3D","line":569,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    @classmethod"},{"line_number":568,"context_line":"    def get_backup_snaps(cls, rbd_image, sort\u003dFalse):"},{"line_number":569,"context_line":"        \"\"\""},{"line_number":570,"context_line":"        Get all backup snapshots for the given rbd image"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        NOTE: this call is made public since these snapshots must be deleted"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgH0%3D","line":569,"in_reply_to":"AAAAP3%2F%2FjGw%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        return str(\"backup.%s.snap.%s\" % (backup_id, time.time()))"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"    def _get_backup_snap_name(self, rbd_image, name, backup_id):"},{"line_number":596,"context_line":"        \"\"\""},{"line_number":597,"context_line":"        Return the name of the snapshot associated with backup_id."},{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        The rbd image provided must be the base image used for an incremental"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGo%3D","line":596,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        return str(\"backup.%s.snap.%s\" % (backup_id, time.time()))"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"    def _get_backup_snap_name(self, rbd_image, name, backup_id):"},{"line_number":596,"context_line":"        \"\"\""},{"line_number":597,"context_line":"        Return the name of the snapshot associated with backup_id."},{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        The rbd image provided must be the base image used for an incremental"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHw%3D","line":596,"in_reply_to":"AAAAP3%2F%2FjGo%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        return snaps[0]"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def _get_most_recent_snap(self, rbd_image):"},{"line_number":630,"context_line":"        \"\"\""},{"line_number":631,"context_line":"        Get the most recent backup snapshot of the provided image."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        Returns name of most recent backup snapshot or None if there are no"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGk%3D","line":630,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        return snaps[0]"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def _get_most_recent_snap(self, rbd_image):"},{"line_number":630,"context_line":"        \"\"\""},{"line_number":631,"context_line":"        Get the most recent backup snapshot of the provided image."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        Returns name of most recent backup snapshot or None if there are no"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHs%3D","line":630,"in_reply_to":"AAAAP3%2F%2FjGk%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        return int(volume[\u0027size\u0027]) * units.GiB"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"    def backup(self, backup, volume_file):"},{"line_number":654,"context_line":"        \"\"\""},{"line_number":655,"context_line":"        Backup the given volume to Ceph object store."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        If the source volume is an RBD we will attempt to do an"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGc%3D","line":654,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        return int(volume[\u0027size\u0027]) * units.GiB"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"    def backup(self, backup, volume_file):"},{"line_number":654,"context_line":"        \"\"\""},{"line_number":655,"context_line":"        Backup the given volume to Ceph object store."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        If the source volume is an RBD we will attempt to do an"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHo%3D","line":654,"in_reply_to":"AAAAP3%2F%2FjGc%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":692,"context_line":""},{"line_number":693,"context_line":"    def _full_restore(self, backup_id, volume_id, dest_file, dest_name,"},{"line_number":694,"context_line":"                      length, src_snap\u003dNone):"},{"line_number":695,"context_line":"        \"\"\""},{"line_number":696,"context_line":"        Restore the given volume file from backup RBD."},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"        This will result in all extents being copied from source to destination"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGY%3D","line":695,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":692,"context_line":""},{"line_number":693,"context_line":"    def _full_restore(self, backup_id, volume_id, dest_file, dest_name,"},{"line_number":694,"context_line":"                      length, src_snap\u003dNone):"},{"line_number":695,"context_line":"        \"\"\""},{"line_number":696,"context_line":"        Restore the given volume file from backup RBD."},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"        This will result in all extents being copied from source to destination"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHk%3D","line":695,"in_reply_to":"AAAAP3%2F%2FjGY%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":748,"context_line":"                  (time.time() - before))"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def _num_backup_snaps(self, backup_base_name):"},{"line_number":751,"context_line":"        \"\"\"Return the number of snapshots that exist on the base image\"\"\""},{"line_number":752,"context_line":"        with drivers.rbd.RADOSClient(self, self._ceph_backup_pool) as client:"},{"line_number":753,"context_line":"            base_rbd \u003d self.rbd.Image(client.ioctx, backup_base_name)"},{"line_number":754,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjGA%3D","line":751,"updated":"2013-07-17 04:31:47.000000000","message":"period at the end.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":748,"context_line":"                  (time.time() - before))"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def _num_backup_snaps(self, backup_base_name):"},{"line_number":751,"context_line":"        \"\"\"Return the number of snapshots that exist on the base image\"\"\""},{"line_number":752,"context_line":"        with drivers.rbd.RADOSClient(self, self._ceph_backup_pool) as client:"},{"line_number":753,"context_line":"            base_rbd \u003d self.rbd.Image(client.ioctx, backup_base_name)"},{"line_number":754,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHg%3D","line":751,"in_reply_to":"AAAAP3%2F%2FjGA%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":762,"context_line":"            return 0"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def _get_restore_point(self, volume_id, backup_id):"},{"line_number":765,"context_line":"        \"\"\""},{"line_number":766,"context_line":"        Get the restore point snapshot name created if/when an incremental"},{"line_number":767,"context_line":"        backup was performed"},{"line_number":768,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjF4%3D","line":765,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":762,"context_line":"            return 0"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def _get_restore_point(self, volume_id, backup_id):"},{"line_number":765,"context_line":"        \"\"\""},{"line_number":766,"context_line":"        Get the restore point snapshot name created if/when an incremental"},{"line_number":767,"context_line":"        backup was performed"},{"line_number":768,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHc%3D","line":765,"in_reply_to":"AAAAP3%2F%2FjF4%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        return restore_point"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def _rbd_has_extents(self, rbd_volume):"},{"line_number":783,"context_line":"        \"\"\""},{"line_number":784,"context_line":"        Check whether the given rbd volume has extents."},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"        Return True if has extents, otherwise False."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjF0%3D","line":783,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        return restore_point"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def _rbd_has_extents(self, rbd_volume):"},{"line_number":783,"context_line":"        \"\"\""},{"line_number":784,"context_line":"        Check whether the given rbd volume has extents."},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"        Return True if has extents, otherwise False."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHY%3D","line":783,"in_reply_to":"AAAAP3%2F%2FjF0%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        return False"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    def _diff_restore_allowed(self, backup, volume, volume_file):"},{"line_number":803,"context_line":"        \"\"\""},{"line_number":804,"context_line":"        Determine whether a differential restore is possible/allowed."},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        In order for a differential restore to be performed we need:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjFs%3D","line":803,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        return False"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    def _diff_restore_allowed(self, backup, volume, volume_file):"},{"line_number":803,"context_line":"        \"\"\""},{"line_number":804,"context_line":"        Determine whether a differential restore is possible/allowed."},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        In order for a differential restore to be performed we need:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHU%3D","line":803,"in_reply_to":"AAAAP3%2F%2FjFs%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        return not_allowed"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def _try_restore(self, backup, volume, volume_file):"},{"line_number":842,"context_line":"        \"\"\"Attempt to restore volume from backup\"\"\""},{"line_number":843,"context_line":"        volume_name \u003d volume[\u0027name\u0027]"},{"line_number":844,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":845,"context_line":"        backup_volume_id \u003d backup[\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FjFo%3D","line":842,"updated":"2013-07-17 04:31:47.000000000","message":"period at the end.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        return not_allowed"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def _try_restore(self, backup, volume, volume_file):"},{"line_number":842,"context_line":"        \"\"\"Attempt to restore volume from backup\"\"\""},{"line_number":843,"context_line":"        volume_name \u003d volume[\u0027name\u0027]"},{"line_number":844,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":845,"context_line":"        backup_volume_id \u003d backup[\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgHQ%3D","line":842,"in_reply_to":"AAAAP3%2F%2FjFo%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"}],"cinder/backup/services/ceph.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32afa340d14c6029a062e1c9e7c2c79a3153c78f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._ceph_backup_pool \u003d str(CONF.backup_ceph_pool)"},{"line_number":78,"context_line":"        self._ceph_backup_conf \u003d str(CONF.backup_ceph_conf)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _try_execute(self, *command, **kwargs):"},{"line_number":81,"context_line":"        return utils.execute(*command, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _ceph_args(self, user, conf):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYSM%3D","line":80,"updated":"2013-07-02 23:57:57.000000000","message":"Why are you calling this a _try_execute, it\u0027s just an _execute, there\u0027s not retry mechanism here.\n\nAlso, while the wrapper around utils.execute is nice to have, perhaps you should provide the ability to pass in a different executor or a fake on __init__","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._ceph_backup_pool \u003d str(CONF.backup_ceph_pool)"},{"line_number":78,"context_line":"        self._ceph_backup_conf \u003d str(CONF.backup_ceph_conf)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _try_execute(self, *command, **kwargs):"},{"line_number":81,"context_line":"        return utils.execute(*command, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _ceph_args(self, user, conf):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXa0%3D","line":80,"in_reply_to":"AAAAPn%2F%2FYSM%3D","updated":"2013-07-03 09:32:52.000000000","message":"Agreed, will tidy this one up.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32afa340d14c6029a062e1c9e7c2c79a3153c78f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self._ceph_backup_conf \u003d str(CONF.backup_ceph_conf)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _try_execute(self, *command, **kwargs):"},{"line_number":81,"context_line":"        return utils.execute(*command, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _ceph_args(self, user, conf):"},{"line_number":84,"context_line":"        return [\u0027--id\u0027, user, \u0027--conf\u0027, conf]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYSE%3D","line":81,"updated":"2013-07-02 23:57:57.000000000","message":"At some point we need to cull these over to use openstack/common/processutils I think.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32afa340d14c6029a062e1c9e7c2c79a3153c78f","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _get_rbd_support(self):"},{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        Determine what RBD features are supported by the version of librbd we"},{"line_number":101,"context_line":"        currently have installed."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        old_format \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYRs%3D","line":100,"updated":"2013-07-02 23:57:57.000000000","message":"We\u0027re pretty picky on docstrings, although they all seem wrong in this file.\n\nCheck Hacking file for info there.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _get_rbd_support(self):"},{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        Determine what RBD features are supported by the version of librbd we"},{"line_number":101,"context_line":"        currently have installed."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        old_format \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXWE%3D","line":100,"in_reply_to":"AAAAPn%2F%2FYRs%3D","updated":"2013-07-03 09:32:52.000000000","message":"Ack. I\u0027ll sort this out.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32afa340d14c6029a062e1c9e7c2c79a3153c78f","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _transfer_data(self, src, dest, dest_name, length, src_is_rbd\u003dFalse,"},{"line_number":140,"context_line":"                       dest_is_rbd\u003dFalse):"},{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        Transfer data between files and/or rbds. Assume source and destination"},{"line_number":143,"context_line":"        use standard Python IO interface unless stated to be RBD images in"},{"line_number":144,"context_line":"        which case librbd interface is used."},{"line_number":145,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYRk%3D","line":142,"updated":"2013-07-02 23:57:57.000000000","message":"docstring","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _transfer_data(self, src, dest, dest_name, length, src_is_rbd\u003dFalse,"},{"line_number":140,"context_line":"                       dest_is_rbd\u003dFalse):"},{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        Transfer data between files and/or rbds. Assume source and destination"},{"line_number":143,"context_line":"        use standard Python IO interface unless stated to be RBD images in"},{"line_number":144,"context_line":"        which case librbd interface is used."},{"line_number":145,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXV8%3D","line":142,"in_reply_to":"AAAAPn%2F%2FYRk%3D","updated":"2013-07-03 09:32:52.000000000","message":"Got it.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32afa340d14c6029a062e1c9e7c2c79a3153c78f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        dest_adv \u003d \u0027\u0027"},{"line_number":151,"context_line":"        if not dest_is_rbd:"},{"line_number":152,"context_line":"            dest_adv \u003d \u0027NOT \u0027"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        LOG.debug(\"source is %san rbd, dest is %san rbd\" % (src_adv, dest_adv))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        chunks \u003d int(length / self.chunk_size)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYQs%3D","line":153,"updated":"2013-07-02 23:57:57.000000000","message":"Seems like a funky way to form a debug message, can we do something a little less cryptic maybe?","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        dest_adv \u003d \u0027\u0027"},{"line_number":151,"context_line":"        if not dest_is_rbd:"},{"line_number":152,"context_line":"            dest_adv \u003d \u0027NOT \u0027"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        LOG.debug(\"source is %san rbd, dest is %san rbd\" % (src_adv, dest_adv))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        chunks \u003d int(length / self.chunk_size)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXWM%3D","line":153,"in_reply_to":"AAAAPn%2F%2FYQs%3D","updated":"2013-07-03 09:32:52.000000000","message":"Fixed (hopefully)","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"51f6005b9a306ccac89b904d01aeb6e4ff9cb442","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        src_ceph_args \u003d self._ceph_args(src_user, src_conf)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Destination settings mimic source if not provided"},{"line_number":241,"context_line":"        if dest_user is None:"},{"line_number":242,"context_line":"            dest_user \u003d src_user"},{"line_number":243,"context_line":"        elif dest_conf is None:"},{"line_number":244,"context_line":"            dest_conf \u003d src_conf"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXoI%3D","line":241,"updated":"2013-07-03 06:27:11.000000000","message":"what\u0027s the rationale for this? it doesn\u0027t seem useful for the current callers","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        src_ceph_args \u003d self._ceph_args(src_user, src_conf)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Destination settings mimic source if not provided"},{"line_number":241,"context_line":"        if dest_user is None:"},{"line_number":242,"context_line":"            dest_user \u003d src_user"},{"line_number":243,"context_line":"        elif dest_conf is None:"},{"line_number":244,"context_line":"            dest_conf \u003d src_conf"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXW4%3D","line":241,"in_reply_to":"AAAAPn%2F%2FXoI%3D","updated":"2013-07-03 09:32:52.000000000","message":"My intent here was to cover all cases but as it is not actually used I will remove.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"51f6005b9a306ccac89b904d01aeb6e4ff9cb442","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        try:"},{"line_number":249,"context_line":"            cmd \u003d [\u0027rbd\u0027, \u0027export-diff\u0027] + src_ceph_args"},{"line_number":250,"context_line":"            cmd +\u003d [str(\"%s/%s\" % (src_pool, src_name)), \u0027-\u0027]"},{"line_number":251,"context_line":"            out, err \u003d self._try_execute(*cmd)"},{"line_number":252,"context_line":"        except (exception.ProcessExecutionError, exception.Error) as exc:"},{"line_number":253,"context_line":"            LOG.info(\"rbd export-diff failed - %s\" % (str(exc)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXqI%3D","line":250,"updated":"2013-07-03 06:27:11.000000000","message":"Without --from-snap and --snap, this is getting all data that was ever written to the image - it\u0027s better than usual, since it avoids unwritten areas, but it\u0027s not incremental after the first backup","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        try:"},{"line_number":249,"context_line":"            cmd \u003d [\u0027rbd\u0027, \u0027export-diff\u0027] + src_ceph_args"},{"line_number":250,"context_line":"            cmd +\u003d [str(\"%s/%s\" % (src_pool, src_name)), \u0027-\u0027]"},{"line_number":251,"context_line":"            out, err \u003d self._try_execute(*cmd)"},{"line_number":252,"context_line":"        except (exception.ProcessExecutionError, exception.Error) as exc:"},{"line_number":253,"context_line":"            LOG.info(\"rbd export-diff failed - %s\" % (str(exc)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXXQ%3D","line":250,"in_reply_to":"AAAAPn%2F%2FXqI%3D","updated":"2013-07-03 09:32:52.000000000","message":"Agreed. I put this as a first pass. I will add backup snapshots to speed things up.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"51f6005b9a306ccac89b904d01aeb6e4ff9cb442","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        before \u003d time.time()"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            self._diff_transfer(backup_name, self._ceph_backup_pool,"},{"line_number":294,"context_line":"                                volume_name, rbd_pool,"},{"line_number":295,"context_line":"                                src_user\u003dself._ceph_backup_user,"},{"line_number":296,"context_line":"                                src_conf\u003dself._ceph_backup_conf,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXpc%3D","line":293,"updated":"2013-07-03 06:27:11.000000000","message":"Restoring an incremental won\u0027t work (if it\u0027s an actual incremental) unless the destination is in the same state as the beginning of the incremental (i.e. rolled back to the snapshot that the incremental begin with). Rolling back like this is expensive (it\u0027s like writing the whole image), so leaving restores as full copies seems best to me","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0c529f2aeb49b92364317e10bd99dfc7a5c50416","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        before \u003d time.time()"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            self._diff_transfer(backup_name, self._ceph_backup_pool,"},{"line_number":294,"context_line":"                                volume_name, rbd_pool,"},{"line_number":295,"context_line":"                                src_user\u003dself._ceph_backup_user,"},{"line_number":296,"context_line":"                                src_conf\u003dself._ceph_backup_conf,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FXX0%3D","line":293,"in_reply_to":"AAAAPn%2F%2FXpc%3D","updated":"2013-07-03 09:32:52.000000000","message":"yeah was not sure of this one. There are two restore scenarios (a) restore to a new (blank) volume, in which case this would work, or (b) restore the original volume which could be in any state. When I tested this it did seem to work but it may have been coincidence. I think for the moment I will, as you suggest, do a full copy if the target is the original volume and them we can think of a better way to do it.","commit_id":"9beff59fa6f0e7cca3bd58b4787c610ccfb707e9"}],"cinder/exception.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":565,"context_line":""},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"class BackupInvalidCephArgs(Invalid):"},{"line_number":568,"context_line":"    message \u003d _(\"Invalid Ceph args provided for backup rbd operation\")"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"class BackupOperationError(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4co%3D","line":568,"updated":"2013-07-19 21:11:25.000000000","message":"missing .","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":565,"context_line":""},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"class BackupInvalidCephArgs(Invalid):"},{"line_number":568,"context_line":"    message \u003d _(\"Invalid Ceph args provided for backup rbd operation\")"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"class BackupOperationError(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2NI%3D","line":568,"in_reply_to":"AAAAQn%2F%2F4co%3D","updated":"2013-07-22 07:40:07.000000000","message":"Maybe I\u0027m not aware of it, but it looks like there isn\u0027t an agreement about \u0027.\u0027 at the end.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":569,"context_line":""},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"class BackupOperationError(Invalid):"},{"line_number":572,"context_line":"    message \u003d _(\"An error has occurred during backup operation\")"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class BackupRBDOperationFailed(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4ck%3D","line":572,"updated":"2013-07-19 21:11:25.000000000","message":"missing .","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":569,"context_line":""},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"class BackupOperationError(Invalid):"},{"line_number":572,"context_line":"    message \u003d _(\"An error has occurred during backup operation\")"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class BackupRBDOperationFailed(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2NE%3D","line":572,"in_reply_to":"AAAAQn%2F%2F4ck%3D","updated":"2013-07-22 07:40:07.000000000","message":"Maybe I\u0027m not aware of it, but it looks like there isn\u0027t an agreement about \u0027.\u0027 at the end.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class BackupRBDOperationFailed(Invalid):"},{"line_number":576,"context_line":"    message \u003d _(\"Backup RBD operation failed\")"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"class BackupVolumeInvalidType(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4cg%3D","line":576,"updated":"2013-07-19 21:11:25.000000000","message":"missing .","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class BackupRBDOperationFailed(Invalid):"},{"line_number":576,"context_line":"    message \u003d _(\"Backup RBD operation failed\")"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"class BackupVolumeInvalidType(Invalid):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2M8%3D","line":576,"in_reply_to":"AAAAQn%2F%2F4cg%3D","updated":"2013-07-22 07:40:07.000000000","message":"Maybe I\u0027m not aware of it, but it looks like there isn\u0027t an agreement about \u0027.\u0027 at the end.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"}],"cinder/tests/test_backup_ceph.py":[{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from cinder.tests.backup.fake_rados import mock_rados"},{"line_number":24,"context_line":"from cinder.tests.backup.fake_rados import mock_rbd"},{"line_number":25,"context_line":"from cinder.volume.drivers import rbd as rbddriver"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from cinder.backup.drivers import ceph"},{"line_number":28,"context_line":"from cinder import context"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fg5I%3D","line":25,"updated":"2013-07-17 04:31:47.000000000","message":"remove new line to merge cinder import group while we\u0027re at it.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from cinder.tests.backup.fake_rados import mock_rados"},{"line_number":24,"context_line":"from cinder.tests.backup.fake_rados import mock_rbd"},{"line_number":25,"context_line":"from cinder.volume.drivers import rbd as rbddriver"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from cinder.backup.drivers import ceph"},{"line_number":28,"context_line":"from cinder import context"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgL4%3D","line":25,"in_reply_to":"AAAAP3%2F%2Fg5I%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    def test_backup_volume_from_rbd(self):"},{"line_number":312,"context_line":"        self._create_volume_db_entry(self.volume_id, 1)"},{"line_number":313,"context_line":"        backup \u003d db.backup_get(self.ctxt, self.backup_id)"},{"line_number":314,"context_line":"        volume \u003d db.volume_get(self.ctxt, self.volume_id)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        self._set_common_backup_stubs(self.service)"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fg4s%3D","line":314,"updated":"2013-07-17 04:31:47.000000000","message":"volume never gets used.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    def test_backup_volume_from_rbd(self):"},{"line_number":312,"context_line":"        self._create_volume_db_entry(self.volume_id, 1)"},{"line_number":313,"context_line":"        backup \u003d db.backup_get(self.ctxt, self.backup_id)"},{"line_number":314,"context_line":"        volume \u003d db.volume_get(self.ctxt, self.volume_id)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        self._set_common_backup_stubs(self.service)"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgLc%3D","line":314,"in_reply_to":"AAAAP3%2F%2Fg4s%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        self.assertEquals(rem, 0)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _test_try_delete_base_image(self):"},{"line_number":411,"context_line":"        base_name \u003d self.service._get_backup_base_name(self.volume_id,"},{"line_number":412,"context_line":"                                                       diff_format\u003dTrue)"},{"line_number":413,"context_line":"        self.service._try_delete_base_image(self.backup_id, self.volume_id)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fg4o%3D","line":411,"updated":"2013-07-17 04:31:47.000000000","message":"base_name never gets used.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        self.assertEquals(rem, 0)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _test_try_delete_base_image(self):"},{"line_number":411,"context_line":"        base_name \u003d self.service._get_backup_base_name(self.volume_id,"},{"line_number":412,"context_line":"                                                       diff_format\u003dTrue)"},{"line_number":413,"context_line":"        self.service._try_delete_base_image(self.backup_id, self.volume_id)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgLQ%3D","line":411,"in_reply_to":"AAAAP3%2F%2Fg4o%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"}],"cinder/volume/drivers/rbd.py":[{"author":{"_account_id":6743,"name":"Seif Lotfy","email":"s.lotfy@telekom.de","username":"seif"},"change_message_id":"303a60a9a99802bf8dad9752c04c73b236d31438","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.conf \u003d str(conf)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class RBDImageIOWrapper(io.RawIOBase):"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":"    Wrapper to provide standard Python IO interface to RBD images so that they"},{"line_number":99,"context_line":"    can be treated as files."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FRKA%3D","line":96,"updated":"2013-07-05 16:11:40.000000000","message":"Why inherit from io.RawIOBase, it works flawlessy without inheritance and would not require you to keep closing in the next parts of this code.","commit_id":"97b982ff88c4ad0336777bdf5c6405227bbf9571"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"2b1e6d38c49eb0493c211fe843f72e88810267af","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.conf \u003d str(conf)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class RBDImageIOWrapper(io.RawIOBase):"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":"    Wrapper to provide standard Python IO interface to RBD images so that they"},{"line_number":99,"context_line":"    can be treated as files."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FRHk%3D","line":96,"in_reply_to":"AAAAPn%2F%2FRKA%3D","updated":"2013-07-05 16:26:12.000000000","message":"The principle motivation is so that it can be recognised as an IO object i.e. so that code using the object knows that it will behave in a known way. Take a look at the Python docs for IOBase for more info on this. One example of this behaviour is that  unsupported methods will raise the known IOError without having to re-impliment it. This is actually how Python recommends this sort of thing be done.","commit_id":"97b982ff88c4ad0336777bdf5c6405227bbf9571"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cinder.image import image_utils"},{"line_number":31,"context_line":"from cinder import units"},{"line_number":32,"context_line":"from cinder import utils"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"import cinder.backup.drivers.ceph as ceph_backup"},{"line_number":35,"context_line":"from cinder.openstack.common import fileutils"},{"line_number":36,"context_line":"from cinder.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fh3Q%3D","line":33,"updated":"2013-07-17 04:31:47.000000000","message":"remove the newline here while we\u0027re at it.","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cinder.image import image_utils"},{"line_number":31,"context_line":"from cinder import units"},{"line_number":32,"context_line":"from cinder import utils"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"import cinder.backup.drivers.ceph as ceph_backup"},{"line_number":35,"context_line":"from cinder.openstack.common import fileutils"},{"line_number":36,"context_line":"from cinder.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgMc%3D","line":33,"in_reply_to":"AAAAP3%2F%2Fh3Q%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"9552425bc750d7dcf5b0728794edb1c79d842830","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        client.shutdown()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _get_backup_snaps(self, rbd_image):"},{"line_number":303,"context_line":"        \"\"\""},{"line_number":304,"context_line":"        Get list of any backup snapshots that exist on this volume"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        There should only ever be one but accept all since they need to be"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fh28%3D","line":303,"updated":"2013-07-17 04:31:47.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"edeb6bdde1a1a4d3a9d3b9a1a4fdd22db4e9b9f9","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        client.shutdown()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _get_backup_snaps(self, rbd_image):"},{"line_number":303,"context_line":"        \"\"\""},{"line_number":304,"context_line":"        Get list of any backup snapshots that exist on this volume"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        There should only ever be one but accept all since they need to be"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FgMU%3D","line":303,"in_reply_to":"AAAAP3%2F%2Fh28%3D","updated":"2013-07-17 12:17:30.000000000","message":"Done","commit_id":"a12ed1d1b18c52ae4187b552c7d11da3fbe29cd4"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    This is useful where a parameter may be None by default, or a"},{"line_number":79,"context_line":"    string. librbd only accepts ascii, hence the need for conversion."},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    if string is None:"},{"line_number":82,"context_line":"        return string"},{"line_number":83,"context_line":"    return str(string)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4b0%3D","line":80,"updated":"2013-07-19 21:11:25.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"24c848a148c347c9b55b0e0b226eaf986990871e","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    This is useful where a parameter may be None by default, or a"},{"line_number":79,"context_line":"    string. librbd only accepts ascii, hence the need for conversion."},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    if string is None:"},{"line_number":82,"context_line":"        return string"},{"line_number":83,"context_line":"    return str(string)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F0fY%3D","line":80,"in_reply_to":"AAAAQn%2F%2F2OA%3D","updated":"2013-07-22 18:20:56.000000000","message":"Ante, true it\u0027s not part of this commit per-say but no reason not to fix things up as we go here IMO (at least little formatting things like this).\n\nthat being said if you have some sort of disagreement with this it\u0027s fine with me if somebody commits a separate patch","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    This is useful where a parameter may be None by default, or a"},{"line_number":79,"context_line":"    string. librbd only accepts ascii, hence the need for conversion."},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    if string is None:"},{"line_number":82,"context_line":"        return string"},{"line_number":83,"context_line":"    return str(string)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2OA%3D","line":80,"in_reply_to":"AAAAQn%2F%2F4b0%3D","updated":"2013-07-22 07:40:07.000000000","message":"Since this is not part of the commit, and is not related to the blueprint, I would think it would belong to a separate commit.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class RBDImageMetadata(object):"},{"line_number":87,"context_line":"    \"\"\"RBD image metadata to be used with RBDImageIOWrapper\"\"\""},{"line_number":88,"context_line":"    def __init__(self, image, pool, user, conf):"},{"line_number":89,"context_line":"        self.image \u003d image"},{"line_number":90,"context_line":"        self.pool \u003d str(pool)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4cA%3D","line":87,"updated":"2013-07-19 21:11:25.000000000","message":"missing .","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"24c848a148c347c9b55b0e0b226eaf986990871e","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class RBDImageMetadata(object):"},{"line_number":87,"context_line":"    \"\"\"RBD image metadata to be used with RBDImageIOWrapper\"\"\""},{"line_number":88,"context_line":"    def __init__(self, image, pool, user, conf):"},{"line_number":89,"context_line":"        self.image \u003d image"},{"line_number":90,"context_line":"        self.pool \u003d str(pool)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F0fs%3D","line":87,"in_reply_to":"AAAAQn%2F%2F2NU%3D","updated":"2013-07-22 18:20:56.000000000","message":"there is an agreement on this.... \"\"\"Single line blah blah.\"\"\"\n\nYou need the period at the end, and you might as well fix the others while you\u0027re here IMO","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class RBDImageMetadata(object):"},{"line_number":87,"context_line":"    \"\"\"RBD image metadata to be used with RBDImageIOWrapper\"\"\""},{"line_number":88,"context_line":"    def __init__(self, image, pool, user, conf):"},{"line_number":89,"context_line":"        self.image \u003d image"},{"line_number":90,"context_line":"        self.pool \u003d str(pool)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2NU%3D","line":87,"in_reply_to":"AAAAQn%2F%2F4cA%3D","updated":"2013-07-22 07:40:07.000000000","message":"Maybe I\u0027m not aware of it, but it looks like there isn\u0027t an agreement about \u0027.\u0027 at the end.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    \"\"\""},{"line_number":97,"context_line":"    Wrapper to provide standard Python IO interface to RBD images so that they"},{"line_number":98,"context_line":"    can be treated as files."},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, rbd_meta):"},{"line_number":102,"context_line":"        super(RBDImageIOWrapper, self).__init__()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4bw%3D","line":99,"updated":"2013-07-19 21:11:25.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    \"\"\""},{"line_number":97,"context_line":"    Wrapper to provide standard Python IO interface to RBD images so that they"},{"line_number":98,"context_line":"    can be treated as files."},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, rbd_meta):"},{"line_number":102,"context_line":"        super(RBDImageIOWrapper, self).__init__()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2N8%3D","line":99,"in_reply_to":"AAAAQn%2F%2F4bw%3D","updated":"2013-07-22 07:40:07.000000000","message":"Since this is not part of the commit, and is not related to the blueprint, I would think it would belong to a separate commit.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        Since rbd image does not have a fileno we raise an IOError (recommended"},{"line_number":180,"context_line":"        for IOBase class implementations - see"},{"line_number":181,"context_line":"        http://docs.python.org/2/library/io.html#io.IOBase)"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        raise IOError(\"fileno() not supported by RBD()\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    # NOTE(dosaboy): if IO object is not closed explicitly, Python auto closes"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4bs%3D","line":182,"updated":"2013-07-19 21:11:25.000000000","message":"Fix multi-line doc string: https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#docstrings","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        Since rbd image does not have a fileno we raise an IOError (recommended"},{"line_number":180,"context_line":"        for IOBase class implementations - see"},{"line_number":181,"context_line":"        http://docs.python.org/2/library/io.html#io.IOBase)"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        raise IOError(\"fileno() not supported by RBD()\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    # NOTE(dosaboy): if IO object is not closed explicitly, Python auto closes"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2N4%3D","line":182,"in_reply_to":"AAAAQn%2F%2F4bs%3D","updated":"2013-07-22 07:40:07.000000000","message":"Since this is not part of the commit, and is not related to the blueprint, I would think it would belong to a separate commit.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0fe4fc0584c2ff8d1ee7850067752707d02dfb59","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                raise exception.VolumeIsBusy(volume_name\u003dvolume[\u0027name\u0027])"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":435,"context_line":"        \"\"\"Creates an rbd snapshot\"\"\""},{"line_number":436,"context_line":"        with RBDVolumeProxy(self, snapshot[\u0027volume_name\u0027]) as volume:"},{"line_number":437,"context_line":"            snap \u003d str(snapshot[\u0027name\u0027])"},{"line_number":438,"context_line":"            volume.create_snap(snap)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F4bo%3D","line":435,"updated":"2013-07-19 21:11:25.000000000","message":"missing .","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"},{"author":{"_account_id":2583,"name":"Ante Karamatić","email":"ante.karamatic@canonical.com","username":"ivoks"},"change_message_id":"e83fa0f03520ba33d310d66fda79bc167994748f","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                raise exception.VolumeIsBusy(volume_name\u003dvolume[\u0027name\u0027])"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":435,"context_line":"        \"\"\"Creates an rbd snapshot\"\"\""},{"line_number":436,"context_line":"        with RBDVolumeProxy(self, snapshot[\u0027volume_name\u0027]) as volume:"},{"line_number":437,"context_line":"            snap \u003d str(snapshot[\u0027name\u0027])"},{"line_number":438,"context_line":"            volume.create_snap(snap)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F2N0%3D","line":435,"in_reply_to":"AAAAQn%2F%2F4bo%3D","updated":"2013-07-22 07:40:07.000000000","message":"Since this is not part of the commit, and is not related to the blueprint, I would think it would belong to a separate commit.","commit_id":"4796efe60d4e0cb0d2cbdf7f2ded3302b0670b3d"}]}
