)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":12,"context_line":"This patch enable perf event when create instances, the perf event"},{"line_number":13,"context_line":"data can be collected by Ceilometer or other external monitor system."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implement blueprint: support-perf-event"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3aaa91ec_5bb63a8b","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":9},"updated":"2016-06-22 01:47:41.000000000","message":"What is the doc impact? If it\u0027s just that this exists now, then let\u0027s remove it because this creates a bug. The release note will suffice for advertising this unless it\u0027s something that needs to be in the openstack manuals.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":12,"context_line":"This patch enable perf event when create instances, the perf event"},{"line_number":13,"context_line":"data can be collected by Ceilometer or other external monitor system."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implement blueprint: support-perf-event"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3aaa91ec_7e6a041c","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":9},"in_reply_to":"3aaa91ec_5bb63a8b","updated":"2016-06-22 07:54:49.000000000","message":"Because I add a new configure option of libvirt, if release note is suffice, I will remove this flag.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"}],"nova/conf/libvirt.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                    \u0027that scheduling priority. Priority depends on the host \u0027"},{"line_number":219,"context_line":"                    \u0027kernel (usually 1-99)\u0027),"},{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d\u0027A event list which could be used as monitor, for example:\u0027"},{"line_number":223,"context_line":"               \u0027supported event could be cmt, mbml, mbmt\u0027),"},{"line_number":224,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_fe6274ac","line":221,"updated":"2016-06-22 01:47:41.000000000","message":"Seems we should have a whitelist of choices here.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                    \u0027that scheduling priority. Priority depends on the host \u0027"},{"line_number":219,"context_line":"                    \u0027kernel (usually 1-99)\u0027),"},{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d\u0027A event list which could be used as monitor, for example:\u0027"},{"line_number":223,"context_line":"               \u0027supported event could be cmt, mbml, mbmt\u0027),"},{"line_number":224,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_8a95ea41","line":221,"in_reply_to":"3aaa91ec_d41dd767","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d93d185612af32dd68839d67a24c5c32e1ca34f0","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                    \u0027that scheduling priority. Priority depends on the host \u0027"},{"line_number":219,"context_line":"                    \u0027kernel (usually 1-99)\u0027),"},{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d\u0027A event list which could be used as monitor, for example:\u0027"},{"line_number":223,"context_line":"               \u0027supported event could be cmt, mbml, mbmt\u0027),"},{"line_number":224,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_d41dd767","line":221,"in_reply_to":"3aaa91ec_fe6274ac","updated":"2016-06-22 02:12:24.000000000","message":"After talking in IRC I guess I had this confused, the mapping isn\u0027t for this, but if what\u0027s specified isn\u0027t in libvirt we\u0027ll log a warning and ignore it, which is probably fine. We should unit test that though.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                    \u0027kernel (usually 1-99)\u0027),"},{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d\u0027A event list which could be used as monitor, for example:\u0027"},{"line_number":223,"context_line":"               \u0027supported event could be cmt, mbml, mbmt\u0027),"},{"line_number":224,"context_line":"]"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_3b408e56","line":222,"updated":"2016-06-22 01:47:41.000000000","message":"Please use the standard full config option help template we have now, like listing which services use this, any restrictions, like minimum libvirt, etc.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                    \u0027kernel (usually 1-99)\u0027),"},{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d\u0027A event list which could be used as monitor, for example:\u0027"},{"line_number":223,"context_line":"               \u0027supported event could be cmt, mbml, mbmt\u0027),"},{"line_number":224,"context_line":"]"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_6a923e59","line":222,"in_reply_to":"3aaa91ec_3b408e56","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d \"\"\""},{"line_number":223,"context_line":"This is a perf event list which could be used as monitor. These events"},{"line_number":224,"context_line":"will be passed to libvirt domain xml while creating a new instances."},{"line_number":225,"context_line":"Then event statistics data can be collected from libvirt.  The minimum"},{"line_number":226,"context_line":"libvirt version is 1.3.3."}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_7f543efe","line":223,"range":{"start_line":223,"start_character":10,"end_line":223,"end_character":14},"updated":"2016-06-24 00:44:55.000000000","message":"nit: s/perf/performance/ for clarity in help docs.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    cfg.ListOpt(\u0027enabled_perf_events\u0027,"},{"line_number":221,"context_line":"               default\u003d[],"},{"line_number":222,"context_line":"               help\u003d \"\"\""},{"line_number":223,"context_line":"This is a perf event list which could be used as monitor. These events"},{"line_number":224,"context_line":"will be passed to libvirt domain xml while creating a new instances."},{"line_number":225,"context_line":"Then event statistics data can be collected from libvirt.  The minimum"},{"line_number":226,"context_line":"libvirt version is 1.3.3."}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_1ad428ea","line":223,"range":{"start_line":223,"start_character":10,"end_line":223,"end_character":14},"in_reply_to":"3aaa91ec_7f543efe","updated":"2016-06-24 03:01:20.000000000","message":"Done","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"* Possible values:"},{"line_number":229,"context_line":"    A string list."},{"line_number":230,"context_line":"    for example:"},{"line_number":231,"context_line":"    ``enabled_perf_events \u003d cmt, mbml, mbmt``"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    The supported events list can be found in"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_1f6b7ab8","line":230,"range":{"start_line":230,"start_character":4,"end_line":230,"end_character":7},"updated":"2016-06-24 00:44:55.000000000","message":"s/for/For/","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"* Possible values:"},{"line_number":229,"context_line":"    A string list."},{"line_number":230,"context_line":"    for example:"},{"line_number":231,"context_line":"    ``enabled_perf_events \u003d cmt, mbml, mbmt``"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    The supported events list can be found in"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_faf79c88","line":230,"range":{"start_line":230,"start_character":4,"end_line":230,"end_character":7},"in_reply_to":"3aaa91ec_1f6b7ab8","updated":"2016-06-24 03:01:20.000000000","message":"Done","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"}],"nova/tests/unit/virt/libvirt/test_config.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":2080,"context_line":"        self.assertEqual(obj.cpu.match, \u0027exact\u0027)"},{"line_number":2081,"context_line":"        self.assertEqual(obj.cpu.model, \u0027kvm64\u0027)"},{"line_number":2082,"context_line":""},{"line_number":2083,"context_line":"    def test_ConfigGuest_parese_perf(self):"},{"line_number":2084,"context_line":"        xmldoc \u003d \"\"\" \u003cdomain\u003e"},{"line_number":2085,"context_line":"             \u003cperf\u003e"},{"line_number":2086,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"cmt\"/\u003e"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_a465fd1e","line":2083,"range":{"start_line":2083,"start_character":25,"end_line":2083,"end_character":31},"updated":"2016-06-24 00:44:55.000000000","message":"s/parese/parse/\n\nI realize this was copied from the test above which also has this typo, but we should fix it for the new test.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":2080,"context_line":"        self.assertEqual(obj.cpu.match, \u0027exact\u0027)"},{"line_number":2081,"context_line":"        self.assertEqual(obj.cpu.model, \u0027kvm64\u0027)"},{"line_number":2082,"context_line":""},{"line_number":2083,"context_line":"    def test_ConfigGuest_parese_perf(self):"},{"line_number":2084,"context_line":"        xmldoc \u003d \"\"\" \u003cdomain\u003e"},{"line_number":2085,"context_line":"             \u003cperf\u003e"},{"line_number":2086,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"cmt\"/\u003e"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_7a328c60","line":2083,"range":{"start_line":2083,"start_character":25,"end_line":2083,"end_character":31},"in_reply_to":"3aaa91ec_a465fd1e","updated":"2016-06-24 03:01:20.000000000","message":"Done","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        xmldoc \u003d \"\"\" \u003cdomain\u003e"},{"line_number":2085,"context_line":"             \u003cperf\u003e"},{"line_number":2086,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"cmt\"/\u003e"},{"line_number":2087,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"mbml\"/\u003e"},{"line_number":2088,"context_line":"             \u003c/perf\u003e"},{"line_number":2089,"context_line":"                    \u003c/domain\u003e"},{"line_number":2090,"context_line":"               \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_bfb7c6f3","line":2087,"range":{"start_line":2087,"start_character":22,"end_line":2087,"end_character":35},"updated":"2016-06-24 00:44:55.000000000","message":"Should have an element with enabled\u003d\"no\" or not in the element since the parsing code is checking for that.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"223fbced8b0d34579967c70d23276c0103761c63","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        xmldoc \u003d \"\"\" \u003cdomain\u003e"},{"line_number":2085,"context_line":"             \u003cperf\u003e"},{"line_number":2086,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"cmt\"/\u003e"},{"line_number":2087,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"mbml\"/\u003e"},{"line_number":2088,"context_line":"             \u003c/perf\u003e"},{"line_number":2089,"context_line":"                    \u003c/domain\u003e"},{"line_number":2090,"context_line":"               \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_d4ad34ea","line":2087,"range":{"start_line":2087,"start_character":22,"end_line":2087,"end_character":35},"in_reply_to":"3aaa91ec_7a19ecd6","updated":"2016-06-24 15:03:25.000000000","message":"Yeah, I know, but the parsing code is checking for it so we should future-proof with a test wrinkle.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        xmldoc \u003d \"\"\" \u003cdomain\u003e"},{"line_number":2085,"context_line":"             \u003cperf\u003e"},{"line_number":2086,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"cmt\"/\u003e"},{"line_number":2087,"context_line":"               \u003cevent enabled\u003d\"yes\" name\u003d\"mbml\"/\u003e"},{"line_number":2088,"context_line":"             \u003c/perf\u003e"},{"line_number":2089,"context_line":"                    \u003c/domain\u003e"},{"line_number":2090,"context_line":"               \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_7a19ecd6","line":2087,"range":{"start_line":2087,"start_character":22,"end_line":2087,"end_character":35},"in_reply_to":"3aaa91ec_bfb7c6f3","updated":"2016-06-24 03:01:20.000000000","message":"Actually, we won\u0027t get enabled\u003d\u0027no\u0027 case at all. but I am okay to add it.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"        obj \u003d config.LibvirtConfigGuest()"},{"line_number":2092,"context_line":"        obj.parse_str(xmldoc)"},{"line_number":2093,"context_line":""},{"line_number":2094,"context_line":"        self.assertEqual(obj.perf_events, [\u0027cmt\u0027, \u0027mbml\u0027])"},{"line_number":2095,"context_line":""},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"class LibvirtConfigGuestSnapshotTest(LibvirtConfigBaseTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_447d39b0","line":2094,"updated":"2016-06-24 00:44:55.000000000","message":"nit: assertEqual args are (expected, observed) - usually doesn\u0027t matter but if it fails it\u0027s good to have it correct for the output message.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"        obj \u003d config.LibvirtConfigGuest()"},{"line_number":2092,"context_line":"        obj.parse_str(xmldoc)"},{"line_number":2093,"context_line":""},{"line_number":2094,"context_line":"        self.assertEqual(obj.perf_events, [\u0027cmt\u0027, \u0027mbml\u0027])"},{"line_number":2095,"context_line":""},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"class LibvirtConfigGuestSnapshotTest(LibvirtConfigBaseTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_da0aa078","line":2094,"in_reply_to":"3aaa91ec_447d39b0","updated":"2016-06-24 03:01:20.000000000","message":"yep, I just do a copy from previous test case, bad example :( , I will try to find time to cleanup them .","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":5291,"context_line":"        caps.host.cpu.features \u003d set([feature])"},{"line_number":5292,"context_line":""},{"line_number":5293,"context_line":"        mock_get_capabilities.return_value \u003d caps"},{"line_number":5294,"context_line":"        fakelibvirt.VIR_PERF_PARAM_CMT \u003d True"},{"line_number":5295,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":5296,"context_line":"        drvr.init_host(\u0027test_perf\u0027)"},{"line_number":5297,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_765d04e9","line":5294,"range":{"start_line":5294,"start_character":8,"end_line":5294,"end_character":45},"updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"042ce5b45e9896eacffcca591ddf1239f738ba77","unresolved":false,"context_lines":[{"line_number":5314,"context_line":"        caps.host.topology \u003d self._fake_caps_numa_topology()"},{"line_number":5315,"context_line":"        mock_get_capabilities.return_value \u003d caps"},{"line_number":5316,"context_line":"        self.flags(enabled_perf_events\u003d[\u0027cmt\u0027], group\u003d\u0027libvirt\u0027)"},{"line_number":5317,"context_line":"        fakelibvirt.VIR_PERF_PARAM_CMT \u003d True"},{"line_number":5318,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":5319,"context_line":"        drvr.init_host(\u0027test_perf\u0027)"},{"line_number":5320,"context_line":"        instance_ref \u003d objects.Instance(**self.test_instance)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_997c2a22","line":5317,"range":{"start_line":5317,"start_character":8,"end_line":5317,"end_character":45},"updated":"2016-06-22 02:10:47.000000000","message":"This might be racy since fakelibvirt is a global, you should probably use a mock and set the attribute on it within a context, e.g.:\n\n  with mock.patch(fakelibvirt, VIR_PERF_PARAM_CMT\u003dTrue, create\u003dTrue):\n    ...","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":5314,"context_line":"        caps.host.topology \u003d self._fake_caps_numa_topology()"},{"line_number":5315,"context_line":"        mock_get_capabilities.return_value \u003d caps"},{"line_number":5316,"context_line":"        self.flags(enabled_perf_events\u003d[\u0027cmt\u0027], group\u003d\u0027libvirt\u0027)"},{"line_number":5317,"context_line":"        fakelibvirt.VIR_PERF_PARAM_CMT \u003d True"},{"line_number":5318,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":5319,"context_line":"        drvr.init_host(\u0027test_perf\u0027)"},{"line_number":5320,"context_line":"        instance_ref \u003d objects.Instance(**self.test_instance)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_965870fc","line":5317,"range":{"start_line":5317,"start_character":8,"end_line":5317,"end_character":45},"in_reply_to":"3aaa91ec_997c2a22","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":5337,"context_line":"    def test_get_guest_with_perf_libvirt_unsupported(self, mock_min_version):"},{"line_number":5338,"context_line":""},{"line_number":5339,"context_line":"        def fake_has_min_version(lv_ver\u003dNone, hv_ver\u003dNone, hv_type\u003dNone):"},{"line_number":5340,"context_line":"            if lv_ver \u003d\u003d libvirt_driver.MIN_LIBVIRT_PERF_VERSION:"},{"line_number":5341,"context_line":"                return False"},{"line_number":5342,"context_line":"            return True"},{"line_number":5343,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_7f2d5e94","line":5340,"range":{"start_line":5340,"start_character":15,"end_line":5340,"end_character":21},"updated":"2016-06-24 00:44:55.000000000","message":"Won\u0027t this change as the version in fakelibvirt changes? We should just have mock_min_version return False.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"223fbced8b0d34579967c70d23276c0103761c63","unresolved":false,"context_lines":[{"line_number":5337,"context_line":"    def test_get_guest_with_perf_libvirt_unsupported(self, mock_min_version):"},{"line_number":5338,"context_line":""},{"line_number":5339,"context_line":"        def fake_has_min_version(lv_ver\u003dNone, hv_ver\u003dNone, hv_type\u003dNone):"},{"line_number":5340,"context_line":"            if lv_ver \u003d\u003d libvirt_driver.MIN_LIBVIRT_PERF_VERSION:"},{"line_number":5341,"context_line":"                return False"},{"line_number":5342,"context_line":"            return True"},{"line_number":5343,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_f4e0302b","line":5340,"range":{"start_line":5340,"start_character":15,"end_line":5340,"end_character":21},"in_reply_to":"3aaa91ec_7a38ccef","updated":"2016-06-24 15:03:25.000000000","message":"The side_effects attribute in mock can return a list which are the returns for the calls made to the mock in order, that would also make this cleaner if this is called multiple times.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":5337,"context_line":"    def test_get_guest_with_perf_libvirt_unsupported(self, mock_min_version):"},{"line_number":5338,"context_line":""},{"line_number":5339,"context_line":"        def fake_has_min_version(lv_ver\u003dNone, hv_ver\u003dNone, hv_type\u003dNone):"},{"line_number":5340,"context_line":"            if lv_ver \u003d\u003d libvirt_driver.MIN_LIBVIRT_PERF_VERSION:"},{"line_number":5341,"context_line":"                return False"},{"line_number":5342,"context_line":"            return True"},{"line_number":5343,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_7a38ccef","line":5340,"range":{"start_line":5340,"start_character":15,"end_line":5340,"end_character":21},"in_reply_to":"3aaa91ec_7f2d5e94","updated":"2016-06-24 03:01:20.000000000","message":"It will fail if I just have mock_min_version return False since has_min_version was called multiple times in init_host(). see https://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L459\n\nhmm, I don\u0027t think it will bring any changes to fakelibvirt , since I just set the side_effect of mock object in #5334","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":5354,"context_line":"    @mock.patch.object(fakelibvirt, \u0027VIR_PERF_PARAM_CMT\u0027, True,"},{"line_number":5355,"context_line":"                       create\u003dTrue)"},{"line_number":5356,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":5357,"context_line":"    def test_get_guest_with_perf_host_unsupported(self,"},{"line_number":5358,"context_line":"                                             mock_min_version):"},{"line_number":5359,"context_line":"        self.flags(enabled_perf_events\u003d[\u0027cmt\u0027], group\u003d\u0027libvirt\u0027)"},{"line_number":5360,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_5f0222b5","line":5357,"range":{"start_line":5357,"start_character":8,"end_line":5357,"end_character":49},"updated":"2016-06-24 00:44:55.000000000","message":"How is this test different from test_get_guest_with_perf_libvirt_unsupported above? Seems redundant.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":5354,"context_line":"    @mock.patch.object(fakelibvirt, \u0027VIR_PERF_PARAM_CMT\u0027, True,"},{"line_number":5355,"context_line":"                       create\u003dTrue)"},{"line_number":5356,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":5357,"context_line":"    def test_get_guest_with_perf_host_unsupported(self,"},{"line_number":5358,"context_line":"                                             mock_min_version):"},{"line_number":5359,"context_line":"        self.flags(enabled_perf_events\u003d[\u0027cmt\u0027], group\u003d\u0027libvirt\u0027)"},{"line_number":5360,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_5aa99023","line":5357,"range":{"start_line":5357,"start_character":8,"end_line":5357,"end_character":49},"in_reply_to":"3aaa91ec_5f0222b5","updated":"2016-06-24 03:01:20.000000000","message":"The are different.\ntest_get_guest_with_perf_libvirt_unsupported will test if libvirt won\u0027t support perf (\u003c\u003dMIN_LIBVIRT_PERF_VERSION)\n\ntest_get_guest_with_perf_host_unsupported will test that libvirt support perf, but the host don\u0027t have specify cpu feature, we can see this different from #5332.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"}],"nova/virt/libvirt/config.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"074864ef82d89f0558f606a81c8f93ce2d38cfae","unresolved":false,"context_lines":[{"line_number":2103,"context_line":"            idmaps.append(idmap.format_dom())"},{"line_number":2104,"context_line":"        root.append(idmaps)"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"    def _formate_perf_events(self, root):"},{"line_number":2107,"context_line":"        if len(self.perf_events) \u003d\u003d 0:"},{"line_number":2108,"context_line":"            return"},{"line_number":2109,"context_line":"        perfs \u003d etree.Element(\"perf\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_97dcc375","line":2106,"updated":"2016-06-16 13:04:17.000000000","message":"s/_formate/_format/","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a8aca109b5957bc2d6afbe1a915478cc0d6b011b","unresolved":false,"context_lines":[{"line_number":2103,"context_line":"            idmaps.append(idmap.format_dom())"},{"line_number":2104,"context_line":"        root.append(idmaps)"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"    def _formate_perf_events(self, root):"},{"line_number":2107,"context_line":"        if len(self.perf_events) \u003d\u003d 0:"},{"line_number":2108,"context_line":"            return"},{"line_number":2109,"context_line":"        perfs \u003d etree.Element(\"perf\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a9d85d2_657c4121","line":2106,"in_reply_to":"7aa08908_97dcc375","updated":"2016-06-20 02:48:12.000000000","message":"Done","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"074864ef82d89f0558f606a81c8f93ce2d38cfae","unresolved":false,"context_lines":[{"line_number":2138,"context_line":""},{"line_number":2139,"context_line":"        self._format_idmaps(root)"},{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"        self._formate_perf_events(root)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        return root"},{"line_number":2144,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_f7ea670d","line":2141,"updated":"2016-06-16 13:04:17.000000000","message":"s/_formate/_format/","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a8aca109b5957bc2d6afbe1a915478cc0d6b011b","unresolved":false,"context_lines":[{"line_number":2138,"context_line":""},{"line_number":2139,"context_line":"        self._format_idmaps(root)"},{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"        self._formate_perf_events(root)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        return root"},{"line_number":2144,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a9d85d2_e58e7126","line":2141,"in_reply_to":"7aa08908_f7ea670d","updated":"2016-06-20 02:48:12.000000000","message":"Done","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        return root"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":2146,"context_line":"        # Note: This cover only for: LibvirtConfigGuestDisks"},{"line_number":2147,"context_line":"        #                            LibvirtConfigGuestHostdevPCI"},{"line_number":2148,"context_line":"        #                            LibvirtConfigGuestInterface"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_1e4dc072","line":2145,"updated":"2016-06-22 01:47:41.000000000","message":"Why don\u0027t we have anything in parse_dom for parsing perf events out of the xml?","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        return root"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":2146,"context_line":"        # Note: This cover only for: LibvirtConfigGuestDisks"},{"line_number":2147,"context_line":"        #                            LibvirtConfigGuestHostdevPCI"},{"line_number":2148,"context_line":"        #                            LibvirtConfigGuestInterface"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_3e17dc52","line":2145,"in_reply_to":"3aaa91ec_1e4dc072","updated":"2016-06-22 07:54:49.000000000","message":"hi Matt, I don\u0027t find any where will use this perf events for in pase_dom. \nbut okay, I will add it in next PS.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"85bd723e785f25ad0155dc71150ad591ae7164ca","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"                self.cpu \u003d obj"},{"line_number":2182,"context_line":"            elif c.tag \u003d\u003d \u0027perf\u0027:"},{"line_number":2183,"context_line":"                for p in c.getchildren():"},{"line_number":2184,"context_line":"                    if p.get(\u0027enabled\u0027):"},{"line_number":2185,"context_line":"                        self.add_perf_event(p.get(\u0027name\u0027))"},{"line_number":2186,"context_line":""},{"line_number":2187,"context_line":"    def add_device(self, dev):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_3fed96ef","line":2184,"range":{"start_line":2184,"start_character":20,"end_line":2184,"end_character":40},"updated":"2016-06-24 00:44:55.000000000","message":"Shouldn\u0027t this compare enabled against \u0027yes\u0027?","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a9dd0d57b3ed408b73f9e2cb989acea749150c92","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"                self.cpu \u003d obj"},{"line_number":2182,"context_line":"            elif c.tag \u003d\u003d \u0027perf\u0027:"},{"line_number":2183,"context_line":"                for p in c.getchildren():"},{"line_number":2184,"context_line":"                    if p.get(\u0027enabled\u0027):"},{"line_number":2185,"context_line":"                        self.add_perf_event(p.get(\u0027name\u0027))"},{"line_number":2186,"context_line":""},{"line_number":2187,"context_line":"    def add_device(self, dev):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_bae074fb","line":2184,"range":{"start_line":2184,"start_character":20,"end_line":2184,"end_character":40},"in_reply_to":"3aaa91ec_3fed96ef","updated":"2016-06-24 03:01:20.000000000","message":"yes, but, in our case, we won\u0027t have enable\u003dno, anyway, I will add this checking.","commit_id":"0765ff14f82a41787ca1c4803046c8bf90031475"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9581,"name":"Ren Qiaowei","email":"qiaowei.ren@intel.com","username":"qiaowei"},"change_message_id":"abf8f9a0f22d38ead66797f7f6a2e8feb9784d5a","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                       arch.PPC64LE: MIN_QEMU_PPC64_VERSION,"},{"line_number":298,"context_line":"                      }"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"SUPPORTED_PERF_EVENTS \u003d {\u0027cmt\u0027: \u0027VIR_PERF_PARAM_CMT\u0027,"},{"line_number":301,"context_line":"                         \u0027mbml\u0027: \u0027VIR_PERF_PARAM_MBML\u0027,"},{"line_number":302,"context_line":"                         \u0027mbmt\u0027: \u0027VIR_PERF_PARAM_MBMT\u0027,"},{"line_number":303,"context_line":"                        }"},{"line_number":304,"context_line":"PERF_EVENTS_CPU_FLAG_MAPPING \u003d {\u0027cmt\u0027: \u0027cqm\u0027,"},{"line_number":305,"context_line":"                                \u0027mbml\u0027: \u0027cqm_mbm_local\u0027,"},{"line_number":306,"context_line":"                                \u0027mbmt\u0027: \u0027cqm_mbm_total\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_2a96ddef","line":303,"range":{"start_line":300,"start_character":0,"end_line":303,"end_character":25},"updated":"2016-06-14 00:37:10.000000000","message":"this is absolutely hard code, and we have to update this section every time new perf event is added into libvirt. I guess we can use libvirt API (like virDomainGetPerfEvents) to get all supported events.","commit_id":"b947e4fafb868411a931f2bdf27414fd1bbb2974"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"8d37ffd8156a0f26773d586fd301342eb362a5f9","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                       arch.PPC64LE: MIN_QEMU_PPC64_VERSION,"},{"line_number":298,"context_line":"                      }"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"SUPPORTED_PERF_EVENTS \u003d {\u0027cmt\u0027: \u0027VIR_PERF_PARAM_CMT\u0027,"},{"line_number":301,"context_line":"                         \u0027mbml\u0027: \u0027VIR_PERF_PARAM_MBML\u0027,"},{"line_number":302,"context_line":"                         \u0027mbmt\u0027: \u0027VIR_PERF_PARAM_MBMT\u0027,"},{"line_number":303,"context_line":"                        }"},{"line_number":304,"context_line":"PERF_EVENTS_CPU_FLAG_MAPPING \u003d {\u0027cmt\u0027: \u0027cqm\u0027,"},{"line_number":305,"context_line":"                                \u0027mbml\u0027: \u0027cqm_mbm_local\u0027,"},{"line_number":306,"context_line":"                                \u0027mbmt\u0027: \u0027cqm_mbm_total\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_3785a5ce","line":303,"range":{"start_line":300,"start_character":0,"end_line":303,"end_character":25},"in_reply_to":"7aa08908_2a96ddef","updated":"2016-06-14 02:10:08.000000000","message":"hi Qiaowei, thanks for your comments. I agree that hardcode is not good enough, I will try other way.\n\nFor virDomainGetPerfEvents libvirt API, I don\u0027t think we can leverage it since we don\u0027t create domain in this moment yet.","commit_id":"b947e4fafb868411a931f2bdf27414fd1bbb2974"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"19cb8d63b7fbb66185738395ca745840828107eb","unresolved":false,"context_lines":[{"line_number":4354,"context_line":""},{"line_number":4355,"context_line":"        # TODO(eliqiao): Remove hasattr checking after MIN_LIBVIRT_VERSION"},{"line_number":4356,"context_line":"        # bump to 1.3.3"},{"line_number":4357,"context_line":"        if (hasattr(libvirt, \u0027VIR_PERF_PARAM_CMT\u0027) and"},{"line_number":4358,"context_line":"            len(CONF.libvirt.enabled_perf_events)) \u003e 0:"},{"line_number":4359,"context_line":"            for event in self._get_supported_perf_events():"},{"line_number":4360,"context_line":"                guest.add_perf_event(event)"},{"line_number":4361,"context_line":""},{"line_number":4362,"context_line":"        self._update_guest_cputune(guest, flavor, virt_type)"},{"line_number":4363,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_8004ff14","line":4360,"range":{"start_line":4357,"start_character":8,"end_line":4360,"end_character":43},"updated":"2016-06-14 09:59:59.000000000","message":"so this is verification that libvirt supports perf events, right? I\u0027d rather do this check on compute startup, verifying that libvirt version is \u003e\u003d 1.3.3 and raising error is event is enabled otherwise.","commit_id":"478ce9ffbb4903dd416c4c572303277c4de85a93"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"b52050df816c303ee4d88daa63236b1e172c4709","unresolved":false,"context_lines":[{"line_number":4354,"context_line":""},{"line_number":4355,"context_line":"        # TODO(eliqiao): Remove hasattr checking after MIN_LIBVIRT_VERSION"},{"line_number":4356,"context_line":"        # bump to 1.3.3"},{"line_number":4357,"context_line":"        if (hasattr(libvirt, \u0027VIR_PERF_PARAM_CMT\u0027) and"},{"line_number":4358,"context_line":"            len(CONF.libvirt.enabled_perf_events)) \u003e 0:"},{"line_number":4359,"context_line":"            for event in self._get_supported_perf_events():"},{"line_number":4360,"context_line":"                guest.add_perf_event(event)"},{"line_number":4361,"context_line":""},{"line_number":4362,"context_line":"        self._update_guest_cputune(guest, flavor, virt_type)"},{"line_number":4363,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_60575326","line":4360,"range":{"start_line":4357,"start_character":8,"end_line":4360,"end_character":43},"in_reply_to":"7aa08908_8004ff14","updated":"2016-06-14 10:16:46.000000000","message":"Good idea, we can do it when init compute service.","commit_id":"478ce9ffbb4903dd416c4c572303277c4de85a93"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"LIBVIRT_PERF_EVENT_PREFIX \u003d \u0027VIR_PERF_PARAM_\u0027"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"PERF_EVENTS_CPU_FLAG_MAPPING \u003d {\u0027cmt\u0027: \u0027cqm\u0027,"},{"line_number":303,"context_line":"                                \u0027mbml\u0027: \u0027cqm_mbm_local\u0027,"},{"line_number":304,"context_line":"                                \u0027mbmt\u0027: \u0027cqm_mbm_total\u0027,"},{"line_number":305,"context_line":"                               }"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_be52acdb","line":302,"updated":"2016-06-22 01:47:41.000000000","message":"If these are our supported perf events, then the config option should be a ListOpt with choices and default to None, right? What if I configure it with \u0027foo\u0027?","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"LIBVIRT_PERF_EVENT_PREFIX \u003d \u0027VIR_PERF_PARAM_\u0027"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"PERF_EVENTS_CPU_FLAG_MAPPING \u003d {\u0027cmt\u0027: \u0027cqm\u0027,"},{"line_number":303,"context_line":"                                \u0027mbml\u0027: \u0027cqm_mbm_local\u0027,"},{"line_number":304,"context_line":"                                \u0027mbmt\u0027: \u0027cqm_mbm_total\u0027,"},{"line_number":305,"context_line":"                               }"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_7937bee3","line":302,"in_reply_to":"3aaa91ec_be52acdb","updated":"2016-06-22 07:54:49.000000000","message":"we will test if libvirt has VIR_PERF_PARAM_FOO first, so don\u0027t worry for some mess config options.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":4158,"context_line":"                self._host.has_min_version(MIN_LIBVIRT_UEFI_VERSION) and"},{"line_number":4159,"context_line":"                os.path.exists(DEFAULT_UEFI_LOADER_PATH[caps.host.cpu.arch]))"},{"line_number":4160,"context_line":""},{"line_number":4161,"context_line":"    def _get_supported_perf_events(self):"},{"line_number":4162,"context_line":"        supported_events \u003d []"},{"line_number":4163,"context_line":"        host_cpu_info \u003d self._get_cpu_info()"},{"line_number":4164,"context_line":"        for event in CONF.libvirt.enabled_perf_events:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_3ee23c04","line":4161,"updated":"2016-06-22 01:47:41.000000000","message":"Shouldn\u0027t we be checking a minimum version of libvirt for this to avoid configuring perf events and then getting a bunch of warnings saying the host doesn\u0027t support them just because it\u0027s down a version?","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":4158,"context_line":"                self._host.has_min_version(MIN_LIBVIRT_UEFI_VERSION) and"},{"line_number":4159,"context_line":"                os.path.exists(DEFAULT_UEFI_LOADER_PATH[caps.host.cpu.arch]))"},{"line_number":4160,"context_line":""},{"line_number":4161,"context_line":"    def _get_supported_perf_events(self):"},{"line_number":4162,"context_line":"        supported_events \u003d []"},{"line_number":4163,"context_line":"        host_cpu_info \u003d self._get_cpu_info()"},{"line_number":4164,"context_line":"        for event in CONF.libvirt.enabled_perf_events:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_b948065d","line":4161,"in_reply_to":"3aaa91ec_3ee23c04","updated":"2016-06-22 07:54:49.000000000","message":"okay, I will do a checking here.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":4160,"context_line":""},{"line_number":4161,"context_line":"    def _get_supported_perf_events(self):"},{"line_number":4162,"context_line":"        supported_events \u003d []"},{"line_number":4163,"context_line":"        host_cpu_info \u003d self._get_cpu_info()"},{"line_number":4164,"context_line":"        for event in CONF.libvirt.enabled_perf_events:"},{"line_number":4165,"context_line":"            if self._supported_perf_event(event, host_cpu_info[\u0027features\u0027]):"},{"line_number":4166,"context_line":"                supported_events.append(event)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_be00ecab","line":4163,"range":{"start_line":4163,"start_character":29,"end_line":4163,"end_character":42},"updated":"2016-06-22 01:47:41.000000000","message":"We could avoid calling this if the config option list is empty.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":4160,"context_line":""},{"line_number":4161,"context_line":"    def _get_supported_perf_events(self):"},{"line_number":4162,"context_line":"        supported_events \u003d []"},{"line_number":4163,"context_line":"        host_cpu_info \u003d self._get_cpu_info()"},{"line_number":4164,"context_line":"        for event in CONF.libvirt.enabled_perf_events:"},{"line_number":4165,"context_line":"            if self._supported_perf_event(event, host_cpu_info[\u0027features\u0027]):"},{"line_number":4166,"context_line":"                supported_events.append(event)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_f978ce91","line":4163,"range":{"start_line":4163,"start_character":29,"end_line":4163,"end_character":42},"in_reply_to":"3aaa91ec_be00ecab","updated":"2016-06-22 07:54:49.000000000","message":"sure","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d93d185612af32dd68839d67a24c5c32e1ca34f0","unresolved":false,"context_lines":[{"line_number":4170,"context_line":""},{"line_number":4171,"context_line":"        libvirt_perf_event_name \u003d LIBVIRT_PERF_EVENT_PREFIX + event.upper()"},{"line_number":4172,"context_line":""},{"line_number":4173,"context_line":"        if not hasattr(libvirt, libvirt_perf_event_name):"},{"line_number":4174,"context_line":"            LOG.warning(_LW(\"Libvirt doesn\u0027t support event type %s.\"),"},{"line_number":4175,"context_line":"                        event)"},{"line_number":4176,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_39a41656","line":4173,"range":{"start_line":4173,"start_character":8,"end_line":4173,"end_character":57},"updated":"2016-06-22 02:12:24.000000000","message":"I\u0027m not seeing a unit test for this, what if I set the config option to have [\u0027foo\u0027]?","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":4170,"context_line":""},{"line_number":4171,"context_line":"        libvirt_perf_event_name \u003d LIBVIRT_PERF_EVENT_PREFIX + event.upper()"},{"line_number":4172,"context_line":""},{"line_number":4173,"context_line":"        if not hasattr(libvirt, libvirt_perf_event_name):"},{"line_number":4174,"context_line":"            LOG.warning(_LW(\"Libvirt doesn\u0027t support event type %s.\"),"},{"line_number":4175,"context_line":"                        event)"},{"line_number":4176,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_8ace8a81","line":4173,"range":{"start_line":4173,"start_character":8,"end_line":4173,"end_character":57},"in_reply_to":"3aaa91ec_39a41656","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":4177,"context_line":""},{"line_number":4178,"context_line":"        if (event in PERF_EVENTS_CPU_FLAG_MAPPING"},{"line_number":4179,"context_line":"            and PERF_EVENTS_CPU_FLAG_MAPPING[event] not in cpu_features):"},{"line_number":4180,"context_line":"            LOG.warning(_LW(\"Host doesn\u0027t support event type %s.\"), event)"},{"line_number":4181,"context_line":"            return False"},{"line_number":4182,"context_line":""},{"line_number":4183,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_5edd8841","line":4180,"range":{"start_line":4180,"start_character":34,"end_line":4180,"end_character":41},"updated":"2016-06-22 01:47:41.000000000","message":"does not","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":4177,"context_line":""},{"line_number":4178,"context_line":"        if (event in PERF_EVENTS_CPU_FLAG_MAPPING"},{"line_number":4179,"context_line":"            and PERF_EVENTS_CPU_FLAG_MAPPING[event] not in cpu_features):"},{"line_number":4180,"context_line":"            LOG.warning(_LW(\"Host doesn\u0027t support event type %s.\"), event)"},{"line_number":4181,"context_line":"            return False"},{"line_number":4182,"context_line":""},{"line_number":4183,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_2ab956ea","line":4180,"range":{"start_line":4180,"start_character":34,"end_line":4180,"end_character":41},"in_reply_to":"3aaa91ec_5edd8841","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"35c39895b92753b3a6afbfc9d37d837214d915a8","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        \"\"\"Returns the total numbers of cpu in the host.\"\"\""},{"line_number":798,"context_line":"        return self._get_hardware_info()[2]"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"    def get_cpu_flags(self):"},{"line_number":801,"context_line":"        \"\"\"return a list of cpu flags\"\"\""},{"line_number":802,"context_line":"        with open(\u0027/proc/cpuinfo\u0027) as fp:"},{"line_number":803,"context_line":"            m \u003d fp.read().split()"},{"line_number":804,"context_line":"        idx1 \u003d m.index(\u0027flags\u0027)"},{"line_number":805,"context_line":"        idx2 \u003d m.index(\":\", idx1 + 2)"},{"line_number":806,"context_line":"        return m[idx1 + 2:idx2 - 1]"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_memory_mb_total(self):"},{"line_number":809,"context_line":"        \"\"\"Get the total memory size(MB) of physical computer."}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_6b8b8fc3","line":806,"range":{"start_line":800,"start_character":4,"end_line":806,"end_character":35},"updated":"2016-06-14 21:31:28.000000000","message":"I think this could be rewritten with get_capabilities method instead","commit_id":"478ce9ffbb4903dd416c4c572303277c4de85a93"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"366e9133fac6362d0fcca2df65f87c0822be9a40","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        \"\"\"Returns the total numbers of cpu in the host.\"\"\""},{"line_number":798,"context_line":"        return self._get_hardware_info()[2]"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"    def get_cpu_flags(self):"},{"line_number":801,"context_line":"        \"\"\"return a list of cpu flags\"\"\""},{"line_number":802,"context_line":"        with open(\u0027/proc/cpuinfo\u0027) as fp:"},{"line_number":803,"context_line":"            m \u003d fp.read().split()"},{"line_number":804,"context_line":"        idx1 \u003d m.index(\u0027flags\u0027)"},{"line_number":805,"context_line":"        idx2 \u003d m.index(\":\", idx1 + 2)"},{"line_number":806,"context_line":"        return m[idx1 + 2:idx2 - 1]"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_memory_mb_total(self):"},{"line_number":809,"context_line":"        \"\"\"Get the total memory size(MB) of physical computer."}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_6f4714a3","line":806,"range":{"start_line":800,"start_character":4,"end_line":806,"end_character":35},"in_reply_to":"7aa08908_6b8b8fc3","updated":"2016-06-15 01:19:03.000000000","message":"hi Timofey,\nhost.get_capabilities() method leverages libvirt\u0027s getCapabilities to get host\u0027s capabilities, but if you tested it locally, not all cpu features(flags) can be seen by libvirt.\n\nyou can simply test it by cat /proc/cpuinfo and virsh capabilities\n\nAn example of virsh output\n\n  \u003chost\u003e\n    \u003cuuid\u003e3cadb1ec-b1da-11e4-afdf-6c0b84082568\u003c/uuid\u003e\n    \u003ccpu\u003e\n      \u003carch\u003ex86_64\u003c/arch\u003e\n      \u003cmodel\u003eHaswell\u003c/model\u003e\n      \u003cvendor\u003eIntel\u003c/vendor\u003e\n      \u003ctopology sockets\u003d\u00271\u0027 cores\u003d\u00274\u0027 threads\u003d\u00272\u0027/\u003e\n      \u003cfeature name\u003d\u0027abm\u0027/\u003e\n      \u003cfeature name\u003d\u0027pdpe1gb\u0027/\u003e\n      \u003cfeature name\u003d\u0027rdrand\u0027/\u003e\n      \u003cfeature name\u003d\u0027f16c\u0027/\u003e\n      \u003cfeature name\u003d\u0027osxsave\u0027/\u003e\n      \u003cfeature name\u003d\u0027pdcm\u0027/\u003e\n      \u003cfeature name\u003d\u0027xtpr\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm2\u0027/\u003e\n      \u003cfeature name\u003d\u0027est\u0027/\u003e\n      \u003cfeature name\u003d\u0027smx\u0027/\u003e\n      \u003cfeature name\u003d\u0027vmx\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds_cpl\u0027/\u003e\n      \u003cfeature name\u003d\u0027monitor\u0027/\u003e\n      \u003cfeature name\u003d\u0027dtes64\u0027/\u003e\n      \u003cfeature name\u003d\u0027pbe\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm\u0027/\u003e\n      \u003cfeature name\u003d\u0027ht\u0027/\u003e\n      \u003cfeature name\u003d\u0027ss\u0027/\u003e\n      \u003cfeature name\u003d\u0027acpi\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds\u0027/\u003e\n      \u003cfeature name\u003d\u0027vme\u0027/\u003e\n    \u003c/cpu\u003e\n...\n  \u003chost\u003e\n\nEli.","commit_id":"478ce9ffbb4903dd416c4c572303277c4de85a93"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"074864ef82d89f0558f606a81c8f93ce2d38cfae","unresolved":false,"context_lines":[{"line_number":803,"context_line":"            m \u003d fp.read().split()"},{"line_number":804,"context_line":"        idx1 \u003d m.index(\u0027flags\u0027)"},{"line_number":805,"context_line":"        idx2 \u003d m.index(\":\", idx1 + 2)"},{"line_number":806,"context_line":"        return m[idx1 + 2:idx2 - 1]"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_memory_mb_total(self):"},{"line_number":809,"context_line":"        \"\"\"Get the total memory size(MB) of physical computer."}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_977b2329","line":806,"updated":"2016-06-16 13:04:17.000000000","message":"This is really rather gross.  Libvirt is reporting host CPU flags in its capabilities XML, so we should really be checking that and not parsing this cpuinfo file whose contents are terribly badly defined and different on every architecture.  If these flags are too new for libvirt to know about, we should add a patch to libvirt to ensure it reports them.","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"3c06d8e04d790e6cbad57e17d10a24e15ce81428","unresolved":false,"context_lines":[{"line_number":803,"context_line":"            m \u003d fp.read().split()"},{"line_number":804,"context_line":"        idx1 \u003d m.index(\u0027flags\u0027)"},{"line_number":805,"context_line":"        idx2 \u003d m.index(\":\", idx1 + 2)"},{"line_number":806,"context_line":"        return m[idx1 + 2:idx2 - 1]"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    def get_memory_mb_total(self):"},{"line_number":809,"context_line":"        \"\"\"Get the total memory size(MB) of physical computer."}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_56919d45","line":806,"in_reply_to":"7aa08908_977b2329","updated":"2016-06-16 23:49:00.000000000","message":"hi Daniel, I agree that we\u0027d better to use libvirt capabilities XML to get the cpu flags, but currently\u0027s (with latest libvirt build even), the host capabilities XML, we can only see few cpu flags/features(see below output)\n\nActually I asked question in libvirt-list, but I don\u0027t quite understand Jiri\u0027s reply on \nhttps://www.redhat.com/archives/libvir-list/2016-May/msg01937.html and https://www.redhat.com/archives/libvir-list/2016-May/msg01937.html.\n\nSo in this nova patch, I would like to see \u0027cqm*\u0027 cpu feature, shoud I add them to libvirt/src/cpu/cpu_map.xml?\n\nIf so, we can not land this nova patch in Newton :( \n\ncurrently --------------------\n\n\nubuntu@jfz1r04h07:~$ virsh --version\n1.3.6\n\nubuntu@jfz1r04h07:~$ virsh capabilities\n\n  \u003chost\u003e\n    \u003cuuid\u003e80ace6bd-4b19-e511-906e-0012795d9712\u003c/uuid\u003e\n    \u003ccpu\u003e\n      \u003carch\u003ex86_64\u003c/arch\u003e\n      \u003cmodel\u003eHaswell-noTSX\u003c/model\u003e\n      \u003cvendor\u003eIntel\u003c/vendor\u003e\n      \u003ctopology sockets\u003d\u00271\u0027 cores\u003d\u002718\u0027 threads\u003d\u00272\u0027/\u003e\n      \u003cfeature name\u003d\u0027vme\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds\u0027/\u003e\n      \u003cfeature name\u003d\u0027acpi\u0027/\u003e\n      \u003cfeature name\u003d\u0027ss\u0027/\u003e\n      \u003cfeature name\u003d\u0027ht\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm\u0027/\u003e\n      \u003cfeature name\u003d\u0027pbe\u0027/\u003e\n      \u003cfeature name\u003d\u0027dtes64\u0027/\u003e\n      \u003cfeature name\u003d\u0027monitor\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds_cpl\u0027/\u003e\n      \u003cfeature name\u003d\u0027vmx\u0027/\u003e\n      \u003cfeature name\u003d\u0027smx\u0027/\u003e\n      \u003cfeature name\u003d\u0027est\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm2\u0027/\u003e\n      \u003cfeature name\u003d\u0027xtpr\u0027/\u003e\n      \u003cfeature name\u003d\u0027pdcm\u0027/\u003e\n      \u003cfeature name\u003d\u0027dca\u0027/\u003e\n      \u003cfeature name\u003d\u0027osxsave\u0027/\u003e\n      \u003cfeature name\u003d\u0027f16c\u0027/\u003e\n      \u003cfeature name\u003d\u0027rdrand\u0027/\u003e\n      \u003cfeature name\u003d\u0027arat\u0027/\u003e\n      \u003cfeature name\u003d\u0027tsc_adjust\u0027/\u003e\n      \u003cfeature name\u003d\u0027xsaveopt\u0027/\u003e\n      \u003cfeature name\u003d\u0027pdpe1gb\u0027/\u003e\n      \u003cfeature name\u003d\u0027abm\u0027/\u003e\n      \u003cfeature name\u003d\u0027invtsc\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00274\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00272048\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00271048576\u0027/\u003e\n    \u003c/cpu\u003e","commit_id":"b8bd2a17e575e387c1a5f27b948f7c6d58ab07cc"}],"releasenotes/notes/add-perf-event-e1385b6b6346fbda.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9632b947e73009c49b1d75c452a5c6010b0f273","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Add perf event support for libvirt driver."},{"line_number":4,"context_line":"    This can be done by adding new configure option"},{"line_number":5,"context_line":"    \u0027enabled_perf_events\u0027 in libvirt section of"},{"line_number":6,"context_line":"    nova.conf. It has require that libvirt\u003e\u003d1.3.3"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"3aaa91ec_def178cf","line":6,"range":{"start_line":6,"start_character":15,"end_line":6,"end_character":49},"updated":"2016-06-22 01:47:41.000000000","message":"This feature requires libvirt\u003e\u003d1.3.3.","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"00b6a1d5de671bed08ed8b4c08a1ee738c618c70","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Add perf event support for libvirt driver."},{"line_number":4,"context_line":"    This can be done by adding new configure option"},{"line_number":5,"context_line":"    \u0027enabled_perf_events\u0027 in libvirt section of"},{"line_number":6,"context_line":"    nova.conf. It has require that libvirt\u003e\u003d1.3.3"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"3aaa91ec_6acb5e73","line":6,"range":{"start_line":6,"start_character":15,"end_line":6,"end_character":49},"in_reply_to":"3aaa91ec_def178cf","updated":"2016-06-22 07:54:49.000000000","message":"Done","commit_id":"28c569c0b47fd192cbd54297056f52def05355b0"}]}
