)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c38ae928b03dedd6642edaa4c6e385ba7f719b2b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"compatibale change."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partially implements: blueprint making-live-migration-api-friendly"},{"line_number":23,"context_line":"Co-authored-by: Alex Xu \u003chejie.xu@intel.com\u003e"},{"line_number":24,"context_line":"Change-Id: I43119bfd2769888b2802ab0a51ba7becedaf569d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"fa69d971_a022b5ff","line":23,"range":{"start_line":23,"start_character":3,"end_line":23,"end_character":11},"updated":"2016-01-04 06:57:56.000000000","message":"Hi, Eli, you needn\u0027t write my name at here, because all of codes are you write :) thanks for taking this job.","commit_id":"1fb241a157768cccca2cd6b3f5e67298670ce129"}],"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":3187,"context_line":"        self._record_action_start(context, instance,"},{"line_number":3188,"context_line":"                                  instance_actions.LIVE_MIGRATION)"},{"line_number":3189,"context_line":""},{"line_number":3190,"context_line":"        return self.compute_task_api.live_migrate_instance(context, instance,"},{"line_number":3191,"context_line":"                host_name, block_migration\u003dblock_migration,"},{"line_number":3192,"context_line":"                disk_over_commit\u003ddisk_over_commit)"},{"line_number":3193,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_4fcbf353","line":3190,"updated":"2016-02-04 10:03:07.000000000","message":"But you need to bump the major version of the RPC API until you can always get a return value here?","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":3187,"context_line":"        self._record_action_start(context, instance,"},{"line_number":3188,"context_line":"                                  instance_actions.LIVE_MIGRATION)"},{"line_number":3189,"context_line":""},{"line_number":3190,"context_line":"        return self.compute_task_api.live_migrate_instance(context, instance,"},{"line_number":3191,"context_line":"                host_name, block_migration\u003dblock_migration,"},{"line_number":3192,"context_line":"                disk_over_commit\u003ddisk_over_commit)"},{"line_number":3193,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_c409052e","line":3190,"in_reply_to":"5a5ae5dd_4fcbf353","updated":"2016-02-04 11:25:26.000000000","message":"hi John, I don\u0027t get you too much here. for older nova-api, it won\u0027t care about the return value.\n\nfor newer nova-api, since nova-cond is upgraded already, and it will get correctly return value, so is there any issue for bump version(sorry, I don\u0027t get what you mean by major version of RPC API)","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ab64b96e42c34abb43ab4766352acd90335c0bfe","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.9\u0027"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_68ee1224","line":441,"range":{"start_line":441,"start_character":15,"end_line":441,"end_character":66},"updated":"2016-02-03 16:15:45.000000000","message":"in which cases this check could be valid?","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"1501c9a7e59c820edc68d7538c2cd7b31537b582","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.9\u0027"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_614048a6","line":441,"range":{"start_line":441,"start_character":15,"end_line":441,"end_character":66},"in_reply_to":"5a5ae5dd_4f869c66","updated":"2016-02-04 09:32:08.000000000","message":"I got concern then, it looks like this could affect live migration during upgrade process. As discussed during mid-cycle live-migration should work in both ways. So if nova-api/scheduler/conductor was upgraded first it not possible to live-migrate from new compute to old one, right? If it is so, I think we should rework this approach.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"52013ec47a77038045b28e19f8a795e653da6b66","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.9\u0027"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_c7a58704","line":441,"range":{"start_line":441,"start_character":15,"end_line":441,"end_character":66},"in_reply_to":"5a5ae5dd_614048a6","updated":"2016-02-04 11:25:11.000000000","message":"No, I think you have misleading here.\n\nnova-cond should be upgrade firstly. so no worry about nova-cond don\u0027t understand new nova-api request.\n\nfor nova-compute, there is one possible case the node you are doing live-migration of destination is an older one, it can not understand that block_migration is None or disk_over_commit is None which is come from newer nova-conductor, so it might fail.\n\nam I clear?","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.9\u0027"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_4f869c66","line":441,"range":{"start_line":441,"start_character":15,"end_line":441,"end_character":66},"in_reply_to":"5a5ae5dd_68ee1224","updated":"2016-02-04 06:15:40.000000000","message":"@Timofey, in the case block_migration and disk_over_commit aren\u0027t None, that is current behavior.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"ead88267bf52bff423450d67af2dcebc9bfe6783","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.9\u0027"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_b37308e7","line":441,"range":{"start_line":441,"start_character":15,"end_line":441,"end_character":66},"in_reply_to":"5a5ae5dd_68ee1224","updated":"2016-02-04 01:44:54.000000000","message":"so, the case is:\nyou are using a new REST API and block_migration and disck_over_commit could be None.\nin this case, the conductor task will try to check_can_live_migrate_destination on dest node, but there is a case that the dest node is on version 4.8 and we pass block_migration\u003dNone and disck_over_commit\u003dNone , these value can not be understand on dest node.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_0fa984df","line":442,"range":{"start_line":442,"start_character":32,"end_line":442,"end_character":70},"updated":"2016-02-04 06:15:40.000000000","message":"ditto, maybe unittest?","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ab64b96e42c34abb43ab4766352acd90335c0bfe","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            if dest_check_data:"},{"line_number":464,"context_line":"                dest_check_data \u003d dest_check_data.to_legacy_dict()"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"            if ((\u0027block_migration\u0027 in dest_check_data"},{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_0858bef9","line":469,"range":{"start_line":466,"start_character":12,"end_line":469,"end_character":66},"updated":"2016-02-03 16:15:45.000000000","message":"ditto","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"ead88267bf52bff423450d67af2dcebc9bfe6783","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            if dest_check_data:"},{"line_number":464,"context_line":"                dest_check_data \u003d dest_check_data.to_legacy_dict()"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"            if ((\u0027block_migration\u0027 in dest_check_data"},{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_737d90b0","line":469,"range":{"start_line":466,"start_character":12,"end_line":469,"end_character":66},"in_reply_to":"5a5ae5dd_0858bef9","updated":"2016-02-04 01:44:54.000000000","message":"ditto","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"52013ec47a77038045b28e19f8a795e653da6b66","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            if dest_check_data:"},{"line_number":464,"context_line":"                dest_check_data \u003d dest_check_data.to_legacy_dict()"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"            if ((\u0027block_migration\u0027 in dest_check_data"},{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_205ecf76","line":469,"range":{"start_line":466,"start_character":12,"end_line":469,"end_character":66},"in_reply_to":"5a5ae5dd_737d90b0","updated":"2016-02-04 11:25:11.000000000","message":"this is not correct, if  we pass block_migration\u003dNone, we don\u0027t set it to dest_check_data, so logic should be:\nif  block_migration not in dest_check_data","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_6fba7825","line":470,"range":{"start_line":470,"start_character":32,"end_line":470,"end_character":70},"updated":"2016-02-04 06:15:40.000000000","message":"ditto","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_6fc02f7d","line":442,"updated":"2016-02-04 10:03:07.000000000","message":"I don\u0027t really understand why we need this here?","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":441,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":442,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":443,"context_line":"            else:"},{"line_number":444,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_30b5b830","line":442,"in_reply_to":"5a5ae5dd_6fc02f7d","updated":"2016-02-04 11:25:26.000000000","message":"If we bump to version 4.9, REST API may pass block_migration\u003dNone and disk_over_commit\u003dNone to nova-conductor, in nova-conductor, it will send this RPC request to destination nova-compute node. If the nova-compute node is older one(which can_send_version(4.9) is equal to False), which means that compute node can not understand block_migration\u003dNone and disk_over_commit\u003dNone, we can do the checking before we send RPC request instead of let compute node raise Sth. unexpected exception.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_ef3adf97","line":470,"updated":"2016-02-04 10:03:07.000000000","message":"same with this, I don\u0027t get why this is needed?","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                and dest_check_data[\u0027block_migration\u0027] is None) or"},{"line_number":468,"context_line":"               (\u0027disk_over_commit\u0027 in dest_check_data"},{"line_number":469,"context_line":"                and dest_check_data[\u0027disk_over_commit\u0027] is None)):"},{"line_number":470,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":471,"context_line":"            else:"},{"line_number":472,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_d00544c2","line":470,"in_reply_to":"5a5ae5dd_ef3adf97","updated":"2016-02-04 11:25:26.000000000","message":"ditto.\n\nBut this piece of logic is not correct, because dest_check_data can be LiveMigrationXenData or LiveMigrationLibvirtData, for LiveMigrationXenData object there isn\u0027t disk_over_commit attr on it. I think I need to get to know the object type before do this checking.\n\nBesides, since LiveMigrationLibvirtData.block_migration flag is not nullable, so it won\u0027t be none, the checking is wrong, I will update in next PS.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8a04f3304465165d909911fff33ec82830bea7c7","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.10\u0027"},{"line_number":439,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":440,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":441,"context_line":"                raise"},{"line_number":442,"context_line":"        version \u003d \u00274.0\u0027"},{"line_number":443,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":444,"context_line":"        result \u003d cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"bae84128_7550ced4","line":441,"updated":"2016-02-23 11:52:02.000000000","message":"I think I get what you are trying here, but I think you need to raise a better exception here. And really we need to make sure we never hit this option.","commit_id":"b16e41d2297beea43cdee0670e0e290b9354251e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8a04f3304465165d909911fff33ec82830bea7c7","unresolved":false,"context_lines":[{"line_number":457,"context_line":"        dest_check_data_obj \u003d dest_check_data"},{"line_number":458,"context_line":"        version \u003d \"4.10\""},{"line_number":459,"context_line":"        if not self.Client.can_send_version(version):"},{"line_number":460,"context_line":"            raise"},{"line_number":461,"context_line":"        version \u003d \u00274.8\u0027"},{"line_number":462,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":463,"context_line":"            version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"bae84128_f5f5feec","line":460,"updated":"2016-02-23 11:52:02.000000000","message":"This is not allowed, we must support old and new version, so upgrade works.","commit_id":"b16e41d2297beea43cdee0670e0e290b9354251e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"44c7c1b5df1f649e14f6b9acbd783affac6946a4","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        version \u003d \u00274.10\u0027"},{"line_number":439,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":440,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":441,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":442,"context_line":"            else:"},{"line_number":443,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"bae84128_53e762ab","line":441,"updated":"2016-02-24 11:36:38.000000000","message":"I think we probably just want to use this one:\nLiveMigrationWithOldNovaNotSafe\n\nWe need a large comment here to describe why this is acceptable, something like:\n\nThis is a new feature that is only available once all compute nodes support at least version 4.10. This means the new REST API that supports this needs to handle this exception correctly. This can all be removed when we bump the major version of this API.","commit_id":"7771da6561cf1797fe71aac66572af7a78f9cc6f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"49036b06e641cbe0070756bd800b2c07b418fb7e","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":452,"context_line":"        result \u003d cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9aed3d3a_739fd103","line":449,"range":{"start_line":449,"start_character":16,"end_line":449,"end_character":31},"updated":"2016-02-26 02:13:09.000000000","message":"better have one more testcase for this.","commit_id":"fac31b7a822ef8ee5048d84c5b2de276c1ec0e93"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4fb0a2cd5fc6b276fb5982e81b2906aecdc9cee7","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":452,"context_line":"        result \u003d cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9aed3d3a_e9813291","line":449,"range":{"start_line":449,"start_character":16,"end_line":449,"end_character":31},"in_reply_to":"9aed3d3a_495f7e72","updated":"2016-02-26 03:11:00.000000000","message":"indeed, that cover this case, thanks. then the code LGTM.","commit_id":"fac31b7a822ef8ee5048d84c5b2de276c1ec0e93"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"9d605f3a9610f504679513275c7d96928f0eabb1","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                version \u003d \u00274.0\u0027"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        cctxt \u003d self.client.prepare(server\u003ddestination, version\u003dversion)"},{"line_number":452,"context_line":"        result \u003d cctxt.call(ctxt, \u0027check_can_live_migrate_destination\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9aed3d3a_495f7e72","line":449,"range":{"start_line":449,"start_character":16,"end_line":449,"end_character":31},"in_reply_to":"9aed3d3a_739fd103","updated":"2016-02-26 03:06:13.000000000","message":"hi Alex, thanks for you review. I think this case will cover.https://review.openstack.org/#/c/254102/31/nova/tests/unit/compute/test_rpcapi.py@593  \n\nYou will see _test_simple_call mock a client.can_send_version(version)\u003dFalse and block_migration\u003dFalse disk_over_commit\u003dFalse, and it passed.","commit_id":"fac31b7a822ef8ee5048d84c5b2de276c1ec0e93"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9bb9ba78bcc3862057acc2d4916296b2d289099b","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            # once all compute nodes support at least version 4.10."},{"line_number":442,"context_line":"            # This means the new REST API that supports this needs to handle"},{"line_number":443,"context_line":"            # this exception correctly. This can all be removed when we bump"},{"line_number":444,"context_line":"            # the major version of this API."},{"line_number":445,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9aed3d3a_0d6baf1f","line":444,"updated":"2016-02-26 10:41:56.000000000","message":"Nit: of this RPC API\n\nbut thats totally implied, so thats fine.","commit_id":"a546444e2e9fa54a86565adbbc324bdba85e0562"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"2f41a4a175c02eb9af8f42c79d8d77ae53988005","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            # once all compute nodes support at least version 4.10."},{"line_number":442,"context_line":"            # This means the new REST API that supports this needs to handle"},{"line_number":443,"context_line":"            # this exception correctly. This can all be removed when we bump"},{"line_number":444,"context_line":"            # the major version of this API."},{"line_number":445,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9aed3d3a_b304a27e","line":444,"in_reply_to":"9aed3d3a_0d6baf1f","updated":"2016-02-26 11:10:05.000000000","message":"Done","commit_id":"a546444e2e9fa54a86565adbbc324bdba85e0562"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4c50dcd64d0f89d039b8051c8a04ae7f335501c2","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            # this exception correctly. This can all be removed when we bump"},{"line_number":444,"context_line":"            # the major version of this API."},{"line_number":445,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9aed3d3a_d0815c4c","line":446,"updated":"2016-02-26 10:46:03.000000000","message":"I know I said re-use this, sorry. Alex is correct, that error message isn\u0027t good enough, so we should create a new one.","commit_id":"a546444e2e9fa54a86565adbbc324bdba85e0562"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"2f41a4a175c02eb9af8f42c79d8d77ae53988005","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            # this exception correctly. This can all be removed when we bump"},{"line_number":444,"context_line":"            # the major version of this API."},{"line_number":445,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":446,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSafe("},{"line_number":447,"context_line":"                    server\u003ddestination)"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9aed3d3a_93099e98","line":446,"in_reply_to":"9aed3d3a_d0815c4c","updated":"2016-02-26 11:10:05.000000000","message":"Done","commit_id":"a546444e2e9fa54a86565adbbc324bdba85e0562"}],"nova/conductor/rpcapi.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":296,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":297,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":298,"context_line":"            else:"},{"line_number":299,"context_line":"                version \u003d \u00271.11\u0027"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_6f6358dd","line":297,"range":{"start_line":297,"start_character":16,"end_line":297,"end_character":70},"updated":"2016-02-04 06:15:40.000000000","message":"do we have unittest for this?","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":296,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":297,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":298,"context_line":"            else:"},{"line_number":299,"context_line":"                version \u003d \u00271.11\u0027"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_0f041bbe","line":297,"updated":"2016-02-04 10:03:07.000000000","message":"again, not sure why we are doing this.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":296,"context_line":"            if block_migration is None or disk_over_commit is None:"},{"line_number":297,"context_line":"                raise exception.LiveMigrationWithOldNovaNotSupported()"},{"line_number":298,"context_line":"            else:"},{"line_number":299,"context_line":"                version \u003d \u00271.11\u0027"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_701c9013","line":297,"in_reply_to":"5a5ae5dd_0f041bbe","updated":"2016-02-04 11:25:26.000000000","message":"ditto as previous.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                host\u003dself.source,"},{"line_number":68,"context_line":"                instance\u003dself.instance,"},{"line_number":69,"context_line":"                dest\u003dself.destination,"},{"line_number":70,"context_line":"                block_migration\u003dself.migrate_data[\u0027block_migration\u0027],"},{"line_number":71,"context_line":"                migration\u003dself.migration,"},{"line_number":72,"context_line":"                migrate_data\u003dself.migrate_data)"},{"line_number":73,"context_line":"        migration_info \u003d {\u0027host\u0027: self.destination,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_ac5f1e40","line":70,"range":{"start_line":70,"start_character":37,"end_line":70,"end_character":49},"updated":"2016-02-04 06:15:40.000000000","message":"migrate_data is LiveMigrateData object now. We shouldn\u0027t use it as dict.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                migration\u003dself.migration,"},{"line_number":72,"context_line":"                migrate_data\u003dself.migrate_data)"},{"line_number":73,"context_line":"        migration_info \u003d {\u0027host\u0027: self.destination,"},{"line_number":74,"context_line":"            \u0027block_migration\u0027: self.migrate_data[\u0027block_migration\u0027]}"},{"line_number":75,"context_line":"        return migration_info"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def rollback(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_4c354af5","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":68},"updated":"2016-02-04 06:15:40.000000000","message":"ditto, and the indent looks like strange","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                migrate_data\u003dself.migrate_data)"},{"line_number":73,"context_line":"        migration_info \u003d {\u0027host\u0027: self.destination,"},{"line_number":74,"context_line":"            \u0027block_migration\u0027: self.migrate_data[\u0027block_migration\u0027]}"},{"line_number":75,"context_line":"        return migration_info"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def rollback(self):"},{"line_number":78,"context_line":"        # TODO(johngarbutt) need to implement the clean up operation"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_0f72e4ad","line":75,"range":{"start_line":75,"start_character":15,"end_line":75,"end_character":29},"updated":"2016-02-04 06:15:40.000000000","message":"I think we should return object at here instead of random dicts. Maybe just return self.migrate_data at here.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                host\u003dself.source,"},{"line_number":68,"context_line":"                instance\u003dself.instance,"},{"line_number":69,"context_line":"                dest\u003dself.destination,"},{"line_number":70,"context_line":"                block_migration\u003dself.migrate_data[\u0027block_migration\u0027],"},{"line_number":71,"context_line":"                migration\u003dself.migration,"},{"line_number":72,"context_line":"                migrate_data\u003dself.migrate_data)"},{"line_number":73,"context_line":"        migration_info \u003d {\u0027host\u0027: self.destination,"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_6f226f03","line":70,"updated":"2016-02-04 10:03:07.000000000","message":"but what about older versions when this isn\u0027t passed like this? or has that always been there?","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                host\u003dself.source,"},{"line_number":68,"context_line":"                instance\u003dself.instance,"},{"line_number":69,"context_line":"                dest\u003dself.destination,"},{"line_number":70,"context_line":"                block_migration\u003dself.migrate_data[\u0027block_migration\u0027],"},{"line_number":71,"context_line":"                migration\u003dself.migration,"},{"line_number":72,"context_line":"                migrate_data\u003dself.migrate_data)"},{"line_number":73,"context_line":"        migration_info \u003d {\u0027host\u0027: self.destination,"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_95357e47","line":70,"in_reply_to":"5a5ae5dd_6f226f03","updated":"2016-02-04 11:25:26.000000000","message":"migrate_data is returned from check_can_live_migrate_destination, we always have block_migration in migrate_data.\n\nso as I can imagine that we don\u0027t need block_migration at all, we keep it just for backward compatibale","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"}],"nova/exception.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"44c7c1b5df1f649e14f6b9acbd783affac6946a4","unresolved":false,"context_lines":[{"line_number":1851,"context_line":"                \"drive data is shared across compute nodes.\")"},{"line_number":1852,"context_line":""},{"line_number":1853,"context_line":""},{"line_number":1854,"context_line":"class LiveMigrationWithOldNovaNotSafe(NovaException):"},{"line_number":1855,"context_line":"    msg_fmt \u003d _(\"Host %(server)s is running an old version of Nova, \""},{"line_number":1856,"context_line":"                \"live migrations involving that version may cause data loss. \""},{"line_number":1857,"context_line":"                \"Upgrade Nova on %(server)s and try again.\")"}],"source_content_type":"text/x-python","patch_set":29,"id":"bae84128_b3eceebb","line":1854,"updated":"2016-02-24 11:36:38.000000000","message":"Lets just reuse this one?","commit_id":"7771da6561cf1797fe71aac66572af7a78f9cc6f"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"6085dd8adf335e4389dccd4d3b1f73326443b1c8","unresolved":false,"context_lines":[{"line_number":1859,"context_line":""},{"line_number":1860,"context_line":"class LiveMigrationWithOldNovaNotSupported(NovaException):"},{"line_number":1861,"context_line":"    msg_fmt \u003d _(\"Live migration with API v2.25 requires all the Mitaka \""},{"line_number":1862,"context_line":"                \"upgrade to be complete before it is available.\")"},{"line_number":1863,"context_line":""},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"class LiveMigrationURINotAvailable(NovaException):"}],"source_content_type":"text/x-python","patch_set":34,"id":"9aed3d3a_62b4bdd0","line":1862,"updated":"2016-02-28 18:33:01.000000000","message":"I think this message should be generic, not tied to specific API version","commit_id":"023a7caf6dfe7fdafe8e6737d33d1d0a3a45edca"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"29f10c280eea3e9cf342dd21d95566e2426334d4","unresolved":false,"context_lines":[{"line_number":1859,"context_line":""},{"line_number":1860,"context_line":"class LiveMigrationWithOldNovaNotSupported(NovaException):"},{"line_number":1861,"context_line":"    msg_fmt \u003d _(\"Live migration with API v2.25 requires all the Mitaka \""},{"line_number":1862,"context_line":"                \"upgrade to be complete before it is available.\")"},{"line_number":1863,"context_line":""},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"class LiveMigrationURINotAvailable(NovaException):"}],"source_content_type":"text/x-python","patch_set":34,"id":"9aed3d3a_3ba8128d","line":1862,"in_reply_to":"9aed3d3a_0f6a35ee","updated":"2016-02-29 08:00:41.000000000","message":"okay, so let\u0027s stick to this, thanks for explaining!","commit_id":"023a7caf6dfe7fdafe8e6737d33d1d0a3a45edca"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"53b99fee051f3384e0652070171dd270c238d592","unresolved":false,"context_lines":[{"line_number":1859,"context_line":""},{"line_number":1860,"context_line":"class LiveMigrationWithOldNovaNotSupported(NovaException):"},{"line_number":1861,"context_line":"    msg_fmt \u003d _(\"Live migration with API v2.25 requires all the Mitaka \""},{"line_number":1862,"context_line":"                \"upgrade to be complete before it is available.\")"},{"line_number":1863,"context_line":""},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"class LiveMigrationURINotAvailable(NovaException):"}],"source_content_type":"text/x-python","patch_set":34,"id":"9aed3d3a_0f6a35ee","line":1862,"in_reply_to":"9aed3d3a_62b4bdd0","updated":"2016-02-29 00:56:57.000000000","message":"hi Pawel, thanks for your reviewing.\n\nI think this is okay since this exception will only raise when we using API version v2.25 and during upgrade.\n\nSince this exception message will be passed to API https://review.openstack.org/#/c/259319/21/nova/api/openstack/compute/migrate_server.py@107\n, it should be clear to users.\n\nAnd I think John much prefer to having this specify API version. see .http://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2016-02-26.log.html#t2016-02-26T10:59:10","commit_id":"023a7caf6dfe7fdafe8e6737d33d1d0a3a45edca"}],"nova/tests/unit/compute/test_rpcapi.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cc371e287cd01b5e63fb88075621196043384ca8","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (method \u003d\u003d \u0027check_can_live_migrate_destination\u0027"},{"line_number":128,"context_line":"                and \u0027destination\u0027 in expected_kwargs):"},{"line_number":129,"context_line":"            expected_kwargs.pop(\u0027destination\u0027)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        with test.nested("},{"line_number":132,"context_line":"            mock.patch.object(rpcapi.client, rpc_method),"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_2f9b1774","line":129,"updated":"2016-02-04 10:03:07.000000000","message":"Why is this happening here? This doesn\u0027t seem correct.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"5cfb596a9e4d252543ebc110524aa3099237a745","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (method \u003d\u003d \u0027check_can_live_migrate_destination\u0027"},{"line_number":128,"context_line":"                and \u0027destination\u0027 in expected_kwargs):"},{"line_number":129,"context_line":"            expected_kwargs.pop(\u0027destination\u0027)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        with test.nested("},{"line_number":132,"context_line":"            mock.patch.object(rpcapi.client, rpc_method),"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a5ae5dd_55faa6be","line":129,"in_reply_to":"5a5ae5dd_2f9b1774","updated":"2016-02-04 11:25:26.000000000","message":"oh, yeah, I need to fix up this, rebase stuff, I may need to rewrite some cases.","commit_id":"d2db87d3bfd52078dbb7b7d87bc3c424991607c3"}],"nova/tests/unit/conductor/tasks/test_live_migrate.py":[{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"8b1a00bc371e9cb1eb561b53b9436daf36bb705e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test_execute_with_destination(self):"},{"line_number":60,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_host_is_up\u0027)"},{"line_number":61,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi, \u0027live_migration\u0027)"},{"line_number":62,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi,"},{"line_number":63,"context_line":"                                 \u0027check_can_live_migrate_destination\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_destination_is_not_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_b1563b5c","line":62,"range":{"start_line":62,"start_character":17,"end_line":62,"end_character":32},"updated":"2016-01-11 14:19:26.000000000","message":"These two tests should be rewritten using mock instead of extending them with mox.","commit_id":"6e2c3697cc88742c92ac87d64a276fd525f11277"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"9dbeddbec088a6ee670cb2659319b3f020721d05","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test_execute_with_destination(self):"},{"line_number":60,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_host_is_up\u0027)"},{"line_number":61,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi, \u0027live_migration\u0027)"},{"line_number":62,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi,"},{"line_number":63,"context_line":"                                 \u0027check_can_live_migrate_destination\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_destination_is_not_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_dd0efde4","line":62,"range":{"start_line":62,"start_character":17,"end_line":62,"end_character":32},"in_reply_to":"da6ed579_f72a022c","updated":"2016-01-12 08:23:49.000000000","message":"Let\u0027s do that if others agree","commit_id":"6e2c3697cc88742c92ac87d64a276fd525f11277"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"14bbb832b13ade92abf0a7b3f69d3db337758b46","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test_execute_with_destination(self):"},{"line_number":60,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_host_is_up\u0027)"},{"line_number":61,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi, \u0027live_migration\u0027)"},{"line_number":62,"context_line":"        self.mox.StubOutWithMock(self.task.compute_rpcapi,"},{"line_number":63,"context_line":"                                 \u0027check_can_live_migrate_destination\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.mox.StubOutWithMock(self.task, \u0027_check_destination_is_not_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_f72a022c","line":62,"range":{"start_line":62,"start_character":17,"end_line":62,"end_character":32},"in_reply_to":"fa69d971_b1563b5c","updated":"2016-01-12 07:24:16.000000000","message":"Hi Pawel, thanks for the comments, I agree with you that we need rewritten it with `mock` (not mox, right?)\nBut I think this path should focus on currently changes, we can delay the rewritten to another patch.\n\ndoes that make scence?\n\nEli","commit_id":"6e2c3697cc88742c92ac87d64a276fd525f11277"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cdf81423862731be16cb0fb238026c2834e0f5","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        self.mox.ReplayAll()"},{"line_number":145,"context_line":"        with mock.patch.object(self.migration, \u0027save\u0027) as mock_save:"},{"line_number":146,"context_line":"            self.assertEqual({\u0027block_migration\u0027: \u0027bm\u0027, \u0027host\u0027: \u0027found_host\u0027},"},{"line_number":147,"context_line":"                             self.task.execute())"},{"line_number":148,"context_line":"            self.assertTrue(mock_save.called)"},{"line_number":149,"context_line":"            self.assertEqual(\u0027found_host\u0027, self.migration.dest_compute)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a5ae5dd_0f2424ad","line":146,"range":{"start_line":146,"start_character":49,"end_line":146,"end_character":53},"updated":"2016-02-04 06:15:40.000000000","message":"I know this isn\u0027t your fault, but it will great you can use boolean at here.","commit_id":"eaee341e3348128599e8b1b39acb704959f7e809"}]}
