)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":10,"context_line":"The new commands export the backup details (not actual backup) to"},{"line_number":11,"context_line":"a string that can be imported again in another OpenStack cloud or"},{"line_number":12,"context_line":"if the backup database was corrupted."},{"line_number":13,"context_line":"The code include a default backup driver implementation."},{"line_number":14,"context_line":"Backup test code converted to use mock."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"blueprint cinder-backup-recover-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAUX%2F%2BiWA%3D","line":13,"updated":"2014-02-20 17:26:30.000000000","message":"typo include-\u003eincludes","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"}],"cinder/api/contrib/backups.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":87,"context_line":"class BackupExportImportTemplate(xmlutil.TemplateBuilder):"},{"line_number":88,"context_line":"    def construct(self):"},{"line_number":89,"context_line":"        root \u003d xmlutil.TemplateElement(\u0027export-import\u0027,"},{"line_number":90,"context_line":"                                       selector\u003d\u0027export-import\u0027)"},{"line_number":91,"context_line":"        make_backup_export_import(root)"},{"line_number":92,"context_line":"        alias \u003d Backups.alias"},{"line_number":93,"context_line":"        namespace \u003d Backups.namespace"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiUw%3D","line":90,"updated":"2014-02-20 17:26:30.000000000","message":"I am surprised this indent passed pep8.  Shouldn\u0027t it line up with the text above?","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":87,"context_line":"class BackupExportImportTemplate(xmlutil.TemplateBuilder):"},{"line_number":88,"context_line":"    def construct(self):"},{"line_number":89,"context_line":"        root \u003d xmlutil.TemplateElement(\u0027export-import\u0027,"},{"line_number":90,"context_line":"                                       selector\u003d\u0027export-import\u0027)"},{"line_number":91,"context_line":"        make_backup_export_import(root)"},{"line_number":92,"context_line":"        alias \u003d Backups.alias"},{"line_number":93,"context_line":"        namespace \u003d Backups.namespace"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bhs8%3D","line":90,"in_reply_to":"AAAAUX%2F%2BiUw%3D","updated":"2014-02-20 18:31:57.000000000","message":"The indent in the file is fine, for some reason here it isn\u0027t.\nIf you download you would see the right indent...\nThis looks like a UI bug :-)","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    @wsgi.serializers(xml\u003dBackupExportImportTemplate)"},{"line_number":298,"context_line":"    def export_backup(self, req, id):"},{"line_number":299,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":300,"context_line":"        LOG.debug(_(\u0027export called for member %s\u0027), id)"},{"line_number":301,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiTk%3D","line":300,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend ending with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    @wsgi.serializers(xml\u003dBackupExportImportTemplate)"},{"line_number":298,"context_line":"    def export_backup(self, req, id):"},{"line_number":299,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":300,"context_line":"        LOG.debug(_(\u0027export called for member %s\u0027), id)"},{"line_number":301,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhsU%3D","line":300,"in_reply_to":"AAAAUX%2F%2BiTk%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":317,"context_line":"    @wsgi.deserializers(xml\u003dBackupImportDeserializer)"},{"line_number":318,"context_line":"    def import_backup(self, req, body):"},{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":323,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiTI%3D","line":320,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend finishing this with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":317,"context_line":"    @wsgi.deserializers(xml\u003dBackupImportDeserializer)"},{"line_number":318,"context_line":"    def import_backup(self, req, body):"},{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":323,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bhqs%3D","line":320,"in_reply_to":"AAAAUX%2F%2BiTI%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":323,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":324,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":325,"context_line":"        import_data \u003d body[\u0027export-import\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiS4%3D","line":322,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend finishing this with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":323,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":324,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":325,"context_line":"        import_data \u003d body[\u0027export-import\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhqY%3D","line":322,"in_reply_to":"AAAAUX%2F%2BiS4%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            backup_service \u003d import_data[\u0027backup_service\u0027]"},{"line_number":329,"context_line":"            backup_url \u003d import_data[\u0027backup_url\u0027]"},{"line_number":330,"context_line":"        except KeyError:"},{"line_number":331,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":332,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":333,"context_line":"        LOG.debug(_(\u0027Importing backup using %(service)s and url %(url)s\u0027),"},{"line_number":334,"context_line":"                  {\u0027service\u0027: backup_service, \u0027url\u0027: backup_url})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiSc%3D","line":331,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend finishing this with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            backup_service \u003d import_data[\u0027backup_service\u0027]"},{"line_number":329,"context_line":"            backup_url \u003d import_data[\u0027backup_url\u0027]"},{"line_number":330,"context_line":"        except KeyError:"},{"line_number":331,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":332,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":333,"context_line":"        LOG.debug(_(\u0027Importing backup using %(service)s and url %(url)s\u0027),"},{"line_number":334,"context_line":"                  {\u0027service\u0027: backup_service, \u0027url\u0027: backup_url})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhqI%3D","line":331,"in_reply_to":"AAAAUX%2F%2BiSc%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        except KeyError:"},{"line_number":331,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":332,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":333,"context_line":"        LOG.debug(_(\u0027Importing backup using %(service)s and url %(url)s\u0027),"},{"line_number":334,"context_line":"                  {\u0027service\u0027: backup_service, \u0027url\u0027: backup_url})"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiSU%3D","line":333,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend finishing this with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        except KeyError:"},{"line_number":331,"context_line":"            msg \u003d _(\"Incorrect request body format\")"},{"line_number":332,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":333,"context_line":"        LOG.debug(_(\u0027Importing backup using %(service)s and url %(url)s\u0027),"},{"line_number":334,"context_line":"                  {\u0027service\u0027: backup_service, \u0027url\u0027: backup_url})"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhqQ%3D","line":333,"in_reply_to":"AAAAUX%2F%2BiSU%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":9190,"name":"Glenn M. Gobeli","email":"glenn.gobeli@gmail.com","username":"ggobeli"},"change_message_id":"8ff7548314aa1c27f8c3ea109985abed4afded5a","unresolved":false,"context_lines":[{"line_number":316,"context_line":"    @wsgi.serializers(xml\u003dBackupTemplate)"},{"line_number":317,"context_line":"    @wsgi.deserializers(xml\u003dBackupImportDeserializer)"},{"line_number":318,"context_line":"    def import_backup(self, req, body):"},{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s.\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2F1BA%3D","line":319,"updated":"2014-02-24 16:34:46.000000000","message":"Looks like a cut/paste error in function comment: copied from export function.","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"f62d4e5028f5a4e9d9feec3a2984d4b68852fa3e","unresolved":false,"context_lines":[{"line_number":316,"context_line":"    @wsgi.serializers(xml\u003dBackupTemplate)"},{"line_number":317,"context_line":"    @wsgi.deserializers(xml\u003dBackupImportDeserializer)"},{"line_number":318,"context_line":"    def import_backup(self, req, body):"},{"line_number":319,"context_line":"        \"\"\"Export a backup.\"\"\""},{"line_number":320,"context_line":"        LOG.debug(_(\u0027Importing backup from %s.\u0027), body)"},{"line_number":321,"context_line":"        if not self.is_valid_body(body, \u0027export-import\u0027):"},{"line_number":322,"context_line":"            msg \u003d _(\"Incorrect request body format.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FzQ4%3D","line":319,"in_reply_to":"AAAAU3%2F%2F1BA%3D","updated":"2014-02-25 07:20:54.000000000","message":"Done","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"}],"cinder/backup/api.py":[{"author":{"_account_id":2667,"name":"Alex Glikson","email":"glikson@il.ibm.com","username":"glikson"},"change_message_id":"4a52f595a98717b6d312d3f2d800d19ce5aa61e5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027user_id\u0027: context.user_id,"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":"    _action \u003d \u0027backup:%s\u0027 % action"},{"line_number":45,"context_line":"    LOG.audit(\"%s %s %s\" % (context, _action, target))"},{"line_number":46,"context_line":"    cinder.policy.enforce(context, _action, target)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FpGs%3D","line":45,"updated":"2014-02-11 20:02:20.000000000","message":"This can be merged independently of the rest of the patch -- consider splitting.","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"d0a3fee5c8de66683521eaebc6a82d7dcf28e872","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027user_id\u0027: context.user_id,"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":"    _action \u003d \u0027backup:%s\u0027 % action"},{"line_number":45,"context_line":"    LOG.audit(\"%s %s %s\" % (context, _action, target))"},{"line_number":46,"context_line":"    cinder.policy.enforce(context, _action, target)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FlOE%3D","line":45,"in_reply_to":"AAAAUX%2F%2FpGs%3D","updated":"2014-02-12 07:48:57.000000000","message":"removed","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":2667,"name":"Alex Glikson","email":"glikson@il.ibm.com","username":"glikson"},"change_message_id":"4a52f595a98717b6d312d3f2d800d19ce5aa61e5","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        :param volume: related volume for the backup operation"},{"line_number":92,"context_line":"        :param volume_host: host"},{"line_number":93,"context_line":"        :returns: boolean -- indicating if a host backup service is enabled."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        topic \u003d CONF.backup_topic"},{"line_number":96,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":97,"context_line":"        services \u003d self.db.service_get_all_by_topic(ctxt, topic)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FpGo%3D","line":94,"updated":"2014-02-11 20:02:20.000000000","message":"ditto","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"d0a3fee5c8de66683521eaebc6a82d7dcf28e872","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        :param volume: related volume for the backup operation"},{"line_number":92,"context_line":"        :param volume_host: host"},{"line_number":93,"context_line":"        :returns: boolean -- indicating if a host backup service is enabled."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        topic \u003d CONF.backup_topic"},{"line_number":96,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":97,"context_line":"        services \u003d self.db.service_get_all_by_topic(ctxt, topic)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FlN4%3D","line":94,"in_reply_to":"AAAAUX%2F%2FpGo%3D","updated":"2014-02-12 07:48:57.000000000","message":"removed","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        check_policy(context, \u0027backup-export\u0027)"},{"line_number":223,"context_line":"        backup \u003d self.get(context, backup_id)"},{"line_number":224,"context_line":"        if backup[\u0027status\u0027] !\u003d \u0027available\u0027:"},{"line_number":225,"context_line":"            msg \u003d _(\u0027Backup status must be available\u0027)"},{"line_number":226,"context_line":"            raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        LOG.debug(\"Calling RPCAPI with context: \""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiQs%3D","line":225,"updated":"2014-02-20 17:26:30.000000000","message":"Recommend finishing this with a \u0027.\u0027 .  Also may be helpful to report what the current status actually is.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        check_policy(context, \u0027backup-export\u0027)"},{"line_number":223,"context_line":"        backup \u003d self.get(context, backup_id)"},{"line_number":224,"context_line":"        if backup[\u0027status\u0027] !\u003d \u0027available\u0027:"},{"line_number":225,"context_line":"            msg \u003d _(\u0027Backup status must be available\u0027)"},{"line_number":226,"context_line":"            raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        LOG.debug(\"Calling RPCAPI with context: \""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhoI%3D","line":225,"in_reply_to":"AAAAUX%2F%2BiQs%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                                                     backup_service,"},{"line_number":260,"context_line":"                                                     backup_url)"},{"line_number":261,"context_line":"            except exception.ServiceNotFound as err:"},{"line_number":262,"context_line":"                LOG.audit(_(\"Host %(host)s not support service %(service)s\"),"},{"line_number":263,"context_line":"                          {\u0027host\u0027: host,"},{"line_number":264,"context_line":"                           \u0027service\u0027: backup_service},"},{"line_number":265,"context_line":"                          context\u003dcontext)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiHg%3D","line":262,"updated":"2014-02-20 17:26:30.000000000","message":"Suggest changing this message:\nHost %(host)s does not support service %(service)s.\nAlso, wondering about the Audit choice here.  Seems like this would be more appropriate as a warning given the way that I am seeing LOG.audit used elsewhere.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                                                     backup_service,"},{"line_number":260,"context_line":"                                                     backup_url)"},{"line_number":261,"context_line":"            except exception.ServiceNotFound as err:"},{"line_number":262,"context_line":"                LOG.audit(_(\"Host %(host)s not support service %(service)s\"),"},{"line_number":263,"context_line":"                          {\u0027host\u0027: host,"},{"line_number":264,"context_line":"                           \u0027service\u0027: backup_service},"},{"line_number":265,"context_line":"                          context\u003dcontext)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhZI%3D","line":262,"in_reply_to":"AAAAUX%2F%2BiHg%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        #provide default values for imported backup"},{"line_number":272,"context_line":"        backup_options[\u0027user_id\u0027] \u003d context.user_id"},{"line_number":273,"context_line":"        backup_options[\u0027project_id\u0027] \u003d context.project_id"},{"line_number":274,"context_line":"        backup_options[\u0027volume_id\u0027] \u003d \u00270000-0000-0000-0000\u0027"},{"line_number":275,"context_line":"        backup_options[\u0027host\u0027] \u003d host"},{"line_number":276,"context_line":"        if \u0027id\u0027 in backup_options:"},{"line_number":277,"context_line":"            del backup_options[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh4U%3D","line":274,"updated":"2014-02-20 17:26:30.000000000","message":"Is it safe to just initialize the volume_id to zeros?  What if something goes wrong elsewhere and the ID isn\u0027t ever set to the appropriate value.  This just doesn\u0027t look quite right to me.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        #provide default values for imported backup"},{"line_number":272,"context_line":"        backup_options[\u0027user_id\u0027] \u003d context.user_id"},{"line_number":273,"context_line":"        backup_options[\u0027project_id\u0027] \u003d context.project_id"},{"line_number":274,"context_line":"        backup_options[\u0027volume_id\u0027] \u003d \u00270000-0000-0000-0000\u0027"},{"line_number":275,"context_line":"        backup_options[\u0027host\u0027] \u003d host"},{"line_number":276,"context_line":"        if \u0027id\u0027 in backup_options:"},{"line_number":277,"context_line":"            del backup_options[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhWA%3D","line":274,"in_reply_to":"AAAAUX%2F%2Bh4U%3D","updated":"2014-02-20 18:31:57.000000000","message":"When you import a backup there is no guarantee that the volume which was the origin of the backup exist.\nHence, the goal is to provide a \"N/A\" value - volume_id is not nullable, otherwise I would actually set it to null.\nIf you think putting \"N/A\" (or equivalent) is better - I am for it.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"dfd03dfc55449f446c7304f6850cf0c281aa3bfe","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":252,"context_line":"        backup_options \u003d None"},{"line_number":253,"context_line":"        #Since there is no backup scheduler, try the backup hosts"},{"line_number":254,"context_line":"        #until you find a host that supports the required \u0027backup_service\u0027"},{"line_number":255,"context_line":"        for host in hosts:"},{"line_number":256,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2F0WM%3D","line":253,"updated":"2014-02-24 16:46:26.000000000","message":"This is goign to cause the API service to block for a long time potentially. Is now time to implement a scheduler?","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"f62d4e5028f5a4e9d9feec3a2984d4b68852fa3e","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":252,"context_line":"        backup_options \u003d None"},{"line_number":253,"context_line":"        #Since there is no backup scheduler, try the backup hosts"},{"line_number":254,"context_line":"        #until you find a host that supports the required \u0027backup_service\u0027"},{"line_number":255,"context_line":"        for host in hosts:"},{"line_number":256,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2Fyvg%3D","line":253,"in_reply_to":"AAAAU3%2F%2F0WM%3D","updated":"2014-02-25 07:20:54.000000000","message":"Make sense to add a scheduler, and I can take it up, but not sure the Icehouse schedule allows it.","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"},{"author":{"_account_id":9190,"name":"Glenn M. Gobeli","email":"glenn.gobeli@gmail.com","username":"ggobeli"},"change_message_id":"8ff7548314aa1c27f8c3ea109985abed4afded5a","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        #until you find a host that supports the required \u0027backup_service\u0027"},{"line_number":255,"context_line":"        for host in hosts:"},{"line_number":256,"context_line":"            try:"},{"line_number":257,"context_line":"                backup_options \u003d \\"},{"line_number":258,"context_line":"                    self.backup_rpcapi.import_backup(context,"},{"line_number":259,"context_line":"                                                     host,"},{"line_number":260,"context_line":"                                                     backup_service,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2F0j8%3D","line":257,"updated":"2014-02-24 16:34:46.000000000","message":"Won\u0027t this keep looping through all hosts even if we successfully find an available host (no break).","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"f62d4e5028f5a4e9d9feec3a2984d4b68852fa3e","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        #until you find a host that supports the required \u0027backup_service\u0027"},{"line_number":255,"context_line":"        for host in hosts:"},{"line_number":256,"context_line":"            try:"},{"line_number":257,"context_line":"                backup_options \u003d \\"},{"line_number":258,"context_line":"                    self.backup_rpcapi.import_backup(context,"},{"line_number":259,"context_line":"                                                     host,"},{"line_number":260,"context_line":"                                                     backup_service,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FzVw%3D","line":257,"in_reply_to":"AAAAU3%2F%2F0j8%3D","updated":"2014-02-25 07:20:54.000000000","message":"Right, either an exception or break - will add.","commit_id":"60ed6433e69659c9b21d56f8d783cb77c3199273"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"e6f41d1eec523eca254a6c3ef98a151928412b2f","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        # NOTE(ronenkat): since we don\u0027t have a backup-scheduler"},{"line_number":252,"context_line":"        # we try to find the first host that support the backup"},{"line_number":253,"context_line":"        # service we need, to be replaced with a backup scheduler."},{"line_number":254,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":255,"context_line":"        if len(hosts) \u003e 0:"},{"line_number":256,"context_line":"            options \u003d {\u0027user_id\u0027: context.user_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FcOY%3D","line":253,"updated":"2014-02-26 16:16:14.000000000","message":"Ideally I\u0027d like this to read more clearly, something like:\nSince we don\u0027t have a backup-scheduler we need to find a host supporting the backup service we need. We send it to the first backup service host, and the backup manager on that host will forward it to other hosts on the hosts list if it cannot support correct service itself.","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"de6d6b4b961a8b3a2a51503edc48ff874b2e1edc","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        # NOTE(ronenkat): since we don\u0027t have a backup-scheduler"},{"line_number":252,"context_line":"        # we try to find the first host that support the backup"},{"line_number":253,"context_line":"        # service we need, to be replaced with a backup scheduler."},{"line_number":254,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":255,"context_line":"        if len(hosts) \u003e 0:"},{"line_number":256,"context_line":"            options \u003d {\u0027user_id\u0027: context.user_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fbek%3D","line":253,"in_reply_to":"AAAAU3%2F%2FcOY%3D","updated":"2014-02-26 19:08:58.000000000","message":"Done","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"617935a8729ce57ec4205e0ab17eb71a0fb4b404","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        # we try to find the first host that support the backup"},{"line_number":253,"context_line":"        # service we need, to be replaced with a backup scheduler."},{"line_number":254,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":255,"context_line":"        if len(hosts) \u003e 0:"},{"line_number":256,"context_line":"            options \u003d {\u0027user_id\u0027: context.user_id,"},{"line_number":257,"context_line":"                       \u0027project_id\u0027: context.project_id,"},{"line_number":258,"context_line":"                       \u0027volume_id\u0027: \u00270000-0000-0000-0000\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fb1k%3D","line":255,"updated":"2014-02-26 16:58:20.000000000","message":"This is a nit, but I\u0027d rather have:\n\n if len(hosts) \u003d\u003d 0:\n     raise exception...\n\nAnd then you get rid of one level of indentation for the rest of the function","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"de6d6b4b961a8b3a2a51503edc48ff874b2e1edc","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        # we try to find the first host that support the backup"},{"line_number":253,"context_line":"        # service we need, to be replaced with a backup scheduler."},{"line_number":254,"context_line":"        hosts \u003d self._list_backup_services()"},{"line_number":255,"context_line":"        if len(hosts) \u003e 0:"},{"line_number":256,"context_line":"            options \u003d {\u0027user_id\u0027: context.user_id,"},{"line_number":257,"context_line":"                       \u0027project_id\u0027: context.project_id,"},{"line_number":258,"context_line":"                       \u0027volume_id\u0027: \u00270000-0000-0000-0000\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FbeA%3D","line":255,"in_reply_to":"AAAAU3%2F%2Fb1k%3D","updated":"2014-02-26 19:08:58.000000000","message":"Done","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"}],"cinder/backup/driver.py":[{"author":{"_account_id":2667,"name":"Alex Glikson","email":"glikson@il.ibm.com","username":"glikson"},"change_message_id":"4a52f595a98717b6d312d3f2d800d19ce5aa61e5","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from cinder.openstack.common import jsonutils"},{"line_number":20,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class BackupDriver(base.Base):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FpIE%3D","line":22,"updated":"2014-02-11 20:02:20.000000000","message":"Doesn\u0027t seem to be used (including the corresponding import)","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"d0a3fee5c8de66683521eaebc6a82d7dcf28e872","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from cinder.openstack.common import jsonutils"},{"line_number":20,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class BackupDriver(base.Base):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FlNQ%3D","line":22,"in_reply_to":"AAAAUX%2F%2FpIE%3D","updated":"2014-02-12 07:48:57.000000000","message":"Done","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"556a56065bd3777737b3eb1caf4b0dcb965dba90","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        raise NotImplementedError()"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def export_record(self, backup):"},{"line_number":268,"context_line":"        \"\"\"Export backup record.\"\"\""},{"line_number":269,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":270,"context_line":"        return retval.encode(\"base64\")"},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fb3k%3D","line":268,"updated":"2014-02-26 16:54:30.000000000","message":"Why are these new methods in the driver base class? If I understand correctly they are not intended to be implemented or used by any driver so this is the wrong place to put them.\n\nAlso I think a better explanation of what these new methods are for and how they are to be used would be nice here.","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"de6d6b4b961a8b3a2a51503edc48ff874b2e1edc","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        raise NotImplementedError()"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def export_record(self, backup):"},{"line_number":268,"context_line":"        \"\"\"Export backup record.\"\"\""},{"line_number":269,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":270,"context_line":"        return retval.encode(\"base64\")"},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fba0%3D","line":268,"in_reply_to":"AAAAU3%2F%2Fb3k%3D","updated":"2014-02-26 19:08:58.000000000","message":"Actually this is the default implementation, serialize the db entry so it could be recreated. The result is a large and not friendly string. a backup-driver that support metadata could override this method to keep the db entry info in the metadata of the backup and have a shorter string to assist with the import (the driver will use the shorter string to get the full db entry data).\n\nWill add detailed documentation for this method.","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"556a56065bd3777737b3eb1caf4b0dcb965dba90","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        return retval.encode(\"base64\")"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def import_record(self, backup_url):"},{"line_number":273,"context_line":"        \"\"\"Import backup record.\"\"\""},{"line_number":274,"context_line":"        return jsonutils.loads(backup_url.decode(\"base64\"))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fb3c%3D","line":273,"updated":"2014-02-26 16:54:30.000000000","message":"same as above.","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"de6d6b4b961a8b3a2a51503edc48ff874b2e1edc","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        return retval.encode(\"base64\")"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def import_record(self, backup_url):"},{"line_number":273,"context_line":"        \"\"\"Import backup record.\"\"\""},{"line_number":274,"context_line":"        return jsonutils.loads(backup_url.decode(\"base64\"))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fbaw%3D","line":273,"in_reply_to":"AAAAU3%2F%2Fb3c%3D","updated":"2014-02-26 19:08:58.000000000","message":"same as above.","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"0d7f3dfc18c7e84783c6e39e05acd1716a4496c4","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZy0%3D","line":278,"updated":"2014-02-26 20:43:42.000000000","message":"Ronen, thanks for adding a description. I think we need to be clear about what we expect drivers to do (and not do). Firstly, if this is to be implemented by a driver how does the driver know how to interpret backup_url? I think that if you want drivers to do a check you should have an extra method e.g.\n\ndef verify_import(self, backup_id, length\u003dNone):\n    raise NotImplementedError()\n\nwhich takes a set of mandatory and optional parameters and that drivers can implement and know exactly what information to check - in this case the driver would check that a backup associated with backup_id is available. Your import method would then call this and log an INFO/WARNING if the verification is not implemented. You could then move import_backup() and export_backup() out of here since the would never directly be overwridden/implemented by the base class, perhaps just moving them out of the Class itself. Thoughts?","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"b9ec3dcad8b39628dcc37a51413b36515f4d1be1","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVX%2F%2F7rs%3D","line":278,"in_reply_to":"AAAAU3%2F%2FZek%3D","updated":"2014-02-27 09:27:04.000000000","message":"Adding a generic verify method to allow the driver to do checks making sure the backup fine.\nI will keep the import/export record in the base driver. Any driver is welcome to implement its own optimized version.","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"16eb739d2605cfe20f691e7ef30161015c016a65","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZek%3D","line":278,"in_reply_to":"AAAAU3%2F%2FZlM%3D","updated":"2014-02-26 21:09:24.000000000","message":"If drivers require more info, the verify() method can be adapted to suit, that way we would still avoid the problem of providing a url with no known or static format which would break drivers when the database records for backups change i.e. the cinder db/version you are import to may not be the same as that exported from.","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"0cd6887a75d26a555f39e15f152ae44dcc0a9ef5","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZlM%3D","line":278,"in_reply_to":"AAAAU3%2F%2FZnY%3D","updated":"2014-02-26 20:59:02.000000000","message":"That is true for ceph \u0026 swift, but it might not be for otehr backup solutions. I think the more flexible driver interface is therefore better unless there\u0027s an actual problem with it.","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"171b145a8c5421f22c3a65b83ef0a974d56fc7e6","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZnY%3D","line":278,"in_reply_to":"AAAAU3%2F%2FZsU%3D","updated":"2014-02-26 20:57:01.000000000","message":"Duncan, afaict the driver is not doing any import at all. The assumption is that the backup volume data is intact so at this level it is just a discretionary verification that we are importing a backup db entry for a backup that does not exist or is out of sync with the db data being imported. Hence the suggestion of a discretionary verify() and moving the import/export calls out of the base class.","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"993dafe92996271fe1dd2e1bde33bdd4707a3d0b","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        retval \u003d jsonutils.dumps(backup)"},{"line_number":276,"context_line":"        return retval.encode(\"base64\")"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def import_record(self, backup_url):"},{"line_number":279,"context_line":"        \"\"\"Import and verify backup record."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        De-serialize the backup record into a dictionary."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZsU%3D","line":278,"in_reply_to":"AAAAU3%2F%2FZy0%3D","updated":"2014-02-26 20:52:44.000000000","message":"A driver might conceivably need more than a db entry to do an import... so I think letting the driver take over is reasonable, personally","commit_id":"771c2195eda19336a78ab4645f51b7a920f75314"}],"cinder/backup/manager.py":[{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        self.db.backup_destroy(context, backup_id)"},{"line_number":420,"context_line":"        LOG.info(_(\u0027Delete backup finished, backup %s deleted.\u0027), backup_id)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def export_backup(self, context, backup_id):"},{"line_number":423,"context_line":"        \"\"\"Export all volume backup metadata details to allow clean import."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        Export backup metadata so it could be re-imported into the database"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlUQ%3D","line":422,"updated":"2014-02-20 11:33:21.000000000","message":"Ok so, we just merged the metadata backup/restore api/extension which allows backup drivers to backup and restore volume metadata. I suggest you rebase this branch patchset and take a look but basically I feel like we should leverage the new api so that this is inline with how we currently restore metadata.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        self.db.backup_destroy(context, backup_id)"},{"line_number":420,"context_line":"        LOG.info(_(\u0027Delete backup finished, backup %s deleted.\u0027), backup_id)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def export_backup(self, context, backup_id):"},{"line_number":423,"context_line":"        \"\"\"Export all volume backup metadata details to allow clean import."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        Export backup metadata so it could be re-imported into the database"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F%2BEc%3D","line":422,"in_reply_to":"AAAAUX%2F%2BlUQ%3D","updated":"2014-02-23 15:35:56.000000000","message":"code rebased, the backup export/import handles copying the cinder backup DB data, and if metadata is stored in the backup. then the export/import keep referencing to it.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        :param context: running context"},{"line_number":429,"context_line":"        :param backup_id: backup id to export"},{"line_number":430,"context_line":"        :returns: backup_export -- a description of how to import the backup"},{"line_number":431,"context_line":"        :returns: contains \u0027backup_url\u0027 describing how to impor the backup, and"},{"line_number":432,"context_line":"        :returns: \u0027backup_service\u0027 describing the needed driver."},{"line_number":433,"context_line":"        :raises: InvalidBackup"},{"line_number":434,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiFk%3D","line":431,"updated":"2014-02-20 17:26:30.000000000","message":"typo impor-\u003eimport","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        :param context: running context"},{"line_number":429,"context_line":"        :param backup_id: backup id to export"},{"line_number":430,"context_line":"        :returns: backup_export -- a description of how to import the backup"},{"line_number":431,"context_line":"        :returns: contains \u0027backup_url\u0027 describing how to impor the backup, and"},{"line_number":432,"context_line":"        :returns: \u0027backup_service\u0027 describing the needed driver."},{"line_number":433,"context_line":"        :raises: InvalidBackup"},{"line_number":434,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhVo%3D","line":431,"in_reply_to":"AAAAUX%2F%2BiFk%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        for req in required_options:"},{"line_number":482,"context_line":"            if req not in backup_options:"},{"line_number":483,"context_line":"                msg \u003d (_(\u0027Backup metadata received from driver for import \u0027"},{"line_number":484,"context_line":"                         \u0027is missing %s\u0027), req)"},{"line_number":485,"context_line":"                raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def import_backup(self, context, backup_service, backup_url):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiDE%3D","line":484,"updated":"2014-02-20 17:26:30.000000000","message":"Suggest ending with a \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        for req in required_options:"},{"line_number":482,"context_line":"            if req not in backup_options:"},{"line_number":483,"context_line":"                msg \u003d (_(\u0027Backup metadata received from driver for import \u0027"},{"line_number":484,"context_line":"                         \u0027is missing %s\u0027), req)"},{"line_number":485,"context_line":"                raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def import_backup(self, context, backup_service, backup_url):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhVY%3D","line":484,"in_reply_to":"AAAAUX%2F%2BiDE%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"617935a8729ce57ec4205e0ab17eb71a0fb4b404","unresolved":false,"context_lines":[{"line_number":460,"context_line":"                    \u0027backup_service\u0027: backup_service})"},{"line_number":461,"context_line":"            raise exception.InvalidBackup(reason\u003derr)"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        #Call driver to create backup description string"},{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":466,"context_line":"            backup_service \u003d self.service.get_backup_driver(context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FbzY%3D","line":463,"updated":"2014-02-26 16:58:20.000000000","message":"These comments should all have a space after the #","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"de6d6b4b961a8b3a2a51503edc48ff874b2e1edc","unresolved":false,"context_lines":[{"line_number":460,"context_line":"                    \u0027backup_service\u0027: backup_service})"},{"line_number":461,"context_line":"            raise exception.InvalidBackup(reason\u003derr)"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        #Call driver to create backup description string"},{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":466,"context_line":"            backup_service \u003d self.service.get_backup_driver(context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FbaY%3D","line":463,"in_reply_to":"AAAAU3%2F%2FbzY%3D","updated":"2014-02-26 19:08:58.000000000","message":"Done","commit_id":"30e4c2daff14ef94dcab16f41b7fa67915dba5e3"}],"cinder/backup/rpcapi.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                  topic\u003dtopic)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def export_backup(self, ctxt, host, backup_id):"},{"line_number":76,"context_line":"        LOG.debug(\"export_backup in rpcapi backup_id %(id)s on host %(host)s\","},{"line_number":77,"context_line":"                  {\u0027id\u0027: backup_id,"},{"line_number":78,"context_line":"                   \u0027host\u0027: host})"},{"line_number":79,"context_line":"        topic \u003d rpc.queue_get_for(ctxt, self.topic, host)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiA8%3D","line":76,"updated":"2014-02-20 17:26:30.000000000","message":"Suggest ending with \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                  topic\u003dtopic)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def export_backup(self, ctxt, host, backup_id):"},{"line_number":76,"context_line":"        LOG.debug(\"export_backup in rpcapi backup_id %(id)s on host %(host)s\","},{"line_number":77,"context_line":"                  {\u0027id\u0027: backup_id,"},{"line_number":78,"context_line":"                   \u0027host\u0027: host})"},{"line_number":79,"context_line":"        topic \u003d rpc.queue_get_for(ctxt, self.topic, host)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhU0%3D","line":76,"in_reply_to":"AAAAUX%2F%2BiA8%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                         topic\u003dtopic)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def import_backup(self, ctxt, host, backup_service, backup_url):"},{"line_number":87,"context_line":"        LOG.debug(\"import_backup rpcapi for backup_url %s\" % backup_url)"},{"line_number":88,"context_line":"        topic \u003d rpc.queue_get_for(ctxt, self.topic, host)"},{"line_number":89,"context_line":"        return self.call(ctxt,"},{"line_number":90,"context_line":"                         self.make_msg(\u0027import_backup\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BiAo%3D","line":87,"updated":"2014-02-20 17:26:30.000000000","message":"Suggest ending with \u0027.\u0027 .","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                         topic\u003dtopic)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def import_backup(self, ctxt, host, backup_service, backup_url):"},{"line_number":87,"context_line":"        LOG.debug(\"import_backup rpcapi for backup_url %s\" % backup_url)"},{"line_number":88,"context_line":"        topic \u003d rpc.queue_get_for(ctxt, self.topic, host)"},{"line_number":89,"context_line":"        return self.call(ctxt,"},{"line_number":90,"context_line":"                         self.make_msg(\u0027import_backup\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhU4%3D","line":87,"in_reply_to":"AAAAUX%2F%2BiAo%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"}],"cinder/tests/api/contrib/test_backups.py":[{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"1aef5cfe296287ff7d3354387e93671b6bae8189","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        return db.backup_get(context.get_admin_context(),"},{"line_number":83,"context_line":"                             backup_id)[attrib_name]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @staticmethod"},{"line_number":86,"context_line":"    def _stub_service_get_all_by_topic(context, topic):"},{"line_number":87,"context_line":"        return [{\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027test_host\u0027,"},{"line_number":88,"context_line":"                 \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fkp0%3D","line":85,"updated":"2014-02-12 10:08:10.000000000","message":"I think this can be deleted","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"43e75a3bcbbfa2352a27ee19d1446bb7b8f894e8","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        return db.backup_get(context.get_admin_context(),"},{"line_number":83,"context_line":"                             backup_id)[attrib_name]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @staticmethod"},{"line_number":86,"context_line":"    def _stub_service_get_all_by_topic(context, topic):"},{"line_number":87,"context_line":"        return [{\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027test_host\u0027,"},{"line_number":88,"context_line":"                 \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FgP0%3D","line":85,"in_reply_to":"AAAAUX%2F%2Fkp0%3D","updated":"2014-02-12 18:18:46.000000000","message":"Done","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"        #db.backup_destroy(context.get_admin_context(), backup_id)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def test_export_backup_with_Bad_Backup_Id(self):"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"        ctx \u003d context.RequestContext(\u0027admin\u0027, \u0027fake\u0027, is_admin\u003dTrue)"},{"line_number":1015,"context_line":"        backup_id \u003d \u0027bad_id\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh%2BQ%3D","line":1012,"updated":"2014-02-20 17:26:30.000000000","message":"Seems like Bad_Backup_Id should be lower case.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"        #db.backup_destroy(context.get_admin_context(), backup_id)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def test_export_backup_with_Bad_Backup_Id(self):"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"        ctx \u003d context.RequestContext(\u0027admin\u0027, \u0027fake\u0027, is_admin\u003dTrue)"},{"line_number":1015,"context_line":"        backup_id \u003d \u0027bad_id\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhUQ%3D","line":1012,"in_reply_to":"AAAAUX%2F%2Bh%2BQ%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        db.backup_destroy(context.get_admin_context(), backup_id)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    @mock.patch(\u0027cinder.backup.rpcapi.BackupAPI.export_backup\u0027)"},{"line_number":1046,"context_line":"    def test_export_backup_with_unavailable_Service(self,"},{"line_number":1047,"context_line":"                                                    _mock_export_backup_rpc):"},{"line_number":1048,"context_line":"        msg \u003d \u0027fake unavailable service\u0027"},{"line_number":1049,"context_line":"        _mock_export_backup_rpc.side_effect \u003d \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh98%3D","line":1046,"updated":"2014-02-20 17:26:30.000000000","message":"I think \u0027Service\u0027 should be \u0027service\u0027 to be consistent with other test case names.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        db.backup_destroy(context.get_admin_context(), backup_id)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    @mock.patch(\u0027cinder.backup.rpcapi.BackupAPI.export_backup\u0027)"},{"line_number":1046,"context_line":"    def test_export_backup_with_unavailable_Service(self,"},{"line_number":1047,"context_line":"                                                    _mock_export_backup_rpc):"},{"line_number":1048,"context_line":"        msg \u003d \u0027fake unavailable service\u0027"},{"line_number":1049,"context_line":"        _mock_export_backup_rpc.side_effect \u003d \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhUE%3D","line":1046,"in_reply_to":"AAAAUX%2F%2Bh98%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"}],"cinder/tests/test_backup.py":[{"author":{"_account_id":2667,"name":"Alex Glikson","email":"glikson@il.ibm.com","username":"glikson"},"change_message_id":"4a52f595a98717b6d312d3f2d800d19ce5aa61e5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.flags(volumes_dir\u003dvol_tmpdir)"},{"line_number":50,"context_line":"        self.backup_mgr \u003d \\"},{"line_number":51,"context_line":"            importutils.import_object(CONF.backup_manager)"},{"line_number":52,"context_line":"        #print \"%s\" % dir(self.backup_mgr)"},{"line_number":53,"context_line":"        #self.backup_mgr.cfg.CONF.backup_driver \u003d \u0027cinder.backup.driver\u0027"},{"line_number":54,"context_line":"        self.backup_mgr.host \u003d \u0027testhost\u0027"},{"line_number":55,"context_line":"        self.ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FpCA%3D","line":52,"updated":"2014-02-11 20:02:20.000000000","message":"debugging leftovers?","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"d0a3fee5c8de66683521eaebc6a82d7dcf28e872","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.flags(volumes_dir\u003dvol_tmpdir)"},{"line_number":50,"context_line":"        self.backup_mgr \u003d \\"},{"line_number":51,"context_line":"            importutils.import_object(CONF.backup_manager)"},{"line_number":52,"context_line":"        #print \"%s\" % dir(self.backup_mgr)"},{"line_number":53,"context_line":"        #self.backup_mgr.cfg.CONF.backup_driver \u003d \u0027cinder.backup.driver\u0027"},{"line_number":54,"context_line":"        self.backup_mgr.host \u003d \u0027testhost\u0027"},{"line_number":55,"context_line":"        self.ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FlOY%3D","line":52,"in_reply_to":"AAAAUX%2F%2FpCA%3D","updated":"2014-02-12 07:48:57.000000000","message":"Done","commit_id":"d3073ff5d03bf703913b18a6dc106a4db7cc954c"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        backup_id \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        _mock_volume_backup_class \u003d \u0027%s.backup_volume\u0027 % CONF.volume_driver"},{"line_number":171,"context_line":"        with mock.patch(_mock_volume_backup_class) as _mock_volume_backup:"},{"line_number":172,"context_line":"            _mock_volume_backup.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":173,"context_line":"            self.assertRaises(FakeBackupException,"},{"line_number":174,"context_line":"                              self.backup_mgr.create_backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlY4%3D","line":171,"updated":"2014-02-20 11:33:21.000000000","message":"Since this applies to the whole test it would be better to use the @mock.patch() decorator.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        backup_id \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        _mock_volume_backup_class \u003d \u0027%s.backup_volume\u0027 % CONF.volume_driver"},{"line_number":171,"context_line":"        with mock.patch(_mock_volume_backup_class) as _mock_volume_backup:"},{"line_number":172,"context_line":"            _mock_volume_backup.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":173,"context_line":"            self.assertRaises(FakeBackupException,"},{"line_number":174,"context_line":"                              self.backup_mgr.create_backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F9LA%3D","line":171,"in_reply_to":"AAAAUX%2F%2BlY4%3D","updated":"2014-02-23 15:35:56.000000000","message":"Done","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        backup_id \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        _mock_volume_backup_class \u003d \u0027%s.backup_volume\u0027 % CONF.volume_driver"},{"line_number":190,"context_line":"        with mock.patch(_mock_volume_backup_class) as _mock_volume_backup:"},{"line_number":191,"context_line":"            self.backup_mgr.create_backup(self.ctxt, backup_id)"},{"line_number":192,"context_line":"            vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":193,"context_line":"            self.assertEqual(vol[\u0027status\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlY8%3D","line":190,"updated":"2014-02-20 11:33:21.000000000","message":"Since this applies to the whole test it would be better to use the @mock.patch() decorator.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        backup_id \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        _mock_volume_backup_class \u003d \u0027%s.backup_volume\u0027 % CONF.volume_driver"},{"line_number":190,"context_line":"        with mock.patch(_mock_volume_backup_class) as _mock_volume_backup:"},{"line_number":191,"context_line":"            self.backup_mgr.create_backup(self.ctxt, backup_id)"},{"line_number":192,"context_line":"            vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":193,"context_line":"            self.assertEqual(vol[\u0027status\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F9K8%3D","line":190,"in_reply_to":"AAAAUX%2F%2BlY8%3D","updated":"2014-02-23 15:35:56.000000000","message":"Done","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                                                 volume_id\u003dvol_id)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        _mock_volume_restore_class \u003d \u0027%s.restore_backup\u0027 % CONF.volume_driver"},{"line_number":239,"context_line":"        with mock.patch(_mock_volume_restore_class) as _mock_volume_restore:"},{"line_number":240,"context_line":"            _mock_volume_restore.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":241,"context_line":"            self.assertRaises(FakeBackupException,"},{"line_number":242,"context_line":"                              self.backup_mgr.restore_backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlZA%3D","line":239,"updated":"2014-02-20 11:33:21.000000000","message":"Since this applies to the whole test it would be better to use the @mock.patch() decorator.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                                                 volume_id\u003dvol_id)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        _mock_volume_restore_class \u003d \u0027%s.restore_backup\u0027 % CONF.volume_driver"},{"line_number":239,"context_line":"        with mock.patch(_mock_volume_restore_class) as _mock_volume_restore:"},{"line_number":240,"context_line":"            _mock_volume_restore.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":241,"context_line":"            self.assertRaises(FakeBackupException,"},{"line_number":242,"context_line":"                              self.backup_mgr.restore_backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F9K4%3D","line":239,"in_reply_to":"AAAAUX%2F%2BlZA%3D","updated":"2014-02-23 15:35:56.000000000","message":"Done","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                                                 volume_id\u003dvol_id)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        _mock_volume_restore_class \u003d \u0027%s.restore_backup\u0027 % CONF.volume_driver"},{"line_number":282,"context_line":"        with mock.patch(_mock_volume_restore_class) as _mock_volume_restore:"},{"line_number":283,"context_line":"            self.backup_mgr.restore_backup(self.ctxt, backup_id, vol_id)"},{"line_number":284,"context_line":"            vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":285,"context_line":"            self.assertEqual(vol[\u0027status\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlZU%3D","line":282,"updated":"2014-02-20 11:33:21.000000000","message":"Since this applies to the whole test it would be better to use the @mock.patch() decorator.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                                                 volume_id\u003dvol_id)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        _mock_volume_restore_class \u003d \u0027%s.restore_backup\u0027 % CONF.volume_driver"},{"line_number":282,"context_line":"        with mock.patch(_mock_volume_restore_class) as _mock_volume_restore:"},{"line_number":283,"context_line":"            self.backup_mgr.restore_backup(self.ctxt, backup_id, vol_id)"},{"line_number":284,"context_line":"            vol \u003d db.volume_get(self.ctxt, vol_id)"},{"line_number":285,"context_line":"            self.assertEqual(vol[\u0027status\u0027], \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F9K0%3D","line":282,"in_reply_to":"AAAAUX%2F%2BlZU%3D","updated":"2014-02-23 15:35:56.000000000","message":"Done","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":6737,"name":"Edward Hope-Morley","email":"edward.hope-morley@canonical.com","username":"hopem"},"change_message_id":"c160a5d963ef90b835bec001b37a876e0242e6cd","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        _mock_backup_import_class \u003d (\u0027%s.%s.%s\u0027 %"},{"line_number":487,"context_line":"                                     (backup_driver.__module__,"},{"line_number":488,"context_line":"                                      backup_driver.__class__.__name__,"},{"line_number":489,"context_line":"                                      \u0027import_backup\u0027))"},{"line_number":490,"context_line":"        with mock.patch(_mock_backup_import_class) as _mock_backup_import:"},{"line_number":491,"context_line":"            _mock_backup_import.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":492,"context_line":"            self.assertRaises(exception.InvalidBackup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BlW8%3D","line":489,"updated":"2014-02-20 11:33:21.000000000","message":"I think you might be able to do this:\n\nwith mock.patch.object(backup_driver, \u0027import_backup\u0027):\n    ...\n\nNot tested though.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"991a65fd3b2776fb8bc305a8cab52c1baaa5d772","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        _mock_backup_import_class \u003d (\u0027%s.%s.%s\u0027 %"},{"line_number":487,"context_line":"                                     (backup_driver.__module__,"},{"line_number":488,"context_line":"                                      backup_driver.__class__.__name__,"},{"line_number":489,"context_line":"                                      \u0027import_backup\u0027))"},{"line_number":490,"context_line":"        with mock.patch(_mock_backup_import_class) as _mock_backup_import:"},{"line_number":491,"context_line":"            _mock_backup_import.side_effect \u003d FakeBackupException(\u0027fake\u0027)"},{"line_number":492,"context_line":"            self.assertRaises(exception.InvalidBackup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAU3%2F%2F9Ko%3D","line":489,"in_reply_to":"AAAAUX%2F%2BlW8%3D","updated":"2014-02-23 15:35:56.000000000","message":"backup_driver will not be available as a decorator as it is computed locally inside the method.","commit_id":"2fbe469f310ee57e8074202a0599a789b82e6b25"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ddc54ee8ca8cfa492d9738df150900fc23589a18","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.backup_mgr \u003d \\"},{"line_number":51,"context_line":"            importutils.import_object(CONF.backup_manager)"},{"line_number":52,"context_line":"        #print \"%s\" % dir(self.backup_mgr)"},{"line_number":53,"context_line":"        #self.backup_mgr.cfg.CONF.backup_driver \u003d \u0027cinder.backup.driver\u0027"},{"line_number":54,"context_line":"        self.backup_mgr.host \u003d \u0027testhost\u0027"},{"line_number":55,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":56,"context_line":"        self.backup_mgr.driver.set_initialized()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh80%3D","line":53,"updated":"2014-02-20 17:26:30.000000000","message":"This should be removed.","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"3c7b95fc85bb2fb7d6f4b7a33c81b0e5f183fe22","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.backup_mgr \u003d \\"},{"line_number":51,"context_line":"            importutils.import_object(CONF.backup_manager)"},{"line_number":52,"context_line":"        #print \"%s\" % dir(self.backup_mgr)"},{"line_number":53,"context_line":"        #self.backup_mgr.cfg.CONF.backup_driver \u003d \u0027cinder.backup.driver\u0027"},{"line_number":54,"context_line":"        self.backup_mgr.host \u003d \u0027testhost\u0027"},{"line_number":55,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":56,"context_line":"        self.backup_mgr.driver.set_initialized()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BhTk%3D","line":53,"in_reply_to":"AAAAUX%2F%2Bh80%3D","updated":"2014-02-20 18:31:57.000000000","message":"Done","commit_id":"4bda6ec667b562ff9405676696cc5bfa6c184694"}]}
