)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11224,"name":"Swami Reddy","email":"swamireddy@gmail.com","username":"swamireddy"},"change_message_id":"3f57f3d39c1705446272d1edca1f2a6a839e8eba","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Today we can backup a volume, but not a snapshot."},{"line_number":10,"context_line":"This patch adds support to backup snapshots and"},{"line_number":11,"context_line":"provide another layer of data protection for the"},{"line_number":12,"context_line":"user."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"implements blueprint backup-snapshots"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7a740942_088754b6","line":12,"updated":"2015-12-04 09:19:09.000000000","message":"Please add the \"DocImpact\" flag","commit_id":"a21915079c6c95b388a466d109c43ab530b2beb2"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"6951ceeb3a22abc0ce630bc803c211b2e4a7ecb7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Today we can backup a volume, but not a snapshot."},{"line_number":10,"context_line":"This patch adds support to backup snapshots and"},{"line_number":11,"context_line":"provide another layer of data protection for the"},{"line_number":12,"context_line":"user."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"implements blueprint backup-snapshots"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7a740942_2c624fae","line":12,"in_reply_to":"7a740942_088754b6","updated":"2015-12-04 15:40:26.000000000","message":"Done","commit_id":"a21915079c6c95b388a466d109c43ab530b2beb2"},{"author":{"_account_id":19371,"name":"Digvijay Ukirde","username":"digvijay-ukirde","inactive":true},"change_message_id":"d62c9da5a43b37be4102bf9c1c0028e7c88a7c19","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Merge Of:   9431bc15 (Merge \"Change the format of some inconsistent docstring\")"},{"line_number":2,"context_line":"            b285cac6 (Pass volume_id in request_spec for manage_existing)"},{"line_number":3,"context_line":"Author:     Jenkins \u003cjenkins@review.openstack.org\u003e"},{"line_number":4,"context_line":"AuthorDate: 2015-12-17 22:05:29 +0000"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3a7e1126_f445c1b2","side":"PARENT","line":1,"updated":"2015-12-18 07:17:53.000000000","message":"ha","commit_id":"0535e65c201eb82a4a524105c2c53ef297e77dfa"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"864337d43352efc589c2053710bf15cd92c72e47","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Merge Of:   9431bc15 (Merge \"Change the format of some inconsistent docstring\")"},{"line_number":2,"context_line":"            b285cac6 (Pass volume_id in request_spec for manage_existing)"},{"line_number":3,"context_line":"Author:     Jenkins \u003cjenkins@review.openstack.org\u003e"},{"line_number":4,"context_line":"AuthorDate: 2015-12-17 22:05:29 +0000"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3a7e1126_ad2d9296","side":"PARENT","line":1,"in_reply_to":"3a7e1126_f445c1b2","updated":"2015-12-18 15:55:22.000000000","message":"What do you mean?","commit_id":"0535e65c201eb82a4a524105c2c53ef297e77dfa"}],"cinder/backup/api.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3b150e0a175b5e5fd1c0c996316e66b1dc07d29d","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        elif volume[\u0027status\u0027] in [\"in-use\"] and not snapshot_id and not force:"},{"line_number":160,"context_line":"            msg \u003d _(\u0027Backing up an in-use volume must use \u0027"},{"line_number":161,"context_line":"                    \u0027the force flag.\u0027)"},{"line_number":162,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        previous_status \u003d volume[\u0027status\u0027]"},{"line_number":165,"context_line":"        volume_host \u003d volume_utils.extract_host(volume[\u0027host\u0027], \u0027host\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_76855d05","line":162,"updated":"2015-12-02 06:02:36.000000000","message":"I think we need to check the status of snapshot.","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fa32f9f8c2135a98a005b0b1991d2b52b8a368ee","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        elif volume[\u0027status\u0027] in [\"in-use\"] and not snapshot_id and not force:"},{"line_number":160,"context_line":"            msg \u003d _(\u0027Backing up an in-use volume must use \u0027"},{"line_number":161,"context_line":"                    \u0027the force flag.\u0027)"},{"line_number":162,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        previous_status \u003d volume[\u0027status\u0027]"},{"line_number":165,"context_line":"        volume_host \u003d volume_utils.extract_host(volume[\u0027host\u0027], \u0027host\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_b926aa14","line":162,"in_reply_to":"9a8ffd7b_76855d05","updated":"2015-12-04 05:51:59.000000000","message":"Done","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3b150e0a175b5e5fd1c0c996316e66b1dc07d29d","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                # snapshot, \u0027data_timestamp\u0027 will be the same as"},{"line_number":218,"context_line":"                # \u0027created_at\u0027 for a snapshot."},{"line_number":219,"context_line":"                latest_backup \u003d max(backups.objects,"},{"line_number":220,"context_line":"                                    key\u003dlambda x: x[\u0027data_timestamp\u0027])"},{"line_number":221,"context_line":"            else:"},{"line_number":222,"context_line":"                msg \u003d _(\u0027No backups available to do an incremental backup.\u0027)"},{"line_number":223,"context_line":"                raise exception.InvalidBackup(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_38fedf6b","line":220,"updated":"2015-12-02 06:02:36.000000000","message":"Here it finds the latest backup. But to backup a snapshot, the latest backup may not correct. The data_timestamp should be less than snapshot.create_at.\n\nFor example, volume A have a backup at t0, and then have a snapshot at t1, and have a backup at t2. When creating backup from the snapshot, parent should be at t0 not t2.","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fa32f9f8c2135a98a005b0b1991d2b52b8a368ee","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                # snapshot, \u0027data_timestamp\u0027 will be the same as"},{"line_number":218,"context_line":"                # \u0027created_at\u0027 for a snapshot."},{"line_number":219,"context_line":"                latest_backup \u003d max(backups.objects,"},{"line_number":220,"context_line":"                                    key\u003dlambda x: x[\u0027data_timestamp\u0027])"},{"line_number":221,"context_line":"            else:"},{"line_number":222,"context_line":"                msg \u003d _(\u0027No backups available to do an incremental backup.\u0027)"},{"line_number":223,"context_line":"                raise exception.InvalidBackup(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_1911feac","line":220,"in_reply_to":"9a8ffd7b_38fedf6b","updated":"2015-12-04 05:51:59.000000000","message":"Thank you for catching that!  You are right.","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"}],"cinder/objects/backup.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"58fbff2f725641abdd045306862536151f39af9e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # Version 1.0: Initial version"},{"line_number":39,"context_line":"    # Version 1.1: Add new field num_dependent_backups and extra fields"},{"line_number":40,"context_line":"    #              is_incremental and has_dependent_backups."},{"line_number":41,"context_line":"    # Version 1.2: Add new field snapshot_id."},{"line_number":42,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_2b1e200c","line":41,"updated":"2015-12-14 11:53:58.000000000","message":"Please, add note about data_timestamp too","commit_id":"d4011ad1f74f953d40b2caac918e1077b2bf6d72"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7a3e757e428fa016e3dc695b0a479e2fd8a061c0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # Version 1.0: Initial version"},{"line_number":39,"context_line":"    # Version 1.1: Add new field num_dependent_backups and extra fields"},{"line_number":40,"context_line":"    #              is_incremental and has_dependent_backups."},{"line_number":41,"context_line":"    # Version 1.2: Add new field snapshot_id."},{"line_number":42,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a710552_c4f86d7f","line":41,"in_reply_to":"7a740942_2b1e200c","updated":"2015-12-15 03:03:25.000000000","message":"Done","commit_id":"d4011ad1f74f953d40b2caac918e1077b2bf6d72"}],"cinder/tests/unit/api/contrib/test_backups.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"cb44bbf126f73ea9e16976c097ebaea12752316f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":131,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":134,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backup\u0027][\u0027availability_zone\u0027])"},{"line_number":135,"context_line":"        self.assertEqual(\u0027volumebackups\u0027, res_dict[\u0027backup\u0027][\u0027container\u0027])"},{"line_number":136,"context_line":"        self.assertEqual(\u0027this is a test backup\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_fe46b679","line":133,"updated":"2015-11-11 20:31:16.000000000","message":"FWIW I think we could make a helper method to reduce the lines of code with validating the backup response, since we do this code often and most of these values are just constants set from _create_backup","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"866b3a24905de42cf022ced5d37225fb78450e77","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":131,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":134,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backup\u0027][\u0027availability_zone\u0027])"},{"line_number":135,"context_line":"        self.assertEqual(\u0027volumebackups\u0027, res_dict[\u0027backup\u0027][\u0027container\u0027])"},{"line_number":136,"context_line":"        self.assertEqual(\u0027this is a test backup\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_5b1c8869","line":133,"in_reply_to":"da85f559_7f5abff3","updated":"2015-11-20 01:05:11.000000000","message":"Done","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e28e6c92a61e2fcbc594ea66b1865043a82c0499","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":131,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":134,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backup\u0027][\u0027availability_zone\u0027])"},{"line_number":135,"context_line":"        self.assertEqual(\u0027volumebackups\u0027, res_dict[\u0027backup\u0027][\u0027container\u0027])"},{"line_number":136,"context_line":"        self.assertEqual(\u0027this is a test backup\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_7f5abff3","line":133,"in_reply_to":"da85f559_fe46b679","updated":"2015-11-11 21:48:30.000000000","message":"ddt will be a good way to reuse code for multiple tests.  I can rewrite this using ddt.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"cb44bbf126f73ea9e16976c097ebaea12752316f","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":319,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":322,"context_line":"        self.assertEqual(16, len(res_dict[\u0027backups\u0027][0]))"},{"line_number":323,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backups\u0027][0][\u0027availability_zone\u0027])"},{"line_number":324,"context_line":"        self.assertEqual(\u0027volumebackups\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_7ea5e644","line":321,"updated":"2015-11-11 20:31:16.000000000","message":"May want to make this a constant in case the length changes again the the future.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"866b3a24905de42cf022ced5d37225fb78450e77","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":319,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":322,"context_line":"        self.assertEqual(16, len(res_dict[\u0027backups\u0027][0]))"},{"line_number":323,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backups\u0027][0][\u0027availability_zone\u0027])"},{"line_number":324,"context_line":"        self.assertEqual(\u0027volumebackups\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_5d66c351","line":321,"in_reply_to":"da85f559_3fcd1785","updated":"2015-11-20 01:05:11.000000000","message":"Done","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e28e6c92a61e2fcbc594ea66b1865043a82c0499","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":319,"context_line":"        res_dict \u003d json.loads(res.body)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        self.assertEqual(200, res.status_int)"},{"line_number":322,"context_line":"        self.assertEqual(16, len(res_dict[\u0027backups\u0027][0]))"},{"line_number":323,"context_line":"        self.assertEqual(\u0027az1\u0027, res_dict[\u0027backups\u0027][0][\u0027availability_zone\u0027])"},{"line_number":324,"context_line":"        self.assertEqual(\u0027volumebackups\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_3fcd1785","line":321,"in_reply_to":"da85f559_7ea5e644","updated":"2015-11-11 21:48:30.000000000","message":"Sure.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"58fbff2f725641abdd045306862536151f39af9e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        backup[\u0027data_timestamp\u0027] \u003d data_timestamp"},{"line_number":87,"context_line":"        backup \u003d db.backup_create(context.get_admin_context(), backup)"},{"line_number":88,"context_line":"        if not snapshot_id:"},{"line_number":89,"context_line":"            db.backup_update(context.get_admin_context(),"},{"line_number":90,"context_line":"                             backup[\u0027id\u0027],"},{"line_number":91,"context_line":"                             {\u0027data_timestamp\u0027: backup[\u0027created_at\u0027]})"},{"line_number":92,"context_line":"        return backup[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_4ba92c8f","line":89,"updated":"2015-12-14 11:53:58.000000000","message":"Can we modify backup[\u0027snapshot_id\u0027] before DB record creation to call DB only once?\n\nAnyway, it\u0027s a test so should not be a blocker for this patch.","commit_id":"d4011ad1f74f953d40b2caac918e1077b2bf6d72"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7a3e757e428fa016e3dc695b0a479e2fd8a061c0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        backup[\u0027data_timestamp\u0027] \u003d data_timestamp"},{"line_number":87,"context_line":"        backup \u003d db.backup_create(context.get_admin_context(), backup)"},{"line_number":88,"context_line":"        if not snapshot_id:"},{"line_number":89,"context_line":"            db.backup_update(context.get_admin_context(),"},{"line_number":90,"context_line":"                             backup[\u0027id\u0027],"},{"line_number":91,"context_line":"                             {\u0027data_timestamp\u0027: backup[\u0027created_at\u0027]})"},{"line_number":92,"context_line":"        return backup[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a710552_a4f9a14f","line":89,"in_reply_to":"7a740942_4ba92c8f","updated":"2015-12-15 03:03:25.000000000","message":"Hi Ivan,\n\nThe backup[\u0027created_at\u0027] field is generated when the backup entry is created.  After that, I set the \u0027data_timestamp\u0027 field to be the same as \u0027created_at\u0027 if it is for snapshot backup.  That is why I do this in two steps:\n\nStep 1: Create backup entry in DB and \u0027created_at\u0027 will be generated automatically.\n\nStep 2: Update \u0027data_timestamp\u0027 to be the same as \u0027created_at\u0027 for snapshot backup.\n\nI don\u0027t know how to do this in one step.  Let me know if you know how this can be done.  Thanks!","commit_id":"d4011ad1f74f953d40b2caac918e1077b2bf6d72"}],"cinder/volume/driver.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"cb44bbf126f73ea9e16976c097ebaea12752316f","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"        else:"},{"line_number":1082,"context_line":"            self._backup_volume_temp_volume(context, backup,"},{"line_number":1083,"context_line":"                                            backup_service)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def _backup_volume_temp_volume(self, context, backup, backup_service):"},{"line_number":1086,"context_line":"        \"\"\"Create a new backup from an existing volume or snapshot."},{"line_number":1087,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_de797283","line":1084,"updated":"2015-11-11 20:31:16.000000000","message":"Seems like there\u0027s a lot of similar code between _backup_volume_temp_volume and _backup_volume_temp_snapshot which is causing us to duplicate code between both.  I can see that there are some differences, just figured I\u0027d bring this up in case there\u0027s a sensible way we can combine some of the common code between these two.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"66ad4557d1983f01c29df60eca300a8020f42f57","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"        else:"},{"line_number":1082,"context_line":"            self._backup_volume_temp_volume(context, backup,"},{"line_number":1083,"context_line":"                                            backup_service)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def _backup_volume_temp_volume(self, context, backup, backup_service):"},{"line_number":1086,"context_line":"        \"\"\"Create a new backup from an existing volume or snapshot."},{"line_number":1087,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_304ae156","line":1084,"in_reply_to":"da85f559_3f1f5709","updated":"2015-11-12 23:12:11.000000000","message":"Got it, no need to worry about it then :)  I can see how it would get a bit confusing to combine them - it\u0027s in that gray area of a lot of common code but just not quite enough.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e28e6c92a61e2fcbc594ea66b1865043a82c0499","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"        else:"},{"line_number":1082,"context_line":"            self._backup_volume_temp_volume(context, backup,"},{"line_number":1083,"context_line":"                                            backup_service)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def _backup_volume_temp_volume(self, context, backup, backup_service):"},{"line_number":1086,"context_line":"        \"\"\"Create a new backup from an existing volume or snapshot."},{"line_number":1087,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_3f1f5709","line":1084,"in_reply_to":"da85f559_de797283","updated":"2015-11-11 21:48:30.000000000","message":"I had them together as one function when working on non-disruptive backups, but there were complaints that the code path becomes very confusing.  So I split the two.  So it is a trade-off between code duplication and code readability.  I probably should add a note here as this will likely come up again.","commit_id":"251b59ce815a225ea9464bdce497ff54290d16ac"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"3f328ad0da7b0e9653b4115b4e824f9bd7766566","unresolved":false,"context_lines":[{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"        LOG.debug(\u0027Creating a new backup for volume %s.\u0027, volume[\u0027name\u0027])"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"        device_to_backup \u003d volume"},{"line_number":1156,"context_line":"        is_snapshot \u003d False"},{"line_number":1157,"context_line":"        temp_snapshot \u003d None"},{"line_number":1158,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_951e300a","line":1155,"updated":"2015-11-20 04:28:42.000000000","message":"Not worth holding up this patch for, but it looks like is_snapshot will always be true now","commit_id":"3d0789c225ac91fa22133788927f099508f26227"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"8221bcc8fcd00d85b53305ab5539f07e79aa90ea","unresolved":false,"context_lines":[{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"        LOG.debug(\u0027Creating a new backup for volume %s.\u0027, volume[\u0027name\u0027])"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"        device_to_backup \u003d volume"},{"line_number":1156,"context_line":"        is_snapshot \u003d False"},{"line_number":1157,"context_line":"        temp_snapshot \u003d None"},{"line_number":1158,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_e86c69d2","line":1155,"in_reply_to":"ba8a016a_951e300a","updated":"2015-11-20 15:37:25.000000000","message":"\u0027is_snapshot\u0027 could still be False.  There are 3 cases here:\n\n1. backup.snapshot_id is not None. \nThis is to backup from a snapshot. So is_snapshot \u003d True.\n\n2. backup.snapshot_id \u003d None. \nThis is to backup from a volume (and the driver has indicated it can attach a snapshot so we are in _backup_volume_temp_snapshot).\n\n2a. volume status \u003d \u0027in-use\u0027, \nis_snapshot \u003d True. \nWe will create a temp snapshot from the volume and back it up.\n\n2b. volume statue \u003d \u0027available\u0027, \nis_snapshot \u003d False. \nWe will backup the volume directly.\n\nWe\u0027ll add the above to the comments to make it clear.","commit_id":"3d0789c225ac91fa22133788927f099508f26227"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"95065e3b99b2c241bcbad63c7c03c19f55ad9f69","unresolved":false,"context_lines":[{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"        LOG.debug(\u0027Creating a new backup for volume %s.\u0027, volume[\u0027name\u0027])"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"        device_to_backup \u003d volume"},{"line_number":1156,"context_line":"        is_snapshot \u003d False"},{"line_number":1157,"context_line":"        temp_snapshot \u003d None"},{"line_number":1158,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_ae6c1e37","line":1155,"in_reply_to":"ba8a016a_e86c69d2","updated":"2015-11-20 20:16:08.000000000","message":"No need to add the extra comment - I think my mind just exploded yesterday :) looking today it\u0027s immediately obvious this is not always True.  Thanks for the detailed explanation of the scenarios","commit_id":"3d0789c225ac91fa22133788927f099508f26227"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"bfb8808c3f979cb62c2027b59197b66b958dd7d9","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"            # snapshot; if \u0027in-use\u0027, create a temp volume from the source"},{"line_number":1124,"context_line":"            # volume, backup the temp volume, and then clean up the temp"},{"line_number":1125,"context_line":"            # volume; if \u0027available\u0027, just backup the volume."},{"line_number":1126,"context_line":"            previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":1127,"context_line":"            if previous_status \u003d\u003d \"in-use\":"},{"line_number":1128,"context_line":"                temp_vol_ref \u003d self._create_temp_cloned_volume("},{"line_number":1129,"context_line":"                    context, volume)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_266739ea","line":1126,"updated":"2015-11-28 13:31:55.000000000","message":"Can just use volume.get(\u0027previous_status\u0027)","commit_id":"3a850c71348b55d0fc62199fc51923d74bb0be16"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4b729aa52e85f4813ca6a1f4adbacee710e9ec5b","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"            # snapshot; if \u0027in-use\u0027, create a temp volume from the source"},{"line_number":1124,"context_line":"            # volume, backup the temp volume, and then clean up the temp"},{"line_number":1125,"context_line":"            # volume; if \u0027available\u0027, just backup the volume."},{"line_number":1126,"context_line":"            previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":1127,"context_line":"            if previous_status \u003d\u003d \"in-use\":"},{"line_number":1128,"context_line":"                temp_vol_ref \u003d self._create_temp_cloned_volume("},{"line_number":1129,"context_line":"                    context, volume)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_2037d4e4","line":1126,"in_reply_to":"9a8ffd7b_266739ea","updated":"2015-12-01 03:22:41.000000000","message":"Done","commit_id":"3a850c71348b55d0fc62199fc51923d74bb0be16"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"bfb8808c3f979cb62c2027b59197b66b958dd7d9","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"            # from the source volume, backup the temp snapshot, and then clean"},{"line_number":1169,"context_line":"            # up the temp snapshot; if the volume status is \u0027available\u0027, just"},{"line_number":1170,"context_line":"            # backup the volume."},{"line_number":1171,"context_line":"            previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":1172,"context_line":"            if previous_status \u003d\u003d \"in-use\":"},{"line_number":1173,"context_line":"                temp_snapshot \u003d self._create_temp_snapshot(context, volume)"},{"line_number":1174,"context_line":"                backup.temp_snapshot_id \u003d temp_snapshot.id"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_a6a1e9f9","line":1171,"updated":"2015-11-28 13:31:55.000000000","message":"ditto","commit_id":"3a850c71348b55d0fc62199fc51923d74bb0be16"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4b729aa52e85f4813ca6a1f4adbacee710e9ec5b","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"            # from the source volume, backup the temp snapshot, and then clean"},{"line_number":1169,"context_line":"            # up the temp snapshot; if the volume status is \u0027available\u0027, just"},{"line_number":1170,"context_line":"            # backup the volume."},{"line_number":1171,"context_line":"            previous_status \u003d volume.get(\u0027previous_status\u0027, None)"},{"line_number":1172,"context_line":"            if previous_status \u003d\u003d \"in-use\":"},{"line_number":1173,"context_line":"                temp_snapshot \u003d self._create_temp_snapshot(context, volume)"},{"line_number":1174,"context_line":"                backup.temp_snapshot_id \u003d temp_snapshot.id"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_e030ecea","line":1171,"in_reply_to":"9a8ffd7b_a6a1e9f9","updated":"2015-12-01 03:22:41.000000000","message":"Done","commit_id":"3a850c71348b55d0fc62199fc51923d74bb0be16"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3b150e0a175b5e5fd1c0c996316e66b1dc07d29d","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"            \u0027project_id\u0027: context.project_id,"},{"line_number":1307,"context_line":"            \u0027status\u0027: \u0027creating\u0027,"},{"line_number":1308,"context_line":"        }"},{"line_number":1309,"context_line":"        temp_vol_ref \u003d self.db.volume_create(context, temp_volume)"},{"line_number":1310,"context_line":"        try:"},{"line_number":1311,"context_line":"            self.create_volume_from_snapshot(temp_vol_ref, snapshot)"},{"line_number":1312,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_f8a3779c","line":1309,"updated":"2015-12-02 06:02:36.000000000","message":"Should we use the new versioned object Volume.create()?\n\nIf yes, please use attributes instead of dictionary interface.","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fa32f9f8c2135a98a005b0b1991d2b52b8a368ee","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"            \u0027project_id\u0027: context.project_id,"},{"line_number":1307,"context_line":"            \u0027status\u0027: \u0027creating\u0027,"},{"line_number":1308,"context_line":"        }"},{"line_number":1309,"context_line":"        temp_vol_ref \u003d self.db.volume_create(context, temp_volume)"},{"line_number":1310,"context_line":"        try:"},{"line_number":1311,"context_line":"            self.create_volume_from_snapshot(temp_vol_ref, snapshot)"},{"line_number":1312,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_3cff0803","line":1309,"in_reply_to":"9a8ffd7b_f8a3779c","updated":"2015-12-04 05:51:59.000000000","message":"Volume is not converted to objects in other places of this file yet.  So changing this one place to use objects will be inconsistent.  I\u0027d rather change them together later.","commit_id":"ebad712d5b96f8439f6773e65d662feffda08876"}]}
