)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"9a4ca35869eb67e97c5cf054a1080d749f3a5e0f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_8ad232fe","line":9,"updated":"2015-03-03 09:42:48.000000000","message":"Need a space between \u0027versioned\u0027 and \u0027objects\u0027.","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"b7aff0d350577f863605ef52b92388e934e8033e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_e3103050","line":9,"in_reply_to":"ba7be1f8_855f8340","updated":"2015-03-03 13:22:05.000000000","message":"Thanks for pointing that out.","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"7657c6205d6e3da09c6ada91d1be73fcd2fd7112","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_855f8340","line":9,"in_reply_to":"ba7be1f8_8ad232fe","updated":"2015-03-03 10:07:32.000000000","message":"versionedobjects is the name of the library it is now being released as oslo.versionedobjects","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_89795584","line":9,"in_reply_to":"ba7be1f8_e3103050","updated":"2015-03-03 14:19:01.000000000","message":"To be actual correct, the library name is oslo_versionedobjects.  But we have not switched over yet (not until liberty).","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"9a4ca35869eb67e97c5cf054a1080d749f3a5e0f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_4a811ac2","line":12,"updated":"2015-03-03 09:42:48.000000000","message":"Open this blueprint says nothing found.","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9a80dd14_6a67cae9","line":12,"in_reply_to":"ba7be1f8_434e5c70","updated":"2015-03-06 15:14:29.000000000","message":"The blueprint is marked as completed, but this is work related to it.","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"7657c6205d6e3da09c6ada91d1be73fcd2fd7112","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_653e0fdc","line":12,"in_reply_to":"ba7be1f8_4a811ac2","updated":"2015-03-03 10:07:32.000000000","message":"https://blueprints.launchpad.net/cinder/+spec/cinder-objects","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"b7aff0d350577f863605ef52b92388e934e8033e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds versionedobjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":12,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba7be1f8_434e5c70","line":12,"in_reply_to":"ba7be1f8_653e0fdc","updated":"2015-03-03 13:22:05.000000000","message":"Click the blueprint in the commit message, https://review.openstack.org/#/c/157085/7, shows up not found.","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"7a016987_3ce62c44","line":14,"updated":"2015-05-25 13:41:14.000000000","message":"I think it should be partial-implements","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7390645691d0b62d47242352704c7c38df8a1a84","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"7a016987_7c08162e","line":14,"in_reply_to":"7a016987_3ce62c44","updated":"2015-05-26 06:54:52.000000000","message":"Actually there\u0027s no such flag as Partial-Implements - https://wiki.openstack.org/wiki/GitCommitMessages.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"4b4c22bd97ea2a5c6098e9edf8ad63f190964860","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"7a016987_f7a9bc91","line":14,"in_reply_to":"7a016987_7c08162e","updated":"2015-05-26 08:38:03.000000000","message":"I get it. There is no Partial-Implements in https://wiki.openstack.org/wiki/GitCommitMessages. But quite a few people are using it: https://review.openstack.org/#/c/161480/ , https://review.openstack.org/#/c/165202/ , https://review.openstack.org/#/c/161363/ . That\u0027s weird.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"cf79faf6fffe6fa21b41b0e8bfd620ad800efa94","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds VersionedObjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a016987_f43e4fd9","line":9,"updated":"2015-05-26 13:56:38.000000000","message":"Maybe a note should be added that switching drivers to use backup objects is left as a follow-up patch, so that others will not be confused, based on the comments by Tom and Accela?","commit_id":"f713e2796a3dcb492f104fd3cd5a2bf952d5f00b"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"3bfbf2c5231499956a1ec349fc4045f1d2004c5b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds VersionedObjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a016987_e5d457be","line":9,"in_reply_to":"7a016987_a59f7f4f","updated":"2015-05-26 14:51:15.000000000","message":"I get that, but agree with Thang that explaining this in the commit message would be helpful.","commit_id":"f713e2796a3dcb492f104fd3cd5a2bf952d5f00b"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"fb273f8e65ca2c591399f36e478e4f37dcdc68c9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds VersionedObjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a016987_45944be7","line":9,"in_reply_to":"7a016987_a59f7f4f","updated":"2015-05-26 14:54:01.000000000","message":"I understand.  I was pointing out that a note in the commit message might be needed to say what you said above, so others do not -1 this patch saying something was missed., e.g. obj[\u0027prop\u0027] \u003e obj.prop.","commit_id":"f713e2796a3dcb492f104fd3cd5a2bf952d5f00b"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"39afb059ff417a59ca9bd5f5a2427bd3de65263f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds VersionedObjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a016987_e50c573d","line":9,"in_reply_to":"7a016987_f43e4fd9","updated":"2015-05-26 14:37:37.000000000","message":"+1\n\ndrivers and the manager","commit_id":"f713e2796a3dcb492f104fd3cd5a2bf952d5f00b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ceeb045496ac60eb457d7fef060c3551b4d1d354","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds VersionedObjects abstraction layer to volume backups."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a016987_a59f7f4f","line":9,"in_reply_to":"7a016987_f43e4fd9","updated":"2015-05-26 14:45:28.000000000","message":"Actually only move from dict to object syntax is left for a follow up patch. In every driver and manager everything is running on objects. Every direct DB call is replaced with objects one in this patch.\n\nObjects derive from CinderObjectDictCompat which makes it possible to either use\n\n    obj.prop\n\nor\n\n    obj[\u0027prop\u0027]\n\nwith the same result. We should eventually move to the first approach, but I don\u0027t want to grow this patch unnecessarily.","commit_id":"f713e2796a3dcb492f104fd3cd5a2bf952d5f00b"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7df7c81c1f9256e58ebda5b5304f7bc4319bba40","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"5afe65bd_5b963ef1","line":14,"updated":"2015-06-03 08:17:49.000000000","message":"Is it all implemented now, or is there followup?","commit_id":"9b1ca57c99ac632174104cd311ec7ebd3145d3c0"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"4a51a2df74b8d09e9fef050e230d9cd92a059021","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Co-Authored-By: Grzegorz Grasza \u003cgrzegorz.grasza@intel.com\u003e"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Icff37261b367463b71a1268be16f9c97f595bf0c"},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"5afe65bd_fa615aa9","line":14,"in_reply_to":"5afe65bd_5b963ef1","updated":"2015-06-03 12:24:33.000000000","message":"Same concern on why \u0027Partial-\u0027 is removed. It looks like cinder-objects is such a large blueprint:\n\nhttps://blueprints.launchpad.net/cinder/+spec/cinder-objects","commit_id":"9b1ca57c99ac632174104cd311ec7ebd3145d3c0"}],"cinder/backup/api.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        # TODO(DuncanT): In future, when we have a generic local attach,"},{"line_number":192,"context_line":"        #                this can go via the scheduler, which enables"},{"line_number":193,"context_line":"        #                better load balancing and isolation of services"},{"line_number":194,"context_line":"        self.backup_rpcapi.create_backup(context,"},{"line_number":195,"context_line":"                                         backup[\u0027host\u0027],"},{"line_number":196,"context_line":"                                         backup[\u0027id\u0027],"},{"line_number":197,"context_line":"                                         volume_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_5b404356","line":194,"updated":"2015-02-23 21:39:23.000000000","message":"You should send the backup object over RPC instead of backup[\u0027host\u0027], backup[\u0027id\u0027], and volume_id.  This will save a second lookup in cinder/backup/manager.py.","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        if backup[\u0027status\u0027] !\u003d \u0027available\u0027:"},{"line_number":206,"context_line":"            msg \u003d _(\u0027Backup status must be available\u0027)"},{"line_number":207,"context_line":"            raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        size \u003d backup[\u0027size\u0027]"},{"line_number":210,"context_line":"        if size is None:"},{"line_number":211,"context_line":"            msg \u003d _(\u0027Backup to be restored has invalid size\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_3bd38fd7","line":208,"updated":"2015-02-23 21:39:23.000000000","message":"Dot notation","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                                                   \u0027restoring-backup\u0027})"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        volume_host \u003d volume_utils.extract_host(volume[\u0027host\u0027], \u0027host\u0027)"},{"line_number":260,"context_line":"        self.backup_rpcapi.restore_backup(context,"},{"line_number":261,"context_line":"                                          volume_host,"},{"line_number":262,"context_line":"                                          backup[\u0027id\u0027],"},{"line_number":263,"context_line":"                                          volume_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_066032a4","line":260,"updated":"2015-02-23 21:39:23.000000000","message":"Ditto - send over backup object over RPC, thus saving an second lookup in cinder/backup/manager.py.","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"5679313ac45cf807e990b4af78780b1d73161728","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def get(self, context, backup_id):"},{"line_number":61,"context_line":"        check_policy(context, \u0027get\u0027)"},{"line_number":62,"context_line":"        rv \u003d objects.Backup.get_by_id(context, backup_id)"},{"line_number":63,"context_line":"        return rv"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def delete(self, context, backup_id):"},{"line_number":66,"context_line":"        \"\"\"Make the RPC call to delete a volume backup.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_88607c02","line":63,"updated":"2015-03-06 19:26:46.000000000","message":"You can just return directly, instead of assigning it to a variable.  Maybe you could change this if you rebase.","commit_id":"cf8a2ac2ea486dc20e2046df22d6d41f4df25179"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"892f72c61a5fda9ad82287d45ee710095c2d50f2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def get(self, context, backup_id):"},{"line_number":61,"context_line":"        check_policy(context, \u0027get\u0027)"},{"line_number":62,"context_line":"        rv \u003d objects.Backup.get_by_id(context, backup_id)"},{"line_number":63,"context_line":"        return rv"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def delete(self, context, backup_id):"},{"line_number":66,"context_line":"        \"\"\"Make the RPC call to delete a volume backup.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_948a2062","line":63,"in_reply_to":"9a80dd14_88607c02","updated":"2015-03-09 16:30:14.000000000","message":"Done","commit_id":"cf8a2ac2ea486dc20e2046df22d6d41f4df25179"}],"cinder/backup/chunkeddriver.py":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return backup.container"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def _generate_object_names(self, backup):"},{"line_number":167,"context_line":"        prefix \u003d backup[\u0027service_metadata\u0027]"},{"line_number":168,"context_line":"        object_names \u003d self.get_container_entries(backup[\u0027container\u0027], prefix)"},{"line_number":169,"context_line":"        LOG.debug(\u0027generated object list: %s.\u0027, object_names)"},{"line_number":170,"context_line":"        return object_names"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a4fb2c78","line":167,"updated":"2015-05-25 03:26:54.000000000","message":"backup.service_metadata ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        return object_names"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def _metadata_filename(self, backup):"},{"line_number":173,"context_line":"        object_name \u003d backup[\u0027service_metadata\u0027]"},{"line_number":174,"context_line":"        filename \u003d \u0027%s_metadata\u0027 % object_name"},{"line_number":175,"context_line":"        return filename"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_44ec78ba","line":173,"updated":"2015-05-25 03:26:54.000000000","message":"ditto","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        return filename"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _sha256_filename(self, backup):"},{"line_number":178,"context_line":"        object_name \u003d backup[\u0027service_metadata\u0027]"},{"line_number":179,"context_line":"        filename \u003d \u0027%s_sha256file\u0027 % object_name"},{"line_number":180,"context_line":"        return filename"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_242e1cfb","line":178,"updated":"2015-05-25 03:26:54.000000000","message":"ditto","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                  \u0027 metadata filename: %(filename)s.\u0027,"},{"line_number":187,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":188,"context_line":"        metadata \u003d {}"},{"line_number":189,"context_line":"        metadata[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":190,"context_line":"        metadata[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":191,"context_line":"        metadata[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":192,"context_line":"        metadata[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c4362850","line":189,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        metadata \u003d {}"},{"line_number":189,"context_line":"        metadata[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":190,"context_line":"        metadata[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":191,"context_line":"        metadata[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":192,"context_line":"        metadata[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":193,"context_line":"        metadata[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":194,"context_line":"        metadata[\u0027created_at\u0027] \u003d str(backup[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a4420cac","line":191,"updated":"2015-05-25 03:26:54.000000000","message":"bakup.display_name ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        metadata[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":190,"context_line":"        metadata[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":191,"context_line":"        metadata[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":192,"context_line":"        metadata[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":193,"context_line":"        metadata[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":194,"context_line":"        metadata[\u0027created_at\u0027] \u003d str(backup[\u0027created_at\u0027])"},{"line_number":195,"context_line":"        metadata[\u0027objects\u0027] \u003d object_list"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_644894cc","line":192,"updated":"2015-05-25 03:26:54.000000000","message":"backup.display_description ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        metadata[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":191,"context_line":"        metadata[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":192,"context_line":"        metadata[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":193,"context_line":"        metadata[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":194,"context_line":"        metadata[\u0027created_at\u0027] \u003d str(backup[\u0027created_at\u0027])"},{"line_number":195,"context_line":"        metadata[\u0027objects\u0027] \u003d object_list"},{"line_number":196,"context_line":"        metadata[\u0027parent_id\u0027] \u003d backup[\u0027parent_id\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_0418c0d1","line":193,"updated":"2015-05-25 03:26:54.000000000","message":"backup.created_at ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        metadata[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":193,"context_line":"        metadata[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":194,"context_line":"        metadata[\u0027created_at\u0027] \u003d str(backup[\u0027created_at\u0027])"},{"line_number":195,"context_line":"        metadata[\u0027objects\u0027] \u003d object_list"},{"line_number":196,"context_line":"        metadata[\u0027parent_id\u0027] \u003d backup[\u0027parent_id\u0027]"},{"line_number":197,"context_line":"        metadata[\u0027volume_meta\u0027] \u003d volume_meta"},{"line_number":198,"context_line":"        if extra_metadata:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c40d0890","line":195,"updated":"2015-05-25 03:26:54.000000000","message":"backup.parent_id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                  \u0027 sha256file filename: %(filename)s.\u0027,"},{"line_number":209,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":210,"context_line":"        sha256file \u003d {}"},{"line_number":211,"context_line":"        sha256file[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":212,"context_line":"        sha256file[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":213,"context_line":"        sha256file[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":214,"context_line":"        sha256file[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a429ece7","line":211,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        sha256file \u003d {}"},{"line_number":211,"context_line":"        sha256file[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":212,"context_line":"        sha256file[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":213,"context_line":"        sha256file[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":214,"context_line":"        sha256file[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":215,"context_line":"        sha256file[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":216,"context_line":"        sha256file[\u0027created_at\u0027] \u003d six.text_type(backup[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_8424b00c","line":213,"updated":"2015-05-25 03:26:54.000000000","message":"backup.display_name ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        sha256file[\u0027version\u0027] \u003d self.DRIVER_VERSION"},{"line_number":212,"context_line":"        sha256file[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":213,"context_line":"        sha256file[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":214,"context_line":"        sha256file[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":215,"context_line":"        sha256file[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":216,"context_line":"        sha256file[\u0027created_at\u0027] \u003d six.text_type(backup[\u0027created_at\u0027])"},{"line_number":217,"context_line":"        sha256file[\u0027chunk_size\u0027] \u003d self.sha_block_size_bytes"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_641f74b7","line":214,"updated":"2015-05-25 03:26:54.000000000","message":"backup.display_description ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        sha256file[\u0027backup_id\u0027] \u003d backup[\u0027id\u0027]"},{"line_number":213,"context_line":"        sha256file[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":214,"context_line":"        sha256file[\u0027backup_name\u0027] \u003d backup[\u0027display_name\u0027]"},{"line_number":215,"context_line":"        sha256file[\u0027backup_description\u0027] \u003d backup[\u0027display_description\u0027]"},{"line_number":216,"context_line":"        sha256file[\u0027created_at\u0027] \u003d six.text_type(backup[\u0027created_at\u0027])"},{"line_number":217,"context_line":"        sha256file[\u0027chunk_size\u0027] \u003d self.sha_block_size_bytes"},{"line_number":218,"context_line":"        sha256file[\u0027sha256s\u0027] \u003d sha256_list"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_441a38c7","line":215,"updated":"2015-05-25 03:26:54.000000000","message":"backup.created_at ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            writer.write(sha256file_json)"},{"line_number":222,"context_line":"        LOG.debug(\u0027_write_sha256file finished.\u0027)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def _read_metadata(self, backup):"},{"line_number":225,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":226,"context_line":"        filename \u003d self._metadata_filename(backup)"},{"line_number":227,"context_line":"        LOG.debug(\u0027_read_metadata started, container name: %(container)s, \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_247cdcea","line":224,"updated":"2015-05-25 03:26:54.000000000","message":"backup.container ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        LOG.debug(\u0027_read_metadata finished. Metadata: %s.\u0027, metadata_json)"},{"line_number":234,"context_line":"        return metadata"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _read_sha256file(self, backup):"},{"line_number":237,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":238,"context_line":"        filename \u003d self._sha256_filename(backup)"},{"line_number":239,"context_line":"        LOG.debug(\u0027_read_sha256file started, container name: %(container)s, \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_e48124c4","line":236,"updated":"2015-05-25 03:26:54.000000000","message":"backup.container","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                             extra_metadata)"},{"line_number":349,"context_line":"        backup.object_count \u003d object_id"},{"line_number":350,"context_line":"        backup.save()"},{"line_number":351,"context_line":"        LOG.debug(\u0027backup %s finished.\u0027, backup[\u0027id\u0027])"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _backup_metadata(self, backup, object_meta):"},{"line_number":354,"context_line":"        \"\"\"Backup volume metadata."}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_04668050","line":351,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                       versioned api so we should not alter it in any way here."},{"line_number":358,"context_line":"                       We must also be sure that the service that will perform"},{"line_number":359,"context_line":"                       the restore is compatible with version used."},{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        json_meta \u003d self.get_metadata(backup[\u0027volume_id\u0027])"},{"line_number":362,"context_line":"        if not json_meta:"},{"line_number":363,"context_line":"            LOG.debug(\"No volume metadata to backup.\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_e458048c","line":360,"updated":"2015-05-25 03:26:54.000000000","message":"backup.volume_id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":386,"context_line":"    def backup(self, backup, volume_file, backup_metadata\u003dTrue):"},{"line_number":387,"context_line":"        \"\"\"Backup the given volume."},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"           If backup[\u0027parent_id\u0027] is given, then an incremental backup"},{"line_number":390,"context_line":"           is performed."},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        if self.chunk_size_bytes % self.sha_block_size_bytes:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c45bc884","line":389,"updated":"2015-05-25 03:26:54.000000000","message":"backup.parent_id","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                    \u0027block size for creating hash.\u0027)"},{"line_number":395,"context_line":"            raise exception.InvalidBackup(reason\u003derr)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"        # Read the shafile of the parent backup if backup[\u0027parent_id\u0027]"},{"line_number":398,"context_line":"        # is given."},{"line_number":399,"context_line":"        parent_backup_shafile \u003d None"},{"line_number":400,"context_line":"        parent_backup \u003d None"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a457ac56","line":397,"updated":"2015-05-25 03:26:54.000000000","message":"backup.parent_id","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    def _restore_v1(self, backup, volume_id, metadata, volume_file):"},{"line_number":532,"context_line":"        \"\"\"Restore a v1 volume backup.\"\"\""},{"line_number":533,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":534,"context_line":"        LOG.debug(\u0027v1 volume backup restore of %s started.\u0027, backup_id)"},{"line_number":535,"context_line":"        extra_metadata \u003d metadata.get(\u0027extra_metadata\u0027)"},{"line_number":536,"context_line":"        container \u003d backup[\u0027container\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_84527065","line":533,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":534,"context_line":"        LOG.debug(\u0027v1 volume backup restore of %s started.\u0027, backup_id)"},{"line_number":535,"context_line":"        extra_metadata \u003d metadata.get(\u0027extra_metadata\u0027)"},{"line_number":536,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":537,"context_line":"        metadata_objects \u003d metadata[\u0027objects\u0027]"},{"line_number":538,"context_line":"        metadata_object_names \u003d sum((obj.keys() for obj in metadata_objects),"},{"line_number":539,"context_line":"                                    [])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_644d34c3","line":536,"updated":"2015-05-25 03:26:54.000000000","message":"backup.container ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def restore(self, backup, volume_id, volume_file):"},{"line_number":599,"context_line":"        \"\"\"Restore the given volume backup from backup repository.\"\"\""},{"line_number":600,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":601,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":602,"context_line":"        object_prefix \u003d backup[\u0027service_metadata\u0027]"},{"line_number":603,"context_line":"        LOG.debug(\u0027starting restore of backup %(object_prefix)s \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_24ca9c1b","line":600,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":598,"context_line":"    def restore(self, backup, volume_id, volume_file):"},{"line_number":599,"context_line":"        \"\"\"Restore the given volume backup from backup repository.\"\"\""},{"line_number":600,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":601,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":602,"context_line":"        object_prefix \u003d backup[\u0027service_metadata\u0027]"},{"line_number":603,"context_line":"        LOG.debug(\u0027starting restore of backup %(object_prefix)s \u0027"},{"line_number":604,"context_line":"                  \u0027container: %(container)s, to volume %(volume_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_64c3f438","line":601,"updated":"2015-05-25 03:26:54.000000000","message":"backup.container ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":599,"context_line":"        \"\"\"Restore the given volume backup from backup repository.\"\"\""},{"line_number":600,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":601,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":602,"context_line":"        object_prefix \u003d backup[\u0027service_metadata\u0027]"},{"line_number":603,"context_line":"        LOG.debug(\u0027starting restore of backup %(object_prefix)s \u0027"},{"line_number":604,"context_line":"                  \u0027container: %(container)s, to volume %(volume_id)s, \u0027"},{"line_number":605,"context_line":"                  \u0027backup: %(backup_id)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_04cd6030","line":602,"updated":"2015-05-25 03:26:54.000000000","message":"backup.service_metadata ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def delete(self, backup):"},{"line_number":658,"context_line":"        \"\"\"Delete the given backup.\"\"\""},{"line_number":659,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":660,"context_line":"        LOG.debug(\u0027delete started, backup: %(id)s, container: %(cont)s, \u0027"},{"line_number":661,"context_line":"                  \u0027prefix: %(pre)s.\u0027,"},{"line_number":662,"context_line":"                  {\u0027id\u0027: backup[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_e4cfe426","line":659,"updated":"2015-05-25 03:26:54.000000000","message":"backup.container ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":659,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":660,"context_line":"        LOG.debug(\u0027delete started, backup: %(id)s, container: %(cont)s, \u0027"},{"line_number":661,"context_line":"                  \u0027prefix: %(pre)s.\u0027,"},{"line_number":662,"context_line":"                  {\u0027id\u0027: backup[\u0027id\u0027],"},{"line_number":663,"context_line":"                   \u0027cont\u0027: container,"},{"line_number":664,"context_line":"                   \u0027pre\u0027: backup[\u0027service_metadata\u0027]})"},{"line_number":665,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_c4d2a8d0","line":662,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                  \u0027prefix: %(pre)s.\u0027,"},{"line_number":662,"context_line":"                  {\u0027id\u0027: backup[\u0027id\u0027],"},{"line_number":663,"context_line":"                   \u0027cont\u0027: container,"},{"line_number":664,"context_line":"                   \u0027pre\u0027: backup[\u0027service_metadata\u0027]})"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if container is not None:"},{"line_number":667,"context_line":"            object_names \u003d []"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a4de8cda","line":664,"updated":"2015-05-25 03:26:54.000000000","message":"backup.service_metadata","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":683,"context_line":"                # Yield so other threads can run"},{"line_number":684,"context_line":"                eventlet.sleep(0)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        LOG.debug(\u0027delete %s finished.\u0027, backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_84d950f5","line":686,"updated":"2015-05-25 03:26:54.000000000","message":"backup.id ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"}],"cinder/backup/drivers/ceph.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":876,"context_line":"            self._full_backup(backup_id, volume_id, volume_file,"},{"line_number":877,"context_line":"                              volume_name, length)"},{"line_number":878,"context_line":""},{"line_number":879,"context_line":"        backup[\u0027container\u0027] \u003d self._ceph_backup_pool"},{"line_number":880,"context_line":"        backup.save(self.context)"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"        if backup_metadata:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_29ce9b5a","line":879,"updated":"2015-02-18 18:26:22.000000000","message":"Better to use dot notation, i.e. backup.container.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":822,"context_line":"                       versioned api so we should not alter it in any way here."},{"line_number":823,"context_line":"                       We must also be sure that the service that will perform"},{"line_number":824,"context_line":"                       the restore is compatible with version used."},{"line_number":825,"context_line":"        \"\"\""},{"line_number":826,"context_line":"        json_meta \u003d self.get_metadata(backup[\u0027volume_id\u0027])"},{"line_number":827,"context_line":"        if not json_meta:"},{"line_number":828,"context_line":"            LOG.debug(\"No metadata to backup for volume %s.\","}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_3c198c22","line":825,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":825,"context_line":"        \"\"\""},{"line_number":826,"context_line":"        json_meta \u003d self.get_metadata(backup[\u0027volume_id\u0027])"},{"line_number":827,"context_line":"        if not json_meta:"},{"line_number":828,"context_line":"            LOG.debug(\"No metadata to backup for volume %s.\","},{"line_number":829,"context_line":"                      backup[\u0027volume_id\u0027])"},{"line_number":830,"context_line":"            return"},{"line_number":831,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_1c1490e6","line":828,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":829,"context_line":"                      backup[\u0027volume_id\u0027])"},{"line_number":830,"context_line":"            return"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"        LOG.debug(\"Backing up metadata for volume %s.\","},{"line_number":833,"context_line":"                  backup[\u0027volume_id\u0027])"},{"line_number":834,"context_line":"        try:"},{"line_number":835,"context_line":"            with rbd_driver.RADOSClient(self) as client:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_7cea64dc","line":832,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":832,"context_line":"        LOG.debug(\"Backing up metadata for volume %s.\","},{"line_number":833,"context_line":"                  backup[\u0027volume_id\u0027])"},{"line_number":834,"context_line":"        try:"},{"line_number":835,"context_line":"            with rbd_driver.RADOSClient(self) as client:"},{"line_number":836,"context_line":"                vol_meta_backup \u003d VolumeMetadataBackup(client, backup[\u0027id\u0027])"},{"line_number":837,"context_line":"                vol_meta_backup.set(json_meta)"},{"line_number":838,"context_line":"        except exception.VolumeMetadataBackupExists as e:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_5ce56806","line":835,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        If the source volume is an RBD we will attempt to do an"},{"line_number":846,"context_line":"        incremental/differential backup, otherwise a full copy is performed."},{"line_number":847,"context_line":"        If this fails we will attempt to fall back to full copy."},{"line_number":848,"context_line":"        \"\"\""},{"line_number":849,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":850,"context_line":"        volume \u003d self.db.volume_get(self.context, backup[\u0027volume_id\u0027])"},{"line_number":851,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_1ceb70dd","line":848,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        incremental/differential backup, otherwise a full copy is performed."},{"line_number":847,"context_line":"        If this fails we will attempt to fall back to full copy."},{"line_number":848,"context_line":"        \"\"\""},{"line_number":849,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":850,"context_line":"        volume \u003d self.db.volume_get(self.context, backup[\u0027volume_id\u0027])"},{"line_number":851,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":852,"context_line":"        volume_name \u003d volume[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_fcbc14dd","line":849,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"        if self._file_is_rbd(volume_file):"},{"line_number":1051,"context_line":"            # NOTE(dosaboy): base_name here must be diff format."},{"line_number":1052,"context_line":"            rbd_exists, base_name \u003d self._rbd_image_exists(base_name,"},{"line_number":1053,"context_line":"                                                           backup[\u0027volume_id\u0027],"},{"line_number":1054,"context_line":"                                                           rados_client)"},{"line_number":1055,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_dcbf18ce","line":1052,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"            # Get the restore point. If no restore point is found, we assume"},{"line_number":1060,"context_line":"            # that the backup was not performed using diff/incremental methods"},{"line_number":1061,"context_line":"            # so we enforce full copy."},{"line_number":1062,"context_line":"            restore_point \u003d self._get_restore_point(base_name, backup[\u0027id\u0027])"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"            # If the volume we are restoring to is the volume the backup was"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_bcb21c04","line":1061,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"            # If the volume we are restoring to is the volume the backup was"},{"line_number":1065,"context_line":"            # made from, force a full restore since a diff will not work in"},{"line_number":1066,"context_line":"            # this case."},{"line_number":1067,"context_line":"            if volume[\u0027id\u0027] \u003d\u003d backup[\u0027volume_id\u0027]:"},{"line_number":1068,"context_line":"                LOG.debug(\"Destination volume is same as backup source volume \""},{"line_number":1069,"context_line":"                          \"%s - forcing full copy.\", volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_7cd14422","line":1066,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"            else:"},{"line_number":1083,"context_line":"                LOG.info(_LI(\"No restore point found for \""},{"line_number":1084,"context_line":"                             \"backup\u003d\u0027%(backup)s\u0027 of \""},{"line_number":1085,"context_line":"                             \"volume %(volume)s - forcing full copy.\"),"},{"line_number":1086,"context_line":"                         {\u0027backup\u0027: backup[\u0027id\u0027],"},{"line_number":1087,"context_line":"                          \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1088,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_5ccc4888","line":1085,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"                LOG.info(_LI(\"No restore point found for \""},{"line_number":1084,"context_line":"                             \"backup\u003d\u0027%(backup)s\u0027 of \""},{"line_number":1085,"context_line":"                             \"volume %(volume)s - forcing full copy.\"),"},{"line_number":1086,"context_line":"                         {\u0027backup\u0027: backup[\u0027id\u0027],"},{"line_number":1087,"context_line":"                          \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"        return not_allowed"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_3cc74c65","line":1086,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"        Attempts a differential restore and reverts to full copy if diff fails."},{"line_number":1095,"context_line":"        \"\"\""},{"line_number":1096,"context_line":"        volume_name \u003d volume[\u0027name\u0027]"},{"line_number":1097,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":1098,"context_line":"        backup_volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":1099,"context_line":"        length \u003d int(volume[\u0027size\u0027]) * units.Gi"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_fca3f4af","line":1096,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"        Attempts a differential restore and reverts to full copy if diff fails."},{"line_number":1095,"context_line":"        \"\"\""},{"line_number":1096,"context_line":"        volume_name \u003d volume[\u0027name\u0027]"},{"line_number":1097,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":1098,"context_line":"        backup_volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":1099,"context_line":"        length \u003d int(volume[\u0027size\u0027]) * units.Gi"},{"line_number":1100,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_dca6f8bf","line":1097,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":1098,"context_line":"        backup_volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":1099,"context_line":"        length \u003d int(volume[\u0027size\u0027]) * units.Gi"},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"        base_name \u003d self._get_backup_base_name(backup[\u0027volume_id\u0027],"},{"line_number":1102,"context_line":"                                               diff_format\u003dTrue)"},{"line_number":1103,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_bca9fc91","line":1100,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"        otherwise do nothing."},{"line_number":1130,"context_line":"        \"\"\""},{"line_number":1131,"context_line":"        try:"},{"line_number":1132,"context_line":"            with rbd_driver.RADOSClient(self) as client:"},{"line_number":1133,"context_line":"                meta_bak \u003d VolumeMetadataBackup(client, backup[\u0027id\u0027])"},{"line_number":1134,"context_line":"                meta \u003d meta_bak.get()"},{"line_number":1135,"context_line":"                if meta is not None:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_9cac00a0","line":1132,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"                if meta is not None:"},{"line_number":1136,"context_line":"                    self.put_metadata(volume_id, meta)"},{"line_number":1137,"context_line":"                else:"},{"line_number":1138,"context_line":"                    LOG.debug(\"Volume %s has no backed up metadata.\","},{"line_number":1139,"context_line":"                              backup[\u0027volume_id\u0027])"},{"line_number":1140,"context_line":"        except exception.BackupMetadataUnsupportedVersion:"},{"line_number":1141,"context_line":"            msg \u003d _(\"Metadata restore failed due to incompatible version\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_7c982478","line":1138,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1149,"context_line":"        \"\"\""},{"line_number":1150,"context_line":"        target_volume \u003d self.db.volume_get(self.context, volume_id)"},{"line_number":1151,"context_line":"        LOG.debug(\u0027Starting restore from Ceph backup\u003d%(src)s to \u0027"},{"line_number":1152,"context_line":"                  \u0027volume\u003d%(dest)s\u0027,"},{"line_number":1153,"context_line":"                  {\u0027src\u0027: backup[\u0027id\u0027], \u0027dest\u0027: target_volume[\u0027name\u0027]})"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_5c93285b","line":1152,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"            raise"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    def delete(self, backup):"},{"line_number":1177,"context_line":"        \"\"\"Delete the given backup from Ceph object store.\"\"\""},{"line_number":1178,"context_line":"        LOG.debug(\u0027Delete started for backup\u003d%s\u0027, backup[\u0027id\u0027])"},{"line_number":1179,"context_line":""},{"line_number":1180,"context_line":"        delete_failed \u003d False"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_1c993079","line":1177,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1178,"context_line":"        LOG.debug(\u0027Delete started for backup\u003d%s\u0027, backup[\u0027id\u0027])"},{"line_number":1179,"context_line":""},{"line_number":1180,"context_line":"        delete_failed \u003d False"},{"line_number":1181,"context_line":"        try:"},{"line_number":1182,"context_line":"            self._try_delete_base_image(backup[\u0027id\u0027], backup[\u0027volume_id\u0027])"},{"line_number":1183,"context_line":"        except self.rbd.ImageNotFound:"},{"line_number":1184,"context_line":"            LOG.warning("}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_fc8ad419","line":1181,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"        except self.rbd.ImageNotFound:"},{"line_number":1184,"context_line":"            LOG.warning("},{"line_number":1185,"context_line":"                _LW(\"RBD image for backup %(backup)s of volume %(volume)s \""},{"line_number":1186,"context_line":"                    \"not found. Deleting backup metadata.\"),"},{"line_number":1187,"context_line":"                {\u0027backup\u0027: backup[\u0027id\u0027], \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1188,"context_line":"            delete_failed \u003d True"},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_bc97bc38","line":1186,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1187,"context_line":"                {\u0027backup\u0027: backup[\u0027id\u0027], \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1188,"context_line":"            delete_failed \u003d True"},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"        with rbd_driver.RADOSClient(self) as client:"},{"line_number":1191,"context_line":"            VolumeMetadataBackup(client, backup[\u0027id\u0027]).remove_if_exists()"},{"line_number":1192,"context_line":""},{"line_number":1193,"context_line":"        if delete_failed:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_dc94b837","line":1190,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"        if delete_failed:"},{"line_number":1194,"context_line":"            LOG.info(_LI(\"Delete of backup \u0027%(backup)s\u0027 \""},{"line_number":1195,"context_line":"                         \"for volume \u0027%(volume)s\u0027 \""},{"line_number":1196,"context_line":"                         \"finished with warning.\"),"},{"line_number":1197,"context_line":"                     {\u0027backup\u0027: backup[\u0027id\u0027], \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1198,"context_line":"        else:"},{"line_number":1199,"context_line":"            LOG.debug(\"Delete of backup \u0027%(backup)s\u0027 for volume \""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_fc91b447","line":1196,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"                     {\u0027backup\u0027: backup[\u0027id\u0027], \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1198,"context_line":"        else:"},{"line_number":1199,"context_line":"            LOG.debug(\"Delete of backup \u0027%(backup)s\u0027 for volume \""},{"line_number":1200,"context_line":"                      \"\u0027%(volume)s\u0027 finished.\","},{"line_number":1201,"context_line":"                      {\u0027backup\u0027: backup[\u0027id\u0027], \u0027volume\u0027: backup[\u0027volume_id\u0027]})"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_3c750c31","line":1200,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"}],"cinder/backup/drivers/swift.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                  {\u0027container\u0027: container, \u0027backup_id\u0027: backup[\u0027id\u0027]})"},{"line_number":194,"context_line":"        if container is None:"},{"line_number":195,"context_line":"            container \u003d CONF.backup_swift_container"},{"line_number":196,"context_line":"            backup[\u0027container\u0027] \u003d container"},{"line_number":197,"context_line":"            backup.save(context)"},{"line_number":198,"context_line":"        # NOTE(gfidente): accordingly to the Object Storage API reference, we"},{"line_number":199,"context_line":"        # do not need to check if a container already exists, container PUT"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c9fa5f76","line":196,"updated":"2015-02-18 18:26:22.000000000","message":"backup.container \u003d CONF.backup_swift_container","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"3056298f938395e6e7dbdd48ef8b3e3d22661145","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                  {\u0027container\u0027: container, \u0027backup_id\u0027: backup[\u0027id\u0027]})"},{"line_number":194,"context_line":"        if container is None:"},{"line_number":195,"context_line":"            container \u003d CONF.backup_swift_container"},{"line_number":196,"context_line":"            backup[\u0027container\u0027] \u003d container"},{"line_number":197,"context_line":"            backup.save(context)"},{"line_number":198,"context_line":"        # NOTE(gfidente): accordingly to the Object Storage API reference, we"},{"line_number":199,"context_line":"        # do not need to check if a container already exists, container PUT"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_74d211d2","line":196,"in_reply_to":"da86d52c_c9fa5f76","updated":"2015-02-19 12:27:42.000000000","message":"We\u0027re using container variable in the outer scope, so this assignment is needed.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                                 volume_meta)"},{"line_number":366,"context_line":"        except socket.error as err:"},{"line_number":367,"context_line":"            raise exception.SwiftConnectionFailed(reason\u003derr)"},{"line_number":368,"context_line":"        backup[\u0027object_count\u0027] \u003d object_id"},{"line_number":369,"context_line":"        backup.save(self.context)"},{"line_number":370,"context_line":"        LOG.debug(\u0027backup %s finished.\u0027 % backup[\u0027id\u0027])"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_a930cb56","line":368,"updated":"2015-02-18 18:26:22.000000000","message":"Dot notation is better.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                                         starting_backoff\u003dself.swift_backoff)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _create_container(self, context, backup):"},{"line_number":190,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":191,"context_line":"        LOG.debug(\u0027_create_container started, container: %(container)s,\u0027"},{"line_number":192,"context_line":"                  \u0027backup: %(backup_id)s\u0027 %"},{"line_number":193,"context_line":"                  {\u0027container\u0027: container, \u0027backup_id\u0027: backup[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_5b9e8357","line":190,"updated":"2015-02-23 21:39:23.000000000","message":"backup.container","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        container \u003d backup[\u0027container\u0027]"},{"line_number":191,"context_line":"        LOG.debug(\u0027_create_container started, container: %(container)s,\u0027"},{"line_number":192,"context_line":"                  \u0027backup: %(backup_id)s\u0027 %"},{"line_number":193,"context_line":"                  {\u0027container\u0027: container, \u0027backup_id\u0027: backup[\u0027id\u0027]})"},{"line_number":194,"context_line":"        if container is None:"},{"line_number":195,"context_line":"            container \u003d CONF.backup_swift_container"},{"line_number":196,"context_line":"            backup.container \u003d container"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_9b78fb2c","line":193,"updated":"2015-02-23 21:39:23.000000000","message":"backup.id","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"}],"cinder/backup/drivers/tsm.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        service_metadata \u003d {\u0027backup_mode\u0027: backup_mode,"},{"line_number":383,"context_line":"                            \u0027backup_path\u0027: backup_path}"},{"line_number":384,"context_line":"        # TODO(dulek): service_metadata should be saved as DictField?"},{"line_number":385,"context_line":"        backup[\u0027service_metadata\u0027] \u003d json.dumps(service_metadata)"},{"line_number":386,"context_line":"        backup.save(self.context)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_491cafc2","line":385,"updated":"2015-02-18 18:26:22.000000000","message":"How is \u0027service_metadata\u0027 accessed elsewhere?  I agree it might be better as a DicField too.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"20fcdf51feda2d03aa42762ca5be5218bcb4a382","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                    \"not yet support this feature.\")"},{"line_number":365,"context_line":"            raise exception.InvalidBackup(reason\u003dmsg)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        backup_id \u003d backup[\u0027id\u0027]"},{"line_number":368,"context_line":"        volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":369,"context_line":"        volume_path, backup_mode \u003d _get_volume_realpath(volume_file,"},{"line_number":370,"context_line":"                                                        volume_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_dbc0b32c","line":367,"updated":"2015-02-23 21:39:23.000000000","message":"You can remove backup_id and just use backup.id directly.   Same with backup.volume_id.","commit_id":"790ef6b055bfb5b3dbc237ccae97a5b6292dc8a4"}],"cinder/backup/manager.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        driver.set_initialized()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _update_backup_error(self, backup, context, err):"},{"line_number":188,"context_line":"        backup[\u0027status\u0027] \u003d \u0027error\u0027"},{"line_number":189,"context_line":"        backup[\u0027fail_reason\u0027] \u003d err"},{"line_number":190,"context_line":"        backup.save(context)"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_296a1b1a","line":188,"updated":"2015-02-18 18:26:22.000000000","message":"Dot notation here and below","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        LOG.info(_LI(\u0027Export record started, backup: %s.\u0027), backup_id)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        backup \u003d objects.Backup.get_by_id(context, backup_id)"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        expected_status \u003d \u0027available\u0027"},{"line_number":490,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c99b3f15","line":487,"updated":"2015-02-18 18:26:22.000000000","message":"You might want to have a \"def _get_backup(self, context, backup_id)\" method to grab the backup object by id, then you can handle exceptions and such in that method.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def create_backup(self, context, backup):"},{"line_number":239,"context_line":"        \"\"\"Create volume backups using configured backup service.\"\"\""},{"line_number":240,"context_line":"        volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":241,"context_line":"        volume \u003d self.db.volume_get(context, volume_id)"},{"line_number":242,"context_line":"        LOG.info(_LI(\u0027Create backup started, backup: %(backup_id)s \u0027"},{"line_number":243,"context_line":"                     \u0027volume: %(volume_id)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_49b75dd8","line":240,"updated":"2015-03-03 14:19:01.000000000","message":"backup.volume_id","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def create_backup(self, context, backup):"},{"line_number":239,"context_line":"        \"\"\"Create volume backups using configured backup service.\"\"\""},{"line_number":240,"context_line":"        volume_id \u003d backup[\u0027volume_id\u0027]"},{"line_number":241,"context_line":"        volume \u003d self.db.volume_get(context, volume_id)"},{"line_number":242,"context_line":"        LOG.info(_LI(\u0027Create backup started, backup: %(backup_id)s \u0027"},{"line_number":243,"context_line":"                     \u0027volume: %(volume_id)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_eac1fa54","line":240,"in_reply_to":"ba7be1f8_49b75dd8","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            raise exception.InvalidVolume(reason\u003derr)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        expected_status \u003d \u0027creating\u0027"},{"line_number":266,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":267,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":268,"context_line":"            err \u003d _(\u0027Create backup aborted, expected backup status \u0027"},{"line_number":269,"context_line":"                    \u0027%(expected_status)s but got %(actual_status)s.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e9c73143","line":266,"updated":"2015-03-03 14:19:01.000000000","message":"backup.status","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            raise exception.InvalidVolume(reason\u003derr)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        expected_status \u003d \u0027creating\u0027"},{"line_number":266,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":267,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":268,"context_line":"            err \u003d _(\u0027Create backup aborted, expected backup status \u0027"},{"line_number":269,"context_line":"                    \u0027%(expected_status)s but got %(actual_status)s.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_aaec62f4","line":266,"in_reply_to":"ba7be1f8_e9c73143","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":374,"context_line":"                self.db.volume_update(context, volume_id,"},{"line_number":375,"context_line":"                                      {\u0027status\u0027: \u0027error_restoring\u0027})"},{"line_number":376,"context_line":"                backup[\u0027status\u0027] \u003d \u0027available\u0027"},{"line_number":377,"context_line":"                backup.save(context)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        self.db.volume_update(context, volume_id, {\u0027status\u0027: \u0027available\u0027})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_69e341d9","line":376,"updated":"2015-03-03 14:19:01.000000000","message":"backup.status","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":374,"context_line":"                self.db.volume_update(context, volume_id,"},{"line_number":375,"context_line":"                                      {\u0027status\u0027: \u0027error_restoring\u0027})"},{"line_number":376,"context_line":"                backup[\u0027status\u0027] \u003d \u0027available\u0027"},{"line_number":377,"context_line":"                backup.save(context)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        self.db.volume_update(context, volume_id, {\u0027status\u0027: \u0027available\u0027})"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_6ae6ea16","line":376,"in_reply_to":"ba7be1f8_69e341d9","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        backup.save(context)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        expected_status \u003d \u0027deleting\u0027"},{"line_number":406,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":407,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":408,"context_line":"            err \u003d _(\u0027Delete_backup aborted, expected backup status \u0027"},{"line_number":409,"context_line":"                    \u0027%(expected_status)s but got %(actual_status)s.\u0027) \\"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_c9d18dfc","line":406,"updated":"2015-03-03 14:19:01.000000000","message":"backup.status","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        backup.save(context)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        expected_status \u003d \u0027deleting\u0027"},{"line_number":406,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":407,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":408,"context_line":"            err \u003d _(\u0027Delete_backup aborted, expected backup status \u0027"},{"line_number":409,"context_line":"                    \u0027%(expected_status)s but got %(actual_status)s.\u0027) \\"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_2ae152fe","line":406,"in_reply_to":"ba7be1f8_c9d18dfc","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        try:"},{"line_number":437,"context_line":"            reserve_opts \u003d {"},{"line_number":438,"context_line":"                \u0027backups\u0027: -1,"},{"line_number":439,"context_line":"                \u0027backup_gigabytes\u0027: -backup[\u0027size\u0027],"},{"line_number":440,"context_line":"            }"},{"line_number":441,"context_line":"            reservations \u003d QUOTAS.reserve(context,"},{"line_number":442,"context_line":"                                          project_id\u003dbackup[\u0027project_id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_89fb157a","line":439,"updated":"2015-03-03 14:19:01.000000000","message":"backup.size","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        try:"},{"line_number":437,"context_line":"            reserve_opts \u003d {"},{"line_number":438,"context_line":"                \u0027backups\u0027: -1,"},{"line_number":439,"context_line":"                \u0027backup_gigabytes\u0027: -backup[\u0027size\u0027],"},{"line_number":440,"context_line":"            }"},{"line_number":441,"context_line":"            reservations \u003d QUOTAS.reserve(context,"},{"line_number":442,"context_line":"                                          project_id\u003dbackup[\u0027project_id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_cad5161d","line":439,"in_reply_to":"ba7be1f8_89fb157a","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":439,"context_line":"                \u0027backup_gigabytes\u0027: -backup[\u0027size\u0027],"},{"line_number":440,"context_line":"            }"},{"line_number":441,"context_line":"            reservations \u003d QUOTAS.reserve(context,"},{"line_number":442,"context_line":"                                          project_id\u003dbackup[\u0027project_id\u0027],"},{"line_number":443,"context_line":"                                          **reserve_opts)"},{"line_number":444,"context_line":"        except Exception:"},{"line_number":445,"context_line":"            reservations \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_09ef25b2","line":442,"updated":"2015-03-03 14:19:01.000000000","message":"backup.project_id","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":439,"context_line":"                \u0027backup_gigabytes\u0027: -backup[\u0027size\u0027],"},{"line_number":440,"context_line":"            }"},{"line_number":441,"context_line":"            reservations \u003d QUOTAS.reserve(context,"},{"line_number":442,"context_line":"                                          project_id\u003dbackup[\u0027project_id\u0027],"},{"line_number":443,"context_line":"                                          **reserve_opts)"},{"line_number":444,"context_line":"        except Exception:"},{"line_number":445,"context_line":"            reservations \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_aa1542e6","line":442,"in_reply_to":"ba7be1f8_09ef25b2","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        LOG.info(_LI(\u0027Export record started, backup: %s.\u0027), backup.id)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        expected_status \u003d \u0027available\u0027"},{"line_number":485,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":486,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":487,"context_line":"            err \u003d (_(\u0027Export backup aborted, expected backup status \u0027"},{"line_number":488,"context_line":"                     \u0027%(expected_status)s but got %(actual_status)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_69318159","line":485,"updated":"2015-03-03 14:19:01.000000000","message":"backup.status","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        LOG.info(_LI(\u0027Export record started, backup: %s.\u0027), backup.id)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        expected_status \u003d \u0027available\u0027"},{"line_number":485,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":486,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":487,"context_line":"            err \u003d (_(\u0027Export backup aborted, expected backup status \u0027"},{"line_number":488,"context_line":"                     \u0027%(expected_status)s but got %(actual_status)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_6a1fca08","line":485,"in_reply_to":"ba7be1f8_69318159","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":630,"context_line":"                LOG.exception(_LE(\"Backup driver has not been initialized\"))"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        backup_service \u003d self._map_service_to_driver(backup[\u0027service\u0027])"},{"line_number":633,"context_line":"        LOG.info(_LI(\u0027Backup service: %s.\u0027), backup_service)"},{"line_number":634,"context_line":"        if backup_service is not None:"},{"line_number":635,"context_line":"            configured_service \u003d self.driver_name"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_097485fc","line":632,"updated":"2015-03-03 14:19:01.000000000","message":"backup.service","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":630,"context_line":"                LOG.exception(_LE(\"Backup driver has not been initialized\"))"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        backup_service \u003d self._map_service_to_driver(backup[\u0027service\u0027])"},{"line_number":633,"context_line":"        LOG.info(_LI(\u0027Backup service: %s.\u0027), backup_service)"},{"line_number":634,"context_line":"        if backup_service is not None:"},{"line_number":635,"context_line":"            configured_service \u003d self.driver_name"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_0a256e5b","line":632,"in_reply_to":"ba7be1f8_097485fc","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":665,"context_line":"                else:"},{"line_number":666,"context_line":"                    if (status \u003d\u003d \u0027error\u0027 or"},{"line_number":667,"context_line":"                        (status \u003d\u003d \u0027available\u0027 and"},{"line_number":668,"context_line":"                            backup[\u0027status\u0027] \u003d\u003d \u0027restoring\u0027)):"},{"line_number":669,"context_line":"                        backup.status \u003d status"},{"line_number":670,"context_line":"                        backup.save(context)"},{"line_number":671,"context_line":"            except exception.InvalidBackup:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e9d811f1","line":668,"updated":"2015-03-03 14:19:01.000000000","message":"backup.status","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":665,"context_line":"                else:"},{"line_number":666,"context_line":"                    if (status \u003d\u003d \u0027error\u0027 or"},{"line_number":667,"context_line":"                        (status \u003d\u003d \u0027available\u0027 and"},{"line_number":668,"context_line":"                            backup[\u0027status\u0027] \u003d\u003d \u0027restoring\u0027)):"},{"line_number":669,"context_line":"                        backup.status \u003d status"},{"line_number":670,"context_line":"                        backup.save(context)"},{"line_number":671,"context_line":"            except exception.InvalidBackup:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_ea33baa8","line":668,"in_reply_to":"ba7be1f8_e9d811f1","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        # operations on restart (rather than simply resetting)"},{"line_number":231,"context_line":"        backups \u003d objects.BackupList.get_all_by_host(ctxt, self.host)"},{"line_number":232,"context_line":"        for backup in backups:"},{"line_number":233,"context_line":"            if backup[\u0027status\u0027] \u003d\u003d \u0027creating\u0027:"},{"line_number":234,"context_line":"                LOG.info(_LI(\u0027Resetting backup %s to error (was creating).\u0027),"},{"line_number":235,"context_line":"                         backup[\u0027id\u0027])"},{"line_number":236,"context_line":"                err \u003d \u0027incomplete backup reset on manager restart\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_848710b4","line":233,"updated":"2015-05-25 03:26:54.000000000","message":"backup.status ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                         backup[\u0027id\u0027])"},{"line_number":236,"context_line":"                err \u003d \u0027incomplete backup reset on manager restart\u0027"},{"line_number":237,"context_line":"                self._update_backup_error(backup, ctxt, err)"},{"line_number":238,"context_line":"            if backup[\u0027status\u0027] \u003d\u003d \u0027restoring\u0027:"},{"line_number":239,"context_line":"                LOG.info(_LI(\u0027Resetting backup %s to \u0027"},{"line_number":240,"context_line":"                             \u0027available (was restoring).\u0027),"},{"line_number":241,"context_line":"                         backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_6492d4f7","line":238,"updated":"2015-05-25 03:26:54.000000000","message":"ditto","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                         backup[\u0027id\u0027])"},{"line_number":242,"context_line":"                backup.status \u003d \u0027available\u0027"},{"line_number":243,"context_line":"                backup.save()"},{"line_number":244,"context_line":"            if backup[\u0027status\u0027] \u003d\u003d \u0027deleting\u0027:"},{"line_number":245,"context_line":"                LOG.info(_LI(\u0027Resuming delete on backup: %s.\u0027), backup[\u0027id\u0027])"},{"line_number":246,"context_line":"                self.delete_backup(ctxt, backup)"},{"line_number":247,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_448d98d1","line":244,"updated":"2015-05-25 03:26:54.000000000","message":"ditto","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            raise exception.InvalidVolume(reason\u003derr)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        expected_status \u003d \u0027restoring\u0027"},{"line_number":337,"context_line":"        actual_status \u003d backup[\u0027status\u0027]"},{"line_number":338,"context_line":"        if actual_status !\u003d expected_status:"},{"line_number":339,"context_line":"            err \u003d (_(\u0027Restore backup aborted: expected backup status \u0027"},{"line_number":340,"context_line":"                     \u0027%(expected_status)s but got %(actual_status)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_24bf3c62","line":337,"updated":"2015-05-25 03:26:54.000000000","message":"backup.status ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":353,"context_line":"                      \u0027backup_id\u0027: backup[\u0027id\u0027],"},{"line_number":354,"context_line":"                      \u0027backup_size\u0027: backup[\u0027size\u0027]})"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        backup_service \u003d self._map_service_to_driver(backup[\u0027service\u0027])"},{"line_number":357,"context_line":"        configured_service \u003d self.driver_name"},{"line_number":358,"context_line":"        if backup_service !\u003d configured_service:"},{"line_number":359,"context_line":"            err \u003d _(\u0027Restore backup aborted, the backup service currently\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_dc0a78d1","line":356,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"1eb732fc3a5fa83b52c0ba6285f1aa451e723abb","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            self._update_backup_error(backup, context, err)"},{"line_number":423,"context_line":"            raise exception.InvalidBackup(reason\u003derr)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        backup_service \u003d self._map_service_to_driver(backup[\u0027service\u0027])"},{"line_number":426,"context_line":"        if backup_service is not None:"},{"line_number":427,"context_line":"            configured_service \u003d self.driver_name"},{"line_number":428,"context_line":"            if backup_service !\u003d configured_service:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_1cfdb0b0","line":425,"updated":"2015-05-25 13:41:14.000000000","message":"Ditto as Tom\u0027s.","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"7b912b332038b5879e4bb71e235f4d8fe7c7f0ff","unresolved":false,"context_lines":[{"line_number":656,"context_line":"            # Verify backup"},{"line_number":657,"context_line":"            try:"},{"line_number":658,"context_line":"                # check whether the backup is ok or not"},{"line_number":659,"context_line":"                if status \u003d\u003d \u0027available\u0027 and backup[\u0027status\u0027] !\u003d \u0027restoring\u0027:"},{"line_number":660,"context_line":"                    # check whether we could verify the backup is ok or not"},{"line_number":661,"context_line":"                    if isinstance(backup_service,"},{"line_number":662,"context_line":"                                  driver.BackupDriverWithVerify):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a016987_a48c4cda","line":659,"updated":"2015-05-25 03:26:54.000000000","message":"backup.status ?","commit_id":"20c0424077a46f0a8c339b7e691cd5639836c1db"}],"cinder/objects/backup.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"7f8e357c1180b4fd26ab8b5a8e86bb466eb5a884","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027display_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027display_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # TODO(dulek): Make it fields.DictOfStringsField()?"},{"line_number":53,"context_line":"        \u0027service_metadata\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027service\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_8931470d","line":52,"updated":"2015-02-18 18:26:22.000000000","message":"How is \u0027service_metadata\u0027 accessed elsewhere? I agree it might be better as a DicField too.","commit_id":"a9edaf5f1228edd0dba6b0553644a4a662c70e53"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"5679313ac45cf807e990b4af78780b1d73161728","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        \u0027user_id\u0027: fields.UUIDField(),"},{"line_number":39,"context_line":"        \u0027project_id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_cb8eee78","line":36,"updated":"2015-03-06 19:26:46.000000000","message":"I found this out the hard way :(  But if you have properties that are not part of the model, but accessed as a property below, then you need to add it to the object as:\n\nobj_extra_fields \u003d [\u0027name\u0027]\n\nAnd this field needs to be removed from here.\n\nI have a patch up to fix this (as well as make the get_all_snapshots work) - https://review.openstack.org/#/c/161077.  This was the reason I was having trouble with have SnapshotList working in my previous patch.","commit_id":"cf8a2ac2ea486dc20e2046df22d6d41f4df25179"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"892f72c61a5fda9ad82287d45ee710095c2d50f2","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    fields \u003d {"},{"line_number":35,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        \u0027user_id\u0027: fields.UUIDField(),"},{"line_number":39,"context_line":"        \u0027project_id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_147f1067","line":36,"in_reply_to":"9a80dd14_cb8eee78","updated":"2015-03-09 16:30:14.000000000","message":"Done","commit_id":"cf8a2ac2ea486dc20e2046df22d6d41f4df25179"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"5626942656d64e291e9087fe5c8b8a160b95df17","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return CONF.backup_name_template % self.id"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":67,"context_line":"        super(Backup, self).__init__(*args, **kwargs)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":70,"context_line":"        \"\"\"Make an object representation compatible with a target version.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_ceea6073","line":67,"updated":"2015-03-13 17:46:17.000000000","message":"Empty constructors don\u0027t seem so useful ? Do we really need it ?","commit_id":"a4cce62ba5706c1edd9f1f0fd04afe81ba458e0e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"44ca59f5b3b611a5c96e1069ceb1a43741eab9e2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return cls._from_db_object(context, cls(context), db_backup)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @base.remotable"},{"line_number":88,"context_line":"    def create(self, context):"},{"line_number":89,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":90,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":91,"context_line":"                                              reason\u003d\u0027already created\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_9a451d19","line":88,"updated":"2015-05-14 02:00:35.000000000","message":"With the latest change to use oslo_versionedobjects, we should now be using the context (i.e. self._context) that is stashed in the object, instead of using and accepting the context passed in.  Please remove the context argument for create, delete, and save methods.  We should no longer be passing context into these methods, but instead use the context stashed in the object, i.e. self._context.  Thank you","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"d81188b62cdc704ac2ca0254c2f06f9eb2b3bb34","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return cls._from_db_object(context, cls(context), db_backup)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @base.remotable"},{"line_number":88,"context_line":"    def create(self, context):"},{"line_number":89,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":90,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":91,"context_line":"                                              reason\u003d\u0027already created\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_48a13ff7","line":88,"in_reply_to":"7a016987_9a451d19","updated":"2015-05-22 19:15:21.000000000","message":"Done","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"c296892bcff994d88d297cf7f9a9c529fba5e7bb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return cls._from_db_object(context, cls(context), db_backup)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @base.remotable"},{"line_number":88,"context_line":"    def create(self, context):"},{"line_number":89,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":90,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":91,"context_line":"                                              reason\u003d\u0027already created\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_0afb9b7a","line":88,"in_reply_to":"7a016987_9a451d19","updated":"2015-05-19 07:15:23.000000000","message":"Thank you, Thang. Would you paste a link to example code or related reviews? For now I find that objects/snapshot.py is using self._context.","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"f66f62e21d04a47247492665ae4884c31beb5037","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    }"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @base.remotable_classmethod"},{"line_number":120,"context_line":"    def get_all(cls, context, filters\u003dNone):"},{"line_number":121,"context_line":"        backups \u003d db.backup_get_all(context, filters)"},{"line_number":122,"context_line":"        return base.obj_make_list(context, cls(context), objects.Backup,"},{"line_number":123,"context_line":"                                  backups)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_9a2abd2b","line":120,"updated":"2015-05-14 02:01:45.000000000","message":"It is fine to have the context passed in for remotable_classmethod.  We only need to remove the context as a parameter for remotable methods.","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":14305,"name":"Yuriy Nesenenko","email":"ynesenenko@mirantis.com","username":"yuriy_n"},"change_message_id":"86ea1f484fad472ca7fa283d0255dc5d9fa429f5","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @base.remotable_classmethod"},{"line_number":126,"context_line":"    def get_all_by_host(cls, context, host):"},{"line_number":127,"context_line":"        backups \u003d db.backup_get_all_by_host(context, host)"},{"line_number":128,"context_line":"        return base.obj_make_list(context, cls(context), objects.Backup,"},{"line_number":129,"context_line":"                                  backups)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_74e53436","line":127,"updated":"2015-05-20 14:07:40.000000000","message":"Please, add filter (filters\u003dNone) here too.","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"d81188b62cdc704ac2ca0254c2f06f9eb2b3bb34","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @base.remotable_classmethod"},{"line_number":126,"context_line":"    def get_all_by_host(cls, context, host):"},{"line_number":127,"context_line":"        backups \u003d db.backup_get_all_by_host(context, host)"},{"line_number":128,"context_line":"        return base.obj_make_list(context, cls(context), objects.Backup,"},{"line_number":129,"context_line":"                                  backups)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a016987_38b658f9","line":127,"in_reply_to":"7a016987_74e53436","updated":"2015-05-22 19:15:21.000000000","message":"Why? This argument isn\u0027t present in backup_get_all_by_host, so what\u0027s the point?","commit_id":"d7517f57724a5c5f7142db8fb53e0833dd65e518"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"8ec79fdc23d167bbbd591043cc2d383f763edaba","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        db_backup \u003d db.backup_create(self._context, updates)"},{"line_number":96,"context_line":"        self._from_db_object(self._context, self, db_backup)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def save(self):"},{"line_number":99,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":100,"context_line":"        if updates:"},{"line_number":101,"context_line":"            db.backup_update(self._context, self.id, updates)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_1fd6d84e","line":98,"updated":"2015-05-23 03:31:55.000000000","message":"Missed this one earlier.  Could you add the @base.remotable decorator here.  Thanks","commit_id":"5ce5d140c22df3911a7f6f6c2d4e36d8a5c17ec2"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"ddf14843ba7da3ac224fc0419d6bf4ab553a9a6a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        db_backup \u003d db.backup_create(self._context, updates)"},{"line_number":96,"context_line":"        self._from_db_object(self._context, self, db_backup)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def save(self):"},{"line_number":99,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":100,"context_line":"        if updates:"},{"line_number":101,"context_line":"            db.backup_update(self._context, self.id, updates)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_f8de723c","line":98,"in_reply_to":"7a016987_1fd6d84e","updated":"2015-05-23 15:22:46.000000000","message":"I added it in for you.","commit_id":"5ce5d140c22df3911a7f6f6c2d4e36d8a5c17ec2"}],"cinder/tests/test_backup_tsm.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                  \u0027volume_id\u0027: \u00271234-5678-1234-8888\u0027,"},{"line_number":264,"context_line":"                  \u0027service_metadata\u0027: service_metadata,"},{"line_number":265,"context_line":"                  \u0027user_id\u0027: \u0027user-id\u0027,"},{"line_number":266,"context_line":"                  \u0027project_id\u0027: \u0027project-id\u0027}"},{"line_number":267,"context_line":"        return db.backup_create(self.ctxt, backup)[\u0027id\u0027]"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def test_backup_image(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_5bc72098","line":266,"updated":"2015-03-03 14:19:01.000000000","message":"Missing comma at the end of for dict - http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                  \u0027volume_id\u0027: \u00271234-5678-1234-8888\u0027,"},{"line_number":264,"context_line":"                  \u0027service_metadata\u0027: service_metadata,"},{"line_number":265,"context_line":"                  \u0027user_id\u0027: \u0027user-id\u0027,"},{"line_number":266,"context_line":"                  \u0027project_id\u0027: \u0027project-id\u0027}"},{"line_number":267,"context_line":"        return db.backup_create(self.ctxt, backup)[\u0027id\u0027]"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def test_backup_image(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_aafe22ac","line":266,"in_reply_to":"ba7be1f8_5bc72098","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"}],"cinder/tests/test_cmd.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":567,"context_line":"                  \u0027status\u0027: \u0027fake-status\u0027,"},{"line_number":568,"context_line":"                  \u0027size\u0027: 123,"},{"line_number":569,"context_line":"                  \u0027object_count\u0027: 1,"},{"line_number":570,"context_line":"                  \u0027volume_id\u0027: \u0027fake-volume-id\u0027}"},{"line_number":571,"context_line":"        backup_get_all.return_value \u003d [backup]"},{"line_number":572,"context_line":"        with mock.patch(\u0027sys.stdout\u0027, new\u003dStringIO.StringIO()) as fake_out:"},{"line_number":573,"context_line":"            hdr \u003d (\u0027%-32s\\t%-32s\\t%-32s\\t%-24s\\t%-24s\\t%-12s\\t%-12s\\t%-12s\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_1b38489f","line":570,"updated":"2015-03-03 14:19:01.000000000","message":"Ditto - http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":567,"context_line":"                  \u0027status\u0027: \u0027fake-status\u0027,"},{"line_number":568,"context_line":"                  \u0027size\u0027: 123,"},{"line_number":569,"context_line":"                  \u0027object_count\u0027: 1,"},{"line_number":570,"context_line":"                  \u0027volume_id\u0027: \u0027fake-volume-id\u0027}"},{"line_number":571,"context_line":"        backup_get_all.return_value \u003d [backup]"},{"line_number":572,"context_line":"        with mock.patch(\u0027sys.stdout\u0027, new\u003dStringIO.StringIO()) as fake_out:"},{"line_number":573,"context_line":"            hdr \u003d (\u0027%-32s\\t%-32s\\t%-32s\\t%-24s\\t%-24s\\t%-12s\\t%-12s\\t%-12s\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_aabf02a9","line":570,"in_reply_to":"ba7be1f8_1b38489f","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"}],"tools/lintstack.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"4d1428af93756ebb18122620fceb8e361cad0272","unresolved":false,"context_lines":[{"line_number":63,"context_line":"objects_ignore_messages \u003d ["},{"line_number":64,"context_line":"    \"No value passed for parameter \u0027id\u0027 in function call\","},{"line_number":65,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Snapshot\u0027 member\","},{"line_number":66,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\","},{"line_number":67,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Backup\u0027 member\","},{"line_number":68,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027BackupList\u0027 member\","},{"line_number":69,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_db68708a","line":66,"updated":"2015-03-03 14:19:01.000000000","message":"Backups had SnapshotList?","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8cd7606a23fcc3ed09bfe20e5593a933aba4269e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"objects_ignore_messages \u003d ["},{"line_number":64,"context_line":"    \"No value passed for parameter \u0027id\u0027 in function call\","},{"line_number":65,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Snapshot\u0027 member\","},{"line_number":66,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\","},{"line_number":67,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Backup\u0027 member\","},{"line_number":68,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027BackupList\u0027 member\","},{"line_number":69,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_6ac98a58","line":66,"in_reply_to":"ba7be1f8_db68708a","updated":"2015-03-06 15:14:29.000000000","message":"Done","commit_id":"3de43c5c63055f804db9fa7b294d53c4258198c3"}]}
