)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7889404a27974807ce625ab62a3e37f211018d5a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"libvirt: ephemeral disk support for virtuozzo containers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"For virtuozzo containers we create ephemeral disk based on ploop format."},{"line_number":10,"context_line":"After we create ploop disk, we should add \u0027read \u0027permission for all users."},{"line_number":11,"context_line":"It\u0027s necessary because openstack user query info of this disk by qemu-img."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"3a461143_266d0a33","line":9,"range":{"start_line":9,"start_character":59,"end_line":9,"end_character":64},"updated":"2017-01-25 15:17:04.000000000","message":"dumbest image format name ever, regardless of its meaning :) (not that COW is any better)","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"}],"etc/nova/rootwrap.d/compute.filters":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e685609cda7ef087e3dbd43938d733303ae2ea5","unresolved":false,"context_lines":[{"line_number":253,"context_line":"prl_disk_tool: RegExpFilter, prl_disk_tool, root, prl_disk_tool, resize, --size, .*M$, --resize_partition, --hdd, .*"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"# nova/virt/libvirt/utils.py:"},{"line_number":256,"context_line":"ploop: RegExpFilter, ploop, root, ploop, init, -s, .*, -f, .*, -t, .*, .*"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"# nova/virt/libvirt/utils.py: \u0027xend\u0027, \u0027status\u0027"},{"line_number":259,"context_line":"xend: CommandFilter, xend, root"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"da4df55a_fc0afd24","line":256,"updated":"2016-12-28 22:00:31.000000000","message":"We should be using oslo.privsep for new stuff like this...","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"daafa76f8127c404ce38eafb3d2e0012d3d88c7a","unresolved":false,"context_lines":[{"line_number":10815,"context_line":"        mock_create_ploop.assert_called_once_with(\u0027expanded\u0027,"},{"line_number":10816,"context_line":"                                                  \u0027/dev/something\u0027,"},{"line_number":10817,"context_line":"                                                  \u002720G\u0027, \u0027fs_format\u0027)"},{"line_number":10818,"context_line":"        mock_create_ploop.reset_mock()"},{"line_number":10819,"context_line":"        drvr._create_ephemeral(\u0027/dev/something\u0027, 20, \u0027myVol\u0027, \u0027linux\u0027,"},{"line_number":10820,"context_line":"                               is_block_dev\u003dFalse, specified_fs\u003dNone,"},{"line_number":10821,"context_line":"                               vm_mode\u003dfields.VMMode.EXE)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_a34b812a","line":10818,"updated":"2017-01-13 17:07:47.000000000","message":"These are 3 different tests. Alternatively you could use ddt nicely here. See test_create_image_with_swap in this file for an example.","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"afd877dee56fa784b34b7c88dcc0b11fce63771c","unresolved":false,"context_lines":[{"line_number":10815,"context_line":"        mock_create_ploop.assert_called_once_with(\u0027expanded\u0027,"},{"line_number":10816,"context_line":"                                                  \u0027/dev/something\u0027,"},{"line_number":10817,"context_line":"                                                  \u002720G\u0027, \u0027fs_format\u0027)"},{"line_number":10818,"context_line":"        mock_create_ploop.reset_mock()"},{"line_number":10819,"context_line":"        drvr._create_ephemeral(\u0027/dev/something\u0027, 20, \u0027myVol\u0027, \u0027linux\u0027,"},{"line_number":10820,"context_line":"                               is_block_dev\u003dFalse, specified_fs\u003dNone,"},{"line_number":10821,"context_line":"                               vm_mode\u003dfields.VMMode.EXE)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_87457571","line":10818,"in_reply_to":"7a3c09a3_a34b812a","updated":"2017-01-16 13:17:14.000000000","message":"Done","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"d8b815998f457a6ff1b1f7fa253c30ac7583ae83","unresolved":false,"context_lines":[{"line_number":10889,"context_line":"            elif default_eph_format:"},{"line_number":10890,"context_line":"                expected_format \u003d default_eph_format"},{"line_number":10891,"context_line":"            else:"},{"line_number":10892,"context_line":"                expected_format \u003d disk_api.FS_FORMAT_EXT4"},{"line_number":10893,"context_line":"            mock_create_ploop.assert_called_once_with(\u0027expanded\u0027,"},{"line_number":10894,"context_line":"                                                      \u0027/dev/something\u0027,"},{"line_number":10895,"context_line":"                                                      \u002720G\u0027, expected_format)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a3c09a3_e23ee789","line":10892,"updated":"2017-01-17 14:36:48.000000000","message":"nit: I\u0027d have put expected_format in the input data.","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"76baa7e50c8f038f7b1c56a73c4ff5d04d536025","unresolved":false,"context_lines":[{"line_number":10889,"context_line":"            elif default_eph_format:"},{"line_number":10890,"context_line":"                expected_format \u003d default_eph_format"},{"line_number":10891,"context_line":"            else:"},{"line_number":10892,"context_line":"                expected_format \u003d disk_api.FS_FORMAT_EXT4"},{"line_number":10893,"context_line":"            mock_create_ploop.assert_called_once_with(\u0027expanded\u0027,"},{"line_number":10894,"context_line":"                                                      \u0027/dev/something\u0027,"},{"line_number":10895,"context_line":"                                                      \u002720G\u0027, expected_format)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_20562b5c","line":10892,"in_reply_to":"7a3c09a3_e23ee789","updated":"2017-01-23 13:39:20.000000000","message":"done","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"}],"nova/tests/unit/virt/libvirt/test_imagebackend.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e685609cda7ef087e3dbd43938d733303ae2ea5","unresolved":false,"context_lines":[{"line_number":1665,"context_line":"        fn(target\u003dself.PATH, ephemeral_size\u003d2)"},{"line_number":1666,"context_line":"        image \u003d imgmodel.LocalFileImage(self.PATH, imgmodel.FORMAT_PLOOP)"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"        self.mox.ReplayAll()"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"},{"line_number":1671,"context_line":"        image.create_image(fn, self.TEMPLATE_PATH, 2048, ephemeral_size\u003d2)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_df6b6bb5","line":1668,"updated":"2016-12-28 22:00:31.000000000","message":"We shouldn\u0027t use mox for new tests.","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":3498,"context_line":"                    instance.default_ephemeral_device \u003d ("},{"line_number":3499,"context_line":"                        block_device.prepend_dev(disklocal.target_dev))"},{"line_number":3500,"context_line":""},{"line_number":3501,"context_line":"                for idx, eph in enumerate("},{"line_number":3502,"context_line":"                    driver.block_device_info_get_ephemerals("},{"line_number":3503,"context_line":"                        block_device_info)):"},{"line_number":3504,"context_line":"                    diskeph \u003d self._get_guest_disk_config("},{"line_number":3505,"context_line":"                        instance,"},{"line_number":3506,"context_line":"                        blockinfo.get_eph_disk(idx),"},{"line_number":3507,"context_line":"                        disk_mapping, inst_type)"},{"line_number":3508,"context_line":"                    devices.append(diskeph)"},{"line_number":3509,"context_line":""},{"line_number":3510,"context_line":"                if \u0027disk.swap\u0027 in disk_mapping:"},{"line_number":3511,"context_line":"                    diskswap \u003d self._get_guest_disk_config(instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_7697253a","line":3508,"range":{"start_line":3501,"start_character":0,"end_line":3508,"end_character":43},"updated":"2016-10-13 14:03:40.000000000","message":"Could we avoid the duplication of this by moving it out two levels and running this in all cases except rescue and mount_rootfs? I\u0027m not even sure if we\u0027d have any ephemeral devices in the mount_rootfs case for lxc, I\u0027d think not so it\u0027s just a noop to run the loop.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":3498,"context_line":"                    instance.default_ephemeral_device \u003d ("},{"line_number":3499,"context_line":"                        block_device.prepend_dev(disklocal.target_dev))"},{"line_number":3500,"context_line":""},{"line_number":3501,"context_line":"                for idx, eph in enumerate("},{"line_number":3502,"context_line":"                    driver.block_device_info_get_ephemerals("},{"line_number":3503,"context_line":"                        block_device_info)):"},{"line_number":3504,"context_line":"                    diskeph \u003d self._get_guest_disk_config("},{"line_number":3505,"context_line":"                        instance,"},{"line_number":3506,"context_line":"                        blockinfo.get_eph_disk(idx),"},{"line_number":3507,"context_line":"                        disk_mapping, inst_type)"},{"line_number":3508,"context_line":"                    devices.append(diskeph)"},{"line_number":3509,"context_line":""},{"line_number":3510,"context_line":"                if \u0027disk.swap\u0027 in disk_mapping:"},{"line_number":3511,"context_line":"                    diskswap \u003d self._get_guest_disk_config(instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6895a0_9b40cf58","line":3508,"range":{"start_line":3501,"start_character":0,"end_line":3508,"end_character":43},"in_reply_to":"fa6399be_7697253a","updated":"2016-11-03 12:14:25.000000000","message":"Done","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":2823,"context_line":"        if not is_block_dev:"},{"line_number":2824,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2825,"context_line":"                CONF.libvirt.images_type \u003d\u003d \"ploop\"):"},{"line_number":2826,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2827,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2828,"context_line":"                                                 specified_fs)"},{"line_number":2829,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_671ffcb7","line":2826,"updated":"2016-11-04 09:35:24.000000000","message":"Why wouldn\u0027t do this from inside imagebackend to avoid breaking of abstraction with such checks?","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":2823,"context_line":"        if not is_block_dev:"},{"line_number":2824,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2825,"context_line":"                CONF.libvirt.images_type \u003d\u003d \"ploop\"):"},{"line_number":2826,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2827,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2828,"context_line":"                                                 specified_fs)"},{"line_number":2829,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_94c8de56","line":2826,"in_reply_to":"ba5da102_671ffcb7","updated":"2016-11-14 11:59:05.000000000","message":"This function calls libvirt_utils.create_image which only executes \"qemu-img create\". _create_ephemeral() is the low level function and it doesn\u0027t depend on imagebacked.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":2826,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2827,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2828,"context_line":"                                                 specified_fs)"},{"line_number":2829,"context_line":"                return"},{"line_number":2830,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_4c505f5f","line":2829,"updated":"2016-11-04 09:35:24.000000000","message":"You do not want to format the disk? Why?","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":2826,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2827,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2828,"context_line":"                                                 specified_fs)"},{"line_number":2829,"context_line":"                return"},{"line_number":2830,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_111860d2","line":2829,"in_reply_to":"ba5da102_4c505f5f","updated":"2016-11-14 11:59:05.000000000","message":"Because create_ploop_image() calls \"ploop init\" which creates already formatted disk.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":3448,"context_line":"            block_device_info)"},{"line_number":3449,"context_line":"        mount_rootfs \u003d CONF.libvirt.virt_type \u003d\u003d \"lxc\""},{"line_number":3450,"context_line":""},{"line_number":3451,"context_line":"        if not mount_rootfs and not rescue:"},{"line_number":3452,"context_line":"            for idx, eph in enumerate("},{"line_number":3453,"context_line":"                driver.block_device_info_get_ephemerals("},{"line_number":3454,"context_line":"                    block_device_info)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_47d91883","line":3451,"updated":"2016-11-04 09:35:24.000000000","message":"A closure function would simplify understanding of the logic for me","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"59eda8998ef0b41e3581bee96844cd712c13f771","unresolved":false,"context_lines":[{"line_number":3448,"context_line":"            block_device_info)"},{"line_number":3449,"context_line":"        mount_rootfs \u003d CONF.libvirt.virt_type \u003d\u003d \"lxc\""},{"line_number":3450,"context_line":""},{"line_number":3451,"context_line":"        if not mount_rootfs and not rescue:"},{"line_number":3452,"context_line":"            for idx, eph in enumerate("},{"line_number":3453,"context_line":"                driver.block_device_info_get_ephemerals("},{"line_number":3454,"context_line":"                    block_device_info)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_b508492f","line":3451,"in_reply_to":"9a629dbe_603d44dc","updated":"2016-11-14 12:24:36.000000000","message":"Feodor, now I\u0027m doing swap disks support for ploop.\nI think it\u0027s a good idea to make closure functions for ephemeral and swap disks. But it\u0027ll be in patch for swap disks.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":3448,"context_line":"            block_device_info)"},{"line_number":3449,"context_line":"        mount_rootfs \u003d CONF.libvirt.virt_type \u003d\u003d \"lxc\""},{"line_number":3450,"context_line":""},{"line_number":3451,"context_line":"        if not mount_rootfs and not rescue:"},{"line_number":3452,"context_line":"            for idx, eph in enumerate("},{"line_number":3453,"context_line":"                driver.block_device_info_get_ephemerals("},{"line_number":3454,"context_line":"                    block_device_info)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_603d44dc","line":3451,"in_reply_to":"ba5da102_47d91883","updated":"2016-11-14 11:59:05.000000000","message":"I think it\u0027s not necessary to make additional function. Here I just move this code to the beginning of this function to avoid code duplication. You can see similar code at the end of this function (loop for get_bdms_to_connect)","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":6621,"context_line":"            # create backing file in case of qcow2."},{"line_number":6622,"context_line":"            instance_disk \u003d os.path.join(instance_dir, base)"},{"line_number":6623,"context_line":"            if not info[\u0027backing_file\u0027] and not os.path.exists(instance_disk):"},{"line_number":6624,"context_line":"                libvirt_utils.create_image(info[\u0027type\u0027], instance_disk,"},{"line_number":6625,"context_line":"                                           info[\u0027virt_disk_size\u0027])"},{"line_number":6626,"context_line":"            elif info[\u0027backing_file\u0027]:"},{"line_number":6627,"context_line":"                # Creating backing file follows same way as spawning instances."}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_072ac02c","line":6624,"updated":"2016-11-04 09:35:24.000000000","message":"Should we have here the same checks for parallels and ploop?","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":6621,"context_line":"            # create backing file in case of qcow2."},{"line_number":6622,"context_line":"            instance_disk \u003d os.path.join(instance_dir, base)"},{"line_number":6623,"context_line":"            if not info[\u0027backing_file\u0027] and not os.path.exists(instance_disk):"},{"line_number":6624,"context_line":"                libvirt_utils.create_image(info[\u0027type\u0027], instance_disk,"},{"line_number":6625,"context_line":"                                           info[\u0027virt_disk_size\u0027])"},{"line_number":6626,"context_line":"            elif info[\u0027backing_file\u0027]:"},{"line_number":6627,"context_line":"                # Creating backing file follows same way as spawning instances."}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_f22bb792","line":6624,"in_reply_to":"ba5da102_072ac02c","updated":"2016-11-14 11:59:05.000000000","message":"Thanks! It will be in another patch","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"9c4fcdbc227044c8b035f9c6f99e7618e90bb975","unresolved":false,"context_lines":[{"line_number":3078,"context_line":"                                   fs_label\u003d\u0027ephemeral0\u0027,"},{"line_number":3079,"context_line":"                                   os_type\u003dinstance.os_type,"},{"line_number":3080,"context_line":"                                   is_block_dev\u003ddisk_image.is_block_dev,"},{"line_number":3081,"context_line":"                                   vm_mode\u003dfields.VMMode.get_from_instance("},{"line_number":3082,"context_line":"                                                                   instance))"},{"line_number":3083,"context_line":"            fname \u003d \"ephemeral_%s_%s\" % (ephemeral_gb, file_extension)"},{"line_number":3084,"context_line":"            size \u003d ephemeral_gb * units.Gi"},{"line_number":3085,"context_line":"            disk_image.cache(fetch_func\u003dfn,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_7835d544","line":3082,"range":{"start_line":3081,"start_character":35,"end_line":3082,"end_character":76},"updated":"2017-01-13 13:38:25.000000000","message":"Let\u0027s just do this once by introducing a variable at 3073 line and use the variable here and at 3104 line","commit_id":"bcac296ae8953df422e315c19fdd1fc1bc321dff"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"41abed3612ef9f5e805678cfea383b8a5198f1de","unresolved":false,"context_lines":[{"line_number":3078,"context_line":"                                   fs_label\u003d\u0027ephemeral0\u0027,"},{"line_number":3079,"context_line":"                                   os_type\u003dinstance.os_type,"},{"line_number":3080,"context_line":"                                   is_block_dev\u003ddisk_image.is_block_dev,"},{"line_number":3081,"context_line":"                                   vm_mode\u003dfields.VMMode.get_from_instance("},{"line_number":3082,"context_line":"                                                                   instance))"},{"line_number":3083,"context_line":"            fname \u003d \"ephemeral_%s_%s\" % (ephemeral_gb, file_extension)"},{"line_number":3084,"context_line":"            size \u003d ephemeral_gb * units.Gi"},{"line_number":3085,"context_line":"            disk_image.cache(fetch_func\u003dfn,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_bb6d7734","line":3082,"range":{"start_line":3081,"start_character":35,"end_line":3082,"end_character":76},"in_reply_to":"7a3c09a3_7835d544","updated":"2017-01-13 13:59:15.000000000","message":"I agree, thank you.","commit_id":"bcac296ae8953df422e315c19fdd1fc1bc321dff"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"daafa76f8127c404ce38eafb3d2e0012d3d88c7a","unresolved":false,"context_lines":[{"line_number":2896,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2897,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2898,"context_line":"                                                 specified_fs)"},{"line_number":2899,"context_line":"                return"},{"line_number":2900,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2901,"context_line":""},{"line_number":2902,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_ad5e1243","line":2899,"updated":"2017-01-13 17:07:47.000000000","message":"I\u0027d prefer to see this added to disk_api. Seems like we\u0027re just adding cruft here to work around something it doesn\u0027t yet do. It should just do it.\n\nI\u0027d accept that as a follow-on, though. This is fine for now.","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"daafa76f8127c404ce38eafb3d2e0012d3d88c7a","unresolved":false,"context_lines":[{"line_number":3529,"context_line":"            block_device_info)"},{"line_number":3530,"context_line":"        mount_rootfs \u003d CONF.libvirt.virt_type \u003d\u003d \"lxc\""},{"line_number":3531,"context_line":""},{"line_number":3532,"context_line":"        if not mount_rootfs and not rescue:"},{"line_number":3533,"context_line":"            for idx, eph in enumerate("},{"line_number":3534,"context_line":"                driver.block_device_info_get_ephemerals("},{"line_number":3535,"context_line":"                    block_device_info)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_68441874","line":3532,"updated":"2017-01-13 17:07:47.000000000","message":"Could we not just define this as a function or a generator  and call/evaluate it where it\u0027s required below? Or even just do it unconditionally, given that it\u0027s not exactly expensive. I agree we want this to be common code, but the cost here is that we\u0027re duplicating the logic of the block below to save a couple of cycles.\n\nAlso, we\u0027re adding a new \u0027if \u003cinsert incomprehensible voodoo here\u003e\u0027 block to nova. If this ever gets accidentally out of sync it\u0027s going to be both a bug and a source of new bugs when nobody can work out any more why we did this.","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"afd877dee56fa784b34b7c88dcc0b11fce63771c","unresolved":false,"context_lines":[{"line_number":3529,"context_line":"            block_device_info)"},{"line_number":3530,"context_line":"        mount_rootfs \u003d CONF.libvirt.virt_type \u003d\u003d \"lxc\""},{"line_number":3531,"context_line":""},{"line_number":3532,"context_line":"        if not mount_rootfs and not rescue:"},{"line_number":3533,"context_line":"            for idx, eph in enumerate("},{"line_number":3534,"context_line":"                driver.block_device_info_get_ephemerals("},{"line_number":3535,"context_line":"                    block_device_info)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_d1dc9fe6","line":3532,"in_reply_to":"7a3c09a3_68441874","updated":"2017-01-16 13:17:14.000000000","message":"Done","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4be9b08580633d8b04d9e3aa0bd25d7a47926b37","unresolved":false,"context_lines":[{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_29e39834","line":2890,"range":{"start_line":2889,"start_character":16,"end_line":2890,"end_character":44},"updated":"2017-01-21 17:03:01.000000000","message":"nit: I\u0027m pretty sure we have this same pattern in several places in this driver code, we should create a libvirt.utils helper method for this at some point, i.e. is_parallels(vm_mode\u003dNone).","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"76baa7e50c8f038f7b1c56a73c4ff5d04d536025","unresolved":false,"context_lines":[{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_a3894528","line":2890,"range":{"start_line":2889,"start_character":16,"end_line":2890,"end_character":44},"in_reply_to":"5a3905b3_29e39834","updated":"2017-01-23 13:39:20.000000000","message":"Ok, I\u0027ll do it in another patch","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7889404a27974807ce625ab62a3e37f211018d5a","unresolved":false,"context_lines":[{"line_number":2883,"context_line":"    @staticmethod"},{"line_number":2884,"context_line":"    def _create_ephemeral(target, ephemeral_size,"},{"line_number":2885,"context_line":"                          fs_label, os_type, is_block_dev\u003dFalse,"},{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_2141743a","line":2886,"range":{"start_line":2886,"start_character":26,"end_line":2886,"end_character":40},"updated":"2017-01-25 15:17:04.000000000","message":"unrelated to this patch, but am I blind or is this unused? Future cleanup?","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"1c3ebf310abd1676186d5a59e1d0a26be3f3de16","unresolved":false,"context_lines":[{"line_number":2883,"context_line":"    @staticmethod"},{"line_number":2884,"context_line":"    def _create_ephemeral(target, ephemeral_size,"},{"line_number":2885,"context_line":"                          fs_label, os_type, is_block_dev\u003dFalse,"},{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_76bedd00","line":2886,"range":{"start_line":2886,"start_character":26,"end_line":2886,"end_character":40},"in_reply_to":"3a461143_2141743a","updated":"2017-01-25 16:07:06.000000000","message":"I suppose it\u0027s common argument for fetch_func callback\nline 3106.","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"42cba5564fa2da2c8a7ffc22d9fade75abe216a3","unresolved":false,"context_lines":[{"line_number":2883,"context_line":"    @staticmethod"},{"line_number":2884,"context_line":"    def _create_ephemeral(target, ephemeral_size,"},{"line_number":2885,"context_line":"                          fs_label, os_type, is_block_dev\u003dFalse,"},{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_8c7edcac","line":2886,"range":{"start_line":2886,"start_character":26,"end_line":2886,"end_character":40},"in_reply_to":"3a461143_76bedd00","updated":"2017-01-25 16:45:47.000000000","message":"Indeed it is. Good spot.","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7889404a27974807ce625ab62a3e37f211018d5a","unresolved":false,"context_lines":[{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_06ed6e8b","line":2890,"range":{"start_line":2890,"start_character":16,"end_line":2890,"end_character":46},"updated":"2017-01-25 15:17:04.000000000","message":"nit: indent this by four spaces","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7889404a27974807ce625ab62a3e37f211018d5a","unresolved":false,"context_lines":[{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"},{"line_number":2894,"context_line":"                                   disk_api.FS_FORMAT_EXT4"},{"line_number":2895,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2896,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2897,"context_line":"                                                 specified_fs)"},{"line_number":2898,"context_line":"                return"},{"line_number":2899,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_c103500c","line":2898,"range":{"start_line":2889,"start_character":0,"end_line":2898,"end_character":22},"updated":"2017-01-25 15:17:04.000000000","message":"I really feel like this should be a separate function - there\u0027s a lot of switches here and you\u0027re not using a lot of the provided parameters on this code path (fs_label, os_type, context). What do you think?","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"42cba5564fa2da2c8a7ffc22d9fade75abe216a3","unresolved":false,"context_lines":[{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"},{"line_number":2894,"context_line":"                                   disk_api.FS_FORMAT_EXT4"},{"line_number":2895,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2896,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2897,"context_line":"                                                 specified_fs)"},{"line_number":2898,"context_line":"                return"},{"line_number":2899,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_8c55fc1e","line":2898,"range":{"start_line":2889,"start_character":0,"end_line":2898,"end_character":22},"in_reply_to":"3a461143_b694c5e8","updated":"2017-01-25 16:45:47.000000000","message":"Yeah, I\u0027d be happy with that","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"1c3ebf310abd1676186d5a59e1d0a26be3f3de16","unresolved":false,"context_lines":[{"line_number":2886,"context_line":"                          context\u003dNone, specified_fs\u003dNone,"},{"line_number":2887,"context_line":"                          vm_mode\u003dNone):"},{"line_number":2888,"context_line":"        if not is_block_dev:"},{"line_number":2889,"context_line":"            if (CONF.libvirt.virt_type \u003d\u003d \"parallels\" and"},{"line_number":2890,"context_line":"                vm_mode \u003d\u003d fields.VMMode.EXE):"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"                if not specified_fs:"},{"line_number":2893,"context_line":"                    specified_fs \u003d CONF.default_ephemeral_format or \\"},{"line_number":2894,"context_line":"                                   disk_api.FS_FORMAT_EXT4"},{"line_number":2895,"context_line":"                libvirt_utils.create_ploop_image(\u0027expanded\u0027, target,"},{"line_number":2896,"context_line":"                                                 \u0027%dG\u0027 % ephemeral_size,"},{"line_number":2897,"context_line":"                                                 specified_fs)"},{"line_number":2898,"context_line":"                return"},{"line_number":2899,"context_line":"            libvirt_utils.create_image(\u0027raw\u0027, target, \u0027%dG\u0027 % ephemeral_size)"},{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        # Run as root only for block devices."}],"source_content_type":"text/x-python","patch_set":21,"id":"3a461143_b694c5e8","line":2898,"range":{"start_line":2889,"start_character":0,"end_line":2898,"end_character":22},"in_reply_to":"3a461143_c103500c","updated":"2017-01-25 16:07:06.000000000","message":"My suggestion is to move lines 2892-2894 into libvirt_utils.create_ploop_image()\nIn libvirt_utils module we have access to nova.conf.CONF, so\nit makes code simpler here.\nShould I update the review?","commit_id":"f28edeffea75288a67baeeec72cc87ea970ec01a"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        @utils.synchronized(filename, external\u003dTrue, lock_path\u003dself.lock_path)"},{"line_number":1024,"context_line":"        def create_ploop_image(base, target, size):"},{"line_number":1025,"context_line":"            image_path \u003d os.path.join(target, \"root.hds\")"},{"line_number":1026,"context_line":"            if os.path.exists(os.path.join(base, \"root.hds\")):"},{"line_number":1027,"context_line":"                base \u003d os.path.join(base, \"root.hds\")"},{"line_number":1028,"context_line":"            libvirt_utils.copy_image(base, image_path)"},{"line_number":1029,"context_line":"            utils.execute(\u0027ploop\u0027, \u0027restore-descriptor\u0027, \u0027-f\u0027, self.pcs_format,"},{"line_number":1030,"context_line":"                          target, image_path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_18c7f764","line":1027,"range":{"start_line":1026,"start_character":12,"end_line":1027,"end_character":53},"updated":"2016-10-13 14:03:40.000000000","message":"Add a comment that this is for ephemeral disks?","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"afd4f07136a6f2c102b2072ed7a6a87d203ab341","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        @utils.synchronized(filename, external\u003dTrue, lock_path\u003dself.lock_path)"},{"line_number":1024,"context_line":"        def create_ploop_image(base, target, size):"},{"line_number":1025,"context_line":"            image_path \u003d os.path.join(target, \"root.hds\")"},{"line_number":1026,"context_line":"            if os.path.exists(os.path.join(base, \"root.hds\")):"},{"line_number":1027,"context_line":"                base \u003d os.path.join(base, \"root.hds\")"},{"line_number":1028,"context_line":"            libvirt_utils.copy_image(base, image_path)"},{"line_number":1029,"context_line":"            utils.execute(\u0027ploop\u0027, \u0027restore-descriptor\u0027, \u0027-f\u0027, self.pcs_format,"},{"line_number":1030,"context_line":"                          target, image_path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_5edf970c","line":1027,"range":{"start_line":1026,"start_character":12,"end_line":1027,"end_character":53},"in_reply_to":"fa6399be_18c7f764","updated":"2016-10-13 14:52:18.000000000","message":"Lets not do this at all. Caching pre-created filesystems makes almost no sense anyway and creates a number of subtle bugs. Lets just bypass the image cache altogether when creating ephemeral disks, like LVM for eg.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        @utils.synchronized(filename, external\u003dTrue, lock_path\u003dself.lock_path)"},{"line_number":1024,"context_line":"        def create_ploop_image(base, target, size):"},{"line_number":1025,"context_line":"            image_path \u003d os.path.join(target, \"root.hds\")"},{"line_number":1026,"context_line":"            if os.path.exists(os.path.join(base, \"root.hds\")):"},{"line_number":1027,"context_line":"                base \u003d os.path.join(base, \"root.hds\")"},{"line_number":1028,"context_line":"            libvirt_utils.copy_image(base, image_path)"},{"line_number":1029,"context_line":"            utils.execute(\u0027ploop\u0027, \u0027restore-descriptor\u0027, \u0027-f\u0027, self.pcs_format,"},{"line_number":1030,"context_line":"                          target, image_path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_9f7669d5","line":1027,"range":{"start_line":1026,"start_character":12,"end_line":1027,"end_character":53},"in_reply_to":"fa6399be_5edf970c","updated":"2016-11-03 12:14:25.000000000","message":"Done","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"            if CONF.force_raw_images:"},{"line_number":1036,"context_line":"                self.pcs_format \u003d \"raw\""},{"line_number":1037,"context_line":"            else:"},{"line_number":1038,"context_line":"                if \"context\" in kwargs and \"image_id\" in kwargs:"},{"line_number":1039,"context_line":"                    image_meta \u003d IMAGE_API.get(kwargs[\"context\"],"},{"line_number":1040,"context_line":"                                               kwargs[\"image_id\"])"},{"line_number":1041,"context_line":"                    format \u003d image_meta.get(\"disk_format\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_b679bdca","line":1038,"range":{"start_line":1038,"start_character":16,"end_line":1038,"end_character":64},"updated":"2016-10-13 14:03:40.000000000","message":"This seems very hacky and brittle. Is there a more direct way to handle this? Although I guess one could argue that we should have these checks in place to begin with rather than assuming we have the context and image_id kwargs.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"            if CONF.force_raw_images:"},{"line_number":1036,"context_line":"                self.pcs_format \u003d \"raw\""},{"line_number":1037,"context_line":"            else:"},{"line_number":1038,"context_line":"                if \"context\" in kwargs and \"image_id\" in kwargs:"},{"line_number":1039,"context_line":"                    image_meta \u003d IMAGE_API.get(kwargs[\"context\"],"},{"line_number":1040,"context_line":"                                               kwargs[\"image_id\"])"},{"line_number":1041,"context_line":"                    format \u003d image_meta.get(\"disk_format\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_2584995c","line":1038,"range":{"start_line":1038,"start_character":16,"end_line":1038,"end_character":64},"in_reply_to":"fa6399be_7e2d3b94","updated":"2016-11-03 12:14:25.000000000","message":"I agree with Matthew.\nIf I create instance with ephemeral disk then\nkwargs for main disk \u003d {\u0027image_id\u0027: u\u00275b4a09e2-9adf-49d1-906f-08bdf3045f12\u0027, \u0027context\u0027: \u003cnova.context.RequestContext object at 0x6fe6990\u003e}\n\nkwargs for ephemeral disk \u003d  {\u0027specified_fs\u0027: None, \u0027ephemeral_size\u0027: 2, \u0027context\u0027: \u003cnova.context.RequestContext object at 0x6fe6990\u003e}","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"afd4f07136a6f2c102b2072ed7a6a87d203ab341","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"            if CONF.force_raw_images:"},{"line_number":1036,"context_line":"                self.pcs_format \u003d \"raw\""},{"line_number":1037,"context_line":"            else:"},{"line_number":1038,"context_line":"                if \"context\" in kwargs and \"image_id\" in kwargs:"},{"line_number":1039,"context_line":"                    image_meta \u003d IMAGE_API.get(kwargs[\"context\"],"},{"line_number":1040,"context_line":"                                               kwargs[\"image_id\"])"},{"line_number":1041,"context_line":"                    format \u003d image_meta.get(\"disk_format\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_7e2d3b94","line":1038,"range":{"start_line":1038,"start_character":16,"end_line":1038,"end_character":64},"in_reply_to":"fa6399be_b679bdca","updated":"2016-10-13 14:52:18.000000000","message":"This is how other backends to this too. Getting rid of this is one of the goals of create_from_image() and create_from_func(). This is obviously the image case. This is the best approach until we change the interface.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            if CONF.force_raw_images:"},{"line_number":1034,"context_line":"                self.pcs_format \u003d \"raw\""},{"line_number":1035,"context_line":"            else:"},{"line_number":1036,"context_line":"                if \"context\" in kwargs and \"image_id\" in kwargs:"},{"line_number":1037,"context_line":"                    image_meta \u003d IMAGE_API.get(kwargs[\"context\"],"},{"line_number":1038,"context_line":"                                               kwargs[\"image_id\"])"},{"line_number":1039,"context_line":"                    format \u003d image_meta.get(\"disk_format\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_3239c0d9","line":1036,"updated":"2016-11-04 09:35:24.000000000","message":"You use self.pcf_format to create from image only. If you move this getting of pcf_format to a separate closure function or to the related branch (L1058), you will not have to complicate this logic.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            if CONF.force_raw_images:"},{"line_number":1034,"context_line":"                self.pcs_format \u003d \"raw\""},{"line_number":1035,"context_line":"            else:"},{"line_number":1036,"context_line":"                if \"context\" in kwargs and \"image_id\" in kwargs:"},{"line_number":1037,"context_line":"                    image_meta \u003d IMAGE_API.get(kwargs[\"context\"],"},{"line_number":1038,"context_line":"                                               kwargs[\"image_id\"])"},{"line_number":1039,"context_line":"                    format \u003d image_meta.get(\"disk_format\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_5aad8d99","line":1036,"in_reply_to":"ba5da102_3239c0d9","updated":"2016-11-14 11:59:05.000000000","message":"I agree, thanks!","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                                        image_id\u003dkwargs[\"image_id\"],"},{"line_number":1053,"context_line":"                                        reason\u003dreason)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        generating \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":1056,"context_line":"        remove_func \u003d functools.partial(fileutils.delete_if_exists,"},{"line_number":1057,"context_line":"                                        remove\u003dshutil.rmtree)"},{"line_number":1058,"context_line":"        if not generating:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_2753446e","line":1055,"updated":"2016-11-04 09:35:24.000000000","message":"ploop backend does not support swaps?","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"a9551c99d7c8a0c9546c06d45aacd027037a9eef","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                                        image_id\u003dkwargs[\"image_id\"],"},{"line_number":1053,"context_line":"                                        reason\u003dreason)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        generating \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":1056,"context_line":"        remove_func \u003d functools.partial(fileutils.delete_if_exists,"},{"line_number":1057,"context_line":"                                        remove\u003dshutil.rmtree)"},{"line_number":1058,"context_line":"        if not generating:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_e8d73bbd","line":1055,"in_reply_to":"9a629dbe_141e8e6f","updated":"2016-11-14 16:44:22.000000000","message":"virtuozzo 7 doesn\u0027t support swap disks for containers.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                                        image_id\u003dkwargs[\"image_id\"],"},{"line_number":1053,"context_line":"                                        reason\u003dreason)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        generating \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":1056,"context_line":"        remove_func \u003d functools.partial(fileutils.delete_if_exists,"},{"line_number":1057,"context_line":"                                        remove\u003dshutil.rmtree)"},{"line_number":1058,"context_line":"        if not generating:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_141e8e6f","line":1055,"in_reply_to":"ba5da102_2753446e","updated":"2016-11-14 11:59:05.000000000","message":"code for swap disks will be in another patch.\nAlso thanks, I\u0027ll change this condition","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e685609cda7ef087e3dbd43938d733303ae2ea5","unresolved":false,"context_lines":[{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"        self.resolve_driver_format()"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":1021,"context_line":"        filename \u003d os.path.split(base)[-1]"},{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"        @utils.synchronized(filename, external\u003dTrue, lock_path\u003dself.lock_path)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_1f909394","line":1020,"updated":"2016-12-28 22:00:31.000000000","message":"A general comment/request, but can you please add some comments/documentation in with the changes to this method because as it stands it\u0027s confusing and hard to follow (which is a latent issue, but I\u0027d rather not add to the maintenance burden by not documenting these changes).","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"daafa76f8127c404ce38eafb3d2e0012d3d88c7a","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"    # Create new ploop disk (in case of epehemeral) or"},{"line_number":1030,"context_line":"    # copy ploop disk from glance image"},{"line_number":1031,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":1032,"context_line":"        filename \u003d os.path.split(base)[-1]"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        # Copy main file of ploop disk, restore DiskDescriptor.xml for it"},{"line_number":1035,"context_line":"        # and resize if necessary"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_48d83c54","line":1032,"updated":"2017-01-13 17:07:47.000000000","message":"Not strictly an issue in this patch, but:\n\n  filename \u003d os.path.basename(base)","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"afd877dee56fa784b34b7c88dcc0b11fce63771c","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"    # Create new ploop disk (in case of epehemeral) or"},{"line_number":1030,"context_line":"    # copy ploop disk from glance image"},{"line_number":1031,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":1032,"context_line":"        filename \u003d os.path.split(base)[-1]"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        # Copy main file of ploop disk, restore DiskDescriptor.xml for it"},{"line_number":1035,"context_line":"        # and resize if necessary"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_6af3fe9e","line":1032,"in_reply_to":"7a3c09a3_48d83c54","updated":"2017-01-16 13:17:14.000000000","message":"Done","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"daafa76f8127c404ce38eafb3d2e0012d3d88c7a","unresolved":false,"context_lines":[{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"            # Ploop disk is a directory with data file and DiskDescriptor.xml,"},{"line_number":1087,"context_line":"            # so create it"},{"line_number":1088,"context_line":"            fileutils.ensure_tree(self.path)"},{"line_number":1089,"context_line":""},{"line_number":1090,"context_line":"            with fileutils.remove_path_on_error(self.path, remove\u003dremove_func):"},{"line_number":1091,"context_line":"                _copy_ploop_image(base, self.path, size)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_e849e8d1","line":1088,"updated":"2017-01-13 17:07:47.000000000","message":"nit: it would be tidier if this was in _copy_ploop_image.","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"afd877dee56fa784b34b7c88dcc0b11fce63771c","unresolved":false,"context_lines":[{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"            # Ploop disk is a directory with data file and DiskDescriptor.xml,"},{"line_number":1087,"context_line":"            # so create it"},{"line_number":1088,"context_line":"            fileutils.ensure_tree(self.path)"},{"line_number":1089,"context_line":""},{"line_number":1090,"context_line":"            with fileutils.remove_path_on_error(self.path, remove\u003dremove_func):"},{"line_number":1091,"context_line":"                _copy_ploop_image(base, self.path, size)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_eae7eee1","line":1088,"in_reply_to":"7a3c09a3_e849e8d1","updated":"2017-01-16 13:17:14.000000000","message":"Done","commit_id":"283396b7893d09f49e0016c53e52bbbf18a0bc2a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4be9b08580633d8b04d9e3aa0bd25d7a47926b37","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"            if not os.path.exists(base):"},{"line_number":1060,"context_line":"                prepare_template(target\u003dbase, *args, **kwargs)"},{"line_number":1061,"context_line":"            else:"},{"line_number":1062,"context_line":"                # Disk already exists in cache, just update time"},{"line_number":1063,"context_line":"                libvirt_utils.update_mtime(base)"},{"line_number":1064,"context_line":"            self.verify_base_size(base, size)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"            if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_a9e068fb","line":1063,"range":{"start_line":1062,"start_character":16,"end_line":1063,"end_character":48},"updated":"2017-01-21 17:03:01.000000000","message":"Is this needed because we changed create to copy above?","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"aadbdfc0d8d4401c81f8ba072a406b0ba2c6306b","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"            if not os.path.exists(base):"},{"line_number":1060,"context_line":"                prepare_template(target\u003dbase, *args, **kwargs)"},{"line_number":1061,"context_line":"            else:"},{"line_number":1062,"context_line":"                # Disk already exists in cache, just update time"},{"line_number":1063,"context_line":"                libvirt_utils.update_mtime(base)"},{"line_number":1064,"context_line":"            self.verify_base_size(base, size)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"            if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_5b123c0a","line":1063,"range":{"start_line":1062,"start_character":16,"end_line":1063,"end_character":48},"in_reply_to":"5a3905b3_3e600c01","updated":"2017-01-23 14:42:57.000000000","message":"Updating mtime reduces a race in imagecache cleanup. Cleanup gets a big list of things which might no longer be in use, then it checks if they\u0027re in use, then it deletes them. The time from checking if an image is in use to deleting it can be very long. Consequently immediately before deleting an image, imagecache checks that the mtime is older than X. By updating the mtime here, we ensure the image won\u0027t be deleted from under us while we\u0027re still copying it.","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"76baa7e50c8f038f7b1c56a73c4ff5d04d536025","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"            if not os.path.exists(base):"},{"line_number":1060,"context_line":"                prepare_template(target\u003dbase, *args, **kwargs)"},{"line_number":1061,"context_line":"            else:"},{"line_number":1062,"context_line":"                # Disk already exists in cache, just update time"},{"line_number":1063,"context_line":"                libvirt_utils.update_mtime(base)"},{"line_number":1064,"context_line":"            self.verify_base_size(base, size)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"            if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_3e600c01","line":1063,"range":{"start_line":1062,"start_character":16,"end_line":1063,"end_character":48},"in_reply_to":"5a3905b3_a9e068fb","updated":"2017-01-23 13:39:20.000000000","message":"we just update mtime of the base file in the cache.\nFor example:\nwe already have the base image in the cache and\nploop disk on self.path\nso this function just updates mtime and we exit on line 1066.\nI found similar logic in qemu line 573","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    execute(*cmd)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":102,"context_line":"    \"\"\"Create ploop image"},{"line_number":103,"context_line":"    :param disk_format: Disk image format (as known by ploop)"},{"line_number":104,"context_line":"    :param path: Desired location of the ploop image"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_18e61744","line":101,"range":{"start_line":101,"start_character":48,"end_line":101,"end_character":55},"updated":"2016-10-13 14:03:40.000000000","message":"This is optional right? If so, default to None.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    execute(*cmd)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":102,"context_line":"    \"\"\"Create ploop image"},{"line_number":103,"context_line":"    :param disk_format: Disk image format (as known by ploop)"},{"line_number":104,"context_line":"    :param path: Desired location of the ploop image"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6895a0_c6f2759a","line":101,"range":{"start_line":101,"start_character":48,"end_line":101,"end_character":55},"in_reply_to":"fa6399be_18e61744","updated":"2016-11-03 12:14:25.000000000","message":"Done","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":102,"context_line":"    \"\"\"Create ploop image"},{"line_number":103,"context_line":"    :param disk_format: Disk image format (as known by ploop)"},{"line_number":104,"context_line":"    :param path: Desired location of the ploop image"},{"line_number":105,"context_line":"    :param size: Desired size of ploop image. May be given as an int or"},{"line_number":106,"context_line":"                 a string. If given as an int, it will be interpreted"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_d60b9128","line":103,"updated":"2016-10-13 14:03:40.000000000","message":"nit: there should be a blank line between the description and the parameters.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":102,"context_line":"    \"\"\"Create ploop image"},{"line_number":103,"context_line":"    :param disk_format: Disk image format (as known by ploop)"},{"line_number":104,"context_line":"    :param path: Desired location of the ploop image"},{"line_number":105,"context_line":"    :param size: Desired size of ploop image. May be given as an int or"},{"line_number":106,"context_line":"                 a string. If given as an int, it will be interpreted"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6895a0_062b8dec","line":103,"in_reply_to":"fa6399be_d60b9128","updated":"2016-11-03 12:14:25.000000000","message":"Done","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    execute(\u0027mkdir\u0027, \u0027-p\u0027, path)"},{"line_number":114,"context_line":"    disk_path \u003d os.path.join(path, \u0027root.hds\u0027)"},{"line_number":115,"context_line":"    if not fs_type:"},{"line_number":116,"context_line":"        fs_type \u003d \"ext4\""},{"line_number":117,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":118,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":119,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_38191b7a","line":116,"range":{"start_line":116,"start_character":18,"end_line":116,"end_character":24},"updated":"2016-10-13 14:03:40.000000000","message":"Why not use virt.disk.api.get_file_extension_for_os_type here?\n\nAlso, there is no test coverage for this condition.","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    execute(\u0027mkdir\u0027, \u0027-p\u0027, path)"},{"line_number":114,"context_line":"    disk_path \u003d os.path.join(path, \u0027root.hds\u0027)"},{"line_number":115,"context_line":"    if not fs_type:"},{"line_number":116,"context_line":"        fs_type \u003d \"ext4\""},{"line_number":117,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":118,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":119,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_32977ded","line":116,"range":{"start_line":116,"start_character":18,"end_line":116,"end_character":24},"in_reply_to":"fa6399be_38191b7a","updated":"2016-11-03 12:14:25.000000000","message":"Done.\nFunction api.get_file_extension_for_os_type() returns hash for disk name. I think it\u0027s better just read CONF.default_ephemeral_format here","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b78371756a0843d7809c9a9b58a489dc388fb170","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        fs_type \u003d \"ext4\""},{"line_number":117,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":118,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":119,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def pick_disk_driver_name(hypervisor_version, is_block_dev\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_58608fa5","line":119,"updated":"2016-10-13 14:03:40.000000000","message":"Add a comment about why we add read access for all users?","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"5943d26d87fbcdbacda81fb8ffc88ba53b6a30a5","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        fs_type \u003d \"ext4\""},{"line_number":117,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":118,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":119,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def pick_disk_driver_name(hypervisor_version, is_block_dev\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6895a0_09371eb1","line":119,"in_reply_to":"fa6399be_58608fa5","updated":"2016-11-03 12:14:25.000000000","message":"Done","commit_id":"b0852216ab1eb45be5d06624b3a6ee659f9316c8"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"86f63781a49eebdee17b7675415fb1a4fe408930","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    execute(*cmd)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def create_ploop_image(disk_format, path, size, fs_type\u003dNone):"},{"line_number":103,"context_line":"    \"\"\"Create ploop image"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param disk_format: Disk image format (as known by ploop)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5da102_f233c860","line":102,"updated":"2016-11-04 09:35:24.000000000","message":"We probably can move this to libvirt/storage/ploop_utils. The point is to get rid of custom image backend code in common modules.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"7fef84928f21704ca55c3771d30f092f06c55e68","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    execute(*cmd)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def create_ploop_image(disk_format, path, size, fs_type\u003dNone):"},{"line_number":103,"context_line":"    \"\"\"Create ploop image"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param disk_format: Disk image format (as known by ploop)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_7fa6c3ae","line":102,"in_reply_to":"ba5da102_f233c860","updated":"2016-11-14 11:59:05.000000000","message":"In this module we already have calls of \"qemu-img\" \"xend\", so it\u0027s not common module.\nAnd if we move this code to ploop_utils than we should also rename this module to qemu_utils.","commit_id":"a3886ec618d2d3fe17f3ce0401835640b0a2f598"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e685609cda7ef087e3dbd43938d733303ae2ea5","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":117,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":118,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":119,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":120,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":121,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_bff5c7ed","line":120,"range":{"start_line":119,"start_character":41,"end_line":120,"end_character":53},"updated":"2016-12-28 22:00:31.000000000","message":"Does this really need to be \u0027all\u0027 users? Can\u0027t it be just the nova user? I\u0027m not sure if we do something similar anywhere else, or if the user running qemu-img can be something besides \u0027nova\u0027 (I\u0027m sure it could) but I\u0027m wondering if the actual user is discoverable somewhere.","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"e77784395ddfd687a2aaf497e123b697dcb90294","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":117,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":118,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":119,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":120,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":121,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_31ea6aad","line":120,"range":{"start_line":119,"start_character":41,"end_line":120,"end_character":53},"in_reply_to":"da4df55a_9fc9e3ae","updated":"2017-01-11 09:08:34.000000000","message":"Unfortunately no, because \"ploop init\" creates root.hds with RW only for root and we don\u0027t have permission to call os.chmod for this file\n\n-rw-r--r--   1 root root      787 Jan 10 17:07 DiskDescriptor.xml\n-rw-r--r--   1 root root        0 Jan 10 17:07 DiskDescriptor.xml.lck\n-rw-------   1 root root 14680064 Jan 10 17:07 root.hds","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ee80a5317520e7e045fef48a232a3ec1569228dc","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":117,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":118,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":119,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":120,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":121,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_9fc9e3ae","line":120,"range":{"start_line":119,"start_character":41,"end_line":120,"end_character":53},"in_reply_to":"da4df55a_bff5c7ed","updated":"2016-12-28 22:04:39.000000000","message":"Can we do something like this instead?\n\nhttps://github.com/openstack/nova/blob/a74d3ae4e815e3727961ef67bd801dada0267a0b/nova/virt/libvirt/driver.py#L1594","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"e77784395ddfd687a2aaf497e123b697dcb90294","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    execute(\u0027ploop\u0027, \u0027init\u0027, \u0027-s\u0027, size, \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":117,"context_line":"            disk_path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":118,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":119,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":120,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":121,"context_line":"    execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_1c99fd6e","line":120,"range":{"start_line":119,"start_character":41,"end_line":120,"end_character":53},"in_reply_to":"da4df55a_bff5c7ed","updated":"2017-01-11 09:08:34.000000000","message":"I think it\u0027s not necessary. Instance dir has READ for all\n$ ls /vz/stack/data/nova/instances/ -al\ndrwxrwxr-x 3 stack libvirtd 4096 Jan 10 13:22 c988a26a-339a-4500-bb0b-95bcb7d3a025\nand root disk also has READ for all\n$ ls /vz/stack/data/nova/instances/c988a26a-339a-4500-bb0b-95bcb7d3a025/ -al\ndrwxrwxr-x 2 stack libvirtd 4096 Jan 10 13:22 disk\nSo we can add READ permission for all users in case of epehemeral disk.\n\nHow to get current user:\nimport getpass\nusername \u003d getpass.getuser()","commit_id":"40135a448d3a605218947822214e0033a5ac6dc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4be9b08580633d8b04d9e3aa0bd25d7a47926b37","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from lxml import etree"},{"line_number":26,"context_line":"from os_brick.privileged import rootwrap as priv_rootwrap"},{"line_number":27,"context_line":"from oslo_concurrency import processutils"},{"line_number":28,"context_line":"from oslo_log import log as logging"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_89b2cc04","line":26,"updated":"2017-01-21 17:03:01.000000000","message":"This feels like a layer violation to be re-using the privsep stuff from os-brick here...I think I\u0027d like tonyb or someone closer to oslo.privsep to take a look at this.","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ee83d0d1a93c779f6d66fea9dc575343cac8db64","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from lxml import etree"},{"line_number":26,"context_line":"from os_brick.privileged import rootwrap as priv_rootwrap"},{"line_number":27,"context_line":"from oslo_concurrency import processutils"},{"line_number":28,"context_line":"from oslo_log import log as logging"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_96c64e66","line":26,"in_reply_to":"5a3905b3_89b2cc04","updated":"2017-01-23 09:25:13.000000000","message":"Yes, I agree. I\u0027d much rather this imported privsep directly.","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"1dc70179ae1b2a578daf84d40224859490c0f833","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from lxml import etree"},{"line_number":26,"context_line":"from os_brick.privileged import rootwrap as priv_rootwrap"},{"line_number":27,"context_line":"from oslo_concurrency import processutils"},{"line_number":28,"context_line":"from oslo_log import log as logging"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_3e42c368","line":26,"in_reply_to":"5a3905b3_96c64e66","updated":"2017-01-23 13:47:42.000000000","message":"as I can see we decided to use privsep from os_brick\nsee https://review.openstack.org/#/c/277670/\n\nif we want to import privsep directly, than we should modify \netc/nova/rootwrap.d/compute.filters","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4be9b08580633d8b04d9e3aa0bd25d7a47926b37","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                          \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":119,"context_line":"                          disk_path, run_as_root\u003dTrue)"},{"line_number":120,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":121,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":122,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":123,"context_line":"    priv_rootwrap.execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue)"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_49a384b2","line":121,"range":{"start_line":121,"start_character":41,"end_line":121,"end_character":50},"updated":"2017-01-21 17:03:01.000000000","message":"nit: OpenStack","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"76baa7e50c8f038f7b1c56a73c4ff5d04d536025","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                          \u0027-f\u0027, disk_format, \u0027-t\u0027, fs_type,"},{"line_number":119,"context_line":"                          disk_path, run_as_root\u003dTrue)"},{"line_number":120,"context_line":"    # Add read access for all users, because \"ploop init\" creates"},{"line_number":121,"context_line":"    # disk with rw rights only for root. Openstack user should have access"},{"line_number":122,"context_line":"    # to the disk to request info via \"qemu-img info\""},{"line_number":123,"context_line":"    priv_rootwrap.execute(\u0027chmod\u0027, \u0027-R\u0027, \u0027a+r\u0027, path, run_as_root\u003dTrue)"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_408897c5","line":121,"range":{"start_line":121,"start_character":41,"end_line":121,"end_character":50},"in_reply_to":"5a3905b3_49a384b2","updated":"2017-01-23 13:39:20.000000000","message":"done","commit_id":"f5698f6606daef0951e3572cd0bee6411c5e00ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f0f8ac33fbed1e83e7302dab335c844ce6782311","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    execute(*cmd)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":103,"context_line":"    \"\"\"Create ploop image"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param disk_format: Disk image format (as known by ploop)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_076ff0c5","line":102,"range":{"start_line":102,"start_character":48,"end_line":102,"end_character":55},"updated":"2017-01-26 15:48:36.000000000","message":"Maybe this should default to None?","commit_id":"b1d575f2ad1c2accc8e54a2ea631ef21ac86ad97"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"8a2a24bf9d515e70ab1612943681b0df8aad8d05","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    execute(*cmd)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def create_ploop_image(disk_format, path, size, fs_type):"},{"line_number":103,"context_line":"    \"\"\"Create ploop image"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param disk_format: Disk image format (as known by ploop)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_dee92d1c","line":102,"range":{"start_line":102,"start_character":48,"end_line":102,"end_character":55},"in_reply_to":"3a461143_076ff0c5","updated":"2017-01-26 17:19:08.000000000","message":"I\u0027ll do this in another patch with you suggestion\nnova/virt/libvirt/driver.py line 2889\n\n\"nit: I\u0027m pretty sure we have this same pattern in several places in this driver code, we should create a libvirt.utils helper method for this at some point, i.e. is_parallels(vm_mode\u003dNone).\"","commit_id":"b1d575f2ad1c2accc8e54a2ea631ef21ac86ad97"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f0f8ac33fbed1e83e7302dab335c844ce6782311","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                 with an optional suffix (\u0027K\u0027 for Kibibytes,"},{"line_number":111,"context_line":"                 M for Mebibytes, \u0027G\u0027 for Gibibytes, \u0027T\u0027 for Tebibytes)."},{"line_number":112,"context_line":"                 If no suffix is given, it will be interpreted as bytes."},{"line_number":113,"context_line":"    :param fs_type: Filesystem type"},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":"    if not fs_type:"},{"line_number":116,"context_line":"        fs_type \u003d CONF.default_ephemeral_format or \\"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_07a61010","line":113,"updated":"2017-01-26 15:48:36.000000000","message":"Could have more details on how we determine a default value if one isn\u0027t provided.","commit_id":"b1d575f2ad1c2accc8e54a2ea631ef21ac86ad97"},{"author":{"_account_id":15847,"name":"Mikhail Feoktistov","email":"mfeoktistov@virtuozzo.com","username":"mfeoktistov"},"change_message_id":"8a2a24bf9d515e70ab1612943681b0df8aad8d05","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                 with an optional suffix (\u0027K\u0027 for Kibibytes,"},{"line_number":111,"context_line":"                 M for Mebibytes, \u0027G\u0027 for Gibibytes, \u0027T\u0027 for Tebibytes)."},{"line_number":112,"context_line":"                 If no suffix is given, it will be interpreted as bytes."},{"line_number":113,"context_line":"    :param fs_type: Filesystem type"},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":"    if not fs_type:"},{"line_number":116,"context_line":"        fs_type \u003d CONF.default_ephemeral_format or \\"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_3ef791f6","line":113,"in_reply_to":"3a461143_07a61010","updated":"2017-01-26 17:19:08.000000000","message":"I\u0027ll do.","commit_id":"b1d575f2ad1c2accc8e54a2ea631ef21ac86ad97"}]}
