)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"5f1c869f8a66c5a215389e2180057959555a0cff","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mitsuhiro Tanino \u003cmitsuhiro.tanino@hds.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-01 12:26:01 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"libvirt: Handle mismatch of volume information between BDM and domain XML"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There is a case that the volume information is deleted from BDM"},{"line_number":10,"context_line":"but the information remains on domain XML of Libvirt when user"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"da20952f_a796044a","line":7,"updated":"2015-09-04 20:17:12.000000000","message":"first line should be limited to 50 characters","commit_id":"f1d0ed62673b62bdad69025289062a76d875c2e2"}],"nova/compute/utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"561538125a6b9379fbf9815c673cee68e017a9bb","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    #       but the information remains on domain XML of Libvirt when user"},{"line_number":174,"context_line":"    #       detaches a volume from an instance if OS is hang up and so on."},{"line_number":175,"context_line":"    #       In this case, we should skip the drive letter of remaining device."},{"line_number":176,"context_line":"    if is_libvirt:"},{"line_number":177,"context_line":"        for device in disk_devices:"},{"line_number":178,"context_line":"            if device[\u0027disk_device\u0027] \u003d\u003d \u0027disk\u0027:"},{"line_number":179,"context_line":"                letter \u003d block_device.get_device_letter(device[\u0027target_dev\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_c57e51e3","line":176,"updated":"2015-05-31 12:45:44.000000000","message":"should this not be:\nif is_libvirt and disk_devices:\n\nor \n\nif is_libvirt:\n   if disk_devices is None:\n        disk_devices \u003d []","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"561538125a6b9379fbf9815c673cee68e017a9bb","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    #       detaches a volume from an instance if OS is hang up and so on."},{"line_number":175,"context_line":"    #       In this case, we should skip the drive letter of remaining device."},{"line_number":176,"context_line":"    if is_libvirt:"},{"line_number":177,"context_line":"        for device in disk_devices:"},{"line_number":178,"context_line":"            if device[\u0027disk_device\u0027] \u003d\u003d \u0027disk\u0027:"},{"line_number":179,"context_line":"                letter \u003d block_device.get_device_letter(device[\u0027target_dev\u0027])"},{"line_number":180,"context_line":"                used_letters.add(letter)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_8584d9d2","line":177,"updated":"2015-05-31 12:45:44.000000000","message":"if the disk_devices is None then you will get:\nTypeError: \u0027NoneType\u0027 object is not iterable","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"968b1c70e04431b260ac83a5025d67dd1120914a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    #       detaches a volume from an instance if OS is hang up and so on."},{"line_number":175,"context_line":"    #       In this case, we should skip the drive letter of remaining device."},{"line_number":176,"context_line":"    if is_libvirt:"},{"line_number":177,"context_line":"        for device in disk_devices:"},{"line_number":178,"context_line":"            if device[\u0027disk_device\u0027] \u003d\u003d \u0027disk\u0027:"},{"line_number":179,"context_line":"                letter \u003d block_device.get_device_letter(device[\u0027target_dev\u0027])"},{"line_number":180,"context_line":"                used_letters.add(letter)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_82895671","line":177,"in_reply_to":"7a016987_8584d9d2","updated":"2015-06-01 15:23:04.000000000","message":"I understand. We should check before iteration.","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f7e9323cf436b6b51b23b3546d6eb3b332da8c6a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    name will be converted to the appropriate format."},{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":"    is_xen \u003d driver.compute_driver_matches(\u0027xenapi.XenAPIDriver\u0027)"},{"line_number":138,"context_line":"    is_libvirt \u003d driver.compute_driver_matches(\u0027libvirt.LibvirtDriver\u0027)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    req_prefix \u003d None"},{"line_number":141,"context_line":"    req_letter \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"5afe65bd_d4624aad","line":138,"updated":"2015-06-01 17:30:35.000000000","message":"Having to add yet more hypervisor specific code to this method is really a sign that we\u0027re taking the wrong approach here. We need to keep this code hypervisor agnostic.","commit_id":"f1d0ed62673b62bdad69025289062a76d875c2e2"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"52cbf296fe0cc8d7249fabde96d9d98fd94048bb","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    name will be converted to the appropriate format."},{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":"    is_xen \u003d driver.compute_driver_matches(\u0027xenapi.XenAPIDriver\u0027)"},{"line_number":138,"context_line":"    is_libvirt \u003d driver.compute_driver_matches(\u0027libvirt.LibvirtDriver\u0027)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    req_prefix \u003d None"},{"line_number":141,"context_line":"    req_letter \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"5afe65bd_9ace39b3","line":138,"in_reply_to":"5afe65bd_d4624aad","updated":"2015-06-01 18:28:56.000000000","message":"I understand. Let me try to propose another approach.","commit_id":"f1d0ed62673b62bdad69025289062a76d875c2e2"}],"nova/virt/driver.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"561538125a6b9379fbf9815c673cee68e017a9bb","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        \"\"\""},{"line_number":839,"context_line":"        raise NotImplementedError()"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def get_instance_disk_devices(self, instance):"},{"line_number":842,"context_line":"        \"\"\"Retrieve information about actual disk devices of an instance."},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"        :param instance: nova.objects.Instance"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_6570bd0b","line":841,"updated":"2015-05-31 12:45:44.000000000","message":"this requires a DocImpact in the commit message for a new virt API.\n\nAny reason why the BDM is not the source of truth?","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"968b1c70e04431b260ac83a5025d67dd1120914a","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        \"\"\""},{"line_number":839,"context_line":"        raise NotImplementedError()"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def get_instance_disk_devices(self, instance):"},{"line_number":842,"context_line":"        \"\"\"Retrieve information about actual disk devices of an instance."},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"        :param instance: nova.objects.Instance"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_220aa279","line":841,"in_reply_to":"7a016987_6570bd0b","updated":"2015-06-01 15:23:04.000000000","message":"I understand. I will add DocImpact flag.\n\nAs I explained on the commit message, there is a case that the volume information is deleted from BDM but the information remains on domain XML of Libvirt when user detaches a volume from an instance if OS is hang up and so on.\n\nSince the root cause of this problem is inconsistency between BDM and domain XML, we can\u0027t use BDM, therefore I added this method to gather disk device information from domain XML directly.","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f7e9323cf436b6b51b23b3546d6eb3b332da8c6a","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                   \u0027device_type\u0027:\u0027disk\u0027,"},{"line_number":851,"context_line":"                   \u0027target_dev\u0027:\u0027vdb\u0027,"},{"line_number":852,"context_line":"                   \u0027target_bus\u0027:\u0027virtio\u0027}"},{"line_number":853,"context_line":"                   ...]\""},{"line_number":854,"context_line":"        \"\"\""},{"line_number":855,"context_line":"        raise NotImplementedError()"},{"line_number":856,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5afe65bd_94b852e7","line":853,"updated":"2015-06-01 17:30:35.000000000","message":"Returning JSON from any of the virt driver APIs has generally proved to be an awful idea for maintainability. If we need to return complex data, then we should have either a python class defined for the return data, or a full nova object, depending on needs of the caller. See for example, get_diagnostics which returned JSON, is deprecated and replaced by get_instance_diagnostic which returns a nova.virt.diagnostics.Diagnostics object instance.","commit_id":"f1d0ed62673b62bdad69025289062a76d875c2e2"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"52cbf296fe0cc8d7249fabde96d9d98fd94048bb","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                   \u0027device_type\u0027:\u0027disk\u0027,"},{"line_number":851,"context_line":"                   \u0027target_dev\u0027:\u0027vdb\u0027,"},{"line_number":852,"context_line":"                   \u0027target_bus\u0027:\u0027virtio\u0027}"},{"line_number":853,"context_line":"                   ...]\""},{"line_number":854,"context_line":"        \"\"\""},{"line_number":855,"context_line":"        raise NotImplementedError()"},{"line_number":856,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5afe65bd_7addbd6f","line":853,"in_reply_to":"5afe65bd_94b852e7","updated":"2015-06-01 18:28:56.000000000","message":"Thank you for letting me know the reference.","commit_id":"f1d0ed62673b62bdad69025289062a76d875c2e2"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"561538125a6b9379fbf9815c673cee68e017a9bb","unresolved":false,"context_lines":[{"line_number":6123,"context_line":"            xml \u003d dom.XMLDesc(0)"},{"line_number":6124,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":6125,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":6126,"context_line":"            msg \u003d (_(\u0027Error from libvirt while getting description of \u0027"},{"line_number":6127,"context_line":"                     \u0027%(instance_name)s: [Error Code %(error_code)s] \u0027"},{"line_number":6128,"context_line":"                     \u0027%(ex)s\u0027) %"},{"line_number":6129,"context_line":"                   {\u0027instance_name\u0027: instance.name,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_0571090c","line":6126,"updated":"2015-05-31 12:45:44.000000000","message":"this should _LW","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"968b1c70e04431b260ac83a5025d67dd1120914a","unresolved":false,"context_lines":[{"line_number":6123,"context_line":"            xml \u003d dom.XMLDesc(0)"},{"line_number":6124,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":6125,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":6126,"context_line":"            msg \u003d (_(\u0027Error from libvirt while getting description of \u0027"},{"line_number":6127,"context_line":"                     \u0027%(instance_name)s: [Error Code %(error_code)s] \u0027"},{"line_number":6128,"context_line":"                     \u0027%(ex)s\u0027) %"},{"line_number":6129,"context_line":"                   {\u0027instance_name\u0027: instance.name,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_62d2da5d","line":6126,"in_reply_to":"7a016987_0571090c","updated":"2015-06-01 15:23:04.000000000","message":"Will fix.","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"561538125a6b9379fbf9815c673cee68e017a9bb","unresolved":false,"context_lines":[{"line_number":6130,"context_line":"                    \u0027error_code\u0027: error_code,"},{"line_number":6131,"context_line":"                    \u0027ex\u0027: ex})"},{"line_number":6132,"context_line":"            LOG.warn(msg)"},{"line_number":6133,"context_line":"            raise exception.InstanceNotFound(instance_id\u003dinstance.name)"},{"line_number":6134,"context_line":""},{"line_number":6135,"context_line":"        disk_info \u003d []"},{"line_number":6136,"context_line":"        doc \u003d etree.fromstring(xml)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_c5653145","line":6133,"updated":"2015-05-31 12:45:44.000000000","message":"instance.name is not really useful as the instane name is not unique. This should be instance.uuid","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"968b1c70e04431b260ac83a5025d67dd1120914a","unresolved":false,"context_lines":[{"line_number":6130,"context_line":"                    \u0027error_code\u0027: error_code,"},{"line_number":6131,"context_line":"                    \u0027ex\u0027: ex})"},{"line_number":6132,"context_line":"            LOG.warn(msg)"},{"line_number":6133,"context_line":"            raise exception.InstanceNotFound(instance_id\u003dinstance.name)"},{"line_number":6134,"context_line":""},{"line_number":6135,"context_line":"        disk_info \u003d []"},{"line_number":6136,"context_line":"        doc \u003d etree.fromstring(xml)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_423c7e92","line":6133,"in_reply_to":"7a016987_c5653145","updated":"2015-06-01 15:23:04.000000000","message":"Will fix.","commit_id":"c233f8f6e248915000f72f0ae03cde35ca91dbc6"}]}
