)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9c1552925983b0da3ffd70cc02da61c2468aeca","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"This change introduces the StoragePolicy object, which is a new"},{"line_number":30,"context_line":"canonical source for an instance\u0027s disks. It exposes the disk"},{"line_number":31,"context_line":"iteration of _create_iteration in its methods. Additionally, instead"},{"line_number":32,"context_line":"of returning an Image object it returns a DiskCreationProxy object."},{"line_number":33,"context_line":"This object wraps the Image and adds an addition method, create(),"},{"line_number":34,"context_line":"taking no arguments. This means that the caller can iterate over disks"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a71b18c_540eda32","line":31,"updated":"2016-12-08 21:49:27.000000000","message":"\"It exposes the disk iteration of _create_iteration in its methods\" does sound exceedingly weird... perhaps reword that?","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9c1552925983b0da3ffd70cc02da61c2468aeca","unresolved":false,"context_lines":[{"line_number":30,"context_line":"canonical source for an instance\u0027s disks. It exposes the disk"},{"line_number":31,"context_line":"iteration of _create_iteration in its methods. Additionally, instead"},{"line_number":32,"context_line":"of returning an Image object it returns a DiskCreationProxy object."},{"line_number":33,"context_line":"This object wraps the Image and adds an addition method, create(),"},{"line_number":34,"context_line":"taking no arguments. This means that the caller can iterate over disks"},{"line_number":35,"context_line":"in a manner consistent with _create_image without creating them if"},{"line_number":36,"context_line":"that isn\u0027t required. This change is required for finish_migration()."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a71b18c_142382a8","line":33,"updated":"2016-12-08 21:49:27.000000000","message":"s/addition/additional/","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9c1552925983b0da3ffd70cc02da61c2468aeca","unresolved":false,"context_lines":[{"line_number":46,"context_line":"  in place of mox, but are otherwise identical."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"* We now create config disk, kernel, and ramdisk as \u0027flat\u0027 instead of"},{"line_number":49,"context_line":"  \u0027raw\u0027. These are completely equivalent."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The lack of changes in test_driver means that we are continuing to"},{"line_number":52,"context_line":"test calls all the way down to imagebackend.Image.cache, which give us"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a71b18c_543c1abf","line":49,"updated":"2016-12-08 21:49:27.000000000","message":"if they are equivalent, why do we have both? just curious.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"41a82d53e3fd6ae22a703b7b6674915347a96371","unresolved":false,"context_lines":[{"line_number":6610,"context_line":"        if not disk_info:"},{"line_number":6611,"context_line":"            disk_info \u003d []"},{"line_number":6612,"context_line":""},{"line_number":6613,"context_line":"        for info in disk_info:"},{"line_number":6614,"context_line":"            base \u003d os.path.basename(info[\u0027path\u0027])"},{"line_number":6615,"context_line":"            # Get image type and create empty disk image, and"},{"line_number":6616,"context_line":"            # create backing file in case of qcow2."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_bf7ba57a","line":6613,"updated":"2016-12-08 13:13:12.000000000","message":"Could we here use storagepolicy like in _create_image?","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"82ff98cf4716382ae55268c2945d34ca6c7004bb","unresolved":false,"context_lines":[{"line_number":6610,"context_line":"        if not disk_info:"},{"line_number":6611,"context_line":"            disk_info \u003d []"},{"line_number":6612,"context_line":""},{"line_number":6613,"context_line":"        for info in disk_info:"},{"line_number":6614,"context_line":"            base \u003d os.path.basename(info[\u0027path\u0027])"},{"line_number":6615,"context_line":"            # Get image type and create empty disk image, and"},{"line_number":6616,"context_line":"            # create backing file in case of qcow2."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_4a8d6e7a","line":6613,"in_reply_to":"3a71b18c_bf7ba57a","updated":"2016-12-08 17:17:16.000000000","message":"Yep. Change Ic7b3058f :)","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"308a6294a677ae8788473560033965fdcd3cbce4","unresolved":false,"context_lines":[{"line_number":2988,"context_line":""},{"line_number":2989,"context_line":"        self._create_and_inject_local_root(instance, policy, injection_info)"},{"line_number":2990,"context_line":""},{"line_number":2991,"context_line":"        non_root_disks \u003d itertools.chain(policy.external_boot(),"},{"line_number":2992,"context_line":"                                         policy.ephemerals())"},{"line_number":2993,"context_line":"        swap_disk \u003d policy.swap()"},{"line_number":2994,"context_line":"        if swap_disk is not None:"},{"line_number":2995,"context_line":"            non_root_disks \u003d list(non_root_disks)"},{"line_number":2996,"context_line":"            non_root_disks.append(swap_disk)"},{"line_number":2997,"context_line":"        for disk in non_root_disks:"},{"line_number":2998,"context_line":"            disk.create()"},{"line_number":2999,"context_line":""},{"line_number":3000,"context_line":"    def _create_and_inject_local_root(self, instance, policy,"},{"line_number":3001,"context_line":"                                      injection_info\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_87b0ff8c","line":2998,"range":{"start_line":2991,"start_character":0,"end_line":2998,"end_character":25},"updated":"2017-01-11 15:07:50.000000000","message":"Why not to place all such stuff into storage policy\u0027s methods?","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"e69eda96da1f1087553ab0732e60dda839d2cff9","unresolved":false,"context_lines":[{"line_number":2988,"context_line":""},{"line_number":2989,"context_line":"        self._create_and_inject_local_root(instance, policy, injection_info)"},{"line_number":2990,"context_line":""},{"line_number":2991,"context_line":"        non_root_disks \u003d itertools.chain(policy.external_boot(),"},{"line_number":2992,"context_line":"                                         policy.ephemerals())"},{"line_number":2993,"context_line":"        swap_disk \u003d policy.swap()"},{"line_number":2994,"context_line":"        if swap_disk is not None:"},{"line_number":2995,"context_line":"            non_root_disks \u003d list(non_root_disks)"},{"line_number":2996,"context_line":"            non_root_disks.append(swap_disk)"},{"line_number":2997,"context_line":"        for disk in non_root_disks:"},{"line_number":2998,"context_line":"            disk.create()"},{"line_number":2999,"context_line":""},{"line_number":3000,"context_line":"    def _create_and_inject_local_root(self, instance, policy,"},{"line_number":3001,"context_line":"                                      injection_info\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a30ddce_ccebf176","line":2998,"range":{"start_line":2991,"start_character":0,"end_line":2998,"end_character":25},"in_reply_to":"ba2be162_07fd373a","updated":"2017-03-09 18:13:53.000000000","message":"Looking through the series i found enough such code to see that it does not look easy readable. It operates with StoragePolicy\u0027s properties which are initialized there and here we can guess only what they mean (e.g. external_boot). StoragePolicy knows all about disks, what kinds of disks exists, what disks are used by instance, etc. It would be consistent to move such operations into that class as well. Or at least to add an iterator over disks there and to use it here.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"1a6470b34a23d2c4305c6195505499d40fcb6adb","unresolved":false,"context_lines":[{"line_number":2988,"context_line":""},{"line_number":2989,"context_line":"        self._create_and_inject_local_root(instance, policy, injection_info)"},{"line_number":2990,"context_line":""},{"line_number":2991,"context_line":"        non_root_disks \u003d itertools.chain(policy.external_boot(),"},{"line_number":2992,"context_line":"                                         policy.ephemerals())"},{"line_number":2993,"context_line":"        swap_disk \u003d policy.swap()"},{"line_number":2994,"context_line":"        if swap_disk is not None:"},{"line_number":2995,"context_line":"            non_root_disks \u003d list(non_root_disks)"},{"line_number":2996,"context_line":"            non_root_disks.append(swap_disk)"},{"line_number":2997,"context_line":"        for disk in non_root_disks:"},{"line_number":2998,"context_line":"            disk.create()"},{"line_number":2999,"context_line":""},{"line_number":3000,"context_line":"    def _create_and_inject_local_root(self, instance, policy,"},{"line_number":3001,"context_line":"                                      injection_info\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_07fd373a","line":2998,"range":{"start_line":2991,"start_character":0,"end_line":2998,"end_character":25},"in_reply_to":"ba5201f7_87b0ff8c","updated":"2017-03-01 16:34:40.000000000","message":"Could do. I\u0027ll let that emerge as a useful set, though. In the first instance I\u0027m not concerned about a little bit of duplication.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"308a6294a677ae8788473560033965fdcd3cbce4","unresolved":false,"context_lines":[{"line_number":3020,"context_line":"                root_disk.create_snap(libvirt_utils.RESIZE_SNAPSHOT_NAME)"},{"line_number":3021,"context_line":""},{"line_number":3022,"context_line":"            root_disk.create()"},{"line_number":3023,"context_line":"            if CONF.libvirt.virt_type \u003d\u003d \u0027uml\u0027:"},{"line_number":3024,"context_line":"                libvirt_utils.chown(root_disk.path, \u0027root\u0027)"},{"line_number":3025,"context_line":""},{"line_number":3026,"context_line":"            if need_inject:"},{"line_number":3027,"context_line":"                self._inject_data(root_disk, instance, injection_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_07040f7c","line":3024,"range":{"start_line":3023,"start_character":0,"end_line":3024,"end_character":59},"updated":"2017-01-11 15:07:50.000000000","message":"Now it\u0027s called _after_ root disk creating which looks correct. Previously, before _create_and_inject_local_root was created, it was called _after_ root disk creating as well. It seems the fact that it\u0027s called _before_ root disk creating in master is a bug. I\u0027m wondering why it has not been found.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"1a6470b34a23d2c4305c6195505499d40fcb6adb","unresolved":false,"context_lines":[{"line_number":3020,"context_line":"                root_disk.create_snap(libvirt_utils.RESIZE_SNAPSHOT_NAME)"},{"line_number":3021,"context_line":""},{"line_number":3022,"context_line":"            root_disk.create()"},{"line_number":3023,"context_line":"            if CONF.libvirt.virt_type \u003d\u003d \u0027uml\u0027:"},{"line_number":3024,"context_line":"                libvirt_utils.chown(root_disk.path, \u0027root\u0027)"},{"line_number":3025,"context_line":""},{"line_number":3026,"context_line":"            if need_inject:"},{"line_number":3027,"context_line":"                self._inject_data(root_disk, instance, injection_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_a73aab34","line":3024,"range":{"start_line":3023,"start_character":0,"end_line":3024,"end_character":59},"in_reply_to":"ba5201f7_07040f7c","updated":"2017-03-01 16:34:40.000000000","message":"Probably nobody uses it.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"308a6294a677ae8788473560033965fdcd3cbce4","unresolved":false,"context_lines":[{"line_number":7208,"context_line":"            # use_cow_images\u003dTrue (see"},{"line_number":7209,"context_line":"            # storagepolicy.get_disk_config_image_type),so don\u0027t"},{"line_number":7210,"context_line":"            # need to be converted."},{"line_number":7211,"context_line":"            if (disk_name !\u003d \u0027disk.config\u0027 and"},{"line_number":7212,"context_line":"                        info[\u0027type\u0027] \u003d\u003d \u0027raw\u0027 and CONF.use_cow_images):"},{"line_number":7213,"context_line":"                self._disk_raw_to_qcow2(info[\u0027path\u0027])"},{"line_number":7214,"context_line":""},{"line_number":7215,"context_line":"        block_disk_info \u003d policy.libvirt_disk_info"},{"line_number":7216,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_c2903598","line":7213,"range":{"start_line":7211,"start_character":0,"end_line":7213,"end_character":53},"updated":"2017-01-11 15:07:50.000000000","message":"Probably the right location of this is somewhere inside storage policy as well.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"1a6470b34a23d2c4305c6195505499d40fcb6adb","unresolved":false,"context_lines":[{"line_number":7208,"context_line":"            # use_cow_images\u003dTrue (see"},{"line_number":7209,"context_line":"            # storagepolicy.get_disk_config_image_type),so don\u0027t"},{"line_number":7210,"context_line":"            # need to be converted."},{"line_number":7211,"context_line":"            if (disk_name !\u003d \u0027disk.config\u0027 and"},{"line_number":7212,"context_line":"                        info[\u0027type\u0027] \u003d\u003d \u0027raw\u0027 and CONF.use_cow_images):"},{"line_number":7213,"context_line":"                self._disk_raw_to_qcow2(info[\u0027path\u0027])"},{"line_number":7214,"context_line":""},{"line_number":7215,"context_line":"        block_disk_info \u003d policy.libvirt_disk_info"},{"line_number":7216,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_e76ae319","line":7213,"range":{"start_line":7211,"start_character":0,"end_line":7213,"end_character":53},"in_reply_to":"ba5201f7_c2903598","updated":"2017-03-01 16:34:40.000000000","message":"The right location for this is in the bin (see big comment above). This is a hack I don\u0027t want to address here.","commit_id":"02b1a85b2c581e0823eff34957eddd84e5d61515"}],"nova/virt/libvirt/storagepolicy.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9c1552925983b0da3ffd70cc02da61c2468aeca","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                         is not already in the image cache."},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        ephemeral_gb \u003d size / units.Gi"},{"line_number":195,"context_line":"        kwargs \u003d {"},{"line_number":196,"context_line":"            \u0027ephemeral_size\u0027: ephemeral_gb,"},{"line_number":197,"context_line":"            \u0027fs_label\u0027: \u0027ephemeral%i\u0027 % index,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_34a31ea0","line":194,"updated":"2016-12-08 21:49:27.000000000","message":"This is causing the failure in the unit tests. Wrap this with an int() conversion to avoid passing a float in th ephemeral_size kwarg below.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9c1552925983b0da3ffd70cc02da61c2468aeca","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    def libvirt_disk_mapping(self):"},{"line_number":305,"context_line":"        return self.libvirt_disk_info[\u0027mapping\u0027]"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def _cached(self, name, generator):"},{"line_number":308,"context_line":"        if name not in self._disk_cache:"},{"line_number":309,"context_line":"            self._disk_cache[name] \u003d generator()"},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_d462ea3c","line":307,"updated":"2016-12-08 21:49:27.000000000","message":"Protect the _disk_cache member attribute with a mutex otherwise multiple threads/greenlets might get incorrect reads from the cache.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2254717509cdc50433385c5964dafc69cf3224df","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    def libvirt_disk_mapping(self):"},{"line_number":305,"context_line":"        return self.libvirt_disk_info[\u0027mapping\u0027]"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def _cached(self, name, generator):"},{"line_number":308,"context_line":"        if name not in self._disk_cache:"},{"line_number":309,"context_line":"            self._disk_cache[name] \u003d generator()"},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_9a2c094c","line":307,"in_reply_to":"3a71b18c_d462ea3c","updated":"2016-12-09 09:49:12.000000000","message":"What was I thinking? This is glaringly obvious.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"41a82d53e3fd6ae22a703b7b6674915347a96371","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def _gen():"},{"line_number":332,"context_line":"            name \u003d \u0027kernel\u0027"},{"line_number":333,"context_line":"            if self.rescue:"},{"line_number":334,"context_line":"                name +\u003d \u0027.rescue\u0027"},{"line_number":335,"context_line":"                image_id \u003d self.rescue_images.get(\u0027kernel_id\u0027)"},{"line_number":336,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_d113f50b","line":333,"updated":"2016-12-08 13:13:12.000000000","message":"It probably would be better to have something like RescueStoragePolicy class for all such things.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"82ff98cf4716382ae55268c2945d34ca6c7004bb","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def _gen():"},{"line_number":332,"context_line":"            name \u003d \u0027kernel\u0027"},{"line_number":333,"context_line":"            if self.rescue:"},{"line_number":334,"context_line":"                name +\u003d \u0027.rescue\u0027"},{"line_number":335,"context_line":"                image_id \u003d self.rescue_images.get(\u0027kernel_id\u0027)"},{"line_number":336,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_1192be4b","line":333,"in_reply_to":"3a71b18c_d113f50b","updated":"2016-12-08 17:17:16.000000000","message":"I did actually originally think there might be more than one StoragePolicy. I\u0027m not clear in my own head where that\u0027s going yet, though, so my preference is to keep it simple initially. I\u0027m comfortable that this is at least a better foundation for future improvements.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"41a82d53e3fd6ae22a703b7b6674915347a96371","unresolved":false,"context_lines":[{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        return self._cached(name, _gen)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def config_disk(self):"},{"line_number":512,"context_line":"        \"\"\"Return a config disk for this instance if it has one."},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        :return: A config disk, or None if the instance doesn\u0027t have one."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_a7d0fbca","line":511,"updated":"2016-12-08 13:13:12.000000000","message":"It returns not an object of DiskCreationProxy class, and the result is checked for None only. Doesn\u0027t seem to be finished.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"82ff98cf4716382ae55268c2945d34ca6c7004bb","unresolved":false,"context_lines":[{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        return self._cached(name, _gen)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def config_disk(self):"},{"line_number":512,"context_line":"        \"\"\"Return a config disk for this instance if it has one."},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        :return: A config disk, or None if the instance doesn\u0027t have one."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_914faebd","line":511,"in_reply_to":"3a71b18c_a7d0fbca","updated":"2016-12-08 17:17:16.000000000","message":"That\u0027s because.... we can\u0027t create config disks like that yet. I intend to implement it with create_from_func, but before I can do that I need to teach the Rbd and Flat backends not to use the image cache, which means that both their non-cache() backends have to have landed first.\n\nThis is on the TODO list.","commit_id":"83549ea211bf8c1805864e7b2c00ec6f5dc68e3a"}]}
