)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"6bc4539a9762a6a49c4d3894faf4a1b25bc19369","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Virtuozzo containers can work only with formatted disks."},{"line_number":10,"context_line":"Block device must have GPT table and one partition."},{"line_number":11,"context_line":"If we have \u0027ploop_init\u0027 metadata key that we initialize new LVM volume"},{"line_number":12,"context_line":"via \u0027ploop initdev\u0027. As result this tool creates one partition and"},{"line_number":13,"context_line":"formats it as ext4 filesystem. But after this operation there is a"},{"line_number":14,"context_line":"link to a new partition in /dev/mapper/. We should delete"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ac06dbe_b77e59ac","line":11,"range":{"start_line":11,"start_character":60,"end_line":11,"end_character":70},"updated":"2016-08-19 16:27:13.000000000","message":"how to deal with another volume backends?","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5f9c9848f16f8d0962ed68b3ab52fb48ae9abbfe","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Virtuozzo containers can work only with formatted disks."},{"line_number":10,"context_line":"Block device must have GPT table and one partition."},{"line_number":11,"context_line":"If we have \u0027ploop_init\u0027 metadata key that we initialize new LVM volume"},{"line_number":12,"context_line":"via \u0027ploop initdev\u0027. As result this tool creates one partition and"},{"line_number":13,"context_line":"formats it as ext4 filesystem. But after this operation there is a"},{"line_number":14,"context_line":"link to a new partition in /dev/mapper/. We should delete"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ac06dbe_e99b9ac7","line":11,"range":{"start_line":11,"start_character":60,"end_line":11,"end_character":70},"in_reply_to":"1ac06dbe_b77e59ac","updated":"2016-08-22 08:56:52.000000000","message":"We\u0027ll check it in the future. Now it\u0027s important to fix LVM.\nalso ploop can work only with block devices.","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"}],"cinder/volume/drivers/lvm.py":[{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"6bc4539a9762a6a49c4d3894faf4a1b25bc19369","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":365,"context_line":"            raise exception.VolumePloopInitException(vol_path\u003dvolume_path,"},{"line_number":366,"context_line":"                                                     reason\u003dexc.stderr)"},{"line_number":367,"context_line":"        finally:"},{"line_number":368,"context_line":"            partitions \u003d self._get_partitions(volume_path)"},{"line_number":369,"context_line":"            if partitions is not None:"},{"line_number":370,"context_line":"                dev_base \u003d os.path.dirname(volume_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_f799f120","line":367,"range":{"start_line":367,"start_character":8,"end_line":367,"end_character":15},"updated":"2016-08-19 16:27:13.000000000","message":"can we handle this case in `ploop initdev` as well?","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5f9c9848f16f8d0962ed68b3ab52fb48ae9abbfe","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":365,"context_line":"            raise exception.VolumePloopInitException(vol_path\u003dvolume_path,"},{"line_number":366,"context_line":"                                                     reason\u003dexc.stderr)"},{"line_number":367,"context_line":"        finally:"},{"line_number":368,"context_line":"            partitions \u003d self._get_partitions(volume_path)"},{"line_number":369,"context_line":"            if partitions is not None:"},{"line_number":370,"context_line":"                dev_base \u003d os.path.dirname(volume_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_9fa054a1","line":367,"range":{"start_line":367,"start_character":8,"end_line":367,"end_character":15},"in_reply_to":"1ac06dbe_f799f120","updated":"2016-08-22 08:56:52.000000000","message":"I think no. We need to remove partition from devmapper only if it\u0027s based on LVM volume. Ploop can initialize any block device. For example for real block device there is no link in devmapper and dmsetup gives an error for that partition. I think it\u0027s not good to create partiton in ploop then check type of device and delete link only for dm-*. We need it only in cinder with LVM backend, because it\u0027s not possible to delete volume if there is a link for its partition in devmapper.","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"},{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"6bc4539a9762a6a49c4d3894faf4a1b25bc19369","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                            self._sizestr(volume[\u0027size\u0027]),"},{"line_number":387,"context_line":"                            self.configuration.lvm_type,"},{"line_number":388,"context_line":"                            mirror_count)"},{"line_number":389,"context_line":"        if (\u0027ploop_init\u0027 in volume.metadata and"},{"line_number":390,"context_line":"                volume.metadata[\u0027ploop_init\u0027] \u003d\u003d \u0027yes\u0027):"},{"line_number":391,"context_line":"            self._ploop_init_vol(self.local_path(volume))"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_37870911","line":389,"updated":"2016-08-19 16:27:13.000000000","message":"if (volume.metadata.get(\u0027ploop_init\u0027) \u003d\u003d \u0027yes\u0027)\nbut I\u0027d prefer \u0027true\u0027","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5f9c9848f16f8d0962ed68b3ab52fb48ae9abbfe","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                            self._sizestr(volume[\u0027size\u0027]),"},{"line_number":387,"context_line":"                            self.configuration.lvm_type,"},{"line_number":388,"context_line":"                            mirror_count)"},{"line_number":389,"context_line":"        if (\u0027ploop_init\u0027 in volume.metadata and"},{"line_number":390,"context_line":"                volume.metadata[\u0027ploop_init\u0027] \u003d\u003d \u0027yes\u0027):"},{"line_number":391,"context_line":"            self._ploop_init_vol(self.local_path(volume))"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_296f72c6","line":389,"in_reply_to":"1ac06dbe_37870911","updated":"2016-08-22 08:56:52.000000000","message":"I agree. Fix in the next version","commit_id":"9ec7920a54cad5350c13092dc638d87735c0db53"},{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"b86de0a4d3b5ff29442076a819415929d6925247","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        if partitions is None:"},{"line_number":363,"context_line":"            return"},{"line_number":364,"context_line":"        dev_base \u003d os.path.dirname(volume_path)"},{"line_number":365,"context_line":"        partitions.reverse()"},{"line_number":366,"context_line":"        for i in partitions:"},{"line_number":367,"context_line":"            if i \u003d\u003d \u0027\u0027:"},{"line_number":368,"context_line":"                continue"},{"line_number":369,"context_line":"        partition_path \u003d os.path.join(dev_base, i)"},{"line_number":370,"context_line":"        self._execute(\u0027dmsetup\u0027, \u0027remove\u0027, partition_path,"},{"line_number":371,"context_line":"                      run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a89bdaa_9c5162db","line":368,"range":{"start_line":365,"start_character":0,"end_line":368,"end_character":24},"updated":"2016-09-06 11:17:42.000000000","message":"this looks a bit odd. can you please explain why you do this?\nas I understood your code you may do just:\n\nfor part in partitions:\n  partition_path \u003d os.path.join(dev_base, part)\n  self._execute(\u0027dmsetup\u0027, \u0027remove\u0027, partition_path,\n                run_as_root\u003dTrue)","commit_id":"70e27216aeed15813f1195d47dd7cf9e6efe90ca"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"f4d44b154f22c397be2cf591d5a76037c8e65b6e","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        if partitions is None:"},{"line_number":363,"context_line":"            return"},{"line_number":364,"context_line":"        dev_base \u003d os.path.dirname(volume_path)"},{"line_number":365,"context_line":"        partitions.reverse()"},{"line_number":366,"context_line":"        for i in partitions:"},{"line_number":367,"context_line":"            if i \u003d\u003d \u0027\u0027:"},{"line_number":368,"context_line":"                continue"},{"line_number":369,"context_line":"        partition_path \u003d os.path.join(dev_base, i)"},{"line_number":370,"context_line":"        self._execute(\u0027dmsetup\u0027, \u0027remove\u0027, partition_path,"},{"line_number":371,"context_line":"                      run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a89bdaa_ff5a564f","line":368,"range":{"start_line":365,"start_character":0,"end_line":368,"end_character":24},"in_reply_to":"9a89bdaa_133700e4","updated":"2016-09-06 14:10:00.000000000","message":"I found a bug. Incorrect indentations.\nI\u0027ll send a new version.\nThanks!","commit_id":"70e27216aeed15813f1195d47dd7cf9e6efe90ca"},{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"5c7b4a82a5cbd7c0ab57b7aa0eb2d67f3034d21b","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        if partitions is None:"},{"line_number":363,"context_line":"            return"},{"line_number":364,"context_line":"        dev_base \u003d os.path.dirname(volume_path)"},{"line_number":365,"context_line":"        partitions.reverse()"},{"line_number":366,"context_line":"        for i in partitions:"},{"line_number":367,"context_line":"            if i \u003d\u003d \u0027\u0027:"},{"line_number":368,"context_line":"                continue"},{"line_number":369,"context_line":"        partition_path \u003d os.path.join(dev_base, i)"},{"line_number":370,"context_line":"        self._execute(\u0027dmsetup\u0027, \u0027remove\u0027, partition_path,"},{"line_number":371,"context_line":"                      run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a89bdaa_133700e4","line":368,"range":{"start_line":365,"start_character":0,"end_line":368,"end_character":24},"in_reply_to":"9a89bdaa_17f7edf5","updated":"2016-09-06 11:40:58.000000000","message":"So you delete only last partition, correct?\nBTW, I don\u0027t see any blank lines in lsblk output in both ubuntu and centos. But if you insist, it makes sense to move this code into _get_partitions().","commit_id":"70e27216aeed15813f1195d47dd7cf9e6efe90ca"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"6548d4b9d9a149fb4089a4d4e7ce492dd329ec48","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        if partitions is None:"},{"line_number":363,"context_line":"            return"},{"line_number":364,"context_line":"        dev_base \u003d os.path.dirname(volume_path)"},{"line_number":365,"context_line":"        partitions.reverse()"},{"line_number":366,"context_line":"        for i in partitions:"},{"line_number":367,"context_line":"            if i \u003d\u003d \u0027\u0027:"},{"line_number":368,"context_line":"                continue"},{"line_number":369,"context_line":"        partition_path \u003d os.path.join(dev_base, i)"},{"line_number":370,"context_line":"        self._execute(\u0027dmsetup\u0027, \u0027remove\u0027, partition_path,"},{"line_number":371,"context_line":"                      run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a89bdaa_17f7edf5","line":368,"range":{"start_line":365,"start_character":0,"end_line":368,"end_character":24},"in_reply_to":"9a89bdaa_9c5162db","updated":"2016-09-06 11:28:44.000000000","message":"\"partitions\" variable may contain list like:\npart1\npart2\npart21\npart22\npart3\n\nSo we should delete partitions from the last element, that\u0027s why I reverse this list.\nAnd also we should skip empty lines which present in lsblk output","commit_id":"70e27216aeed15813f1195d47dd7cf9e6efe90ca"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8574d7608ea76eabf56ced5d466b5af6aaa79227","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            # Enable sparse copy since lvm_type is \u0027thin\u0027"},{"line_number":348,"context_line":"            self._sparse_copy_volume \u003d True"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _get_partitions(self, volume_path):"},{"line_number":351,"context_line":"        out, _ \u003d self._execute(\u0027lsblk\u0027, \u0027-l\u0027, \u0027-o\u0027, \u0027NAME\u0027,"},{"line_number":352,"context_line":"                               \u0027-n\u0027, volume_path,"},{"line_number":353,"context_line":"                               run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_812b1c94","line":350,"updated":"2016-09-19 12:56:30.000000000","message":"Please, cover new methods with unit tests","commit_id":"233f7709d3ab14b45957759edd52c0603501f0a2"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8574d7608ea76eabf56ced5d466b5af6aaa79227","unresolved":false,"context_lines":[{"line_number":353,"context_line":"                               run_as_root\u003dTrue)"},{"line_number":354,"context_line":"        lines \u003d out.split(\u0027\\n\u0027)"},{"line_number":355,"context_line":"        if len(lines) \u003c 2:"},{"line_number":356,"context_line":"            return None"},{"line_number":357,"context_line":"        lines.pop(0)"},{"line_number":358,"context_line":"        lines.reverse()"},{"line_number":359,"context_line":"        return lines"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_e1e6a0af","line":356,"updated":"2016-09-19 12:56:30.000000000","message":"nit: we can leave onle return here. None is a default return value for functions in python and could be omitted","commit_id":"233f7709d3ab14b45957759edd52c0603501f0a2"},{"author":{"_account_id":21284,"name":"Pavel Gluschak (scsnow)","email":"pglushchak@virtuozzo.com","username":"scsnow"},"change_message_id":"59a22d1c60af37685922b279705c4d05e4245e4f","unresolved":false,"context_lines":[{"line_number":353,"context_line":"                               run_as_root\u003dTrue)"},{"line_number":354,"context_line":"        lines \u003d out.split(\u0027\\n\u0027)"},{"line_number":355,"context_line":"        if len(lines) \u003c 2:"},{"line_number":356,"context_line":"            return None"},{"line_number":357,"context_line":"        lines.pop(0)"},{"line_number":358,"context_line":"        lines.reverse()"},{"line_number":359,"context_line":"        return lines"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_b880308d","line":356,"in_reply_to":"7a8ec9b2_e1e6a0af","updated":"2016-09-19 21:26:29.000000000","message":"Makes sense to return empty list here and eliminate None checking in _unmap_partitions()","commit_id":"233f7709d3ab14b45957759edd52c0603501f0a2"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8574d7608ea76eabf56ced5d466b5af6aaa79227","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                            self.configuration.lvm_type,"},{"line_number":390,"context_line":"                            mirror_count)"},{"line_number":391,"context_line":"        if (\u0027ploop_init\u0027 in volume.metadata and"},{"line_number":392,"context_line":"                volume.metadata[\u0027ploop_init\u0027].lower() \u003d\u003d \u0027true\u0027):"},{"line_number":393,"context_line":"            self._ploop_init_vol(self.local_path(volume))"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def update_migrated_volume(self, ctxt, volume, new_volume,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_c14d249b","line":392,"updated":"2016-09-19 12:56:30.000000000","message":"Please, use cinder.utils.get_bool_param here","commit_id":"233f7709d3ab14b45957759edd52c0603501f0a2"}]}
