)]}'
{"smaug/protection/bank_plugin.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"        pass\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def grant_lease(self, owner_id):\r"},{"line_number":33,"context_line":"        # TODO(wangliuan)\r"},{"line_number":34,"context_line":"        pass\r"},{"line_number":35,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_cbc6a19b","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":19},"updated":"2016-01-11 13:08:22.000000000","message":"You don\u0027t grant a lease. You either acquire or request one.\nIn this case we acquire one. Leases also require the checkpoint ID since this is their granularity.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"01c1e5b4ac1c6b992c44a7c0e30cb3a108757c60","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"        pass\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def grant_lease(self, owner_id):\r"},{"line_number":33,"context_line":"        # TODO(wangliuan)\r"},{"line_number":34,"context_line":"        pass\r"},{"line_number":35,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_6f6758e9","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":19},"in_reply_to":"fa69d971_cbc6a19b","updated":"2016-01-15 02:09:04.000000000","message":"Yes, the function name should be refreshed.\nSaggi,we have discussed that the lease granularity is per owner instance instead of per checkpoint. Each checkpoint operation will check from its owner to see whether the lease valid window is enough to finish its operation.\nLuobin will commit a design doc for review today.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"7b93ac8ecae72017f2a3505b632801305431d384","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"        pass\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def acquire_lease(self, owner_id):\r"},{"line_number":33,"context_line":"        # TODO(wangliuan)\r"},{"line_number":34,"context_line":"        pass\r"},{"line_number":35,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_95acdfee","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":21},"updated":"2016-01-20 16:00:28.000000000","message":"Does acquire include renew or does renew happen internally?","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c081853fbda22c156720e6196f053e040977c9df","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"        pass\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def acquire_lease(self, owner_id):\r"},{"line_number":33,"context_line":"        # TODO(wangliuan)\r"},{"line_number":34,"context_line":"        pass\r"},{"line_number":35,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_03de4b6d","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":21},"in_reply_to":"9a68dd71_95acdfee","updated":"2016-01-21 10:55:40.000000000","message":"I will update this class based on the design doc for Bank plugin lease,thanks.","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"class BankPlugin(object):\r"},{"line_number":23,"context_line":"    def __init__(self):\r"},{"line_number":24,"context_line":"        super(BankPlugin, self).__init__()\r"},{"line_number":25,"context_line":"        self.storage_url \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_9d25e9c3","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":16},"updated":"2016-01-27 16:01:06.000000000","message":"* Should use the abc[1] module.\n* has too many methods. We should only add methods not in the design doc if we see a real reason for them.\n\n [1] https://docs.python.org/2/library/abc.html","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"365475272b523c20f20c100b17155752d83ec1e9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"class BankPlugin(object):\r"},{"line_number":23,"context_line":"    def __init__(self):\r"},{"line_number":24,"context_line":"        super(BankPlugin, self).__init__()\r"},{"line_number":25,"context_line":"        self.storage_url \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_1e2756cb","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":16},"in_reply_to":"7a5de9d1_9d25e9c3","updated":"2016-01-29 03:07:03.000000000","message":"OK,thanks","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"d7ca5f9acd0232778a8f2b7cabc557e66b65fca1","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class BankPlugin(object):"},{"line_number":27,"context_line":"    def __init__(self):"},{"line_number":28,"context_line":"        super(BankPlugin, self).__init__()"},{"line_number":29,"context_line":"        self.storage_url \u003d None"},{"line_number":30,"context_line":"        self.context \u003d None"},{"line_number":31,"context_line":"        self.owner_id \u003d None"},{"line_number":32,"context_line":"        self.expired_time \u003d None"},{"line_number":33,"context_line":"        self.renew_time \u003d None"},{"line_number":34,"context_line":"        # TODO(wangliuan)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_94cdc688","line":33,"range":{"start_line":27,"start_character":0,"end_line":33,"end_character":30},"updated":"2016-02-02 13:48:00.000000000","message":"There is no need for this. It\u0027s just an interface.","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"}],"smaug/protection/checkpoint.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"class CheckpointSerializer(object):\r"},{"line_number":25,"context_line":"    def __init__(self):\r"},{"line_number":26,"context_line":"        super(CheckpointSerializer, self).__init__()\r"},{"line_number":27,"context_line":"        LOG.info(_LI(\"CheckpointSerializer\"))\r"},{"line_number":28,"context_line":"        # TODO(wangliuan)\r"},{"line_number":29,"context_line":"\r"},{"line_number":30,"context_line":"    def serialize(self, checkpoint, encoding_format):\r"},{"line_number":31,"context_line":"        # TODO(wangliuan)\r"},{"line_number":32,"context_line":"        pass\r"},{"line_number":33,"context_line":"\r"},{"line_number":34,"context_line":"    def deserialize(self, data, encoding_format):\r"},{"line_number":35,"context_line":"        # TODO(wangliuan)\r"},{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_abf7add1","line":36,"range":{"start_line":24,"start_character":0,"end_line":36,"end_character":12},"updated":"2016-01-11 13:08:22.000000000","message":"As I commented on the design doc. I don\u0027t understand this class. If it\u0027s for communicating with the API layer we need to put that in the common serializer.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"510e1128c8c11cd9bd6618ba441154200cd336b7","unresolved":false,"context_lines":[{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"class CheckpointSerializer(object):\r"},{"line_number":25,"context_line":"    def __init__(self):\r"},{"line_number":26,"context_line":"        super(CheckpointSerializer, self).__init__()\r"},{"line_number":27,"context_line":"        LOG.info(_LI(\"CheckpointSerializer\"))\r"},{"line_number":28,"context_line":"        # TODO(wangliuan)\r"},{"line_number":29,"context_line":"\r"},{"line_number":30,"context_line":"    def serialize(self, checkpoint, encoding_format):\r"},{"line_number":31,"context_line":"        # TODO(wangliuan)\r"},{"line_number":32,"context_line":"        pass\r"},{"line_number":33,"context_line":"\r"},{"line_number":34,"context_line":"    def deserialize(self, data, encoding_format):\r"},{"line_number":35,"context_line":"        # TODO(wangliuan)\r"},{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_efefc81b","line":36,"range":{"start_line":24,"start_character":0,"end_line":36,"end_character":12},"in_reply_to":"fa69d971_abf7add1","updated":"2016-01-15 02:18:13.000000000","message":"Saggi, I replied in the design doc that this class is to persist checkpoint value in bank.\nWe could leave more options for the way to persist checkpoint in bank. Say, GPB will do data compression than json serialization, which will save storage space in bank.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_6bc21555","line":39,"range":{"start_line":39,"start_character":6,"end_line":39,"end_character":26},"updated":"2016-01-11 13:08:22.000000000","message":"I don\u0027t see how this connects to the provider\\bank.\nA collection needs to be bound to those.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"510e1128c8c11cd9bd6618ba441154200cd336b7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_efd6e84d","line":39,"range":{"start_line":39,"start_character":6,"end_line":39,"end_character":26},"in_reply_to":"fa69d971_6bc21555","updated":"2016-01-15 02:18:13.000000000","message":"It will call the bankplugin interfaces to persist checkpoint in bank.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"510e1128c8c11cd9bd6618ba441154200cd336b7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"},{"line_number":43,"context_line":"        self.checkpoint_serializer \u003d None\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_8fc96cae","line":40,"updated":"2016-01-15 02:18:13.000000000","message":"Liuan, pls. add more comments of this class.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"},{"line_number":43,"context_line":"        self.checkpoint_serializer \u003d None\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_1cb6b73d","line":40,"in_reply_to":"da6ed579_8fc96cae","updated":"2016-01-19 03:11:52.000000000","message":"OK","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"},{"line_number":43,"context_line":"        self.checkpoint_serializer \u003d None\r"},{"line_number":44,"context_line":"        # TODO(wangliuan)\r"},{"line_number":45,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0bd4b91d","line":42,"range":{"start_line":42,"start_character":0,"end_line":42,"end_character":42},"updated":"2016-01-11 13:08:22.000000000","message":"This is not informative at all","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"class CheckpointCollection(object):\r"},{"line_number":40,"context_line":"    def __init__(self):\r"},{"line_number":41,"context_line":"        super(CheckpointCollection, self).__init__()\r"},{"line_number":42,"context_line":"        LOG.info(_LI(\"CheckpointManager\"))\r"},{"line_number":43,"context_line":"        self.checkpoint_serializer \u003d None\r"},{"line_number":44,"context_line":"        # TODO(wangliuan)\r"},{"line_number":45,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_b9e8dd17","line":42,"range":{"start_line":42,"start_character":0,"end_line":42,"end_character":42},"in_reply_to":"fa69d971_0bd4b91d","updated":"2016-01-19 03:11:52.000000000","message":"OK,I will remove it","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # TODO(wangliuan)\r"},{"line_number":64,"context_line":"        pass\r"},{"line_number":65,"context_line":"\r"},{"line_number":66,"context_line":"    def update_protection_definition(self, checkpoint, **kwargs):\r"},{"line_number":67,"context_line":"        # TODO(wangliuan)\r"},{"line_number":68,"context_line":"        pass\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0bdef910","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":36},"updated":"2016-01-11 13:08:22.000000000","message":"You don\u0027t update a protection definition on a checkpoint. You used to do it on a plan but now it\u0027s just parameters and resources.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"d492ea25097e10978d7f03e2d3143c3050548106","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # TODO(wangliuan)\r"},{"line_number":64,"context_line":"        pass\r"},{"line_number":65,"context_line":"\r"},{"line_number":66,"context_line":"    def update_protection_definition(self, checkpoint, **kwargs):\r"},{"line_number":67,"context_line":"        # TODO(wangliuan)\r"},{"line_number":68,"context_line":"        pass\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_1e812bfb","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":36},"in_reply_to":"da6ed579_6fe67816","updated":"2016-01-15 06:21:10.000000000","message":"each protection plugin is supposed to do the write into a different \"namespace\" under the checkpoint so i do not see why we need a lock here.\n\nthe Provider workflow should be the only one to write the  checkpoint metadata.\n\nIn the new design we do not store any specific plugin information in the checkpoint root directory (namespace) only in the plugin itself directory.\n\nThe provider should provide abstraction to the plugin to do a write and read but make sure to allow write only in protect operation.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"510e1128c8c11cd9bd6618ba441154200cd336b7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # TODO(wangliuan)\r"},{"line_number":64,"context_line":"        pass\r"},{"line_number":65,"context_line":"\r"},{"line_number":66,"context_line":"    def update_protection_definition(self, checkpoint, **kwargs):\r"},{"line_number":67,"context_line":"        # TODO(wangliuan)\r"},{"line_number":68,"context_line":"        pass\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_6fe67816","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":36},"in_reply_to":"fa69d971_0bdef910","updated":"2016-01-15 02:18:13.000000000","message":"In fact, task will update protection definition when it finishes execution. \nSince tasks will be executed on parallel, the update should be on parallel as well.\nIn bank implementation, we make protection definition and checkpoint with separate keys. They could be updated separately.\nIf we have each task to update_checkpoint, it\u0027s confusing since there\u0027s no lock to avoid conflict update.\nIt looks to me that update_protection_definition is better which has no lock confuse.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class BankLeaseClient(object):\r"},{"line_number":24,"context_line":"    def __init__(self):\r"},{"line_number":25,"context_line":"        super(BankLeaseClient, self).__init__()\r"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_8813655c","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":21},"updated":"2016-01-27 16:01:06.000000000","message":"Shouldn\u0027t this be part of the bank plugin interface?","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"847c80b952202b4f4077a3c7177746c1d45296d7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class BankLeaseClient(object):\r"},{"line_number":24,"context_line":"    def __init__(self):\r"},{"line_number":25,"context_line":"        super(BankLeaseClient, self).__init__()\r"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_be93a24e","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":21},"in_reply_to":"7a5de9d1_8813655c","updated":"2016-01-29 02:50:36.000000000","message":"Saggi, we\u0027d prefer to divide the lease interface and object crud interfaces into two classes. This is to divide lease and behavior guarded by lease into two parts.","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        pass\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"class CheckpointSerializer(object):\r"},{"line_number":46,"context_line":"    def __init__(self):\r"},{"line_number":47,"context_line":"        super(CheckpointSerializer, self).__init__()\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_883a85cc","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":26},"updated":"2016-01-27 16:01:06.000000000","message":"Again, I still don\u0027t understand why this class exists.","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"847c80b952202b4f4077a3c7177746c1d45296d7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        pass\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"class CheckpointSerializer(object):\r"},{"line_number":46,"context_line":"    def __init__(self):\r"},{"line_number":47,"context_line":"        super(CheckpointSerializer, self).__init__()\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_dec53e3c","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":26},"in_reply_to":"7a5de9d1_883a85cc","updated":"2016-01-29 02:50:36.000000000","message":"this class will serialize the data to be persisted.\nI know for json, each object has the same serializer function.  However, for gpb/xsd, each class will be compiled and produced to different serializer classes.","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"}],"smaug/protection/flow/__init__.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"__author__ \u003d \u0027Administrator\u0027\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_084d3572","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":28},"updated":"2016-01-27 16:01:06.000000000","message":"Please remove","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"365475272b523c20f20c100b17155752d83ec1e9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"__author__ \u003d \u0027Administrator\u0027\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_fe027a0a","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":28},"in_reply_to":"7a5de9d1_084d3572","updated":"2016-01-29 03:07:03.000000000","message":"I\u0027m sorry,I will remove it","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"}],"smaug/protection/flow/create_protection.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"__author__ \u003d \u0027Administrator\u0027\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_6848695c","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":28},"updated":"2016-01-27 16:01:06.000000000","message":"Please remove","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"365475272b523c20f20c100b17155752d83ec1e9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"__author__ \u003d \u0027Administrator\u0027\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_8000c002","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":28},"in_reply_to":"7a5de9d1_6848695c","updated":"2016-01-29 03:07:03.000000000","message":"I\u0027m sorry,I will remove it","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"}],"smaug/protection/manager.py":[{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e39109ec7cb5190dff0fdefdd01f4b31a076e2ca","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"protection_manager_opts \u003d ["},{"line_number":30,"context_line":"    cfg.IntOpt(\u0027update_protection_stats_interval\u0027,"},{"line_number":31,"context_line":"               default\u003d3600,"},{"line_number":32,"context_line":"               help\u003d\u0027update protection status interval\u0027),"},{"line_number":33,"context_line":"    cfg.StrOpt(\u0027provider_registry\u0027,"},{"line_number":34,"context_line":"               default\u003d\u0027smaug.protection.provider.ProviderRegistry\u0027,"},{"line_number":35,"context_line":"               help\u003d\u0027provider manager class\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_b2f26105","line":32,"range":{"start_line":30,"start_character":0,"end_line":32,"end_character":57},"updated":"2016-01-12 02:40:19.000000000","message":"Basic service class can periodically runs tasks on the manager. Do you consider use this configuration.\n\n    cfg.IntOpt(\u0027periodic_interval\u0027,\n               default\u003d60,\n               help\u003d\u0027Interval, in seconds, between running periodic tasks\u0027),","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"protection_manager_opts \u003d ["},{"line_number":30,"context_line":"    cfg.IntOpt(\u0027update_protection_stats_interval\u0027,"},{"line_number":31,"context_line":"               default\u003d3600,"},{"line_number":32,"context_line":"               help\u003d\u0027update protection status interval\u0027),"},{"line_number":33,"context_line":"    cfg.StrOpt(\u0027provider_registry\u0027,"},{"line_number":34,"context_line":"               default\u003d\u0027smaug.protection.provider.ProviderRegistry\u0027,"},{"line_number":35,"context_line":"               help\u003d\u0027provider manager class\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_f0a97f7c","line":32,"range":{"start_line":30,"start_character":0,"end_line":32,"end_character":57},"in_reply_to":"da6ed579_b2f26105","updated":"2016-01-19 03:11:52.000000000","message":"Just for operation,not service","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    cfg.StrOpt(\u0027provider_registry\u0027,"},{"line_number":34,"context_line":"               default\u003d\u0027smaug.protection.provider.ProviderRegistry\u0027,"},{"line_number":35,"context_line":"               help\u003d\u0027provider manager class\u0027),"},{"line_number":36,"context_line":"    cfg.StrOpt(\u0027checkpoint_collection\u0027,"},{"line_number":37,"context_line":"               default\u003d\u0027smaug.protection.checkpoint.CheckpointCollection\u0027,"},{"line_number":38,"context_line":"               help\u003d\u0027checkpoint manager class\u0027)"},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_ab5c8d4b","line":38,"range":{"start_line":36,"start_character":0,"end_line":38,"end_character":47},"updated":"2016-01-11 13:08:22.000000000","message":"Why is this pluggable?","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # for all protection definition,call protect function with"},{"line_number":86,"context_line":"        # the specific plugin"},{"line_number":87,"context_line":"        pile \u003d greenpool.GreenPile()"},{"line_number":88,"context_line":"        provider_id \u003d protection_plan.get(\"provider_id\", None)"},{"line_number":89,"context_line":"        provider \u003d self.provider_registry.show_provider(provider_id)"},{"line_number":90,"context_line":"        for protection_definition in protection_definitions:"},{"line_number":91,"context_line":"            plugin_id \u003d protection_definition.get(\"plugin_id\", None)"},{"line_number":92,"context_line":"            plugin \u003d provider.get_protection_plugin(plugin_id)"},{"line_number":93,"context_line":"            pile.spawn(plugin.protect, protection_definition)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # update checkpoint status"},{"line_number":96,"context_line":"        self.checkpoint_mgr.update_checkpoint(checkpoint,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_7ddbbc7c","line":93,"range":{"start_line":88,"start_character":8,"end_line":93,"end_character":61},"updated":"2016-01-11 13:08:22.000000000","message":"This is not how it\u0027s supposed to go. Please replace with a TODO since this flow requires the Protectable graph building code.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # for all protection definition,call protect function with"},{"line_number":86,"context_line":"        # the specific plugin"},{"line_number":87,"context_line":"        pile \u003d greenpool.GreenPile()"},{"line_number":88,"context_line":"        provider_id \u003d protection_plan.get(\"provider_id\", None)"},{"line_number":89,"context_line":"        provider \u003d self.provider_registry.show_provider(provider_id)"},{"line_number":90,"context_line":"        for protection_definition in protection_definitions:"},{"line_number":91,"context_line":"            plugin_id \u003d protection_definition.get(\"plugin_id\", None)"},{"line_number":92,"context_line":"            plugin \u003d provider.get_protection_plugin(plugin_id)"},{"line_number":93,"context_line":"            pile.spawn(plugin.protect, protection_definition)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # update checkpoint status"},{"line_number":96,"context_line":"        self.checkpoint_mgr.update_checkpoint(checkpoint,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_e71c6c6c","line":93,"range":{"start_line":88,"start_character":8,"end_line":93,"end_character":61},"in_reply_to":"fa69d971_7ddbbc7c","updated":"2016-01-19 03:11:52.000000000","message":"OK","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"8b27f350c1aa1ed5cd6c2275445a246dd2222ef8","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        self._update_protection_stats(protection_plan)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def restore(self, checkpoint, **kwargs):"},{"line_number":108,"context_line":"        # TODO(wangliuan)"},{"line_number":109,"context_line":"        pass"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_d9ffadff","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":15},"updated":"2016-01-13 08:52:14.000000000","message":"IMO, need add a delete operation method.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        self._update_protection_stats(protection_plan)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def restore(self, checkpoint, **kwargs):"},{"line_number":108,"context_line":"        # TODO(wangliuan)"},{"line_number":109,"context_line":"        pass"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_b08c6736","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":15},"in_reply_to":"da6ed579_d9ffadff","updated":"2016-01-19 03:11:52.000000000","message":"OK","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"b2065567f7f7ff9a92780b32c5dc1148e5751031","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def restore(self, checkpoint, **kwargs):"},{"line_number":108,"context_line":"        # TODO(wangliuan)"},{"line_number":109,"context_line":"        pass"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _update_protection_stats(self, protection_plan):"},{"line_number":112,"context_line":"        \"\"\"Update protection stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_98feafac","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":12},"updated":"2016-01-14 16:48:26.000000000","message":"We are missing start() and suspend() as well","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def restore(self, checkpoint, **kwargs):"},{"line_number":108,"context_line":"        # TODO(wangliuan)"},{"line_number":109,"context_line":"        pass"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _update_protection_stats(self, protection_plan):"},{"line_number":112,"context_line":"        \"\"\"Update protection stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_872490af","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":12},"in_reply_to":"da6ed579_98feafac","updated":"2016-01-19 03:11:52.000000000","message":"OK,I will add it","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e39109ec7cb5190dff0fdefdd01f4b31a076e2ca","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        # TODO(wangliuan)"},{"line_number":134,"context_line":"        pass"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def list_providers(self, list_option):"},{"line_number":137,"context_line":"        # TODO(wangliuan)"},{"line_number":138,"context_line":"        pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def show_provider(self, provider_id):"},{"line_number":141,"context_line":"        # TODO(wangliuan)"},{"line_number":142,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_7ee4b50c","line":142,"range":{"start_line":136,"start_character":0,"end_line":142,"end_character":12},"updated":"2016-01-12 02:40:19.000000000","message":"These methlod have defined in module \u0027ProviderRegistry\u0027. Why do we define here again?","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"21849c21339db459b6b34f0a42469f6361b01b65","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        # TODO(wangliuan)"},{"line_number":134,"context_line":"        pass"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def list_providers(self, list_option):"},{"line_number":137,"context_line":"        # TODO(wangliuan)"},{"line_number":138,"context_line":"        pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def show_provider(self, provider_id):"},{"line_number":141,"context_line":"        # TODO(wangliuan)"},{"line_number":142,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_1a125bb5","line":142,"range":{"start_line":136,"start_character":0,"end_line":142,"end_character":12},"in_reply_to":"da6ed579_7ee4b50c","updated":"2016-01-12 08:06:25.000000000","message":"I see. ProtectionManager call the methods of ProviderRegistry.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                 *args, **kwargs):"},{"line_number":46,"context_line":"        super(ProtectionManager, self).__init__(*args, **kwargs)"},{"line_number":47,"context_line":"        # TODO(wangliuan)  more params and use profiler.trace_cls"},{"line_number":48,"context_line":"        self.checkpoint_mgr \u003d importutils.import_object("},{"line_number":49,"context_line":"            \u0027smaug.protection.checkpoint.CheckpointCollection\u0027)"},{"line_number":50,"context_line":"        self.provider_registry \u003d importutils.import_object("},{"line_number":51,"context_line":"            \u0027smaug.protection.provider.ProviderRegistry\u0027)"},{"line_number":52,"context_line":"        self.flow_engine \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_0e88dd21","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":63},"updated":"2016-01-27 16:01:06.000000000","message":"Checkpoint collection implementation is part of the provider and shouldn\u0027t be dynamically loaded globally.","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"365475272b523c20f20c100b17155752d83ec1e9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                 *args, **kwargs):"},{"line_number":46,"context_line":"        super(ProtectionManager, self).__init__(*args, **kwargs)"},{"line_number":47,"context_line":"        # TODO(wangliuan)  more params and use profiler.trace_cls"},{"line_number":48,"context_line":"        self.checkpoint_mgr \u003d importutils.import_object("},{"line_number":49,"context_line":"            \u0027smaug.protection.checkpoint.CheckpointCollection\u0027)"},{"line_number":50,"context_line":"        self.provider_registry \u003d importutils.import_object("},{"line_number":51,"context_line":"            \u0027smaug.protection.provider.ProviderRegistry\u0027)"},{"line_number":52,"context_line":"        self.flow_engine \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_802760b5","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":63},"in_reply_to":"7a5de9d1_0e88dd21","updated":"2016-01-29 03:07:03.000000000","message":"Yes,I will push a new patch","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"2b5d749081cb172f8800b39b815b17f32f40a087","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        # TODO(wangliuan)  more params and use profiler.trace_cls"},{"line_number":48,"context_line":"        self.provider_registry \u003d importutils.import_object("},{"line_number":49,"context_line":"            \u0027smaug.protection.provider.ProviderRegistry\u0027)"},{"line_number":50,"context_line":"        self.checkpoint_collection_map \u003d {}"},{"line_number":51,"context_line":"        self.flow_engine \u003d None"},{"line_number":52,"context_line":"        # TODO(wangliuan)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_d7d07cf8","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":43},"updated":"2016-01-31 15:14:04.000000000","message":"Checkpoint collection is part of the provider. Why is this here?","commit_id":"87b3737b4d491816a2271ce4b356d040793bdb04"}],"smaug/protection/protection_plugin.py":[{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e39109ec7cb5190dff0fdefdd01f4b31a076e2ca","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class ProtectionData(object):\r"},{"line_number":24,"context_line":"    def __init__(self):\r"},{"line_number":25,"context_line":"        super(ProtectionData, self).__init__()\r"},{"line_number":26,"context_line":"        self.protection_id \u003d None\r"},{"line_number":27,"context_line":"        self.protection_target \u003d None\r"},{"line_number":28,"context_line":"        self.status \u003d None\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_fed42548","line":25,"range":{"start_line":25,"start_character":7,"end_line":25,"end_character":46},"updated":"2016-01-12 02:40:19.000000000","message":"No need to use super when extending `object`","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class ProtectionData(object):\r"},{"line_number":24,"context_line":"    def __init__(self):\r"},{"line_number":25,"context_line":"        super(ProtectionData, self).__init__()\r"},{"line_number":26,"context_line":"        self.protection_id \u003d None\r"},{"line_number":27,"context_line":"        self.protection_target \u003d None\r"},{"line_number":28,"context_line":"        self.status \u003d None\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_744606c1","line":25,"range":{"start_line":25,"start_character":7,"end_line":25,"end_character":46},"in_reply_to":"da6ed579_fed42548","updated":"2016-01-19 03:11:52.000000000","message":"Yes,it\u0027s unnecessary but harmless if we just use single inheritance.But,if we have a multiple inheritance tree.The next class in the \"MRO\" list could be something other than object! In that case, the call to super could be very much necessary.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e39109ec7cb5190dff0fdefdd01f4b31a076e2ca","unresolved":false,"context_lines":[{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"},{"line_number":36,"context_line":"        self.schema \u003d None\r"},{"line_number":37,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_9ec969af","line":34,"range":{"start_line":34,"start_character":8,"end_line":34,"end_character":48},"updated":"2016-01-12 02:40:19.000000000","message":"same","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"        pass\r"},{"line_number":50,"context_line":"\r"},{"line_number":51,"context_line":"    def get_schema(self, encoding_format):\r"},{"line_number":52,"context_line":"        # TODO(wangliuan)\r"},{"line_number":53,"context_line":"        pass\r"},{"line_number":54,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_7df73cd3","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":18},"updated":"2016-01-11 13:08:22.000000000","message":"Split to:\nget_options_schema(self, encoding_format)\nget_extended_info_schema(self, resource_id, bank)","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"        pass\r"},{"line_number":50,"context_line":"\r"},{"line_number":51,"context_line":"    def get_schema(self, encoding_format):\r"},{"line_number":52,"context_line":"        # TODO(wangliuan)\r"},{"line_number":53,"context_line":"        pass\r"},{"line_number":54,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_877250ac","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":18},"in_reply_to":"fa69d971_7df73cd3","updated":"2016-01-19 03:11:52.000000000","message":"OK,thanks","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"7b93ac8ecae72017f2a3505b632801305431d384","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_d586d712","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":22},"updated":"2016-01-20 16:00:28.000000000","message":"This doesn\u0027t align with the Protectable Protection Provider design. Please update the class to reflect the design.","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c081853fbda22c156720e6196f053e040977c9df","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_83ff9b00","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":22},"in_reply_to":"9a68dd71_d586d712","updated":"2016-01-21 10:55:40.000000000","message":"Could you give more details about this，thanks","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"8eaead2efa8c35b0c14b621ae029af0952cb3f6d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_098632b9","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":22},"in_reply_to":"9a68dd71_d586d712","updated":"2016-01-22 09:39:39.000000000","message":"I have review the Protectable Protection Provider design.You mean that we shouldn\u0027t provide these method(\u0027protection\u0027,\u0027restore\u0027,etc).They are just Operation and should be implement in the \"get_pre_task\" or \"get_post_task\".\nFor example:\nswitch Operation\ncase protect:\ncase restore:\n\nIs it?\nBut if we do this,it seems like that we require the vendor knows how to operate the Checkpoint and implement a task class.","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"104688de18f77409705513c4fb2ce1bbec19f230","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.schema \u003d None\r"},{"line_number":37,"context_line":"        # TODO(wangliuan)\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"    def protect(self, protectable):\r"},{"line_number":40,"context_line":"        # TODO(wangliuan)\r"},{"line_number":41,"context_line":"        pass\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"    def restore(self, checkpoint, **kwargs):\r"},{"line_number":44,"context_line":"        # TODO(wangliuan)\r"},{"line_number":45,"context_line":"        pass\r"},{"line_number":46,"context_line":"\r"},{"line_number":47,"context_line":"    def delete(self, protection_data):\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"        pass\r"},{"line_number":50,"context_line":"\r"},{"line_number":51,"context_line":"    def start(self, protectable):\r"},{"line_number":52,"context_line":"        # TODO(wangliuan)\r"},{"line_number":53,"context_line":"        pass\r"},{"line_number":54,"context_line":"\r"},{"line_number":55,"context_line":"    def suspend(self, protectable):\r"},{"line_number":56,"context_line":"        # TODO(wangliuan)\r"},{"line_number":57,"context_line":"        pass\r"},{"line_number":58,"context_line":"\r"},{"line_number":59,"context_line":"    def get_protectable_type(self):\r"},{"line_number":60,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_efb9a32f","line":57,"range":{"start_line":39,"start_character":0,"end_line":57,"end_character":12},"updated":"2016-01-21 07:48:44.000000000","message":"Protection plugin doesn\u0027t need to provide these method to outside, all of these logic is internal.","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"edba354cfab29ce5f7b1626e9d46c26a0b8e01ca","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.schema \u003d None\r"},{"line_number":37,"context_line":"        # TODO(wangliuan)\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"    def protect(self, protectable):\r"},{"line_number":40,"context_line":"        # TODO(wangliuan)\r"},{"line_number":41,"context_line":"        pass\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"    def restore(self, checkpoint, **kwargs):\r"},{"line_number":44,"context_line":"        # TODO(wangliuan)\r"},{"line_number":45,"context_line":"        pass\r"},{"line_number":46,"context_line":"\r"},{"line_number":47,"context_line":"    def delete(self, protection_data):\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"        pass\r"},{"line_number":50,"context_line":"\r"},{"line_number":51,"context_line":"    def start(self, protectable):\r"},{"line_number":52,"context_line":"        # TODO(wangliuan)\r"},{"line_number":53,"context_line":"        pass\r"},{"line_number":54,"context_line":"\r"},{"line_number":55,"context_line":"    def suspend(self, protectable):\r"},{"line_number":56,"context_line":"        # TODO(wangliuan)\r"},{"line_number":57,"context_line":"        pass\r"},{"line_number":58,"context_line":"\r"},{"line_number":59,"context_line":"    def get_protectable_type(self):\r"},{"line_number":60,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_d7c0b62c","line":57,"range":{"start_line":39,"start_character":0,"end_line":57,"end_character":12},"in_reply_to":"9a68dd71_efb9a32f","updated":"2016-01-22 08:28:35.000000000","message":"I think these method should be public,because in the \"get_pre_task\" or \"get_post_task\" we will construct a task class.The task class will call these method","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c081853fbda22c156720e6196f053e040977c9df","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.schema \u003d None\r"},{"line_number":37,"context_line":"        # TODO(wangliuan)\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"    def protect(self, protectable):\r"},{"line_number":40,"context_line":"        # TODO(wangliuan)\r"},{"line_number":41,"context_line":"        pass\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"    def restore(self, checkpoint, **kwargs):\r"},{"line_number":44,"context_line":"        # TODO(wangliuan)\r"},{"line_number":45,"context_line":"        pass\r"},{"line_number":46,"context_line":"\r"},{"line_number":47,"context_line":"    def delete(self, protection_data):\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"        pass\r"},{"line_number":50,"context_line":"\r"},{"line_number":51,"context_line":"    def start(self, protectable):\r"},{"line_number":52,"context_line":"        # TODO(wangliuan)\r"},{"line_number":53,"context_line":"        pass\r"},{"line_number":54,"context_line":"\r"},{"line_number":55,"context_line":"    def suspend(self, protectable):\r"},{"line_number":56,"context_line":"        # TODO(wangliuan)\r"},{"line_number":57,"context_line":"        pass\r"},{"line_number":58,"context_line":"\r"},{"line_number":59,"context_line":"    def get_protectable_type(self):\r"},{"line_number":60,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_68e28405","line":57,"range":{"start_line":39,"start_character":0,"end_line":57,"end_character":12},"in_reply_to":"9a68dd71_efb9a32f","updated":"2016-01-21 10:55:40.000000000","message":"OK，thanks","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"104688de18f77409705513c4fb2ce1bbec19f230","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # TODO(wangliuan)\r"},{"line_number":77,"context_line":"        pass\r"},{"line_number":78,"context_line":"\r"},{"line_number":79,"context_line":"    def get_protection_stats(self):\r"},{"line_number":80,"context_line":"        # TODO(wangliuan)\r"},{"line_number":81,"context_line":"        pass\r"},{"line_number":82,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_44cf7656","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":28},"updated":"2016-01-21 07:48:44.000000000","message":"This method is for getting what status info? And who will use the method?","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c081853fbda22c156720e6196f053e040977c9df","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # TODO(wangliuan)\r"},{"line_number":77,"context_line":"        pass\r"},{"line_number":78,"context_line":"\r"},{"line_number":79,"context_line":"    def get_protection_stats(self):\r"},{"line_number":80,"context_line":"        # TODO(wangliuan)\r"},{"line_number":81,"context_line":"        pass\r"},{"line_number":82,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_c8db701a","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":28},"in_reply_to":"9a68dd71_44cf7656","updated":"2016-01-21 10:55:40.000000000","message":"In yinwei‘s design,there is a task to check the protection status","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"5dad3c4ff33f197b672957e91463db05a7024df8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_0eb69ddc","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":22},"updated":"2016-01-27 16:01:06.000000000","message":"Please see design doc","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"365475272b523c20f20c100b17155752d83ec1e9","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"class ProtectionPlugin(object):\r"},{"line_number":33,"context_line":"    def __init__(self):\r"},{"line_number":34,"context_line":"        super(ProtectionPlugin, self).__init__()\r"},{"line_number":35,"context_line":"        self.protectable_type \u003d None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_4021689e","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":22},"in_reply_to":"7a5de9d1_0eb69ddc","updated":"2016-01-29 03:07:03.000000000","message":"OK","commit_id":"1e4c1dc48b811367c7d7e722dcc197df735aa13d"}],"smaug/protection/provider.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"class Provider(object):\r"},{"line_number":25,"context_line":"    def __init__(self):\r"},{"line_number":26,"context_line":"        super(Provider, self).__init__()\r"},{"line_number":27,"context_line":"        self.bank_plug \u003d None\r"},{"line_number":28,"context_line":"        self.plug_map \u003d {}\r"},{"line_number":29,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_cb6a21b5","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":40},"updated":"2016-01-11 13:08:22.000000000","message":"No need to use super when extending `object`","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"class Provider(object):\r"},{"line_number":25,"context_line":"    def __init__(self):\r"},{"line_number":26,"context_line":"        super(Provider, self).__init__()\r"},{"line_number":27,"context_line":"        self.bank_plug \u003d None\r"},{"line_number":28,"context_line":"        self.plug_map \u003d {}\r"},{"line_number":29,"context_line":"        # TODO(wangliuan)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_34096e96","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":40},"in_reply_to":"fa69d971_cb6a21b5","updated":"2016-01-19 03:11:52.000000000","message":"Yes,it\u0027s unnecessary but harmless if we just use single inheritance.But,if we have a multiple inheritance tree.The next class in the \"MRO\" list could be something other than object! In that case, the call to super could be very much necessary.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.plug_map \u003d {}\r"},{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def load_plugin(self, cfg_file):\r"},{"line_number":32,"context_line":"        # TODO(wangliuan)\r"},{"line_number":33,"context_line":"        pass\r"},{"line_number":34,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_b075dccb","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":19},"updated":"2016-01-11 13:08:22.000000000","message":"load_plugins.\nI also thing this is private as well","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.plug_map \u003d {}\r"},{"line_number":29,"context_line":"        # TODO(wangliuan)\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def load_plugin(self, cfg_file):\r"},{"line_number":32,"context_line":"        # TODO(wangliuan)\r"},{"line_number":33,"context_line":"        pass\r"},{"line_number":34,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_74efe6b0","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":19},"in_reply_to":"fa69d971_b075dccb","updated":"2016-01-19 03:11:52.000000000","message":"OK,thanks","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1598388d3c873ae33a6211dd0e730b1200de7a6f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        # TODO(wangliuan)\r"},{"line_number":33,"context_line":"        pass\r"},{"line_number":34,"context_line":"\r"},{"line_number":35,"context_line":"    def get_bank_plugin(self):\r"},{"line_number":36,"context_line":"        # TODO(wangliuan)\r"},{"line_number":37,"context_line":"        pass\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"    def get_protection_plugin(self, protectable_type):\r"},{"line_number":40,"context_line":"        # TODO(wangliuan)\r"},{"line_number":41,"context_line":"        pass\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"class ProviderRegistry(object):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_30532c19","line":41,"range":{"start_line":35,"start_character":0,"end_line":41,"end_character":12},"updated":"2016-01-11 13:08:22.000000000","message":"These are both private so they should be defined with a leading underscore.\n\ndef _get_bank_plugin(self):\ndef _get_protection_plugin(self, protectable_type)","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"25cf2c733f235fee92c8786d9850780f5a3477e4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        # TODO(wangliuan)\r"},{"line_number":33,"context_line":"        pass\r"},{"line_number":34,"context_line":"\r"},{"line_number":35,"context_line":"    def get_bank_plugin(self):\r"},{"line_number":36,"context_line":"        # TODO(wangliuan)\r"},{"line_number":37,"context_line":"        pass\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"    def get_protection_plugin(self, protectable_type):\r"},{"line_number":40,"context_line":"        # TODO(wangliuan)\r"},{"line_number":41,"context_line":"        pass\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"class ProviderRegistry(object):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_77ada587","line":41,"range":{"start_line":35,"start_character":0,"end_line":41,"end_character":12},"in_reply_to":"fa69d971_30532c19","updated":"2016-01-19 07:48:55.000000000","message":"I think they should be public,because the ResourceGraphWalkerListener may use this function","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e39109ec7cb5190dff0fdefdd01f4b31a076e2ca","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class ProviderRegistry(object):\r"},{"line_number":45,"context_line":"    def __init__(self):\r"},{"line_number":46,"context_line":"        super(ProviderRegistry, self).__init__()\r"},{"line_number":47,"context_line":"        LOG.info(_LI(\"ProviderRegistry\"))\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"\r"},{"line_number":50,"context_line":"    def load_providers(self, cfg_file):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_7e6595df","line":47,"range":{"start_line":47,"start_character":22,"end_line":47,"end_character":38},"updated":"2016-01-12 02:40:19.000000000","message":"This is not valuable information.","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c851285951db1225d2c6f0607fb7a8150551f84d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class ProviderRegistry(object):\r"},{"line_number":45,"context_line":"    def __init__(self):\r"},{"line_number":46,"context_line":"        super(ProviderRegistry, self).__init__()\r"},{"line_number":47,"context_line":"        LOG.info(_LI(\"ProviderRegistry\"))\r"},{"line_number":48,"context_line":"        # TODO(wangliuan)\r"},{"line_number":49,"context_line":"\r"},{"line_number":50,"context_line":"    def load_providers(self, cfg_file):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_d434924b","line":47,"range":{"start_line":47,"start_character":22,"end_line":47,"end_character":38},"in_reply_to":"da6ed579_7e6595df","updated":"2016-01-19 03:11:52.000000000","message":"OK,I will remove it","commit_id":"5a55dd6febb2686c4e56c59db9ea60a02ff3234f"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"104688de18f77409705513c4fb2ce1bbec19f230","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        # TODO(wangliuan)\r"},{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"    def get_protection_plugin(self, protectable_type):\r"},{"line_number":39,"context_line":"        # TODO(wangliuan)\r"},{"line_number":40,"context_line":"        pass\r"},{"line_number":41,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_2f733b82","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":29},"updated":"2016-01-21 07:48:44.000000000","message":"provider is pluggable, what if other vendor wants to implement a provider that doesn\u0027t use protection plugin?\nI think provider is supposed to provide some abstract interface instead, such as create_checkpoint.","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"c081853fbda22c156720e6196f053e040977c9df","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        # TODO(wangliuan)\r"},{"line_number":36,"context_line":"        pass\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"    def get_protection_plugin(self, protectable_type):\r"},{"line_number":39,"context_line":"        # TODO(wangliuan)\r"},{"line_number":40,"context_line":"        pass\r"},{"line_number":41,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_a82b9c81","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":29},"in_reply_to":"9a68dd71_2f733b82","updated":"2016-01-21 10:55:40.000000000","message":"There is another class named \"CheckpointCollection\" to create checkpoint.Provider is loaded by the ProviderRegistry,not implemented by vendor.If we don\u0027t want to use protection plugin,I think the attribute \"plug_map\" is None","commit_id":"60efcbf43e7d134a70de0bcc4e5d6d5956b3530e"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"d7ca5f9acd0232778a8f2b7cabc557e66b65fca1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Provider(object):"},{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_54ac2e8c","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":14},"updated":"2016-02-02 13:48:00.000000000","message":"PluggableProtectionProvider","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"0f4867d0c8c4dde51468fe9281f4a9ec97e5b244","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Provider(object):"},{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_ee5f8e73","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":14},"in_reply_to":"7a5de9d1_54ac2e8c","updated":"2016-02-03 04:10:35.000000000","message":"Done","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"d7ca5f9acd0232778a8f2b7cabc557e66b65fca1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class Provider(object):"},{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_94c9465d","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":31},"updated":"2016-02-02 13:48:00.000000000","message":"self._bank_plugin","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"0f4867d0c8c4dde51468fe9281f4a9ec97e5b244","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class Provider(object):"},{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_ae3af6e5","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":31},"in_reply_to":"7a5de9d1_94c9465d","updated":"2016-02-03 04:10:35.000000000","message":"Done","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"d7ca5f9acd0232778a8f2b7cabc557e66b65fca1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_74c04a2b","line":27,"range":{"start_line":27,"start_character":13,"end_line":27,"end_character":23},"updated":"2016-02-02 13:48:00.000000000","message":"self._plugin_map","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"0f4867d0c8c4dde51468fe9281f4a9ec97e5b244","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self):"},{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_ce165255","line":27,"range":{"start_line":27,"start_character":13,"end_line":27,"end_character":23},"in_reply_to":"7a5de9d1_74c04a2b","updated":"2016-02-03 04:10:35.000000000","message":"Done","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"d7ca5f9acd0232778a8f2b7cabc557e66b65fca1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _load_plugins(self, cfg_file):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_54750e30","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":41},"updated":"2016-02-02 13:48:00.000000000","message":"I don\u0027t think it\u0027s public. There should just be methods for querying the checkpoints since we will not hold the actual list in memory.","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"0f4867d0c8c4dde51468fe9281f4a9ec97e5b244","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        super(Provider, self).__init__()"},{"line_number":26,"context_line":"        self.bank_plugin \u003d None"},{"line_number":27,"context_line":"        self.plugin_map \u003d {}"},{"line_number":28,"context_line":"        self.checkpoint_collection \u003d None"},{"line_number":29,"context_line":"        # TODO(wangliuan)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _load_plugins(self, cfg_file):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_4e74a2fc","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":41},"in_reply_to":"7a5de9d1_54750e30","updated":"2016-02-03 04:10:35.000000000","message":"I think it\u0027s public,the CheckpointTask need this parameter to create or sync checkpoint.","commit_id":"b79c033daf82d6fc42ca1aa1dce8c831c2d4b548"}]}
