)]}'
{"smaug/common/constants.py":[{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"44b00063dd4cfd630bbb47d96f43f16ea9b99ae9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"from oslo_versionedobjects import fields"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"BaseEnumField \u003d fields.BaseEnumField"},{"line_number":15,"context_line":"Enum \u003d fields.Enum"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"#  operation type"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_c2ecba91","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":13},"updated":"2016-03-30 09:32:31.000000000","message":"no use for \"BaseEnumField\"","commit_id":"e238369fc6f16d880821a07a621f62b59b7af6f1"}],"smaug/exception.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"b0b20be620638f058459d9cf4054f650696664e7","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class GetBackupFailed(SmaugException):"},{"line_number":232,"context_line":"    message \u003d _(\"Get Backup failed: %(reason)s\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_b1aef47e","line":232,"range":{"start_line":232,"start_character":17,"end_line":232,"end_character":20},"updated":"2016-03-03 07:59:43.000000000","message":"it looks well, but I would rather see more detailed parameters here, not only the reason but also the unique information.such as id or others.","commit_id":"2da12b1a0448b535d288172a0c9f6e2f9359ff13"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"44b00063dd4cfd630bbb47d96f43f16ea9b99ae9","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"class GetBackupFailed(SmaugException):"},{"line_number":267,"context_line":"    message \u003d _(\"Get Backup failed: reason\u003d%(reason)s, \""},{"line_number":268,"context_line":"                \"id\u003d%(resource_id)s\")"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_c55b242d","line":267,"range":{"start_line":267,"start_character":36,"end_line":267,"end_character":43},"updated":"2016-03-30 09:32:31.000000000","message":"the message is difference from the messages above. please keep the same style.","commit_id":"e238369fc6f16d880821a07a621f62b59b7af6f1"}],"smaug/services/protection/plugins/cinder_backup_plugin.py":[{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"0ca0524789e2e59cdafcaebb7da59e8db48ea01d","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        return client"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def get_supported_resources_types(self):"},{"line_number":117,"context_line":"        return self._SUPPORT_RESOURCE_TYPE"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def get_options_schema(self, resource_type):"},{"line_number":120,"context_line":"        options_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_51f7fbf4","line":117,"updated":"2016-03-03 09:35:54.000000000","message":"In provider design doc, this return type of this method is a list. Please confirm it.","commit_id":"2da12b1a0448b535d288172a0c9f6e2f9359ff13"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"0ca0524789e2e59cdafcaebb7da59e8db48ea01d","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        # TODO(hurong)"},{"line_number":193,"context_line":"        pass"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def get_protection_stats(self, protection_id):"},{"line_number":196,"context_line":"        # Get the status of this protection"},{"line_number":197,"context_line":"        # TODO(hurong)"},{"line_number":198,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_d1ff8ba8","line":195,"range":{"start_line":195,"start_character":23,"end_line":195,"end_character":28},"updated":"2016-03-03 09:35:54.000000000","message":"status","commit_id":"2da12b1a0448b535d288172a0c9f6e2f9359ff13"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return self._SUPPORT_RESOURCE_TYPES"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_options_schema(self, resource_type):"},{"line_number":123,"context_line":"        options_schema \u003d {"},{"line_number":124,"context_line":"            \"type\": \"object\","},{"line_number":125,"context_line":"            \"properties\": {"},{"line_number":126,"context_line":"                \"backup_name\": {"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_c043ba6a","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":22},"updated":"2016-03-03 19:38:57.000000000","message":"I think it will be better to have a separate file for the protection plugin schemas","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def get_restore_schema(self, resource_type):"},{"line_number":140,"context_line":"        restore_schema \u003d {"},{"line_number":141,"context_line":"            \"type\": \"object\","},{"line_number":142,"context_line":"            \"properties\": {"},{"line_number":143,"context_line":"                \"volume_id\": {"},{"line_number":144,"context_line":"                    \"type\": \"string\","},{"line_number":145,"context_line":"                    \"description\": \"the target volume ID to restore to.\""},{"line_number":146,"context_line":"                },"},{"line_number":147,"context_line":"            },"},{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":"        return restore_schema"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_9b0be723","line":147,"range":{"start_line":141,"start_character":12,"end_line":147,"end_character":14},"updated":"2016-03-03 19:38:57.000000000","message":"ditto move into a volume_plugin_cinder_schemas.py","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def get_saved_info_schema(self, resource_type):"},{"line_number":152,"context_line":"        saved_info_schema \u003d {"},{"line_number":153,"context_line":"            \"type\": \"object\","},{"line_number":154,"context_line":"            \"properties\": {"},{"line_number":155,"context_line":"                \"name\": {"},{"line_number":156,"context_line":"                    \"type\": \"string\","},{"line_number":157,"context_line":"                    \"description\": \"The name for this backup.\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_fb166b4a","line":154,"range":{"start_line":153,"start_character":12,"end_line":154,"end_character":27},"updated":"2016-03-03 19:38:57.000000000","message":"ditto","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"}],"smaug/services/protection/plugins/simple_backup_plugin.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"f9c97fbcb2f164855ae226b17332920772abed26","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            kwargs[\u0027name\u0027] \u003d context.resource.resource.id\r"},{"line_number":38,"context_line":"            kwargs[\u0027requires\u0027] \u003d context.parameters\r"},{"line_number":39,"context_line":"            operation \u003d context.operation\r"},{"line_number":40,"context_line":"            if operation \u003d\u003d \"protect\":\r"},{"line_number":41,"context_line":"                task \u003d task_builder.create_task(self.create_backup,\r"},{"line_number":42,"context_line":"                                                **kwargs)\r"},{"line_number":43,"context_line":"            elif operation \u003d\u003d \"restore\":\r"},{"line_number":44,"context_line":"                task \u003d task_builder.create_task(self.restore_backup,\r"},{"line_number":45,"context_line":"                                                **kwargs)\r"},{"line_number":46,"context_line":"            elif operation \u003d\u003d \"delete\":\r"},{"line_number":47,"context_line":"                task \u003d task_builder.create_task(self.delete_backup,\r"},{"line_number":48,"context_line":"                                                **kwargs)\r"},{"line_number":49,"context_line":"            elif operation \u003d\u003d \"start\":\r"},{"line_number":50,"context_line":"                # not support\r"},{"line_number":51,"context_line":"                # TODO(hurong)\r"},{"line_number":52,"context_line":"                pass\r"},{"line_number":53,"context_line":"            elif operation \u003d\u003d \"suspend\":\r"},{"line_number":54,"context_line":"                # not support\r"},{"line_number":55,"context_line":"                # TODO(hurong)\r"},{"line_number":56,"context_line":"                pass\r"},{"line_number":57,"context_line":"            else:\r"},{"line_number":58,"context_line":"                # TODO(hurong)\r"},{"line_number":59,"context_line":"                pass\r"},{"line_number":60,"context_line":"            context.task_builder.add_tasks(context.task_flow, task)\r"},{"line_number":61,"context_line":"        else:\r"},{"line_number":62,"context_line":"            # TODO(hurong): search_task in task_flow\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_9bc5595d","line":59,"range":{"start_line":40,"start_character":0,"end_line":59,"end_character":20},"updated":"2016-03-01 15:37:52.000000000","message":"task_callback \u003d None\n if opreation \u003d XXXX:\n     task_callback \u003d self.XXX_backup\n .....\n if task_callback is not None:\n    task \u003d task_builder.create_task(task_callback, **kwargs)","commit_id":"c94d353b67a32aba447c6365da98f224daeb9bc9"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"b0b20be620638f058459d9cf4054f650696664e7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def on_resource_start(self, context):"},{"line_number":33,"context_line":"        task \u003d None"},{"line_number":34,"context_line":"        kwargs \u003d dict()"},{"line_number":35,"context_line":"        if context.is_first_visited is True:"},{"line_number":36,"context_line":"            kwargs[\u0027name\u0027] \u003d context.resource.resource.id"},{"line_number":37,"context_line":"            kwargs[\u0027requires\u0027] \u003d context.parameters"},{"line_number":38,"context_line":"            operation \u003d context.operation"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_63dadf18","line":35,"range":{"start_line":35,"start_character":19,"end_line":35,"end_character":35},"updated":"2016-03-03 07:59:43.000000000","message":"I am not sure I understood why to use this variable for a branch but with empty else-branch below.","commit_id":"2da12b1a0448b535d288172a0c9f6e2f9359ff13"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"b0b20be620638f058459d9cf4054f650696664e7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            kwargs[\u0027requires\u0027] \u003d context.parameters"},{"line_number":38,"context_line":"            operation \u003d context.operation"},{"line_number":39,"context_line":"            task_callback \u003d None"},{"line_number":40,"context_line":"            if operation \u003d\u003d \"protect\":"},{"line_number":41,"context_line":"                task_callback \u003d self.create_backup"},{"line_number":42,"context_line":"            if operation \u003d\u003d \"restore\":"},{"line_number":43,"context_line":"                task_callback \u003d self.restore_backup"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_661cad6a","line":40,"range":{"start_line":40,"start_character":15,"end_line":40,"end_character":24},"updated":"2016-03-03 07:59:43.000000000","message":"it will work well, but I would rather think about the flexibility to build a function map as \"{\"protect\":self.create_backup,\"restore\":self:restore_backup...}\", then choose the correct function according to the map key.","commit_id":"2da12b1a0448b535d288172a0c9f6e2f9359ff13"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_1b2fd788","line":1,"range":{"start_line":1,"start_character":20,"end_line":1,"end_character":43},"updated":"2016-03-03 19:38:57.000000000","message":"Please consider renaming the file name see below","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class SimpleBackupPlugin(ProtectionPlugin):"},{"line_number":20,"context_line":"    @abc.abstractmethod"},{"line_number":21,"context_line":"    def create_backup(self, requires):"},{"line_number":22,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_c059fa8f","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":24},"updated":"2016-03-03 19:38:57.000000000","message":"I think using  BaseBackupPlugin as class name and the file name will be better or did you mean Sample \n\nIf we want a Sample it should not include the abstract methods","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"aa066128d9fe20787b9cf24476b836e00c351e33","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            kwargs[\u0027requires\u0027] \u003d plan.parameters[resource.id]"},{"line_number":40,"context_line":"            operation \u003d context.operation"},{"line_number":41,"context_line":"            task_callback \u003d None"},{"line_number":42,"context_line":"            if operation \u003d\u003d \"protect\":"},{"line_number":43,"context_line":"                task_callback \u003d self.create_backup"},{"line_number":44,"context_line":"            if operation \u003d\u003d \"restore\":"},{"line_number":45,"context_line":"                task_callback \u003d self.restore_backup"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_ed386ed5","line":42,"range":{"start_line":42,"start_character":29,"end_line":42,"end_character":36},"updated":"2016-03-03 19:46:25.000000000","message":"please use the constants form \nhttps://review.openstack.org/#/c/281011/5/smaug/common/constants.py","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            # task \u003d context.task_builder.search_task(context.task_flow,"},{"line_number":57,"context_line":"            #                                        context.resource.resource.id)"},{"line_number":58,"context_line":"            pass"},{"line_number":59,"context_line":"        context.task_stack.append(task)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def on_resource_end(self, context):"},{"line_number":62,"context_line":"        task_stack \u003d context.task_stack"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_7ba41bb9","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":15},"updated":"2016-03-03 19:38:57.000000000","message":"if task is not None","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e5e142ee8e5b649cffa436105fee3674f0ef0590","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            pass"},{"line_number":59,"context_line":"        context.task_stack.append(task)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def on_resource_end(self, context):"},{"line_number":62,"context_line":"        task_stack \u003d context.task_stack"},{"line_number":63,"context_line":"        length \u003d len(task_stack)"},{"line_number":64,"context_line":"        if length \u003e 1:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_bbf22304","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":23},"updated":"2016-03-03 19:38:57.000000000","message":"on_resource_exit","commit_id":"3933fc7c646e57680e05d7bfb4984fbd5dc11936"}],"smaug/services/protection/plugins/volume_plugin_cinder_schemas.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7760b719c1cbf0cc16ff36a10d998f66a00c8cdc","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"OPTIONS_SCHEMA \u003d {"},{"line_number":14,"context_line":"    \"type\": \"object\","},{"line_number":15,"context_line":"    \"properties\": {"},{"line_number":16,"context_line":"        \"backup_name\": {"},{"line_number":17,"context_line":"            \"type\": \"string\","}],"source_content_type":"text/x-python","patch_set":8,"id":"7af24918_aa4d88c5","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":9},"updated":"2016-03-04 11:53:14.000000000","message":"Please consider adding description \u0026 continer \u0026 force  supported by the cinder backup","commit_id":"2a29b2e07742e49e8c4d7ce73c4789600ac60f55"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7760b719c1cbf0cc16ff36a10d998f66a00c8cdc","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"RESTORE_SCHEMA \u003d {"},{"line_number":29,"context_line":"    \"type\": \"object\","},{"line_number":30,"context_line":"    \"properties\": {"},{"line_number":31,"context_line":"        \"volume_id\": {"}],"source_content_type":"text/x-python","patch_set":8,"id":"7af24918_ea2dd0fe","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":14},"updated":"2016-03-04 11:53:14.000000000","message":"we need to support the optional name in cider restore \n\nThe name of the volume to which you want to restore a backup.","commit_id":"2a29b2e07742e49e8c4d7ce73c4789600ac60f55"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7760b719c1cbf0cc16ff36a10d998f66a00c8cdc","unresolved":false,"context_lines":[{"line_number":28,"context_line":"RESTORE_SCHEMA \u003d {"},{"line_number":29,"context_line":"    \"type\": \"object\","},{"line_number":30,"context_line":"    \"properties\": {"},{"line_number":31,"context_line":"        \"volume_id\": {"},{"line_number":32,"context_line":"            \"type\": \"string\","},{"line_number":33,"context_line":"            \"description\": \"the target volume ID to restore to.\""},{"line_number":34,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":8,"id":"7af24918_0ae91cb7","line":31,"range":{"start_line":31,"start_character":9,"end_line":31,"end_character":18},"updated":"2016-03-04 11:53:14.000000000","message":"this is an optional in cider so we need to support by default \nauto generate value \n\nMissing default val","commit_id":"2a29b2e07742e49e8c4d7ce73c4789600ac60f55"}],"smaug/services/protection/protection_plugins/base_backup_plugin.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def on_resource_start(self, context):"},{"line_number":44,"context_line":"        task \u003d None"},{"line_number":45,"context_line":"        kwargs \u003d dict()"},{"line_number":46,"context_line":"        resource \u003d getattr(context, \"resource\")"},{"line_number":47,"context_line":"        plan \u003d getattr(context, \"plan\")"},{"line_number":48,"context_line":"        if context.is_first_visited is True:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_44ac60a0","line":45,"range":{"start_line":45,"start_character":17,"end_line":45,"end_character":23},"updated":"2016-03-08 09:02:52.000000000","message":"{}","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def on_resource_start(self, context):"},{"line_number":44,"context_line":"        task \u003d None"},{"line_number":45,"context_line":"        kwargs \u003d dict()"},{"line_number":46,"context_line":"        resource \u003d getattr(context, \"resource\")"},{"line_number":47,"context_line":"        plan \u003d getattr(context, \"plan\")"},{"line_number":48,"context_line":"        if context.is_first_visited is True:"},{"line_number":49,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_04bb78e6","line":46,"range":{"start_line":46,"start_character":19,"end_line":46,"end_character":26},"updated":"2016-03-08 09:02:52.000000000","message":"Why are you using getattr?","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                                                        **kwargs)"},{"line_number":61,"context_line":"                context.task_builder.add_tasks(context.task_flow, task)"},{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            # TODO(hurong): search_task in task_flow"},{"line_number":64,"context_line":"            task \u003d context.task_builder.search_task(context.task_flow,"},{"line_number":65,"context_line":"                                                    resource.id)"},{"line_number":66,"context_line":"        if task is not None:"},{"line_number":67,"context_line":"            context.task_stack.append(task)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_e4b92ccd","line":65,"range":{"start_line":63,"start_character":0,"end_line":65,"end_character":64},"updated":"2016-03-08 09:02:52.000000000","message":"You do you want to perform the task twice?","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if task is not None:"},{"line_number":67,"context_line":"            context.task_stack.append(task)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def on_resource_end(self, context):"},{"line_number":70,"context_line":"        operation \u003d context.operation"},{"line_number":71,"context_line":"        task_stack \u003d context.task_stack"},{"line_number":72,"context_line":"        if operation in self.task_callback_map.keys():"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_c4c5103d","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":23},"updated":"2016-03-08 09:02:52.000000000","message":"What exactly are you doing here? Didn\u0027t you do everything on enter?","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"8a2bf7c084b8e64f8e4f2c6cbae58c6b7b001058","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        plan \u003d getattr(context, \"plan\")"},{"line_number":48,"context_line":"        if context.is_first_visited is True:"},{"line_number":49,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":50,"context_line":"            parameters \u003d plan.parameters[resource.id].copy()"},{"line_number":51,"context_line":"            # add bank_section"},{"line_number":52,"context_line":"            parameters[\u0027bank_section\u0027] \u003d context.bank_section"},{"line_number":53,"context_line":"            kwargs[\u0027inject\u0027] \u003d parameters"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_30515f0f","line":50,"range":{"start_line":50,"start_character":30,"end_line":50,"end_character":53},"updated":"2016-03-09 06:34:51.000000000","message":"I think the plan parameters\u0027 key is resource type, not each individual resource has its own parameters.\nPlease confirm it.","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"edc06c48518ebaa4edd19ba6a00f8b1df8c901c3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        plan \u003d getattr(context, \"plan\")"},{"line_number":48,"context_line":"        if context.is_first_visited is True:"},{"line_number":49,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":50,"context_line":"            parameters \u003d plan.parameters[resource.id].copy()"},{"line_number":51,"context_line":"            # add bank_section"},{"line_number":52,"context_line":"            parameters[\u0027bank_section\u0027] \u003d context.bank_section"},{"line_number":53,"context_line":"            kwargs[\u0027inject\u0027] \u003d parameters"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_d3c5a58e","line":50,"range":{"start_line":50,"start_character":30,"end_line":50,"end_character":53},"in_reply_to":"5aef4532_30515f0f","updated":"2016-03-09 06:58:00.000000000","message":"It\u0027s:\n\u0027\u003ctype\u003e\u0027 (eg. \"OS::Nova::Server\") for defaults for a type\nand\n\u0027\u003ctype\u003e@\u003cid\u003e\u0027 (eg. \"OS::Nova::Server@123e4567-e89b-12d3-a456-426655440000\") for parameters for a specific instance\n\nBut in any case, the plan should give you a function where you pass your Resource tuple and get the appropriate parameters after taking to consideration everythin set up in the plan.","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"edc06c48518ebaa4edd19ba6a00f8b1df8c901c3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if task is not None:"},{"line_number":66,"context_line":"            context.task_stack.append(task)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def on_resource_end(self, context):"},{"line_number":69,"context_line":"        operation \u003d context.operation"},{"line_number":70,"context_line":"        task_stack \u003d context.task_stack"},{"line_number":71,"context_line":"        if operation in self.task_callback_map.keys():"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_3330499e","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":23},"updated":"2016-03-09 06:58:00.000000000","message":"Why do you put tasks in both phases?","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"8a2bf7c084b8e64f8e4f2c6cbae58c6b7b001058","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def on_resource_end(self, context):"},{"line_number":69,"context_line":"        operation \u003d context.operation"},{"line_number":70,"context_line":"        task_stack \u003d context.task_stack"},{"line_number":71,"context_line":"        if operation in self.task_callback_map.keys():"},{"line_number":72,"context_line":"            length \u003d len(task_stack)"},{"line_number":73,"context_line":"            if length \u003e 1:"},{"line_number":74,"context_line":"                child_task \u003d task_stack.pop()"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_70a927df","line":71,"range":{"start_line":71,"start_character":24,"end_line":71,"end_character":53},"updated":"2016-03-09 06:34:51.000000000","message":"Could just use self.task_callback_map here, the \u0027in\u0027 operator supports dict.","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"}],"smaug/services/protection/protection_plugins/base_protection_plugin.py":[{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"44b00063dd4cfd630bbb47d96f43f16ea9b99ae9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import abc"},{"line_number":14,"context_line":"import six"},{"line_number":15,"context_line":"from smaug.common import constants"},{"line_number":16,"context_line":"from smaug.services.protection.protection_plugin import ProtectionPlugin"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"ba0121b8_e510e803","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":10},"updated":"2016-03-30 09:32:31.000000000","message":"after the \"import six\", keep a blank line.","commit_id":"e238369fc6f16d880821a07a621f62b59b7af6f1"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"07d56758d5114dbd7da8914d2c68c3e9ab52da1a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def delete_backup(self, cntxt, checkpoint, **kwargs):"},{"line_number":40,"context_line":"        pass"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def on_resource_start(self, context):"},{"line_number":43,"context_line":"        task \u003d None"},{"line_number":44,"context_line":"        kwargs \u003d {}"},{"line_number":45,"context_line":"        plan \u003d context.plan"},{"line_number":46,"context_line":"        resource \u003d context.node.value"},{"line_number":47,"context_line":"        if context.is_first_visited is True:"},{"line_number":48,"context_line":"            parameters \u003d plan.parameters[resource.id].copy()"},{"line_number":49,"context_line":"            parameters[\u0027resource_id\u0027] \u003d resource.id"},{"line_number":50,"context_line":"            parameters[\u0027checkpoint\u0027] \u003d context.checkpoint"},{"line_number":51,"context_line":"            parameters[\u0027cntxt\u0027] \u003d context.cntxt"},{"line_number":52,"context_line":"            parameters[\u0027node\u0027] \u003d context.node"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":55,"context_line":"            kwargs[\u0027inject\u0027] \u003d parameters"},{"line_number":56,"context_line":"            kwargs[\u0027requires\u0027] \u003d parameters.keys()"},{"line_number":57,"context_line":"            operation \u003d context.operation"},{"line_number":58,"context_line":"            task_callback \u003d self.task_callback_map.get(operation, None)"},{"line_number":59,"context_line":"            if task_callback is not None:"},{"line_number":60,"context_line":"                task \u003d context.task_builder.create_task(context.task_flow,"},{"line_number":61,"context_line":"                                                        task_callback,"},{"line_number":62,"context_line":"                                                        **kwargs)"},{"line_number":63,"context_line":"                context.task_builder.add_tasks(context.task_flow, task)"},{"line_number":64,"context_line":"        else:"},{"line_number":65,"context_line":"            task \u003d context.task_builder.search_task(context.task_flow,"},{"line_number":66,"context_line":"                                                    resource.id)"},{"line_number":67,"context_line":"        if task is not None:"},{"line_number":68,"context_line":"            context.task_stack.append(task)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def on_resource_end(self, context):"},{"line_number":71,"context_line":"        operation \u003d context.operation"},{"line_number":72,"context_line":"        task_stack \u003d context.task_stack"},{"line_number":73,"context_line":"        if operation in self.task_callback_map:"},{"line_number":74,"context_line":"            length \u003d len(task_stack)"},{"line_number":75,"context_line":"            if length \u003e 1:"},{"line_number":76,"context_line":"                child_task \u003d task_stack.pop()"},{"line_number":77,"context_line":"                parent_task \u003d task_stack[-1]"},{"line_number":78,"context_line":"                context.task_builder.link_task(context.task_flow,"},{"line_number":79,"context_line":"                                               parent_task, child_task)"},{"line_number":80,"context_line":"            else:"},{"line_number":81,"context_line":"                task_stack.pop()"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a061dce_66570903","line":81,"range":{"start_line":42,"start_character":4,"end_line":81,"end_character":32},"updated":"2016-04-04 15:52:48.000000000","message":"Please discus this with Saggi , yuval or me any way I think that the base class logic should go into a different patch \n\nWe think that there is a problem pushing the task stack state into the protection plugin.\nthis will mandate all the protection plugin to use this base class \n\nWe have another solution that will still allow flexibility for the task of the protection plugin but leave the stack state out of the protections plugins","commit_id":"65aff106d1bff3705b7ced237c5b10361dd984ae"}],"smaug/services/protection/protection_plugins/volume/cinder_backup_plugin.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"ffb03eb6a2a0e797cbe71ae697898154bad27774","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        return self._client_instance"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_url(self):"},{"line_number":66,"context_line":"        \u0027\u0027\u0027Return the url of cinder endpoint.\u0027\u0027\u0027"},{"line_number":67,"context_line":"        def _parse_catalog():"},{"line_number":68,"context_line":"            try:"},{"line_number":69,"context_line":"                service_type, service_name, endpoint_type \u003d \\"},{"line_number":70,"context_line":"                    cfg.CONF.cinder_client.cinder_catalog_info.split(\u0027;\u0027)"},{"line_number":71,"context_line":"            except ValueError:"},{"line_number":72,"context_line":"                raise exception.SmaugException(_("},{"line_number":73,"context_line":"                    \"Failed to parse the configuration option \""},{"line_number":74,"context_line":"                    \"\u0027cinder_catalog_info\u0027, must be in the form \""},{"line_number":75,"context_line":"                    \"\u003cservice_type\u003e;\u003cservice_name\u003e;\u003cendpoint_type\u003e\"))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"            for entry in self._context.service_catalog:"},{"line_number":78,"context_line":"                if entry.get(\u0027type\u0027) \u003d\u003d service_type:"},{"line_number":79,"context_line":"                    return (service_type,"},{"line_number":80,"context_line":"                            entry.get(\u0027endpoints\u0027)[0].get(endpoint_type),"},{"line_number":81,"context_line":"                            endpoint_type)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            raise exception.SmaugException(_("},{"line_number":84,"context_line":"                \"Couldn\u0027t find the endpoint of service type %s \""},{"line_number":85,"context_line":"                \"from service catalog\") % service_type)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        def _parse_endpoint():"},{"line_number":88,"context_line":"            try:"},{"line_number":89,"context_line":"                service_type, endpoint_url, endpoint_type \u003d \\"},{"line_number":90,"context_line":"                    cfg.CONF.cinder_client.cinder_endpoint.split(\u0027;\u0027)"},{"line_number":91,"context_line":"            except ValueError:"},{"line_number":92,"context_line":"                raise exception.SmaugException(_("},{"line_number":93,"context_line":"                    \"Failed to parse the configuration option \""},{"line_number":94,"context_line":"                    \"\u0027cinder_endpoint\u0027, must be in the form \""},{"line_number":95,"context_line":"                    \"\u003cservice_type\u003e;\u003cendpoint_url\u003e;\u003cendpoint_type\u003e\"))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"            return (service_type,"},{"line_number":98,"context_line":"                    \u0027%s/%s\u0027 % (endpoint_url, self._context.project_id),"},{"line_number":99,"context_line":"                    endpoint_type)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if cfg.CONF.cinder_client.cinder_endpoint is None:"},{"line_number":102,"context_line":"            return _parse_catalog()"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            return _parse_endpoint()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _create(self):"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            service_type, url, endpoint_type \u003d self._get_url()"},{"line_number":109,"context_line":"        except Exception:"},{"line_number":110,"context_line":"            LOG.error(_LE(\"Get cinder service endpoint url failed.\"))"},{"line_number":111,"context_line":"            raise"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        LOG.info(_LI(\u0027Creating cinder client with url %s.\u0027), url)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        client_version \u003d (self._CLIENT_VERSION_2"},{"line_number":116,"context_line":"                          if service_type \u003d\u003d self._VOLUME_V2"},{"line_number":117,"context_line":"                          else self._CLIENT_VERSION_1)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        args \u003d {"},{"line_number":120,"context_line":"            \u0027project_id\u0027: self._context.project_id,"},{"line_number":121,"context_line":"        }"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        client \u003d cinder_client.Client(client_version, **args)"},{"line_number":124,"context_line":"        client.client.auth_token \u003d self._context.auth_token"},{"line_number":125,"context_line":"        client.client.management_url \u003d url"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        return client"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_supported_resources_types(self):"},{"line_number":130,"context_line":"        return self._SUPPORT_RESOURCE_TYPES"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa0719c6_0309f42c","line":127,"range":{"start_line":65,"start_character":0,"end_line":127,"end_character":21},"updated":"2016-03-20 11:15:59.000000000","message":"Please rebase over \u0027Implement Cinder service client\u0027 (291535) and use ClientFactory","commit_id":"47e5a9648aec354aff5faac3cd9b79f832dc3bee"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"d80658794b811a8eaaec95d12c7d169d4effa941","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class CinderBackupPlugin(BaseBackupPlugin):"},{"line_number":29,"context_line":"    _SUPPORT_RESOURCE_TYPES \u003d [\"OS::Cinder::Volume\"]"},{"line_number":30,"context_line":"    _SERVICE_TYPES \u003d (_VOLUME, _VOLUME_V2) \u003d (\u0027volume\u0027, \u0027volumev2\u0027)"},{"line_number":31,"context_line":"    _CLIENT_VERSIONS \u003d (_CLIENT_VERSION_1, _CLIENT_VERSION_2) \u003d (\u00271\u0027, \u00272\u0027)"},{"line_number":32,"context_line":"    _STATUS_MAP \u003d {"},{"line_number":33,"context_line":"        \"error\": ProtectionStatus.ERROR,"},{"line_number":34,"context_line":"        \"error-deleting\": ProtectionStatus.ERROR,"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa0719c6_1fd4641e","line":31,"range":{"start_line":30,"start_character":0,"end_line":31,"end_character":74},"updated":"2016-03-22 09:10:45.000000000","message":"Not used","commit_id":"2e883893ec5a01efa7b406d51f06d62c667c20c8"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bbd7e034a825196fb581d16bee08fc3ac895cde3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return self._SUPPORT_RESOURCE_TYPES"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_options_schema(cls, resource_type):"},{"line_number":50,"context_line":"        return cinder_schemas.OPTIONS_SCHEMA"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0719c6_620dd136","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":26},"updated":"2016-03-23 02:19:20.000000000","message":"this function is defined as an abstract function, please make them be consistent.","commit_id":"02a24fefb26c7813bc87a7bd9e43abbd6d57b21e"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bbd7e034a825196fb581d16bee08fc3ac895cde3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        return cinder_schemas.OPTIONS_SCHEMA"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @classmethod"},{"line_number":53,"context_line":"    def get_restore_schema(cls, resource_type):"},{"line_number":54,"context_line":"        return cinder_schemas.RESTORE_SCHEMA"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0719c6_a20fe92c","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":26},"updated":"2016-03-23 02:19:20.000000000","message":"ditto","commit_id":"02a24fefb26c7813bc87a7bd9e43abbd6d57b21e"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bbd7e034a825196fb581d16bee08fc3ac895cde3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        return cinder_schemas.RESTORE_SCHEMA"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @classmethod"},{"line_number":57,"context_line":"    def get_saved_info_schema(cls, resource_type):"},{"line_number":58,"context_line":"        return cinder_schemas.SAVED_INFO_SCHEMA"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_saved_info(self, metadata_store, resource):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0719c6_e219e17a","line":57,"range":{"start_line":57,"start_character":8,"end_line":57,"end_character":29},"updated":"2016-03-23 02:19:20.000000000","message":"ditto","commit_id":"02a24fefb26c7813bc87a7bd9e43abbd6d57b21e"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"f59c02e2e9eae3c1c91fc0b249eafd460a6a39d4","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            )"},{"line_number":114,"context_line":"        # TODO(hurong): update in bank"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def get_backup_info(self, **kwargs):"},{"line_number":117,"context_line":"        resource_id \u003d kwargs.get(\"resource_id\")"},{"line_number":118,"context_line":"        backup_id \u003d kwargs.get(\"backup_id\")"},{"line_number":119,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0719c6_22bab9c0","line":116,"range":{"start_line":116,"start_character":8,"end_line":116,"end_character":23},"updated":"2016-03-23 02:47:21.000000000","message":"it doesn\u0027t seem to be used. because it is neither declared in the base class nor used in this class","commit_id":"02a24fefb26c7813bc87a7bd9e43abbd6d57b21e"}],"smaug/services/protection/protection_plugins/volume/volume_plugin_cinder_schemas.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"OPTIONS_SCHEMA \u003d {"},{"line_number":14,"context_line":"    \"type\": \"object\","},{"line_number":15,"context_line":"    \"properties\": {"},{"line_number":16,"context_line":"        \"backup_name\": {"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_a9025d09","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":18},"updated":"2016-03-08 09:02:52.000000000","message":"http://fpaste.org/335644/74269311/","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"RESTORE_SCHEMA \u003d {"},{"line_number":41,"context_line":"    \"type\": \"object\","},{"line_number":42,"context_line":"    \"properties\": {"},{"line_number":43,"context_line":"        \"volume_id\": {"},{"line_number":44,"context_line":"            \"type\": \"string\","},{"line_number":45,"context_line":"            \"description\": \"the target volume ID to restore to.\""},{"line_number":46,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_8497888f","line":43,"range":{"start_line":43,"start_character":9,"end_line":43,"end_character":18},"updated":"2016-03-08 09:02:52.000000000","message":"Add title to all properties since we want to specify the field name in the UI.\n\nDo this for all properties.","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"properties\": {"},{"line_number":43,"context_line":"        \"volume_id\": {"},{"line_number":44,"context_line":"            \"type\": \"string\","},{"line_number":45,"context_line":"            \"description\": \"the target volume ID to restore to.\""},{"line_number":46,"context_line":"        },"},{"line_number":47,"context_line":"    },"},{"line_number":48,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_c4e87013","line":45,"range":{"start_line":45,"start_character":28,"end_line":45,"end_character":62},"updated":"2016-03-08 09:02:52.000000000","message":"Make sure you start with an upper case letter.","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            \"description\": \"The backup status, such as available.\""},{"line_number":63,"context_line":"        },"},{"line_number":64,"context_line":"        \"progress\": {"},{"line_number":65,"context_line":"            \"type\": \"integer\","},{"line_number":66,"context_line":"            \"constraint\": {\u0027min\u0027: 0, \u0027max\u0027: 100},"},{"line_number":67,"context_line":"            \"description\":"},{"line_number":68,"context_line":"                \"The current operation progress for this backup.\""},{"line_number":69,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_44a62011","line":66,"range":{"start_line":65,"start_character":0,"end_line":66,"end_character":49},"updated":"2016-03-08 09:02:52.000000000","message":"Change it to a type \"number\" between 0 and 1.\nNo need for us to enforce the resolution.","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"128c3afb149743b5d1d533a8a38129ddbff2357a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                (\"The ID of the volume \""},{"line_number":83,"context_line":"                 \"from which the backup was created.\")"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"        \"metadata\": {},"},{"line_number":86,"context_line":"    },"},{"line_number":87,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_e4080cdc","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":23},"updated":"2016-03-08 09:02:52.000000000","message":"What is this?","commit_id":"d51d2f961e3b4b63600cf6511a66061540eeae55"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"fb14112c2203b66d41b616155688d2adc9c76fbc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"SAVED_INFO_SCHEMA \u003d {"},{"line_number":62,"context_line":"    \"title\": \"Cinder Protection Saved Info\","},{"line_number":63,"context_line":"    \"type\": \"object\","},{"line_number":64,"context_line":"    \"properties\": {"},{"line_number":65,"context_line":"        \"name\": {"},{"line_number":66,"context_line":"            \"type\": \"string\","},{"line_number":67,"context_line":"            \"description\": \"The name for this backup.\""}],"source_content_type":"text/x-python","patch_set":12,"id":"5aef4532_97217750","line":64,"range":{"start_line":64,"start_character":5,"end_line":64,"end_character":15},"updated":"2016-03-08 15:03:19.000000000","message":"Please add is_incremental \nxsd:boolean\t\nIndicates whether the backup mode is incremental. If this value is True, the backup mode is incremental. If this value is False, the backup mode is full.","commit_id":"b68dc9eba1430f5d1c67c61c83a7101b6f24da75"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"8a2bf7c084b8e64f8e4f2c6cbae58c6b7b001058","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            \"description\": \"The target volume ID to restore to.\""},{"line_number":58,"context_line":"        },"},{"line_number":59,"context_line":"    },"},{"line_number":60,"context_line":"    \"required\": [\"volume_id\"]"},{"line_number":61,"context_line":"}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"SAVED_INFO_SCHEMA \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_b0c60f47","line":60,"updated":"2016-03-09 06:34:51.000000000","message":"I think this volume_id could be not mandatory.\nIf this volume_id not specified, create a new volume and restore to it.","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"edc06c48518ebaa4edd19ba6a00f8b1df8c901c3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            \"description\": \"The target volume ID to restore to.\""},{"line_number":58,"context_line":"        },"},{"line_number":59,"context_line":"    },"},{"line_number":60,"context_line":"    \"required\": [\"volume_id\"]"},{"line_number":61,"context_line":"}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"SAVED_INFO_SCHEMA \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_b378d92c","line":60,"range":{"start_line":60,"start_character":0,"end_line":60,"end_character":29},"updated":"2016-03-09 06:58:00.000000000","message":"Why is this required? Can\u0027t we just generate one if the user doesn\u0027t specify one?","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"edc06c48518ebaa4edd19ba6a00f8b1df8c901c3","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                 \"from which the backup was created.\")"},{"line_number":105,"context_line":"        },"},{"line_number":106,"context_line":"    },"},{"line_number":107,"context_line":"    \"required\": [\"name\", \"status\", \"progress\", \"fail_reason\","},{"line_number":108,"context_line":"                 \"size\", \"volume_id\"]"},{"line_number":109,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":13,"id":"5aef4532_33ba09c1","line":107,"range":{"start_line":107,"start_character":47,"end_line":107,"end_character":60},"updated":"2016-03-09 06:58:00.000000000","message":"Why is fail_reason required? Can\u0027t we just eliminate it if everything was OK?","commit_id":"0fd8ca171afd4b82a2e3e6bce7105d94b9ebe229"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"24194e2a7d3d8f0012448be7674c937eb66614b7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"force\": {"},{"line_number":40,"context_line":"            \"type\": \"boolean\","},{"line_number":41,"context_line":"            \"title\": \"Force\","},{"line_number":42,"context_line":"            \"description\": \"Should it be restored whatever \""},{"line_number":43,"context_line":"                           \"the status of volume.\","},{"line_number":44,"context_line":"            \"default\": False"},{"line_number":45,"context_line":"        }"},{"line_number":46,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0719c6_6a45d1b1","line":43,"range":{"start_line":42,"start_character":11,"end_line":43,"end_character":51},"updated":"2016-03-22 12:57:38.000000000","message":"Wrong description \nIndicates whether to backup, even if the volume is attached","commit_id":"02a24fefb26c7813bc87a7bd9e43abbd6d57b21e"},{"author":{"_account_id":17192,"name":"xiangxinyong","email":"xiangxinyong@huawei.com","username":"xianxinyong"},"change_message_id":"d7cc4ad354498f243c7a8877b2f89ffaf42e8214","unresolved":false,"context_lines":[{"line_number":23,"context_line":"            \"type\": \"string\","},{"line_number":24,"context_line":"            \"title\": \"Backup Mode\","},{"line_number":25,"context_line":"            \"description\": \"The backup mode.\","},{"line_number":26,"context_line":"            \"eumn\": [\"full\", \"incremental\", \"auto\"],"},{"line_number":27,"context_line":"            \"default\": \"auto\""},{"line_number":28,"context_line":"        },"},{"line_number":29,"context_line":"        \"container\": {"}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_fb854759","line":26,"range":{"start_line":26,"start_character":13,"end_line":26,"end_character":17},"updated":"2016-03-26 09:55:04.000000000","message":"Should it be enum?","commit_id":"11390a921e42cb976e49cfe368655fbcd9191298"},{"author":{"_account_id":17192,"name":"xiangxinyong","email":"xiangxinyong@huawei.com","username":"xianxinyong"},"change_message_id":"d7cc4ad354498f243c7a8877b2f89ffaf42e8214","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \"container\": {"},{"line_number":30,"context_line":"            \"type\": \"string\","},{"line_number":31,"context_line":"            \"title\": \"Container\","},{"line_number":32,"context_line":"            \"description\": \"The container which been chosen.\""},{"line_number":33,"context_line":"        },"},{"line_number":34,"context_line":"        \"description\": {"},{"line_number":35,"context_line":"            \"type\": \"string\","}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_7b92d7a0","line":32,"range":{"start_line":32,"start_character":13,"end_line":32,"end_character":24},"updated":"2016-03-26 09:55:04.000000000","message":"I am not sure whether every parameter need a default value.","commit_id":"11390a921e42cb976e49cfe368655fbcd9191298"}]}
