)]}'
{"karbor/api/v1/restores.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bbed596295adf149266434bb37c6194ddf32bd3b","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        restore_schema \u003d None"},{"line_number":332,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":333,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":334,"context_line":"        extended_info_schema \u003d provider.get(\"extended_info_schema\", None)"},{"line_number":335,"context_line":"        if extended_info_schema:"},{"line_number":336,"context_line":"            restore_schema \u003d extended_info_schema.get(\"restore_schema\", None)"},{"line_number":337,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":338,"context_line":"            if \"#\" in resource_key:"},{"line_number":339,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f044301_44d6b0f3","line":336,"range":{"start_line":334,"start_character":0,"end_line":336,"end_character":77},"updated":"2017-05-09 12:43:39.000000000","message":"Maybe the following codes is clearer, then \u0027extended_info_schema\u0027 is no need.\nrestore_schema \u003d provider.get(\"extended_info_schema\", {}).get(\"restore_schema\")","commit_id":"32588b70195d0bb5f2eb73e237306859411ace59"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"df6619aba8549eb4c906e58935ed5e505ac1c7f8","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        restore_schema \u003d None"},{"line_number":332,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":333,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":334,"context_line":"        extended_info_schema \u003d provider.get(\"extended_info_schema\", None)"},{"line_number":335,"context_line":"        if extended_info_schema:"},{"line_number":336,"context_line":"            restore_schema \u003d extended_info_schema.get(\"restore_schema\", None)"},{"line_number":337,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":338,"context_line":"            if \"#\" in resource_key:"},{"line_number":339,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f044301_d435cb47","line":336,"range":{"start_line":334,"start_character":0,"end_line":336,"end_character":77},"in_reply_to":"3f044301_44d6b0f3","updated":"2017-05-09 15:24:54.000000000","message":"Good.","commit_id":"32588b70195d0bb5f2eb73e237306859411ace59"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"130bf37ae0e733b1e7c97eb3197aa577c9c3189f","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":329,"context_line":"        if not parameters:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        restore_schema \u003d None"},{"line_number":332,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":333,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":334,"context_line":"        restore_schema \u003d provider.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_ccf65f64","line":331,"range":{"start_line":331,"start_character":8,"end_line":331,"end_character":29},"updated":"2017-05-10 02:05:50.000000000","message":"should be deleted.","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"913cdd0ac7b06d3510418e2b9c96236215026845","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":329,"context_line":"        if not parameters:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        restore_schema \u003d None"},{"line_number":332,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":333,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":334,"context_line":"        restore_schema \u003d provider.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_2f1a556e","line":331,"range":{"start_line":331,"start_character":8,"end_line":331,"end_character":29},"in_reply_to":"3f044301_ccf65f64","updated":"2017-05-10 02:17:59.000000000","message":"Done","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"130bf37ae0e733b1e7c97eb3197aa577c9c3189f","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":349,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":350,"context_line":"            property_list \u003d parameter_value.keys()"},{"line_number":351,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":352,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":353,"context_line":"            if not set(property_list_schema) \u003e set(property_list):"},{"line_number":354,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":355,"context_line":"                        \"is invalid.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_0c544720","line":352,"range":{"start_line":351,"start_character":0,"end_line":352,"end_character":52},"updated":"2017-05-10 02:05:50.000000000","message":"property_list_schema \u003d restore_schema[resource_type][\"properties\"].keys()","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"913cdd0ac7b06d3510418e2b9c96236215026845","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":349,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":350,"context_line":"            property_list \u003d parameter_value.keys()"},{"line_number":351,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":352,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":353,"context_line":"            if not set(property_list_schema) \u003e set(property_list):"},{"line_number":354,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":355,"context_line":"                        \"is invalid.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_4f112152","line":352,"range":{"start_line":351,"start_character":0,"end_line":352,"end_character":52},"in_reply_to":"3f044301_0c544720","updated":"2017-05-10 02:17:59.000000000","message":"Done","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"130bf37ae0e733b1e7c97eb3197aa577c9c3189f","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            property_list \u003d parameter_value.keys()"},{"line_number":351,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":352,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":353,"context_line":"            if not set(property_list_schema) \u003e set(property_list):"},{"line_number":354,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":355,"context_line":"                        \"is invalid.\")"},{"line_number":356,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_4c5ecf44","line":353,"range":{"start_line":353,"start_character":51,"end_line":353,"end_character":64},"updated":"2017-05-10 02:05:50.000000000","message":"s/property_list/parameter_value.keys(), and delete \u0027property_list\u0027\n\nWhy did change these two variable to set? Why not use len()?","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"913cdd0ac7b06d3510418e2b9c96236215026845","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            property_list \u003d parameter_value.keys()"},{"line_number":351,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":352,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":353,"context_line":"            if not set(property_list_schema) \u003e set(property_list):"},{"line_number":354,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":355,"context_line":"                        \"is invalid.\")"},{"line_number":356,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_cf53f116","line":353,"range":{"start_line":353,"start_character":51,"end_line":353,"end_character":64},"in_reply_to":"3f044301_4c5ecf44","updated":"2017-05-10 02:17:59.000000000","message":"only check length is not enough. The exactly property key in list also need be checked. It check whether resource_key is subset of schema key here.","commit_id":"8e805e26abf31f46c537e0bca61c47a47b6d008a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"5882cf2e94de69c2541cca10139d2dbe922147eb","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":349,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":350,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":351,"context_line":"            if not set(property_list_schema) \u003e set(parameter_value.keys()):"},{"line_number":352,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":353,"context_line":"                        \"is invalid.\")"},{"line_number":354,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1f013ff3_452167b4","line":351,"range":{"start_line":351,"start_character":23,"end_line":351,"end_character":43},"updated":"2017-05-15 12:24:06.000000000","message":"would be better to s/property_list_schema/properties.keys()","commit_id":"0629f6a71972ee71f79392170718a2c1ac004870"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"28e2545eebe3cbced27e91df57daf1419b4ad920","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":349,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":350,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":351,"context_line":"            if not set(property_list_schema) \u003e set(parameter_value.keys()):"},{"line_number":352,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":353,"context_line":"                        \"is invalid.\")"},{"line_number":354,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1f013ff3_ed02710b","line":351,"range":{"start_line":351,"start_character":23,"end_line":351,"end_character":43},"in_reply_to":"1f013ff3_452167b4","updated":"2017-05-16 15:33:23.000000000","message":"Done","commit_id":"0629f6a71972ee71f79392170718a2c1ac004870"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e6b24ef8c75437b75486161ce8dcc118c6e93ffa","unresolved":false,"context_lines":[{"line_number":324,"context_line":"                    \"KarborObject class.\")"},{"line_number":325,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def validate_restore_parameters(self, context, restore):"},{"line_number":328,"context_line":"        parameters \u003d restore[\"parameters\"]"},{"line_number":329,"context_line":"        if not parameters:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":332,"context_line":"            context, restore[\"provider_id\"])"},{"line_number":333,"context_line":"        restore_schema \u003d provider.get("},{"line_number":334,"context_line":"            \"extended_info_schema\", {}).get(\"restore_schema\", None)"},{"line_number":335,"context_line":"        if restore_schema is None:"},{"line_number":336,"context_line":"            msg \u003d _(\"The restore schema of plugin must be provided.\")"},{"line_number":337,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":338,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":339,"context_line":"            if \"#\" in resource_key:"},{"line_number":340,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"},{"line_number":341,"context_line":"                if not uuidutils.is_uuid_like(resource_id):"},{"line_number":342,"context_line":"                    msg \u003d _(\"The resource_id must be a uuid.\")"},{"line_number":343,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":344,"context_line":"            else:"},{"line_number":345,"context_line":"                resource_type \u003d resource_key"},{"line_number":346,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"},{"line_number":347,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":348,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":349,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":350,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":351,"context_line":"                msg \u003d _(\"The protect property of restore parameters \""},{"line_number":352,"context_line":"                        \"is invalid.\")"},{"line_number":353,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"def create_resource():"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_ee906751","line":353,"range":{"start_line":327,"start_character":0,"end_line":353,"end_character":56},"updated":"2017-05-17 13:13:47.000000000","message":"again, how about moving the validation about provider and restore schema logic to the protection service?","commit_id":"ea9fe7c664ff9bfae2daee9d82f714beda07111a"}],"karbor/services/protection/manager.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bd937ebd8f8c1b157918bbf8a3f65062db473b15","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                error\u003d_(\"Failed to create flow\"))"},{"line_number":169,"context_line":"        self._spawn(self.worker.run_flow, flow)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def validate_restore_parameters(self, restore, provider):"},{"line_number":172,"context_line":"        parameters \u003d restore[\"parameters\"]"},{"line_number":173,"context_line":"        if not parameters:"},{"line_number":174,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_461d88bb","line":171,"range":{"start_line":171,"start_character":8,"end_line":171,"end_character":35},"updated":"2017-05-22 02:51:59.000000000","message":"IMO, the logic of this method is wrong. The variable of \u0027restore_schema\u0027 defines schema for each resource. So, if some kind of resource has define schema, but the parameter of \u0027restore\u0027 does not supply the corresponding parameters for that schema, the validation should be failed. \nIf my understanding is right, it is not right to just \u0027return\u0027 when the \u0027parameter\u0027 is None on line 172~174.","commit_id":"65ec73604616eb9281ccf4596841465b9f06ac34"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"0e1b9e8cb301192e1da8aa050875819023688e28","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                error\u003d_(\"Failed to create flow\"))"},{"line_number":169,"context_line":"        self._spawn(self.worker.run_flow, flow)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def validate_restore_parameters(self, restore, provider):"},{"line_number":172,"context_line":"        parameters \u003d restore[\"parameters\"]"},{"line_number":173,"context_line":"        if not parameters:"},{"line_number":174,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_90850cd2","line":171,"range":{"start_line":171,"start_character":8,"end_line":171,"end_character":35},"in_reply_to":"ff0f0b1f_461d88bb","updated":"2017-05-22 12:13:56.000000000","message":"Now the parameter of resource defined in restore_schema is not a must for plugin. So It doesn\u0027t mean that the parameters for that schema must be set when creating a restore. So the parameter of the restore could be a None.","commit_id":"65ec73604616eb9281ccf4596841465b9f06ac34"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"4c80effc8315269330e2187b2a6538499efbd80f","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                resource_type \u003d resource_key"},{"line_number":188,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"},{"line_number":189,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":190,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":191,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff0f0b1f_b1fb00bc","line":188,"range":{"start_line":188,"start_character":12,"end_line":188,"end_character":60},"updated":"2017-05-25 11:07:32.000000000","message":"think about \u0027if resource_type not in restore_schema\u0027. if resource_type is in constants.RESOURCE_TYPES but not in restore_schema, then exception will happen on line 191","commit_id":"3370e9dc0c2e443a86fecc1dcd98a7cad7b642a2"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"7e2ac6af7b6570a1b4628f8700c0a000821773ad","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                resource_type \u003d resource_key"},{"line_number":188,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"},{"line_number":189,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":190,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":191,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff0f0b1f_86f2fd6e","line":188,"range":{"start_line":188,"start_character":12,"end_line":188,"end_character":60},"in_reply_to":"ff0f0b1f_b1fb00bc","updated":"2017-05-25 11:38:21.000000000","message":"Done","commit_id":"3370e9dc0c2e443a86fecc1dcd98a7cad7b642a2"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"4c80effc8315269330e2187b2a6538499efbd80f","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":190,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":191,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":192,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":193,"context_line":"                msg \u003d _(\"The restore property of restore parameters \""},{"line_number":194,"context_line":"                        \"is invalid.\")"},{"line_number":195,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff0f0b1f_11c86ca3","line":192,"range":{"start_line":192,"start_character":12,"end_line":192,"end_character":72},"updated":"2017-05-25 11:07:32.000000000","message":"think about \u0027if not set(parameter_value.keys()).issubset(set(properties.keys()))\u0027","commit_id":"3370e9dc0c2e443a86fecc1dcd98a7cad7b642a2"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"7e2ac6af7b6570a1b4628f8700c0a000821773ad","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                msg \u003d _(\"The key of restore parameters is invalid.\")"},{"line_number":190,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":191,"context_line":"            properties \u003d restore_schema[resource_type][\"properties\"]"},{"line_number":192,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":193,"context_line":"                msg \u003d _(\"The restore property of restore parameters \""},{"line_number":194,"context_line":"                        \"is invalid.\")"},{"line_number":195,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff0f0b1f_66f5a956","line":192,"range":{"start_line":192,"start_character":12,"end_line":192,"end_character":72},"in_reply_to":"ff0f0b1f_11c86ca3","updated":"2017-05-25 11:38:21.000000000","message":"Done","commit_id":"3370e9dc0c2e443a86fecc1dcd98a7cad7b642a2"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f6d63876129724ca85de189c53d0737bb8625f70","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self._spawn(self.worker.run_flow, flow)"},{"line_number":131,"context_line":"        return checkpoint.id"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    @messaging.expected_exceptions(exception.ProviderNotFound,"},{"line_number":134,"context_line":"                                   exception.CheckpointNotFound,"},{"line_number":135,"context_line":"                                   exception.CheckpointNotAvailable,"},{"line_number":136,"context_line":"                                   exception.FlowError)"},{"line_number":137,"context_line":"    def restore(self, context, restore, restore_auth):"},{"line_number":138,"context_line":"        LOG.info(\"Starting restore service:restore action\")"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df140735_0c215ab5","line":136,"range":{"start_line":133,"start_character":0,"end_line":136,"end_character":55},"updated":"2017-05-29 06:51:50.000000000","message":"add exception.InvalidInput","commit_id":"54b2767453d8925dab704af2071e94d25da0fa1a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"53f4ee1aa566bc3beccca89753d1691b92a6d89c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self._spawn(self.worker.run_flow, flow)"},{"line_number":131,"context_line":"        return checkpoint.id"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    @messaging.expected_exceptions(exception.ProviderNotFound,"},{"line_number":134,"context_line":"                                   exception.CheckpointNotFound,"},{"line_number":135,"context_line":"                                   exception.CheckpointNotAvailable,"},{"line_number":136,"context_line":"                                   exception.FlowError)"},{"line_number":137,"context_line":"    def restore(self, context, restore, restore_auth):"},{"line_number":138,"context_line":"        LOG.info(\"Starting restore service:restore action\")"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df140735_468b571e","line":136,"range":{"start_line":133,"start_character":0,"end_line":136,"end_character":55},"in_reply_to":"df140735_0c215ab5","updated":"2017-06-01 02:47:21.000000000","message":"Done","commit_id":"54b2767453d8925dab704af2071e94d25da0fa1a"}]}
