)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ce82ac8e5f69be7b3377a2edea511d33171a99da","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add method to get cpu traits"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a method for libvirt driver to get cpu traits exposed to vm."},{"line_number":10,"context_line":"This is used for compute nodes to report cpu traits to Placement."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I9bd80adc244c64277d2d00e7d79c3002c8f9d57e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_a627061f","line":9,"range":{"start_line":9,"start_character":50,"end_line":9,"end_character":62},"updated":"2018-06-15 08:31:16.000000000","message":"this seems miss leading, what does exposed to vm mean? shouldn\u0027t it be exposed to ``user`` or ``placement``?","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"1e32f989510e3f7a716f8b9dad3a147c842d441f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add method to get cpu traits"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a method for libvirt driver to get cpu traits exposed to vm."},{"line_number":10,"context_line":"This is used for compute nodes to report cpu traits to Placement."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I9bd80adc244c64277d2d00e7d79c3002c8f9d57e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_794616c3","line":9,"range":{"start_line":9,"start_character":50,"end_line":9,"end_character":62},"in_reply_to":"5f7c97a3_a627061f","updated":"2018-06-20 07:54:34.000000000","message":"Done","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"}],"doc/source/user/support-matrix.ini":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cfcd3f05cbe13483d0080fdcd6fe5506874cc39c","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"driver.xenserver\u003dmissing"},{"line_number":1539,"context_line":"driver.libvirt-kvm-x86\u003dcomplete"},{"line_number":1540,"context_line":"driver.libvirt-kvm-aarch64\u003dunknown"},{"line_number":1541,"context_line":"driver.libvirt-kvm-ppc64\u003dunknown"},{"line_number":1542,"context_line":"driver.libvirt-kvm-s390x\u003dunknown"},{"line_number":1543,"context_line":"driver.libvirt-qemu-x86\u003dcomplete"},{"line_number":1544,"context_line":"driver.libvirt-lxc\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":30,"id":"5f7c97a3_80ec2529","line":1541,"updated":"2018-07-23 19:15:14.000000000","message":"This is complete right? We see it working in the powerkvm CI.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cfcd3f05cbe13483d0080fdcd6fe5506874cc39c","unresolved":false,"context_lines":[{"line_number":1539,"context_line":"driver.libvirt-kvm-x86\u003dcomplete"},{"line_number":1540,"context_line":"driver.libvirt-kvm-aarch64\u003dunknown"},{"line_number":1541,"context_line":"driver.libvirt-kvm-ppc64\u003dunknown"},{"line_number":1542,"context_line":"driver.libvirt-kvm-s390x\u003dunknown"},{"line_number":1543,"context_line":"driver.libvirt-qemu-x86\u003dcomplete"},{"line_number":1544,"context_line":"driver.libvirt-lxc\u003dmissing"},{"line_number":1545,"context_line":"driver.libvirt-xen\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":30,"id":"5f7c97a3_00e01527","line":1542,"range":{"start_line":1542,"start_character":25,"end_line":1542,"end_character":32},"updated":"2018-07-23 19:15:14.000000000","message":"I\u0027d say this is missing since baselineCPU doesn\u0027t work with s390x.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a679da7b002ef998d30635b412244795350c9a4f","unresolved":false,"context_lines":[{"line_number":1542,"context_line":"driver.libvirt-kvm-s390x\u003dunknown"},{"line_number":1543,"context_line":"driver.libvirt-qemu-x86\u003dcomplete"},{"line_number":1544,"context_line":"driver.libvirt-lxc\u003dmissing"},{"line_number":1545,"context_line":"driver.libvirt-xen\u003dmissing"},{"line_number":1546,"context_line":"driver.vmware\u003dmissing"},{"line_number":1547,"context_line":"driver.hyperv\u003dmissing"},{"line_number":1548,"context_line":"driver.ironic\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":30,"id":"5f7c97a3_9b333862","line":1545,"range":{"start_line":1545,"start_character":19,"end_line":1545,"end_character":26},"updated":"2018-07-23 19:27:56.000000000","message":"This is probably unknown. We have https://wiki.openstack.org/wiki/ThirdPartySystems/XenProject_CI but it hasn\u0027t run on this change so we don\u0027t know if it\u0027s missing or not. Probably the same for lxc since we don\u0027t have a CI job for that but it\u0027s less to do with the guest and more about the host.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a679da7b002ef998d30635b412244795350c9a4f","unresolved":false,"context_lines":[{"line_number":1546,"context_line":"driver.vmware\u003dmissing"},{"line_number":1547,"context_line":"driver.hyperv\u003dmissing"},{"line_number":1548,"context_line":"driver.ironic\u003dmissing"},{"line_number":1549,"context_line":"driver.libvirt-vz-vm\u003dmissing"},{"line_number":1550,"context_line":"driver.libvirt-vz-ct\u003dmissing"},{"line_number":1551,"context_line":"driver.powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":30,"id":"5f7c97a3_3b66a458","line":1549,"range":{"start_line":1549,"start_character":21,"end_line":1549,"end_character":28},"updated":"2018-07-23 19:27:56.000000000","message":"I would think this is either complete or unknown. We should have the CI to tell.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"}],"nova/compute/provider_tree.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a9e3afb675aa50c76a99764f9a5a8b6ca59158c2","unresolved":false,"context_lines":[{"line_number":558,"context_line":"                             to be affected."},{"line_number":559,"context_line":"        :param traits: String names of traits to be added."},{"line_number":560,"context_line":"        \"\"\""},{"line_number":561,"context_line":"        if not traits:"},{"line_number":562,"context_line":"            return"},{"line_number":563,"context_line":"        with self.lock:"},{"line_number":564,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_fbd87a52","line":561,"updated":"2018-06-25 19:45:02.000000000","message":"Should add some unit test coverage for these.  Probably in this method: nova.tests.unit.compute.test_provider_tree.TestProviderTree.test_add_remove_traits","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"},{"author":{"_account_id":26355,"name":"yuqian","email":"yu.qian@99cloud.net","username":"yuqian"},"change_message_id":"dd832327b90cde846d5cba2760af8c482b261455","unresolved":false,"context_lines":[{"line_number":558,"context_line":"                             to be affected."},{"line_number":559,"context_line":"        :param traits: String names of traits to be added."},{"line_number":560,"context_line":"        \"\"\""},{"line_number":561,"context_line":"        if not traits:"},{"line_number":562,"context_line":"            return"},{"line_number":563,"context_line":"        with self.lock:"},{"line_number":564,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_1ebbe30e","line":561,"in_reply_to":"5f7c97a3_fbd87a52","updated":"2018-06-25 21:18:17.000000000","message":"I agree with this view","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"bfa48b4fba4ad59abea774c34221afdb02171bfd","unresolved":false,"context_lines":[{"line_number":558,"context_line":"                             to be affected."},{"line_number":559,"context_line":"        :param traits: String names of traits to be added."},{"line_number":560,"context_line":"        \"\"\""},{"line_number":561,"context_line":"        if not traits:"},{"line_number":562,"context_line":"            return"},{"line_number":563,"context_line":"        with self.lock:"},{"line_number":564,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_121dd40f","line":561,"in_reply_to":"5f7c97a3_fbd87a52","updated":"2018-06-28 07:43:11.000000000","message":"Yeah, added","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a9e3afb675aa50c76a99764f9a5a8b6ca59158c2","unresolved":false,"context_lines":[{"line_number":637,"context_line":"            compute.manager.update_available_resource(ctx)"},{"line_number":638,"context_line":"        LOG.info(\u0027Finished with periodics\u0027)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def _create_trait(self, trait):"},{"line_number":641,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_3c1d9572","line":640,"updated":"2018-06-25 19:45:02.000000000","message":"nit: would prefer to see this closer to similar methods, like around L423.","commit_id":"f51f0540340a274460a7ef44f0346f42a9783e9e"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"bfa48b4fba4ad59abea774c34221afdb02171bfd","unresolved":false,"context_lines":[{"line_number":637,"context_line":"            compute.manager.update_available_resource(ctx)"},{"line_number":638,"context_line":"        LOG.info(\u0027Finished with periodics\u0027)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def _create_trait(self, trait):"},{"line_number":641,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_321a5018","line":640,"in_reply_to":"5f7c97a3_3c1d9572","updated":"2018-06-28 07:43:11.000000000","message":"Done","commit_id":"f51f0540340a274460a7ef44f0346f42a9783e9e"}],"nova/tests/functional/libvirt/test_report_cpu_traits.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fb6192202a6a98ddd4c4f75eb0807055a94d0d92","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.useFixture("},{"line_number":36,"context_line":"            fixtures.MockPatch("},{"line_number":37,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.init_host\u0027))"},{"line_number":38,"context_line":"        self.useFixture("},{"line_number":39,"context_line":"            fixtures.MockPatch("},{"line_number":40,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.spawn\u0027))"},{"line_number":41,"context_line":"        self.useFixture("},{"line_number":42,"context_line":"            fixtures.MockPatch(\u0027nova.virt.libvirt.utils.get_fs_info\u0027))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.assertEqual([], self._get_all_providers())"},{"line_number":45,"context_line":"        self.compute \u003d self._start_compute(CONF.host)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_95fcdbb6","line":42,"range":{"start_line":38,"start_character":0,"end_line":42,"end_character":70},"updated":"2018-06-22 15:36:21.000000000","message":"These aren\u0027t needed, since you\u0027re not actually spawning an instance.","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c9100c80ba1a90b7728f54fd063a935c97952b5b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.useFixture("},{"line_number":36,"context_line":"            fixtures.MockPatch("},{"line_number":37,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.init_host\u0027))"},{"line_number":38,"context_line":"        self.useFixture("},{"line_number":39,"context_line":"            fixtures.MockPatch("},{"line_number":40,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.spawn\u0027))"},{"line_number":41,"context_line":"        self.useFixture("},{"line_number":42,"context_line":"            fixtures.MockPatch(\u0027nova.virt.libvirt.utils.get_fs_info\u0027))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.assertEqual([], self._get_all_providers())"},{"line_number":45,"context_line":"        self.compute \u003d self._start_compute(CONF.host)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_60092dda","line":42,"range":{"start_line":38,"start_character":0,"end_line":42,"end_character":70},"in_reply_to":"5f7c97a3_95fcdbb6","updated":"2018-06-24 16:48:10.000000000","message":"Done","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fb6192202a6a98ddd4c4f75eb0807055a94d0d92","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        nodename \u003d self.compute.manager._get_nodename(None)"},{"line_number":47,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _add_trait(self, trait):"},{"line_number":50,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":53,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_f5e18ffd","line":50,"range":{"start_line":49,"start_character":0,"end_line":50,"end_character":78},"updated":"2018-06-22 15:36:21.000000000","message":"May as well put this in the base class.  (I would also name it _create_trait - at first glance I thought it was for adding a trait to a provider.)","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c9100c80ba1a90b7728f54fd063a935c97952b5b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        nodename \u003d self.compute.manager._get_nodename(None)"},{"line_number":47,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _add_trait(self, trait):"},{"line_number":50,"context_line":"        return self.placement_api.put(\u0027/traits/%s\u0027 % trait, {}, version\u003d\u00271.6\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":53,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_800ec9e1","line":50,"range":{"start_line":49,"start_character":0,"end_line":50,"end_character":78},"in_reply_to":"5f7c97a3_f5e18ffd","updated":"2018-06-24 16:48:10.000000000","message":"Done","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fb6192202a6a98ddd4c4f75eb0807055a94d0d92","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                              self._get_provider_traits(self.host_uuid))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self._add_trait(\u0027CUSTOM_TRAITS\u0027)"},{"line_number":57,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":58,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":59,"context_line":"        self._run_periodics()"},{"line_number":60,"context_line":"        # CPU traits should be correctly set and non-cpu traits are unaffected."},{"line_number":61,"context_line":"        self.assertItemsEqual("},{"line_number":62,"context_line":"            [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027CUSTOM_TRAITS\u0027],"},{"line_number":63,"context_line":"            self._get_provider_traits(self.host_uuid)"},{"line_number":64,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_b54b1726","line":64,"range":{"start_line":57,"start_character":0,"end_line":64,"end_character":9},"updated":"2018-06-22 15:36:21.000000000","message":"Yeah, nice, AVX disappears and CUSTOM_TRAITS stays.  This is good stuff.","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"da19bd24525c9e251f36315e269f27a307538b7d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"},{"line_number":46,"context_line":"                              self._get_provider_traits(self.host_uuid))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self._add_trait(\u0027CUSTOM_TRAITS\u0027)"},{"line_number":49,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":50,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":51,"context_line":"        self._run_periodics()"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_d95d9c16","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":40},"updated":"2018-06-25 02:24:31.000000000","message":"didn\u0027t saw where this defined,do you mean create_trait?","commit_id":"f51f0540340a274460a7ef44f0346f42a9783e9e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe80aceed4ec3cf14a5b16b967f228f8a19f1e4f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(LibvirtReportTraitsTests, self).setUp()"},{"line_number":30,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":31,"context_line":"                        \u0027nova.virt.libvirt.driver.libvirt\u0027,"},{"line_number":32,"context_line":"                        fakelibvirt))"},{"line_number":33,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027nova.virt.libvirt.host.libvirt\u0027,"},{"line_number":34,"context_line":"                        fakelibvirt))"},{"line_number":35,"context_line":"        self.useFixture("},{"line_number":36,"context_line":"            fixtures.MockPatch("},{"line_number":37,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.init_host\u0027))"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_25137e5b","line":34,"range":{"start_line":30,"start_character":8,"end_line":34,"end_character":37},"updated":"2018-07-03 19:55:42.000000000","message":"Why not just use FakeLibvirtFixture which already does this?","commit_id":"0c9b9eee3fe164901a19a1ed01afa84e9a1bc2f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7067e6b9fc63d037e9e1649c4ef6e2d7ba4205e0","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(LibvirtReportTraitsTests, self).setUp()"},{"line_number":30,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":31,"context_line":"                        \u0027nova.virt.libvirt.driver.libvirt\u0027,"},{"line_number":32,"context_line":"                        fakelibvirt))"},{"line_number":33,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027nova.virt.libvirt.host.libvirt\u0027,"},{"line_number":34,"context_line":"                        fakelibvirt))"},{"line_number":35,"context_line":"        self.useFixture("},{"line_number":36,"context_line":"            fixtures.MockPatch("},{"line_number":37,"context_line":"                \u0027nova.virt.libvirt.driver.LibvirtDriver.init_host\u0027))"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_e59d86bb","line":34,"range":{"start_line":30,"start_character":8,"end_line":34,"end_character":37},"in_reply_to":"5f7c97a3_25137e5b","updated":"2018-07-03 19:59:44.000000000","message":"Nevermind, Eric posted that on top of this change.","commit_id":"0c9b9eee3fe164901a19a1ed01afa84e9a1bc2f3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3fa51315c1f07d6691be8ee6b82f3eff598ec471","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.assertEqual([], self._get_all_providers())"},{"line_number":40,"context_line":"        self.compute \u003d self._start_compute(CONF.host)"},{"line_number":41,"context_line":"        nodename \u003d self.compute.manager._get_nodename(None)"},{"line_number":42,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":45,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_d3065d22","line":42,"updated":"2018-06-29 13:23:56.000000000","message":"When we saw this weird file system failure in another patch, mocking get_fs_info in the test setUp fixed it.  Please see https://review.openstack.org/#/c/560459/16..17/nova/tests/functional/libvirt/test_shared_resource_provider.py","commit_id":"0c9b9eee3fe164901a19a1ed01afa84e9a1bc2f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":48,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"},{"line_number":49,"context_line":"                              self._get_provider_traits(self.host_uuid))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self._create_trait(\u0027CUSTOM_TRAITS\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_c8cf3fb1","line":48,"updated":"2018-07-03 21:18:17.000000000","message":"A comment here would be useful - I\u0027m assuming these get reported on initial node startup and these specific trait values are coming from fakelibvirt.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":48,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"},{"line_number":49,"context_line":"                              self._get_provider_traits(self.host_uuid))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self._create_trait(\u0027CUSTOM_TRAITS\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ce5502fb","line":48,"in_reply_to":"5f7c97a3_c8cf3fb1","updated":"2018-07-04 07:17:46.000000000","message":"Yep","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":53,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":54,"context_line":"        self._run_periodics()"},{"line_number":55,"context_line":"        # CPU traits should be correctly set and non-cpu traits are unaffected."},{"line_number":56,"context_line":"        self.assertItemsEqual("},{"line_number":57,"context_line":"            [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027CUSTOM_TRAITS\u0027],"},{"line_number":58,"context_line":"            self._get_provider_traits(self.host_uuid)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_a8ca039d","line":55,"updated":"2018-07-03 21:18:17.000000000","message":"OK HW_CPU_X86_AVX is dropped because we consider that nova-compute \"owns\" standard traits on the compute node resource provider, correct?","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":53,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":54,"context_line":"        self._run_periodics()"},{"line_number":55,"context_line":"        # CPU traits should be correctly set and non-cpu traits are unaffected."},{"line_number":56,"context_line":"        self.assertItemsEqual("},{"line_number":57,"context_line":"            [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027CUSTOM_TRAITS\u0027],"},{"line_number":58,"context_line":"            self._get_provider_traits(self.host_uuid)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8e64eae6","line":55,"in_reply_to":"5f7c97a3_a8ca039d","updated":"2018-07-04 07:17:46.000000000","message":"Exactly","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":58,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":59,"context_line":"        self._run_periodics()"},{"line_number":60,"context_line":"        # CPU traits should be correctly set and non-cpu traits are unaffected."},{"line_number":61,"context_line":"        self.assertItemsEqual("},{"line_number":62,"context_line":"            [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027CUSTOM_TRAITS\u0027],"},{"line_number":63,"context_line":"            self._get_provider_traits(self.host_uuid)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_74d0d42b","line":60,"updated":"2018-07-20 20:47:14.000000000","message":"To be clear, HW_CPU_X86_AVX is filtered out b/c nova-compute \"owns\" CPU traits and it\u0027s not in the baseline for the host?","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        new_traits \u003d [\u0027CUSTOM_TRAITS\u0027, \u0027HW_CPU_X86_AVX\u0027]"},{"line_number":58,"context_line":"        self._set_provider_traits(self.host_uuid, new_traits)"},{"line_number":59,"context_line":"        self._run_periodics()"},{"line_number":60,"context_line":"        # CPU traits should be correctly set and non-cpu traits are unaffected."},{"line_number":61,"context_line":"        self.assertItemsEqual("},{"line_number":62,"context_line":"            [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027CUSTOM_TRAITS\u0027],"},{"line_number":63,"context_line":"            self._get_provider_traits(self.host_uuid)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_e1a1713c","line":60,"in_reply_to":"5f7c97a3_74d0d42b","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b45bd2f11c7b76d3db7e65e988bdd3c184e805f2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.useFixture("},{"line_number":40,"context_line":"            fixtures.MockPatch(\u0027nova.virt.libvirt.utils.get_fs_info\u0027))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.flags(virt_type\u003d\u0027qemu\u0027,"},{"line_number":43,"context_line":"                   cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":44,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":45,"context_line":"        self.assertEqual([], self._get_all_providers())"},{"line_number":46,"context_line":"        self.compute \u003d self._start_compute(CONF.host)"},{"line_number":47,"context_line":"        nodename \u003d self.compute.manager._get_nodename(None)"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_363a3bc5","line":44,"range":{"start_line":42,"start_character":8,"end_line":44,"end_character":35},"updated":"2018-07-23 19:41:05.000000000","message":"Is this needed? Removing it doesn\u0027t seem to make a difference in the test.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e3899d0c8d6171c7b08a727130a5d126c38fbee0","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                   cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":44,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":45,"context_line":"        self.assertEqual([], self._get_all_providers())"},{"line_number":46,"context_line":"        self.compute \u003d self._start_compute(CONF.host)"},{"line_number":47,"context_line":"        nodename \u003d self.compute.manager._get_nodename(None)"},{"line_number":48,"context_line":"        self.host_uuid \u003d self._get_provider_uuid_by_host(nodename)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_report_cpu_traits(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_d63507a9","line":47,"range":{"start_line":46,"start_character":8,"end_line":47,"end_character":59},"updated":"2018-07-23 19:49:36.000000000","message":"You can just get the host name using compute.manager.host.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"311251904201a6aec1d3ffc893ac27d4121299e0","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_report_cpu_traits(self):"},{"line_number":51,"context_line":"        # Test CPU traits reported on initial node startup, these specific"},{"line_number":52,"context_line":"        # trait values are comming from fakelibvirt\u0027s baselineCPU result."},{"line_number":53,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_AESNI\u0027],"},{"line_number":54,"context_line":"                              self._get_provider_traits(self.host_uuid))"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_d64bc75b","line":52,"range":{"start_line":52,"start_character":27,"end_line":52,"end_character":34},"updated":"2018-07-23 19:40:21.000000000","message":"coming","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"}],"nova/tests/unit/compute/test_provider_tree.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f09599ec82028f08d53916dfeb8d17a198fe3d7","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        cn \u003d self.compute_node1"},{"line_number":563,"context_line":"        pt \u003d self._pt_with_cns()"},{"line_number":564,"context_line":"        self.assertEqual(set([]), pt.data(cn.uuid).traits)"},{"line_number":565,"context_line":"        # Test adding with no trait provided"},{"line_number":566,"context_line":"        pt.add_traits(cn.uuid)"},{"line_number":567,"context_line":"        self.assertEqual("},{"line_number":568,"context_line":"            set([]),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_d6d3c736","line":565,"updated":"2018-06-28 14:10:27.000000000","message":"This is okay, but doesn\u0027t really test the short-circuit nature of the code you\u0027ve added.  What would in fact test it more thoroughly is if you used a bogus UUID.  Before, that would raise ValueError, but now it won\u0027t.  (Which, actually, I\u0027m not sure is a great thing.  But probably not worth getting excited about.)","commit_id":"0c9b9eee3fe164901a19a1ed01afa84e9a1bc2f3"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"55c95b45b6f30d1e7463dd224eb0ca9b8095fd55","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        cn \u003d self.compute_node1"},{"line_number":563,"context_line":"        pt \u003d self._pt_with_cns()"},{"line_number":564,"context_line":"        self.assertEqual(set([]), pt.data(cn.uuid).traits)"},{"line_number":565,"context_line":"        # Test adding with no trait provided"},{"line_number":566,"context_line":"        pt.add_traits(cn.uuid)"},{"line_number":567,"context_line":"        self.assertEqual("},{"line_number":568,"context_line":"            set([]),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_2fddab12","line":565,"in_reply_to":"5f7c97a3_d6d3c736","updated":"2018-07-03 07:48:35.000000000","message":"Done","commit_id":"0c9b9eee3fe164901a19a1ed01afa84e9a1bc2f3"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8fb5829727fa9c29b02dc190cdd0f097f15d7350","unresolved":false,"context_lines":[{"line_number":19807,"context_line":"    def test_custom_traits(self, mock_baseline, mock_conf):"},{"line_number":19808,"context_line":"        mock_conf.libvirt.cpu_mode \u003d \u0027custom\u0027"},{"line_number":19809,"context_line":"        mock_conf.libvirt.cpu_model \u003d \u0027Broadwell-noTSX\u0027"},{"line_number":19810,"context_line":"        mock_baseline.return_value \u003d _fake_broadwell_cpu_feature"},{"line_number":19811,"context_line":"        traits \u003d self.drvr.get_cpu_traits()"},{"line_number":19812,"context_line":"        self.assertEqual("},{"line_number":19813,"context_line":"            sorted(["},{"line_number":19814,"context_line":"                \u0027HW_CPU_X86_BMI2\u0027,"},{"line_number":19815,"context_line":"                \u0027HW_CPU_X86_AVX2\u0027,"},{"line_number":19816,"context_line":"                \u0027HW_CPU_X86_BMI\u0027,"},{"line_number":19817,"context_line":"                \u0027HW_CPU_X86_AVX\u0027,"},{"line_number":19818,"context_line":"                \u0027HW_CPU_X86_AESNI\u0027,"},{"line_number":19819,"context_line":"                \u0027HW_CPU_X86_SSE42\u0027,"},{"line_number":19820,"context_line":"                \u0027HW_CPU_X86_SSE41\u0027,"},{"line_number":19821,"context_line":"                \u0027HW_CPU_X86_FMA3\u0027,"},{"line_number":19822,"context_line":"                \u0027HW_CPU_X86_SSSE3\u0027,"},{"line_number":19823,"context_line":"                \u0027HW_CPU_X86_CLMUL\u0027,"},{"line_number":19824,"context_line":"                \u0027HW_CPU_X86_SSE2\u0027,"},{"line_number":19825,"context_line":"                \u0027HW_CPU_X86_SSE\u0027,"},{"line_number":19826,"context_line":"                \u0027HW_CPU_X86_MMX\u0027"},{"line_number":19827,"context_line":"            ]),"},{"line_number":19828,"context_line":"            sorted(traits)"},{"line_number":19829,"context_line":"        )"},{"line_number":19830,"context_line":""},{"line_number":19831,"context_line":""},{"line_number":19832,"context_line":"class LibvirtVolumeUsageTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_fb972239","line":19829,"range":{"start_line":19810,"start_character":8,"end_line":19829,"end_character":9},"updated":"2018-04-24 09:24:06.000000000","message":"This assert doesn\u0027t sound meaningful. Since you fake the return value of baselineCPU, so it always returns the expected value, you should assert the arguments which passed to the baselineCPU method.","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"875a1bdfa7ca6ca4f1e9de143f1be4b4a4a70d86","unresolved":false,"context_lines":[{"line_number":19807,"context_line":"    def test_custom_traits(self, mock_baseline, mock_conf):"},{"line_number":19808,"context_line":"        mock_conf.libvirt.cpu_mode \u003d \u0027custom\u0027"},{"line_number":19809,"context_line":"        mock_conf.libvirt.cpu_model \u003d \u0027Broadwell-noTSX\u0027"},{"line_number":19810,"context_line":"        mock_baseline.return_value \u003d _fake_broadwell_cpu_feature"},{"line_number":19811,"context_line":"        traits \u003d self.drvr.get_cpu_traits()"},{"line_number":19812,"context_line":"        self.assertEqual("},{"line_number":19813,"context_line":"            sorted(["},{"line_number":19814,"context_line":"                \u0027HW_CPU_X86_BMI2\u0027,"},{"line_number":19815,"context_line":"                \u0027HW_CPU_X86_AVX2\u0027,"},{"line_number":19816,"context_line":"                \u0027HW_CPU_X86_BMI\u0027,"},{"line_number":19817,"context_line":"                \u0027HW_CPU_X86_AVX\u0027,"},{"line_number":19818,"context_line":"                \u0027HW_CPU_X86_AESNI\u0027,"},{"line_number":19819,"context_line":"                \u0027HW_CPU_X86_SSE42\u0027,"},{"line_number":19820,"context_line":"                \u0027HW_CPU_X86_SSE41\u0027,"},{"line_number":19821,"context_line":"                \u0027HW_CPU_X86_FMA3\u0027,"},{"line_number":19822,"context_line":"                \u0027HW_CPU_X86_SSSE3\u0027,"},{"line_number":19823,"context_line":"                \u0027HW_CPU_X86_CLMUL\u0027,"},{"line_number":19824,"context_line":"                \u0027HW_CPU_X86_SSE2\u0027,"},{"line_number":19825,"context_line":"                \u0027HW_CPU_X86_SSE\u0027,"},{"line_number":19826,"context_line":"                \u0027HW_CPU_X86_MMX\u0027"},{"line_number":19827,"context_line":"            ]),"},{"line_number":19828,"context_line":"            sorted(traits)"},{"line_number":19829,"context_line":"        )"},{"line_number":19830,"context_line":""},{"line_number":19831,"context_line":""},{"line_number":19832,"context_line":"class LibvirtVolumeUsageTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_74154f3f","line":19829,"range":{"start_line":19810,"start_character":8,"end_line":19829,"end_character":9},"in_reply_to":"9f6a8fd7_fb972239","updated":"2018-04-25 03:09:40.000000000","message":"Done","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d42046c6556808dea8158e86c1098596f42e3033","unresolved":false,"context_lines":[{"line_number":17399,"context_line":"        self.assertEqual(inventory,"},{"line_number":17400,"context_line":"                         (self.pt.data(self.cn_rp.uuid)).inventory)"},{"line_number":17401,"context_line":""},{"line_number":17402,"context_line":"    def test_update_provider_tree_with_cpu_traits(self):"},{"line_number":17403,"context_line":"        self._test_update_provider_tree()"},{"line_number":17404,"context_line":"        self.assertEqual(set(self.cpu_traits),"},{"line_number":17405,"context_line":"                         self.pt.data(self.cn_rp.uuid).traits)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_7d247d60","line":17402,"updated":"2018-05-29 21:34:46.000000000","message":"nit: This is okay, but could be folded into the test on L17386.","commit_id":"bb64b0ce5c5a4a225d4a3eb3c73a7027618ee33a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d42046c6556808dea8158e86c1098596f42e3033","unresolved":false,"context_lines":[{"line_number":19979,"context_line":"    def test_passthough_traits(self, mock_conf):"},{"line_number":19980,"context_line":"        mock_conf.libvirt.cpu_mode \u003d \u0027host-passthrough\u0027"},{"line_number":19981,"context_line":"        traits \u003d self.drvr._get_cpu_traits()"},{"line_number":19982,"context_line":"        self.assertEqual(sorted([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027]),"},{"line_number":19983,"context_line":"                         sorted(traits))"},{"line_number":19984,"context_line":""},{"line_number":19985,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.CONF\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_1d1549e5","line":19982,"range":{"start_line":19982,"start_character":13,"end_line":19982,"end_character":32},"updated":"2018-05-29 21:34:46.000000000","message":"or assertItemsEqual","commit_id":"bb64b0ce5c5a4a225d4a3eb3c73a7027618ee33a"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"1a086578c02c72d1f98d3f63745330627f78f544","unresolved":false,"context_lines":[{"line_number":20179,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20180,"context_line":""},{"line_number":20181,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.CONF\u0027)"},{"line_number":20182,"context_line":"    def test_passthough_traits(self, mock_conf):"},{"line_number":20183,"context_line":"        mock_conf.libvirt.cpu_mode \u003d \u0027host-passthrough\u0027"},{"line_number":20184,"context_line":"        traits \u003d self.drvr._get_cpu_traits()"},{"line_number":20185,"context_line":"        self.assertItemsEqual([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_a4a79a09","line":20182,"updated":"2018-06-20 14:42:05.000000000","message":"nit: s/passthough/passthrough","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"f4a3a8c29fd84d2e32ddabcb8a2d863d59737b9b","unresolved":false,"context_lines":[{"line_number":20591,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20592,"context_line":"    def test_passthrough_traits_without_cpu_model(self, mock_baseline,"},{"line_number":20593,"context_line":"                                                  mock_cap):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027host-model\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_cap.return_value \u003d \"\"\""},{"line_number":20597,"context_line":"            \u003ccapabilities\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_29933950","line":20594,"updated":"2018-06-22 06:42:39.000000000","message":"I don\u0027t know if this case is vaild. just saying: It\u0027s not the s390x case, as the s390x case uses cpu_mode \u003d None. I can\u0027t asses this for other platforms","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"11402b48ea422188ba4fb56e50eef4af19978975","unresolved":false,"context_lines":[{"line_number":20591,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20592,"context_line":"    def test_passthrough_traits_without_cpu_model(self, mock_baseline,"},{"line_number":20593,"context_line":"                                                  mock_cap):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027host-model\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_cap.return_value \u003d \"\"\""},{"line_number":20597,"context_line":"            \u003ccapabilities\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_ac70b70a","line":20594,"in_reply_to":"5f7c97a3_095bdd53","updated":"2018-06-22 08:03:41.000000000","message":"Done","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"fb2b73a7f0f27e956df3ac2e1fc7ab29713e3365","unresolved":false,"context_lines":[{"line_number":20591,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20592,"context_line":"    def test_passthrough_traits_without_cpu_model(self, mock_baseline,"},{"line_number":20593,"context_line":"                                                  mock_cap):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027host-model\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_cap.return_value \u003d \"\"\""},{"line_number":20597,"context_line":"            \u003ccapabilities\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_095bdd53","line":20594,"in_reply_to":"5f7c97a3_29933950","updated":"2018-06-22 07:11:09.000000000","message":"This test is definitively confusing and should be changed. Cause in the s390x use case cpu_mode is always none. I would prefer an explicit test for this s390x scenario. I also suggest to rename the \u003carch\u003e in this test to something else than s390x....","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"f4a3a8c29fd84d2e32ddabcb8a2d863d59737b9b","unresolved":false,"context_lines":[{"line_number":20615,"context_line":"    def test_traits_with_no_baseline_support(self, mock_baseline):"},{"line_number":20616,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20617,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20618,"context_line":"        not_supported_exc \u003d fakelibvirt.make_libvirtError("},{"line_number":20619,"context_line":"            fakelibvirt.libvirtError,"},{"line_number":20620,"context_line":"            \u0027this function is not supported by the connection driver\u0027,"},{"line_number":20621,"context_line":"            error_code\u003dfakelibvirt.VIR_ERR_NO_SUPPORT)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_e9922158","line":20618,"updated":"2018-06-22 06:42:39.000000000","message":"cpu_mode \u003d None is the s390x case. But in that case the error thrown by the baseline call is \"missing model...\" and not \"function not supported\". So I guess this won\u0027t work for s390x","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"f11ddfa2ee0e26be29ad0c0627d95a69d841a614","unresolved":false,"context_lines":[{"line_number":20623,"context_line":""},{"line_number":20624,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.getCapabilities\u0027)"},{"line_number":20625,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20626,"context_line":"    def test_get_traits_on_s390x(self, mock_baseline, mock_cap):"},{"line_number":20627,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20628,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20629,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_8f3a8d95","line":20626,"updated":"2018-06-22 08:42:40.000000000","message":"excellent - thank you! Let\u0027s wait for the CI result...","commit_id":"035104a11eab270d9af21ca8249ddd12a0a88e08"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a9e3afb675aa50c76a99764f9a5a8b6ca59158c2","unresolved":false,"context_lines":[{"line_number":17881,"context_line":"            },"},{"line_number":17882,"context_line":"        }"},{"line_number":17883,"context_line":""},{"line_number":17884,"context_line":"    def _filter_traits(self, traits):"},{"line_number":17885,"context_line":"        return [t for t in traits if traits[t]]"},{"line_number":17886,"context_line":""},{"line_number":17887,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.LibvirtDriver._get_cpu_traits\u0027,"},{"line_number":17888,"context_line":"                new\u003dmock.Mock(return_value\u003dcpu_traits))"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_1b0e96e3","line":17885,"range":{"start_line":17884,"start_character":4,"end_line":17885,"end_character":47},"updated":"2018-06-25 19:45:02.000000000","message":"Mm, I get what you were doing here, but this way we\u0027re only testing that the True values are present.  We should really be asserting the presence of the False values as well, since they\u0027re important to the algorithm.  Suggest something like:\n\n def _assert_traits(self, expected, actual):\n     exp \u003d {t: t in expected for t in libvirt_utils.CPU_TRAITS_MAPPING.values()}\n     self.assertEqual(exp, actual)\n\nIt would also be nice to find a way to put the method in a module-level method or a mixin so you only have to define it once.","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"bfa48b4fba4ad59abea774c34221afdb02171bfd","unresolved":false,"context_lines":[{"line_number":17881,"context_line":"            },"},{"line_number":17882,"context_line":"        }"},{"line_number":17883,"context_line":""},{"line_number":17884,"context_line":"    def _filter_traits(self, traits):"},{"line_number":17885,"context_line":"        return [t for t in traits if traits[t]]"},{"line_number":17886,"context_line":""},{"line_number":17887,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.LibvirtDriver._get_cpu_traits\u0027,"},{"line_number":17888,"context_line":"                new\u003dmock.Mock(return_value\u003dcpu_traits))"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_d2ebdcda","line":17885,"range":{"start_line":17884,"start_character":4,"end_line":17885,"end_character":47},"in_reply_to":"5f7c97a3_1b0e96e3","updated":"2018-06-28 07:43:11.000000000","message":"Add a mixin class.","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a9e3afb675aa50c76a99764f9a5a8b6ca59158c2","unresolved":false,"context_lines":[{"line_number":20531,"context_line":"        self.assertRaises(test.TestingException,"},{"line_number":20532,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20533,"context_line":""},{"line_number":20534,"context_line":"    def _filter_traits(self, traits):"},{"line_number":20535,"context_line":"        return [t for t in traits if traits[t]]"},{"line_number":20536,"context_line":""},{"line_number":20537,"context_line":"    def test_passthrough_traits(self):"},{"line_number":20538,"context_line":"        self.flags(cpu_mode\u003d\u0027host-passthrough\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_9b12a6fc","line":20535,"range":{"start_line":20534,"start_character":0,"end_line":20535,"end_character":47},"updated":"2018-06-25 19:45:02.000000000","message":"see above","commit_id":"b79e115300bf8a6c151e7e4423200b54b751fa6e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c6623dc8c49f10990daebbca6a9528557468fd98","unresolved":false,"context_lines":[{"line_number":20583,"context_line":"        self.assertRaises(test.TestingException,"},{"line_number":20584,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20585,"context_line":""},{"line_number":20586,"context_line":"    def test_passthrough_traits(self):"},{"line_number":20587,"context_line":"        self.flags(cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":20588,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20589,"context_line":"        self.assertTraitsEqual([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_d0b1ea92","line":20586,"range":{"start_line":20586,"start_character":8,"end_line":20586,"end_character":31},"updated":"2018-07-19 02:55:24.000000000","message":"nit, I prefer the name like \u0027test_cpu_traits_with_passthough_mode\u0027.","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":20583,"context_line":"        self.assertRaises(test.TestingException,"},{"line_number":20584,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20585,"context_line":""},{"line_number":20586,"context_line":"    def test_passthrough_traits(self):"},{"line_number":20587,"context_line":"        self.flags(cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":20588,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20589,"context_line":"        self.assertTraitsEqual([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_592f3e3d","line":20586,"range":{"start_line":20586,"start_character":8,"end_line":20586,"end_character":31},"in_reply_to":"5f7c97a3_d0b1ea92","updated":"2018-07-19 09:45:40.000000000","message":"will rename these tests to start with \u0027test_cpu_traits\u0027, thanks","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c6623dc8c49f10990daebbca6a9528557468fd98","unresolved":false,"context_lines":[{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""},{"line_number":20592,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20593,"context_line":"    def test_traits_without_mode(self, mock_baseline):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_baseline.return_value \u003d _fake_qemu64_cpu_feature"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_90aff229","line":20593,"range":{"start_line":20593,"start_character":4,"end_line":20593,"end_character":54},"updated":"2018-07-19 02:55:24.000000000","message":"test_cpu_traits_with_mode_none","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""},{"line_number":20592,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20593,"context_line":"    def test_traits_without_mode(self, mock_baseline):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_baseline.return_value \u003d _fake_qemu64_cpu_feature"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_f9216a50","line":20593,"range":{"start_line":20593,"start_character":4,"end_line":20593,"end_character":54},"in_reply_to":"5f7c97a3_90aff229","updated":"2018-07-19 09:45:40.000000000","message":"ditto","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c6623dc8c49f10990daebbca6a9528557468fd98","unresolved":false,"context_lines":[{"line_number":20605,"context_line":"\u0027\u0027\u0027], 1)"},{"line_number":20606,"context_line":""},{"line_number":20607,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20608,"context_line":"    def test_custom_traits(self, mock_baseline):"},{"line_number":20609,"context_line":"        self.flags(cpu_mode\u003d\u0027custom\u0027,"},{"line_number":20610,"context_line":"                   cpu_model\u003d\u0027Broadwell-noTSX\u0027,"},{"line_number":20611,"context_line":"                   group\u003d\u0027libvirt\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_50a5da46","line":20608,"range":{"start_line":20608,"start_character":4,"end_line":20608,"end_character":26},"updated":"2018-07-19 02:55:24.000000000","message":"test_cpu_traits_with_mode_custom","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":20605,"context_line":"\u0027\u0027\u0027], 1)"},{"line_number":20606,"context_line":""},{"line_number":20607,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20608,"context_line":"    def test_custom_traits(self, mock_baseline):"},{"line_number":20609,"context_line":"        self.flags(cpu_mode\u003d\u0027custom\u0027,"},{"line_number":20610,"context_line":"                   cpu_model\u003d\u0027Broadwell-noTSX\u0027,"},{"line_number":20611,"context_line":"                   group\u003d\u0027libvirt\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_1925465b","line":20608,"range":{"start_line":20608,"start_character":4,"end_line":20608,"end_character":26},"in_reply_to":"5f7c97a3_50a5da46","updated":"2018-07-19 09:45:40.000000000","message":"ditto","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c6623dc8c49f10990daebbca6a9528557468fd98","unresolved":false,"context_lines":[{"line_number":20636,"context_line":""},{"line_number":20637,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.getCapabilities\u0027)"},{"line_number":20638,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20639,"context_line":"    def test_passthrough_traits_without_cpu_model(self, mock_baseline,"},{"line_number":20640,"context_line":"                                                  mock_cap):"},{"line_number":20641,"context_line":"        self.flags(cpu_mode\u003d\u0027host-model\u0027,"},{"line_number":20642,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20643,"context_line":"        mock_cap.return_value \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_f03746fc","line":20640,"range":{"start_line":20639,"start_character":3,"end_line":20640,"end_character":60},"updated":"2018-07-19 02:55:24.000000000","message":"test_cpu_traits_with_mode_host_model_and_no_featurtes?","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":20636,"context_line":""},{"line_number":20637,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.getCapabilities\u0027)"},{"line_number":20638,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20639,"context_line":"    def test_passthrough_traits_without_cpu_model(self, mock_baseline,"},{"line_number":20640,"context_line":"                                                  mock_cap):"},{"line_number":20641,"context_line":"        self.flags(cpu_mode\u003d\u0027host-model\u0027,"},{"line_number":20642,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20643,"context_line":"        mock_cap.return_value \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_991076f6","line":20640,"range":{"start_line":20639,"start_character":3,"end_line":20640,"end_character":60},"in_reply_to":"5f7c97a3_f03746fc","updated":"2018-07-19 09:45:40.000000000","message":"This one looks weird, probably this case doesn\u0027t exist at all, wil remove this.","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c6623dc8c49f10990daebbca6a9528557468fd98","unresolved":false,"context_lines":[{"line_number":20743,"context_line":""},{"line_number":20744,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20745,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.utils.cpu_features_to_traits\u0027)"},{"line_number":20746,"context_line":"    def test_custom_extra_flags(self, mock_to_traits, mock_baseline):"},{"line_number":20747,"context_line":"        \"\"\"Test if extra flags are accounted when cpu_mode is set to custom."},{"line_number":20748,"context_line":"        \"\"\""},{"line_number":20749,"context_line":"        self.flags(cpu_mode\u003d\u0027custom\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_f353d013","line":20746,"range":{"start_line":20746,"start_character":8,"end_line":20746,"end_character":31},"updated":"2018-07-19 02:55:24.000000000","message":"One more test case for the mode is None and with extra flag","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"d6cffc8a6a864fb621569a26d5ba11f4caaf7743","unresolved":false,"context_lines":[{"line_number":20743,"context_line":""},{"line_number":20744,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20745,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.utils.cpu_features_to_traits\u0027)"},{"line_number":20746,"context_line":"    def test_custom_extra_flags(self, mock_to_traits, mock_baseline):"},{"line_number":20747,"context_line":"        \"\"\"Test if extra flags are accounted when cpu_mode is set to custom."},{"line_number":20748,"context_line":"        \"\"\""},{"line_number":20749,"context_line":"        self.flags(cpu_mode\u003d\u0027custom\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_cf37fc4a","line":20746,"range":{"start_line":20746,"start_character":8,"end_line":20746,"end_character":31},"in_reply_to":"5f7c97a3_f353d013","updated":"2018-07-19 11:04:57.000000000","message":"Add more tests, see if address your concern.","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":20743,"context_line":""},{"line_number":20744,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20745,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.utils.cpu_features_to_traits\u0027)"},{"line_number":20746,"context_line":"    def test_custom_extra_flags(self, mock_to_traits, mock_baseline):"},{"line_number":20747,"context_line":"        \"\"\"Test if extra flags are accounted when cpu_mode is set to custom."},{"line_number":20748,"context_line":"        \"\"\""},{"line_number":20749,"context_line":"        self.flags(cpu_mode\u003d\u0027custom\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_d94eeec0","line":20746,"range":{"start_line":20746,"start_character":8,"end_line":20746,"end_character":31},"in_reply_to":"5f7c97a3_f353d013","updated":"2018-07-19 09:45:40.000000000","message":"Do you mean the case where cpu_mode is not set or is set to \u0027none\u0027? If cpu_mode is set to \u0027none\u0027, extra flag conf doesn\u0027t have any impact actually","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":18014,"context_line":"    def assertTraitsEqual(self, expected, actual):"},{"line_number":18015,"context_line":"        exp \u003d {t: t in expected"},{"line_number":18016,"context_line":"               for t in libvirt_utils.CPU_TRAITS_MAPPING.values()}"},{"line_number":18017,"context_line":"        self.assertEqual(exp, actual)"},{"line_number":18018,"context_line":""},{"line_number":18019,"context_line":""},{"line_number":18020,"context_line":"class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_d4e4480d","line":18017,"range":{"start_line":18017,"start_character":13,"end_line":18017,"end_character":24},"updated":"2018-07-20 20:47:14.000000000","message":"assertDictEqual?","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f0970ae378c0c2379d7829abfb21daed6b46739","unresolved":false,"context_lines":[{"line_number":18014,"context_line":"    def assertTraitsEqual(self, expected, actual):"},{"line_number":18015,"context_line":"        exp \u003d {t: t in expected"},{"line_number":18016,"context_line":"               for t in libvirt_utils.CPU_TRAITS_MAPPING.values()}"},{"line_number":18017,"context_line":"        self.assertEqual(exp, actual)"},{"line_number":18018,"context_line":""},{"line_number":18019,"context_line":""},{"line_number":18020,"context_line":"class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_6060e9d1","line":18017,"range":{"start_line":18017,"start_character":13,"end_line":18017,"end_character":24},"in_reply_to":"5f7c97a3_a14a997f","updated":"2018-07-23 18:24:16.000000000","message":"Cool, I learned something new today. :)","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":18014,"context_line":"    def assertTraitsEqual(self, expected, actual):"},{"line_number":18015,"context_line":"        exp \u003d {t: t in expected"},{"line_number":18016,"context_line":"               for t in libvirt_utils.CPU_TRAITS_MAPPING.values()}"},{"line_number":18017,"context_line":"        self.assertEqual(exp, actual)"},{"line_number":18018,"context_line":""},{"line_number":18019,"context_line":""},{"line_number":18020,"context_line":"class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_a14a997f","line":18017,"range":{"start_line":18017,"start_character":13,"end_line":18017,"end_character":24},"in_reply_to":"5f7c97a3_d4e4480d","updated":"2018-07-23 06:37:29.000000000","message":"assertEqual will by default use asserDictEqual method when comparing dictionaries.","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":20584,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20585,"context_line":""},{"line_number":20586,"context_line":"    def test_cpu_traits_with_passthrough_mode(self):"},{"line_number":20587,"context_line":"        self.flags(cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":20588,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20589,"context_line":"        self.assertTraitsEqual([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027],"},{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_94bc90db","line":20588,"range":{"start_line":20587,"start_character":8,"end_line":20588,"end_character":35},"updated":"2018-07-20 20:47:14.000000000","message":"nit: could be a single line? here and below","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":20584,"context_line":"                          self._test_detach_mediated_devices, exc)"},{"line_number":20585,"context_line":""},{"line_number":20586,"context_line":"    def test_cpu_traits_with_passthrough_mode(self):"},{"line_number":20587,"context_line":"        self.flags(cpu_mode\u003d\u0027host-passthrough\u0027,"},{"line_number":20588,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20589,"context_line":"        self.assertTraitsEqual([\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027],"},{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_c100f506","line":20588,"range":{"start_line":20587,"start_character":8,"end_line":20588,"end_character":35},"in_reply_to":"5f7c97a3_94bc90db","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""},{"line_number":20592,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20593,"context_line":"    def test_cpu_traits_with_mode_none(self, mock_baseline):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_baseline.return_value \u003d _fake_qemu64_cpu_feature"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_14c88072","line":20593,"updated":"2018-07-20 20:47:14.000000000","message":"nit: comments for each test describing the test would be nice because these aren\u0027t exactly obvious to piece together given the stubs and such.","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":20590,"context_line":"                               self.drvr._get_cpu_traits())"},{"line_number":20591,"context_line":""},{"line_number":20592,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.libvirt.Connection.baselineCPU\u0027)"},{"line_number":20593,"context_line":"    def test_cpu_traits_with_mode_none(self, mock_baseline):"},{"line_number":20594,"context_line":"        self.flags(cpu_mode\u003d\u0027none\u0027,"},{"line_number":20595,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":20596,"context_line":"        mock_baseline.return_value \u003d _fake_qemu64_cpu_feature"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_e1fdf109","line":20593,"in_reply_to":"5f7c97a3_14c88072","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"}],"nova/virt/driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f66bfd6209e4b1a380ec459741f09081c4a1290","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"        \"\"\""},{"line_number":1682,"context_line":"        return instance.get(\u0027host\u0027)"},{"line_number":1683,"context_line":""},{"line_number":1684,"context_line":"    def get_cpu_traits(self):"},{"line_number":1685,"context_line":"        \"\"\"Get CPU traits exposed to an instance"},{"line_number":1686,"context_line":""},{"line_number":1687,"context_line":"        :returns: a list of traits specified in os-traits library"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_2662ed3f","line":1684,"range":{"start_line":1684,"start_character":0,"end_line":1684,"end_character":29},"updated":"2018-05-07 13:51:11.000000000","message":"There\u0027s no reason to add this to the ComputeDriver base class.  Whatever internal mechanism each driver uses to collect its traits, those should be collected and reported by update_provider_tree.","commit_id":"dff4e63aa85b0b25698657e8e255bbc984f77729"}],"nova/virt/fake.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2ebf6f9264ef592c8ad809d688c1b80197a246ec","unresolved":false,"context_lines":[{"line_number":724,"context_line":""},{"line_number":725,"context_line":"    TRAITS \u003d [\u0027HW_CPU_X86_AESNI\u0027, \u0027HW_CPU_X86_VMX\u0027]"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"    def update_provider_tree(self, provider_tree, nodename):"},{"line_number":728,"context_line":"        update_provider_cpu_traits(provider_tree, nodename, self.TRAITS)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_14533f6e","line":728,"range":{"start_line":727,"start_character":4,"end_line":728,"end_character":72},"updated":"2018-06-19 13:25:13.000000000","message":"I think we want to test the real update_provider_tree method.","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8fb5829727fa9c29b02dc190cdd0f097f15d7350","unresolved":false,"context_lines":[{"line_number":8831,"context_line":"           3. if cpu_mode is neither None nor \u0027custom\u0027(which it must be"},{"line_number":8832,"context_line":"           \u0027host-model\u0027 or \u0027host-passthrough\u0027), use host\u0027s CPU features"},{"line_number":8833,"context_line":"        \"\"\""},{"line_number":8834,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"},{"line_number":8835,"context_line":""},{"line_number":8836,"context_line":"        if not CONF.libvirt.cpu_mode:"},{"line_number":8837,"context_line":"            caps.host.cpu.model \u003d \u0027qemu64\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_3be03acd","line":8834,"range":{"start_line":8834,"start_character":15,"end_line":8834,"end_character":23},"updated":"2018-04-24 09:24:06.000000000","message":"nit, not sure we need deepcopy","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"875a1bdfa7ca6ca4f1e9de143f1be4b4a4a70d86","unresolved":false,"context_lines":[{"line_number":8831,"context_line":"           3. if cpu_mode is neither None nor \u0027custom\u0027(which it must be"},{"line_number":8832,"context_line":"           \u0027host-model\u0027 or \u0027host-passthrough\u0027), use host\u0027s CPU features"},{"line_number":8833,"context_line":"        \"\"\""},{"line_number":8834,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"},{"line_number":8835,"context_line":""},{"line_number":8836,"context_line":"        if not CONF.libvirt.cpu_mode:"},{"line_number":8837,"context_line":"            caps.host.cpu.model \u003d \u0027qemu64\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_d410db02","line":8834,"range":{"start_line":8834,"start_character":15,"end_line":8834,"end_character":23},"in_reply_to":"9f6a8fd7_3be03acd","updated":"2018-04-25 03:09:40.000000000","message":"The content returned from get_capabilities is cached in Host instance, as the code here will change the object, deepcopy is needed to make sure we don\u0027t break things.","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8fb5829727fa9c29b02dc190cdd0f097f15d7350","unresolved":false,"context_lines":[{"line_number":8852,"context_line":"        if features:"},{"line_number":8853,"context_line":"            cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":8854,"context_line":"            cpu.parse_str(features)"},{"line_number":8855,"context_line":"            f_name \u003d [f.name for f in cpu.features]"},{"line_number":8856,"context_line":"            return libvirt_utils.cpu_features_to_traits(f_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_5be3aed9","line":8855,"range":{"start_line":8855,"start_character":12,"end_line":8855,"end_character":18},"updated":"2018-04-24 09:24:06.000000000","message":"nit, f_names","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"875a1bdfa7ca6ca4f1e9de143f1be4b4a4a70d86","unresolved":false,"context_lines":[{"line_number":8852,"context_line":"        if features:"},{"line_number":8853,"context_line":"            cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":8854,"context_line":"            cpu.parse_str(features)"},{"line_number":8855,"context_line":"            f_name \u003d [f.name for f in cpu.features]"},{"line_number":8856,"context_line":"            return libvirt_utils.cpu_features_to_traits(f_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_94102350","line":8855,"range":{"start_line":8855,"start_character":12,"end_line":8855,"end_character":18},"in_reply_to":"9f6a8fd7_5be3aed9","updated":"2018-04-25 03:09:40.000000000","message":"Done","commit_id":"eaedf57dd6b8f5b5ace3444c8264d4d0cf633a2f"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"b20a4b5786600ad765f034cf9ffa8c9ecc1f7a71","unresolved":false,"context_lines":[{"line_number":8754,"context_line":"    def _get_cpu_traits(self):"},{"line_number":8755,"context_line":"        \"\"\"Get cpu traits of vm based on a set of nova libvirt configurations."},{"line_number":8756,"context_line":"           The rules are:"},{"line_number":8757,"context_line":"           1. if cpu_mode is None, translate qemu64 CPU featues to Traits"},{"line_number":8758,"context_line":"           2. if cpu_mode is \u0027custom\u0027, use cpu_model configuration to generate"},{"line_number":8759,"context_line":"           CPU features"},{"line_number":8760,"context_line":"           3. if cpu_mode is neither None nor \u0027custom\u0027(which it must be"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_7274c336","line":8757,"range":{"start_line":8757,"start_character":67,"end_line":8757,"end_character":68},"updated":"2018-05-28 09:38:55.000000000","message":"why capitalization?","commit_id":"7ee09c17cb8b39efc4da8f3eea2ba81d75afd673"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"b20a4b5786600ad765f034cf9ffa8c9ecc1f7a71","unresolved":false,"context_lines":[{"line_number":8757,"context_line":"           1. if cpu_mode is None, translate qemu64 CPU featues to Traits"},{"line_number":8758,"context_line":"           2. if cpu_mode is \u0027custom\u0027, use cpu_model configuration to generate"},{"line_number":8759,"context_line":"           CPU features"},{"line_number":8760,"context_line":"           3. if cpu_mode is neither None nor \u0027custom\u0027(which it must be"},{"line_number":8761,"context_line":"           \u0027host-model\u0027 or \u0027host-passthrough\u0027), use host\u0027s CPU features"},{"line_number":8762,"context_line":"        \"\"\""},{"line_number":8763,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_92715f47","line":8760,"updated":"2018-05-28 09:38:55.000000000","message":"space needed","commit_id":"7ee09c17cb8b39efc4da8f3eea2ba81d75afd673"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"e7c2ec95d7822d4bb529ad6dfbcbb27aa771ec90","unresolved":false,"context_lines":[{"line_number":6370,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6371,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6372,"context_line":"        if traits:"},{"line_number":6373,"context_line":"            provider_tree.add_traits(nodename, *traits)"},{"line_number":6374,"context_line":""},{"line_number":6375,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":6376,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_b22ecd89","line":6373,"range":{"start_line":6373,"start_character":47,"end_line":6373,"end_character":48},"updated":"2018-05-29 11:31:05.000000000","message":"I don\u0027t think \"*\" is needed when passing args to the method","commit_id":"bb64b0ce5c5a4a225d4a3eb3c73a7027618ee33a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d42046c6556808dea8158e86c1098596f42e3033","unresolved":false,"context_lines":[{"line_number":6370,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6371,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6372,"context_line":"        if traits:"},{"line_number":6373,"context_line":"            provider_tree.add_traits(nodename, *traits)"},{"line_number":6374,"context_line":""},{"line_number":6375,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":6376,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_3d04c549","line":6373,"range":{"start_line":6373,"start_character":26,"end_line":6373,"end_character":36},"updated":"2018-05-29 21:34:46.000000000","message":"Unfortunately, this isn\u0027t quite enough.  Since the admin is allowed to set traits, but only traits compute doesn\u0027t \"own\", we decided that update_provider_tree is also responsible for *un*setting any traits it \"owns\".  (Essentially, we want to prevent the admin from pretending that the compute has e.g. SSE when it doesn\u0027t.)\n\nIn this context, the traits you own are (at least) the values in libvirt_utils.CPU_TRAITS_MAPPING.\n\nSo I think you want to do something like:\n\n unset_traits \u003d set(libvirt_utils.CPU_TRAITS_MAPPING.values()) - set(traits)\n provider_tree.remove_traits(nodename, *unset_traits)\n\nAnd of course test appropriately.","commit_id":"bb64b0ce5c5a4a225d4a3eb3c73a7027618ee33a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d42046c6556808dea8158e86c1098596f42e3033","unresolved":false,"context_lines":[{"line_number":6370,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6371,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6372,"context_line":"        if traits:"},{"line_number":6373,"context_line":"            provider_tree.add_traits(nodename, *traits)"},{"line_number":6374,"context_line":""},{"line_number":6375,"context_line":"    def get_available_resource(self, nodename):"},{"line_number":6376,"context_line":"        \"\"\"Retrieve resource information."}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_dd6591b6","line":6373,"range":{"start_line":6373,"start_character":47,"end_line":6373,"end_character":48},"in_reply_to":"5f7c97a3_b22ecd89","updated":"2018-05-29 21:34:46.000000000","message":"It is.  add_traits accepts traits as arbitrary positional args after the RP name/UUID, not as a list.\n\nhttps://github.com/openstack/nova/blob/5266ac27e78ae2a6fdb4f15e51a222a7c782e59f/nova/compute/provider_tree.py#L541","commit_id":"bb64b0ce5c5a4a225d4a3eb3c73a7027618ee33a"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ce82ac8e5f69be7b3377a2edea511d33171a99da","unresolved":false,"context_lines":[{"line_number":6320,"context_line":"        self.firewall_driver.refresh_instance_security_rules(instance)"},{"line_number":6321,"context_line":""},{"line_number":6322,"context_line":"    def update_provider_tree(self, provider_tree, nodename):"},{"line_number":6323,"context_line":"        \"\"\"Update a ProviderTree object with current resource provider and"},{"line_number":6324,"context_line":"        inventory information, also report cpu traits of the compute node."},{"line_number":6325,"context_line":""},{"line_number":6326,"context_line":"        :param nova.compute.provider_tree.ProviderTree provider_tree:"},{"line_number":6327,"context_line":"            A nova.compute.provider_tree.ProviderTree object representing all"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_e6441ebb","line":6324,"range":{"start_line":6323,"start_character":12,"end_line":6324,"end_character":74},"updated":"2018-06-15 08:31:16.000000000","message":"How about a total rewrite of this sentence? please consider this if you have to upload a new patch set:\n\nUpdate a ProviderTree object with current resource provider, inventory information and report cpu traits of the compute node","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"1e32f989510e3f7a716f8b9dad3a147c842d441f","unresolved":false,"context_lines":[{"line_number":6320,"context_line":"        self.firewall_driver.refresh_instance_security_rules(instance)"},{"line_number":6321,"context_line":""},{"line_number":6322,"context_line":"    def update_provider_tree(self, provider_tree, nodename):"},{"line_number":6323,"context_line":"        \"\"\"Update a ProviderTree object with current resource provider and"},{"line_number":6324,"context_line":"        inventory information, also report cpu traits of the compute node."},{"line_number":6325,"context_line":""},{"line_number":6326,"context_line":"        :param nova.compute.provider_tree.ProviderTree provider_tree:"},{"line_number":6327,"context_line":"            A nova.compute.provider_tree.ProviderTree object representing all"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_59c8fa1f","line":6324,"range":{"start_line":6323,"start_character":12,"end_line":6324,"end_character":74},"in_reply_to":"5f7c97a3_e6441ebb","updated":"2018-06-20 07:54:34.000000000","message":"I\u0027ll rewrite this.","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2ebf6f9264ef592c8ad809d688c1b80197a246ec","unresolved":false,"context_lines":[{"line_number":6336,"context_line":"            ComputeNode.hypervisor_hostname) for which the caller is requesting"},{"line_number":6337,"context_line":"            updated provider information."},{"line_number":6338,"context_line":"        \"\"\""},{"line_number":6339,"context_line":"        disk_gb \u003d int(self._get_local_gb_info()[\u0027total\u0027])"},{"line_number":6340,"context_line":"        memory_mb \u003d int(self._host.get_memory_mb_total())"},{"line_number":6341,"context_line":"        vcpus \u003d self._get_vcpu_total()"},{"line_number":6342,"context_line":""},{"line_number":6343,"context_line":"        # NOTE(sbauza): For the moment, the libvirt driver only supports"},{"line_number":6344,"context_line":"        # providing the total number of virtual GPUs for a single GPU type. If"},{"line_number":6345,"context_line":"        # you have multiple physical GPUs, each of them providing multiple GPU"},{"line_number":6346,"context_line":"        # types, libvirt will return the total sum of virtual GPUs"},{"line_number":6347,"context_line":"        # corresponding to the single type passed in enabled_vgpu_types"},{"line_number":6348,"context_line":"        # configuration option. Eg. if you have 2 pGPUs supporting \u0027nvidia-35\u0027,"},{"line_number":6349,"context_line":"        # each of them having 16 available instances, the total here will be"},{"line_number":6350,"context_line":"        # 32."},{"line_number":6351,"context_line":"        # If one of the 2 pGPUs doesn\u0027t support \u0027nvidia-35\u0027, it won\u0027t be used."},{"line_number":6352,"context_line":"        # TODO(sbauza): Use traits to make a better world."},{"line_number":6353,"context_line":"        vgpus \u003d self._get_vgpu_total()"},{"line_number":6354,"context_line":""},{"line_number":6355,"context_line":"        # NOTE(jaypipes): We leave some fields like allocation_ratio and"},{"line_number":6356,"context_line":"        # reserved out of the returned dicts here because, for now at least,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_d4e1479d","line":6353,"range":{"start_line":6339,"start_character":8,"end_line":6353,"end_character":38},"updated":"2018-06-19 13:25:13.000000000","message":"we also need to fake those return value from libvirt.","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2ebf6f9264ef592c8ad809d688c1b80197a246ec","unresolved":false,"context_lines":[{"line_number":6393,"context_line":"                }"},{"line_number":6394,"context_line":""},{"line_number":6395,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6396,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6397,"context_line":"        libvirt_utils.update_provider_cpu_traits("},{"line_number":6398,"context_line":"            provider_tree, nodename, traits)"},{"line_number":6399,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_b4c7eb11","line":6396,"range":{"start_line":6396,"start_character":17,"end_line":6396,"end_character":39},"updated":"2018-06-19 13:25:13.000000000","message":"we can fake the return value of this method in the functional test.","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ce82ac8e5f69be7b3377a2edea511d33171a99da","unresolved":false,"context_lines":[{"line_number":8781,"context_line":"                           nova.privsep.fs.FS_FORMAT_XFS]"},{"line_number":8782,"context_line":""},{"line_number":8783,"context_line":"    def _get_cpu_traits(self):"},{"line_number":8784,"context_line":"        \"\"\"Get cpu traits of vm based on a set of nova libvirt configurations."},{"line_number":8785,"context_line":"           The rules are:"},{"line_number":8786,"context_line":"           1. if cpu_mode is None, translate qemu64 CPU featues to traits"},{"line_number":8787,"context_line":"           2. if cpu_mode is \u0027custom\u0027, use cpu_model configuration to generate"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_06703a08","line":8784,"range":{"start_line":8784,"start_character":15,"end_line":8784,"end_character":31},"updated":"2018-06-15 08:31:16.000000000","message":"I still don\u0027t get why it is called cpu traits of vm? is not the host cpu traits?","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"1e32f989510e3f7a716f8b9dad3a147c842d441f","unresolved":false,"context_lines":[{"line_number":8781,"context_line":"                           nova.privsep.fs.FS_FORMAT_XFS]"},{"line_number":8782,"context_line":""},{"line_number":8783,"context_line":"    def _get_cpu_traits(self):"},{"line_number":8784,"context_line":"        \"\"\"Get cpu traits of vm based on a set of nova libvirt configurations."},{"line_number":8785,"context_line":"           The rules are:"},{"line_number":8786,"context_line":"           1. if cpu_mode is None, translate qemu64 CPU featues to traits"},{"line_number":8787,"context_line":"           2. if cpu_mode is \u0027custom\u0027, use cpu_model configuration to generate"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_193cc2df","line":8784,"range":{"start_line":8784,"start_character":15,"end_line":8784,"end_character":31},"in_reply_to":"5f7c97a3_06703a08","updated":"2018-06-20 07:54:34.000000000","message":"It\u0027s not host cpu traits, it\u0027s the traits users will see in their virtual machines.","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"cacbe5c33d97e0b2fb9e118d451ce0ea6a92c012","unresolved":false,"context_lines":[{"line_number":8792,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"},{"line_number":8793,"context_line":""},{"line_number":8794,"context_line":"        if not CONF.libvirt.cpu_mode:"},{"line_number":8795,"context_line":"            caps.host.cpu.model \u003d \u0027qemu64\u0027"},{"line_number":8796,"context_line":"            caps.host.cpu.features \u003d set()"},{"line_number":8797,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8798,"context_line":"            caps.host.cpu.model \u003d CONF.libvirt.cpu_model"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_bb002b04","line":8795,"range":{"start_line":8795,"start_character":34,"end_line":8795,"end_character":42},"updated":"2018-06-20 01:01:16.000000000","message":"There also have qemu32, so I think we should check the architect of the cpu?","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"1e32f989510e3f7a716f8b9dad3a147c842d441f","unresolved":false,"context_lines":[{"line_number":8792,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"},{"line_number":8793,"context_line":""},{"line_number":8794,"context_line":"        if not CONF.libvirt.cpu_mode:"},{"line_number":8795,"context_line":"            caps.host.cpu.model \u003d \u0027qemu64\u0027"},{"line_number":8796,"context_line":"            caps.host.cpu.features \u003d set()"},{"line_number":8797,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8798,"context_line":"            caps.host.cpu.model \u003d CONF.libvirt.cpu_model"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_992772c8","line":8795,"range":{"start_line":8795,"start_character":34,"end_line":8795,"end_character":42},"in_reply_to":"5f7c97a3_bb002b04","updated":"2018-06-20 07:54:34.000000000","message":"Done","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"1a086578c02c72d1f98d3f63745330627f78f544","unresolved":false,"context_lines":[{"line_number":8800,"context_line":""},{"line_number":8801,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8802,"context_line":"        if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8803,"context_line":"            features \u003d self._host.get_connection().baselineCPU("},{"line_number":8804,"context_line":"                [xml_str],"},{"line_number":8805,"context_line":"                libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8806,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_a4c47a42","line":8803,"updated":"2018-06-20 14:42:05.000000000","message":"I just learned that the `baseline` libvirt call is not supported on s390x (also the cpu-compare is not\". Therefore this call throws an LibvirtError on s39x\n\n```\nJun 18 13:52:45.765606 ubuntu-xenial-s390x-cloud-zfwcec192-1156 nova-compute[15045]: ERROR nova.compute.manager     rv \u003d meth(*args, **kwargs)\nJun 18 13:52:45.765700 ubuntu-xenial-s390x-cloud-zfwcec192-1156 nova-compute[15045]: ERROR nova.compute.manager   File \"/usr/local/lib/python2.7/dist-packages/libvirt.py\", line 3552, in baselineCPU\nJun 18 13:52:45.765793 ubuntu-xenial-s390x-cloud-zfwcec192-1156 nova-compute[15045]: ERROR nova.compute.manager     if ret is None: raise libvirtError (\u0027virConnectBaselineCPU() failed\u0027, conn\u003dself)\nJun 18 13:52:45.765884 ubuntu-xenial-s390x-cloud-zfwcec192-1156 nova-compute[15045]: ERROR nova.compute.manager libvirtError: XML error: Missing CPU model name\n\n```\n\nI could reproduce this on my s390 system\n\n```\n$ virsh capabilities\n\u003ccapabilities\u003e\n\n  \u003chost\u003e\n    \u003cuuid\u003e7410ce01-df57-43f4-ab08-b701c80b168e\u003c/uuid\u003e\n    \u003ccpu\u003e\n      \u003carch\u003es390x\u003c/arch\u003e\n      \u003ctopology sockets\u003d\u00271\u0027 cores\u003d\u00276\u0027 threads\u003d\u00271\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00274\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00271024\u0027/\u003e\n    \u003c/cpu\u003e\n.... \n\n# safed cpu section into xml\n\n$ virsh cpu-baseline cpu.xml\nerror: XML error: Missing CPU model name \n\n```\n\n-\u003e on s390x there\u0027s no \u003cmodel\u003e tag.\n\nI suggest to add a unittest for this xml as well\n\n```\n    \u003ccpu\u003e\n      \u003carch\u003es390x\u003c/arch\u003e\n      \u003ctopology sockets\u003d\u00271\u0027 cores\u003d\u00276\u0027 threads\u003d\u00271\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00274\u0027/\u003e\n      \u003cpages unit\u003d\u0027KiB\u0027 size\u003d\u00271024\u0027/\u003e\n    \u003c/cpu\u003e\n\n```\n\nIf I understood the code correctly, for an empty list should be returned for s390x.\n\nFYI: There is some work going on in the libvirt community to replace the baseline and compare-cpu libvirt calls with something more useful [1]. With the new approach (not yet released) we are in good shape for s390x.! But therefore we need to wait for this new api. Maybe adding a comment and posting the link in the code would make sense.\n\nIf you need some help with impl or if I should write a few sentences for the commit message or so, let me know!\n\nThanks!!\n\n[1]  https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"f4a3a8c29fd84d2e32ddabcb8a2d863d59737b9b","unresolved":false,"context_lines":[{"line_number":8892,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8893,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8894,"context_line":"        try:"},{"line_number":8895,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8896,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8897,"context_line":"                    [xml_str],"},{"line_number":8898,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_297ed91a","line":8895,"updated":"2018-06-22 06:42:39.000000000","message":"this won\u0027t work for the s390x case. in s390x. cpu_mode is None, therefore the code will not return in line 8873, but enter here. We would need a conditional in this if statement that skips the baseline call when cpu_mode \u003d None like we did in the original nova code [1] \n\nAn alternative would be to catch the not existing model error \n\nnova.compute.manager libvirtError: XML error: Missing CPU model name\n\n\n[1] https://github.com/openstack/nova/blob/88213a0352dda2b56b6a9e83d83129d9ddd8dfa2/nova/virt/libvirt/host.py#L634","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"707ccd28bff8a4cc19be845491ae622b27cdb331","unresolved":false,"context_lines":[{"line_number":8892,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8893,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8894,"context_line":"        try:"},{"line_number":8895,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8896,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8897,"context_line":"                    [xml_str],"},{"line_number":8898,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_e925410b","line":8895,"in_reply_to":"5f7c97a3_297ed91a","updated":"2018-06-22 06:54:06.000000000","message":"Hi, Andreas, if the code doesn\u0027t return in line 8873, I will set cpu_model according to different cpu_mode values, ensure that the xml passed to baseline here with a proper cpu_model, thus exception of missing cpu model name will not be raised here. Correct me if I get something wrong.","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"67f35fbdd2a6ff0ac177931eb11ab8154c957ce6","unresolved":false,"context_lines":[{"line_number":8892,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8893,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8894,"context_line":"        try:"},{"line_number":8895,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8896,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8897,"context_line":"                    [xml_str],"},{"line_number":8898,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_499eb506","line":8895,"in_reply_to":"5f7c97a3_e925410b","updated":"2018-06-22 07:05:59.000000000","message":"ah ok, you\u0027re adding the model tag in line 8877. Let\u0027s wait for the CI result. I\u0027ll remove my -1...","commit_id":"6ad4d7b78fa75c8bbd4d0d765c83d12cbe317ca7"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"6167c60118dabbfc4a57add4d0923dec604343f0","unresolved":false,"context_lines":[{"line_number":8873,"context_line":"            return libvirt_utils.cpu_features_to_traits("},{"line_number":8874,"context_line":"                [f.name for f in caps.host.cpu.features])"},{"line_number":8875,"context_line":""},{"line_number":8876,"context_line":"        if CONF.libvirt.cpu_mode is \u0027none\u0027:"},{"line_number":8877,"context_line":"            caps.host.cpu.model \u003d \\"},{"line_number":8878,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8879,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_be6779b8","line":8876,"updated":"2018-06-22 13:43:27.000000000","message":"I think you need to to compare the values with \"\u003d\u003d\" instead of comparing the identity with \"is\". That could be the case why the s390x ci is still failing, but the unittest is succeeding...","commit_id":"035104a11eab270d9af21ca8249ddd12a0a88e08"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"6167c60118dabbfc4a57add4d0923dec604343f0","unresolved":false,"context_lines":[{"line_number":8895,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8896,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8897,"context_line":"                    [xml_str],"},{"line_number":8898,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8899,"context_line":"            else:"},{"line_number":8900,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8901,"context_line":"        except libvirt.libvirtError as ex:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_e33f9a1f","line":8898,"updated":"2018-06-22 13:43:27.000000000","message":"Did some testing for s390x\n\n\n\u003e\u003e\u003e conn \u003d libvirt.openReadOnly(None)\n\u003e\u003e\u003e xml\u003d\"\u003ccpu\u003e\u003carch\u003es390x\u003c/arch\u003e\u003cmodel\u003eqemu64\u003c/model\u003e\u003ctopology sockets\u003d\u00271\u0027 cores\u003d\u00276\u0027 threads\u003d\u00271\u0027/\u003e\u003c/cpu\u003e\"\n\u003e\u003e\u003e err\u003dconn.baselineCPU([xml], libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)\nlibvirt: CPU Driver error : this function is not supported by the connection driver: cannot compute baseline CPU of s390x architecture\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/local/lib/python2.7/dist-packages/libvirt.py\", line 3553, in baselineCPU\n    if ret is None: raise libvirtError (\u0027virConnectBaselineCPU() failed\u0027, conn\u003dself)\nlibvirt.libvirtError: this function is not supported by the connection driver: cannot compute baseline CPU of s390x architecture","commit_id":"035104a11eab270d9af21ca8249ddd12a0a88e08"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"5c8242ae24f6075c7155b6b779ce69f664cd25c0","unresolved":false,"context_lines":[{"line_number":8866,"context_line":"           1. if cpu_mode is \u0027host-model\u0027 or \u0027host-passthrough\u0027, use host\u0027s"},{"line_number":8867,"context_line":"           CPU features."},{"line_number":8868,"context_line":"           2. if cpu_mode is \u0027none\u0027, based on CPU architecture, use qemu64 or"},{"line_number":8869,"context_line":"           qemu32 CPU features."},{"line_number":8870,"context_line":"           3. if cpu_mode is \u0027custom\u0027 and virt_type is \u0027kvm|qemu\u0027, use"},{"line_number":8871,"context_line":"           cpu_model configuration to generate CPU features."},{"line_number":8872,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ae0d2641","line":8869,"updated":"2018-07-04 07:28:04.000000000","message":"Side thought: \u0027qemu32\u0027 / \u0027qemu64\u0027 model just provides a basic set of features that can run on most hosts.  While that _sounds_ useful, it actually has abysmal performance and is vulnerable to Spectre and Meltdown CVEs.  So it is the \"give me the worst possible CPU model\".  \n\nQEMU / libvirt folks are aware of that limitation.  For some historical reason it is the QEMU (therefore libvirt default).  I\u0027ll start a QEMU upstream discussion on this.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":8881,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8882,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_a8268366","line":8884,"updated":"2018-07-03 21:18:17.000000000","message":"Do we need to account for CONF.libvirt.cpu_model_extra_flags with this? Probably need to ask Kashyap.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":8881,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8882,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ae9e86b4","line":8884,"in_reply_to":"5f7c97a3_a8268366","updated":"2018-07-04 07:17:46.000000000","message":"It seems cpu_model_extra_flags should be taken in consideration, I\u0027ll check this with Kashyap.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"5c8242ae24f6075c7155b6b779ce69f664cd25c0","unresolved":false,"context_lines":[{"line_number":8881,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8882,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_f14a2359","line":8884,"in_reply_to":"5f7c97a3_a8268366","updated":"2018-07-04 07:28:04.000000000","message":"Yes, at a minimum, if the CPU mode is \u0027custom\u0027, you should also account for CONF.libvirt.cpu_model_extra_flags.  \n\nBut note that we also allow configuring extra CPU flags for the other two CPU modes—\u0027host-model\u0027 and \u0027host-passthrough\u0027 (because QEMU may disable some features unless you explicitly ask for them).  Strictly speaking, that should also be considered in the earlier \u0027if\u0027 conditional (if CONF.libvirt.cpu_mode in (\u0027host-model\u0027, \u0027host-passthrough\u0027)).","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2dfe099b46c00c1806d833d4fa0437aabac8126a","unresolved":false,"context_lines":[{"line_number":8881,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8882,"context_line":"        elif CONF.libvirt.cpu_mode \u003d\u003d \u0027custom\u0027:"},{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_b30d8a36","line":8884,"in_reply_to":"5f7c97a3_f14a2359","updated":"2018-07-04 12:56:57.000000000","message":"++, thanks for point that out, I totally missed that.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_c8d09f2e","line":8886,"updated":"2018-07-03 21:18:17.000000000","message":"Really? I don\u0027t see that anywhere in the config option help docs for cpu_model or cpu_mode\u003dcustom.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"5c8242ae24f6075c7155b6b779ce69f664cd25c0","unresolved":false,"context_lines":[{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_aee0c6cc","line":8886,"range":{"start_line":8886,"start_character":29,"end_line":8886,"end_character":77},"updated":"2018-07-04 07:28:04.000000000","message":"That is not correct.  We of course support `cpu_mode\u003dcustom` for `virt_type\u003dkvm|qemu`.  It is a critical guest configuration step, more so with the recent CPU flaws.\n\n(Also, a nit: please s/cpu/CPU/, s/vm/VM/, wherever it\u0027s applicable throughout this change.)","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"f0c88a819e7b0a6ee1e5bc6ba17b38f0fe52ee91","unresolved":false,"context_lines":[{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_f15f8372","line":8886,"range":{"start_line":8886,"start_character":29,"end_line":8886,"end_character":77},"in_reply_to":"5f7c97a3_aee0c6cc","updated":"2018-07-04 08:00:42.000000000","message":"Please disregard my above comment, which is talking only about KVM/QEMU hypervisors, that is already handled in the \u0027if\u0027 conditional.\n\nThe \u0027else\u0027 conditional is for other hypervisors, which, near as I know, don\u0027t support \u0027custom\u0027—which is a libvirt invention.  So, yes, Lei is correct here.\n\nGiven Matt\u0027s earlier question, maybe we should document it for other hypervisors.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":8883,"context_line":"            if CONF.libvirt.virt_type in (\u0027kvm\u0027, \u0027qemu\u0027):"},{"line_number":8884,"context_line":"                caps.host.cpu.model \u003d CONF.libvirt.cpu_model"},{"line_number":8885,"context_line":"            else:"},{"line_number":8886,"context_line":"                LOG.warning(\u0027Custom cpu mode is not supported under virt_type\u0027"},{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ce3f4284","line":8886,"in_reply_to":"5f7c97a3_c8d09f2e","updated":"2018-07-04 07:17:46.000000000","message":"My understanding is that only kvm and qemu supports cpu_model, see https://github.com/openstack/nova/blob/master/nova/conf/libvirt.py#L527","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""},{"line_number":8890,"context_line":"        caps.host.cpu.features \u003d set()"},{"line_number":8891,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8892,"context_line":""},{"line_number":8893,"context_line":"        # TODO(lei-zh): baselineCPU is not supported on all platforms."},{"line_number":8894,"context_line":"        # There is some work going on in the libvirt community to replace the"},{"line_number":8895,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8896,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8897,"context_line":"        try:"},{"line_number":8898,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8899,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8900,"context_line":"                    [xml_str],"},{"line_number":8901,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8902,"context_line":"            else:"},{"line_number":8903,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8904,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":8905,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":8906,"context_line":"            if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8907,"context_line":"                LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8908,"context_line":"                            \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8909,"context_line":"                            {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8910,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8911,"context_line":"            else:"},{"line_number":8912,"context_line":"                raise"},{"line_number":8913,"context_line":""},{"line_number":8914,"context_line":"        cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":8915,"context_line":"        cpu.parse_str(features)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_28e7d311","line":8912,"range":{"start_line":8890,"start_character":8,"end_line":8912,"end_character":21},"updated":"2018-07-03 21:18:17.000000000","message":"Why don\u0027t we re-use self.host.get_capabilities() here? That has the same libvirt check but also does py3 handling of the xml which you\u0027re missing here.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""},{"line_number":8890,"context_line":"        caps.host.cpu.features \u003d set()"},{"line_number":8891,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8892,"context_line":""},{"line_number":8893,"context_line":"        # TODO(lei-zh): baselineCPU is not supported on all platforms."},{"line_number":8894,"context_line":"        # There is some work going on in the libvirt community to replace the"},{"line_number":8895,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8896,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8897,"context_line":"        try:"},{"line_number":8898,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8899,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8900,"context_line":"                    [xml_str],"},{"line_number":8901,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8902,"context_line":"            else:"},{"line_number":8903,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8904,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":8905,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":8906,"context_line":"            if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8907,"context_line":"                LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8908,"context_line":"                            \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8909,"context_line":"                            {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8910,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8911,"context_line":"            else:"},{"line_number":8912,"context_line":"                raise"},{"line_number":8913,"context_line":""},{"line_number":8914,"context_line":"        cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":8915,"context_line":"        cpu.parse_str(features)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_eec47e10","line":8912,"range":{"start_line":8890,"start_character":8,"end_line":8912,"end_character":21},"in_reply_to":"5f7c97a3_28e7d311","updated":"2018-07-04 07:17:46.000000000","message":"When I first looked at get_capabilities code, I was a little confused about the py3 handling, because when converting to string the code deliberately passes encoding\u003d\u0027unicode\u0027 to lxml tostring method, that\u0027s why I removed that check in the code. Also code here will still call baselineCPU if VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES is not present. The get_capabilities uses host capabilities while code here handles custom cpu model case. If we want to reuse code, perhaps to make the baselineCPU part out of get_capabilities as a utility?","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d532560febe359efa33ac37098921d30bfd10a4a","unresolved":false,"context_lines":[{"line_number":8887,"context_line":"                            \u0027 %(virt)s.\u0027, {\u0027virt\u0027: CONF.libvirt.virt_type})"},{"line_number":8888,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8889,"context_line":""},{"line_number":8890,"context_line":"        caps.host.cpu.features \u003d set()"},{"line_number":8891,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8892,"context_line":""},{"line_number":8893,"context_line":"        # TODO(lei-zh): baselineCPU is not supported on all platforms."},{"line_number":8894,"context_line":"        # There is some work going on in the libvirt community to replace the"},{"line_number":8895,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8896,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8897,"context_line":"        try:"},{"line_number":8898,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8899,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8900,"context_line":"                    [xml_str],"},{"line_number":8901,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8902,"context_line":"            else:"},{"line_number":8903,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8904,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":8905,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":8906,"context_line":"            if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8907,"context_line":"                LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8908,"context_line":"                            \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8909,"context_line":"                            {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8910,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8911,"context_line":"            else:"},{"line_number":8912,"context_line":"                raise"},{"line_number":8913,"context_line":""},{"line_number":8914,"context_line":"        cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":8915,"context_line":"        cpu.parse_str(features)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_d37cc6eb","line":8912,"range":{"start_line":8890,"start_character":8,"end_line":8912,"end_character":21},"in_reply_to":"5f7c97a3_eec47e10","updated":"2018-07-04 13:34:08.000000000","message":"I\u0027m also confused why the py3 stuff is needed in get_capabilities but not here because if it was needed you\u0027d think this code would be failing devstack runs on py35 but it\u0027s not.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"49196fd3dd9837d4467f42f21b8593f36bc19063","unresolved":false,"context_lines":[{"line_number":8937,"context_line":"        cpu.arch \u003d caps.host.cpu.arch"},{"line_number":8938,"context_line":""},{"line_number":8939,"context_line":"        if cpu.mode in (\u0027host-model\u0027, \u0027host-passthrough\u0027):"},{"line_number":8940,"context_line":"            host_features \u003d [f.name for f in caps.host.cpu.features]"},{"line_number":8941,"context_line":"            # Account for features in cpu_model_extra_flags conf"},{"line_number":8942,"context_line":"            for f in cpu.features:"},{"line_number":8943,"context_line":"                host_features.append(f.name)"},{"line_number":8944,"context_line":"            return libvirt_utils.cpu_features_to_traits(host_features)"},{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_d709f331","line":8943,"range":{"start_line":8940,"start_character":0,"end_line":8943,"end_character":44},"updated":"2018-07-18 13:08:36.000000000","message":"or\n\n host_features \u003d [f.name for f in caps.host.cpu.features + cpu.features]","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":8937,"context_line":"        cpu.arch \u003d caps.host.cpu.arch"},{"line_number":8938,"context_line":""},{"line_number":8939,"context_line":"        if cpu.mode in (\u0027host-model\u0027, \u0027host-passthrough\u0027):"},{"line_number":8940,"context_line":"            host_features \u003d [f.name for f in caps.host.cpu.features]"},{"line_number":8941,"context_line":"            # Account for features in cpu_model_extra_flags conf"},{"line_number":8942,"context_line":"            for f in cpu.features:"},{"line_number":8943,"context_line":"                host_features.append(f.name)"},{"line_number":8944,"context_line":"            return libvirt_utils.cpu_features_to_traits(host_features)"},{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_390362c0","line":8943,"range":{"start_line":8940,"start_character":0,"end_line":8943,"end_character":44},"in_reply_to":"5f7c97a3_d709f331","updated":"2018-07-19 09:45:40.000000000","message":"Yes, this looks more concise, will use \u0027|\u0027 instead of \u0027+\u0027 because features are python set here.","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"49196fd3dd9837d4467f42f21b8593f36bc19063","unresolved":false,"context_lines":[{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"},{"line_number":8947,"context_line":"        if cpu.mode is None:"},{"line_number":8948,"context_line":"            cpu.model \u003d \\"},{"line_number":8949,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8950,"context_line":"            cpu.features \u003d set()"},{"line_number":8951,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_d729f288","line":8948,"range":{"start_line":8948,"start_character":24,"end_line":8948,"end_character":25},"updated":"2018-07-18 13:08:36.000000000","message":"prefer ways of not using backslash, like\n\n cpu.model \u003d libvirt_utils.get_cpu_model_from_arch(\n     caps.host.cpu.arch)","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"},{"line_number":8947,"context_line":"        if cpu.mode is None:"},{"line_number":8948,"context_line":"            cpu.model \u003d \\"},{"line_number":8949,"context_line":"                libvirt_utils.get_cpu_model_from_arch(caps.host.cpu.arch)"},{"line_number":8950,"context_line":"            cpu.features \u003d set()"},{"line_number":8951,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_59065ecf","line":8948,"range":{"start_line":8948,"start_character":24,"end_line":8948,"end_character":25},"in_reply_to":"5f7c97a3_d729f288","updated":"2018-07-19 09:45:40.000000000","message":"Done","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"49196fd3dd9837d4467f42f21b8593f36bc19063","unresolved":false,"context_lines":[{"line_number":8962,"context_line":"            else:"},{"line_number":8963,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8964,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":8965,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":8966,"context_line":"            if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8967,"context_line":"                LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8968,"context_line":"                            \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8969,"context_line":"                            {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8970,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8971,"context_line":"            else:"},{"line_number":8972,"context_line":"                raise"},{"line_number":8973,"context_line":""},{"line_number":8974,"context_line":"        cpu.parse_str(features)"},{"line_number":8975,"context_line":"        return libvirt_utils.cpu_features_to_traits("}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_f72d0e90","line":8972,"range":{"start_line":8965,"start_character":0,"end_line":8972,"end_character":21},"updated":"2018-07-18 13:08:36.000000000","message":"Should wrap this is save_and_reraise_exception","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"5aec0290087ae1533097645c5f6cb460a916e960","unresolved":false,"context_lines":[{"line_number":8962,"context_line":"            else:"},{"line_number":8963,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8964,"context_line":"        except libvirt.libvirtError as ex:"},{"line_number":8965,"context_line":"            error_code \u003d ex.get_error_code()"},{"line_number":8966,"context_line":"            if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8967,"context_line":"                LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8968,"context_line":"                            \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8969,"context_line":"                            {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8970,"context_line":"                return libvirt_utils.cpu_features_to_traits([])"},{"line_number":8971,"context_line":"            else:"},{"line_number":8972,"context_line":"                raise"},{"line_number":8973,"context_line":""},{"line_number":8974,"context_line":"        cpu.parse_str(features)"},{"line_number":8975,"context_line":"        return libvirt_utils.cpu_features_to_traits("}],"source_content_type":"text/x-python","patch_set":22,"id":"5f7c97a3_190c66e9","line":8972,"range":{"start_line":8965,"start_character":0,"end_line":8972,"end_character":21},"in_reply_to":"5f7c97a3_f72d0e90","updated":"2018-07-19 09:45:40.000000000","message":"Good catch","commit_id":"865bb5fe02bc4a3eb6adef436a32b8e5b44bd3d2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f4c6e9cb0cabf262c3afec25ceadc46071ce235","unresolved":false,"context_lines":[{"line_number":3809,"context_line":"                             \u0027other modes.\u0027)"},{"line_number":3810,"context_line":"                else:"},{"line_number":3811,"context_line":"                    mode \u003d \"host-model\""},{"line_number":3812,"context_line":"            if mode \u003d\u003d \"none\":"},{"line_number":3813,"context_line":"                return vconfig.LibvirtConfigGuestCPU()"},{"line_number":3814,"context_line":"        else:"},{"line_number":3815,"context_line":"            if mode is None or mode \u003d\u003d \"none\":"},{"line_number":3816,"context_line":"                return None"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_db81fea1","line":3813,"range":{"start_line":3812,"start_character":12,"end_line":3813,"end_character":54},"updated":"2018-07-19 14:20:18.000000000","message":"This is what\u0027s getting returned for the pkvm CI. Arch is ppc64le.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"fa715d702c828c2b38caee4541ec7e67937b63e9","unresolved":false,"context_lines":[{"line_number":6454,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6455,"context_line":""},{"line_number":6456,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6457,"context_line":"        if traits:"},{"line_number":6458,"context_line":"            traits_to_add \u003d [t for t in traits if traits[t]]"},{"line_number":6459,"context_line":"            traits_to_remove \u003d set(traits) - set(traits_to_add)"},{"line_number":6460,"context_line":"            provider_tree.add_traits(nodename, *traits_to_add)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_7be0ea27","line":6457,"range":{"start_line":6457,"start_character":8,"end_line":6457,"end_character":17},"updated":"2018-07-19 14:04:26.000000000","message":"not sure we have the case, the _get_cpu_traits(), after some configuration change, the _get_cpu_traits(), then the existed traits won\u0027t be removed. The most safe way is return [] at line 8935, and the code is more tidy. I won\u0027t -1 for this, since I can\u0027t find a case for above.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"d9726de0d1706faef4e920931ce87636806dbf8a","unresolved":false,"context_lines":[{"line_number":6454,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6455,"context_line":""},{"line_number":6456,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6457,"context_line":"        if traits:"},{"line_number":6458,"context_line":"            traits_to_add \u003d [t for t in traits if traits[t]]"},{"line_number":6459,"context_line":"            traits_to_remove \u003d set(traits) - set(traits_to_add)"},{"line_number":6460,"context_line":"            provider_tree.add_traits(nodename, *traits_to_add)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_fbbe3962","line":6457,"range":{"start_line":6457,"start_character":8,"end_line":6457,"end_character":17},"in_reply_to":"5f7c97a3_3b77d20a","updated":"2018-07-19 15:03:23.000000000","message":"Yeah, I added this to handle the case where traits is None, there is possibility _get_guest_cpu_model_config will return None, but I was kind of dazzling when I wrote this... Thanks","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"25b04d7a4acfbec755f28ce1948d9da01f04ab16","unresolved":false,"context_lines":[{"line_number":6454,"context_line":"        provider_tree.update_inventory(nodename, result)"},{"line_number":6455,"context_line":""},{"line_number":6456,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6457,"context_line":"        if traits:"},{"line_number":6458,"context_line":"            traits_to_add \u003d [t for t in traits if traits[t]]"},{"line_number":6459,"context_line":"            traits_to_remove \u003d set(traits) - set(traits_to_add)"},{"line_number":6460,"context_line":"            provider_tree.add_traits(nodename, *traits_to_add)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_3b77d20a","line":6457,"range":{"start_line":6457,"start_character":8,"end_line":6457,"end_character":17},"in_reply_to":"5f7c97a3_7be0ea27","updated":"2018-07-19 14:14:48.000000000","message":"Yeah, this conditional makes me uncomfortable because it implies the hole Alex mentions.  I assume it\u0027s there to protect against the case where traits is None - so can we make it\n\n if traits is not None:\n\ninstead?","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0a7c6360e297de14666d106402b1bb1fcfb308a8","unresolved":false,"context_lines":[{"line_number":8944,"context_line":"            return libvirt_utils.cpu_features_to_traits(host_features)"},{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"},{"line_number":8947,"context_line":"        if cpu.mode is None:"},{"line_number":8948,"context_line":"            cpu.model \u003d libvirt_utils.get_cpu_model_from_arch("},{"line_number":8949,"context_line":"                caps.host.cpu.arch)"},{"line_number":8950,"context_line":"            cpu.features \u003d set()"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_e1b9a8eb","line":8947,"range":{"start_line":8947,"start_character":8,"end_line":8947,"end_character":28},"updated":"2018-07-19 15:48:15.000000000","message":"This isn\u0027t handling cpu_mode\u003d\u0027none\u0027 which is probably why it\u0027s blowing up for ppc64le in the powerkvm CI.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6de73a1fa851a42f10c7845b88be4c55c6a8c077","unresolved":false,"context_lines":[{"line_number":8944,"context_line":"            return libvirt_utils.cpu_features_to_traits(host_features)"},{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"},{"line_number":8947,"context_line":"        if cpu.mode is None:"},{"line_number":8948,"context_line":"            cpu.model \u003d libvirt_utils.get_cpu_model_from_arch("},{"line_number":8949,"context_line":"                caps.host.cpu.arch)"},{"line_number":8950,"context_line":"            cpu.features \u003d set()"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_613cb82f","line":8947,"range":{"start_line":8947,"start_character":8,"end_line":8947,"end_character":28},"in_reply_to":"5f7c97a3_61cef85b","updated":"2018-07-19 15:57:07.000000000","message":"OK good point.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"f09a66205f1ed79a469deaa6723d0ab54d2ca1e7","unresolved":false,"context_lines":[{"line_number":8944,"context_line":"            return libvirt_utils.cpu_features_to_traits(host_features)"},{"line_number":8945,"context_line":""},{"line_number":8946,"context_line":"        # Choose a default CPU model when cpu_mode is not specified"},{"line_number":8947,"context_line":"        if cpu.mode is None:"},{"line_number":8948,"context_line":"            cpu.model \u003d libvirt_utils.get_cpu_model_from_arch("},{"line_number":8949,"context_line":"                caps.host.cpu.arch)"},{"line_number":8950,"context_line":"            cpu.features \u003d set()"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_61cef85b","line":8947,"range":{"start_line":8947,"start_character":8,"end_line":8947,"end_character":28},"in_reply_to":"5f7c97a3_e1b9a8eb","updated":"2018-07-19 15:55:47.000000000","message":"if in the conf cpu_mode\u003d\u0027none\u0027 and virt_type in (\u0027kvm\u0027, qemu\u0027), cpu.mode will be converted to None in _get_guest_cpu_model_config, please see https://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L3813, it returns LibvirtConfigGuestCPU which mode is default to None.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f4c6e9cb0cabf262c3afec25ceadc46071ce235","unresolved":false,"context_lines":[{"line_number":8956,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8957,"context_line":"        try:"},{"line_number":8958,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8959,"context_line":"                features \u003d self._host.get_connection().baselineCPU("},{"line_number":8960,"context_line":"                    [xml_str],"},{"line_number":8961,"context_line":"                    libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES)"},{"line_number":8962,"context_line":"            else:"},{"line_number":8963,"context_line":"                features \u003d self._host.get_connection().baselineCPU([xml_str])"},{"line_number":8964,"context_line":"        except libvirt.libvirtError as ex:"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_dbd33ed2","line":8961,"range":{"start_line":8959,"start_character":16,"end_line":8961,"end_character":69},"updated":"2018-07-19 14:20:18.000000000","message":"This is what\u0027s failing in the pkvm CI:\n\nhttps://dal05.objectstorage.softlayer.net/v1/AUTH_3d8e6ecb-f597-448c-8ec2-164e9f710dd6/pkvmci/nova/17/560317/24/check/tempest-dsvm-full-xenial/a80ccf4/screen-n-cpu.txt.gz\n\nWhich maybe means we shouldn\u0027t even be getting this far? Should _get_guest_cpu_model_config return None?\n\nFrom the pkvm CI logs the job is configured with:\n\nvirt_type \u003d kvm\ncpu_mode \u003d none\ncpu_model \u003d None\ncpu_model_extra_flags \u003d","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"584a5e0a590a4d5fb2820be275bac35af1396ab8","unresolved":false,"context_lines":[{"line_number":8952,"context_line":"                caps.host.cpu.arch)"},{"line_number":8953,"context_line":"            # For Power guests to use \u0027host-model\u0027"},{"line_number":8954,"context_line":"            if cpu.model \u003d\u003d \u0027power8\u0027:"},{"line_number":8955,"context_line":"                cpu.mode \u003d \u0027host-model\u0027"},{"line_number":8956,"context_line":"            cpu.features \u003d set()"},{"line_number":8957,"context_line":""},{"line_number":8958,"context_line":"        xml_str \u003d cpu.to_xml()"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_781f8208","line":8955,"range":{"start_line":8955,"start_character":27,"end_line":8955,"end_character":39},"updated":"2018-07-19 22:29:27.000000000","message":"Shouldn\u0027t this be \u0027custom\u0027 if we\u0027re setting cpu.model?","commit_id":"a1678b56debb432f397124e1e46c7407384f8386"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"01d5a0731e237d3a41815e1b762b9f48e9d38cd6","unresolved":false,"context_lines":[{"line_number":8952,"context_line":"                caps.host.cpu.arch)"},{"line_number":8953,"context_line":"            # For Power guests to use \u0027host-model\u0027"},{"line_number":8954,"context_line":"            if cpu.model \u003d\u003d \u0027power8\u0027:"},{"line_number":8955,"context_line":"                cpu.mode \u003d \u0027host-model\u0027"},{"line_number":8956,"context_line":"            cpu.features \u003d set()"},{"line_number":8957,"context_line":""},{"line_number":8958,"context_line":"        xml_str \u003d cpu.to_xml()"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_30c83573","line":8955,"range":{"start_line":8955,"start_character":27,"end_line":8955,"end_character":39},"in_reply_to":"5f7c97a3_1d0bd22a","updated":"2018-07-20 11:57:13.000000000","message":"I was wrong above.  A couple of corrections:\n\n- s/PowerKVM/PowerISA/  (PowerKVM is something else -- whic his IBM\u0027s own hypervisor built on top of KVM)\n\n- Next, for PowerISA, the \"\u003ccpu\u003e\" XML element should have neither \"mode\u003d\" nor \"match\u003d\" attributes, and \u003cmodel\u003e should not be \"power8\", but rather: \"POWER8\".","commit_id":"a1678b56debb432f397124e1e46c7407384f8386"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"550ec82a2c7fe53c3fb4218e7f3daafb3937055d","unresolved":false,"context_lines":[{"line_number":8952,"context_line":"                caps.host.cpu.arch)"},{"line_number":8953,"context_line":"            # For Power guests to use \u0027host-model\u0027"},{"line_number":8954,"context_line":"            if cpu.model \u003d\u003d \u0027power8\u0027:"},{"line_number":8955,"context_line":"                cpu.mode \u003d \u0027host-model\u0027"},{"line_number":8956,"context_line":"            cpu.features \u003d set()"},{"line_number":8957,"context_line":""},{"line_number":8958,"context_line":"        xml_str \u003d cpu.to_xml()"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_98c4de42","line":8955,"range":{"start_line":8955,"start_character":27,"end_line":8955,"end_character":39},"in_reply_to":"5f7c97a3_781f8208","updated":"2018-07-19 22:35:40.000000000","message":"According to the libvirt docs this should work:\n\nhttps://libvirt.org/formatdomain.html#elementsCPU\n\n\"\"\"\nSince 1.2.11 PowerISA allows processors to run VMs in binary compatibility mode supporting an older version of ISA. Libvirt on PowerPC architecture uses the host-model to signify a guest mode CPU running in binary compatibility mode. Example: When a user needs a power7 VM to run in compatibility mode on a Power8 host, this can be described in XML as follows :\n\n\u003ccpu mode\u003d\u0027host-model\u0027\u003e\n  \u003cmodel\u003epower7\u003c/model\u003e\n\u003c/cpu\u003e\n...\n\"\"\"\n\nAnd the powerkvm CI is using libvirt 4.0.0:\n\nhttps://dal05.objectstorage.softlayer.net/v1/AUTH_3d8e6ecb-f597-448c-8ec2-164e9f710dd6/pkvmci/nova/17/560317/25/check/tempest-dsvm-full-xenial/5f734f5/dpkg-l.txt.gz","commit_id":"a1678b56debb432f397124e1e46c7407384f8386"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"7edd6422bf831f642b4d8e57626780b776be229b","unresolved":false,"context_lines":[{"line_number":8952,"context_line":"                caps.host.cpu.arch)"},{"line_number":8953,"context_line":"            # For Power guests to use \u0027host-model\u0027"},{"line_number":8954,"context_line":"            if cpu.model \u003d\u003d \u0027power8\u0027:"},{"line_number":8955,"context_line":"                cpu.mode \u003d \u0027host-model\u0027"},{"line_number":8956,"context_line":"            cpu.features \u003d set()"},{"line_number":8957,"context_line":""},{"line_number":8958,"context_line":"        xml_str \u003d cpu.to_xml()"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_1d0bd22a","line":8955,"range":{"start_line":8955,"start_character":27,"end_line":8955,"end_character":39},"in_reply_to":"5f7c97a3_98c4de42","updated":"2018-07-20 11:31:34.000000000","message":"That\u0027s correct; for PowerKVM, \u003ccpu mode\u003d\u0027host-model\u0027\u003e is indeed the right CPU mode.  Also double-confirmed with a libvirt dev who works on this.","commit_id":"a1678b56debb432f397124e1e46c7407384f8386"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":6456,"context_line":""},{"line_number":6457,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6458,"context_line":"        if traits is not None:"},{"line_number":6459,"context_line":"            traits_to_add \u003d [t for t in traits if traits[t]]"},{"line_number":6460,"context_line":"            traits_to_remove \u003d set(traits) - set(traits_to_add)"},{"line_number":6461,"context_line":"            provider_tree.add_traits(nodename, *traits_to_add)"},{"line_number":6462,"context_line":"            provider_tree.remove_traits(nodename, *traits_to_remove)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_34ab3c71","line":6459,"range":{"start_line":6459,"start_character":47,"end_line":6459,"end_character":59},"updated":"2018-07-20 20:47:14.000000000","message":"This is a bit confusing, can you add a comment for this block? Especially because _get_cpu_traits doesn\u0027t tell me what\u0027s returned, and I have to look into cpu_features_to_traits to figure that out (dict of trait name mapped to boolean).","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":6456,"context_line":""},{"line_number":6457,"context_line":"        traits \u003d self._get_cpu_traits()"},{"line_number":6458,"context_line":"        if traits is not None:"},{"line_number":6459,"context_line":"            traits_to_add \u003d [t for t in traits if traits[t]]"},{"line_number":6460,"context_line":"            traits_to_remove \u003d set(traits) - set(traits_to_add)"},{"line_number":6461,"context_line":"            provider_tree.add_traits(nodename, *traits_to_add)"},{"line_number":6462,"context_line":"            provider_tree.remove_traits(nodename, *traits_to_remove)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_f40b7120","line":6459,"range":{"start_line":6459,"start_character":47,"end_line":6459,"end_character":59},"in_reply_to":"5f7c97a3_34ab3c71","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":8934,"context_line":"        cpu \u003d self._get_guest_cpu_model_config()"},{"line_number":8935,"context_line":"        if not cpu:"},{"line_number":8936,"context_line":"            LOG.warning(\u0027The current libvirt hypervisor %(virt_type)s \u0027"},{"line_number":8937,"context_line":"            \u0027does not support reporting CPU traits.\u0027,"},{"line_number":8938,"context_line":"            {\u0027virt_type\u0027: CONF.libvirt.virt_type})"},{"line_number":8939,"context_line":"            return"},{"line_number":8940,"context_line":""},{"line_number":8941,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_34e01ccb","line":8938,"range":{"start_line":8937,"start_character":12,"end_line":8938,"end_character":50},"updated":"2018-07-20 20:47:14.000000000","message":"This should be indented.","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":8934,"context_line":"        cpu \u003d self._get_guest_cpu_model_config()"},{"line_number":8935,"context_line":"        if not cpu:"},{"line_number":8936,"context_line":"            LOG.warning(\u0027The current libvirt hypervisor %(virt_type)s \u0027"},{"line_number":8937,"context_line":"            \u0027does not support reporting CPU traits.\u0027,"},{"line_number":8938,"context_line":"            {\u0027virt_type\u0027: CONF.libvirt.virt_type})"},{"line_number":8939,"context_line":"            return"},{"line_number":8940,"context_line":""},{"line_number":8941,"context_line":"        caps \u003d deepcopy(self._host.get_capabilities())"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_b415f940","line":8938,"range":{"start_line":8937,"start_character":12,"end_line":8938,"end_character":50},"in_reply_to":"5f7c97a3_34e01ccb","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":8954,"context_line":"            # For custom mode, set model to guest CPU model"},{"line_number":8955,"context_line":"            caps.host.cpu.model \u003d cpu.model"},{"line_number":8956,"context_line":"            caps.host.cpu.features \u003d set()"},{"line_number":8957,"context_line":"            for f in cpu.features:"},{"line_number":8958,"context_line":"                caps.host.cpu.add_feature("},{"line_number":8959,"context_line":"                    vconfig.LibvirtConfigCPUFeature(name\u003df.name))"},{"line_number":8960,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_b4ec2cbc","line":8957,"range":{"start_line":8957,"start_character":12,"end_line":8957,"end_character":34},"updated":"2018-07-20 20:47:14.000000000","message":"If I\u0027m following correctly, you could also add this comment here correct?\n\n# Account for features in cpu_model_extra_flags conf","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":8954,"context_line":"            # For custom mode, set model to guest CPU model"},{"line_number":8955,"context_line":"            caps.host.cpu.model \u003d cpu.model"},{"line_number":8956,"context_line":"            caps.host.cpu.features \u003d set()"},{"line_number":8957,"context_line":"            for f in cpu.features:"},{"line_number":8958,"context_line":"                caps.host.cpu.add_feature("},{"line_number":8959,"context_line":"                    vconfig.LibvirtConfigCPUFeature(name\u003df.name))"},{"line_number":8960,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_7421a1a1","line":8957,"range":{"start_line":8957,"start_character":12,"end_line":8957,"end_character":34},"in_reply_to":"5f7c97a3_b4ec2cbc","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":8959,"context_line":"                    vconfig.LibvirtConfigCPUFeature(name\u003df.name))"},{"line_number":8960,"context_line":""},{"line_number":8961,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8962,"context_line":"        LOG.info(\"Libvirt baseline CPU %s\", xml_str)"},{"line_number":8963,"context_line":"        # TODO(lei-zh): baselineCPU is not supported on all platforms."},{"line_number":8964,"context_line":"        # There is some work going on in the libvirt community to replace the"},{"line_number":8965,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_1437204d","line":8962,"updated":"2018-07-20 20:47:14.000000000","message":"OK in the powerkvm CI I\u0027m seeing this now:\n\nJul 20 14:56:06.448488 devstack-xenial-ppc64-284676 nova-compute[24509]: INFO nova.virt.libvirt.driver [None req-80cb5ee4-f325-4968-b81f-e60afb598139 None None] Libvirt baseline CPU \u003ccpu\u003e\nJul 20 14:56:06.448638 devstack-xenial-ppc64-284676 nova-compute[24509]:   \u003carch\u003eppc64le\u003c/arch\u003e\nJul 20 14:56:06.448790 devstack-xenial-ppc64-284676 nova-compute[24509]:   \u003cmodel\u003ePOWER8\u003c/model\u003e\nJul 20 14:56:06.448936 devstack-xenial-ppc64-284676 nova-compute[24509]:   \u003cvendor\u003eIBM\u003c/vendor\u003e\nJul 20 14:56:06.449086 devstack-xenial-ppc64-284676 nova-compute[24509]:   \u003ctopology sockets\u003d\"1\" cores\u003d\"5\" threads\u003d\"1\"/\u003e\nJul 20 14:56:06.449237 devstack-xenial-ppc64-284676 nova-compute[24509]: \u003c/cpu\u003e\nJul 20 14:56:06.449387 devstack-xenial-ppc64-284676 nova-compute[24509]:\n\nAnd for zkvm:\n\nJul 20 15:03:29.386113 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]: INFO nova.virt.libvirt.driver [None req-9ec835a9-a52b-4c5e-8287-a28bec983d1e None None] Libvirt baseline CPU \u003ccpu\u003e\nJul 20 15:03:29.386224 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]:   \u003carch\u003es390x\u003c/arch\u003e\nJul 20 15:03:29.386333 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]:   \u003cmodel\u003eqemu64\u003c/model\u003e\nJul 20 15:03:29.386431 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]:   \u003ctopology sockets\u003d\"8\" cores\u003d\"1\" threads\u003d\"1\"/\u003e\nJul 20 15:03:29.386744 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]: \u003c/cpu\u003e\nJul 20 15:03:29.386855 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]:","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":8976,"context_line":"                error_code \u003d ex.get_error_code()"},{"line_number":8977,"context_line":"                if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8978,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":8979,"context_line":"                    LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8980,"context_line":"                                \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8981,"context_line":"                                {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8982,"context_line":"                    return libvirt_utils.cpu_features_to_traits([])"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_d4152896","line":8979,"updated":"2018-07-20 20:47:14.000000000","message":"And I\u0027m seeing this in the zkvm CI:\n\nJul 20 15:03:29.387170 ubuntu-xenial-s390x-cloud-zfwcec192-2571 nova-compute[14633]: WARNING nova.virt.libvirt.driver [None req-9ec835a9-a52b-4c5e-8287-a28bec983d1e None None] URI qemu:///system does not support full set of host capabilities: this function is not supported by the connection driver: cannot compute baseline CPU of s390x architecture: libvirtError: this function is not supported by the connection driver: cannot compute baseline CPU of s390x architecture","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f0970ae378c0c2379d7829abfb21daed6b46739","unresolved":false,"context_lines":[{"line_number":8976,"context_line":"                error_code \u003d ex.get_error_code()"},{"line_number":8977,"context_line":"                if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8978,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":8979,"context_line":"                    LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8980,"context_line":"                                \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8981,"context_line":"                                {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8982,"context_line":"                    return libvirt_utils.cpu_features_to_traits([])"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_e09959cf","line":8979,"in_reply_to":"5f7c97a3_74468159","updated":"2018-07-23 18:24:16.000000000","message":"Do we need to make that a warning? Seems it should be DEBUG or INFO if the operator can\u0027t do anything about it (besides not use s390x).","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":8976,"context_line":"                error_code \u003d ex.get_error_code()"},{"line_number":8977,"context_line":"                if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8978,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":8979,"context_line":"                    LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8980,"context_line":"                                \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8981,"context_line":"                                {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8982,"context_line":"                    return libvirt_utils.cpu_features_to_traits([])"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_74468159","line":8979,"in_reply_to":"5f7c97a3_d4152896","updated":"2018-07-23 06:37:29.000000000","message":"Yes, s390x doesn\u0027t support baseline call, I\u0027ve confirmed this with Andreas.","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cfcd3f05cbe13483d0080fdcd6fe5506874cc39c","unresolved":false,"context_lines":[{"line_number":8937,"context_line":"        \"\"\""},{"line_number":8938,"context_line":"        cpu \u003d self._get_guest_cpu_model_config()"},{"line_number":8939,"context_line":"        if not cpu:"},{"line_number":8940,"context_line":"            LOG.warning(\u0027The current libvirt hypervisor %(virt_type)s \u0027"},{"line_number":8941,"context_line":"                        \u0027does not support reporting CPU traits.\u0027,"},{"line_number":8942,"context_line":"                        {\u0027virt_type\u0027: CONF.libvirt.virt_type})"},{"line_number":8943,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_db88d022","line":8940,"range":{"start_line":8940,"start_character":16,"end_line":8940,"end_character":23},"updated":"2018-07-23 19:15:14.000000000","message":"I\u0027d make this a warning since it\u0027s based on config and architecture, right? So the operator has decided they want the given config, we don\u0027t even know if they are going to use flavors with CPU traits, so they don\u0027t need a warning, just info.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a679da7b002ef998d30635b412244795350c9a4f","unresolved":false,"context_lines":[{"line_number":8937,"context_line":"        \"\"\""},{"line_number":8938,"context_line":"        cpu \u003d self._get_guest_cpu_model_config()"},{"line_number":8939,"context_line":"        if not cpu:"},{"line_number":8940,"context_line":"            LOG.warning(\u0027The current libvirt hypervisor %(virt_type)s \u0027"},{"line_number":8941,"context_line":"                        \u0027does not support reporting CPU traits.\u0027,"},{"line_number":8942,"context_line":"                        {\u0027virt_type\u0027: CONF.libvirt.virt_type})"},{"line_number":8943,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_fbf6ec5e","line":8940,"range":{"start_line":8940,"start_character":16,"end_line":8940,"end_character":23},"in_reply_to":"5f7c97a3_9be578de","updated":"2018-07-23 19:27:56.000000000","message":"This shows up in the virtuozzo vm CI:\n\nhttp://openstack-3rd-party-virtuozzo-ci-logs.virtuozzo.com/17/560317/30/check/check-dsvm-tempest-vz7-exe-minimal/d70b4cc/logs/screen-n-cpu.txt.gz\n\nJul 23 07:01:44.883554 devstack-vz7-new-usd-vz222-351289 nova-compute[61788]: WARNING nova.virt.libvirt.driver [None req-bfeb9156-1253-4617-81fb-ca43eae67dbe None None] The current libvirt hypervisor parallels does not support reporting CPU traits.\n\nProbably because cpu_mode\u003d\u0027none\u0027:\n\n[libvirt]\nimages_type \u003d ploop\nconnection_uri \u003d parallels+unix:///system\nlive_migration_uri \u003d vz+tcp://%s/system\ncpu_mode \u003d none\nvirt_type \u003d parallels","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8784cc097681188fad9f8dbdf7319ecc7994b6d","unresolved":false,"context_lines":[{"line_number":8937,"context_line":"        \"\"\""},{"line_number":8938,"context_line":"        cpu \u003d self._get_guest_cpu_model_config()"},{"line_number":8939,"context_line":"        if not cpu:"},{"line_number":8940,"context_line":"            LOG.warning(\u0027The current libvirt hypervisor %(virt_type)s \u0027"},{"line_number":8941,"context_line":"                        \u0027does not support reporting CPU traits.\u0027,"},{"line_number":8942,"context_line":"                        {\u0027virt_type\u0027: CONF.libvirt.virt_type})"},{"line_number":8943,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_9be578de","line":8940,"range":{"start_line":8940,"start_character":16,"end_line":8940,"end_character":23},"in_reply_to":"5f7c97a3_db88d022","updated":"2018-07-23 19:18:37.000000000","message":"s/warning/info/","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cfcd3f05cbe13483d0080fdcd6fe5506874cc39c","unresolved":false,"context_lines":[{"line_number":8981,"context_line":"                error_code \u003d ex.get_error_code()"},{"line_number":8982,"context_line":"                if error_code \u003d\u003d libvirt.VIR_ERR_NO_SUPPORT:"},{"line_number":8983,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":8984,"context_line":"                    LOG.warning(\u0027URI %(uri)s does not support full set\u0027"},{"line_number":8985,"context_line":"                                \u0027 of host capabilities: %(error)s\u0027,"},{"line_number":8986,"context_line":"                                {\u0027uri\u0027: self._host._uri, \u0027error\u0027: ex})"},{"line_number":8987,"context_line":"                    return libvirt_utils.cpu_features_to_traits([])"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f7c97a3_3b77843f","line":8984,"range":{"start_line":8984,"start_character":24,"end_line":8984,"end_character":31},"updated":"2018-07-23 19:15:14.000000000","message":"As noted in PS28, this should probably also be info since it\u0027s not really something the operator can control outside of using a different architecture or configuration.","commit_id":"af4099054224ad23c8b3cb540e4152acef9c93bb"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"ffc1690ab90f0c2ab8c02655e310901cbfb260d1","unresolved":false,"context_lines":[{"line_number":8961,"context_line":"            # Account for features in cpu_model_extra_flags conf"},{"line_number":8962,"context_line":"            for f in cpu.features:"},{"line_number":8963,"context_line":"                caps.host.cpu.add_feature("},{"line_number":8964,"context_line":"                    vconfig.LibvirtConfigCPUFeature(name\u003df.name))"},{"line_number":8965,"context_line":""},{"line_number":8966,"context_line":"        xml_str \u003d caps.host.cpu.to_xml()"},{"line_number":8967,"context_line":"        LOG.info(\"Libvirt baseline CPU %s\", xml_str)"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_58d6f856","line":8964,"updated":"2018-07-24 07:51:35.000000000","message":"Thanks for addressing this.","commit_id":"f53d0762283755f371e0575fa95310612cb1b55b"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"ffc1690ab90f0c2ab8c02655e310901cbfb260d1","unresolved":false,"context_lines":[{"line_number":8968,"context_line":"        # TODO(lei-zh): baselineCPU is not supported on all platforms."},{"line_number":8969,"context_line":"        # There is some work going on in the libvirt community to replace the"},{"line_number":8970,"context_line":"        # baseline call. Consider using the new apis when they are ready. See"},{"line_number":8971,"context_line":"        # https://www.redhat.com/archives/libvir-list/2018-May/msg01204.html."},{"line_number":8972,"context_line":"        try:"},{"line_number":8973,"context_line":"            if hasattr(libvirt, \u0027VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES\u0027):"},{"line_number":8974,"context_line":"                features \u003d self._host.get_connection().baselineCPU("}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_98d6d026","line":8971,"updated":"2018-07-24 07:51:35.000000000","message":"Yes, we should move to those newer APIs sometime (not just for capturing traits but rework how we handle CPU configuration in the libvirt driver).  These two new APIs—baselineHypervisorCPU() and compareHypervisorCPU()—take into account the capabilities of a given hypervisor on the host, which the existing APIs cannot.  I began playing with them and I intend to file a blueprint (and a spec if needed) to that end.\n\nThe two new CPU-related APIs are addressing the libvirt RFE I filed: https://bugzilla.redhat.com/show_bug.cgi?id\u003d1559832 (\"[RFC] Fine-grained API to validate if a given CPU model and flags are supported by QEMU / KVM\").  And I already added for that in the libvirt/driver.py:\n\n        # NOTE (kchamart): Currently there\u0027s no existing way to ask if a\n        # given CPU model + CPU flags combination is supported by KVM \u0026\n        # a specific QEMU binary.  However, libvirt runs the \u0027CPUID\u0027\n        # command upfront -- before even a Nova instance (a QEMU\n        # process) is launched -- to construct CPU models and check\n        # their validity; so we are good there.  In the long-term,\n        # upstream libvirt intends to add an additional new API that can\n        # do fine-grained validation of a certain CPU model + CPU flags\n        # against a specific QEMU binary (the libvirt RFE bug for that:\n        # https://bugzilla.redhat.com/show_bug.cgi?id\u003d1559832).","commit_id":"f53d0762283755f371e0575fa95310612cb1b55b"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"d817d1bcb2ca15796f785b0f91861076534489c5","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        else:"},{"line_number":522,"context_line":"            unknown_f.append(f)"},{"line_number":523,"context_line":"    if unknown_f:"},{"line_number":524,"context_line":"        LOG.debug(\u0027The following cpu features cannot be recognized : %s\u0027,"},{"line_number":525,"context_line":"                  \u0027,\u0027.join(unknown_f))"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"    return traits"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_ee06be86","line":525,"range":{"start_line":524,"start_character":17,"end_line":525,"end_character":38},"updated":"2018-05-25 10:07:40.000000000","message":"The output looks strange here:\n\u003e\u003e\u003e unknown\u003d[\u0027a\u0027, \u0027b\u0027]\n\u003e\u003e\u003e print(\u0027The following cpu features cannot be recognized : %s\u0027, \u0027,\u0027.join(unknown))\nThe following cpu features cannot be recognized : %s a,b","commit_id":"a930815fdfc60c6cedf0820ac4ad7424cefa2e5b"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"6fbd9a9d6399ae2fbeffe12801f97fd0f0f6d088","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        else:"},{"line_number":522,"context_line":"            unknown_f.append(f)"},{"line_number":523,"context_line":"    if unknown_f:"},{"line_number":524,"context_line":"        LOG.debug(\u0027The following cpu features cannot be recognized : %s\u0027,"},{"line_number":525,"context_line":"                  \u0027,\u0027.join(unknown_f))"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"    return traits"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9fa648ab","line":525,"range":{"start_line":524,"start_character":17,"end_line":525,"end_character":38},"in_reply_to":"5f7c97a3_ee06be86","updated":"2018-05-28 08:27:46.000000000","message":"Nope, the log module will take the args and merge them into the message.","commit_id":"a930815fdfc60c6cedf0820ac4ad7424cefa2e5b"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"b20a4b5786600ad765f034cf9ffa8c9ecc1f7a71","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"RESIZE_SNAPSHOT_NAME \u003d \u0027nova-resize\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Mapping used to convert libvirt cpu features to traits, for more detail, see"},{"line_number":46,"context_line":"# https://github.com/libvirt/libvirt/blob/master/src/cpu/cpu_map.xml."},{"line_number":47,"context_line":"CPU_TRAITS_MAPPING \u003d {"},{"line_number":48,"context_line":"    \u00273dnow\u0027: \u0027HW_CPU_X86_3DNOW\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_72a9237a","line":45,"range":{"start_line":45,"start_character":67,"end_line":45,"end_character":73},"updated":"2018-05-28 09:38:55.000000000","message":"details","commit_id":"7ee09c17cb8b39efc4da8f3eea2ba81d75afd673"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"b20a4b5786600ad765f034cf9ffa8c9ecc1f7a71","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            unknown_f.append(f)"},{"line_number":523,"context_line":"    if unknown_f:"},{"line_number":524,"context_line":"        LOG.debug("},{"line_number":525,"context_line":"            \u0027The following cpu features cannot be convert to traits: %s.\u0027,"},{"line_number":526,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    return traits"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_92a63fab","line":525,"range":{"start_line":525,"start_character":50,"end_line":525,"end_character":57},"updated":"2018-05-28 09:38:55.000000000","message":"converted","commit_id":"7ee09c17cb8b39efc4da8f3eea2ba81d75afd673"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ce82ac8e5f69be7b3377a2edea511d33171a99da","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            traits.append(CPU_TRAITS_MAPPING[f])"},{"line_number":532,"context_line":"        else:"},{"line_number":533,"context_line":"            unknown_f.append(f)"},{"line_number":534,"context_line":"    if unknown_f:"},{"line_number":535,"context_line":"        LOG.debug("},{"line_number":536,"context_line":"            \u0027The following cpu features cannot be converted to traits: %s.\u0027,"},{"line_number":537,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    return traits"},{"line_number":540,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_a69146fa","line":537,"range":{"start_line":534,"start_character":0,"end_line":537,"end_character":33},"updated":"2018-06-15 08:31:16.000000000","message":"should we have a test for this case?","commit_id":"27f3875d5c9306951479804f751be206ed6f8a0b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fb6192202a6a98ddd4c4f75eb0807055a94d0d92","unresolved":false,"context_lines":[{"line_number":522,"context_line":"    return \u0027.\u0027.join([str(x) for x in version])"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"def cpu_features_to_traits(features):"},{"line_number":526,"context_line":"    \"\"\"Convert libvirt cpu features to traits\"\"\""},{"line_number":527,"context_line":"    traits \u003d []"},{"line_number":528,"context_line":"    unknown_f \u003d []"},{"line_number":529,"context_line":"    for f in features:"},{"line_number":530,"context_line":"        if f in CPU_TRAITS_MAPPING:"},{"line_number":531,"context_line":"            traits.append(CPU_TRAITS_MAPPING[f])"},{"line_number":532,"context_line":"        else:"},{"line_number":533,"context_line":"            unknown_f.append(f)"},{"line_number":534,"context_line":"    if unknown_f:"},{"line_number":535,"context_line":"        LOG.debug("},{"line_number":536,"context_line":"            \u0027The following cpu features cannot be converted to traits: %s.\u0027,"},{"line_number":537,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    return traits"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"def update_provider_cpu_traits(provider_tree, nodename, traits):"},{"line_number":543,"context_line":"    \"\"\"Add owned CPU traits and remove not owned CPU traits for a"},{"line_number":544,"context_line":"       provider."},{"line_number":545,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_f5fe6f36","line":542,"range":{"start_line":525,"start_character":0,"end_line":542,"end_character":64},"updated":"2018-06-22 15:36:21.000000000","message":"I prefer the model in [1].  In this case, cpu_features_to_traits could be made to return a dict of {trait_name: bool_set_or_unset}.  Then the provider_tree.add_/remove_traits business could live in update_provider_tree itself, which IMO would make it read better.\n\n[1] https://review.openstack.org/#/c/538498/7/nova/virt/driver.py@916","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c9100c80ba1a90b7728f54fd063a935c97952b5b","unresolved":false,"context_lines":[{"line_number":522,"context_line":"    return \u0027.\u0027.join([str(x) for x in version])"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"def cpu_features_to_traits(features):"},{"line_number":526,"context_line":"    \"\"\"Convert libvirt cpu features to traits\"\"\""},{"line_number":527,"context_line":"    traits \u003d []"},{"line_number":528,"context_line":"    unknown_f \u003d []"},{"line_number":529,"context_line":"    for f in features:"},{"line_number":530,"context_line":"        if f in CPU_TRAITS_MAPPING:"},{"line_number":531,"context_line":"            traits.append(CPU_TRAITS_MAPPING[f])"},{"line_number":532,"context_line":"        else:"},{"line_number":533,"context_line":"            unknown_f.append(f)"},{"line_number":534,"context_line":"    if unknown_f:"},{"line_number":535,"context_line":"        LOG.debug("},{"line_number":536,"context_line":"            \u0027The following cpu features cannot be converted to traits: %s.\u0027,"},{"line_number":537,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    return traits"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"def update_provider_cpu_traits(provider_tree, nodename, traits):"},{"line_number":543,"context_line":"    \"\"\"Add owned CPU traits and remove not owned CPU traits for a"},{"line_number":544,"context_line":"       provider."},{"line_number":545,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_20f7b5d6","line":542,"range":{"start_line":525,"start_character":0,"end_line":542,"end_character":64},"in_reply_to":"5f7c97a3_f5fe6f36","updated":"2018-06-24 16:48:10.000000000","message":"Done","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fb6192202a6a98ddd4c4f75eb0807055a94d0d92","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    \"\"\""},{"line_number":546,"context_line":"    unset_traits \u003d set(CPU_TRAITS_MAPPING.values()) - set(traits)"},{"line_number":547,"context_line":"    # Unset traits not found in the compute node."},{"line_number":548,"context_line":"    provider_tree.remove_traits(nodename, *unset_traits)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    if traits:"},{"line_number":551,"context_line":"        provider_tree.add_traits(nodename, *traits)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_95bffba9","line":548,"range":{"start_line":548,"start_character":4,"end_line":548,"end_character":56},"updated":"2018-06-22 15:36:21.000000000","message":"Why not condition this on `if unset_traits` as well?\n\nBetter yet, enhance the ProviderTree methods themselves to short out if given an empty list.","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c9100c80ba1a90b7728f54fd063a935c97952b5b","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    \"\"\""},{"line_number":546,"context_line":"    unset_traits \u003d set(CPU_TRAITS_MAPPING.values()) - set(traits)"},{"line_number":547,"context_line":"    # Unset traits not found in the compute node."},{"line_number":548,"context_line":"    provider_tree.remove_traits(nodename, *unset_traits)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    if traits:"},{"line_number":551,"context_line":"        provider_tree.add_traits(nodename, *traits)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_e0fc5db7","line":548,"range":{"start_line":548,"start_character":4,"end_line":548,"end_character":56},"in_reply_to":"5f7c97a3_95bffba9","updated":"2018-06-24 16:48:10.000000000","message":"I will add the check to providertree methods.","commit_id":"0dd8f285b8426101b17f9abac6678ec5104a1460"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf901715af23c1dbaec15b1223d172a7d0e90472","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"def get_cpu_model_from_arch(arch):"},{"line_number":546,"context_line":"    return \u0027qemu32\u0027 if arch in (\u0027i686\u0027, \u0027x86\u0027) else \u0027qemu64\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_68cb8b49","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":59},"updated":"2018-07-03 21:23:28.000000000","message":"The powerkvm CI fails on this because qemu64 isn\u0027t a valid arch for pkvm; looks like it wants \"ppc64le\".","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"def get_cpu_model_from_arch(arch):"},{"line_number":546,"context_line":"    return \u0027qemu32\u0027 if arch in (\u0027i686\u0027, \u0027x86\u0027) else \u0027qemu64\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_4e89f2c4","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":59},"in_reply_to":"5f7c97a3_68cb8b49","updated":"2018-07-04 07:17:46.000000000","message":"Good catch, are we going to match all the cases or if no cpu_mode is set just report nothing?","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0a7c6360e297de14666d106402b1bb1fcfb308a8","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    if arch \u003d\u003d obj_fields.Architecture.I686:"},{"line_number":548,"context_line":"        mode \u003d \u0027qemu32\u0027"},{"line_number":549,"context_line":"    elif arch \u003d\u003d obj_fields.Architecture.PPC64LE:"},{"line_number":550,"context_line":"        mode \u003d arch"},{"line_number":551,"context_line":"    return mode"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_a1af309b","line":550,"range":{"start_line":550,"start_character":8,"end_line":550,"end_character":19},"updated":"2018-07-19 15:48:15.000000000","message":"I believe this is supposed to be power8 to match what\u0027s in the host capabilities:\n\n\u003cmodel\u003ePOWER8\u003c/model\u003e\n\nI\u0027m not sure if case matters.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"f09a66205f1ed79a469deaa6723d0ab54d2ca1e7","unresolved":false,"context_lines":[{"line_number":547,"context_line":"    if arch \u003d\u003d obj_fields.Architecture.I686:"},{"line_number":548,"context_line":"        mode \u003d \u0027qemu32\u0027"},{"line_number":549,"context_line":"    elif arch \u003d\u003d obj_fields.Architecture.PPC64LE:"},{"line_number":550,"context_line":"        mode \u003d arch"},{"line_number":551,"context_line":"    return mode"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_01070483","line":550,"range":{"start_line":550,"start_character":8,"end_line":550,"end_character":19},"in_reply_to":"5f7c97a3_a1af309b","updated":"2018-07-19 15:55:47.000000000","message":"yes, I need to correct this.","commit_id":"fc55e0a7712cb3615ebde07b7582d259e86c04dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":536,"context_line":"            unknown_f.append(f)"},{"line_number":537,"context_line":"    if unknown_f:"},{"line_number":538,"context_line":"        LOG.debug("},{"line_number":539,"context_line":"            \u0027The following cpu features cannot be converted to traits: %s.\u0027,"},{"line_number":540,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    return traits"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_54cd982c","line":539,"updated":"2018-07-20 20:47:14.000000000","message":"I\u0027m seeing this here:\n\nhttp://logs.openstack.org/17/560317/28/check/tempest-full/1e288d5/controller/logs/screen-n-cpu.txt.gz#_Jul_20_16_23_21_203548\n\nJul 20 16:23:21.203548 ubuntu-xenial-inap-mtl01-0000860337 nova-compute[16719]: DEBUG nova.virt.libvirt.utils [None req-f6f005e3-d5c1-4c28-bf3a-4c570db5a67d None None] The following cpu features cannot be converted to traits: pge, clflush, sep, syscall, tsc, cmov, fpu, pat, lm, msr, nx, fxsr, pae, cx8, mce, de, mca, pse, pni, apic, cx16, pse36, mtrr. {{(pid\u003d16719) cpu_features_to_traits /opt/stack/nova/nova/virt/libvirt/utils.py:540}}\n\nAnd it shows up a ton - do we really need to log this?","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":536,"context_line":"            unknown_f.append(f)"},{"line_number":537,"context_line":"    if unknown_f:"},{"line_number":538,"context_line":"        LOG.debug("},{"line_number":539,"context_line":"            \u0027The following cpu features cannot be converted to traits: %s.\u0027,"},{"line_number":540,"context_line":"            \u0027, \u0027.join(unknown_f))"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    return traits"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_b45c191b","line":539,"in_reply_to":"5f7c97a3_54cd982c","updated":"2018-07-23 06:37:29.000000000","message":"I\u0027ve added this for debugging purpose, as features are far more a lot than traits, I guess there\u0027s no meaning to log this.","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"}],"releasenotes/notes/bp-report-cpu-features-aff90db66837de7d.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf55d3e5b8a4b3809ea93989dd6fccb4d2d78e9b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"  - Add support for reporting CPU traits to Placement"},{"line_number":5,"context_line":"    in libvirt driver."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_e88c7b36","line":4,"updated":"2018-07-03 21:18:17.000000000","message":"This is really sparse - are we going to have any other docs for this? Since this is virt-specific, we could have something in the feature support matrix for virt drivers that report CPU traits:\n\nhttps://docs.openstack.org/nova/latest/user/support-matrix.html\n\nAt a minimum, it seems we should at least link to the spec since that\u0027s the only other documentation we have for this feature:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/report-cpu-features-as-traits.html\n\nThe spec seems to suggest (indirectly) that the ComputeCapabilitiesFilter is involved here, or this could in some way replace some usage of the ComputeCapabilitiesFilter - but that\u0027s not called out anywhere in the docs. If that\u0027s true, then maybe we should consider mentioning something about virt-driver defined CPU traits from the filter docs:\n\nhttps://docs.openstack.org/nova/latest/admin/configuration/schedulers.html#computecapabilitiesfilter\n\nThat ^ could also link to an entry in the feature support matrix.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"02f928c2fbed411e0ef7fe899287c053d9794910","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"  - Add support for reporting CPU traits to Placement"},{"line_number":5,"context_line":"    in libvirt driver."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_ae3446fb","line":4,"in_reply_to":"5f7c97a3_e88c7b36","updated":"2018-07-04 07:17:46.000000000","message":"Thanks for reminding, I could link to the spec first, and add some docs in a follow up change.","commit_id":"69c5849cf00605b0c20e8026535ffa8e8b47c1d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a0bd9cc4ce08577c985f2b16df2ddb6b33628e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"  - Add support for reporting CPU traits to Placement"},{"line_number":5,"context_line":"    in libvirt driver. For more detail, see"},{"line_number":6,"context_line":"    https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/report-cpu-features-as-traits.html"},{"line_number":7,"context_line":"    and https://docs.openstack.org/nova/latest/user/support-matrix.html."}],"source_content_type":"text/x-yaml","patch_set":28,"id":"5f7c97a3_74ed348c","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":71},"updated":"2018-07-20 20:47:14.000000000","message":"Why? There isn\u0027t anything about traits in this doc.\n\n(later)\n\nOh I guess that\u0027s this change:\n\nhttps://review.openstack.org/#/c/582902/\n\nCan we just squash those changes now?","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"62717392cacb681efcdf674e0a88f54ac750dca9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"  - Add support for reporting CPU traits to Placement"},{"line_number":5,"context_line":"    in libvirt driver. For more detail, see"},{"line_number":6,"context_line":"    https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/report-cpu-features-as-traits.html"},{"line_number":7,"context_line":"    and https://docs.openstack.org/nova/latest/user/support-matrix.html."}],"source_content_type":"text/x-yaml","patch_set":28,"id":"5f7c97a3_74944199","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":71},"in_reply_to":"5f7c97a3_74ed348c","updated":"2018-07-23 06:37:29.000000000","message":"Done","commit_id":"9262e8a17db42b232020a8c3825d7e769df1d4ef"}]}
