)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"33d49b91b4712cc132f374f7d84dfff5b30ef24b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: simplify logic of checking PCI device\u0027s existence"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Current logic of detecting a PCI device is a little complicated."},{"line_number":10,"context_line":"Let\u0027s swith to use xpath to make the check more straightforward."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1407915"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa81d914_47540421","line":10,"updated":"2015-01-28 23:28:57.000000000","message":"\"Let\u0027s switch to XPath to simplify this.\"","commit_id":"2bf3453c06fbfe5e7185dd9c04079a210a24f40b"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7d5f678a9aeace6cea3b6afe8fcaf2d28b49f330","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: simplify logic of checking PCI device\u0027s existence"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Current logic of detecting a PCI device is a little complicated."},{"line_number":10,"context_line":"Let\u0027s swith to use xpath to make the check more straightforward."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1407915"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa81d914_f1067ecd","line":10,"in_reply_to":"fa81d914_47540421","updated":"2015-01-29 12:26:40.000000000","message":"Done","commit_id":"2bf3453c06fbfe5e7185dd9c04079a210a24f40b"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"33d49b91b4712cc132f374f7d84dfff5b30ef24b","unresolved":false,"context_lines":[{"line_number":2841,"context_line":"                                                      dev\u003dpci_devs)"},{"line_number":2842,"context_line":"        try:"},{"line_number":2843,"context_line":"            for dev in pci_devs:"},{"line_number":2844,"context_line":"                guets_pci_device_config \u003d self._get_guest_pci_device(dev)"},{"line_number":2845,"context_line":"                dom.detachDeviceFlags(guets_pci_device_config.to_xml(),"},{"line_number":2846,"context_line":"                                      libvirt.VIR_DOMAIN_AFFECT_LIVE)"},{"line_number":2847,"context_line":"                # after detachDeviceFlags returned, we should check the dom to"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_c7163455","line":2844,"updated":"2015-01-28 23:28:57.000000000","message":"s/guets/guest/","commit_id":"2bf3453c06fbfe5e7185dd9c04079a210a24f40b"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7d5f678a9aeace6cea3b6afe8fcaf2d28b49f330","unresolved":false,"context_lines":[{"line_number":2841,"context_line":"                                                      dev\u003dpci_devs)"},{"line_number":2842,"context_line":"        try:"},{"line_number":2843,"context_line":"            for dev in pci_devs:"},{"line_number":2844,"context_line":"                guets_pci_device_config \u003d self._get_guest_pci_device(dev)"},{"line_number":2845,"context_line":"                dom.detachDeviceFlags(guets_pci_device_config.to_xml(),"},{"line_number":2846,"context_line":"                                      libvirt.VIR_DOMAIN_AFFECT_LIVE)"},{"line_number":2847,"context_line":"                # after detachDeviceFlags returned, we should check the dom to"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_5114aaf4","line":2844,"in_reply_to":"fa81d914_c7163455","updated":"2015-01-29 12:26:40.000000000","message":"Done","commit_id":"2bf3453c06fbfe5e7185dd9c04079a210a24f40b"},{"author":{"_account_id":5280,"name":"Nicolas Simonds","email":"nic@metacloud.com","username":"nicolas.simonds"},"change_message_id":"5549ad40dc27615f78302330f353db8c238caba0","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"                xml \u003d guest.get_xml_desc()"},{"line_number":2982,"context_line":"                xml_doc \u003d etree.fromstring(xml)"},{"line_number":2983,"context_line":""},{"line_number":2984,"context_line":"                domain \u003d \u00270x\u0027 + guest_pci_device_config.domain"},{"line_number":2985,"context_line":"                bus \u003d \u00270x\u0027 + guest_pci_device_config.bus"},{"line_number":2986,"context_line":"                slot \u003d \u00270x\u0027 + guest_pci_device_config.slot"},{"line_number":2987,"context_line":"                function \u003d \u00270x\u0027 + guest_pci_device_config.function"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_e41e8362","line":2984,"updated":"2015-07-21 15:53:48.000000000","message":"If the input is not a valid hex number, this will generate invalid input.\n\n    \"%#x\" % (numeric_value)\n\n...would get you the same thing, with input validation as a side effect.","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":5280,"name":"Nicolas Simonds","email":"nic@metacloud.com","username":"nicolas.simonds"},"change_message_id":"fbbabfe135bd9d63604402418d4f36d7f0b6226b","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"                xml \u003d guest.get_xml_desc()"},{"line_number":2982,"context_line":"                xml_doc \u003d etree.fromstring(xml)"},{"line_number":2983,"context_line":""},{"line_number":2984,"context_line":"                domain \u003d \u00270x\u0027 + guest_pci_device_config.domain"},{"line_number":2985,"context_line":"                bus \u003d \u00270x\u0027 + guest_pci_device_config.bus"},{"line_number":2986,"context_line":"                slot \u003d \u00270x\u0027 + guest_pci_device_config.slot"},{"line_number":2987,"context_line":"                function \u003d \u00270x\u0027 + guest_pci_device_config.function"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_1e633e43","line":2984,"in_reply_to":"3a50d1a3_56922a4d","updated":"2015-07-23 14:26:09.000000000","message":"Correct, which is why I suggested coercing it into a numeric type in my previous comment.  That\u0027s what I originally meant by \"input validation\".","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":5280,"name":"Nicolas Simonds","email":"nic@metacloud.com","username":"nicolas.simonds"},"change_message_id":"7e3e46509fca234d3c394af7a41603ae5a961291","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"                xml \u003d guest.get_xml_desc()"},{"line_number":2982,"context_line":"                xml_doc \u003d etree.fromstring(xml)"},{"line_number":2983,"context_line":""},{"line_number":2984,"context_line":"                domain \u003d \u00270x\u0027 + guest_pci_device_config.domain"},{"line_number":2985,"context_line":"                bus \u003d \u00270x\u0027 + guest_pci_device_config.bus"},{"line_number":2986,"context_line":"                slot \u003d \u00270x\u0027 + guest_pci_device_config.slot"},{"line_number":2987,"context_line":"                function \u003d \u00270x\u0027 + guest_pci_device_config.function"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_8dad2a86","line":2984,"in_reply_to":"3a50d1a3_594b722a","updated":"2015-07-22 14:28:28.000000000","message":"It\u0027s external input, so there\u0027s always risk of corruption; but I\u0027m sure things will go sideways before it ever hits this code path in that event.\n\nThis is likely fine, but I\u0027m of the mind that coercing them into numeric types and emitting them via string formatting is \"more correct\".  But I\u0027m no ideologue, and so long as it runs, I\u0027m fine with it.","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e26987579fb59d0628173731fe882bea168a7697","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"                xml \u003d guest.get_xml_desc()"},{"line_number":2982,"context_line":"                xml_doc \u003d etree.fromstring(xml)"},{"line_number":2983,"context_line":""},{"line_number":2984,"context_line":"                domain \u003d \u00270x\u0027 + guest_pci_device_config.domain"},{"line_number":2985,"context_line":"                bus \u003d \u00270x\u0027 + guest_pci_device_config.bus"},{"line_number":2986,"context_line":"                slot \u003d \u00270x\u0027 + guest_pci_device_config.slot"},{"line_number":2987,"context_line":"                function \u003d \u00270x\u0027 + guest_pci_device_config.function"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_56922a4d","line":2984,"in_reply_to":"3a50d1a3_8dad2a86","updated":"2015-07-23 05:47:35.000000000","message":"guest_pci_device_config.domain is  string type  in  class LibvirtConfigGuestHostdevPCI,\nsee https://github.com/openstack/nova/blob/master/nova/virt/libvirt/config.py#L1412\n  \"%#x\" % (numeric_value)  will get  type error with \u0027TypeError: %x format: a number is required, not str\u0027.","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"f91b3bff1061161c0b55115376f1dbc3dbe09e6c","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"                xml \u003d guest.get_xml_desc()"},{"line_number":2982,"context_line":"                xml_doc \u003d etree.fromstring(xml)"},{"line_number":2983,"context_line":""},{"line_number":2984,"context_line":"                domain \u003d \u00270x\u0027 + guest_pci_device_config.domain"},{"line_number":2985,"context_line":"                bus \u003d \u00270x\u0027 + guest_pci_device_config.bus"},{"line_number":2986,"context_line":"                slot \u003d \u00270x\u0027 + guest_pci_device_config.slot"},{"line_number":2987,"context_line":"                function \u003d \u00270x\u0027 + guest_pci_device_config.function"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_594b722a","line":2984,"in_reply_to":"3a50d1a3_e41e8362","updated":"2015-07-22 10:34:35.000000000","message":"these values from  an instance\u0027s config xml after attaching a pci device, I think they are always valid , right ?","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"00388c4cabd1632af41900392e77a56f11a241a8","unresolved":false,"context_lines":[{"line_number":2990,"context_line":"                         \"[@slot\u003d\u0027%s\u0027][@function\u003d\u0027%s\u0027]\")"},{"line_number":2991,"context_line":"                ret \u003d xml_doc.find(xpath % (domain, bus, slot, function))"},{"line_number":2992,"context_line":"                if ret is not None:"},{"line_number":2993,"context_line":"                    raise exception.PciDeviceDetachFailed(reason\u003d\"timeout\","},{"line_number":2994,"context_line":"                                                          dev\u003ddev)"},{"line_number":2995,"context_line":""},{"line_number":2996,"context_line":"        except libvirt.libvirtError as ex:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_afd8a154","line":2993,"updated":"2015-07-20 13:34:10.000000000","message":"unrelated but is the reason \"timeout\"? should this be \"not found\"?","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e26987579fb59d0628173731fe882bea168a7697","unresolved":false,"context_lines":[{"line_number":2990,"context_line":"                         \"[@slot\u003d\u0027%s\u0027][@function\u003d\u0027%s\u0027]\")"},{"line_number":2991,"context_line":"                ret \u003d xml_doc.find(xpath % (domain, bus, slot, function))"},{"line_number":2992,"context_line":"                if ret is not None:"},{"line_number":2993,"context_line":"                    raise exception.PciDeviceDetachFailed(reason\u003d\"timeout\","},{"line_number":2994,"context_line":"                                                          dev\u003ddev)"},{"line_number":2995,"context_line":""},{"line_number":2996,"context_line":"        except libvirt.libvirtError as ex:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_96ac328d","line":2993,"in_reply_to":"3a50d1a3_afd8a154","updated":"2015-07-23 05:47:35.000000000","message":"will change to \"no found\" in next patchset.","commit_id":"ee7e80fbaa4819b0b5e8d33706064d94f0aab475"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1cfb790001b218d0227082b1ad28eb28bb648499","unresolved":false,"context_lines":[{"line_number":2970,"context_line":"                         \"[@managed]/source/address[@domain\u003d\u0027%s\u0027][@bus\u003d\u0027%s\u0027]\""},{"line_number":2971,"context_line":"                         \"[@slot\u003d\u0027%s\u0027][@function\u003d\u0027%s\u0027]\")"},{"line_number":2972,"context_line":"                ret \u003d xml_doc.find(xpath % (domain, bus, slot, function))"},{"line_number":2973,"context_line":"                if ret is not None:"},{"line_number":2974,"context_line":"                    raise exception.PciDeviceDetachFailed(reason\u003d\"not found\","},{"line_number":2975,"context_line":"                                                          dev\u003ddev)"},{"line_number":2976,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_c2de986c","line":2973,"updated":"2015-07-28 15:35:25.000000000","message":"Our goal is to *never* make use of XML or XPATH anywhere in driver.py - we are converting everything to use the nova.virt.libvirt.config classes, so this is a step in the wrong direction.","commit_id":"137ae95f477b36163cf329214ddf9fa3d8fb087f"}]}
