)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Huawei: Implement v2 replication (managed)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the managed side of v2 replication in the HuaweiDriver."},{"line_number":10,"context_line":"Both Synchronous mode and Asynchronous mode are supported with Huawei arrays."},{"line_number":11,"context_line":"The volume type need to associate with the extra spec with"},{"line_number":12,"context_line":"\u0027replication_enabled\u0027 equaling to \u0027\u003cis\u003e True\u0027, and \u0027replication_type\u0027"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_cf1b2dc9","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":77},"updated":"2016-01-05 01:53:27.000000000","message":"Subsequent lines should be wrapped at 72 characters. For detail: https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Huawei: Implement v2 replication (managed)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the managed side of v2 replication in the HuaweiDriver."},{"line_number":10,"context_line":"Both Synchronous mode and Asynchronous mode are supported with Huawei arrays."},{"line_number":11,"context_line":"The volume type need to associate with the extra spec with"},{"line_number":12,"context_line":"\u0027replication_enabled\u0027 equaling to \u0027\u003cis\u003e True\u0027, and \u0027replication_type\u0027"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_cb8eba78","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":77},"in_reply_to":"fa69d971_cf1b2dc9","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Huawei: Implement v2 replication (managed)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the managed side of v2 replication in the HuaweiDriver."},{"line_number":10,"context_line":"Both Synchronous mode and Asynchronous mode are supported with Huawei arrays."},{"line_number":11,"context_line":"The volume type need to associate with the extra spec with"},{"line_number":12,"context_line":"\u0027replication_enabled\u0027 equaling to \u0027\u003cis\u003e True\u0027, and \u0027replication_type\u0027"},{"line_number":13,"context_line":"equaling to \u0027\u003cin\u003e sync\u0027 or \u0027\u003cin\u003e async\u0027. if \u0027replication_type\u0027 is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_ef56315b","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":76},"updated":"2016-01-05 01:53:27.000000000","message":"same","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Huawei: Implement v2 replication (managed)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch implements the managed side of v2 replication in the HuaweiDriver."},{"line_number":10,"context_line":"Both Synchronous mode and Asynchronous mode are supported with Huawei arrays."},{"line_number":11,"context_line":"The volume type need to associate with the extra spec with"},{"line_number":12,"context_line":"\u0027replication_enabled\u0027 equaling to \u0027\u003cis\u003e True\u0027, and \u0027replication_type\u0027"},{"line_number":13,"context_line":"equaling to \u0027\u003cin\u003e sync\u0027 or \u0027\u003cin\u003e async\u0027. if \u0027replication_type\u0027 is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_eb8b7e66","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":76},"in_reply_to":"fa69d971_ef56315b","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":21,"context_line":"5. volume retype"},{"line_number":22,"context_line":"6. volume migration"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"So far we support a single remote device, and \u0027cinder.conf\u0027 should configure"},{"line_number":25,"context_line":"a replication local backend and a replication remote backend as follows:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"[replica]"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_af4cb9c8","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":76},"updated":"2016-01-05 01:53:27.000000000","message":"same","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":21,"context_line":"5. volume retype"},{"line_number":22,"context_line":"6. volume migration"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"So far we support a single remote device, and \u0027cinder.conf\u0027 should configure"},{"line_number":25,"context_line":"a replication local backend and a replication remote backend as follows:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"[replica]"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_8bebe212","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":76},"in_reply_to":"fa69d971_af4cb9c8","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"181e132aefeba6ca52dd192a02db20ebcd73558e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver"},{"line_number":32,"context_line":"cinder_huawei_conf_file \u003d /etc/cinder/cinder_huawei_conf.xml"},{"line_number":33,"context_line":"volume_backend_name \u003d replica"},{"line_number":34,"context_line":"replication_device \u003d device_target_id:huawei-replica-1,"},{"line_number":35,"context_line":"    managed_backend_name:host#pool,"},{"line_number":36,"context_line":"    san_address:san_url_1;san_url_2,"},{"line_number":37,"context_line":"    san_user:admin,san_password:passwd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"fa69d971_f2504734","line":34,"updated":"2016-01-11 08:33:49.000000000","message":"The key should be target_device_id.\n there are some inconsistency in replication.rst\ni am submitting a review to address it:\nhttps://review.openstack.org/#/c/265678/","commit_id":"b9ed3a6eddd7c9a920db69ef9eda09c74ebeee60"}],"cinder/tests/unit/test_huawei_drivers.py":[{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"513b935ae33fd4a15f02a924f7688ef41c7385c9","unresolved":false,"context_lines":[{"line_number":1782,"context_line":"MAP_COMMAND_TO_FAKE_RESPONSE[\u0027/REPLICATIONPAIR/split/PUT\u0027] \u003d ("},{"line_number":1783,"context_line":"    FAKE_SPLIT_PAIR_RESPONSE)"},{"line_number":1784,"context_line":""},{"line_number":1785,"context_line":"FAKE_SWITCH_PAIR_RESPONSE \u003d \"\"\""},{"line_number":1786,"context_line":"{"},{"line_number":1787,"context_line":"    \"data\":{},"},{"line_number":1788,"context_line":"    \"error\":{"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_d3888dc7","line":1785,"range":{"start_line":1785,"start_character":0,"end_line":1785,"end_character":25},"updated":"2016-02-06 08:51:53.000000000","message":"this response is same with FAKE_SPLIT_PAIR_RESPONSE, why not use a single response string.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":1782,"context_line":"MAP_COMMAND_TO_FAKE_RESPONSE[\u0027/REPLICATIONPAIR/split/PUT\u0027] \u003d ("},{"line_number":1783,"context_line":"    FAKE_SPLIT_PAIR_RESPONSE)"},{"line_number":1784,"context_line":""},{"line_number":1785,"context_line":"FAKE_SWITCH_PAIR_RESPONSE \u003d \"\"\""},{"line_number":1786,"context_line":"{"},{"line_number":1787,"context_line":"    \"data\":{},"},{"line_number":1788,"context_line":"    \"error\":{"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_e57a80bc","line":1785,"range":{"start_line":1785,"start_character":0,"end_line":1785,"end_character":25},"in_reply_to":"5a5ae5dd_d3888dc7","updated":"2016-02-08 10:03:20.000000000","message":"This time they are the same, but maybe changed in the future, so we can easily to make the change.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"513b935ae33fd4a15f02a924f7688ef41c7385c9","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"        try:"},{"line_number":1809,"context_line":"            return getattr(self.conf, key)"},{"line_number":1810,"context_line":"        except Exception:"},{"line_number":1811,"context_line":"            return None"},{"line_number":1812,"context_line":""},{"line_number":1813,"context_line":"    def update_config_value(self):"},{"line_number":1814,"context_line":"        setattr(self.conf, \u0027volume_backend_name\u0027, \u0027huawei_storage\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_f3b34998","line":1811,"range":{"start_line":1811,"start_character":12,"end_line":1811,"end_character":23},"updated":"2016-02-06 08:51:53.000000000","message":"Just return, no need to return None.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"        try:"},{"line_number":1809,"context_line":"            return getattr(self.conf, key)"},{"line_number":1810,"context_line":"        except Exception:"},{"line_number":1811,"context_line":"            return None"},{"line_number":1812,"context_line":""},{"line_number":1813,"context_line":"    def update_config_value(self):"},{"line_number":1814,"context_line":"        setattr(self.conf, \u0027volume_backend_name\u0027, \u0027huawei_storage\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_60299e89","line":1811,"range":{"start_line":1811,"start_character":12,"end_line":1811,"end_character":23},"in_reply_to":"5a5ae5dd_f3b34998","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"513b935ae33fd4a15f02a924f7688ef41c7385c9","unresolved":false,"context_lines":[{"line_number":2995,"context_line":"        common_driver.unprotect_second(replica_id)"},{"line_number":2996,"context_line":""},{"line_number":2997,"context_line":"    def test_replication_sync(self):"},{"line_number":2998,"context_line":"        replica_id \u003d \u00273400a30d844d0004\u0027"},{"line_number":2999,"context_line":"        op \u003d replication.PairOp(self.driver.client)"},{"line_number":3000,"context_line":"        common_driver \u003d replication.ReplicaCommonDriver(self.configuration, op)"},{"line_number":3001,"context_line":"        async_normal_status \u003d {"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_d3af2d28","line":2998,"range":{"start_line":2998,"start_character":7,"end_line":2998,"end_character":39},"updated":"2016-02-06 08:51:53.000000000","message":"Seems many place using this value, why not make it a constant?","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":2995,"context_line":"        common_driver.unprotect_second(replica_id)"},{"line_number":2996,"context_line":""},{"line_number":2997,"context_line":"    def test_replication_sync(self):"},{"line_number":2998,"context_line":"        replica_id \u003d \u00273400a30d844d0004\u0027"},{"line_number":2999,"context_line":"        op \u003d replication.PairOp(self.driver.client)"},{"line_number":3000,"context_line":"        common_driver \u003d replication.ReplicaCommonDriver(self.configuration, op)"},{"line_number":3001,"context_line":"        async_normal_status \u003d {"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_80bcdabb","line":2998,"range":{"start_line":2998,"start_character":7,"end_line":2998,"end_character":39},"in_reply_to":"5a5ae5dd_d3af2d28","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"}],"cinder/volume/drivers/huawei/huawei_driver.py":[{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                raise"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        # Delete a replication volume"},{"line_number":354,"context_line":"        replica_data \u003d volume.get(\u0027replication_driver_data\u0027)"},{"line_number":355,"context_line":"        if replica_data:"},{"line_number":356,"context_line":"            try:"},{"line_number":357,"context_line":"                self.replica.delete_replica(volume)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_5849bfcf","line":354,"updated":"2015-12-30 08:13:15.000000000","message":"Is it work if the volume is failed over to the secondary device?","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        self.replica.disable_replica(volume)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":1065,"context_line":"        \"\"\"Disable replication and unprotect remote LUN\"\"\""},{"line_number":1066,"context_line":"        return self.replica.failover_replica(volume)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_replication_targets(self, context, vref):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_5820dff7","line":1065,"updated":"2015-12-30 08:13:15.000000000","message":"Trailing period needed","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"        return self.replica.failover_replica(volume)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1069,"context_line":"        \"\"\"Obtain volume repliction targets\"\"\""},{"line_number":1070,"context_line":"        volume_type \u003d self._get_volume_type(vref)"},{"line_number":1071,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":1072,"context_line":"        targets \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_781da3bc","line":1069,"updated":"2015-12-30 08:13:15.000000000","message":"Ditto","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":792,"context_line":"            LOG.exception(_LE(\u0027Retype volume error.\u0027))"},{"line_number":793,"context_line":"            return False"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        if replica_enabled_change and replica_enabled_change[1] \u003d\u003d \u0027true\u0027:"},{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                lun_info \u003d self.client.get_lun_info(lun_id)"},{"line_number":798,"context_line":"                replica_info \u003d self.replica.create_replica("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_21721d7c","line":795,"range":{"start_line":795,"start_character":38,"end_line":795,"end_character":63},"updated":"2016-01-05 01:53:27.000000000","message":"Maybe it\u0027s replica_enabled_change[0]??","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":792,"context_line":"            LOG.exception(_LE(\u0027Retype volume error.\u0027))"},{"line_number":793,"context_line":"            return False"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        if replica_enabled_change and replica_enabled_change[1] \u003d\u003d \u0027true\u0027:"},{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                lun_info \u003d self.client.get_lun_info(lun_id)"},{"line_number":798,"context_line":"                replica_info \u003d self.replica.create_replica("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_ab3ee689","line":795,"range":{"start_line":795,"start_character":38,"end_line":795,"end_character":63},"in_reply_to":"fa69d971_21721d7c","updated":"2016-01-05 06:39:36.000000000","message":"0：old replica\n1: new replica\nWe want to check the new one","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                else:"},{"line_number":187,"context_line":"                    LOG.error(_LE(\"Extra specs must be specified as \""},{"line_number":188,"context_line":"                                  \"capabilities:%s\u003d\u0027\u003cis\u003e True\u0027 or \""},{"line_number":189,"context_line":"                                  \"\u0027\u003cin\u003e value\u0027.\"), key)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if ((scope in opts_capability)"},{"line_number":192,"context_line":"                    and (key in opts_value)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_0122d5b9","line":189,"range":{"start_line":189,"start_character":41,"end_line":189,"end_character":46},"updated":"2016-01-08 01:53:52.000000000","message":"Maybe use \"async\" or \"sync\" instead of \"value\" is better?","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                else:"},{"line_number":187,"context_line":"                    LOG.error(_LE(\"Extra specs must be specified as \""},{"line_number":188,"context_line":"                                  \"capabilities:%s\u003d\u0027\u003cis\u003e True\u0027 or \""},{"line_number":189,"context_line":"                                  \"\u0027\u003cin\u003e value\u0027.\"), key)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if ((scope in opts_capability)"},{"line_number":192,"context_line":"                    and (key in opts_value)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_912230a2","line":189,"range":{"start_line":189,"start_character":41,"end_line":189,"end_character":46},"in_reply_to":"fa69d971_0122d5b9","updated":"2016-01-11 02:41:35.000000000","message":"Now, we just use \u003cin\u003e key words with sync or async, but we may extend it. Here just mention a valid format, not a valid content.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":480,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":481,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":483,"context_line":"            return (False, None)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return self._migrate_volume(volume, host, new_type)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_01dad578","line":483,"range":{"start_line":483,"start_character":12,"end_line":483,"end_character":32},"updated":"2016-01-08 01:53:52.000000000","message":"s/return (False, None)/return False, None","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":480,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":481,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":483,"context_line":"            return (False, None)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return self._migrate_volume(volume, host, new_type)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_51f838c3","line":483,"range":{"start_line":483,"start_character":12,"end_line":483,"end_character":32},"in_reply_to":"fa69d971_01dad578","updated":"2016-01-11 02:41:35.000000000","message":"Both are the same.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":483,"context_line":"            return (False, None)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return self._migrate_volume(volume, host, new_type)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def _check_migration_valid(self, host, volume):"},{"line_number":488,"context_line":"        if \u0027pool_name\u0027 not in host[\u0027capabilities\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_61edd18d","line":485,"range":{"start_line":485,"start_character":8,"end_line":485,"end_character":59},"updated":"2016-01-08 01:53:52.000000000","message":"This should be \"return True, self._migrate_volume\"?","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":483,"context_line":"            return (False, None)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return self._migrate_volume(volume, host, new_type)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def _check_migration_valid(self, host, volume):"},{"line_number":488,"context_line":"        if \u0027pool_name\u0027 not in host[\u0027capabilities\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_b175f498","line":485,"range":{"start_line":485,"start_character":8,"end_line":485,"end_character":59},"in_reply_to":"fa69d971_61edd18d","updated":"2016-01-11 02:41:35.000000000","message":"No need. Please check _migrate_volume return value.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Repication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"},{"line_number":594,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_612b9134","line":591,"range":{"start_line":591,"start_character":41,"end_line":591,"end_character":51},"updated":"2016-01-08 01:53:52.000000000","message":"s/Repication/Replication","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Repication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"},{"line_number":594,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_d17ae887","line":591,"range":{"start_line":591,"start_character":41,"end_line":591,"end_character":51},"in_reply_to":"fa69d971_612b9134","updated":"2016-01-11 02:41:35.000000000","message":"Done","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        self._copy_volume(volume, luncopy_name,"},{"line_number":635,"context_line":"                          snapshot_id, tgt_lun_id)"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        # NOTE: Actually, We just only support replication here right now,"},{"line_number":638,"context_line":"        # not hypermetro."},{"line_number":639,"context_line":"        model_update \u003d self._add_extend_type_to_volume(opts, lun_params,"},{"line_number":640,"context_line":"                                                       lun_info, model_update)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_81bec5d2","line":637,"range":{"start_line":637,"start_character":26,"end_line":637,"end_character":28},"updated":"2016-01-08 01:53:52.000000000","message":"s/We/we","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        self._copy_volume(volume, luncopy_name,"},{"line_number":635,"context_line":"                          snapshot_id, tgt_lun_id)"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        # NOTE: Actually, We just only support replication here right now,"},{"line_number":638,"context_line":"        # not hypermetro."},{"line_number":639,"context_line":"        model_update \u003d self._add_extend_type_to_volume(opts, lun_params,"},{"line_number":640,"context_line":"                                                       lun_info, model_update)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_9170f0a5","line":637,"range":{"start_line":637,"start_character":26,"end_line":637,"end_character":28},"in_reply_to":"fa69d971_81bec5d2","updated":"2016-01-11 02:41:35.000000000","message":"Done","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":801,"context_line":"            except exception.VolumeBackendAPIException:"},{"line_number":802,"context_line":"                LOG.exception(_LE(\u0027Retype volume error. \u0027"},{"line_number":803,"context_line":"                                  \u0027Create replication failed.\u0027))"},{"line_number":804,"context_line":"                return False"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        return (True, model_update)"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_218279c9","line":804,"range":{"start_line":804,"start_character":16,"end_line":804,"end_character":28},"updated":"2016-01-08 01:53:52.000000000","message":"Should be \"return False, None\" like \"return True, model_update\"","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":801,"context_line":"            except exception.VolumeBackendAPIException:"},{"line_number":802,"context_line":"                LOG.exception(_LE(\u0027Retype volume error. \u0027"},{"line_number":803,"context_line":"                                  \u0027Create replication failed.\u0027))"},{"line_number":804,"context_line":"                return False"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        return (True, model_update)"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_f15fec0c","line":804,"range":{"start_line":804,"start_character":16,"end_line":804,"end_character":28},"in_reply_to":"fa69d971_218279c9","updated":"2016-01-11 02:41:35.000000000","message":"No need. Please check manager.py.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                                  \u0027Create replication failed.\u0027))"},{"line_number":804,"context_line":"                return False"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        return (True, model_update)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def modify_lun(self, lun_id, change_opts):"},{"line_number":809,"context_line":"        if change_opts.get(\u0027partitionid\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_01f5f581","line":806,"range":{"start_line":806,"start_character":8,"end_line":806,"end_character":35},"updated":"2016-01-08 01:53:52.000000000","message":"s/return (True, model_update)/return True, model_update","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                                  \u0027Create replication failed.\u0027))"},{"line_number":804,"context_line":"                return False"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        return (True, model_update)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def modify_lun(self, lun_id, change_opts):"},{"line_number":809,"context_line":"        if change_opts.get(\u0027partitionid\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_7179bc81","line":806,"range":{"start_line":806,"start_character":8,"end_line":806,"end_character":35},"in_reply_to":"fa69d971_01f5f581","updated":"2016-01-11 02:41:35.000000000","message":"The two style are the same. Both are exist in driver.py.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"098f4f12daac644512b58eba3ea0981d95b9dd6d","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"        return self.replica.failover_replica(volume)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1069,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1070,"context_line":"        volume_type \u003d self._get_volume_type(vref)"},{"line_number":1071,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":1072,"context_line":"        targets \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_c1a6fd52","line":1069,"range":{"start_line":1069,"start_character":25,"end_line":1069,"end_character":35},"updated":"2016-01-08 01:53:52.000000000","message":"s/repliction/replication","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"15db31fad104ef8fbe1f9927d8fc36d49aa71bf9","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"        return self.replica.failover_replica(volume)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1069,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1070,"context_line":"        volume_type \u003d self._get_volume_type(vref)"},{"line_number":1071,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":1072,"context_line":"        targets \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_319824c0","line":1069,"range":{"start_line":1069,"start_character":25,"end_line":1069,"end_character":35},"in_reply_to":"fa69d971_c1a6fd52","updated":"2016-01-11 02:41:35.000000000","message":"Done","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"98a90d0b0cf174047cc647c579ac8fd5b778a717","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                else:"},{"line_number":187,"context_line":"                    LOG.error(_LE(\"Extra specs must be specified as \""},{"line_number":188,"context_line":"                                  \"capabilities:%s\u003d\u0027\u003cis\u003e True\u0027 or \""},{"line_number":189,"context_line":"                                  \"\u0027\u003cin\u003e value\u0027.\"), key)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if ((scope in opts_capability)"},{"line_number":192,"context_line":"                    and (key in opts_value)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_b11f3b6b","line":189,"range":{"start_line":189,"start_character":41,"end_line":189,"end_character":46},"updated":"2016-01-14 03:45:31.000000000","message":"How about log value: \u0027\u003cin\u003e %s\u0027, value","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"9919f3928a97cae53c00da8c2f746c5c9255272c","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                else:"},{"line_number":187,"context_line":"                    LOG.error(_LE(\"Extra specs must be specified as \""},{"line_number":188,"context_line":"                                  \"capabilities:%s\u003d\u0027\u003cis\u003e True\u0027 or \""},{"line_number":189,"context_line":"                                  \"\u0027\u003cin\u003e value\u0027.\"), key)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if ((scope in opts_capability)"},{"line_number":192,"context_line":"                    and (key in opts_value)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a706191b","line":189,"range":{"start_line":189,"start_character":41,"end_line":189,"end_character":46},"in_reply_to":"da6ed579_b11f3b6b","updated":"2016-01-14 04:01:48.000000000","message":"Done","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"98a90d0b0cf174047cc647c579ac8fd5b778a717","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        \"\"\"Add the extend type."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        Extend type is the services may conflict with LUNCopy."},{"line_number":264,"context_line":"        So add it After the those services."},{"line_number":265,"context_line":"        \"\"\""},{"line_number":266,"context_line":"        lun_id \u003d lun_info[\u0027ID\u0027]"},{"line_number":267,"context_line":"        if opts.get(\u0027hypermetro\u0027):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_f1a85379","line":264,"range":{"start_line":264,"start_character":18,"end_line":264,"end_character":23},"updated":"2016-01-14 03:45:31.000000000","message":"s/After/after","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"9919f3928a97cae53c00da8c2f746c5c9255272c","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        \"\"\"Add the extend type."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        Extend type is the services may conflict with LUNCopy."},{"line_number":264,"context_line":"        So add it After the those services."},{"line_number":265,"context_line":"        \"\"\""},{"line_number":266,"context_line":"        lun_id \u003d lun_info[\u0027ID\u0027]"},{"line_number":267,"context_line":"        if opts.get(\u0027hypermetro\u0027):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2c252ec0","line":264,"range":{"start_line":264,"start_character":18,"end_line":264,"end_character":23},"in_reply_to":"da6ed579_f1a85379","updated":"2016-01-14 04:01:48.000000000","message":"Done","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e546e5a65c0515bda386e8716cafcb309d737183","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":297,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":298,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":299,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":300,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":301,"context_line":"            LOG.error(err_msg)"},{"line_number":302,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_476cfdcf","line":300,"range":{"start_line":299,"start_character":22,"end_line":300,"end_character":58},"updated":"2016-01-14 04:07:39.000000000","message":"() is no need.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f85bab9aafb3f74dbc8b07e0f77489f21f3d262f","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":297,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":298,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":299,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":300,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":301,"context_line":"            LOG.error(err_msg)"},{"line_number":302,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_27754863","line":300,"range":{"start_line":299,"start_character":22,"end_line":300,"end_character":58},"in_reply_to":"da6ed579_476cfdcf","updated":"2016-01-14 05:20:29.000000000","message":"Done","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e546e5a65c0515bda386e8716cafcb309d737183","unresolved":false,"context_lines":[{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":478,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":479,"context_line":"        # So I don\u0027t add this judgement into _check_migration_valid()."},{"line_number":480,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":481,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_47a39d00","line":479,"range":{"start_line":479,"start_character":13,"end_line":479,"end_character":14},"updated":"2016-01-14 04:07:39.000000000","message":"Maybe \"driver\"? or else.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f85bab9aafb3f74dbc8b07e0f77489f21f3d262f","unresolved":false,"context_lines":[{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":478,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":479,"context_line":"        # So I don\u0027t add this judgement into _check_migration_valid()."},{"line_number":480,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":481,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":482,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a714d89f","line":479,"range":{"start_line":479,"start_character":13,"end_line":479,"end_character":14},"in_reply_to":"da6ed579_47a39d00","updated":"2016-01-14 05:20:29.000000000","message":"\u0027I\u0027 is just removed.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"98a90d0b0cf174047cc647c579ac8fd5b778a717","unresolved":false,"context_lines":[{"line_number":586,"context_line":"        \"\"\""},{"line_number":587,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_4cdbc24f","line":590,"range":{"start_line":589,"start_character":8,"end_line":590,"end_character":63},"updated":"2016-01-14 03:45:31.000000000","message":"If the the opts.get(\u0027hypermetro\u0027) is string \u0027false\u0027. It will be false, and can not go to error.\n\nBetter to use strutils.bool_from_string(opts.get(\u0027hypermetro\u0027))","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"9919f3928a97cae53c00da8c2f746c5c9255272c","unresolved":false,"context_lines":[{"line_number":586,"context_line":"        \"\"\""},{"line_number":587,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_670ca13b","line":590,"range":{"start_line":589,"start_character":8,"end_line":590,"end_character":63},"in_reply_to":"da6ed579_4cdbc24f","updated":"2016-01-14 04:01:48.000000000","message":"Done","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e546e5a65c0515bda386e8716cafcb309d737183","unresolved":false,"context_lines":[{"line_number":586,"context_line":"        \"\"\""},{"line_number":587,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a7f059ff","line":590,"range":{"start_line":589,"start_character":8,"end_line":590,"end_character":63},"in_reply_to":"da6ed579_4cdbc24f","updated":"2016-01-14 04:07:39.000000000","message":"This comment should be fixed in hypermetro. Just like replication: \"opts.get(\u0027hypermetro\u0027) \u003d\u003d \u0027true\u0027\"","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"e546e5a65c0515bda386e8716cafcb309d737183","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"},{"line_number":594,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":595,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_47f15d00","line":592,"range":{"start_line":591,"start_character":22,"end_line":592,"end_character":58},"updated":"2016-01-14 04:07:39.000000000","message":"Same.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f85bab9aafb3f74dbc8b07e0f77489f21f3d262f","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":589,"context_line":"        if (opts.get(\u0027hypermetro\u0027)"},{"line_number":590,"context_line":"                and opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027):"},{"line_number":591,"context_line":"            err_msg \u003d (_(\"Hypermetro and Replication can not be \""},{"line_number":592,"context_line":"                         \"used in the same volume_type.\"))"},{"line_number":593,"context_line":"            LOG.error(err_msg)"},{"line_number":594,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":595,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_07684486","line":592,"range":{"start_line":591,"start_character":22,"end_line":592,"end_character":58},"in_reply_to":"da6ed579_47f15d00","updated":"2016-01-14 05:20:29.000000000","message":"Done","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"98a90d0b0cf174047cc647c579ac8fd5b778a717","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                lun_info \u003d self.client.get_lun_info(lun_id)"},{"line_number":798,"context_line":"                replica_info \u003d self.replica.create_replica("},{"line_number":799,"context_line":"                    lun_info, replica_type_change[1])"},{"line_number":800,"context_line":"                model_update.update(replica_info)"},{"line_number":801,"context_line":"            except exception.VolumeBackendAPIException:"},{"line_number":802,"context_line":"                LOG.exception(_LE(\u0027Retype volume error. \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2c7c4e1e","line":799,"range":{"start_line":799,"start_character":30,"end_line":799,"end_character":52},"updated":"2016-01-14 03:45:31.000000000","message":"The replication_type could be None(code line 897).  If not check this, it will be fail and can not know why.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"9919f3928a97cae53c00da8c2f746c5c9255272c","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                lun_info \u003d self.client.get_lun_info(lun_id)"},{"line_number":798,"context_line":"                replica_info \u003d self.replica.create_replica("},{"line_number":799,"context_line":"                    lun_info, replica_type_change[1])"},{"line_number":800,"context_line":"                model_update.update(replica_info)"},{"line_number":801,"context_line":"            except exception.VolumeBackendAPIException:"},{"line_number":802,"context_line":"                LOG.exception(_LE(\u0027Retype volume error. \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_677101a8","line":799,"range":{"start_line":799,"start_character":30,"end_line":799,"end_character":52},"in_reply_to":"da6ed579_2c7c4e1e","updated":"2016-01-14 04:01:48.000000000","message":"replication_type_change won\u0027t be None, because it\u0027s set as the same time as replication_enabled_change be set.\nI will add comments here.","commit_id":"2a1194ad9f9369b2b2245983bf29fa9dd0f1645d"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"5207d6e186c5a04ba177e78bfd6a4993ea5bd87f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027thin_provisioning_support\u0027: False,"},{"line_number":134,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":135,"context_line":"            \u0027hypermetro\u0027: False,"},{"line_number":136,"context_line":"            \u0027replication_enabled\u0027: False,"},{"line_number":137,"context_line":"            \u0027replication_type\u0027: \u0027async\u0027,"},{"line_number":138,"context_line":"        }"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_768bc768","line":136,"range":{"start_line":136,"start_character":12,"end_line":136,"end_character":41},"updated":"2016-01-14 18:41:39.000000000","message":"Where does this get enabled?","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"7d1f4f43627cf8327448512f075ac8004819b707","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027thin_provisioning_support\u0027: False,"},{"line_number":134,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":135,"context_line":"            \u0027hypermetro\u0027: False,"},{"line_number":136,"context_line":"            \u0027replication_enabled\u0027: False,"},{"line_number":137,"context_line":"            \u0027replication_type\u0027: \u0027async\u0027,"},{"line_number":138,"context_line":"        }"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_f40a4189","line":136,"range":{"start_line":136,"start_character":12,"end_line":136,"end_character":41},"in_reply_to":"da6ed579_768bc768","updated":"2016-01-15 03:32:08.000000000","message":"Here, replication_enabled\u003dFalse and replication_type is just some default capabilities, used to parse actually capabilitis in _get_opts_from_specs. We do this to keep the same style as we did before.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"5207d6e186c5a04ba177e78bfd6a4993ea5bd87f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":135,"context_line":"            \u0027hypermetro\u0027: False,"},{"line_number":136,"context_line":"            \u0027replication_enabled\u0027: False,"},{"line_number":137,"context_line":"            \u0027replication_type\u0027: \u0027async\u0027,"},{"line_number":138,"context_line":"        }"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        opts_value \u003d {"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_3bbd38b7","line":137,"range":{"start_line":137,"start_character":32,"end_line":137,"end_character":39},"updated":"2016-01-14 18:41:39.000000000","message":"Should be a list: [\u0027async\u0027]","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"7d1f4f43627cf8327448512f075ac8004819b707","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":135,"context_line":"            \u0027hypermetro\u0027: False,"},{"line_number":136,"context_line":"            \u0027replication_enabled\u0027: False,"},{"line_number":137,"context_line":"            \u0027replication_type\u0027: \u0027async\u0027,"},{"line_number":138,"context_line":"        }"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        opts_value \u003d {"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_14f2759a","line":137,"range":{"start_line":137,"start_character":32,"end_line":137,"end_character":39},"in_reply_to":"da6ed579_3bbd38b7","updated":"2016-01-15 03:32:08.000000000","message":"Ditto. It\u0027s a default value, not capabilities for report.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"5207d6e186c5a04ba177e78bfd6a4993ea5bd87f","unresolved":false,"context_lines":[{"line_number":480,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":481,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":482,"context_line":"        # So don\u0027t add this judgement into _check_migration_valid()."},{"line_number":483,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":484,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":485,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":486,"context_line":"            return (False, None)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        return self._migrate_volume(volume, host, new_type)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_3bf53856","line":485,"range":{"start_line":483,"start_character":8,"end_line":485,"end_character":53},"updated":"2016-01-14 18:41:39.000000000","message":"This same check is made many times. It would be beneficial to make this a function like _is_volume_replicated_type() or something alike.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"7d1f4f43627cf8327448512f075ac8004819b707","unresolved":false,"context_lines":[{"line_number":480,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":481,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":482,"context_line":"        # So don\u0027t add this judgement into _check_migration_valid()."},{"line_number":483,"context_line":"        volume_type \u003d self._get_volume_type(volume)"},{"line_number":484,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":485,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":486,"context_line":"            return (False, None)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        return self._migrate_volume(volume, host, new_type)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_6f1f5808","line":485,"range":{"start_line":483,"start_character":8,"end_line":485,"end_character":53},"in_reply_to":"da6ed579_3bf53856","updated":"2016-01-15 03:32:08.000000000","message":"That\u0027s a good idea. But there is another problem. If we put all the three line into a function, then when we judge a replication support, we get all opts again (see create volume workflow), include other capabilities: smartthin, smartthick, smarttier, etc.\nWe can do it in another improvement bp. Thanks for you advice.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"5207d6e186c5a04ba177e78bfd6a4993ea5bd87f","unresolved":false,"context_lines":[{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1077,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1078,"context_line":"        volume_type \u003d self._get_volume_type(vref)"},{"line_number":1079,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":1080,"context_line":"        targets \u003d []"},{"line_number":1081,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":1082,"context_line":"            targets \u003d self.replica.list_replica_targets(vref)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        return {\u0027volume_id\u0027: vref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_9bb22493","line":1081,"range":{"start_line":1078,"start_character":8,"end_line":1081,"end_character":53},"updated":"2016-01-14 18:41:39.000000000","message":"No need for this check. The cinder volume API will not call the driver if the volume is not of replicated type. If it does not have replication_enabled\u003d\u003cis\u003e True","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"7d1f4f43627cf8327448512f075ac8004819b707","unresolved":false,"context_lines":[{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1077,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1078,"context_line":"        volume_type \u003d self._get_volume_type(vref)"},{"line_number":1079,"context_line":"        opts \u003d self._get_volume_params(volume_type)"},{"line_number":1080,"context_line":"        targets \u003d []"},{"line_number":1081,"context_line":"        if opts.get(\u0027replication_enabled\u0027) \u003d\u003d \u0027true\u0027:"},{"line_number":1082,"context_line":"            targets \u003d self.replica.list_replica_targets(vref)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        return {\u0027volume_id\u0027: vref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_6f5d1846","line":1081,"range":{"start_line":1078,"start_character":8,"end_line":1081,"end_character":53},"in_reply_to":"da6ed579_9bb22493","updated":"2016-01-15 03:32:08.000000000","message":"Yes, it\u0027s my mistake. A decorator named valid_replication_volume in volume/api.py do that check, like enable/disable/failover do.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"ba51ff8a3c16859c490a3d87757f1e44542eb91f","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    def migrate_volume(self, ctxt, volume, host, new_type\u003dNone):"},{"line_number":479,"context_line":"        \"\"\"Migrate a volume within the same array.\"\"\""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":482,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":483,"context_line":"        # So don\u0027t add this judgement into _check_migration_valid()."},{"line_number":484,"context_line":"        volume_type \u003d self._get_volume_type(volume)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_98bba1c4","line":481,"range":{"start_line":481,"start_character":10,"end_line":481,"end_character":14},"updated":"2016-01-19 08:59:28.000000000","message":"Should add your name here: NOTE(name)","commit_id":"644d7a3ef4dc9dc313f4265f391fe9a675fa5d43"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"5fa21ab081b9ee1f9206adef97b0785c22cc1f04","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    def migrate_volume(self, ctxt, volume, host, new_type\u003dNone):"},{"line_number":479,"context_line":"        \"\"\"Migrate a volume within the same array.\"\"\""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # NOTE: Replication volume can\u0027t migrate. But retype"},{"line_number":482,"context_line":"        # can remove replication relationship first then do migrate."},{"line_number":483,"context_line":"        # So don\u0027t add this judgement into _check_migration_valid()."},{"line_number":484,"context_line":"        volume_type \u003d self._get_volume_type(volume)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_b531c3ee","line":481,"range":{"start_line":481,"start_character":10,"end_line":481,"end_character":14},"in_reply_to":"ba63e191_98bba1c4","updated":"2016-01-19 11:34:02.000000000","message":"Done. I\u0027ll correct all about this.","commit_id":"644d7a3ef4dc9dc313f4265f391fe9a675fa5d43"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"ba51ff8a3c16859c490a3d87757f1e44542eb91f","unresolved":false,"context_lines":[{"line_number":638,"context_line":"        self._copy_volume(volume, luncopy_name,"},{"line_number":639,"context_line":"                          snapshot_id, tgt_lun_id)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        # NOTE: Actually, we just only support replication here right now,"},{"line_number":642,"context_line":"        # not hypermetro."},{"line_number":643,"context_line":"        model_update \u003d self._add_extend_type_to_volume(opts, lun_params,"},{"line_number":644,"context_line":"                                                       lun_info, model_update)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_58b0c9f4","line":641,"range":{"start_line":641,"start_character":10,"end_line":641,"end_character":15},"updated":"2016-01-19 08:59:28.000000000","message":"should add your name here: NOTE(name)","commit_id":"644d7a3ef4dc9dc313f4265f391fe9a675fa5d43"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"5fa21ab081b9ee1f9206adef97b0785c22cc1f04","unresolved":false,"context_lines":[{"line_number":638,"context_line":"        self._copy_volume(volume, luncopy_name,"},{"line_number":639,"context_line":"                          snapshot_id, tgt_lun_id)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        # NOTE: Actually, we just only support replication here right now,"},{"line_number":642,"context_line":"        # not hypermetro."},{"line_number":643,"context_line":"        model_update \u003d self._add_extend_type_to_volume(opts, lun_params,"},{"line_number":644,"context_line":"                                                       lun_info, model_update)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_954b5f59","line":641,"range":{"start_line":641,"start_character":10,"end_line":641,"end_character":15},"in_reply_to":"ba63e191_58b0c9f4","updated":"2016-01-19 11:34:02.000000000","message":"Done","commit_id":"644d7a3ef4dc9dc313f4265f391fe9a675fa5d43"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e6c5c5ca75931d5b0ea00037154baa1bef0b769c","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            except exception.VolumeBackendAPIException as err:"},{"line_number":363,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":364,"context_line":"                    self._delete_volume(volume)"},{"line_number":365,"context_line":"                    LOG.exception(_LE(\"Delete replication error: %s.\"), err)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        self._delete_volume(volume)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_39ea9210","line":365,"updated":"2016-02-04 05:14:41.000000000","message":"\"err\" can be removed here.  If you are using LOG.exception, it will log the exception.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f1a155a0ae73798a6e17aed22db46725aa5cdbf0","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            except exception.VolumeBackendAPIException as err:"},{"line_number":363,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":364,"context_line":"                    self._delete_volume(volume)"},{"line_number":365,"context_line":"                    LOG.exception(_LE(\"Delete replication error: %s.\"), err)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        self._delete_volume(volume)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_7878f2c4","line":365,"in_reply_to":"5a5ae5dd_39ea9210","updated":"2016-02-04 12:39:16.000000000","message":"Done. This advice is much helpful.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e6c5c5ca75931d5b0ea00037154baa1bef0b769c","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1402,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1403,"context_line":"        return self.replica.list_replica_targets(vref)"},{"line_number":1404,"context_line":""},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":"class HuaweiISCSIDriver(HuaweiBaseDriver, driver.ISCSIDriver):"},{"line_number":1407,"context_line":"    \"\"\"ISCSI driver for Huawei storage arrays."}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_199d5659","line":1404,"updated":"2016-02-04 05:14:41.000000000","message":"There\u0027s a get_replication_updates that should be implemented too.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f1a155a0ae73798a6e17aed22db46725aa5cdbf0","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1402,"context_line":"        \"\"\"Obtain volume repliction targets.\"\"\""},{"line_number":1403,"context_line":"        return self.replica.list_replica_targets(vref)"},{"line_number":1404,"context_line":""},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":"class HuaweiISCSIDriver(HuaweiBaseDriver, driver.ISCSIDriver):"},{"line_number":1407,"context_line":"    \"\"\"ISCSI driver for Huawei storage arrays."}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_58541620","line":1404,"in_reply_to":"5a5ae5dd_199d5659","updated":"2016-02-04 12:39:16.000000000","message":"Done. Yes, the func in base driver will raise NoImplement exception.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e6c5c5ca75931d5b0ea00037154baa1bef0b769c","unresolved":false,"context_lines":[{"line_number":1423,"context_line":"        2.0.5 - Replication V2 support"},{"line_number":1424,"context_line":"    \"\"\""},{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":"    VERSION \u003d \"2.0.5\""},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":1429,"context_line":"        super(HuaweiISCSIDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_b9c5228f","line":1426,"updated":"2016-02-04 05:14:41.000000000","message":"Why jumping from 2.0.3 to 2.0.5?","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f1a155a0ae73798a6e17aed22db46725aa5cdbf0","unresolved":false,"context_lines":[{"line_number":1423,"context_line":"        2.0.5 - Replication V2 support"},{"line_number":1424,"context_line":"    \"\"\""},{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":"    VERSION \u003d \"2.0.5\""},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":1429,"context_line":"        super(HuaweiISCSIDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_1351a10e","line":1426,"in_reply_to":"5a5ae5dd_b9c5228f","updated":"2016-02-04 12:39:16.000000000","message":"We want HuaweiISCSIDriver keep consistent version with HuaweiFCDriver.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"}],"cinder/volume/drivers/huawei/replication.py":[{"author":{"_account_id":18026,"name":"huanan","email":"huanan@huawei.com","username":"huanan"},"change_message_id":"4ace072e28078beac91cc0ac804203fbc220f67a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def get_replica_info(self, replica_id):"},{"line_number":64,"context_line":"        return {}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def _is_status(self, status_key, status, replica_info):"},{"line_number":67,"context_line":"        if type(status) in (list, tuple):"},{"line_number":68,"context_line":"            return replica_info.get(status_key, \u0027\u0027) in status"},{"line_number":69,"context_line":"        if type(status) is str:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_9877c639","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":18},"updated":"2015-12-26 07:18:17.000000000","message":"Get status information from replica_info,so i think this named _get_status or _get_current_status is more appropriate.","commit_id":"5600a9d522f9f4026658b476b2c6789aaf526120"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"9ff81efe74e885882b508c0d058f7ac070bfdd19","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        params \u003d {"},{"line_number":92,"context_line":"            \"LOCALRESID\": local_lun_id,"},{"line_number":93,"context_line":"            \"LOCALRESTYPE\": \u002711\u0027,"},{"line_number":94,"context_line":"            \"REMOTEDEVICEID\": rmt_dev_id,"},{"line_number":95,"context_line":"            \"REMOTEDEVICENAME\": rmt_dev_name,"},{"line_number":96,"context_line":"            \"REMOTERESID\": rmt_lun_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_3a423869","line":93,"range":{"start_line":93,"start_character":29,"end_line":93,"end_character":31},"updated":"2015-12-28 02:59:00.000000000","message":"What the \"11\" means?","commit_id":"5600a9d522f9f4026658b476b2c6789aaf526120"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"9ff81efe74e885882b508c0d058f7ac070bfdd19","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        lun_info \u003d self.rmt_client.get_lun_info(rmt_lun_id)"},{"line_number":640,"context_line":"        lun_wwn \u003d lun_info.get(\u0027WWN\u0027)"},{"line_number":641,"context_line":"        lun_pool \u003d lun_info.get(\u0027PARENTNAME\u0027)"},{"line_number":642,"context_line":"        new_backend \u003d re.sub(r\u0027(\u003c\u003d#).*$\u0027, lun_pool, self.rmt_backend)"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        self.rmt_driver.failover(pair_id)"},{"line_number":645,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_fd982ac2","line":642,"range":{"start_line":642,"start_character":29,"end_line":642,"end_character":40},"updated":"2015-12-28 02:59:00.000000000","message":"r\u0027(\u003c\u003d#).*$\u0027 should be r\u0027(?\u003c\u003d#).*$\u0027","commit_id":"5600a9d522f9f4026658b476b2c6789aaf526120"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        if not self.op.is_primary(info):"},{"line_number":212,"context_line":"            self.switch(replica_id)"},{"line_number":213,"context_line":"        self.sync(replica_id)"},{"line_number":214,"context_line":"        return None"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def disable(self, replica_id):"},{"line_number":217,"context_line":"        self.split(replica_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_0cba25e2","line":214,"updated":"2015-12-30 09:59:01.000000000","message":"No need to return None. Function will return None be default.","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def disable(self, replica_id):"},{"line_number":217,"context_line":"        self.split(replica_id)"},{"line_number":218,"context_line":"        return None"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def switch(self, replica_id):"},{"line_number":221,"context_line":"        self.split(replica_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_ccb3ad09","line":218,"updated":"2015-12-30 09:59:01.000000000","message":"Ditto","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        self.split(replica_id)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        # NOTE: invalid pair status can set protect secondary?"},{"line_number":259,"context_line":"        self.op.unprotect_second(replica_id)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def wait_replica_ready(self, replica_id, interval\u003dNone, timeout\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6cc5e159","line":258,"updated":"2015-12-30 09:59:01.000000000","message":"s/invalid/Invalid, also, is this a question or a TODO?","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        # managed_backed_name format: host_name@backend_name#pool_name"},{"line_number":345,"context_line":"        self.rmt_backend \u003d self.replica_device[0][\u0027managed_backend_name\u0027]"},{"line_number":346,"context_line":"        self.rmt_pool \u003d re.sub(\"^.*#\", \"\", self.rmt_backend)"},{"line_number":347,"context_line":"        self.dev_target_id \u003d self.replica_device[0][\u0027device_target_id\u0027]"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        self._init_rmt_client()"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_38872b63","line":346,"updated":"2015-12-30 08:13:15.000000000","message":"You can leverage existing \u0027extract_host(rmt_backend, \u0027pool\u0027)\u0027in cinder/volume/utils.py","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        try:"},{"line_number":359,"context_line":"            self.rmt_client.login()"},{"line_number":360,"context_line":"        except Exception as err:"},{"line_number":361,"context_line":"            LOG.warning(_LW(\u0027Remote array login error. err:%s\u0027), err)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def try_get_remote_wwn(self):"},{"line_number":364,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6caac172","line":361,"range":{"start_line":361,"start_character":53,"end_line":361,"end_character":69},"updated":"2015-12-30 09:59:01.000000000","message":"Please add a space after \":\", like line 368.","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"    def update_replica_capability(self, stats):"},{"line_number":407,"context_line":"        is_rmt_dev_available \u003d self.check_remote_available()"},{"line_number":408,"context_line":"        if not is_rmt_dev_available:"},{"line_number":409,"context_line":"            return stats"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        # NOTE: If we can put that capabilities into stats, not pools?"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_1837c7b1","line":408,"updated":"2015-12-30 08:13:15.000000000","message":"Do you want to level a warning or raise exception here to notify admin configured replicate device is unavailable?","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        if not is_rmt_dev_available:"},{"line_number":409,"context_line":"            return stats"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        # NOTE: If we can put that capabilities into stats, not pools?"},{"line_number":412,"context_line":"        for pool in stats[\u0027pools\u0027]:"},{"line_number":413,"context_line":"            pool[\u0027replication_enabled\u0027] \u003d True"},{"line_number":414,"context_line":"            pool[\u0027replication_type\u0027] \u003d [\u0027sync\u0027, \u0027async\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_8c3ff524","line":411,"updated":"2015-12-30 09:59:01.000000000","message":"Can you confirm this now, or this is still a question?","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            \u0027WRITECACHEPOLICY\u0027: self.conf.lun_write_cache_policy,"},{"line_number":456,"context_line":"        }"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        LOG.debug(\u0027Remote lun params: %s.\u0027 % params)"},{"line_number":459,"context_line":"        return params"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def wait_volume_online(self, client, lun_id, lun_info,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_0c79c5fc","line":458,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":499,"context_line":"            3. enable replication pair"},{"line_number":500,"context_line":"        \"\"\""},{"line_number":501,"context_line":"        LOG.debug((\u0027Create replication, local lun info: %(info)s,\u0027"},{"line_number":502,"context_line":"                   \u0027replication model: %(model)s.\u0027) %"},{"line_number":503,"context_line":"                  {\u0027info\u0027: local_lun_info, \u0027model\u0027: replica_model})"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        local_lun_id \u003d local_lun_info[\u0027ID\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_2cccc934","line":502,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":545,"context_line":"                       \u0027rmt_lun_id\u0027: rmt_lun_id}"},{"line_number":546,"context_line":"        model_update[\u0027replication_driver_data\u0027] \u003d to_string(driver_data)"},{"line_number":547,"context_line":"        model_update[\u0027replication_status\u0027] \u003d \u0027enabled\u0027"},{"line_number":548,"context_line":"        LOG.debug(\u0027Create replication, return info: %s.\u0027 % model_update)"},{"line_number":549,"context_line":"        return model_update"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def _delete_pair(self, pair_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_4c933dfb","line":548,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        \"\"\"Delete replication pair and remote lun"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        step:"},{"line_number":567,"context_line":"            1, delete replication pair"},{"line_number":568,"context_line":"            2, delete remote_lun"},{"line_number":569,"context_line":"        \"\"\""},{"line_number":570,"context_line":"        LOG.debug(\u0027Delete replication. volume: %s\u0027 % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_ec3f91d4","line":567,"updated":"2015-12-30 09:59:01.000000000","message":"Please be consistent with line 497, use \"1.\" or \"1,\" both.","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":567,"context_line":"            1, delete replication pair"},{"line_number":568,"context_line":"            2, delete remote_lun"},{"line_number":569,"context_line":"        \"\"\""},{"line_number":570,"context_line":"        LOG.debug(\u0027Delete replication. volume: %s\u0027 % volume[\u0027id\u0027])"},{"line_number":571,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":572,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"},{"line_number":573,"context_line":"        if pair_id:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_cc116d5f","line":570,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            1. If local backend\u0027s array is secondary, switch to primary"},{"line_number":586,"context_line":"            2. Synchronize data"},{"line_number":587,"context_line":"        \"\"\""},{"line_number":588,"context_line":"        LOG.debug(\u0027Enable replication. volume:%s.\u0027 % volume[\u0027id\u0027])"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":591,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_a710d24f","line":588,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def disable_replica(self, volume):"},{"line_number":610,"context_line":"        \"\"\"We consider that all abnormal states is disabled.\"\"\""},{"line_number":611,"context_line":"        LOG.debug(\u0027Disable replication. volume:%s.\u0027 % volume[\u0027id\u0027])"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":614,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_873a6ecc","line":611,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def failover_replica(self, volume):"},{"line_number":622,"context_line":"        \"\"\"Just make the secondary available.\"\"\""},{"line_number":623,"context_line":"        LOG.debug(\u0027Failover replication. volume:%s.\u0027 % volume[\u0027id\u0027])"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":626,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_074d1e72","line":623,"updated":"2015-12-30 09:59:01.000000000","message":"Please change \"%\" to \",\".","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"7406308a8d70ee2997b3d70eac680459a09e322f","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        lun_pool \u003d lun_info.get(\u0027PARENTNAME\u0027)"},{"line_number":642,"context_line":"        new_backend \u003d re.sub(r\u0027(?\u003c\u003d#).*$\u0027, lun_pool, self.rmt_backend)"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        self.rmt_driver.failover(pair_id)"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        metadata \u003d huawei_utils.get_volume_metadata(volume)"},{"line_number":647,"context_line":"        metadata.update({\u0027lun_wwn\u0027: lun_wwn})"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_38e2cbd6","line":644,"updated":"2015-12-30 08:13:15.000000000","message":"Looks like your implementation doesn\u0027t support failover back and forth.\n\nFYI, back and forth is supported after this patch:\nhttps://review.openstack.org/#/c/219900/","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    def failover(self, replica_id):"},{"line_number":240,"context_line":"        \"\"\"Failover replication."},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        Perpuse:"},{"line_number":243,"context_line":"            1. Split replication."},{"line_number":244,"context_line":"            2. Set secondary access read \u0026 write."},{"line_number":245,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_cf7c8db7","line":242,"range":{"start_line":242,"start_character":8,"end_line":242,"end_character":15},"updated":"2016-01-05 01:53:27.000000000","message":"s/Perpuse/Purpose","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    def failover(self, replica_id):"},{"line_number":240,"context_line":"        \"\"\"Failover replication."},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        Perpuse:"},{"line_number":243,"context_line":"            1. Split replication."},{"line_number":244,"context_line":"            2. Set secondary access read \u0026 write."},{"line_number":245,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_cb531ae1","line":242,"range":{"start_line":242,"start_character":8,"end_line":242,"end_character":15},"in_reply_to":"fa69d971_cf7c8db7","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def _init_rmt_client(self):"},{"line_number":422,"context_line":"        # Multiple addresses support."},{"line_number":423,"context_line":"        rmt_addrs \u003d self.replica_device[0][\u0027san_address\u0027].split(\u0027;\u0027)"},{"line_number":424,"context_line":"        rmt_addrs \u003d list(set([x.strip() for x in rmt_addrs if x.strip()]))"},{"line_number":425,"context_line":"        rmt_user \u003d self.replica_device[0][\u0027san_user\u0027]"},{"line_number":426,"context_line":"        rmt_password \u003d self.replica_device[0][\u0027san_password\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_610c953b","line":423,"range":{"start_line":423,"start_character":25,"end_line":423,"end_character":39},"updated":"2016-01-05 01:53:27.000000000","message":"Maybe replica_device is None here. Add \"if not self.replica_device:\".","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def _init_rmt_client(self):"},{"line_number":422,"context_line":"        # Multiple addresses support."},{"line_number":423,"context_line":"        rmt_addrs \u003d self.replica_device[0][\u0027san_address\u0027].split(\u0027;\u0027)"},{"line_number":424,"context_line":"        rmt_addrs \u003d list(set([x.strip() for x in rmt_addrs if x.strip()]))"},{"line_number":425,"context_line":"        rmt_user \u003d self.replica_device[0][\u0027san_user\u0027]"},{"line_number":426,"context_line":"        rmt_password \u003d self.replica_device[0][\u0027san_password\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_ab0ca6ed","line":423,"range":{"start_line":423,"start_character":25,"end_line":423,"end_character":39},"in_reply_to":"fa69d971_610c953b","updated":"2016-01-05 06:39:36.000000000","message":"This is internal module, so we don\u0027t need to check if var is valid when we did it in outside module. Here, we do check in __init__.","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":501,"context_line":"            2. create replication pair"},{"line_number":502,"context_line":"            3. enable replication pair"},{"line_number":503,"context_line":"        \"\"\""},{"line_number":504,"context_line":"        LOG.debug((\u0027Create replication, local lun info: %(info)s,\u0027"},{"line_number":505,"context_line":"                   \u0027replication model: %(model)s.\u0027),"},{"line_number":506,"context_line":"                  {\u0027info\u0027: local_lun_info, \u0027model\u0027: replica_model})"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_0144b947","line":504,"range":{"start_line":504,"start_character":55,"end_line":504,"end_character":65},"updated":"2016-01-05 01:53:27.000000000","message":"Missing a blank space EOL.","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":501,"context_line":"            2. create replication pair"},{"line_number":502,"context_line":"            3. enable replication pair"},{"line_number":503,"context_line":"        \"\"\""},{"line_number":504,"context_line":"        LOG.debug((\u0027Create replication, local lun info: %(info)s,\u0027"},{"line_number":505,"context_line":"                   \u0027replication model: %(model)s.\u0027),"},{"line_number":506,"context_line":"                  {\u0027info\u0027: local_lun_info, \u0027model\u0027: replica_model})"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_4b0deae6","line":504,"range":{"start_line":504,"start_character":55,"end_line":504,"end_character":65},"in_reply_to":"fa69d971_0144b947","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"618b3b1845e98b21c657928d4558d0283c1c9b75","unresolved":false,"context_lines":[{"line_number":566,"context_line":"    def delete_replica(self, volume):"},{"line_number":567,"context_line":"        \"\"\"Delete replication pair and remote lun"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"        step:"},{"line_number":570,"context_line":"            1, delete replication pair"},{"line_number":571,"context_line":"            2, delete remote_lun"},{"line_number":572,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_c1b78138","line":569,"range":{"start_line":569,"start_character":8,"end_line":569,"end_character":12},"updated":"2016-01-05 01:53:27.000000000","message":"step or purpose, please keep consistent with other functions.","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"856c8bcc639c78d44d7b18b8e8e20477477cecde","unresolved":false,"context_lines":[{"line_number":566,"context_line":"    def delete_replica(self, volume):"},{"line_number":567,"context_line":"        \"\"\"Delete replication pair and remote lun"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"        step:"},{"line_number":570,"context_line":"            1, delete replication pair"},{"line_number":571,"context_line":"            2, delete remote_lun"},{"line_number":572,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_ebfe1ead","line":569,"range":{"start_line":569,"start_character":8,"end_line":569,"end_character":12},"in_reply_to":"fa69d971_c1b78138","updated":"2016-01-05 06:39:36.000000000","message":"Done","commit_id":"c2acc3f3afffd6d99d796a97fa57e90e235fcaf9"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"084d6096411578ab82a02e293b2e0248669c74a2","unresolved":false,"context_lines":[{"line_number":652,"context_line":"        new_driver_data \u003d {\u0027pair_id\u0027: pair_id,"},{"line_number":653,"context_line":"                           \u0027rmt_lun_id\u0027: volume[\u0027provider_location\u0027]}"},{"line_number":654,"context_line":"        new_driver_data \u003d to_string(new_driver_data)"},{"line_number":655,"context_line":"        return {\u0027host\u0027: new_backend,"},{"line_number":656,"context_line":"                \u0027provider_location\u0027: rmt_lun_id,"},{"line_number":657,"context_line":"                \u0027replication_driver_data\u0027: new_driver_data,"},{"line_number":658,"context_line":"                \u0027metadata\u0027: metadata}"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_e77b43f3","line":655,"updated":"2016-01-07 08:30:10.000000000","message":"Do you support failover back and forth?\nex:\nA is primary back end, B is secondary\n1. failover from A to B\n2. then failover from B to A again\n\nWill step #2 fail, since B does not konw the B\u0027s host string?","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"d9be077fce4acffe557c9938e385b99061b842b1","unresolved":false,"context_lines":[{"line_number":652,"context_line":"        new_driver_data \u003d {\u0027pair_id\u0027: pair_id,"},{"line_number":653,"context_line":"                           \u0027rmt_lun_id\u0027: volume[\u0027provider_location\u0027]}"},{"line_number":654,"context_line":"        new_driver_data \u003d to_string(new_driver_data)"},{"line_number":655,"context_line":"        return {\u0027host\u0027: new_backend,"},{"line_number":656,"context_line":"                \u0027provider_location\u0027: rmt_lun_id,"},{"line_number":657,"context_line":"                \u0027replication_driver_data\u0027: new_driver_data,"},{"line_number":658,"context_line":"                \u0027metadata\u0027: metadata}"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_c4387240","line":655,"in_reply_to":"fa69d971_e77b43f3","updated":"2016-01-07 12:34:39.000000000","message":"First, sorry. I forget click reply button to reply your review work last time.\n\nSecond, Yes we can failback from B to A. \n1. After A-\u003eB failover, replication_status was set to failover. We need 3rd party force to change replication_status to disabled. Then do enable, So we can do failback to A.\nThere is another change, review id 219900, make failover status can do enable again. We are happy for that.\n2. B must know remote device A. In the configuration file, as we described in commit message, A must know B, and B must know A. If not, it\u0027s an incorrect configure.\n\nAgain, thanks for your work.","commit_id":"93c17fed599196ec02969a797595b282e027acdf"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"181e132aefeba6ca52dd192a02db20ebcd73558e","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        self.rmt_backend \u003d self.replica_device[0][\u0027managed_backend_name\u0027]"},{"line_number":345,"context_line":"        self.rmt_pool \u003d volume_utils.extract_host(self.rmt_backend,"},{"line_number":346,"context_line":"                                                  level\u003d\u0027pool\u0027)"},{"line_number":347,"context_line":"        self.dev_target_id \u003d self.replica_device[0][\u0027device_target_id\u0027]"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        self._init_rmt_client()"},{"line_number":350,"context_line":"        self.local_op \u003d PairOp(self.local_client)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa69d971_2518d774","line":347,"updated":"2016-01-11 08:33:49.000000000","message":"should be target_device_id","commit_id":"b9ed3a6eddd7c9a920db69ef9eda09c74ebeee60"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"5207d6e186c5a04ba177e78bfd6a4993ea5bd87f","unresolved":false,"context_lines":[{"line_number":661,"context_line":"            LOG.warning(_LW(\u0027Replication driver data does not exist. \u0027"},{"line_number":662,"context_line":"                            \u0027Volume: %s\u0027), volume[\u0027id\u0027])"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        targets \u003d [{\u0027type\u0027: \u0027managed\u0027,"},{"line_number":665,"context_line":"                    \u0027backend_name\u0027: self.rmt_backend,"},{"line_number":666,"context_line":"                    \u0027target_device_id\u0027: self.target_dev_id}]"},{"line_number":667,"context_line":"        return targets"},{"line_number":668,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_963c3bc9","line":665,"range":{"start_line":664,"start_character":20,"end_line":665,"end_character":53},"updated":"2016-01-14 18:41:39.000000000","message":"These two will not be printed out when listing the targets.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"7d1f4f43627cf8327448512f075ac8004819b707","unresolved":false,"context_lines":[{"line_number":661,"context_line":"            LOG.warning(_LW(\u0027Replication driver data does not exist. \u0027"},{"line_number":662,"context_line":"                            \u0027Volume: %s\u0027), volume[\u0027id\u0027])"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        targets \u003d [{\u0027type\u0027: \u0027managed\u0027,"},{"line_number":665,"context_line":"                    \u0027backend_name\u0027: self.rmt_backend,"},{"line_number":666,"context_line":"                    \u0027target_device_id\u0027: self.target_dev_id}]"},{"line_number":667,"context_line":"        return targets"},{"line_number":668,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_4f593334","line":665,"range":{"start_line":664,"start_character":20,"end_line":665,"end_character":53},"in_reply_to":"da6ed579_963c3bc9","updated":"2016-01-15 03:32:08.000000000","message":"Done.\nI found your bp about replication v2 support in cinderclient just use it. But the function comments in manager/driver said more. Here I can just return target_device_id. Maybe we can do more in the future.","commit_id":"33e0c082d1aba14180bc6ec849d04083dac50a3c"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"ba89ca26c8b9d2a84dfb363bdd9d0c379ef33e02","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                                             rmt_dev_name, replica_model)"},{"line_number":528,"context_line":"            pair_id \u003d pair_info[\u0027ID\u0027]"},{"line_number":529,"context_line":"        except Exception as err:"},{"line_number":530,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":531,"context_line":"                self._delete_rmt_lun(rmt_lun_id)"},{"line_number":532,"context_line":"                LOG.error(_LE(\u0027Create pair failed. Error: %s\u0027), err)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        # step4, start sync manually. If replication type is sync,"},{"line_number":535,"context_line":"        # then wait for sync complete."}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_c264a8e6","line":532,"range":{"start_line":530,"start_character":11,"end_line":532,"end_character":68},"updated":"2016-02-04 03:59:23.000000000","message":"Logging error must be before the cleanup operations, because if cleanup fail, this error will not be recorded in your log.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"f1a155a0ae73798a6e17aed22db46725aa5cdbf0","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                                             rmt_dev_name, replica_model)"},{"line_number":528,"context_line":"            pair_id \u003d pair_info[\u0027ID\u0027]"},{"line_number":529,"context_line":"        except Exception as err:"},{"line_number":530,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":531,"context_line":"                self._delete_rmt_lun(rmt_lun_id)"},{"line_number":532,"context_line":"                LOG.error(_LE(\u0027Create pair failed. Error: %s\u0027), err)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        # step4, start sync manually. If replication type is sync,"},{"line_number":535,"context_line":"        # then wait for sync complete."}],"source_content_type":"text/x-python","patch_set":30,"id":"5a5ae5dd_5347194b","line":532,"range":{"start_line":530,"start_character":11,"end_line":532,"end_character":68},"in_reply_to":"5a5ae5dd_c264a8e6","updated":"2016-02-04 12:39:16.000000000","message":"Done. Good boy.","commit_id":"18aeff5258aed4c1e43d2f405c71c02dde5e29bc"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if replica_model \u003d\u003d constants.REPLICA_ASYNC_MODEL:"},{"line_number":105,"context_line":"            # Synchronize type values:"},{"line_number":106,"context_line":"            # 1, manual"},{"line_number":107,"context_line":"            # 2, timed wait whe synchronization begins"},{"line_number":108,"context_line":"            # 3, timed wait whe synchronization ends"},{"line_number":109,"context_line":"            params[\u0027SYNCHRONIZETYPE\u0027] \u003d \u00272\u0027"},{"line_number":110,"context_line":"            params[\u0027TIMINGVAL\u0027] \u003d period"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_61a224ff","line":107,"range":{"start_line":107,"start_character":23,"end_line":107,"end_character":27},"updated":"2016-02-06 06:32:16.000000000","message":"s/whe/when","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if replica_model \u003d\u003d constants.REPLICA_ASYNC_MODEL:"},{"line_number":105,"context_line":"            # Synchronize type values:"},{"line_number":106,"context_line":"            # 1, manual"},{"line_number":107,"context_line":"            # 2, timed wait whe synchronization begins"},{"line_number":108,"context_line":"            # 3, timed wait whe synchronization ends"},{"line_number":109,"context_line":"            params[\u0027SYNCHRONIZETYPE\u0027] \u003d \u00272\u0027"},{"line_number":110,"context_line":"            params[\u0027TIMINGVAL\u0027] \u003d period"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_1a25bb5a","line":107,"range":{"start_line":107,"start_character":23,"end_line":107,"end_character":27},"in_reply_to":"5a5ae5dd_61a224ff","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            # Synchronize type values:"},{"line_number":106,"context_line":"            # 1, manual"},{"line_number":107,"context_line":"            # 2, timed wait whe synchronization begins"},{"line_number":108,"context_line":"            # 3, timed wait whe synchronization ends"},{"line_number":109,"context_line":"            params[\u0027SYNCHRONIZETYPE\u0027] \u003d \u00272\u0027"},{"line_number":110,"context_line":"            params[\u0027TIMINGVAL\u0027] \u003d period"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_c1b19848","line":108,"range":{"start_line":108,"start_character":31,"end_line":108,"end_character":32},"updated":"2016-02-06 06:32:16.000000000","message":"s/whe/when","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            # Synchronize type values:"},{"line_number":106,"context_line":"            # 1, manual"},{"line_number":107,"context_line":"            # 2, timed wait whe synchronization begins"},{"line_number":108,"context_line":"            # 3, timed wait whe synchronization ends"},{"line_number":109,"context_line":"            params[\u0027SYNCHRONIZETYPE\u0027] \u003d \u00272\u0027"},{"line_number":110,"context_line":"            params[\u0027TIMINGVAL\u0027] \u003d period"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_3a28b732","line":108,"range":{"start_line":108,"start_character":31,"end_line":108,"end_character":32},"in_reply_to":"5a5ae5dd_c1b19848","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        # If running status is connected, \u0027RUNNINGSTATUS\u0027 \u003d\u003d \u002710\u0027."},{"line_number":398,"context_line":"        if (device and device.get(\u0027ARRAYTYPE\u0027) \u003d\u003d \u00271\u0027"},{"line_number":399,"context_line":"                and device.get(\u0027HEALTHSTATUS\u0027) \u003d\u003d \u00271\u0027"},{"line_number":400,"context_line":"                and device.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d \u002710\u0027):"},{"line_number":401,"context_line":"            return True"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_3c91b347","line":400,"range":{"start_line":400,"start_character":52,"end_line":400,"end_character":54},"updated":"2016-02-06 06:32:16.000000000","message":"Some well pre-defined flags may be much better than numbers here.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        # If running status is connected, \u0027RUNNINGSTATUS\u0027 \u003d\u003d \u002710\u0027."},{"line_number":398,"context_line":"        if (device and device.get(\u0027ARRAYTYPE\u0027) \u003d\u003d \u00271\u0027"},{"line_number":399,"context_line":"                and device.get(\u0027HEALTHSTATUS\u0027) \u003d\u003d \u00271\u0027"},{"line_number":400,"context_line":"                and device.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d \u002710\u0027):"},{"line_number":401,"context_line":"            return True"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_da616306","line":400,"range":{"start_line":400,"start_character":52,"end_line":400,"end_character":54},"in_reply_to":"5a5ae5dd_3c91b347","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        LOG.debug(\u0027Remote lun params: %s.\u0027, params)"},{"line_number":461,"context_line":"        return params"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def wait_volume_online(self, client, lun_id, lun_info,"},{"line_number":464,"context_line":"                           interval\u003dNone, timeout\u003dNone):"},{"line_number":465,"context_line":"        online_status \u003d constants.STATUS_VOLUME_READY"},{"line_number":466,"context_line":"        if lun_info.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d online_status:"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_9c8ea7ce","line":463,"range":{"start_line":463,"start_character":49,"end_line":463,"end_character":57},"updated":"2016-02-06 06:32:16.000000000","message":"Not sure why you need two parameters here. Maybe one is OK?","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        LOG.debug(\u0027Remote lun params: %s.\u0027, params)"},{"line_number":461,"context_line":"        return params"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def wait_volume_online(self, client, lun_id, lun_info,"},{"line_number":464,"context_line":"                           interval\u003dNone, timeout\u003dNone):"},{"line_number":465,"context_line":"        online_status \u003d constants.STATUS_VOLUME_READY"},{"line_number":466,"context_line":"        if lun_info.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d online_status:"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_25565806","line":463,"range":{"start_line":463,"start_character":49,"end_line":463,"end_character":57},"in_reply_to":"5a5ae5dd_9c8ea7ce","updated":"2016-02-08 10:03:20.000000000","message":"Good advice.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                           interval\u003dNone, timeout\u003dNone):"},{"line_number":465,"context_line":"        online_status \u003d constants.STATUS_VOLUME_READY"},{"line_number":466,"context_line":"        if lun_info.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d online_status:"},{"line_number":467,"context_line":"            return"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"        def _wait_online():"},{"line_number":470,"context_line":"            info \u003d client.get_lun_info(lun_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_fc6a3bec","line":467,"range":{"start_line":467,"start_character":12,"end_line":467,"end_character":18},"updated":"2016-02-06 06:32:16.000000000","message":"As you have made a function _wait_online() after that, why don\u0027t use it to substitute 466~467?","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                           interval\u003dNone, timeout\u003dNone):"},{"line_number":465,"context_line":"        online_status \u003d constants.STATUS_VOLUME_READY"},{"line_number":466,"context_line":"        if lun_info.get(\u0027RUNNINGSTATUS\u0027) \u003d\u003d online_status:"},{"line_number":467,"context_line":"            return"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"        def _wait_online():"},{"line_number":470,"context_line":"            info \u003d client.get_lun_info(lun_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_e59920c5","line":467,"range":{"start_line":467,"start_character":12,"end_line":467,"end_character":18},"in_reply_to":"5a5ae5dd_fc6a3bec","updated":"2016-02-08 10:03:20.000000000","message":"I\u0027ve got lun_info at the beginning. So there is no need to communicate with backend array using get_lun_info.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            self.local_driver.sync(pair_id, wait_complete)"},{"line_number":539,"context_line":"        except Exception as err:"},{"line_number":540,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":541,"context_line":"                LOG.error(_LE(\u0027Start synchorization failed. Error: %s\u0027), err)"},{"line_number":542,"context_line":"                self._delete_pair(pair_id)"},{"line_number":543,"context_line":"                self._delete_rmt_lun(rmt_lun_id)"},{"line_number":544,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_dcdadfe7","line":541,"range":{"start_line":541,"start_character":37,"end_line":541,"end_character":51},"updated":"2016-02-06 06:32:16.000000000","message":"s/synchorization/synchronization","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            self.local_driver.sync(pair_id, wait_complete)"},{"line_number":539,"context_line":"        except Exception as err:"},{"line_number":540,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":541,"context_line":"                LOG.error(_LE(\u0027Start synchorization failed. Error: %s\u0027), err)"},{"line_number":542,"context_line":"                self._delete_pair(pair_id)"},{"line_number":543,"context_line":"                self._delete_rmt_lun(rmt_lun_id)"},{"line_number":544,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_65ec502a","line":541,"range":{"start_line":541,"start_character":37,"end_line":541,"end_character":51},"in_reply_to":"5a5ae5dd_dcdadfe7","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":574,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"},{"line_number":575,"context_line":"        if pair_id:"},{"line_number":576,"context_line":"            self._delete_pair(pair_id)"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"        # Delete remote_lun"},{"line_number":579,"context_line":"        rmt_lun_id \u003d info.get(\u0027rmt_lun_id\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_9c2a278f","line":576,"range":{"start_line":576,"start_character":12,"end_line":576,"end_character":16},"updated":"2016-02-06 06:32:16.000000000","message":"Won\u0027t you deal with the situation which the pair_id is not present as line 594~597?","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":574,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"},{"line_number":575,"context_line":"        if pair_id:"},{"line_number":576,"context_line":"            self._delete_pair(pair_id)"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"        # Delete remote_lun"},{"line_number":579,"context_line":"        rmt_lun_id \u003d info.get(\u0027rmt_lun_id\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_250bb87e","line":576,"range":{"start_line":576,"start_character":12,"end_line":576,"end_character":16},"in_reply_to":"5a5ae5dd_9c2a278f","updated":"2016-02-08 10:03:20.000000000","message":"Yes, if pair_id is not exist, just continue.","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"087376ebf573e36d40de434f3ed01a1320e5df3b","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":628,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"},{"line_number":629,"context_line":"        if not pair_id:"},{"line_number":630,"context_line":"            msg \u003d _(\u0027No pair id in volume replication_driver_data.\u0027)"},{"line_number":631,"context_line":"            LOG.error(msg)"},{"line_number":632,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":633,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_3001d705","line":630,"range":{"start_line":630,"start_character":42,"end_line":630,"end_character":65},"updated":"2016-02-06 06:32:16.000000000","message":"Can we use the same msg for the pair_id not present error?","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"e719408bc57807af99d25b9f85b80273fe7d259a","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        info \u003d get_replication_driver_data(volume)"},{"line_number":628,"context_line":"        pair_id \u003d info.get(\u0027pair_id\u0027)"},{"line_number":629,"context_line":"        if not pair_id:"},{"line_number":630,"context_line":"            msg \u003d _(\u0027No pair id in volume replication_driver_data.\u0027)"},{"line_number":631,"context_line":"            LOG.error(msg)"},{"line_number":632,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":633,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5a5ae5dd_c5df44d4","line":630,"range":{"start_line":630,"start_character":42,"end_line":630,"end_character":65},"in_reply_to":"5a5ae5dd_3001d705","updated":"2016-02-08 10:03:20.000000000","message":"Done","commit_id":"5828166ce63fedd39ff937f9aa72b33d354cab2e"}],"cinder/volume/drivers/huawei/rest_client.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"4b688b6343609833413c9ef6fb33b4884fa0837c","unresolved":false,"context_lines":[{"line_number":1891,"context_line":"        url \u003d \"/REPLICATIONPAIR\""},{"line_number":1892,"context_line":"        result \u003d self.call(url, pair_params, \"POST\")"},{"line_number":1893,"context_line":""},{"line_number":1894,"context_line":"        msg \u003d _(\u0027Create replicationn error.\u0027)"},{"line_number":1895,"context_line":"        self._assert_rest_result(result, msg)"},{"line_number":1896,"context_line":"        self._assert_data_in_result(result, msg)"},{"line_number":1897,"context_line":"        return result[\u0027data\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_07051ec1","line":1894,"updated":"2015-12-30 09:59:01.000000000","message":"s/replicationn/replication","commit_id":"fa925b7c09e613f36237355eb7c75fd0a8a78874"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"ce08cab9edefec32e25f9f79794763cc961c4c8f","unresolved":false,"context_lines":[{"line_number":1870,"context_line":"        url \u003d \"/remote_device\""},{"line_number":1871,"context_line":"        result \u003d self.call(url, None, \"GET\")"},{"line_number":1872,"context_line":"        self._assert_rest_result(result, _(\u0027Get remote devices error.\u0027))"},{"line_number":1873,"context_line":"        return result.get(\u0027data\u0027, {})"},{"line_number":1874,"context_line":""},{"line_number":1875,"context_line":"    def create_pair(self, pair_params):"},{"line_number":1876,"context_line":"        url \u003d \"/REPLICATIONPAIR\""}],"source_content_type":"text/x-python","patch_set":23,"id":"da6ed579_c82ff5f4","line":1873,"range":{"start_line":1873,"start_character":34,"end_line":1873,"end_character":36},"updated":"2016-01-18 09:26:15.000000000","message":"Should be [].","commit_id":"6511c716c165d802e85a803aaee94f9dd678ad03"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"ce08cab9edefec32e25f9f79794763cc961c4c8f","unresolved":false,"context_lines":[{"line_number":1888,"context_line":"        msg \u003d _(\u0027Get pair failed.\u0027)"},{"line_number":1889,"context_line":"        self._assert_rest_result(result, msg)"},{"line_number":1890,"context_line":"        return result.get(\u0027data\u0027, {})"},{"line_number":1891,"context_line":""},{"line_number":1892,"context_line":"    def get_replicaCG_info(self, cg_id):"},{"line_number":1893,"context_line":"        url \u003d \"/CONSISTENTGROUP/\" + cg_id"},{"line_number":1894,"context_line":"        result \u003d self.call(url, None, \"GET\")"},{"line_number":1895,"context_line":""},{"line_number":1896,"context_line":"        msg \u003d _(\u0027get_replicaCG_info error.\u0027)"},{"line_number":1897,"context_line":"        self._assert_rest_result(result, msg)"},{"line_number":1898,"context_line":"        return result.get(\u0027data\u0027, {})"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"    def switch_pair(self, pair_id):"},{"line_number":1901,"context_line":"        url \u003d \u0027/REPLICATIONPAIR/switch\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"da6ed579_a85f2174","line":1898,"range":{"start_line":1891,"start_character":0,"end_line":1898,"end_character":37},"updated":"2016-01-18 09:26:15.000000000","message":"Not used.","commit_id":"6511c716c165d802e85a803aaee94f9dd678ad03"}]}
