)]}'
{"karbor/services/protection/bank_plugins/file_system_bank_plugin.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bf96a2253f43f72503dcc1c01d7392908432e547","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":"from oslo_serialization import jsonutils"},{"line_number":19,"context_line":"from oslo_utils import uuidutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from karbor import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_5b5cc77c","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":40},"updated":"2017-03-13 03:54:31.000000000","message":"why import it when json has been imported. IMO, just use one of them.","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"25d961efd8f237b73018d865814768fd5e5c1855","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":"from oslo_serialization import jsonutils"},{"line_number":19,"context_line":"from oslo_utils import uuidutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from karbor import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a22e58a_62228fbb","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":40},"in_reply_to":"9a30ddce_5b5cc77c","updated":"2017-03-14 11:07:53.000000000","message":"Done","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bf96a2253f43f72503dcc1c01d7392908432e547","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.owner_id \u003d uuidutils.generate_uuid()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def create_dir(self, path):"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            os.makedirs(path)"},{"line_number":63,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_3bd0f3c8","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":18},"updated":"2017-03-13 03:54:31.000000000","message":"It is not the public interface, but the internal function. So it is better to rename it as \u0027_create_dir\u0027","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"25d961efd8f237b73018d865814768fd5e5c1855","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.owner_id \u003d uuidutils.generate_uuid()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def create_dir(self, path):"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            os.makedirs(path)"},{"line_number":63,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a22e58a_a22c87ac","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":18},"in_reply_to":"9a30ddce_3bd0f3c8","updated":"2017-03-14 11:07:53.000000000","message":"Done","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bf96a2253f43f72503dcc1c01d7392908432e547","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                raise BankCreateDirectoryFailed(reason\u003derr)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _write_object(self, path, data):"},{"line_number":72,"context_line":"        obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":73,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":74,"context_line":"        try:"},{"line_number":75,"context_line":"            self.create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_9e3f0db3","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":57},"updated":"2017-03-13 03:54:31.000000000","message":"If path does not have \u0027/\u0027, then \u0027obj_path\u0027 will be same as \u0027obj_file_name\u0027. and an exception such as \u0027IOError\u0027 will be raised. So is there any check for the path before runs at here.","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"bf96a2253f43f72503dcc1c01d7392908432e547","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":136,"context_line":"            name \u003d key.rsplit(\u0027/\u0027, 1)[1]"},{"line_number":137,"context_line":"            if name \u003d\u003d \"index.json\":"},{"line_number":138,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":139,"context_line":"            return data"},{"line_number":140,"context_line":"        except os.error as err:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_5b37674c","line":137,"range":{"start_line":136,"start_character":12,"end_line":137,"end_character":36},"updated":"2017-03-13 03:54:31.000000000","message":"it is simpler to use #if key.find(\u0027index.json\u0027) \u003e\u003d 0:# instead.","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"25d961efd8f237b73018d865814768fd5e5c1855","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":136,"context_line":"            name \u003d key.rsplit(\u0027/\u0027, 1)[1]"},{"line_number":137,"context_line":"            if name \u003d\u003d \"index.json\":"},{"line_number":138,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":139,"context_line":"            return data"},{"line_number":140,"context_line":"        except os.error as err:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a22e58a_2217b752","line":137,"range":{"start_line":136,"start_character":12,"end_line":137,"end_character":36},"in_reply_to":"9a30ddce_5b37674c","updated":"2017-03-14 11:07:53.000000000","message":"Done","commit_id":"b213294a94c9c4cd6359af490d0bc6058e7d0f1a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"file_system_bank_plugin_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027file_system_bank_path\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/mnt/karbor_fs_bank\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_d1adba32","line":27,"range":{"start_line":27,"start_character":24,"end_line":27,"end_character":43},"updated":"2017-03-15 08:47:11.000000000","message":"This can not be the default. The user must specify a path, and fail to load the plugin when the path is not specified.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9e2176144b18fddcee93748f5e15ddd1868c888","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"file_system_bank_plugin_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027file_system_bank_path\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/mnt/karbor_fs_bank\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_e32025fa","line":27,"range":{"start_line":27,"start_character":24,"end_line":27,"end_character":43},"in_reply_to":"3a1ff146_d1adba32","updated":"2017-03-15 13:27:01.000000000","message":"It means that use must specify a path in the provider config file.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"file_system_bank_plugin_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027file_system_bank_path\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/mnt/karbor_fs_bank\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"},{"line_number":31,"context_line":"               help\u003d\u0027The default file system bank object path to use.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_716de603","line":28,"range":{"start_line":28,"start_character":25,"end_line":28,"end_character":32},"updated":"2017-03-15 08:47:11.000000000","message":"It is not a default path, it is the path.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":25,"context_line":"file_system_bank_plugin_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027file_system_bank_path\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/mnt/karbor_fs_bank\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"},{"line_number":31,"context_line":"               help\u003d\u0027The default file system bank object path to use.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_e081f44b","line":28,"range":{"start_line":28,"start_character":25,"end_line":28,"end_character":32},"in_reply_to":"3a1ff146_716de603","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"},{"line_number":31,"context_line":"               help\u003d\u0027The default file system bank object path to use.\u0027),"},{"line_number":32,"context_line":"]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_51362a04","line":31,"range":{"start_line":31,"start_character":21,"end_line":31,"end_character":69},"updated":"2017-03-15 08:47:11.000000000","message":"Wrong description","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               help\u003d\u0027The default file system bank path to use.\u0027),"},{"line_number":29,"context_line":"    cfg.StrOpt(\u0027bank_object_container\u0027,"},{"line_number":30,"context_line":"               default\u003d\u0027karbor\u0027,"},{"line_number":31,"context_line":"               help\u003d\u0027The default file system bank object path to use.\u0027),"},{"line_number":32,"context_line":"]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_2094ec89","line":31,"range":{"start_line":31,"start_character":21,"end_line":31,"end_character":69},"in_reply_to":"3a1ff146_51362a04","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BankCreateDirectoryFailed(exception.KarborException):"},{"line_number":38,"context_line":"    message \u003d _(\"Create the directory failed: %(reason)s\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FileSystemBankPlugin(BankPlugin):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_dc3791e1","line":38,"range":{"start_line":37,"start_character":0,"end_line":38,"end_character":58},"updated":"2017-03-15 08:47:11.000000000","message":"Why create a new exception? No one is ready to catch that.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BankCreateDirectoryFailed(exception.KarborException):"},{"line_number":38,"context_line":"    message \u003d _(\"Create the directory failed: %(reason)s\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FileSystemBankPlugin(BankPlugin):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_608ee479","line":38,"range":{"start_line":37,"start_character":0,"end_line":38,"end_character":58},"in_reply_to":"3a1ff146_dc3791e1","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FileSystemBankPlugin(BankPlugin):"},{"line_number":42,"context_line":"    \"\"\"File system bank plugin\"\"\""},{"line_number":43,"context_line":"    def __init__(self, config, context\u003dNone, version\u003dNone):"},{"line_number":44,"context_line":"        super(FileSystemBankPlugin, self).__init__(config)"},{"line_number":45,"context_line":"        self._config.register_opts(file_system_bank_plugin_opts,"},{"line_number":46,"context_line":"                                   \"file_system_bank_plugin\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_3c74259b","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":57},"updated":"2017-03-15 08:47:11.000000000","message":"does anyone creates the Bank with these parameters?","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FileSystemBankPlugin(BankPlugin):"},{"line_number":42,"context_line":"    \"\"\"File system bank plugin\"\"\""},{"line_number":43,"context_line":"    def __init__(self, config, context\u003dNone, version\u003dNone):"},{"line_number":44,"context_line":"        super(FileSystemBankPlugin, self).__init__(config)"},{"line_number":45,"context_line":"        self._config.register_opts(file_system_bank_plugin_opts,"},{"line_number":46,"context_line":"                                   \"file_system_bank_plugin\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_c0f31809","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":57},"in_reply_to":"3a1ff146_3c74259b","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        plugin_cfg \u003d self._config.file_system_bank_plugin"},{"line_number":48,"context_line":"        self.file_system_bank_path \u003d plugin_cfg.file_system_bank_path"},{"line_number":49,"context_line":"        self.bank_object_container \u003d plugin_cfg.bank_object_container"},{"line_number":50,"context_line":"        # create the directory of file system bank path"},{"line_number":51,"context_line":"        self._create_dir(self.file_system_bank_path)"},{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_5ca001f5","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":55},"updated":"2017-03-15 08:47:11.000000000","message":"no need to describe obvious operations","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        plugin_cfg \u003d self._config.file_system_bank_plugin"},{"line_number":48,"context_line":"        self.file_system_bank_path \u003d plugin_cfg.file_system_bank_path"},{"line_number":49,"context_line":"        self.bank_object_container \u003d plugin_cfg.bank_object_container"},{"line_number":50,"context_line":"        # create the directory of file system bank path"},{"line_number":51,"context_line":"        self._create_dir(self.file_system_bank_path)"},{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_a0637cb0","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":55},"in_reply_to":"3a1ff146_5ca001f5","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.file_system_bank_path \u003d plugin_cfg.file_system_bank_path"},{"line_number":49,"context_line":"        self.bank_object_container \u003d plugin_cfg.bank_object_container"},{"line_number":50,"context_line":"        # create the directory of file system bank path"},{"line_number":51,"context_line":"        self._create_dir(self.file_system_bank_path)"},{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"},{"line_number":54,"context_line":"        # create the directory of bank object container path"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_9cf8b9e7","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":52},"updated":"2017-03-15 08:47:11.000000000","message":"if create dir fails, we shouldn\u0027t crash karbor","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.file_system_bank_path \u003d plugin_cfg.file_system_bank_path"},{"line_number":49,"context_line":"        self.bank_object_container \u003d plugin_cfg.bank_object_container"},{"line_number":50,"context_line":"        # create the directory of file system bank path"},{"line_number":51,"context_line":"        self._create_dir(self.file_system_bank_path)"},{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"},{"line_number":54,"context_line":"        # create the directory of bank object container path"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_a03c5c94","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":52},"in_reply_to":"3a1ff146_9cf8b9e7","updated":"2017-03-15 13:56:25.000000000","message":"It will throw a exception.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self._create_dir(self.file_system_bank_path)"},{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"},{"line_number":54,"context_line":"        # create the directory of bank object container path"},{"line_number":55,"context_line":"        self._create_dir(self.object_container_path)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.owner_id \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_bcaf35e2","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":60},"updated":"2017-03-15 08:47:11.000000000","message":"no need to describe obvious operations","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.object_container_path \u003d \"/\".join([self.file_system_bank_path,"},{"line_number":53,"context_line":"                                               self.bank_object_container])"},{"line_number":54,"context_line":"        # create the directory of bank object container path"},{"line_number":55,"context_line":"        self._create_dir(self.object_container_path)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.owner_id \u003d uuidutils.generate_uuid()"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_3ce9851b","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":52},"updated":"2017-03-15 08:47:11.000000000","message":"if create dir fails, we shouldn\u0027t crash karbor","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _create_dir(self, path):"},{"line_number":60,"context_line":"        try:"},{"line_number":61,"context_line":"            os.makedirs(path)"},{"line_number":62,"context_line":"        except OSError as err:"},{"line_number":63,"context_line":"            if err.errno \u003d\u003d errno.EEXIST and os.path.isdir(path):"},{"line_number":64,"context_line":"                LOG.debug(\u0027The directory %s found!\u0027, path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_1cbcc904","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":29},"updated":"2017-03-15 08:47:11.000000000","message":"Must specify the mode parameter, otherwise will be created with 0777 mod","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _create_dir(self, path):"},{"line_number":60,"context_line":"        try:"},{"line_number":61,"context_line":"            os.makedirs(path)"},{"line_number":62,"context_line":"        except OSError as err:"},{"line_number":63,"context_line":"            if err.errno \u003d\u003d errno.EEXIST and os.path.isdir(path):"},{"line_number":64,"context_line":"                LOG.debug(\u0027The directory %s found!\u0027, path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_e0a49458","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":29},"in_reply_to":"3a1ff146_1cbcc904","updated":"2017-03-15 13:56:25.000000000","message":"hi yuval What value of mode parameter should I use by default?","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            os.makedirs(path)"},{"line_number":62,"context_line":"        except OSError as err:"},{"line_number":63,"context_line":"            if err.errno \u003d\u003d errno.EEXIST and os.path.isdir(path):"},{"line_number":64,"context_line":"                LOG.debug(\u0027The directory %s found!\u0027, path)"},{"line_number":65,"context_line":"                pass"},{"line_number":66,"context_line":"            else:"},{"line_number":67,"context_line":"                LOG.exception(_LE(\"Create the directory failed. %s\"), path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_dc1dd110","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":58},"updated":"2017-03-15 08:47:11.000000000","message":"No need for that","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                pass"},{"line_number":66,"context_line":"            else:"},{"line_number":67,"context_line":"                LOG.exception(_LE(\"Create the directory failed. %s\"), path)"},{"line_number":68,"context_line":"                raise BankCreateDirectoryFailed(reason\u003derr)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _write_object(self, path, data):"},{"line_number":71,"context_line":"        obj_file_name \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_9ce27902","line":68,"range":{"start_line":68,"start_character":22,"end_line":68,"end_character":47},"updated":"2017-03-15 08:47:11.000000000","message":"See comment above","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _write_object(self, path, data):"},{"line_number":71,"context_line":"        obj_file_name \u003d None"},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":74,"context_line":"            obj_file_name \u003d self.object_container_path + path"},{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_fcfc4d40","line":73,"range":{"start_line":73,"start_character":52,"end_line":73,"end_character":74},"updated":"2017-03-15 08:47:11.000000000","message":"what about inputs like: (some of them are validated at BankPlugin level, but sanity should be done here as well)\n\"/../../../../../etc/passwd\"\n\"./123\"\n\"/123\"\n\"//123\"","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9e2176144b18fddcee93748f5e15ddd1868c888","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _write_object(self, path, data):"},{"line_number":71,"context_line":"        obj_file_name \u003d None"},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":74,"context_line":"            obj_file_name \u003d self.object_container_path + path"},{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_83405158","line":73,"range":{"start_line":73,"start_character":52,"end_line":73,"end_character":74},"in_reply_to":"3a1ff146_fcfc4d40","updated":"2017-03-15 13:27:01.000000000","message":"I think this should be validated at BankPlugin level. Swift bank plugin will get the same wrong inputs.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"},{"line_number":78,"context_line":"        except (os.error, IOError):"},{"line_number":79,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_5cbf21d0","line":78,"range":{"start_line":78,"start_character":16,"end_line":78,"end_character":24},"updated":"2017-03-15 08:47:11.000000000","message":"use \u0027os.error\u0027 or \u0027OSError\u0027 consistently (personally prefer OSError)","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"},{"line_number":78,"context_line":"        except (os.error, IOError):"},{"line_number":79,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_409488e1","line":78,"range":{"start_line":78,"start_character":16,"end_line":78,"end_character":24},"in_reply_to":"3a1ff146_5cbf21d0","updated":"2017-03-15 13:56:25.000000000","message":"Done","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"},{"line_number":78,"context_line":"        except (os.error, IOError):"},{"line_number":79,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_fcf28d99","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":53},"updated":"2017-03-15 08:47:11.000000000","message":"Reformat, more informative","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"},{"line_number":78,"context_line":"        except (os.error, IOError):"},{"line_number":79,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_bca3b59d","line":79,"range":{"start_line":79,"start_character":26,"end_line":79,"end_character":29},"updated":"2017-03-15 08:47:11.000000000","message":"_LE -\u003e _\n(in all the file)","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9e2176144b18fddcee93748f5e15ddd1868c888","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"},{"line_number":78,"context_line":"        except (os.error, IOError):"},{"line_number":79,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_d934f8df","line":79,"range":{"start_line":79,"start_character":26,"end_line":79,"end_character":29},"in_reply_to":"3a1ff146_bca3b59d","updated":"2017-03-15 13:27:01.000000000","message":"_LE also can be used here. They are error logs after catching a exception.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                data \u003d obj_file.read()"},{"line_number":87,"context_line":"                return data"},{"line_number":88,"context_line":"        except os.error:"},{"line_number":89,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":90,"context_line":"            raise"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _delete_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_5c300157","line":89,"range":{"start_line":89,"start_character":31,"end_line":89,"end_character":53},"updated":"2017-03-15 08:47:11.000000000","message":"reformat, more informative","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                data \u003d obj_file.read()"},{"line_number":87,"context_line":"                return data"},{"line_number":88,"context_line":"        except os.error:"},{"line_number":89,"context_line":"            LOG.exception(_LE(\"get object failed. %s.\"), obj_file_name)"},{"line_number":90,"context_line":"            raise"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _delete_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_e3257eab","line":89,"range":{"start_line":89,"start_character":31,"end_line":89,"end_character":53},"in_reply_to":"3a1ff146_5c300157","updated":"2017-03-15 13:56:25.000000000","message":"The error will be printed in the method get_object.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _delete_object(self, path):"},{"line_number":93,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            os.remove(obj_file_name)"},{"line_number":96,"context_line":"        except os.error:"},{"line_number":97,"context_line":"            LOG.exception(_LE(\"Delete the object failed. %s\"), obj_file_name)"},{"line_number":98,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_d765aae1","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":36},"updated":"2017-03-15 08:47:11.000000000","message":"if this is the last file in the directory, remove the directory (up to the root of the bank)","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9e2176144b18fddcee93748f5e15ddd1868c888","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def _delete_object(self, path):"},{"line_number":93,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            os.remove(obj_file_name)"},{"line_number":96,"context_line":"        except os.error:"},{"line_number":97,"context_line":"            LOG.exception(_LE(\"Delete the object failed. %s\"), obj_file_name)"},{"line_number":98,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_7d268dbb","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":36},"in_reply_to":"3a1ff146_d765aae1","updated":"2017-03-15 13:27:01.000000000","message":"Can we handle this in the BankPlugin level? Does swift need consider deleting the directory object?","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            os.remove(obj_file_name)"},{"line_number":96,"context_line":"        except os.error:"},{"line_number":97,"context_line":"            LOG.exception(_LE(\"Delete the object failed. %s\"), obj_file_name)"},{"line_number":98,"context_line":"            raise"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _list_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_37ffde02","line":97,"range":{"start_line":97,"start_character":31,"end_line":97,"end_character":59},"updated":"2017-03-15 08:47:11.000000000","message":"Not informative. Include errno info","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            os.remove(obj_file_name)"},{"line_number":96,"context_line":"        except os.error:"},{"line_number":97,"context_line":"            LOG.exception(_LE(\"Delete the object failed. %s\"), obj_file_name)"},{"line_number":98,"context_line":"            raise"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _list_object(self, path):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_2366b6ed","line":97,"range":{"start_line":97,"start_character":31,"end_line":97,"end_character":59},"in_reply_to":"3a1ff146_37ffde02","updated":"2017-03-15 13:56:25.000000000","message":"The errno info will be printed in the method delete_object.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def _list_object(self, path):"},{"line_number":101,"context_line":"        obj_file_path \u003d self.object_container_path + path"},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":104,"context_line":"        except os.error:"},{"line_number":105,"context_line":"            LOG.exception(_LE(\"list the object failed. %s\"), obj_file_path)"},{"line_number":106,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_1732e2f1","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":44},"updated":"2017-03-15 08:47:11.000000000","message":"I think this will return sub-directories entries","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9e2176144b18fddcee93748f5e15ddd1868c888","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def _list_object(self, path):"},{"line_number":101,"context_line":"        obj_file_path \u003d self.object_container_path + path"},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":104,"context_line":"        except os.error:"},{"line_number":105,"context_line":"            LOG.exception(_LE(\"list the object failed. %s\"), obj_file_path)"},{"line_number":106,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_1d52f967","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":44},"in_reply_to":"3a1ff146_1732e2f1","updated":"2017-03-15 13:27:01.000000000","message":"Now list the checkpoint with swift bank also return the objects under the directory.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":136,"context_line":"            if key.find(\u0027index.json\u0027) \u003e\u003d 0:"},{"line_number":137,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":138,"context_line":"            return data"},{"line_number":139,"context_line":"        except os.error as err:"},{"line_number":140,"context_line":"            LOG.error(_LE(\"get object failed, err: %s.\"), err)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_9746d221","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":44},"updated":"2017-03-15 08:47:11.000000000","message":"Breaking abstraction. Bank should know nothing on the keys","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":136,"context_line":"            if key.find(\u0027index.json\u0027) \u003e\u003d 0:"},{"line_number":137,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":138,"context_line":"            return data"},{"line_number":139,"context_line":"        except os.error as err:"},{"line_number":140,"context_line":"            LOG.error(_LE(\"get object failed, err: %s.\"), err)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_a36386b0","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":44},"in_reply_to":"3a1ff146_9746d221","updated":"2017-03-15 13:56:25.000000000","message":"May need handle it in the checkpoint module.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"f218260ea7a5dcc54b4cb83003abfb835ae44cb9","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                     sort_dir\u003dNone):"},{"line_number":146,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":147,"context_line":"        try:"},{"line_number":148,"context_line":"                file_lists \u003d self._list_object(prefix)"},{"line_number":149,"context_line":"                limit_objects \u003d ("},{"line_number":150,"context_line":"                    file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":151,"context_line":"                return limit_objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_5731baa1","line":148,"range":{"start_line":148,"start_character":47,"end_line":148,"end_character":53},"updated":"2017-03-15 08:47:11.000000000","message":"what if the prefix is a not a directory, just a prefix? this will not work","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cbf9c709c72b1d0ace72b2d1a18b25328229c1ce","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                     sort_dir\u003dNone):"},{"line_number":146,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":147,"context_line":"        try:"},{"line_number":148,"context_line":"                file_lists \u003d self._list_object(prefix)"},{"line_number":149,"context_line":"                limit_objects \u003d ("},{"line_number":150,"context_line":"                    file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":151,"context_line":"                return limit_objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_c326c267","line":148,"range":{"start_line":148,"start_character":47,"end_line":148,"end_character":53},"in_reply_to":"3a1ff146_5731baa1","updated":"2017-03-15 13:56:25.000000000","message":"May need consider this use case with swift bank.","commit_id":"9ef21b0ed16f884acec7e1b78fdf68aff6441531"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"d4bbffc141bafa43afbb6c0d21f3aa236618bdfc","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            self._delete_object(path\u003dkey)"},{"line_number":124,"context_line":"        except OSError as err:"},{"line_number":125,"context_line":"            LOG.error(_LE(\"delete object failed, err: %s.\"), err)"},{"line_number":126,"context_line":"            raise exception.BankDeleteObjectFailed(reason\u003derr,"},{"line_number":127,"context_line":"                                                   key\u003dkey)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_c5648dba","line":125,"range":{"start_line":125,"start_character":27,"end_line":125,"end_character":28},"updated":"2017-03-22 03:08:37.000000000","message":"s/d/D","commit_id":"d55c52372f2496b6143325b477080d5eee9727ef"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"d4bbffc141bafa43afbb6c0d21f3aa236618bdfc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":133,"context_line":"            return data"},{"line_number":134,"context_line":"        except OSError as err:"},{"line_number":135,"context_line":"            LOG.error(_LE(\"get object failed, err: %s.\"), err)"},{"line_number":136,"context_line":"            raise exception.BankGetObjectFailed(reason\u003derr,"},{"line_number":137,"context_line":"                                                key\u003dkey)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_656af982","line":135,"range":{"start_line":135,"start_character":27,"end_line":135,"end_character":28},"updated":"2017-03-22 03:08:37.000000000","message":"s/g/G","commit_id":"d55c52372f2496b6143325b477080d5eee9727ef"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"d4bbffc141bafa43afbb6c0d21f3aa236618bdfc","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                    file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":146,"context_line":"                return limit_objects"},{"line_number":147,"context_line":"        except OSError as err:"},{"line_number":148,"context_line":"            LOG.error(_LE(\"list objects failed, err: %s.\"), err)"},{"line_number":149,"context_line":"            raise exception.BankListObjectsFailed(reason\u003derr)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_a506b1cb","line":148,"range":{"start_line":148,"start_character":27,"end_line":148,"end_character":28},"updated":"2017-03-22 03:08:37.000000000","message":"s/l/L","commit_id":"d55c52372f2496b6143325b477080d5eee9727ef"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _write_object(self, path, data):"},{"line_number":71,"context_line":"        obj_file_name \u003d None"},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":74,"context_line":"            obj_file_name \u003d self.object_container_path + path"},{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_0ebdafd7","line":74,"range":{"start_line":73,"start_character":0,"end_line":74,"end_character":61},"updated":"2017-03-23 03:54:03.000000000","message":"If \u0027path\u0027 looks like this \u0027abc/key\u0027, and \u0027self.object_container_path\u0027 looks like \u0027/karbor\u0027, then \u0027obj_path\u0027 \u003d \u0027/karborabc\u0027 and \u0027obj_file_name\u0027 \u003d \u0027/karborabc/key\u0027, it will fail obviously. So, it is better to add one statements before, for example: \nif not path.startswith(\u0027/\u0027):\n    path \u003d \u0027/\u0027 + path","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e16b65d300ca21abacdc1f24adf1d4fea91b0f00","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _write_object(self, path, data):"},{"line_number":71,"context_line":"        obj_file_name \u003d None"},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":74,"context_line":"            obj_file_name \u003d self.object_container_path + path"},{"line_number":75,"context_line":"            self._create_dir(obj_path)"},{"line_number":76,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":77,"context_line":"                obj_file.write(data)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_6b28d09a","line":74,"range":{"start_line":73,"start_character":0,"end_line":74,"end_character":61},"in_reply_to":"1a1ced50_0ebdafd7","updated":"2017-03-23 07:33:35.000000000","message":"The validation of patch(key) has been done in the class \nBankSection.\n        self._prefix \u003d os.path.normpath(section)\n        if not self._prefix.startswith(\u0027/\u0027):\n            self._prefix \u003d \u0027/\u0027 + self._prefix","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            raise"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_object(self, path):"},{"line_number":83,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":84,"context_line":"        try:"},{"line_number":85,"context_line":"            with open(obj_file_name, mode\u003d\u0027r\u0027) as obj_file:"},{"line_number":86,"context_line":"                data \u003d obj_file.read()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_4eb3270a","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":57},"updated":"2017-03-23 03:54:03.000000000","message":"ditto","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            raise"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _delete_object(self, path):"},{"line_number":93,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            os.remove(obj_file_name)"},{"line_number":96,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_6eb623fa","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":57},"updated":"2017-03-23 03:54:03.000000000","message":"ditto","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            raise"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _list_object(self, path):"},{"line_number":102,"context_line":"        obj_file_path \u003d self.object_container_path + path"},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":105,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_cec71762","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":57},"updated":"2017-03-23 03:54:03.000000000","message":"ditto","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def get_object(self, key):"},{"line_number":134,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":135,"context_line":"        try:"},{"line_number":136,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":137,"context_line":"            return data"},{"line_number":138,"context_line":"        except OSError as err:"},{"line_number":139,"context_line":"            LOG.error(\"Get object failed, err: %s.\", err)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_eebe93ac","line":136,"range":{"start_line":136,"start_character":12,"end_line":136,"end_character":16},"updated":"2017-03-23 03:54:03.000000000","message":"no need define a new variable. just return result.","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e16b65d300ca21abacdc1f24adf1d4fea91b0f00","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def get_object(self, key):"},{"line_number":134,"context_line":"        LOG.debug(\"FsBank: get_object. key: %s\", key)"},{"line_number":135,"context_line":"        try:"},{"line_number":136,"context_line":"            data \u003d self._get_object(path\u003dkey)"},{"line_number":137,"context_line":"            return data"},{"line_number":138,"context_line":"        except OSError as err:"},{"line_number":139,"context_line":"            LOG.error(\"Get object failed, err: %s.\", err)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_de3980a5","line":136,"range":{"start_line":136,"start_character":12,"end_line":136,"end_character":16},"in_reply_to":"1a1ced50_eebe93ac","updated":"2017-03-23 07:33:35.000000000","message":"Done","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e6665b360409a09c642582441d6e6f1f655d017f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":146,"context_line":"        try:"},{"line_number":147,"context_line":"                file_lists \u003d self._list_object(prefix)"},{"line_number":148,"context_line":"                limit_objects \u003d ("},{"line_number":149,"context_line":"                    file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":150,"context_line":"                return limit_objects"},{"line_number":151,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_aea1fb95","line":148,"range":{"start_line":148,"start_character":16,"end_line":148,"end_character":29},"updated":"2017-03-23 03:54:03.000000000","message":"no need define a new variable, just return the result","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e16b65d300ca21abacdc1f24adf1d4fea91b0f00","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":146,"context_line":"        try:"},{"line_number":147,"context_line":"                file_lists \u003d self._list_object(prefix)"},{"line_number":148,"context_line":"                limit_objects \u003d ("},{"line_number":149,"context_line":"                    file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":150,"context_line":"                return limit_objects"},{"line_number":151,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a1ced50_fe3c7c94","line":148,"range":{"start_line":148,"start_character":16,"end_line":148,"end_character":29},"in_reply_to":"1a1ced50_aea1fb95","updated":"2017-03-23 07:33:35.000000000","message":"Done","commit_id":"33a03113302413488c801b36ff68e6de25fe3cd3"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19f994c1f9ba03ebac451e0a12ae3188a40c205f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def get_owner_id(self):"},{"line_number":111,"context_line":"        return self.owner_id"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def update_object(self, key, value):"},{"line_number":114,"context_line":"        LOG.debug(\"FsBank: update_object. key: %s\", key)"},{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            if not isinstance(value, str):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_31b642f9","line":113,"range":{"start_line":113,"start_character":28,"end_line":113,"end_character":31},"updated":"2017-03-23 09:47:54.000000000","message":"IMO, this \"key\" should be not include path, just file name.\nlike update_object in swift_bank_plugin.","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"5e60d99feb2d9bb2af19b679c853d81696ee3bdd","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def get_owner_id(self):"},{"line_number":111,"context_line":"        return self.owner_id"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def update_object(self, key, value):"},{"line_number":114,"context_line":"        LOG.debug(\"FsBank: update_object. key: %s\", key)"},{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            if not isinstance(value, str):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_5738fdd1","line":113,"range":{"start_line":113,"start_character":28,"end_line":113,"end_character":31},"in_reply_to":"1a1ced50_31b642f9","updated":"2017-03-24 09:27:56.000000000","message":"No, the key parameter in update_object interface of swift_bank_plugin also include patch. You can see the log below: \nwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/index.json\nSwiftBank: update_object. value: {u\u0027status\u0027: u\u0027protecting\u0027, u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, \u0027resource_graph\u0027: \u0027[{\"0x0\": [\"OS::Cinder::Volume\", \"f63bb1b3-8505-4017-b717-4bb505ab1f7f\", \"testsinglevolume\"]}, []]\u0027, u\u0027timestamp\u0027: 1487844161, u\u0027created_at\u0027: u\u00272017-02-23\u0027, u\u0027id\u0027: u\u002743be3f85-f13b-4e6a-979f-d930f4f61dfd\u0027, u\u0027version\u0027: u\u00270.9\u0027, u\u0027extra-info\u0027: None, u\u0027project_id\u0027: u\u00270a9fc5d2238042bd8b21f63a88cb4d72\u0027, u\u0027protection_plan\u0027: {u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, u\u0027id\u0027: u\u0027e665f91d-bc38-414d-a029-b99a22562875\u0027, u\u0027resources\u0027: [{u\u0027type\u0027: u\u0027OS::Cinder::Volume\u0027, u\u0027id\u0027: u\u0027f63bb1b3-8505-4017-b717-4bb505ab1f7f\u0027, u\u0027name\u0027: u\u0027testsinglevolume\u0027}], u\u0027name\u0027: u\u0027OS Volume protection plan8888.\u0027}, u\u0027owner_id\u0027: u\u002785f77bd4-01c2-4128-b19b-022929485c30\u0027}\nSwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/index.json\nSwiftBank: update_object. value: {u\u0027status\u0027: \u0027protecting\u0027, u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, \u0027resource_graph\u0027: \u0027[{\"0x0\": [\"OS::Cinder::Volume\", \"f63bb1b3-8505-4017-b717-4bb505ab1f7f\", \"testsinglevolume\"]}, []]\u0027, u\u0027timestamp\u0027: 1487844161, u\u0027created_at\u0027: u\u00272017-02-23\u0027, u\u0027id\u0027: u\u002743be3f85-f13b-4e6a-979f-d930f4f61dfd\u0027, u\u0027version\u0027: u\u00270.9\u0027, u\u0027extra-info\u0027: None, u\u0027project_id\u0027: u\u00270a9fc5d2238042bd8b21f63a88cb4d72\u0027, u\u0027protection_plan\u0027: {u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, u\u0027id\u0027: u\u0027e665f91d-bc38-414d-a029-b99a22562875\u0027, u\u0027resources\u0027: [{u\u0027type\u0027: u\u0027OS::Cinder::Volume\u0027, u\u0027id\u0027: u\u0027f63bb1b3-8505-4017-b717-4bb505ab1f7f\u0027, u\u0027name\u0027: u\u0027testsinglevolume\u0027}], u\u0027name\u0027: u\u0027OS Volume protection plan8888.\u0027}, u\u0027owner_id\u0027: u\u002785f77bd4-01c2-4128-b19b-022929485c30\u0027}\nSwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/resource-data/f63bb1b3-8505-4017-b717-4bb505ab1f7f/status\nSwiftBank: update_object. value: protecting\nSwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/resource-data/f63bb1b3-8505-4017-b717-4bb505ab1f7f/status\nSwiftBank: update_object. value: protecting\nSwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/resource-data/f63bb1b3-8505-4017-b717-4bb505ab1f7f/metadata\nSwiftBank: update_object. value: {\u0027backup_id\u0027: u\u00270a67b0bf-4ec0-42cc-bc1a-7e48684793f7\u0027, \u0027volume_id\u0027: u\u0027f63bb1b3-8505-4017-b717-4bb505ab1f7f\u0027}\nSwiftBank: update_object. key: /checkpoints/43be3f85-f13b-4e6a-979f-d930f4f61dfd/index.json\nSwiftBank: update_object. value: {u\u0027status\u0027: \u0027available\u0027, u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, \u0027resource_graph\u0027: \u0027[{\"0x0\": [\"OS::Cinder::Volume\", \"f63bb1b3-8505-4017-b717-4bb505ab1f7f\", \"testsinglevolume\"]}, []]\u0027, u\u0027timestamp\u0027: 1487844161, u\u0027created_at\u0027: u\u00272017-02-23\u0027, u\u0027id\u0027: u\u002743be3f85-f13b-4e6a-979f-d930f4f61dfd\u0027, u\u0027version\u0027: u\u00270.9\u0027, u\u0027extra-info\u0027: None, u\u0027project_id\u0027: u\u00270a9fc5d2238042bd8b21f63a88cb4d72\u0027, u\u0027protection_plan\u0027: {u\u0027provider_id\u0027: u\u0027cf56bd3e-97a7-4078-b6d5-f36246333fd9\u0027, u\u0027id\u0027: u\u0027e665f91d-bc38-414d-a029-b99a22562875\u0027, u\u0027resources\u0027: [{u\u0027type\u0027: u\u0027OS::Cinder::Volume\u0027, u\u0027id\u0027: u\u0027f63bb1b3-8505-4017-b717-4bb505ab1f7f\u0027, u\u0027name\u0027: u\u0027testsinglevolume\u0027}], u\u0027name\u0027: u\u0027OS Volume protection plan8888.\u0027}, u\u0027owner_id\u0027: u\u002785f77bd4-01c2-4128-b19b-022929485c30\u0027}","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19f994c1f9ba03ebac451e0a12ae3188a40c205f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            if not isinstance(value, str):"},{"line_number":117,"context_line":"                value \u003d jsonutils.dumps(value)"},{"line_number":118,"context_line":"            self._write_object(path\u003dkey,"},{"line_number":119,"context_line":"                               data\u003dvalue)"},{"line_number":120,"context_line":"        except OSError as err:"},{"line_number":121,"context_line":"            LOG.error(\"Update object failed, err: %s.\", err)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_31000266","line":118,"range":{"start_line":118,"start_character":31,"end_line":118,"end_character":36},"updated":"2017-03-23 09:47:54.000000000","message":"the \"path\" should be combined.","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"5e60d99feb2d9bb2af19b679c853d81696ee3bdd","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            if not isinstance(value, str):"},{"line_number":117,"context_line":"                value \u003d jsonutils.dumps(value)"},{"line_number":118,"context_line":"            self._write_object(path\u003dkey,"},{"line_number":119,"context_line":"                               data\u003dvalue)"},{"line_number":120,"context_line":"        except OSError as err:"},{"line_number":121,"context_line":"            LOG.error(\"Update object failed, err: %s.\", err)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_373579db","line":118,"range":{"start_line":118,"start_character":31,"end_line":118,"end_character":36},"in_reply_to":"1a1ced50_31000266","updated":"2017-03-24 09:27:56.000000000","message":"ditto","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"459aa536e3aa54b19591da3e3163c2d26b243584","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _get_object(self, path):"},{"line_number":84,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":85,"context_line":"        try:"},{"line_number":86,"context_line":"            with open(obj_file_name, mode\u003d\u0027r\u0027) as obj_file:"},{"line_number":87,"context_line":"                data \u003d obj_file.read()"},{"line_number":88,"context_line":"                return data"},{"line_number":89,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":18,"id":"dfeb2761_9421c3fe","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":46},"updated":"2017-04-01 08:04:16.000000000","message":"Please, think about reading binary data.","commit_id":"703732e98a32451eab4ee9bdce0a62fb5970f7f9"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"459aa536e3aa54b19591da3e3163c2d26b243584","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":145,"context_line":"            except ValueError:"},{"line_number":146,"context_line":"                return data"},{"line_number":147,"context_line":"        return data"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def list_objects(self, prefix\u003dNone, limit\u003dNone, marker\u003dNone,"}],"source_content_type":"text/x-python","patch_set":18,"id":"dfeb2761_9448a3cc","line":146,"range":{"start_line":146,"start_character":16,"end_line":146,"end_character":27},"updated":"2017-04-01 08:04:16.000000000","message":"s/return data/pass","commit_id":"703732e98a32451eab4ee9bdce0a62fb5970f7f9"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"6c6266a062bd2b806e843f412d03380af34da46e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":145,"context_line":"            except ValueError:"},{"line_number":146,"context_line":"                return data"},{"line_number":147,"context_line":"        return data"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def list_objects(self, prefix\u003dNone, limit\u003dNone, marker\u003dNone,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_f6949646","line":146,"range":{"start_line":146,"start_character":16,"end_line":146,"end_character":27},"in_reply_to":"dfeb2761_37d7994e","updated":"2017-04-17 10:11:44.000000000","message":"Here data is a string, but we can not make sure that this string is can be loaded. If it can not be loaded, the string itself should be returned.","commit_id":"703732e98a32451eab4ee9bdce0a62fb5970f7f9"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"6dd2c25f37130aef5274ea1c5104fba5d6f59277","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                data \u003d jsonutils.loads(data)"},{"line_number":145,"context_line":"            except ValueError:"},{"line_number":146,"context_line":"                return data"},{"line_number":147,"context_line":"        return data"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def list_objects(self, prefix\u003dNone, limit\u003dNone, marker\u003dNone,"}],"source_content_type":"text/x-python","patch_set":18,"id":"dfeb2761_37d7994e","line":146,"range":{"start_line":146,"start_character":16,"end_line":146,"end_character":27},"in_reply_to":"dfeb2761_9448a3cc","updated":"2017-04-01 08:41:51.000000000","message":"data \u003d jsonutils.loads(data) if isinstance(data, str) else data","commit_id":"703732e98a32451eab4ee9bdce0a62fb5970f7f9"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"eb27a1c8d44eb2a93d57069927de59cfb46b978f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            obj_path \u003d self.object_container_path + path.rsplit(\u0027/\u0027, 1)[0]"},{"line_number":75,"context_line":"            obj_file_name \u003d self.object_container_path + path"},{"line_number":76,"context_line":"            self._create_dir(obj_path)"},{"line_number":77,"context_line":"            with open(obj_file_name, mode\u003d\u0027w\u0027) as obj_file:"},{"line_number":78,"context_line":"                obj_file.write(data)"},{"line_number":79,"context_line":"        except (OSError, IOError):"},{"line_number":80,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7ffa3b31_47f5b982","line":77,"range":{"start_line":77,"start_character":17,"end_line":77,"end_character":46},"updated":"2017-04-18 08:52:14.000000000","message":"Again, if the \u0027data\u0027 is binary data, then it is fatal to open the file not by mode of \u0027wb\u0027. Maybe it is a potential way to add a parameter to specify the format of \u0027data\u0027. Protect plugin can know the format of data which will be saved in Bank.","commit_id":"ffbac80fb1d8c0765f930cd606802fb437d87005"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            original_umask \u003d None"},{"line_number":60,"context_line":"            try:"},{"line_number":61,"context_line":"                original_umask \u003d os.umask(0)"},{"line_number":62,"context_line":"                os.makedirs(path, mode\u003d0o777)"},{"line_number":63,"context_line":"            finally:"},{"line_number":64,"context_line":"                os.umask(original_umask)"},{"line_number":65,"context_line":"        except OSError as err:"},{"line_number":66,"context_line":"            if err.errno \u003d\u003d errno.EEXIST and os.path.isdir(path):"},{"line_number":67,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_dcaa0418","line":64,"range":{"start_line":61,"start_character":0,"end_line":64,"end_character":40},"updated":"2017-04-23 07:34:29.000000000","message":"Why create a world-readable and writable dir?\nThe directory should be have 600 mode, and owned by the appropriate user.","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            original_umask \u003d None"},{"line_number":60,"context_line":"            try:"},{"line_number":61,"context_line":"                original_umask \u003d os.umask(0)"},{"line_number":62,"context_line":"                os.makedirs(path, mode\u003d0o777)"},{"line_number":63,"context_line":"            finally:"},{"line_number":64,"context_line":"                os.umask(original_umask)"},{"line_number":65,"context_line":"        except OSError as err:"},{"line_number":66,"context_line":"            if err.errno \u003d\u003d errno.EEXIST and os.path.isdir(path):"},{"line_number":67,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_483dfcb9","line":64,"range":{"start_line":61,"start_character":0,"end_line":64,"end_character":40},"in_reply_to":"5ff73747_dcaa0418","updated":"2017-05-02 08:37:21.000000000","message":"The mode 600 seem reasonable","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            with open(obj_file_name, mode\u003dmode) as obj_file:"},{"line_number":82,"context_line":"                obj_file.write(data)"},{"line_number":83,"context_line":"        except (OSError, IOError):"},{"line_number":84,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_dc58c457","line":84,"range":{"start_line":84,"start_character":54,"end_line":84,"end_character":56},"updated":"2017-04-23 07:34:29.000000000","message":"missing space. Same in all other log messages","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            with open(obj_file_name, mode\u003dmode) as obj_file:"},{"line_number":82,"context_line":"                obj_file.write(data)"},{"line_number":83,"context_line":"        except (OSError, IOError):"},{"line_number":84,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_bc55f81f","line":84,"range":{"start_line":84,"start_character":57,"end_line":84,"end_character":58},"updated":"2017-04-23 07:34:29.000000000","message":"redundant period. Same in all other log messages","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            with open(obj_file_name, mode\u003dmode) as obj_file:"},{"line_number":82,"context_line":"                obj_file.write(data)"},{"line_number":83,"context_line":"        except (OSError, IOError):"},{"line_number":84,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_object(self, path):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_542dbb92","line":84,"range":{"start_line":84,"start_character":54,"end_line":84,"end_character":56},"in_reply_to":"5ff73747_dc58c457","updated":"2017-05-02 08:37:21.000000000","message":"Done","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_object(self, path):"},{"line_number":88,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            with open(obj_file_name, mode\u003d\u0027r\u0027) as obj_file:"},{"line_number":91,"context_line":"                data \u003d obj_file.read()"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_5c3a74e7","line":88,"range":{"start_line":87,"start_character":0,"end_line":88,"end_character":57},"updated":"2017-04-23 07:34:29.000000000","message":"need to check that the file you are opening is actually a file and not a dir","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            LOG.exception(_(\"Write object failed. name:%s.\"), obj_file_name)"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_object(self, path):"},{"line_number":88,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            with open(obj_file_name, mode\u003d\u0027r\u0027) as obj_file:"},{"line_number":91,"context_line":"                data \u003d obj_file.read()"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_197f6c66","line":88,"range":{"start_line":87,"start_character":0,"end_line":88,"end_character":57},"in_reply_to":"5ff73747_5c3a74e7","updated":"2017-05-02 08:37:21.000000000","message":"Done","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def _get_object(self, path):"},{"line_number":88,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            with open(obj_file_name, mode\u003d\u0027r\u0027) as obj_file:"},{"line_number":91,"context_line":"                data \u003d obj_file.read()"},{"line_number":92,"context_line":"                return data"},{"line_number":93,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_9c30fc09","line":90,"range":{"start_line":90,"start_character":42,"end_line":90,"end_character":45},"updated":"2017-04-23 07:34:29.000000000","message":"should be \u0027rb\u0027","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def _delete_object(self, path):"},{"line_number":98,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            os.remove(obj_file_name)"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            LOG.exception(_(\"Delete the object failed. name:%s\"),"},{"line_number":103,"context_line":"                          obj_file_name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_3c3fa8d7","line":100,"range":{"start_line":100,"start_character":0,"end_line":100,"end_character":36},"updated":"2017-04-23 07:34:29.000000000","message":"if parent dir is empty, remove it","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def _delete_object(self, path):"},{"line_number":98,"context_line":"        obj_file_name \u003d self.object_container_path + path"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            os.remove(obj_file_name)"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            LOG.exception(_(\"Delete the object failed. name:%s\"),"},{"line_number":103,"context_line":"                          obj_file_name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_b41abf6b","line":100,"range":{"start_line":100,"start_character":0,"end_line":100,"end_character":36},"in_reply_to":"5ff73747_3c3fa8d7","updated":"2017-05-02 08:37:21.000000000","message":"Done","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                          obj_file_name)"},{"line_number":104,"context_line":"            raise"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _list_object(self, path):"},{"line_number":107,"context_line":"        obj_file_path \u003d self.object_container_path + path"},{"line_number":108,"context_line":"        try:"},{"line_number":109,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":110,"context_line":"        except OSError:"},{"line_number":111,"context_line":"            LOG.exception(_(\"List the object failed. path:%s\"), obj_file_path)"},{"line_number":112,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_fc2020b3","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":44},"updated":"2017-04-23 07:34:29.000000000","message":"what if the prefix is not a dir, just a prefix?\nsee below","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                          obj_file_name)"},{"line_number":104,"context_line":"            raise"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _list_object(self, path):"},{"line_number":107,"context_line":"        obj_file_path \u003d self.object_container_path + path"},{"line_number":108,"context_line":"        try:"},{"line_number":109,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":110,"context_line":"        except OSError:"},{"line_number":111,"context_line":"            LOG.exception(_(\"List the object failed. path:%s\"), obj_file_path)"},{"line_number":112,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_f49967c3","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":44},"in_reply_to":"5ff73747_fc2020b3","updated":"2017-05-02 08:37:21.000000000","message":"see below","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"707ed9cc30e4426010fa422b7cfd768516f09c6d","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                     sort_dir\u003dNone):"},{"line_number":155,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            file_lists \u003d self._list_object(prefix)"},{"line_number":158,"context_line":"            return ("},{"line_number":159,"context_line":"                file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":160,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_1c24ecc5","line":157,"range":{"start_line":157,"start_character":0,"end_line":157,"end_character":50},"updated":"2017-04-23 07:34:29.000000000","message":"what if the prefix is not a dir, just a prefix?","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"bad530379b1b845260e99560a5003da5b0502ee8","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                     sort_dir\u003dNone):"},{"line_number":155,"context_line":"        LOG.debug(\"FsBank: list_objects. key: %s\", prefix)"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            file_lists \u003d self._list_object(prefix)"},{"line_number":158,"context_line":"            return ("},{"line_number":159,"context_line":"                file_lists[-limit:] if limit is not None else file_lists)"},{"line_number":160,"context_line":"        except OSError as err:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5ff73747_147f3366","line":157,"range":{"start_line":157,"start_character":0,"end_line":157,"end_character":50},"in_reply_to":"5ff73747_1c24ecc5","updated":"2017-05-02 08:37:21.000000000","message":"As we know, now the prefix parameter of bank\u0027s list_objects in checkpoint module is a actual a directory for swift bank. So if the prefix(not a directory) will be used in checkpoint module, we need think over it. So I will add a check about this parameter.","commit_id":"b165968b62797d8e2fa160c47afaa4d02076668a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"8676ca0e61c4ff5bdadc07503d5b817deb7778dc","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                          obj_file_path)"},{"line_number":118,"context_line":"            raise"},{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            return os.listdir(obj_file_path)"},{"line_number":121,"context_line":"        except OSError:"},{"line_number":122,"context_line":"            LOG.exception(_(\"List the object failed. path: %s\"), obj_file_path)"},{"line_number":123,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":27,"id":"df140735_d42b882d","line":120,"range":{"start_line":120,"start_character":0,"end_line":120,"end_character":44},"updated":"2017-06-01 11:34:30.000000000","message":"maybe be something like:\n  base_dir \u003d os.path.dirname(path)\n  base_name \u003d os.path.basename(path)\n  return (\n    base_dir + \u0027/\u0027 + file\n    for file in os.listdir(obj_file_path)\n    if file.beginswith(base_name)\n  )","commit_id":"53afde1e41712668874a5cbe0990c479755c5fff"}],"karbor/services/protection/checkpoint.py":[{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"72312b93136e2d924cf8fd1b01eb0dab3d3f73ea","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def reload_meta_data(self):"},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            new_md \u003d self._checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":123,"context_line":"            if type(new_md) is not dict:"},{"line_number":124,"context_line":"                new_md \u003d jsonutils.loads(new_md)"},{"line_number":125,"context_line":"        except exception.BankGetObjectFailed:"},{"line_number":126,"context_line":"            LOG.error(\"unable to reload metadata for checkpoint id: %s\","}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_d28df1d3","line":123,"range":{"start_line":123,"start_character":15,"end_line":123,"end_character":39},"updated":"2017-03-23 09:14:10.000000000","message":"not isinstance(new_md, dict)","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"0785d9fa154f5fe07be589f58553ed5a5f9b7b6c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def reload_meta_data(self):"},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            new_md \u003d self._checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":123,"context_line":"            if type(new_md) is not dict:"},{"line_number":124,"context_line":"                new_md \u003d jsonutils.loads(new_md)"},{"line_number":125,"context_line":"        except exception.BankGetObjectFailed:"},{"line_number":126,"context_line":"            LOG.error(\"unable to reload metadata for checkpoint id: %s\","}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_1747154e","line":123,"range":{"start_line":123,"start_character":15,"end_line":123,"end_character":39},"in_reply_to":"1a1ced50_d28df1d3","updated":"2017-03-24 09:28:22.000000000","message":"Done","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"72312b93136e2d924cf8fd1b01eb0dab3d3f73ea","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            checkpoint_section \u003d self._checkpoints_section.get_sub_section("},{"line_number":265,"context_line":"                marker)"},{"line_number":266,"context_line":"            marker_checkpoint \u003d checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":267,"context_line":"            if type(marker_checkpoint) is not dict:"},{"line_number":268,"context_line":"                marker_checkpoint \u003d jsonutils.loads(marker_checkpoint)"},{"line_number":269,"context_line":"            timestamp \u003d marker_checkpoint[\"timestamp\"]"},{"line_number":270,"context_line":"            marker \u003d \"%s@%s\" % (timestamp, marker)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_52b82175","line":267,"range":{"start_line":267,"start_character":15,"end_line":267,"end_character":50},"updated":"2017-03-23 09:14:10.000000000","message":"ditto","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"0785d9fa154f5fe07be589f58553ed5a5f9b7b6c","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            checkpoint_section \u003d self._checkpoints_section.get_sub_section("},{"line_number":265,"context_line":"                marker)"},{"line_number":266,"context_line":"            marker_checkpoint \u003d checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":267,"context_line":"            if type(marker_checkpoint) is not dict:"},{"line_number":268,"context_line":"                marker_checkpoint \u003d jsonutils.loads(marker_checkpoint)"},{"line_number":269,"context_line":"            timestamp \u003d marker_checkpoint[\"timestamp\"]"},{"line_number":270,"context_line":"            marker \u003d \"%s@%s\" % (timestamp, marker)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_f775d199","line":267,"range":{"start_line":267,"start_character":15,"end_line":267,"end_character":50},"in_reply_to":"1a1ced50_52b82175","updated":"2017-03-24 09:28:22.000000000","message":"Done","commit_id":"52bffad1fd92b998c8a63f6acea22e058c9c82b9"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"db693f4a3e15008c4bc6a7b0586eedf5d3b4fbe9","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def reload_meta_data(self):"},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            new_md \u003d self._checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":123,"context_line":"            if not isinstance(new_md, dict):"},{"line_number":124,"context_line":"                new_md \u003d jsonutils.loads(new_md)"},{"line_number":125,"context_line":"        except exception.BankGetObjectFailed:"},{"line_number":126,"context_line":"            LOG.error(\"unable to reload metadata for checkpoint id: %s\","},{"line_number":127,"context_line":"                      self.id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffe62b97_3b122663","line":124,"range":{"start_line":122,"start_character":0,"end_line":124,"end_character":48},"updated":"2017-03-30 03:41:09.000000000","message":"IMO, the name of interface \u0027get_object\u0027 means the returned value should be object, which means it is not appropriate to transform the returned value here. If so, it is no need to update other several files, such as image_protection_plugin.py","commit_id":"4c20461a2b2032ac829917b6cb3872a101f9fad0"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"7a95ccade60a1c325371e896bfba3b6bca72115e","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def reload_meta_data(self):"},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            new_md \u003d self._checkpoint_section.get_object(_INDEX_FILE_NAME)"},{"line_number":123,"context_line":"            if not isinstance(new_md, dict):"},{"line_number":124,"context_line":"                new_md \u003d jsonutils.loads(new_md)"},{"line_number":125,"context_line":"        except exception.BankGetObjectFailed:"},{"line_number":126,"context_line":"            LOG.error(\"unable to reload metadata for checkpoint id: %s\","},{"line_number":127,"context_line":"                      self.id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffe62b97_c429fcf2","line":124,"range":{"start_line":122,"start_character":0,"end_line":124,"end_character":48},"in_reply_to":"ffe62b97_3b122663","updated":"2017-03-30 15:29:14.000000000","message":"The object here is different with the object in image_protection_plugin module.\nHere the obejct with a dict value is /checkpoints/66375068-2bec-4d79-9a10-6ca790f3497c/index.json.\nBut the object with a dict value in image_protection_plugin.py is /checkpoints/66375068-2bec-4d79-9a10-6ca790f3497c/resource-data/f63bb1b3-8505-4017-b717-4bb505ab1f7f/metadata.","commit_id":"4c20461a2b2032ac829917b6cb3872a101f9fad0"}],"karbor/tests/unit/protection/test_file_system_bank_plugin.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"920de1b3d6a5090dc4299491f1e5710ce65a65ae","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.fs_bank_plugin.update_object(\"/list/key-2\", \"value-2\")"},{"line_number":55,"context_line":"        objects \u003d self.fs_bank_plugin.list_objects(prefix\u003d\"/list\")"},{"line_number":56,"context_line":"        self.assertEqual(len(objects), 2)"},{"line_number":57,"context_line":"        value1 \u003d self.fs_bank_plugin.get_object(\"/list/\"+objects[0])"},{"line_number":58,"context_line":"        value2 \u003d self.fs_bank_plugin.get_object(\"/list/\"+objects[1])"},{"line_number":59,"context_line":"        self.assertEqual(True, value1 in (\"value-1\", \"value-2\"))"},{"line_number":60,"context_line":"        self.assertEqual(True, value2 in (\"value-1\", \"value-2\"))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_update_object(self):"},{"line_number":63,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-1\")"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_e6e33533","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":64},"updated":"2017-06-04 10:41:00.000000000","message":"Should be something like:\nself.assertIn(\u0027key-1\u0027, objects)\nself.assertIn(\u0027key-2\u0027, objects)","commit_id":"932163eed2da76d0f1e471afc72b77792842ae72"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"1b5912fde7725986dc32418615f69de08527baf7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.fs_bank_plugin.update_object(\"/list/key-2\", \"value-2\")"},{"line_number":55,"context_line":"        objects \u003d self.fs_bank_plugin.list_objects(prefix\u003d\"/list\")"},{"line_number":56,"context_line":"        self.assertEqual(len(objects), 2)"},{"line_number":57,"context_line":"        value1 \u003d self.fs_bank_plugin.get_object(\"/list/\"+objects[0])"},{"line_number":58,"context_line":"        value2 \u003d self.fs_bank_plugin.get_object(\"/list/\"+objects[1])"},{"line_number":59,"context_line":"        self.assertEqual(True, value1 in (\"value-1\", \"value-2\"))"},{"line_number":60,"context_line":"        self.assertEqual(True, value2 in (\"value-1\", \"value-2\"))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_update_object(self):"},{"line_number":63,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-1\")"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_1a1af9ca","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":64},"in_reply_to":"df140735_e6e33533","updated":"2017-06-05 01:55:33.000000000","message":"Done","commit_id":"932163eed2da76d0f1e471afc72b77792842ae72"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"920de1b3d6a5090dc4299491f1e5710ce65a65ae","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-1\")"},{"line_number":64,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-2\")"},{"line_number":65,"context_line":"        object_file \u003d ("},{"line_number":66,"context_line":"            self.fs_bank_plugin.object_container_path+\"/key-1\")"},{"line_number":67,"context_line":"        with open(object_file, \"r\") as f:"},{"line_number":68,"context_line":"            contents \u003d f.read()"},{"line_number":69,"context_line":"        self.assertEqual(contents, \"value-2\")"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_66c965aa","line":66,"range":{"start_line":66,"start_character":52,"end_line":66,"end_character":55},"updated":"2017-06-04 10:41:00.000000000","message":"nit: in all the patch, surround binary operators with spaces:\nhttps://www.python.org/dev/peps/pep-0008/#other-recommendations","commit_id":"932163eed2da76d0f1e471afc72b77792842ae72"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"1b5912fde7725986dc32418615f69de08527baf7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-1\")"},{"line_number":64,"context_line":"        self.fs_bank_plugin.update_object(\"/key-1\", \"value-2\")"},{"line_number":65,"context_line":"        object_file \u003d ("},{"line_number":66,"context_line":"            self.fs_bank_plugin.object_container_path+\"/key-1\")"},{"line_number":67,"context_line":"        with open(object_file, \"r\") as f:"},{"line_number":68,"context_line":"            contents \u003d f.read()"},{"line_number":69,"context_line":"        self.assertEqual(contents, \"value-2\")"}],"source_content_type":"text/x-python","patch_set":29,"id":"df140735_da0fe185","line":66,"range":{"start_line":66,"start_character":52,"end_line":66,"end_character":55},"in_reply_to":"df140735_66c965aa","updated":"2017-06-05 01:55:33.000000000","message":"Done","commit_id":"932163eed2da76d0f1e471afc72b77792842ae72"}]}
